// -----------------------------------------------------------------------------

// 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	= "english";	// Choose between "english", "danish", "dutch", "french", "spanish", "russian", "portuguese"

language.english		= new Array();

language.polish			= new Array();

language.german			= new Array();

language.french			= new Array();

language.italian		= new Array();

language.russian		= new Array();

language.spanish		= 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 %d ";

	language.english.max		= " and must not contain more than %d ";

	language.english.minmax		= " and no more than %d ";

	language.english.chars		= " characters";

	language.english.num		= " and must contain a number";

	language.english.email		= "> must contain a valid e-mail address";

	language.english.date		= "> must contain a valid date";

	language.english.nip		= "> must contain a valid NIP number";



// Error messages in polish: Thanks to Marcin Maciukiewicz <ciukes@poczta.fm>

	language.polish.header		= "Wyst±piіy nastкpuj±ce bікdy:";

	language.polish.start		= "* ";

	language.polish.field		= " Pole <";

	language.polish.require		= "> jest wymagane";

	language.polish.min			= " i musi zawieraж conajmniej %d ";

	language.polish.max			= " i nie moїe zawieraж wiкcej niї %d ";

	language.polish.minmax		= " i nie wiкcej niї %d ";

	language.polish.chars		= " znaki";

	language.polish.num			= " i musi zawieraж liczbк";

	language.polish.email		= "> musi zawieraж prawidіowy adres e-mail";

	language.polish.date		= "> musi zawieraж prawidіow№ datк";

	language.polish.nip			= "> musi zawieraж prawidіowy numer NIP";



// Error messages in german:

	language.german.header		= "Es sind folgende Fehler untergelaufen:"

	language.german.start		= "* ";

	language.german.field		= " das Feld <";

	language.german.require	= "> es ist erforderlich";

	language.german.min		= " und soll mindestens %d enthalten";

	language.german.max		= " und darf nicht mehr als %d enthalten";

	language.german.minmax		= " und nicht mehr als %d ";

	language.german.chars		= " Zeichen";

	language.german.num		= " und soll die Zahl enthalten";

	language.german.email		= "> soll die korrekte eMail Adresse enthalten";

	language.german.date		= "> soll das korrekte Datum enthalten";

	language.german.nip		= "> soll die korrekte Steuernummer enthalten";



// Error messages in french:

	language.french.header		= "The following error(s) occured:"

	language.french.start		= "* ";

	language.french.field		= " Field <";

	language.french.require	= "> is required";

	language.french.min		= " and must consist of at least %d ";

	language.french.max		= " and must not contain more than %d ";

	language.french.minmax		= " and no more than %d ";

	language.french.chars		= " characters";

	language.french.num		= " and must contain a number";

	language.french.email		= "> must contain a valid e-mail address";

	language.french.date		= "> must contain a valid date";

	language.french.nip		= "> must contain a valid NIP number";



// Error messages in italian:

	language.italian.header		= "The following error(s) occured:"

	language.italian.start		= "* ";

	language.italian.field		= " Field <";

	language.italian.require	= "> is required";

	language.italian.min		= " and must consist of at least %d ";

	language.italian.max		= " and must not contain more than %d ";

	language.italian.minmax		= " and no more than %d ";

	language.italian.chars		= " characters";

	language.italian.num		= " and must contain a number";

	language.italian.email		= "> must contain a valid e-mail address";

	language.italian.date		= "> must contain a valid date";

	language.italian.nip		= "> must contain a valid NIP number";



// Error messages in russian:

	language.russian.header		= "Произошли следующие ошибки:"

	language.russian.start		= "* ";

	language.russian.field		= " Поле <";

	language.russian.require	= "> требуется";

	language.russian.min		= " i должно содержать как минимум %d ";

	language.russian.max		= " i не может содержать более, чем %d ";

	language.russian.minmax		= " i не более, чем %d ";

	language.russian.chars		= " знаки";

	language.russian.num		= " i должно содержать число";

	language.russian.email		= "> должен быть правильный e-mail";

	language.russian.date		= "> должна быть правильная дата";

	language.russian.nip		= "> должен быть правильный номер NIP";



// Error messages in spanish:

	language.spanish.header		= "Notamos las siguientes errores:"

	language.spanish.start		= "* ";

	language.spanish.field		= " Campo <";

	language.spanish.require	= "> es obligatorio";

	language.spanish.min		= " y tiene que incluir minimo %d ";

	language.spanish.max		= " y no puede incluir mas que %d ";

	language.spanish.minmax		= " y no mas que %d ";

	language.spanish.chars		= " signos";

	language.spanish.num		= " y tiene que incluir numero";

	language.spanish.email		= "> tiene que contener la direccion correcta";

	language.spanish.date		= "> tiene que contener la fecha correcta";

	language.spanish.nip		= "> tiene que contener al NIP correcta";

	

// -----------------------------------------------------------------------------

// define - Call this function in the beginning of the page. I.e. onLoad.

//

// n = name of the input field (Required)

// type= string, num, email, date (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(n,x,type,HTMLname,min,max);");

	

	// if defined, undefine it first

	undefine(n);

	

	checkObjects[eval(checkObjects.length)] = eval("V_"+n);

}



// -----------------------------------------------------------------------------

// formResult - Used internally to create the objects

// -----------------------------------------------------------------------------

function formResult(n,form,type,HTMLname,min,max){

	this.name = n;

	this.form = form;

	this.type = type;

	this.HTMLname = HTMLname;

	this.min  = min;

	this.max  = max;

}



// -----------------------------------------------------------------------------

// undefine - usuwa obiekt z listy walidacji

//

// n - identyfikator obiektu

//

// Zwraca true, jesli obiekt zostal znaleziony i usuniety; w przeciwnym wypadku

// zwraca false.

// -----------------------------------------------------------------------------

function undefine(n) {

	var i;

	for(i=0; i<checkObjects.length; i++)

	{

		if (checkObjects[i].name==n)

		{

			checkObjects.splice(i, 1);

			return true;

		}

	}

	return false;

}



// -----------------------------------------------------------------------------

// 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.type 	= checkObjects[i].type;

			validateObject.val 		= (validateObject.type=="list") ? validateObject.form.selectedIndex : checkObjects[i].form.value;

			validateObject.len 		= (validateObject.type=="list") ? 1 : checkObjects[i].form.value.length;

			validateObject.min 		= checkObjects[i].min;

			validateObject.max 		= checkObjects[i].max;



			//if (validateObject.type=="list")

			//alert (validateObject.form.selectedIndex);	

			

			//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.replace('%d',validateObject.min)+language[selectecLanguage].minmax.replace('%d',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.replace('%d',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.replace('%d',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 == "list"){

				// 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 == -1)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+"\n";}

			}

			else if (validateObject.type == "date")

			{

				// Checking date format: yyyy-mm-dd

				var val = validateObject.val;

				val = val.replace(/^\s*/i, '');	// trim left

				val = val.replace(/\s*$/i, '');	// trim right

				var re = /^\d{4}-\d{2}-\d{2}$/gi;

				if (!re.test(val))

				{

					errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].date+"\n";

				}

			}

			else if (validateObject.type == "nip")

			{

				// Checking NIP format

				var val = validateObject.val;

				val = val.replace(/^\s*/i, '');	// trim left

				val = val.replace(/\s*$/i, '');	// trim right

				var re = /(^\d{2,3}(\s|-)\d{2,3}(\s|-)\d{2,3}(\s|-)\d{2,3}$)|(^\d{10}$)/i;

				if (!re.test(val) || val.length!=10 && val.length!=13)

				{

					errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].nip+"\n";

				}

			}

			else

			{

				alert('Nieznany typ do walidacji: "'+validateObject.type+'"');

			}

		}

	}

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

	}

}


