
    function validateIdentityCard(form){
	    var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var oIDCard = eval('new ' + jcv_retrieveFormName(form) +  '_identityCard()');
        for (var x in oIDCard) {
            if (!jcv_verifyArrayElement(x, oIDCard[x])) {
                continue;
            }
            var field = form[oIDCard[x][0]];
            if (!jcv_isFieldPresent(field)) {
              continue;
            }
            if ((field.type == 'hidden' || field.type == 'text' ||
                field.type == 'textarea' || field.type == 'file')
                && (field.value.length > 0)) {
	      var iMask=oIDCard[x][2]("mask");
              if(!jcv_matchIDCard(field.value,iMask )){
                if (i == 0) {
                  focusField = field;
                }
                fields[i++] = oIDCard[x][1];
                isValid = false;
              }
            }
        }
        if (fields.length > 0) {
           jcv_handleErrors(fields, focusField);
        }
        return isValid;
	}

	function jcv_matchIDCard(value, mask) {
          var sYear; var sMonth; var sDay;
          if( mask.test(value)){
		   if (value.length == 18)
		   {
			   sYear = value.substr(6, 4);
               sMonth = value.substr(10, 2);
              sDay = value.substr(12, 2);
		   }
	       else
		   {
           sYear = "19"+value.substr(6, 2);
           sMonth = value.substr(8, 2);
           sDay = value.substr(10, 2);
		   }
		   if (isFullDate(sYear + "-" + sMonth + "-" + sDay))
		   return true;
	   }
	   return false;
    }

   //根据身份证组合的日期判断(yyyy-mm-dd)
   function isFullDate(dateStr)
    {
    var datePat = /^(\d{4})(\-)(\d{2})(\-)(\d{2})$/;
    var matchArray = dateStr.match(datePat);
    if (matchArray == null)
    {
        return false;
    }
    year = matchArray[1];
    month = matchArray[3];
    day = matchArray[5];
    if (month < 1 || month > 12)
    {
        return false;
    }
    if (day < 1 || day > 31)
    {
        return false;
    }
    if ((month==4 || month==6 || month==9 || month==11) && day==31)
    {
        return false;
    }
    if (month == 2)
    {
        var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
        if (day > 29 || (day==29 && !isleap))
        {
            return false;
        }
    }
    return true;
   }

    function validateMask(form) {

        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
		var oMasked = eval('new ' + jcv_retrieveFormName(form) +  '_mask()');
      //  var formName = form.getAttributeNode("name");
      //  var oMasked = eval('new ' + formName.value + '_mask()');
        for (var x in oMasked) {
            if (!jcv_verifyArrayElement(x, oMasked[x])) {
                continue;
            }
            var field = form[oMasked[x][0]];
            if (!jcv_isFieldPresent(field)) {
              continue;
            }

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                 field.type == 'textarea' ||
				 field.type == 'file') &&
                 (field.value.length > 0)) {
				var iMask=oMasked[x][2]("mask");
				var iMulti=oMasked[x][2]("multi");
				var iSeparator=oMasked[x][2]("separator");
				var rs = false;
				if(iMulti){
				  var str=field.value.split(iSeparator);
				  for(i=0;i<str.length;i++){
				    if(jcv_matchPattern(field.value,iMask )==false){
					  break;
					}
				  }
				}
				else rs=jcv_matchPattern(field.value,iMask );
				if(rs==false){
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oMasked[x][1];
                    isValid = false;
				}
            }
        }

        if (fields.length > 0) {
           jcv_handleErrors(fields, focusField);
        }
        return isValid;
    }

    function jcv_matchPattern(value, mask) {
       return mask.test(value);
    }

  function jcv_handleErrors(messages, focusField) {
      if (focusField && focusField != null) {
          var doFocus = true;
          if (focusField.disabled || focusField.type == 'hidden') {
              doFocus = false;
          }
          if (doFocus &&
              focusField.style &&
              focusField.style.visibility &&
              focusField.style.visibility == 'hidden') {
              doFocus = false;
          }
          if (doFocus) {
              focusField.focus();
          }
      }
      alert(messages.join('\n'));
  }

    function validateDecimal(form) {
	//min,max,precision,multi,separator

        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
		var oDecimal = eval('new ' + jcv_retrieveFormName(form) +  '_decimal()');
       // var formName = form.getAttributeNode("name");
      //  var oDecimal = eval('new ' + formName.value + '_decimal()');
        for (var x in oDecimal) {
            if (!jcv_verifyArrayElement(x, oDecimal[x])) {
                continue;
            }
            var field = form[oDecimal[x][0]];
            if (!jcv_isFieldPresent(field)) {
              continue;
            }
            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                 field.type == 'textarea' ||
				 field.type == 'file') &&
                 (field.value.length > 0)) {
				var iMin=oDecimal[x][2]("min");
				var iMax=oDecimal[x][2]("max");
				var iPrecision=oDecimal[x][2]("precision");
				var iMulti=oDecimal[x][2]("multi");
				var iSeparator=oDecimal[x][2]("separator");
				var rs=false;
				if(iMulti){
				  var str=field.value.split(iSeparator);
				  for(i=0;i<str.length;i++){
				    if(jcv_validateDecimal(field.value,iMin,iMax,iPrecision )==false){
					  break;
					}
				  }
				}
				else rs=jcv_validateDecimal(field.value,iMin,iMax,iPrecision );
				if(rs==false){
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oDecimal[x][1];
                    isValid = false;
				}
            }
        }
        if (fields.length > 0) {
           jcv_handleErrors(fields, focusField);
        }
        return isValid;

	}

	function jcv_validateDecimal(value,min,max,precision){

		var reD = /^\d+(?=\.{0,1}\d+$|$)/;
		var reI = /\S+/i;
		if(reD.test(value)){
			if (value >= min && value<=max)
			{
		        //if ((precision == 0))
            	//	return true;
			//	else
				{
				 var i= value.indexOf(".");
			     if (i == -1  )
				 return true;
			     else
			      {
			         var s = value.substring(i+1);
			         if(s.length <= precision )
				     return true;
			      }
				}
			 }

		}
         return false;

	}



    function validateRequired(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();

		//var formName = form.getAttributeNode("name");
      //  var oRequired = eval('new ' + formName.value + '_required()');
        var oRequired = eval('new ' + jcv_retrieveFormName(form) +  '_required()');

        for (var x in oRequired) {
            if (!jcv_verifyArrayElement(x, oRequired[x])) {
                continue;
            }
            var field = form[oRequired[x][0]];
			if(typeof(field)!='object') continue;

            if (!jcv_isFieldPresent(field)) {
                fields[i++] = oRequired[x][1];
                isValid=false;
            } else if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'textarea' ||
                field.type == 'file' ||
                field.type == 'radio' ||
                field.type == 'checkbox' ||
                field.type == 'select-one' ||
                field.type == 'password')) {

                var value = '';
                // get field's value
                if (field.type == "select-one") {
                    var si = field.selectedIndex;
                    if (si >= 0) {
                        value = field.options[si].value;
                    }
                } else if (field.type == 'radio' || field.type == 'checkbox') {
                    if (field.checked) {
                        value = field.value;
                    }
                } else {
                    value = field.value;
                }

                if (trim(value).length == 0) {

                    if ((i == 0) && (field.type != 'hidden')) {
                        focusField = field;
                    }
                    fields[i++] = oRequired[x][1];
                    isValid = false;
                }
            } else if (field.type == "select-multiple") {
                var numOptions = field.options.length;
                lastSelected=-1;
                for(loop=numOptions-1;loop>=0;loop--) {
                    if(field.options[loop].selected) {
                        lastSelected = loop;
                        value = field.options[loop].value;
                        break;
                    }
                }
                if(lastSelected < 0 || trim(value).length == 0) {
                    if(i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oRequired[x][1];
                    isValid=false;
                }
            } else if ((field.length > 0) && (field[0].type == 'radio' || field[0].type == 'checkbox')) {
                isChecked=-1;
                for (loop=0;loop < field.length;loop++) {
                    if (field[loop].checked) {
                        isChecked=loop;
                        break; // only one needs to be checked
                    }
                }
                if (isChecked < 0) {
                    if (i == 0) {
                        focusField = field[0];
                    }
                    fields[i++] = oRequired[x][1];
                    isValid=false;
                }
            }
        }
        if (fields.length > 0) {
           jcv_handleErrors(fields, focusField);
        }
        return isValid;
    }

    // Trim whitespace from left and right sides of s.
    function trim(s) {
        return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
    }

  function jcv_retrieveFormName(form) {

      // Please refer to Bugs 31534, 35127, 35294, 37315 & 38159
      // for the history of the following code

      var formName;

      if (form.getAttributeNode) {
          if (form.getAttributeNode("id") && form.getAttributeNode("id").value) {
              formName = form.getAttributeNode("id").value;
          } else {
              formName = form.getAttributeNode("name").value;
          }
      } else if (form.getAttribute) {
          if (form.getAttribute("id")) {
              formName = form.getAttribute("id");
          } else {
              formName = form.attributes["name"];
          }
      } else {
          if (form.id) {
              formName = form.id;
          } else {
              formName = form.name;
          }
      }

      return formName;

  }

    function validateLength(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
		var oMaxBytes = eval('new ' + jcv_retrieveFormName(form) +  '_length()');
    //    var formName = form.getAttributeNode("name");
   //     oMaxBytes = eval('new ' + formName.value + '_length()');
        for (x in oMaxBytes) {
            var field = form[oMaxBytes[x][0]];

            if (field&&(field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'password' ||
                field.type == 'textarea') &&
                field.disabled == false) {

                var iMax = parseInt(oMaxBytes[x][2]("max"));
                var iMin = parseInt(oMaxBytes[x][2]("min"));
                var bytesLength=0;
                var v;
                for(var k=0;k<field.value.length;k++){
                  v=field.value.charCodeAt(k);
                  if(v<0||v>255){
                    bytesLength+=2;
                  }
                  else{
                    bytesLength++;
                  }
                }
                if (bytesLength > iMax||bytesLength<iMin) {
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oMaxBytes[x][1];
                    isValid = false;
                }
            }
        }
        if (fields.length > 0) {
           focusField.focus();
           alert(fields.join('\n'));
        }
        return isValid;
    }

  function jcv_verifyArrayElement(name, element) {
      if (element && element.length && element.length == 3) {
          return true;
      } else {
          return false;
      }
  }

  function jcv_isFieldPresent(field) {
      var fieldPresent = true;
      if (field == null || field == undefined) {
          fieldPresent = false;
      } else {
          if (field.disabled) {
              fieldPresent = false;
          }
      }
      return fieldPresent;
  }

