jQuery.validator.addMethod("maxWords", function(value, element, params) { 
    return this.optional(element) || value.match(/\b\w+\b/g).length < params; 
}, $.format("Please enter {0} words or less.")); 
 
jQuery.validator.addMethod("minWords", function(value, element, params) { 
    return this.optional(element) || value.match(/\b\w+\b/g).length >= params; 
}, $.format("Please enter at least {0} words.")); 
 
jQuery.validator.addMethod("rangeWords", function(value, element, params) { 
    return this.optional(element) || value.match(/\b\w+\b/g).length >= params[0] && value.match(/bw+b/g).length < params[1]; 
}, $.format("Please enter between {0} and {1} words."));


jQuery.validator.addMethod("letterswithbasicpunc", function(value, element) {
	return this.optional(element) || /^[a-z-.,()'\"\s]+$/i.test(value);
}, "Letters or punctuation only please");  

jQuery.validator.addMethod("alphanumeric", function(value, element) {
	return this.optional(element) || /^\w+$/i.test(value);
}, "Letters, numbers, spaces or underscores only please");  

jQuery.validator.addMethod("lettersonly", function(value, element) {
	return this.optional(element) || /^[a-z]+$/i.test(value);
}, "Letters only please"); 

jQuery.validator.addMethod("nowhitespace", function(value, element) {
	return this.optional(element) || /^\S+$/i.test(value);
}, "No white space please"); 

jQuery.validator.addMethod("ziprange", function(value, element) {
	return this.optional(element) || /^90[2-5]\d\{2}-\d{4}$/i.test(value);
}, "Your ZIP-code must be in the range 902xx-xxxx to 905-xx-xxxx");

jQuery.validator.addMethod("usernamecheck",function(value, element) {
    return this.optional(element) || /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/i.test(value)|| /^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value) ;
},"账号应为Email格式或由4-16位的英文字母、数字和下划线\"_\"组成,不能以数字、\"_\"开头,不可包含空格;");

jQuery.validator.addMethod("isPassword",function(value, element) {
    return this.optional(element) || /^[a-zA-Z0-9_]+$/i.test(value);
},"密码只能由英文字母、数字或下划线\"_\"组成,不可包含空格");


jQuery.validator.addMethod("ppIdcheck",function(value, element) {
    return this.optional(element) || /^[1-9]([0-9]{14}|[0-9]{17})$/i.test(value);
},"请输入正确的身份证号码(15-18位)");

jQuery.validator.addMethod("isMobile", function(value, element) {     
  var length = value.length;     
  return this.optional(element) || (length == 11 && /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/i.test(value));     
}, "请正确填写手机号码");

jQuery.validator.addMethod("isLength",function(value, element) {
    var length = value.length;
    return this.optional(element) || length<61;
},"长度不能超过60字");

jQuery.validator.addMethod("isPostcode",function(value, element) {
    var length = value.length;
    return this.optional(element) || length==6;
},"请输入6位邮政编码");

jQuery.validator.addMethod("isSection",function(value, element) {
    var length = value.length;
    return this.optional(element) || (length > 2 && length < 7);
},"区号必须是3-6位数字");

jQuery.validator.addMethod("isPhone",function(value, element) {
    var length = value.length;
    return this.optional(element) || (length > 4 && length < 11);
},"主机号码必须是5-10位数字");

jQuery.validator.addMethod("isExt",function(value, element) {
    var length = value.length;
    return this.optional(element) || (length > 0 && length < 7);
},"分机号码必须是1-6位数字");

/**"区号必须是3-6位数字"
* Return true, if the value is a valid vehicle identification number (VIN).
*
* Works with all kind of text inputs.
*
* @example <input type="text" size="20" name="VehicleID" class="{required:true,vinUS:true}" />
* @desc Declares a required input element whose value must be a valid vehicle identification number.
*
* @name jQuery.validator.methods.vinUS
* @type Boolean
* @cat Plugins/Validate/Methods
*/ 
jQuery.validator.addMethod(
	"vinUS",
	function(v){
		if (v.length != 17)
			return false;
		var i, n, d, f, cd, cdv;
		var LL    = ["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"];
		var VL    = [1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9];
		var FL    = [8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2];
		var rs    = 0;
		for(i = 0; i < 17; i++){
		    f = FL[i];
		    d = v.slice(i,i+1);
		    if(i == 8){
		        cdv = d;
		    }
		    if(!isNaN(d)){
		        d *= f;
		    }
		    else{
		        for(n = 0; n < LL.length; n++){
		            if(d.toUpperCase() === LL[n]){
		                d = VL[n];
		                d *= f;
		                if(isNaN(cdv) && n == 8){
		                    cdv = LL[n];
		                }
		                break;
		            }
		        }
		    }
		    rs += d;
		}
		cd = rs % 11;
		if(cd == 10){cd = "X";}
		if(cd == cdv){return true;}
		return false; 
	},
	"The specified vehicle identification number (VIN) is invalid."
);

/**
  * Return true, if the value is a valid date, also making this formal check yyyy-mm-dd.
  *
  * @example jQuery.validator.methods.date("1900-01-23")
  * @result true
  *
  * @example jQuery.validator.methods.date("2009-02-31")
  * @result false
  *
  * @example <input name="pippo" class="{isDate:true}" />
  * @desc Declares an optional input element whose value must be a valid date.
  *
  * @name jQuery.validator.methods.dateITA
  * @type Boolean
  * @cat Plugins/Validate/Methods
  */
jQuery.validator.addMethod(
	"isDate",
	function(value, element) {
		var check = false;
		var re = /^(\d{4})(\-)(\d{1,2})\-(\d{1,2})$/
		if( re.test(value)){
			var adata = value.split('-');
			var aaaa = parseInt(adata[0],10);
			var mm = parseInt(adata[1],10);
			var gg = parseInt(adata[2],10);
			var xdata = new Date(aaaa,mm-1,gg);
			if ( ( xdata.getFullYear() == aaaa ) && ( xdata.getMonth () == mm - 1 ) && ( xdata.getDate() == gg ) )
				check = true;
			else
				check = false;
		} else
			check = false;
		return this.optional(element) || check;
	}, 
	"请输入正确的日期,如 2009-01-31"
);

/**
 * matches US phone number format 
 * 
 * where the area code may not start with 1 and the prefix may not start with 1 
 * allows '-' or ' ' as a separator and allows parens around area code 
 * some people may want to put a '1' in front of their number 
 * 
 * 1(212)-999-2345
 * or
 * 212 999 2344
 * or
 * 212-999-0983
 * 
 * but not
 * 111-123-5434
 * and not
 * 212 123 4567
 */
jQuery.validator.addMethod("phone", function(phone_number, element) {
    phone_number = phone_number.replace(/\s+/g, ""); 
	return this.optional(element) || phone_number.length > 9 &&
		phone_number.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
}, "Please specify a valid phone number");

// TODO check if value starts with <, otherwise don't try stripping anything
jQuery.validator.addMethod("strippedminlength", function(value, element, param) {
	return jQuery(value).text().length >= param;
}, jQuery.format("Please enter at least {0} characters"));

// same as email, but TLD is optional
jQuery.validator.addMethod("email2", function(value, element, param) {
	return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value); 
}, jQuery.validator.messages.email);

// same as url, but TLD is optional
jQuery.validator.addMethod("url2", function(value, element, param) {
	return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); 
}, jQuery.validator.messages.url);

// 身份证号码验证    
jQuery.validator.addMethod("isIdCardNo", function(value, element) {    
  return this.optional(element) || checkIdcard(value.toUpperCase( ));    
}, "请正确输入您的身份证号码"); 

//身份证验证   
function checkIdcard(idcard1){   
   var idcard=idcard1;//document.forms[0].elements[idcard1].value;   
   var Errors=new Array(   
   "验证通过!",   
   "身份证号码位数不对!",   
   "身份证号码出生日期超出范围或含有非法字符!",   
   "身份证号码校验错误!",   
   "身份证地区非法!"  
   );   
   var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}    
      
   var idcard,Y,JYM;   
   var S,M;   
   var idcard_array = new Array();   
   idcard_array = idcard.split("");   
   /*地区检验*/  
   if(area[parseInt(idcard.substr(0,2))]==null)    
   {
    return false;   
   }   
   /*身份号码位数及格式检验*/  
   switch(idcard.length){   
    case 15:   
        if ( (parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){   
         ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性   
        } else {   
         ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性   
        }   
        if(ereg.test(idcard)){   
          return true; //15位验证通过   
         }   
        else {   
           return false;   
          }   
    break;   
       
    case 18:   
        //18位身份号码检测   
        //出生日期的合法性检查    
        //闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))   
        //平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))   
        if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 )){   
        ereg=/^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式   
        } else {   
        ereg=/^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式   
        }   
        if(ereg.test(idcard)){//测试出生日期的合法性   
         //计算校验位   
         S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7   
         + (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9   
         + (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10   
         + (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5   
         + (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8   
         + (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4   
         + (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2   
         + parseInt(idcard_array[7]) * 1    
         + parseInt(idcard_array[8]) * 6   
         + parseInt(idcard_array[9]) * 3 ;   
         Y = S % 11;   
         M = "F";   
         JYM = "10X98765432";   
         M = JYM.substr(Y,1);/*判断校验位*/  
         if(M == idcard_array[17]){   
          return true; /*检测ID的校验位false;*/  
         }   
         else {   
          return false;   
         }   
        }   
        else {   
         return false;   
        }   
    break;   
       
    default:   
     return false;   
   }   
 }  


function checkIdcardaa(idcard1){   
   var idcard=idcard1;//document.forms[0].elements[idcard1].value;   
   var Errors=new Array(   
   "验证通过!",   
   "身份证号码位数不对!",   
   "身份证号码出生日期超出范围或含有非法字符!",   
   "身份证号码校验错误!",   
   "身份证地区非法!"  
   );   
   var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}    
      
   var idcard,Y,JYM;   
   var S,M;   
   var idcard_array = new Array();   
   idcard_array = idcard.split("");   
   /*地区检验*/  
   if(area[parseInt(idcard.substr(0,2))]==null)    
   {   
    alert(Errors[4]);  //身份证地区非法  
       
    return false;   
   }   
   /*身份号码位数及格式检验*/  
   switch(idcard.length){   
    case 15:   
        if ( (parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){   
         ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性   
        } else {   
         ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性   
        }   
        if(ereg.test(idcard)){   
          alert(Errors[0]+"15");//验证通过
          return true; //15位验证通过   
         }   
        else {   
          alert(Errors[2]); //身份证号码出生日期超出范围或含有非法字符  
           return false;   
          }   
        break;   
       
    case 18:   
        //18位身份号码检测   
        //出生日期的合法性检查    
        //闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))   
        //平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))   
        if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 ))
        {   
            ereg=/^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式   
        } 
        else 
        {   
            ereg=/^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式   
        } 
          
//        if(ereg.test(idcard))//测试出生日期的合法性
//        {   
             //计算校验位   
             S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7   
             + (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9   
             + (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10   
             + (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5   
             + (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8   
             + (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4   
             + (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2   
             + parseInt(idcard_array[7]) * 1    
             + parseInt(idcard_array[8]) * 6   
             + parseInt(idcard_array[9]) * 3 ;   
             Y = S % 11;   
             M = "F";   
             JYM = "10X98765432";   
             M = JYM.substr(Y,1);/*判断校验位*/  
             if(M == idcard_array[17])
             {   
                  alert(Errors[0]+"18");//  验证通过  
                  return true; /*检测ID的校验位false;*/  
             }   
             else 
             {   
                  alert(Errors[3]);    //身份证号码校验错误
                  return false;   
             }   
//        }   
//        else 
//        {   
//             alert(idcard_array[17]);//(Errors[2]);    //身份证号码出生日期超出范围或含有非法字符
//             return false;   
//        }   
    break;   
       
    default:   
     alert(Errors[1]);    //身份证号码位数不对
     return false;   
   }   
 }  


