//strings for error messages
var frmField = "";
var checkObjects = new Array();
var errors		= "";

var language		= new Array();
language["header"]	= "The following error(s) occured:"
language["start"]	= "->";
language["field"]	= " Field ";
language["requireonly"]	= " is required";
language["require"]	= " is required and";
language["notrequire"]	= "";
language["min"]		= " must consist of at least ";
language["max"]		= " must not contain more than ";
language["range"]		= " between ";
language["greater"]		= " greater than ";
language["less"]		= " less than ";
language["minmax"]	= " and no more than ";
language["chars"]	= " characters";
language["num"]		= "  must contain a number";
language["email"]	= " must contain a valid e-mail address";
language["D"]		= " digits";
language["A"]		= " alphabets";
language["AD"]		= " alphabets or digits";

//this function is used to define which all fields in the form have to be validated and what validation has to be applied
function define(required,n, type, HTMLname, min, max,d) 
{
	
	//required: whether the field must contain a value( true or false)
	// n = name of the input field (Required)
	// type= string, num, email (Required)
	//html name heading to be displayed for the field in error message
	// min = the value must have at least [min] characters (Optional) in case of string type -in case of number the starting number range
	// max = the value must have maximum [max] characters (Optional)in case of number the ending number range
	// d = (Optional)
	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(required,n, type, HTMLname, min, max,d.layers[i].document);
		return x;       
	}
	eval("V_"+n+" = new formResult(required,x, type, HTMLname, min, max);");
	checkObjects[eval(checkObjects.length)] = eval("V_"+n);
}

function formResult(required,field, type, HTMLname, min, max) 
{
	this.required = required;
	this.field = field;
	this.type = type;
	this.HTMLname = HTMLname;
	this.min  = min;
	this.max  = max;
}
function trimAll(stringValue) {
	var i;
	for(i = 0; i < stringValue.length; i++) {
		if(stringValue.charAt(i) != " ") {
			break;
		}
	}
	if(i > 0) {
		stringValue = stringValue.substring(i);
	}
	strLength = stringValue.length - 1;
	for(i = strLength; i >= 0; i--) {
		if(stringValue.charAt(i) != " ") {
			break;
		}
	}
	if(i < strLength) {
		stringValue = stringValue.substring(0, i + 1);
	}
	return stringValue;
}

function validate(frmVar) 
{
	var strTemp,i;
	if (checkObjects.length > 0)
	{
		errorObject = "";
		for (i = 0; i < checkObjects.length; i++)
		{
			//alert(checkObjects.length)
			validateObject = new Object();
			strTemp=trimAll(checkObjects[i].field.value);
			//alert(strTemp)
			validateObject.required = checkObjects[i].required;
			validateObject.field = checkObjects[i].field;
			validateObject.HTMLname = "[" + checkObjects[i].HTMLname + "]";
			validateObject.val = strTemp;
			validateObject.fieldName = checkObjects[i].field.name;
			validateObject.frmName = checkObjects[i].field.form.name;
			
			validateObject.len = strTemp.length;
			validateObject.min =  checkObjects[i].min  ; 
			validateObject.max =  checkObjects[i].max ;
			validateObject.type = checkObjects[i].type;
			if(validateObject.required=='require' && validateObject.len==0)
			{	errors += language['start'] + language['field'] + validateObject.HTMLname + language['requireonly']  + "\n";
			}
			else if(validateObject.len>0)
			{
				if (validateObject.type == "string")
				{
					if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) //both min and max no of chars allowed have been specified
					{ errors += language['start'] + language['field'] + validateObject.HTMLname + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['N'] + "\n";
					}
					else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)) //only min num of chars have been specified
					{ errors += language['start'] + language['field'] + validateObject.HTMLname  + language['min'] + validateObject.min + language['chars'] + "\n";
					}
					else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)) //only max num of chars have been specified
					{ errors += language['start'] + language['field'] + validateObject.HTMLname + language['max'] + validateObject.max + language['chars'] + "\n";
					}
				}
				else if (validateObject.type == "D")
				{
					if(!checkSplChars(validateObject.val,"D"))
					{ errors += language['start'] + language['field'] + validateObject.HTMLname  + " must contain only digits" + "\n";
					}
					else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) //both min and max no of chars allowed have been specified
					{ errors += language['start'] + language['field'] + validateObject.HTMLname + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['D'] + "\n";
					}
					else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)) //only min num of chars have been specified
					{ errors += language['start'] + language['field'] + validateObject.HTMLname  + language['min'] + validateObject.min + language['D'] + "\n";
					}
					else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)) //only max num of chars have been specified
					{ errors += language['start'] + language['field'] + validateObject.HTMLname + language['max'] + validateObject.max + language['D'] + "\n";
					}
				}
				else if (validateObject.type == "A")
				{
					if(!checkSplChars(validateObject.val,"A"))
					{ errors += language['start'] + language['field'] + validateObject.HTMLname  + " must contain only alphabets" + "\n";
					}
					else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) //both min and max no of chars allowed have been specified
					{ errors += language['start'] + language['field'] + validateObject.HTMLname + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['A'] + "\n";
					}
					else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)) //only min num of chars have been specified
					{ errors += language['start'] + language['field'] + validateObject.HTMLname  + language['min'] + validateObject.min + language['A'] + "\n";
					}
					else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)) //only max num of chars have been specified
					{ errors += language['start'] + language['field'] + validateObject.HTMLname + language['max'] + validateObject.max + language['A'] + "\n";
					}
				}
				else if (validateObject.type == "AD")
				{
					if(!checkSplChars(validateObject.val,"AD"))
					{ errors += language['start'] + language['field'] + validateObject.HTMLname  + " must contain only alphabets or  digits" + "\n";
					}
					else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) //both min and max no of chars allowed have been specified
					{ errors += language['start'] + language['field'] + validateObject.HTMLname + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['AD'] + "\n";
					}
					else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)) //only min num of chars have been specified
					{ errors += language['start'] + language['field'] + validateObject.HTMLname  + language['min'] + validateObject.min + language['AD'] + "\n";
					}
					else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)) //only max num of chars have been specified
					{ errors += language['start'] + language['field'] + validateObject.HTMLname + language['max'] + validateObject.max + language['AD'] + "\n";
					}
				}

				else if(validateObject.type == "num")
				{
					if(isNaN(validateObject.val))
					{ errors += language['start'] + language['field'] + validateObject.HTMLname  + language['num'] + "\n";
					}
					else if (validateObject.min && validateObject.max && (validateObject.val < validateObject.min || validateObject.val > validateObject.max)) // number not in specified range
					{ errors += language['start'] + language['field'] + validateObject.HTMLname +  language['num'] +  language['range'] + validateObject.min + " and " + validateObject.max   + "\n";
					}
					else if (validateObject.min && !validateObject.max && (validateObject.val < validateObject.min)) //only min range has been given
					{ errors += language['start'] + language['field'] + validateObject.HTMLname +  " must be " + language['greater'] + validateObject.min +  "\n";
					}
					else if (validateObject.max && !validateObject.min &&(validateObject.val > validateObject.max)) //only max range has been specified
					{ errors += language['start'] + language['field'] + validateObject.HTMLname  +  " must be " + language['less'] + validateObject.max +  "\n";
					}
				}
				else if(validateObject.type == "email")
				{
					// Checking existense of "@" and ".". 
					// Length of must >= 5 and the "." must 
					// not directly precede or follow the "@"
					  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";
					  }
				 }
			} 
			if (errors){
				if(!frmVar){ //if the user has not supplied the form name
					assignFrmField(validateObject.frmName+"."+validateObject.fieldName);
				}	
				else{
					assignFrmField(frmVar+"."+validateObject.fieldName);
				}	
			}
		 }
	}
	if (errors)
	{
		alert(language["header"].concat("\n" + errors));
		eval("document."+frmField+".focus();");
		errors = "";
		frmField="";
		return false;
	}
	else
	{
		return true;
	}
	
}

function assignFrmField(frmFldName){
	if (frmField.length==0){
		frmField=frmFldName;
	}
}
function checkSplChars(strToCheck, allowedChars){
	// Check whether a string contain permitted characters only
     var acLen     = allowedChars.length;
     var stcLen     = strToCheck.length;
     strToCheck     = strToCheck.toLowerCase();
     var i;
     var j;
     var rightCount = 0;
     for(i = 0; i < acLen; i++){
          switch(allowedChars.charAt(i)){
          case 'A':
               for(j = 0; j< stcLen; j++){
                    rightCount += strToCheck.charAt(j) >= 'a' && strToCheck.charAt(j) <= 'z';
               }
               break;
          case 'D':
               for(j = 0; j< stcLen; j++){
                    rightCount += strToCheck.charAt(j) >= '0' && strToCheck.charAt(j) <= '9';
               }
               break;
          default:
               for(j = -1; -1 != (j = strToCheck.indexOf(allowedChars.charAt(i), j + 1)); rightCount++);
               break;
          }
     }
     if(rightCount == stcLen){
          return true;
     }
     return false;
}