﻿var ControlsToChangeStyle;

function modifyValidation(){
  var HTMLControls=document.all;
  ControlsToChangeStyle=new Array();
  for(var i=0;i<HTMLControls.length;i++){
    if(HTMLControls[i].controltovalidate!=null){  //is Validatior Control
      matchValidation(HTMLControls[i]);
    }

    if(HTMLControls[i].ControlsToValidate!=null){  //is MultiValidatior Control
      initMultiValidator(HTMLControls[i]);
    } 

    if(HTMLControls[i].validExts!=null){  //is FileValidator Control
      initFileValidator(HTMLControls[i]);
     
    }
    
    if(HTMLControls[i].SpecifiedLength!=null || HTMLControls[i].MinimumLength!=null){  //is FixedLengthValidator Control
      initFixedLengthValidator(HTMLControls[i]);
    }
  }  //for
  
  for(var i=0;i<ControlsToChangeStyle.length;i++)
    ChangeStyle(ControlsToChangeStyle[i]);
}  //modifyValidation()

function changeValidation(elemId){
  eval("var HTMLControls=document.all."+elemId+".all;");
  ControlsToChangeStyle=new Array();
  for(var i=0;i<HTMLControls.length;i++){
    if(HTMLControls[i].controltovalidate!=null){  //is Validatior Control
      matchValidation(HTMLControls[i]);
    }

    if(HTMLControls[i].ControlsToValidate!=null){  //is MultiValidatior Control
      initMultiValidator(HTMLControls[i]);
    } 

    if(HTMLControls[i].validExts!=null){  //is FileValidator Control
      initFileValidator(HTMLControls[i]);
     
    }
    
    if(HTMLControls[i].SpecifiedLength!=null || HTMLControls[i].MinimumLength!=null){  //is FixedLengthValidator Control
      initFixedLengthValidator(HTMLControls[i]);
    }
  }  //for
  
  for(var i=0;i<ControlsToChangeStyle.length;i++)
    ChangeStyle(ControlsToChangeStyle[i]);
}  //changeValidation()

function matchValidation(elem){
  var controltovalidate;
  eval("controltovalidate=document.all."+elem.controltovalidate);

  switch(controltovalidate.datatype){
    case "char":
    case "varchar":
              elem.evaluationfunction=customRequiredFieldValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate;//controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "varcharSfZ":  //身份证号
              if(elem.minimumvalue=="") elem.minimumvalue="0";
              if(elem.maximumvalue=="") elem.maximumvalue="100";
              elem.evaluationfunction=customSFZHFieldValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate;//controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "varcharJGDM":  //机构代码证号
              if(elem.minimumvalue=="") elem.minimumvalue="0";
              if(elem.maximumvalue=="") elem.maximumvalue="100";
              elem.evaluationfunction=customJGDMFieldValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate;//controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "datetime":
              elem.type="Date";
              if(elem.minimumvalue=="") elem.minimumvalue="1900/01/01";
              if(elem.maximumvalue=="") elem.maximumvalue="2900/12/31";
              elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "numeric":
    case "decimal":
    case "float":
    case "real":
              elem.type="Double";
              if(elem.minimumvalue=="") elem.minimumvalue="-9000000000.0000";
              if(elem.maximumvalue=="") elem.maximumvalue="9000000000.0000";
              elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
              elem.decimalchar=".";
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "bigint":
              elem.type="Integer";
              if(elem.minimumvalue=="") elem.minimumvalue="-900000000000000";
              if(elem.maximumvalue=="") elem.maximumvalue="900000000000000";
              elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "int":
              elem.type="Integer";
              if(elem.minimumvalue=="") elem.minimumvalue="-2147483648";
              if(elem.maximumvalue=="") elem.maximumvalue="2147483647";
              elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "smallint":
              elem.type="Integer";
              if(elem.minimumvalue=="") elem.minimumvalue="-32768";
              if(elem.maximumvalue=="") elem.maximumvalue="32767";
              elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "tinyint":
              elem.type="Integer";
              if(elem.minimumvalue=="") elem.minimumvalue="0";
              if(elem.maximumvalue=="") elem.maximumvalue="255";
              elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "bit":
              elem.type="Integer";
              if(elem.minimumvalue=="") elem.minimumvalue="0";
              if(elem.maximumvalue=="") elem.maximumvalue="1";
              elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    default  :elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
			  if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
  }
}  //matchValidation()

function changeValidationList(elemId){
  eval("var HTMLControls=document.all."+elemId+".all;");
  ControlsToChangeStyle=new Array();
  for(var i=0;i<HTMLControls.length;i++){
    if(HTMLControls[i].controltovalidate!=null){  //is Validatior Control
      matchValidationList(HTMLControls[i]);
    }

    if(HTMLControls[i].ControlsToValidate!=null){  //is MultiValidatior Control
      initMultiValidator(HTMLControls[i]);
    } 

    if(HTMLControls[i].validExts!=null){  //is FileValidator Control
      initFileValidator(HTMLControls[i]);
     
    }
    
    if(HTMLControls[i].SpecifiedLength!=null || HTMLControls[i].MinimumLength!=null){  //is FixedLengthValidator Control
      initFixedLengthValidator(HTMLControls[i]);
    }
  }  //for
  
  for(var i=0;i<ControlsToChangeStyle.length;i++)
    ChangeStyle(ControlsToChangeStyle[i]);
}  //changeValidationList()

function matchValidationList(elem){
  var controltovalidate;
  eval("controltovalidate=document.all."+elem.controltovalidate);
  if(controltovalidate==null)
  {
     //validate控件id不能含下划线(_)
     eval("controltovalidate=document.all."+elem.id.substring(0,elem.id.lastIndexOf("_")+1)+elem.controltovalidate);
  }
  switch(controltovalidate.datatype){
    case "char":
    case "varchar":
              elem.evaluationfunction=customRequiredFieldValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate;//controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "varcharSfZ":  //身份证号
              if(elem.minimumvalue=="") elem.minimumvalue="0";
              if(elem.maximumvalue=="") elem.maximumvalue="100";
              elem.evaluationfunction=customSFZHFieldValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate;//controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "varcharJGDM":  //机构代码证号
              if(elem.minimumvalue=="") elem.minimumvalue="0";
              if(elem.maximumvalue=="") elem.maximumvalue="100";
              elem.evaluationfunction=customJGDMFieldValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate;//controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "datetime":
              elem.type="Date";
              if(elem.minimumvalue=="") elem.minimumvalue="1900/01/01";
              if(elem.maximumvalue=="") elem.maximumvalue="2900/12/31";
              elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "numeric":
    case "decimal":
    case "float":
    case "real":
              elem.type="Double";
              if(elem.minimumvalue=="") elem.minimumvalue="-9000000000.0000";
              if(elem.maximumvalue=="") elem.maximumvalue="9000000000.0000";
              elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
              elem.decimalchar=".";
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "bigint":
              elem.type="Integer";
              if(elem.minimumvalue=="") elem.minimumvalue="-900000000000000";
              if(elem.maximumvalue=="") elem.maximumvalue="900000000000000";
              elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "int":
              elem.type="Integer";
              if(elem.minimumvalue=="") elem.minimumvalue="-2147483648";
              if(elem.maximumvalue=="") elem.maximumvalue="2147483647";
              elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "smallint":
              elem.type="Integer";
              if(elem.minimumvalue=="") elem.minimumvalue="-32768";
              if(elem.maximumvalue=="") elem.maximumvalue="32767";
              elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "tinyint":
              elem.type="Integer";
              if(elem.minimumvalue=="") elem.minimumvalue="0";
              if(elem.maximumvalue=="") elem.maximumvalue="255";
              elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    case "bit":
              elem.type="Integer";
              if(elem.minimumvalue=="") elem.minimumvalue="0";
              if(elem.maximumvalue=="") elem.maximumvalue="1";
              elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
              if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
    default  :elem.evaluationfunction=customRangeValidatorEvaluateIsValid;
			  if(elem.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate; //controltovalidate.style.backgroundColor="#FFE4C4";
              break;
  }
}  //matchValidationList()

function ChangeStyle(elm)
{
   //elm.style.backgroundColor="#FFE4C4";
   elm.insertAdjacentHTML("afterEnd","<font color=red>*</font>");
  // elm.outerHTML+="<font color=red>*</font>";

  
}//ChangeStyle

function customRequiredFieldValidatorEvaluateIsValid(val){
	if(val.nonEmpty=="yes"){
      if(!(ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue))){
        val.errormessage=val.errortitle+"不能为空!";
        return false;
      }
    }
    
    if(val.nonSpace=="yes"){
      if(strTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorGetValue(val.controltovalidate)){
        val.errormessage=val.errortitle+"不能含有空格!";
        return false;
      }
    }

    var theStr=ValidatorTrim(ValidatorGetValue(val.controltovalidate));
    var valueLen=getTextValueLength(theStr);
    var MaxLength;
    //alert("MaxLength=document.all."+val.controltovalidate+".dataLength;"+","+MaxLength+","+valueLen+","+theStr);
    eval("MaxLength=document.all."+val.controltovalidate+".dataLength;");
    //alert("MaxLength=document.all."+val.controltovalidate+".dataLength;"+","+MaxLength+","+valueLen+","+theStr);
    if(valueLen>MaxLength){
        val.errormessage=val.errortitle+"超过最大长度("+MaxLength+"字节)!";
        return false;
    }
    
    if(val.ExpressStr+""!="undefined")
    {
      var chkresult=null;
      eval("chkresult=(ValidatorGetValue(val.controltovalidate)).match("+val.ExpressStr+");");
      if(chkresult==null)
      {
        val.errormessage=val.errortitle+val.ExpressError+"!";
        return false;
      }
    }
    return true;
}

function customRangeValidatorEvaluateIsValid(val) {
    if(val.nonEmpty=="yes"){
      if(!(ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue))){
        val.errormessage=val.errortitle+"不能为空!";
        return false;
      }
    }
    val.errormessage=val.errortitle+"的数据格式非法或数值越界\n(最小值:'"+val.minimumvalue+"',最大值:'"+val.maximumvalue+"')。";
    return RangeValidatorEvaluateIsValid(val);
}

function getTextValueLength(theStr){
  var charCode;
  var strLen=0;
  var str=new String(theStr);
  for(var i=0;i<str.length;i++){
    charCode=str.charCodeAt(i);
    if(charCode>255) strLen+=2; else strLen+=1;
  }
  return strLen;
}

function initMultiValidator(val){
  if(val.ValidateType.toLowerCase()=="fixedsum"){
    val.errormessage=val.errortitle+"的总和必须为"+val.sum+"!";
  }
  else if(val.ValidateType.toLowerCase()=="nonempty"){
    val.errormessage=val.errortitle+"中至少有一个不能为空!";
  }
  else if(val.ValidateType.toLowerCase()=="fixedfilledcount"){
    val.errormessage=val.errortitle+"中有且仅有"+val.NumToBeFilled+"个不能为空!";
  }

  val.evaluationfunction=MultiValidatorEvaluateIsValid;
}

function MultiValidatorEvaluateIsValid(val){
  var startIndex=val.ControlsToValidate.indexOf("{")+1;
  var endIndex  =val.ControlsToValidate.indexOf("}");
  var content=val.ControlsToValidate.substring(startIndex,endIndex);  //get rid of the {} pair
  var controls=content.split(';');

if(val.ValidateType==""){
    return true;
  }
  if(val.ValidateType.toLowerCase()=="nonempty"){
    var isEmpty=true;
    for(var i=0;isEmpty && i<controls.length;i++){
      if(val.PreId!=null)
      {
         controls[i]=val.PreId+controls[i];
      }
      if((ValidatorTrim(ValidatorGetValue(controls[i])) != ValidatorTrim(val.initialvalue))) isEmpty=false;
    }
  
    if(isEmpty) return false;
    else return true;
  }
  else if(val.ValidateType.toLowerCase()=="fixedsum"){
    var sum=0;
    for(var i=0;i<controls.length;i++){
      if(val.PreId!=null)
      {
         controls[i]=val.PreId+controls[i];
      }
      var j=ValidatorTrim(ValidatorGetValue(controls[i]));
      if(j==null||j=="") j=0;
      sum+=parseFloat(j)*1000000000;
    }
    sum/=1000000000;
     if(sum!=val.sum) return false;
    else return true;
  }
  if(val.ValidateType.toLowerCase()=="fixedfilledcount"){
    var num_filled=0;
    for(var i=0;isEmpty && i<controls.length;i++){
      if(val.PreId!=null)
      {
         controls[i]=val.PreId+controls[i];
      }
      if((ValidatorTrim(ValidatorGetValue(controls[i])) != ValidatorTrim(val.initialvalue))) num_filled++;
    }
  
    if(num_filled!=parseInt(val.NumToBeFilled,10)) return false;
    else return true;
  }
}

function initFileValidator(val){
  var controltovalidate;
  
  eval("controltovalidate=document.all."+val.controltovalidate);
  if(val.nonEmpty=="yes") ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate;
   controltovalidate.className="detailDisplay";
  //controltovalidate.style.backgroundColor="#FFE4C4";
  //controltovalidate.readOnly=true;
  
  //val.errormessage="请选择后缀名为"+val.validExts+"的文件!";
  val.evaluationfunction=FileExtValidatorEvaluateIsValid;
}

function FileExtValidatorEvaluateIsValid(val){  
  if(val.nonEmpty=="yes"){
      if(!(ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue))){
        val.errormessage=val.errortitle+"不能为空!";
        return false;
      }
  }
  
  if(val.validExts=="") return true;
  
  var startIndex=val.validExts.indexOf("{")+1;
  var endIndex  =val.validExts.indexOf("}");
  var content=val.validExts.substring(startIndex,endIndex);  //get rid of the {} pair
  var exts=content.split(';');
  
  var filename=ValidatorTrim(ValidatorGetValue(val.controltovalidate));
  if(filename=="") return true;
  filename=filename.toLowerCase();
  for(var i=0;i<exts.length;i++){
    //check for each acceptable file exts
    var ext= exts[i];
    var pos=filename.search(ext.toLowerCase());
    
    if(pos>0) return true;
  }
  val.errormessage=val.errortitle+"请选择后缀名为"+val.validExts+"的文件!"; 
  return false;
}

function initFixedLengthValidator(val){
  var controltovalidate;
  
  //eval("controltovalidate=document.all."+val.controltovalidate);
  //ControlsToChangeStyle[ControlsToChangeStyle.length]=controltovalidate;
  //controltovalidate.className="detailDisplay";
  //controltovalidate.style.backgroundColor="#FFE4C4";
  //controltovalidate.readOnly=true;
  
  if(val.MinimumLength!=null && val.MinimumLength!="")
    val.errormessage=val.errortitle+"输入文字字节数必须大于"+val.MinimumLength+"(每个汉字为2字节)!";
  else
    val.errormessage=val.errortitle+"输入文字字节数必须为"+val.SpecifiedLength+"(每个汉字为2字节)!";
  val.evaluationfunction=FixedLengthValidatorEvaluateIsValid;
}

function FixedLengthValidatorEvaluateIsValid(val){
  if((ValidatorTrim(ValidatorGetValue(val.controltovalidate)) == ValidatorTrim(val.initialvalue))) return true;  //未输入新值则不进行检查
  
  var userInput=ValidatorTrim(ValidatorGetValue(val.controltovalidate));
  
  //alert(userInput+","+getTextValueLength(userInput)+","+val.SpecifiedLength);
  if(val.MinimumLength!=null && val.MinimumLength!="")
  {
		if(getTextValueLength(userInput)>=parseInt(val.MinimumLength)) return true;
		else return false;
  }
  var spfLens=val.SpecifiedLength.split(",");
  for(var i=0;i<spfLens.length;i++)
	if(getTextValueLength(userInput)==spfLens[i]||getTextValueLength(userInput)=="0") return true;
  return false;
}

//机构代码证
function checkJGDM(jgdmz){
	var errmsg="ok";

	var partx,SumW=0,codex,lastY;
	var Wi=new Array(3,7,9,10,5,8,4,2);

    /*
	if(jgdmz.substring(0,3)=="PDY"&&jgdmz.substring(3,8)!="00000")
	{
		for(j=0;j<5;j++)
		{
			if(!isDigit(jgdmz.substring(3+j,4+j)))
			{
				break;
			}
			if(j==4)
			{
				errmsg="PDY00001～PDY99999为自定义编码区，仅限内部使用，不是有效的机构代码！";
				return errmsg;
			}
		}
	}
	*/
	
	for(i=0;i<8;i++)
	{
		partx=jgdmz.substring(i,i+1);
		if(isDigit(partx))
		{
			SumW+=parseInt(partx)*Wi[i];
		}
		else
		{
			codex=partx.charCodeAt(0)-55;
			/*
			if(codex<10||codex>35)
			{
				alert('第'+i+'位不是有效的字母或数字');
				return;
			}
			else
			{
			*/
				SumW+=codex*Wi[i];
			//}
		}
	}
	var verify=SumW%11;
	switch (verify)
	{
		case 1:
			lastY="X";
			break;
		case 0:
			lastY="0";
			break;
		default:
			lastY=11-verify;
			break;
	}

	if(jgdmz.substring(9,10)==lastY)
	{
		return errmsg;
	}
	else
	{
		errmsg="校验位错误";
		return errmsg;
	}
}
		
function customJGDMFieldValidatorEvaluateIsValid(val){
  if(val.nonEmpty=="yes"){
      if(!(ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue))){
        val.errormessage=val.errortitle+"不能为空!";
        return false;
      }
    }
    
    var jgdmz=ValidatorTrim(ValidatorGetValue(val.controltovalidate));
	while(jgdmz.indexOf("—")!=-1||jgdmz.indexOf("－")!=-1)
	{
		jgdmz=jgdmz.replace("—","-").replace("－","-");
	}
	
	jgdmz=jgdmz.toUpperCase();
	eval('document.all.'+val.id+'.value=jgdmz;');
	
	if(jgdmz==null||jgdmz=="")
	{
		return;
	}
	
	if(jgdmz.length!=10)
	{
		val.errormessage=val.errortitle+"代码位数不正确，正确格式（8位数字或字母  横杠  1位数字或字母“X”）：XXXXXXXX-X";
		return false;
	}
	
	var regExp = /^[1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ]{8,8}[-]{1,1}[1234567890X]{1,1}/g; 
	if(regExp.exec(jgdmz) == null) 
	{
		val.errormessage=val.errortitle+"代码格式不正确，正确格式（8位数字或字母  横杠  1位数字或字母“X”）：XXXXXXXX-X";
		return false;
	}
	
	var rtnValue=checkJGDM(jgdmz);
	if(rtnValue!="ok"){val.errormessage=val.errortitle+":"+rtnValue; return false;}
	return true;
}


//身份证
function customSFZHFieldValidatorEvaluateIsValid(val){
  if(val.nonEmpty=="yes"){
      if(!(ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue))){
        val.errormessage=val.errortitle+"不能为空!";
        return false;
      }
    }


    var theStr=ValidatorTrim(ValidatorGetValue(val.controltovalidate));
    var valueLen=getTextValueLength(theStr);
    //15位
    if(valueLen==0)
		return true;
    if(valueLen!=15 && valueLen!=18) {val.errormessage=val.errortitle+"长度必须为15位或18位!"; return false;}
    if(valueLen==15)
    {
      if(!isDigit(theStr)) {val.errormessage=val.errortitle+"所有位必须为数字!"; return false;}
      var rtnValue=verifySFZ(theStr,val.minimumvalue,val.maximumvalue,val.currentDate);
      if(rtnValue!="ok"){val.errormessage=val.errortitle+":"+rtnValue; return false;}
      var theStr18=changeSFZ15to18(theStr);
      //alert("系统已将"+theStr+"转变为18位号码"+theStr18+"!");
      
      document.all[val.controltovalidate].value=theStr18;
    }
    else  //18位
    {
      if(!isDigit(theStr.substring(0,17))) {val.errormessage=val.errortitle+"18位中前17位必须为数字!"; return false;}
      var rtnValue=verifySFZ(theStr,val.minimumvalue,val.maximumvalue,val.currentDate);
      if(rtnValue!="ok"){val.errormessage=val.errortitle+":"+rtnValue; return false;}
      document.all[val.controltovalidate].value=theStr.substring(0,17)+theStr.substring(17,18).toUpperCase();
    }
    return true;

}

function verifySFZ(elm,minvalue,maxvalue,currentdate)
{
	var err="0";
	var errmsg="ok";
	var txtlen=elm.length;
	var year,month,day,birth;			
												
	if(txtlen==15)
	{
		year=elm.substring(6,8);
		month=elm.substring(8,10);
		day=elm.substring(10,12);
		err=checkdate_SFZ(year+"/"+month+"/"+day);
			
			
		if(err!="0")
		{
			errmsg="15位身份证中的生日格式不正确 ";
			return errmsg;
		}
		
		err="0";		
		err=checkbirth("19"+year,minvalue,maxvalue,currentdate);
				
		if(err!="0")
		{
			errmsg="该人身份证年龄"+err;
			return errmsg;
		}
				
	}
	else if(txtlen==18)
	{
		year=elm.substring(6,10);
		month=elm.substring(10,12);
		day=elm.substring(12,14);
		err=checkdate_SFZ(year+"/"+month+"/"+day);
				
				
		if(err!="0")
		{
			errmsg="18位身份证中的生日格式不正确 ";
			return errmsg;
		}
		
		err="0";	
		err=checkbirth(year,minvalue,maxvalue,currentdate);
				
		if(err!="0")
		{
		  errmsg="该人身份证年龄"+err;
		  return errmsg;
		}
		
		err="0";	
		err=verifySFZlast(elm);
				
		if(err!="0")
		{
			errmsg="18位身份证"+err;
			err="0";
			return errmsg;
		}
				
	 }
	 else
	 {
				
		errmsg="身份证长度不正确，不是15或18位";
		return errmsg;
	 }
			
	return errmsg;
}	//verifySFZBirthDay
		
		
		
		
		
//check 身份证号码日期
function checkdate_SFZ(elem)
{
	var err="0";
	var daysInMonth=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	var index;
	var buffer="";
	var ch;
	var flag=0;
	var instr=elem;
				
	if(instr.length==0) 
		return "无时间类型";
	for(index=0;index<instr.length;index++)
	{
		ch=instr.charAt(index);
				
		if(('0'<=ch)&&(ch<='9')) 
			buffer+=ch;
		else if(flag<2)
		{
			buffer+="/"; flag++;
		}
		else
		{ 
			err="有效日期格式:yyyy/mm/dd。"; 
			return err;
		}
	}
				
	if(flag!=2)
	{   
		err="有效日期格式:yyyy/mm/dd。"; 
		return err;
	}
	var date_array=buffer.split('/');
	if((date_array[0].length!=2)&&(date_array[0].length!=4))
	{ 
		err="无效年份。"; 
		return err;
	}
			if(date_array[1].length==0)
			{ 
				err="无效月份。";
				return err;
			}
			if(date_array[2].length==0)
			{ 
				err="无效日期。";
				return err;
			}
			if(date_array[0].length==2)
			{
				if(date_array[0].charAt(0)!='0') date_array[0]="19"+date_array[0];
				else date_array[0]="20"+date_array[0];
			}
				
			if(date_array[1].length==1) 
					date_array[1]="0"+date_array[1];
			if(date_array[2].length==1) 
					date_array[2]="0"+date_array[2];
					
			var year=parseInt(date_array[0],10);   //year
			var month=parseInt(date_array[1],10);  //month
				
			if((month<1)||(month>12))
			{ 
					err="无效月份。";
					return err;
			}
				
			var day=parseInt(date_array[2],10);  //day
				
			if(month==2)  //February
			{
				index=((0==year%4)&&(0!=(year%100)))||(0==year%400)?29:28;
				if((day<1)||(day>index))
				{ 
					err="无效闰年日期。"; 
					return err;
				}
			}
			else
			{
				index=daysInMonth[month-1];
				if((day<1)||(day>index))
				{ 
						err="无效日期。"; 
						return err;
				}
			}
			
			return err;
		}  //checkdate()


		function checkbirth(year,min,max,nowdate)
		{	
			var err="0";
			var datenow;
			if((nowdate+"")=="undefined")
			  datenow=new Date();
			else
			  datenow=new Date(nowdate) ;
			if((datenow.getFullYear()-year)<0)
			err="超越当前时间";
			else if((datenow.getFullYear()-year)<min)
			err="身份证年龄小于"+min+"岁，不符合填写要求";
			if((datenow.getFullYear()-year)>max)
			err="身份证年龄大于"+max+"岁，不符合填写要求";

			return err;
		}//checkbirth
		
		
		
		
		function verifySFZlast(sfz)
		{
			var err="0";
			var i,SumW=0,partx,last,lastY;
			last=sfz.substring(17,18);
			var Wi=new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
			
			
			for(i=0;i<17;i++)
			{
				partx=sfz.substring(i,i+1);
			
				if(isDigit(partx))
					SumW+=parseInt(partx)*Wi[i];
				else
				{
					err="前17位含有非数字类型码";
					return err;
				}
			}
			
			var verifyY=SumW%11;
			switch (verifyY)
			{
				case 0:
					lastY="1";
					break;
				case 1:
					lastY="0";
					break;
				case 2:
					lastY="X";
					break;
				case 3:
					lastY="9";
					break;
				case 4:
					lastY="8";
					break;
				case 5:
					lastY="7";
					break;
				case 6:
					lastY="6";
					break;
				case 7:
					lastY="5";
					break;
				case 8:
					lastY="4";
					break;
				case 9:
					lastY="3";
					break;
				case 10:
					lastY="2";
					break;
				default:
					err="校验位溢出";
					return err;
					
			}
			
			if(last.toUpperCase()!=lastY)		
			{
				err="最后一位校验位有错误";
				return err;
			}
			return err;
		}//verifylast
		
		
		//转换证件类型时，变更验证
		function changeZjlx(zjlxCtl,zjhCtl,svzjhCtl)
		{
		   //zjlxCtl证件类型控件
		   //zjhCtl证件号控件
		   //svzjhCtl证件号验证控件
		   if(zjlxCtl.value=="1")
		   {
		      zjhCtl.datatype="varcharSfZ";
		      if(svzjhCtl.minimumvalue=="") svzjhCtl.minimumvalue="0";
              if(svzjhCtl.maximumvalue=="") svzjhCtl.maximumvalue="100";
              svzjhCtl.evaluationfunction=customSFZHFieldValidatorEvaluateIsValid;
		   }
		   else
		   {
		      zjhCtl.datatype="varchar";
			  svzjhCtl.evaluationfunction=customRequiredFieldValidatorEvaluateIsValid;
		   }
		   
		}


                function changeZjlxAndXbCsrq(zjlxCtl,zjhCtl,svzjhCtl,xbCtl,csrqCtl)
		{
		   //zjlxCtl证件类型控件
		   //zjhCtl证件号控件
		   //svzjhCtl证件号验证控件
                  //xbCtl性别验证控件
                  //csrqCtl出生日期
		   if(zjlxCtl.value=="1")
		   {
		      zjhCtl.datatype="varcharSfZ";
                      xbCtl.nonEmpty = "no";
                      csrqCtl.nonEmpty = "no";
		      if(svzjhCtl.minimumvalue=="") svzjhCtl.minimumvalue="0";
              if(svzjhCtl.maximumvalue=="") svzjhCtl.maximumvalue="100";
              svzjhCtl.evaluationfunction=customSFZHFieldValidatorEvaluateIsValid;
		   }
		   else
		   {
		      zjhCtl.datatype="varchar";
                     xbCtl.nonEmpty = "yes";
                      csrqCtl.nonEmpty = "yes";
	              svzjhCtl.evaluationfunction=customRequiredFieldValidatorEvaluateIsValid;
		   }
		   
		}
