function JSValidator (baseControl)
{
  this.Fields      = new Array();
  this.BaseControl = baseControl; 
  
  JSValidator.prototype.AddStringField      = _AddStringField;
  JSValidator.prototype.AddNumericField     = _AddNumericField;
  JSValidator.prototype.AddDateField        = _AddDateField;
  JSValidator.prototype.AddCustomValidation = _AddCustomValidation;
  JSValidator.prototype.Validate			= _Validate;
  return this;  
}

function StringField (elementID,dataType,isRequired,minLength,maxLength,message)
{
  this.ElementID    = elementID;
  this.DataType     = dataType;
  this.IsRequired   = isRequired;
  this.MinLength    = minLength;
  this.MaxLength    = maxLength;
  this.Message      = message;
  return this;
}

function NumericField (elementID,dataType,isRequired,signed,excludeZero,decimalSign,minValue,maxValue,message)
{
  this.ElementID    = elementID;
  this.DataType     = dataType;
  this.IsRequired   = isRequired;
  this.Signed       = signed;
  this.ExcludeZero  = excludeZero;
  this.DecimalSign  = decimalSign;
  this.MinValue     = minValue;
  this.MaxValue     = maxValue;
  this.Message      = message;
  return this;
}

function DateField (elementID,dataType,isRequired,message)
{
  this.ElementID    = elementID;
  this.DataType     = dataType;
  this.IsRequired   = isRequired;
  this.Message      = message;
  return this;
}


function CustomValidation (functionName,message)
{
  this.FunctionName = functionName;
  this.DataType     = "CustomValidation";
  this.Message      = message;
  return this;
}


function _AddStringField (elementID,dataType,isRequired,minLength,maxLength,message) 
{
  this.Fields[this.Fields.length] = new StringField (elementID,dataType,isRequired,minLength,maxLength,message);
}

function _AddNumericField (elementID,dataType,isRequired,signed,excludeZero,decimalSign,minValue,maxValue,message) 
{
  this.Fields[this.Fields.length] = new NumericField (elementID,dataType,isRequired,signed,excludeZero,decimalSign,minValue,maxValue,message);
}

function _AddDateField (elementID,dataType,isRequired,message) 
{
  this.Fields[this.Fields.length] = new DateField (elementID,dataType,isRequired,message);
}

function _AddCustomValidation (functionName,message)
{
  this.Fields[this.Fields.length] = new CustomValidation (functionName,message);
}

function _Validate () {
  var objElement = null;
  var objField   = null;
  var ret        = false;
  var i;
  
  for (j=0;j<this.Fields.length;j++) {
      objField   = null;
      objElement = null;
      
      if (this.Fields[j].DataType=="CustomValidation") {
          objField = this.Fields[j];
      }
      else {
          objElement = GetFormElementByName (this.BaseControl,this.Fields[j].ElementID);
          if (objElement!=null) {
             objField = this.Fields[j];
             value    = objElement.value.toString();
          }
      }
      
      if (objField!=null) {
          switch (objField.DataType.toString()) {

              case "TaxRegistryNumber":
					ret = __ValidateTaxRegistryNumber (objElement.value.toString(),objField.IsRequired);
                    break;
              
              case "NonBlankString": 
                    ret = __ValidateNonBlankString (objElement.value.toString(),objField.IsRequired,objField.MinLength,objField.MaxLength);
                    break;
              
              case "SafeString": 
                    ret = __ValidateSafeString (objElement.value.toString(),objField.IsRequired,objField.MinLength,objField.MaxLength);
                    break;
  			 
  			  case "SafeCriterion": 
                    ret = __ValidateSafeCriterion (objElement.value.toString(),objField.IsRequired,objField.MinLength,objField.MaxLength);
                    break;
                                                   
              case "String": 
                    ret = __ValidateString (objElement.value.toString(),objField.IsRequired,objField.MinLength,objField.MaxLength);
                    break;

			  case "AFM":
                    ret = __ValidateAFM (objElement.value.toString(),objField.IsRequired,objField.MaxLength);
                    break;

              case "PrimaryName": 
                    ret = __ValidatePrimaryName (objElement.value.toString(),objField.IsRequired,objField.MinLength,objField.MaxLength);
                    break;

              case "Credential": 
                    ret = __ValidateCredential (objElement.value.toString(),objField.IsRequired,objField.MinLength,objField.MaxLength);
                    break;
              
              case "Url":
                    ret = __ValidateUrl (objElement.value.toString(),objField.IsRequired,objField.MinLength,objField.MaxLength);
                    break;

              case "Email":
                    ret = __ValidateEmail (objElement.value.toString(),objField.IsRequired,objField.MinLength,objField.MaxLength);
                    break;

              case "Byte": 
                    ret = __ValidateByte (objElement.value.toString(),objField.IsRequired,objField.ExcludeZero,objField.MinValue,objField.MaxValue);
                    break;
                                        
               case "Integer": 
                    ret = __ValidateInteger (objElement.value.toString(),objField.IsRequired,objField.Signed,objField.ExcludeZero,objField.MinValue,objField.MaxValue);
                    break; 
                    
               case "Decimal": 
                    ret = __ValidateDecimal (objElement.value.toString(),objField.IsRequired,objField.Signed,objField.ExcludeZero,objField.DecimalSign,objField.MinValue,objField.MaxValue);
                    break;      
              
              case "DateGeneral":
                    ret = __ValidateDateGeneral (objElement.value.toString(),objField.IsRequired);
                    break;

              case "DateExact":
                    ret = __ValidateDateExact  (objElement.value.toString(),objField.IsRequired);
                    break;
              
              case "CustomValidation":
                    ret = eval(objField.FunctionName);
                    break;
                 
              default:
                    ret = true;
                    break;
          }
          
          if (!ret) {
              alert (objField.Message);
              if (objElement!=null) {
                  objElement.focus();
              };    
              return false;
          };  
      };
  };
  return true;
}

function __ValidateByte (value,isRequired,excludeZero,minValue,maxValue)
{
  if (value=="") {
     if (!isRequired) {
         return true;
     }
  }
  else {
     var pattern = new String();
     var Reg     = null;

     pattern = "^";
    
     if (excludeZero) {
         pattern += "(([0-9]*)([1-9]+)([0-9]*))$";
     }
     else {
         pattern += "([0-9]+)$";
     }
     
     Reg = new RegExp(pattern);
        
     if (Reg.test(value)) {
        var num = new Number();
               
        num = parseInt(value,10);
        
        if (!isNaN(num) && (num>=0) && (num<=255)) 
        {
         var lim = new Number();
         
         if (minValue!="") {
             lim = parseInt(minValue,10);
             if ((!isNaN(lim)) && (num<Math.max (0,lim))) {
                return false;
             }
         }
         if (maxValue!="") {
             lim = parseInt(maxValue,10);
             if ((!isNaN(lim)) && (num>Math.min(255,lim))) {
                return false;
             }
         }
         return true;
        }
     }
  }

  return false;
}



function __ValidateTRN (value, isRequired, countryID) {
	var ret = false;

	if (((value=="") || (value.length == 0)) && (!isRequired)) {
		ret = true;	
	}
	else {
		var multi   = null;
		var reg     = null;
		var pattern = "";
		var total   = 0;
		var i       = 0;
		var k = new String();
			
		switch (countryID) {
			case "1" : 
				pattern = "^([0-9]{8,9})$";
				reg = new RegExp(pattern);
				if (reg.test(value)) {
					
					if (value.length == 8)
						value = "0" + value;	
					
					multi = new Array (256,128,64,32,16,8,4,2);
					
					for (i = 0 ; i<8; i++) {
						total = total + parseInt(value.substr(i,1),10) * multi [i];
					}
					
					total = total % 11;
					if (total>9) 
						total = 0;
					
					
					if (value.substr(8,1) == total.toString()) {
						ret = true;
					}
				}
			break;
			
			case "2" : 
				pattern = "^([0-9]{9,10})$";
				reg = new RegExp(pattern);
				if (reg.test(value)) {
													
					pattern = "^[23]";
					reg = new RegExp(pattern);
					
					if (!((reg.test(value)) && (value.substr(1,2) != "22"))) {
						if (value.length == 9)
							value = "0" + value;	
						
						multi = new Array (4,3,2,7,6,5,4,3,2);
						
						for (i = 0 ; i<9; i++) {
							total = total + parseInt(value.substr(i,1),10) * multi [i];
						}
						
						total = 11 - total % 11;
						if (total==11) 
							total = 0;
							
						if (total!=10) {
							if (value.substr(9,1) == total.toString()) {
								ret = true;
							}
						}
					}
				}
			break;
			
			case "3" : 
				pattern = "^([0-9]{2,13})$";
				reg = new RegExp(pattern);
				if (reg.test(value)) {
					if ((value.length>10) && (value.length<=13)) {
						ret = false;
					}
					else if((value.length>=2) && (value.length<=10)) {
						total = value.length;
						for (i = total; i< 10; i++) {
							value = "0" + value;
						}
						total = 0;				

						multi = new Array (7,5,3,2,1,7,5,3,2);
														
						for (i = 0 ; i<9; i++) {
							total = total + parseInt(value.substr(i,1),10) * multi [i];
						}
						
						total = (total * 10) % 11;
						if (total == 10) total = 0;
							
						if (value.substr(9,1) == total.toString()) {
							ret = true;
						}
					}
				}
			break;
			
		}
	}
	return ret;
}


function __ValidateAFM(tuValue,isRequired,tuMaxLen)
{
	var llretval = true;
	if (tuValue=="") {
		if (!isRequired) {
			 return llretval;
		}
	}
	
	var lnStrLen = 	tuValue.length
	
  
	var nn; 
	var S = 0; 
	var V = 512; 
	var Y = 0; 
	var tempchar; 
	var lastchar;
	 
	Reg = new RegExp("^([0-9]+)$");
    ret = Reg.test(tuValue);
		
	if ( ret ) {	
		if ((tuMaxLen != null) && (tuMaxLen.length != 0) ) {
			tuMaxLen = parseInt(tuMaxLen,9);
			
			if (lnStrLen != tuMaxLen) {
				llretval = false;
			}
			else
			{
			
				for (var i= 0 ; i < tuValue.length-1; i++){ 
					tempchar = tuValue.charAt(i); 
					V = V / 2; 
					S += tempchar * V; 
				} 

				Y = S % 11; 
				lastchar = tuValue.charAt(tuValue.length-1); 
				
				if ((Y != 10 && lastchar != "0") && (Y != lastchar)) 
					llretval = false;
			}
				 	
		}				

		
	}
	else {
		llretval = false;
	}		
	
	return llretval;	

}
function __ValidateInteger (value,isRequired,signed,excludeZero,minValue,maxValue)
{
  var ret = false;

  if (value=="") {
     if (!isRequired) {
         ret = true;
     }
  }
  else {
	 var pattern = new String();
     var Reg     = null;

     pattern = "^";
    
     if (signed) {
		 pattern += "([+-]{1,1})";
	 }
	
	 if (excludeZero) {
		 pattern += "(([0-9]*)([1-9]+)([0-9]*))$";
	 }
	 else {
		pattern += "([0-9]+)$";
	 }
		
     Reg = new RegExp(pattern);
     ret = Reg.test(value);
    
     if (ret) {
        var num = new Number();
        var lim = new Number();
        
        num = parseInt(value,10);
		
		if (!isNaN(num)) {
			if (minValue!="") {
				lim = parseInt(minValue,10);
				if ((!isNaN(lim)) && (num<lim)) {
					ret = false;
				}
			}
			if (maxValue!="") {
				lim = parseInt(maxValue,10);
				if ((!isNaN(lim)) && (num>lim)) {
					ret = false;
				}
			}		
			
		}
		else {
		  ret = false;
		}
    }
  }
  return ret;  
}

							
function __ValidateDecimal (value,isRequired,signed,excludeZero,decimalSign,minValue,maxValue)
{
  if (value=="") {
     if (!isRequired) {
         return true;
     }
  }
  else {
	var pattern = new String();
    var dpoint  = new String();
    var ret     = false;
    var Reg     = null;

    if (decimalSign=="") {
       dpoint = ".";
    }
    else {
	   dpoint = decimalSign;	
    }
    
    pattern = "^";
    
    if (signed) {
		pattern += "([+-]{1,1})";
	}
	
	if (excludeZero) {
		pattern += "(([0-9]*)([1-9]+)([0-9]*)([.]([0-9]*)){0,1})$";
	}
	else {
		pattern += "([0-9]+)$";
	}
		
    Reg = new RegExp(pattern);
    ret = Reg.test(value);
    
    if (ret) {
        var num = new Number();
        
		if (minLength!="") {
			num = parseInt(minLength,10);
			if ((!isNaN(num)) && (value<num.toString())) {
				ret = false;
			}
		}

		if (maxLength!="") {
			num = parseInt(maxLength,10);
			if ((!isNaN(num)) && (value>num.toString())) {
				ret = false;
			}
		}
    }
    
    return ret;    
  }
  return false;
}




function __ValidateUrl (value,isRequired,minLength,maxLength)
{
  if (value=="") {
     if (!isRequired) {
         return true;
     }
  }
  else {
     var Reg = new RegExp ("^(http|https)://([\\w-])+([\\.\\w-])*([/\\w-\\.?%&=])*$"); 

     if (Reg.test(value)) {
        var len = new Number();
        
        if (minLength!="") {
            len = parseInt(minLength,10);
            if ((!isNaN(len)) && (value.length<len)) {
               return false;
            }
        }
        if (maxLength!="") {
            len = parseInt(maxLength,10);
            if ((!isNaN(len)) && (value.length>len)) {
               return false;
            }
        }
        return true;
     }
  }

  return false;
}

function __ValidateEmail (value,isRequired,minLength,maxLength)
{
 if (value=="") {
     if (!isRequired) {
         return true;
     }
  }
  else {
     var Reg = new RegExp ("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"); 

     if (Reg.test(value)) {
        var len = new Number();
        
        if (minLength!="") {
            len = parseInt(minLength,10);
            if ((!isNaN(len)) && (value.length<len)) {
               return false;
            }
        }
        if (maxLength!="") {
            len = parseInt(maxLength,10);
            if ((!isNaN(len)) && (value.length>len)) {
               return false;
            }
        }
        return true;
     }
  }
  return false;
}

function  __ValidateSafeCriterion(value,isRequired,minLength,maxLength) 
{
  if (value=="") {
     if (!isRequired) {
         return true;
     }
  }
  else {								   	
     //var Reg = new RegExp("((^((\\s)*)$)|([<>!@#$^]+))");	
     var Reg = new RegExp("((^((\\s)*)$)|(['=\/_*%;<>-]+))");	
     if (!Reg.test(value)) {
        var len = new Number();
        
        if (minLength!="") {
            len = parseInt(minLength,10);
            if ((!isNaN(len)) && (value.length<len)) {
               return false;
            }
        }
        if (maxLength!="") {
            len = parseInt(maxLength,10);
            if ((!isNaN(len)) && (value.length>len)) {
               return false;
            }
        }
        return true;
     }
  }
  return false;
}

function  __ValidateSafeString (value,isRequired,minLength,maxLength) 
{
  if (value=="") {
     if (!isRequired) {
         return true;
     }
  }
  else {
     var Reg = new RegExp("((^((\\s)*)$)|(['=/\\_*%;<>-]+))");	
     if (!Reg.test(value)) {
        var len = new Number();
        
        if (minLength!="") {
            len = parseInt(minLength,10);
            if ((!isNaN(len)) && (value.length<len)) {
               return false;
            }
        }
        if (maxLength!="") {
            len = parseInt(maxLength,10);
            if ((!isNaN(len)) && (value.length>len)) {
               return false;
            }
        }
        return true;
     }
  }
  return false;
}

function __ValidateNonBlankString (value,isRequired,minLength,maxLength)
{
  if (value=="") {
     if (!isRequired) {
         return true;
     }
  }
  else {
     var Reg = new RegExp("^((\\s)*)$");	
     if (!Reg.test(value)) {
        var len = new Number();
        
        if (minLength!="") {
            len = parseInt(minLength,10);
            if ((!isNaN(len)) && (value.length<len)) {
               return false;
            }
        }
        if (maxLength!="") {
            len = parseInt(maxLength,10);
            if ((!isNaN(len)) && (value.length>len)) {
               return false;
            }
        }
        return true;
     }
  }
  return false;
}

function __ValidateTaxRegistryNumber (value,isRequired)
{
  if (value=="") {
     if (!isRequired) {
         return true;
     }
  }
  else {
	 if (value.length==9) {
		 var Reg = null;
		 var pat = new String();
		 var ret = false;
		
		 pat = "([0-9]+)$";
         Reg = new RegExp(pat);
		 ret = Reg.test(value);
    
		 if (ret) {
		    var sum = 0;
		    var opr = 256;
		    var mod = 0;
		  	var i, tempNum;
				
			for (i=0;i<value.length-1;i++) {
				tempNum = parseInt (value.charAt(i),10);
				sum += tempNum * opr;
				opr = opr / 2;
			}

			tempNum = parseInt (value.charAt(8),10);
			mod = (sum % 11);
			
			if ((mod==10) && (tempNum==0)) {
			   ret = true;
			}
			else if (tempNum==mod)  {
			   ret = true;
			}
			else {
			   ret = false;
			}
		 }
		 return ret;
	 }
  }
  
  return false;
}

function __ValidateString (value,isRequired,minLength,maxLength)
{
  if (value=="") {
     if (!isRequired) {
         return true;
     }
  }
  else {
     var len = new Number();
        
     if (minLength!="") {
         len = parseInt(minLength,10);
         if ((!isNaN(len)) && (value.length<len)) {
            return false;
         }
     }
     
     if (maxLength!="") {
         len = parseInt(maxLength,10);
         if ((!isNaN(len)) && (value.length>len)) {
            return false;
         }
     }
     return true;
  }
  return false;
}


function __ValidatePrimaryName (value,isRequired,minLength,maxLength) 
{
  if (value=="") {
     if (!isRequired) {
         return true;
     }
  }
  else {
     var Reg = new RegExp("([0-9\\s~`!@#$%^&*()_+-=\\[\\]{}:;\"\'<>,./?]+)");	
     if (!Reg.test(value)) {
        var len = new Number();
        
        if (minLength!="") {
            len = parseInt(minLength,10);
            if ((!isNaN(len)) && (value.length<len)) {
               return false;
            }
        }
        if (maxLength!="") {
            len = parseInt(maxLength,10);
            if ((!isNaN(len)) && (value.length>len)) {
               return false;
            }
        }
        return true;
     }
  }
  return false;



}


function __ValidateCredential (value,isRequired,minLength,maxLength) 
{
  if (value=="") {
     if (!isRequired) {
         return true;
     }
  }
  else {
     var Reg = new RegExp("^[A-Za-z0-9]+$");	
     if (Reg.test(value)) {
         var len = new Number();
            
         if (minLength!="") {
             len = parseInt(minLength,10);
             if ((!isNaN(len)) && (value.length<len)) {
                return false;
             }
         }
         
         if (maxLength!="") {
             len = parseInt(maxLength,10);
             if ((!isNaN(len)) && (value.length>len)) {
                return false;
             }
         }
         return true;
     }
  }
  return false;
}

function __ValidateDateGeneral (value,isRequired)
{
  var reg = new RegExp ("^(([1][7][6-9][0-9])|([1][8-9][0-9][0-9])|([2][0-9][0-9][0-9]))([-](([0][1-9])|([1][0-2]))([-](([0][1-9])|([1-2][0-9])|([3][0-1]))){0,1}){0,1}$"); 
  var ret = false;
  
  if (value.length>0) 
  {
     ret = reg.test(value);
     if ((ret) && (value.length==10)) {
         ret = ValidateDateExact (value,isRequired);
     }
  }
  else {
     if (!isRequired) {
         ret = true;
     }
  }
  return ret;
}

function __ValidateDateExact (value,isRequired) 
{
   var reg = new RegExp ("^(([1][7][6-9][0-9])|([1][8-9][0-9][0-9])|([2][0-9][0-9][0-9]))([-](([0][1-9])|([1][0-2]))([-](([0][1-9])|([1-2][0-9])|([3][0-1]))){1,1}){1,1}$"); 
   var ret = false;
  
   if (value.length>0) 
   {	
     if (reg.test(value)==true) {
	    var arrDate  = new Array ();
	    var testDate = null;
	    var month    = 0;
	    var day		 = 0;
	   
	    arrDate = value.split ("-");
	    if ((arrDate!=null) && (arrDate.length==3)) {
			month = parseInt(arrDate[1],10)-1;
			day   = parseInt(arrDate[2],10);
			testDate = new Date (parseInt(arrDate[0],10),month,day,0,0,0);
			if ((testDate.getDate()==day) && (testDate.getMonth()==month))  {
	    	   ret = true;
	    	};
	    };	
     };
   }
   else {
     if (!isRequired) {
         ret = true;
     }     
   }
   return ret;
}







