/*
   This is the source code for the validation function. You can copy and paste
   the contents in to a file, say, gen_validation.js .
   Add the following code just after the </HEAD> in the files where the
   generalised validation functionality is required.
   <SCRIPT language="JavaScript1.2" src="gen_validation.js"></SCRIPT>

   The next two pages gives examples on using the funcions.

*/

   /*
   *   File : gen_validation.js
   *
   *   Author : Prasanth M J
   *
   *   Published at
   *   CreativeProgrammers.com - The technical knowledge repository.
   *   http://www.creativeprogrammers.com
   *
   *
   */
//---------------------------------EMail Check ------------------------------------

/*  checks the validity of an email address entered
*   returns true or false
*
*/

function validateEmail(email)
{
// a very simple email validation checking.
// you can add more complex email checking if it helps
   var splitted = email.match("^(.+)@(.+)$");
   if(splitted == null) return false;
   if(splitted[1] != null )
   {
     var regexp_user=/^\"?[\w-_\.]*\"?$/;
     if(splitted[1].match(regexp_user) == null) return false;
   }
   if(splitted[2] != null)
   {
     var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
     if(splitted[2].match(regexp_domain) == null)
     {
       var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
       if(splitted[2].match(regexp_ip) == null) return false;
     }// if
     return true;
   }
return false;
}

/* function validateData
*  Checks each field in a form
*  Called from validateForm function
*/
function validateData(strValidateStr,objValue,required,strError,extraField)
{
   var epos = strValidateStr.search("=");
   var  command  = "";
   var  cmdvalue = "";
   if(epos >= 0)
   {
    command  = strValidateStr.substring(0,epos);
    cmdvalue = strValidateStr.substr(epos+1);
   }
   else
   {
    command = strValidateStr;
   }
   
   switch(command)
   {
       case "req":
       case "required":
        {
          if(eval(objValue.value.length) == 0)
          {
             if(!strError || strError.length ==0)
             {
               strError = objValue.name + " : Required Field";
             }//if
             alert(strError);
             return false;
          }//if
          break;
        }//case required
       case "maxlength":
       case "maxlen":
         {
		 	if (!required && objValue.value.length==0)
			{
				return true;
			} else {
            	if(eval(objValue.value.length) >  eval(cmdvalue))
            	{
            	  if(!strError || strError.length ==0)
            	  {
            	    strError = objValue.name + " : "+cmdvalue+" characters maximum ";
            	  }//if
            	  alert(strError + "\n[Current length = " + objValue.value.length + " ]");
            	  return false;
            	}//if
			}//if...else...
            break;
         }//case maxlen
       case "minlength":
       case "minlen":
          {
		  	if (!required && objValue.value.length==0)
			{
				return true;
			} else {
            	if(eval(objValue.value.length) <  eval(cmdvalue))
            	{
              		if(!strError || strError.length ==0)
              		{
                		strError = objValue.name + " : " + cmdvalue + " characters minimum  ";
              		}//if
              		alert(strError + "\n[Current length = " + objValue.value.length + " ]");
              		return false;
            	}//if
			}//if...else...
            break;
           }//case minlen
       case "alnum":
       case "alphanumeric":
          {
             if (!required && objValue.value.length==0)
			{
				return true;
			} else {
				var charpos = objValue.value.search("[^A-Za-z0-9]");
             	if(objValue.value.length > 0 &&  charpos >= 0)
             	{
              		if(!strError || strError.length ==0)
               		{
                 		strError = objValue.name+": Only alpha-numeric characters allowed ";
               		}//if
               		alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
               		return false;
             	}//if
			}//if...else...
             break;
          }//case alphanumeric
       case "num":
       case "numeric":
          {
             if (!required && objValue.value.length==0)
			 {
				return true;
			 } else {
			 	var charpos = objValue.value.search("[^0-9]");
             	if(objValue.value.length > 0 &&  charpos >= 0)
             	{
               		if(!strError || strError.length ==0)
               		{
                 		strError = objValue.name+": Only digits allowed ";
               		}//if
               		alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
               		return false;
             	}//if
			 }//if...else...
             break;
          }//numeric
       case "alphabetic":
       case "alpha":
          {
             if (!required && objValue.value.length==0)
			 {
				return true;
			 } else {
			 	var charpos = objValue.value.search("[^A-Za-z]");
             	if(objValue.value.length > 0 &&  charpos >= 0)
             	{
                 	if(!strError || strError.length ==0)
               		{
                 		strError = objValue.name+": Only alphabetic characters allowed ";
               		}//if
               		alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
               		return false;
             	}//if
			 }//if...esle...
             break;
          }//alpha
	   case "currency":
	   	  {
		  	 if (!required && objValue.value.length==0)
			 {
				return true;
			 } else {
			 	var re = new RegExp("^[0-9]+((\.([0-9]{1,2})){0,1})$");
		  	 	if (re.test(objValue.value))
			 	{
				 	return true;
			 	}else{
                 	strError = objValue.name+": Must be a value in the form of a currency amount (e.g. \"75\" or \"80.50\")";
			 	 	alert (strError);
				 	return false;
			 	}//if...else...
			 }//if...esle...
		  	 break;
		  }//currency
       case "email":
         {
             if (!required && objValue.value.length==0)
			 {
				return true;
			 } else {
			 	if(!validateEmail(objValue.value))
              	{
                	if(!strError || strError.length ==0)
                	{
                   		strError = objValue.name+": Enter a valid Email address ";
                	}//if
                	alert(strError);
                	return false;
              	}//if
			 }//if...esle...
             break;
         }//case email
       case "lt":
       case "lessthan":
        {
  			if (!required && objValue.value.length==0)
			{
				return true;
			} else {
				if(isNaN(objValue.value))
           		{
             		alert(objValue.name+": Should be a number ");
             		return false;
           		}//if
           		if(eval(objValue.value) >=  eval(cmdvalue))
           		{
             		if(!strError || strError.length ==0)
             		{
               			strError = objValue.name + " : value should be less than "+ cmdvalue;
             		}//if
             		alert(strError);
             		return false;
            	}//if
			}//if...esle...
       		break;
        }//case lessthan
       case "gt":
       case "greaterthan":
        {
     		if (!required && objValue.value.length==0)
			{
				return true;
			} else {
				if(isNaN(objValue.value))
           		{
             		alert(objValue.name+": Should be a number ");
             		return false;
           		}//if
            	if(eval(objValue.value) <=  eval(cmdvalue))
            	{
              		if(!strError || strError.length ==0)
              		{
                		strError = objValue.name + " : value should be greater than "+ cmdvalue;
              		}//if
              		alert(strError);
              		return false;
            	}//if
			}//if...else...
            break;
        }//case greaterthan
       case "regexp":
        {
			if (!required && objValue.value.length==0)
			{
				return true;
			} else {
			 	if(!objValue.value.match(cmdvalue))
           		{
             		if(!strError || strError.length ==0)
             		{
               			strError = objValue.name+": Invalid characters found ";
             		}//if
             		alert(strError);
             		return false;
           		}//if
			}//if...else...
            break;
        }//case regexp
	   case "equalfields":
		{
			if (!required && objValue.value.length==0)
			{
				return true;
			} else {
				if (objValue.value!=objValue.form[extraField].value)
				{
					if(!strError || strError.length ==0)
             		{
               			strError = objValue.name+": Partner field doesn't match";
             		}//if
             		alert(strError);
             		return false;
				}//if
			}//if...else...
			break;
		}//case equalfields
	   case "onerequired":
	   	{
			if (!required && objValue.value.length==0)
			{
				return true;
			} else {
				if (objValue.value)
				{
					return true;
				} else {
					arrayOfFields = extraField.split(",");
					for (var i=0; i<arrayOfFields.length; i++)
					{
						if (objValue.form[arrayOfFields[i]].value!="")
						{
							return true;
						}
						//alert ("objValue.form.eval(arrayOfFields[i]).value = "+objValue.form.eval(arrayOfFields[i]).value);
					}//for
					if(!strError || strError.length ==0)
             		{
               			strError = objValue.name+": At least one field of group must be filled in";
             		}//if
             		alert(strError);
             		return false;
				}//if...else...
			}//if...else...
			break;
		}//case onerequired
       case "dontselect":
        {
           if(objValue.selectedIndex == null)
           {
             alert("BUG: dontselect command for non-select Item");
             return false;
           }
           if(objValue.selectedIndex == eval(cmdvalue))
           {
            if(!strError || strError.length ==0)
             {
             strError = objValue.name+": Please Select one option ";
             }//if
             alert(strError);
             return false;
            }
            break;
        }//case dontselect
   }//switch
   return true;
}

/*
* function validateForm
* the function that can be used to validate any form
* returns false if the validation fails; true if success
* arguments :
*   objFrm     : the form object
*   arrObjDesc : an array of objects describing the validations to conduct on each
*        input item.
*          The array should consist of one object per input item in the order the input
*          elements are present in the form. Each object consist of zero or more validation
*          objects. Each of these validation object is a pair consisting of the validation
*          descriptor string and an optional Error message.
*/

function validateForm(objFrm,arrObjDesc)
{
	for(var itrobj=0; itrobj < arrObjDesc.length; itrobj++)
	{
	  if(objFrm.elements.length <= itrobj)
	  {
	       alert("BUG: Obj descriptor for a non existent form element");
	       return false;
	  }//if
	  for(var itrdesc=0; itrdesc < arrObjDesc[itrobj].length ;itrdesc++)
	  {
	     if(validateData(arrObjDesc[itrobj][itrdesc][0],
		 				 objFrm[itrobj],
						 arrObjDesc[itrobj][itrdesc][1],
						 arrObjDesc[itrobj][itrdesc][2],
						 arrObjDesc[itrobj][itrdesc][3]) == false)
	     {
        	objFrm[itrobj].focus();
        	return false;
      	 }//if
  	  }//for
	}//for
	return true;
}

