// -----------------------------------------------------------------------------
// Generic Form Validation
//
// Copyright (C) 2000 Jacob Hage - [jacob@hage.dk]
// 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!
// Error messages in english:
	language["header"]	= "The following error(s) occured:"
	language["start"]	= "";
	language["field"]	= "";
	language["require"]	= " is required";
	language["min"]		= " and must contain at least ";
	language["max"]		= " and no more than ";
	language["minmax"]	= " and no more than ";
	language["chars"]	= " characters.";
	language["num"]		= " and must contain numbers only.";
	language["email"]	= " must be in the following format - user@domain.com";
	
// Error messages in Danish:
	/*
	language["header"]	= "Der opstod f\370lgende fejl:";
	language["start"]	= "->";
	language["field"]	= " Feltet ";
	language["require"]	= " skal udfyldes";
	language["min"]		= " og skal best\345 af mindst ";
	language["max"]		= " og m\345 ikke best\345 af flere end ";
	language["minmax"]	= " og ikke flere " // English: " and no more than ";
	language["chars"]	= " tegn";
	language["num"]		= " og m\345 kun best\345 af tal";
	language["email"]	= " skal indeholde en korrekt e-mail addresse";
	*/
	
// Error messages in Dutch: // Thanks to Benjo de Lange <webmaster@bennie-webdesign.com> for translation
	/*
	language["header"]	= "De volgende fout(en) zitten in het formulier:"
	language["start"]	= "->";
	language["field"]	= " Veld ";
	language["require"]= " is verplicht";
	language["min"]	= " en moet bestaan uit minstens";
	language["max"]	= " en moet bestaan uit meer dan";
	language["minmax"]	= " en niet meer dan";
	language["chars"]	= " karakters";
	language["num"]	= " en moet een nummer zijn";
	language["email"]	= " moet een geldig e-mail adres zijn.";
	*/



// -----------------------------------------------------------------------------
// 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 on the "submit" button 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;
			
			//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['start']+language['field']+validateObject.HTMLname+language['require']+language['num']+"\n";
				} else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)){errors+=language['start']+language['field']+validateObject.HTMLname+language['require']+language['min']+validateObject.min+language['minmax']+validateObject.max+language['chars']+"\n";
				} else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)){errors+=language['start']+language['field']+validateObject.HTMLname+language['require']+language['min']+validateObject.min+language['chars']+"\n";
				} else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)){errors+=language['start']+language['field']+validateObject.HTMLname+language['require']+language['max']+validateObject.max+language['chars']+"\n";
				} else if (!validateObject.min && !validateObject.max && validateObject.len <= 0){errors+=language['start']+language['field']+validateObject.HTMLname+language['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['start']+language['field']+validateObject.HTMLname+language['email']+"\n";}
			} else if(validateObject.type == "radio"){
				// Checking for radiobuttons - at least one must be set true
			}
		}
	}
	if(errors){
		alert(language["header"].concat("\n"+errors));
		errors = "";
		returnVal = false;
	} else {
		returnVal = true;
	}
}

