// Created By Shallu, 13/04/2001 
//   last modified, 20/04/2001
//
// USAGE INFORMATION :
// *******************
// -----------------------------------------------------------------------------
// Include the .js file in the HEAD of your main document 
// <script language="javascript" src="validation_final.js"></script>
//
// FUNCTIONS TO BE CALLED IN THE BEGINNING OF THE PAGE. i.e onLoad
// *****************************************************************************
// -----------------------------------------------------------------------------
// I.  setFormName(Param) - 
//      Param   = name of your form
//
// II. addvalidation (Param1,Param2) - 
//      Param1  = Tag Name of the field or set of Fields to be validated
//      Param2  = Is is set of 8 different parameters 
//        NOTE: String values must be passed withing single quotes in param2
// 
//      n       = name of the input field (Required)
//      type    = string, num, email (Required)
//      HTMLName= name associated with the field that is displayed in case of error
//      min     = the value must have at least [min] characters (Optional)
//      max     = the value must have maximum [max] characters (Optional)
//      lrange  = minimum numeric value the field must contain (Optional)
//      hrange  = maximum numeric value the field must contain (Optional)
//      d               = (Optional)
//      E.g
//        addvalidation("fruit1","'field1', 'num', 'Apple', null,null, 0, 10")
//                    -Param1- ----------------- Param2---------------                    
// -----------------------------------------------------------------------------
//
// For Validating each field onBlur :
// **********************************
// Call the function validate(Param)
//      Param - Name of the set of fields
// If the field belongs to a group & is not to be validated onblur then call 
// the function noValidate() 
// -----------------------------------------------------------------------------
//
// For Validating the full form onSubmit :
// ***************************************
// Call the function validateForm()& return returnVal
// -----------------------------------------------------------------------------
// 
// for example :
//
// <script language="javascript">
// function init() {
// setFormName('testForm');
// addvalidation('fruit', "'field1', 'num', 'Apple', null, null, 0, 10");
// addvalidation('fruit2', "'field2', 'string', 'Cherry', null, 8");
// addvalidation('fruit2', "'field3', 'string', 'Melon', 4, null");
// }
// </script>
// <body onload=init()>
// <form name="testForm">
// APPLE :<br><input type="text" name="field1" onblur=validate(fruit)>
// Cherry:<br><input type=text name=field2 onblur="noValidate()"> <br>
// Melon:<br><input type=text name=field3 onblur="validate('fruit2')"> <br>
// </form>
// </body>
// *******************************************************************************
//////////////////////////////////////////////////////////////////////////////////

var SubmitButtonPressed  	= false;
var formName                    = "";
var strFieldname                = "";
var performFieldValidation      = true;
var SubmitButtonPressed         = false;
var checkObjects                = new Array();
var fields                      = new Array();
var values                      = new Array();
var errors                      = "";
var returnVal                   = false;
var language                    = new Array();
language["header"]              = "The following error(s) occured:"
language["start"]               = "->";
language["field"]               = " Field ";
language["require"]             = " is required";
language["and"]                 = " and ";
language["min"]                 = " must consist of at least ";
language["max"]                 = " must not contain more than ";
language["minmax"]              = " no more than ";
language["chars"]               = " characters";
language["num"]                 = " must contain a number";
language["date"]				= " must contain Date in the format dd/mm/yyyy";
language["which"]               = " which is";
language["hrange"]              = " less than ";
language["lrange"]              = " greater than ";
language["email"]               = " must contain a valid e-mail address";

function setFormName(strFormName)
{
 formName = strFormName; 
}

function addvalidation(tagName,def)
{       
 fields[eval(fields.length)]= tagName;
 values[eval(values.length)]= def;
}
function define(n, type, HTMLname, min, max, lrange, hrange, 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, lrange, hrange, d.layers[i].document);
    return x;       
   }
 eval("V_"+n+" = new formResult(x, type, HTMLname, min, max, lrange, hrange);");
 checkObjects[eval(checkObjects.length)] = eval("V_"+n);
}

function formResult(form, type, HTMLname, min, max, lrange, hrange) 
{
  this.form = form;
  this.type = type;
  this.HTMLname = HTMLname;
  this.min  = min;
  this.max  = max;
  this.lrange = lrange;
  this.hrange = hrange;
}

function noValidate()
{
  performFieldValidation = true;
//  SubmitButtonPressed = false;
}

function validateForm()
{  
   SubmitButtonPressed=true;
   for(i=0;i<fields.length;i++)
    { eval("define("+values[i]+")");
    }
  validation();
  performFieldValidation = true;
}

function validate(strTag)
{
  if (performFieldValidation && SubmitButtonPressed == false) 
  {
    for(i=0;i<fields.length;i++)
      {
        if(fields[i]==strTag)
          {   
    	    eval("define("+values[i]+")");
          }
        }
    validation(strTag);
  }
  else 
  {
	performFieldValidation = true;
	SubmitButtonPressed = false;
  }
 
} 

function validation(strTag)
{ var errorField = "";
  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;
     validateObject.lrange = checkObjects[i].lrange;
     validateObject.hrange = checkObjects[i].hrange;
     if (validateObject.type == "num" )
     { if (!isNaN(validateObject.val)) 
        { if ((validateObject.min != null && validateObject.max != null) && ( validateObject.len < validateObject.min || validateObject.len > validateObject.max))
           { errors += language['start'] + language['field'] + validateObject.HTMLname + language['num'] + language['and'] + language['min'] + validateObject.min + language['and'] + language['minmax'] + validateObject.max + language['chars'] +"\n";
             if ((validateObject.lrange != null && validateObject.hrange != null) && ((validateObject.val < validateObject.lrange) || (validateObject.val > validateObject.hrange))) {errors = errors.substring(0,errors.length-2) + language['which'] + language['lrange'] + validateObject.lrange + language['and'] + language['hrange'] + validateObject.hrange + "\n";}
             if ((validateObject.lrange == null && validateObject.hrange != null) && (validateObject.val > validateObject.hrange)) { errors = errors.substring(0,errors.length-2) + language['which'] + language['hrange'] + validateObject.hrange + "\n";}
             if ((validateObject.lrange != null && validateObject.hrange == null) && (validateObject.val < validateObject.lrange)) { errors = errors.substring(0,errors.length-2) + language['which'] + language['lrange'] + validateObject.lrange + "\n";}
           }
          if ((validateObject.min != null && validateObject.max == null) && ( validateObject.len < validateObject.min ))
           { errors += language['start'] + language['field'] + validateObject.HTMLname + language['num'] + language['and'] + language['min'] + validateObject.min + language['chars']+ "\n";
             if ((validateObject.lrange != null && validateObject.hrange != null) && ((validateObject.val < validateObject.lrange) || (validateObject.val > validateObject.hrange))) {errors = errors.substring(0,errors.length-2) + language['which'] + language['lrange'] + validateObject.lrange + language['and'] + language['hrange'] + validateObject.hrange + "\n";}
             if ((validateObject.lrange == null && validateObject.hrange != null) && (validateObject.val > validateObject.hrange)) { errors = errors.substring(0,errors.length-2) + language['which'] + language['hrange'] + validateObject.hrange + "\n";}
             if ((validateObject.lrange != null && validateObject.hrange == null) && (validateObject.val < validateObject.lrange)) { errors = errors.substring(0,errors.length-2) + language['which'] + language['lrange'] + validateObject.lrange + "\n";}
           }
          if ((validateObject.min == null && validateObject.max != null) && ( validateObject.len > validateObject.max ))
           { errors += language['start'] + language['field'] + validateObject.HTMLname + language['num'] + language['minmax'] + validateObject.max + language['chars'] +"\n";
             if ((validateObject.lrange != null && validateObject.hrange != null) && ((validateObject.val < validateObject.lrange) || (validateObject.val > validateObject.hrange))) {errors = errors.substring(0,errors.length-2) + language['which'] + language['lrange'] + validateObject.lrange + language['and'] + language['hrange'] + validateObject.hrange + "\n";}
             if ((validateObject.lrange == null && validateObject.hrange != null) && (validateObject.val > validateObject.hrange)) { errors = errors.substring(0,errors.length-2) + language['which'] + language['hrange'] + validateObject.hrange + "\n";}
             if ((validateObject.lrange != null && validateObject.hrange == null) && (validateObject.val < validateObject.lrange)) { errors = errors.substring(0,errors.length-2) + language['which'] + language['lrange'] + validateObject.lrange + "\n";}
           }
          if (validateObject.min == null && validateObject.len > 0)
           { if ((validateObject.lrange != null && validateObject.hrange != null) && ((validateObject.val < validateObject.lrange) || (validateObject.val > validateObject.hrange))) {errors += language['start'] + language['field'] + validateObject.HTMLname + language['num'] + language['lrange'] + validateObject.lrange + language['and'] + language['hrange'] + validateObject.hrange + "\n";}
             if ((validateObject.lrange == null && validateObject.hrange != null) && (validateObject.val > validateObject.hrange)) { errors +=  language['start'] + language['field'] + validateObject.HTMLname + language['num'] + language['hrange'] + validateObject.hrange + "\n";}
             if ((validateObject.lrange != null && validateObject.hrange == null) && (validateObject.val < validateObject.lrange)) { errors +=  language['start'] + language['field'] + validateObject.HTMLname + language['num'] + language['lrange'] + validateObject.lrange + "\n";}
           }       
         }else {errors += language['start'] + language['field'] + validateObject.HTMLname + language['num'] + "\n";}
     }
     else if (validateObject.type == "string")
     {  if ((validateObject.min != null && validateObject.max != null) && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['and'] + language['minmax'] + validateObject.max+language['chars'] + "\n";}
        if ((validateObject.min == null && validateObject.max != null) && (validateObject.len > validateObject.max)) {errors += language['start'] + language['field'] + validateObject.HTMLname + language['max'] + validateObject.max + language['chars'] + "\n";}
		if (validateObject.val == '') {errors += language['start'] + validateObject.HTMLname + language['require'] + "\n";}
		if (validateObject.val == '00' || validateObject.val == '0' || validateObject.val == '0000') {errors += language['start'] + validateObject.HTMLname + language['require'] + "\n";}
        if ((validateObject.min != null && validateObject.max == null) && (validateObject.len < validateObject.min)) {errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['chars'] + "\n";}
     } 
     else if (validateObject.type == "email"){
		// checking , shuld not be there in email address, only single address
        // Checking existense of "@" and ".". 
        // Length of must >= 5 and the "." must 
        // not directly precede or follow the "@"
        if (!(validateObject.val.indexOf(" and ") == -1) || !(validateObject.val.indexOf(",") == -1) || !(validateObject.val.indexOf("www.") == -1) || (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'] + validateObject.HTMLname + language['email'] + "\n"; 
          }
     }
     else if (validateObject.type == "date")
     {if (validateObject.min != null)
       {
       while(validateObject.val.charAt(validateObject.len-1)==' ') validateObject.val = validateObject.val.substring(0,validateObject.len-1);
       var dtmp='';
       var z='';
       for (var x=0; x < validateObject.len; x++) 
  	 {
    	   z=validateObject.val.charAt(x);
    	   if (z>=0 && z<=9) 
    	    { dtmp+=z;
   	    }
   	   else dtmp+='/';
  	 }
       if (dtmp.charAt(1)=='/') dtmp='0'+dtmp;
       if (dtmp.charAt(4)=='/') dtmp=dtmp.substring(0,3)+'0'+dtmp.substring(3,dtmp.length);
  	 // alert ('>'+dtmp+'<');
 	 // alert (dtmp.length);
       if (dtmp.length==8)
  	 {
    	  tyear=dtmp.substring(6,8);
    	  // alert(tyear)
    	  if (tyear<31) 
    	    {
             dtmp=dtmp.substring(0,6)+'20'+tyear
    	    }
    	  else 
    	    {
      	     dtmp=dtmp.substring(0,6)+'19'+tyear;
    	    }
 	 }
 	var a=dtmp
  	var err=0 
  	var psj=0; 
  	if (a.length != 10) err=1 
  	var b = a.substring(0, 2)// day
  	var c = a.substring(2, 3)// '/' 
  	var d = a.substring(3, 5)// month 
  	var e = a.substring(5, 6)// '/' 
  	var f = a.substring(6, 10)// year 
  	// basic error checking 
  	if (d<1 || d>12) err = 1 
  	if (c != '/') err = 1 
  	if (b<1 || b>31) err = 1 
  	if (e != '/') err = 1 
  	if (f<1900 || f>2099) err = 1 
  	// advanced error checking 
  	// months with 30 days 
  	if (d==4 || d==6 || d==9 || d==11){ 
    	    if (b==31) err=1 
  	  } 
  	// february, leap year 
  	if (d==2){ // feb 
    	    var g=parseInt(f/4) 
    	    if (isNaN(g)){ 
	      		err=1 
     	      } 
    	    if (b>29) err=1 
    	    if (b==29 && ((f/4)!=parseInt(f/4))) err=1 
  	  }
		fieldName = validateObject.form.name;
		eval("document."+formName+"."+fieldName+".value='"+dtmp+"'") 
  	if (err==1){
     	    errors +=language['start'] + validateObject.HTMLname + language['require'] + language['and'] + language['date'] + "\n"; 
     	  }
     }
    }   
  if ((errors) && (errorField == ""))
     {
      errorField = validateObject.form.name;
     }
   }// end of FOR loop
}// end of first IF condition

if (errors)
  {
   alert(language["header"].concat("\n" + errors));
//   SubmitButtonPressed = false;
   performFieldValidation = false;
   if(strTag != null)
     {  
       eval("document."+formName+"."+errorField+".focus()")
     }
   errors = "";
   returnVal = false;
  } 
else 
  {returnVal = true;
   performFieldValidation = true;
  }
checkObjects = new Array();
SubmitButtonPressed = false;
}