﻿/**
 * @file jquery.form.validator.js
 *
 * FORM VALIDATOR v1.2.3
 *
 * 1.0		by iLwave [06.26, 2009] $.formValidator.doValidate(oForm);
 * 1.1		by iLwave [07.02, 2009] $(oForm).formValidate();
 * 1.2		by iLWave [07.14, 2009] $(oForm).formValidate().doOther1.doOther2()... ;
 * 1.2.1	by iLwave [07.15, 2009] rule<ipgroup> added;
 * 1.2.2	by iLwave [08.05, 2009] rule<extname> added;
 * 1.2.3	by iLwave [11.10, 2009] ignore hidden elements;
 *
 * example:
 *
 * <form id="theform" action="#">
 *
 * 		<input name="myname" type="text" validator="{require:1, title:'姓名'}" />
 *
 * 		<input name="options" type="radio" value="1" /> 职业1
 *		<input name="options" type="radio" value="2" /> 职业2
 *		<input name="options" type="radio" value="3" /> 职业3
 *		<input name="options" type="radio" value="4" validator="{require:1, title:'职业'}" /> 职业4
 *
 * 		<input name="favourites" type="checkbox" value="a" /> 爱好1
 * 		<input name="favourites" type="checkbox" value="b" /> 爱好2
 * 		<input name="favourites" type="checkbox" value="c" /> 爱好3
 * 		<input name="favourites" type="checkbox" value="d" validator="{min:1, max:3, title:'爱好', message:'爱好至少一项至多三项'}" /> 爱好4
 *
 *		<select name="location" validator="{require:1}">
 *			<option value="">请选择</option>
 *			<option value="1">北京</option>
 *			<option value="2">上海</option>
 *			<option value="3">深圳</option>
 *			<option value="4">广州</option>
 *			<option value="5">杭州</option>
 *		</select>
 *
 *		<select name="location" multiple="multiple" validator="{min:1, max:3}">
 *			<option value="1">北京</option>
 *			<option value="2">上海</option>
 *			<option value="3">深圳</option>
 *			<option value="4">广州</option>
 *			<option value="5">杭州</option>
 *		</select>
 *
 * </form>
 *
 * $("#theform").formValidate();
 * $("#theform").formValidate({callback:function(aResult){alert(aResult.join("\n"));}});
 *
 * var boolResult = $.formValidate.getResult();
 *
 * 全部通过则返回 1，否则返回 0 ; 当 jQuery 传入的对象为 null 时返回 -1；
 *
 *
 *
 * callback是自定义的结果处理回调函数，有一个数组类型的参数 arrResult，数据格式如下：
 *
 * arrResult = [
 * 		[0, oElement, sMessage], // 0 表示验证通过，oElement是相应的表单输入对象，如input、select或textarea，sMessage是提示信息，通过时恒为 "OK"
 * 		[1, oElement, sMessage], // 1 表示验证未通过，sMessage是错误提示信息，如 "姓名不可为空" 等，"姓名"关键词在 title 中定义，如 validator="{reuqire:1, title:'姓名'}" ；
 * 		[1, oElement, sMessage], // 如果需要指定自定义的错误提示信息，则加入 message 属性，如 validator="{reuqire:1, message:'此项必须填写'}"
 * 		[0, oElement, sMessage]  // input radio, input checkbox 同一关联组验证时指定相同的name，validator加到最后一个元素上即可
 * ]
 *
 */

/*
 * 变量命名规则如下：
 *
 * _ 开头的表示私有成员(private)
 * o 对象(object)
 * f 函数(function)
 * a 数组(array)
 * s 字符串(string)
 * n 数字(number)
 * r 正则表达式(regexp)
 * m 混合(mixed)
 *
 */
/* 
	1 无表Lang对象时新建对象
	2 

 */
if (!Lang || !Lang.formValidate) {
	
	var Lang = Lang || {};
	
	Lang.formValidate = {

		//本地化语言提示信息
		required: "不能为空",
		invalidfmt: "格式不正确",
		invalidtype: "类型不符",
		engonly: "只能为英文",
		chnonly: "只能为中文",
		overmax: "超过最大值",
		blowmin: "低于最小值",
		strlength: "字串长度不符合要求",
		confirm: "确认不一致",
		thisitem: "该项",
		invalidExtName: "扩展名不符合要求",
		ipformaterr: "IP格式不符合要求",
		iperror: "格式不正确或为保留IP"
	
	};
	
}

(function(jQuery){

	jQuery.extend({ formValidate: {

		// private:

		_aCache: [], // 运行中的数据缓存，用于 jQuery.x 和 jQuery.fn.x 之间的数据交换

		_sValidAttr: "allow", // HTML标签中能够被本控件识别的属性

		_sValidRslt: "v_rslt", // 用于储存验证结果的属性，future.
		
		_sValodIgnore: "vignore", // 暂时忽略验证的标记

		_oRules: { // 规则对象池
			
			/* 例:<input type="text" allow="{require:'1'}"/> 
				
				下面每个属性解释为
				规则名 : [ 校验规则, 校验规则返回false提示信息 ]
			
			*/
			"require":	[(/.+/), Lang.formValidate.required],

			"ip":		[(/^(([01]?[\d]{1,2})|(2[0-4][\d])|(25[0-5]))(\.(([01]?[\d]{1,2})|(2[0-4][\d])|(25[0-5]))){3}$/), Lang.formValidate.invalidfmt],

			"email":	[(/^(\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)?$/), Lang.formValidate.invalidfmt],

			"url":		[(/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/), Lang.formValidate.invalidfmt],

			"idcard":	[(/^\d{15}(\d{2}[A-Za-z0-9])?$/), Lang.formValidate.invalidfmt],

			"int":		[(/^[-\+]?\d+$/), Lang.formValidate.invalidtype],

			"float":	[(/^[-\+]?\d+(\.\d+)?$/), Lang.formValidate.invalidtype],

			"english":	[(/^[A-Za-z]+$/), Lang.formValidate.engonly],

			"chinese":	[(/^[\u0391-\uFFE5]+$/), Lang.formValidate.chnonly],

			"max":		[function(nMax){return this.val() <= nMax;}, Lang.formValidate.overmax],

			"min":		[function(nMin){return this.val() >= nMin;}, Lang.formValidate.blowmin],
			
			"length":	[function(nMin, nMax){return this.val().length >= nMin && this.val().length <= nMax;}, Lang.formValidate.strlength],
			
			"confirm":	[function(sId){return this.val() == jQuery("#"+sId).val();}, Lang.formValidate.confirm]

		},

		_isFunction: function(fn) {
		
			return  !!fn && !fn.nodeName && fn.constructor != String && fn.constructor != RegExp && fn.constructor != Array && /function/i.test( fn + "" );
		},
		
		/* 常规基于字符串验证的方法,例如input框 textarea等 */
		_procNormal: function(oRules, oCheckElement) {

			var $this = jQuery.formValidate; // 此时的 this 指针是 $(oElement) 而不是 jQuery.formValidator
			var sValue = oCheckElement ? oCheckElement.value + "" : this.val(); // 对象的值属性

			for (var eachRule in oRules) {

				var sCurrRule = (eachRule == "rule") ? oRules[eachRule] : eachRule;
				var aArgument = (eachRule == "rule") ? [] : typeof(oRules[eachRule]) == "object" ? oRules[eachRule] : [oRules[eachRule]];

				if (typeof($this._oRules[sCurrRule]) != "undefined") {

					var oCurrRule = $this._oRules[sCurrRule];
					var bValidResult = false;
					var sElementTitle = oRules.title || "该项";
					var sElementMessage = oRules.message || false;

					if (!$this._isFunction(oCurrRule[0])) {

						bValidResult = oCurrRule[0].test(sValue.replace(/[ 　]/g, "")); // 过滤半角和全角的空格，验证通过则为true
					
					} else {

						bValidResult = oCurrRule[0].apply((oCheckElement ? oCheckElement : this), aArgument); // 验证通过则为 true，否则为错误提示或-1
					
					}

					if (bValidResult != true) {

						return sElementMessage ? [1, this, sElementMessage] : [1, this, sElementTitle + oCurrRule[1]];

					}

				} else {

					// 没有找到或者是保留规则关键字

				}

			}

			return [0, this, "OK"];

		},
		
		/* input各种类型标签调用相应的验证规则 */
		_procInput: {

			"text": function(oRules) {

				return jQuery.formValidate._procNormal.apply(this, [oRules]);

			},

			"file": function(oRules) {

				return jQuery.formValidate._procNormal.apply(this, [oRules]);

			},

			"password": function(oRules) {

				return jQuery.formValidate._procNormal.apply(this, [oRules]);

			},

			"radio": function(oRules) {

				var aValue = jQuery.formValidate._aCache[this.attr("_cache")];
				var nChecked = 0;
				var oVirtualObject = {value:0, val:function(){return this.value;}};

				for (var i=0; i<aValue.length; i++) {

					aValue[i][0] && oVirtualObject.value++;

				}

				return jQuery.formValidate._procNormal.apply(this, [oRules, oVirtualObject]);

			},

			"checkbox": function(oRules) {

				return jQuery.formValidate._procInput["radio"].apply(this, [oRules]);

			}

		},
		
		/* select各种类型标签调用相应的验证规则 */
		_procSelect: {

			"normal": function(oRules) {

				return jQuery.formValidate._procNormal.apply(this, [oRules]);

			},

			"multiple": function(oRules) {

				var oVirtualObject = {value:0, val:function(){return this.value;}};

				oVirtualObject.value = this.val() != null ? this.val().length : 0;

				return jQuery.formValidate._procNormal.apply(this, [oRules, oVirtualObject]);

			}

		},
		
		/* textarea标签调用相应的验证规则 */
		_procTextarea: {

			"normal": function(oRules) {

				return jQuery.formValidate._procNormal.apply(this, [oRules]);

			}

		},
		
		/* 验证每个有allow属性的表单项 */
		_validateEach: function(oElement, sType) {

			var sExpression = jQuery(oElement).attr(this._sValidAttr);
				sExpression = sExpression.substr(0, 1) == "{" ? "(" + sExpression + ")" : "({" + sExpression + "})";

			var oRuleObject = null;

			try {

				oRuleObject = eval(sExpression);

			} catch(e) {

				alert("验证项：\n\n" + jQuery(oElement).attr(this._sValidAttr) + "\n\n存在语法错误");

			};

			switch (oElement.tagName) {

				case "INPUT": 		return this._procInput[sType].apply(jQuery(oElement), [oRuleObject]);
				case "SELECT":		return this._procSelect[sType].apply(jQuery(oElement), [oRuleObject]);
				case "TEXTAREA":	return this._procTextarea[sType].apply(jQuery(oElement), [oRuleObject]);

			}

		},

		// public:
		doConfig: function(sAttr, sRslt) {

			this._sValidAttr = sAttr;
			this._sValidRslt = sRslt;

		},
		
		//提供添加新规则的接口
		addRule: function(sRuleTitle, mRuleBody, sText) {

			this._oRules[sRuleTitle] = [mRuleBody, sText];

		},
		
		//提供调用已有规则的接口
		getRule: function(sRuleTitle) {
			
			return this._oRules[sRuleTitle];
			
		},
		
		//每次表单验证后重置cache
		resetResult: function() {
			
			this._aCache['__result'] = true;
			
		},
		
		//得到表单验证结果
		getResult: function() {
			
			return typeof(this._aCache['__result']) == "undefined" ? -1 : this._aCache['__result'];

		},
		
		checkString: function(sText, sRule, aArguments) {
			
			var aArguments = aArguments || [];
			var oCurrRule = this._oRules[sRule];
			var oTempElement = {_value:sText, val:function(){return this._value;}};
			
			return typeof(oCurrRule[0]) == "object" ? oCurrRule[0].test(sText, "") : oCurrRule[0].apply(oTempElement, aArguments);
			
		},

		Do: function(oForm,  fCallBack) {

			var oForm = oForm;
			var sFormId = oForm.attr("id") || oForm.attr("name") || "noid";
			var aValidResults = [];
			var aElements = jQuery(("input[#],select[#],textarea[#]").replace(/#/g, this._sValidAttr), oForm);
			var nLength = aElements.length;

			for (var i=0; i<nLength; i++) { // 预处理，input radio/checkbox 单个name对应多个element的情况

				if ((aElements[i].tagName == "INPUT") && (aElements[i].type == "radio" || aElements[i].type == "checkbox")) {

					var sName = aElements[i].name;
					var aValueMap = [];
					var aSimilarElements = jQuery(("input[name='#']").replace("#", sName), oForm);

					for (var n=0; n<aSimilarElements.length; n++) {

						aValueMap.push([aSimilarElements[n].checked, aSimilarElements[n].value]);

					}

					var sCacheName = sFormId + sName;

					this._aCache[sCacheName] = aValueMap;

					jQuery(aElements[i]).attr("_cache", sCacheName);
				}
			}

			for (i=0; i<nLength; i++) {

				var sType = "";

				switch (aElements[i].tagName) {

					case "INPUT": sType = aElements[i].type || "text"; break;
					case "SELECT": sType = aElements[i].multiple ? "multiple" : "normal"; break;
					case "TEXTAREA": sType = "normal"; break;

				}

				if (aElements[i][this._sValodIgnore] != 1) {
				
					if(aElements[i].offsetWidth > 0) aValidResults.push(this._validateEach(aElements[i], sType));
					
				} else {
					
					// nothing to do.
					
				}

			}

			var bResult = fCallBack(aValidResults);

			this._aCache['__result'] &= bResult;
			
			return bResult;

		}

	}});

	jQuery.fn.extend({ formValidate: function(oOption) {

		if(!this.html()) return this;
		
		var oOption = oOption || {};

		var defaultCallBack = function(aResult) {

			for(var eachResult in aResult) {

				if(aResult[eachResult][0] == 0) {

					// nothing to do.

				} else {

					alert(aResult[eachResult][2]);

					aResult[eachResult][1].focus();

					return false;

				}

			}

			return true;

		};

		var oDefaultOption = {

			callback: defaultCallBack

		};

		var _oOption = jQuery.extend(oDefaultOption, oOption);

		jQuery.formValidate.resetResult();

		for (var i=0; i<this.length; i++) {

			if(!jQuery.formValidate.Do(jQuery(this[i]), _oOption.callback)) break;
			
		}
	
		return this;

	}});

})(jQuery);

/*
 * 以下是专业项中可能会用到的规则，单独添加，可根据项目的不同自由修改。
 *
 *
 */

var ruleIpGroup = function() { // 验证IP地址段
	
	var ruleIp = jQuery.formValidate.getRule("ip");
	var aIpData = this.val().split("/");

	if (typeof(aIpData[1]) != "undefined") {
		
		if (aIpData[1].replace(/[0-9]/g, "") != "" || aIpData[1] > 32 || aIpData[1] < 1) return false;

	}

	if (!(/^(([01]?[\d]{1,2})|(2[0-4][\d])|(25[0-5]))(\.(([01]?[\d]{1,2})|(2[0-4][\d])|(25[0-5]))){3}$/).test(aIpData[0])) return false;
	
	return true;
	
};

var ruleIp = function(nType) { // 规则重载，ip采用函数验证，支持参数 0:IP为空时放行, 1:Ip必填
	
	var _nType = nType || 0;
	
	var sIpPrefix = this.val().indexOf("10.") && this.val().indexOf("172."); //this.val().indexOf("192.168.") && 
	if(sIpPrefix == 0) {
		//alert("不能为保留IP地址！请填写正确IP")
		return false;
	}
	if (_nType == 0) { //允许空IP
		if (this.val() == "") return true;
	}

	return (/^(([01]?[\d]{1,2})|(2[0-4][\d])|(25[0-5]))(\.(([01]?[\d]{1,2})|(2[0-4][\d])|(25[0-5]))){3}$/).test(this.val());
	
};
// C段IP验证
var ruleCompareIp = function(sid){
	
	var startIp = $('#' + sid),
		sip = startIp.val(),
		eip = this.val();
		
	if(sip && eip){
		return compareSize(sip,eip) && isIpAtSame(sip,eip,3);
	}
	return true;
};

// 添加B段IP验证
var ruleCompareIpB = function(sid){
	
	var startIp = $('#' + sid),
		sip = startIp.val(),
		eip = this.val();
		
	if(sip && eip){
		return compareSize(sip,eip) && isIpAtSame(sip,eip,2);
	}
	return true;
};

/* 起始IP大于结束IP返回false */
var compareSize = function(sip,eip){
	var sipArr = sip.split('.'),
		eipArr = eip.split('.'),
		flag = true;
		
	for (var i=0; i<4; i++){
		if ( parseInt(sipArr[i]) > parseInt(eipArr[i]) ){
			flag = false;
			break;
		}
	}
	return flag;
};
/* END 起始IP大于结束IP返回false */

/* 判断起始IP和结束IP在同一C段 */
var isIpAtSame = function(sip,eip,l){
		
	var flag = true,
		sipArr = sip.split("."),
		eipArr = eip.split(".");
		//alert(l);
	for (var i = 0; i < l; i++){
		if (sipArr[i] != eipArr[i]){
			flag = false;
			break;
		}
	}
	return flag;
};
/* END 判断起始IP和结束IP在同一C段 */

var ruleExtName = function(sName) { // 指定扩展名
	
	var sValue = this.val();
	
	return (sValue.substr((sValue.length - sName.length), sName.length) == sName);
};

var ruleIdcard = function(v){
	var sId = this.val();
	//if (v == 1) {alert(sId);};
	
	var aCity={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 iSum=0;
	var info="";
	
	if(!/^\d{17}(\d|x)$/i.test(sId))return false;
	//alert("长度合法");
	
	sId=sId.replace(/x$/i,"a");
	if(aCity[parseInt(sId.substr(0,2))]==null){
		return "Error:非法地区";
	}
	//alert("地区合法");
	
	sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2));
	var d=new Date(sBirthday.replace(/-/g,"/"))
	if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate())){
		return "Error:非法生日";
	}
	//alert("生日合法");
	
	for(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11)
	if(iSum%11!=1){
		return "Error:非法证号";
	}
	//alert("证号合法");
	return true;
};

var ruleMilitaryId = function() { // 验证军官证
	var ruleId = this.val();
	
	if (!(/^[\u0391-\uFFE5]+$/).test(ruleId.substr(0,3))) return false; //前三位必须为中文
	if (!(/^\d{8}$/).test(ruleId.substr(3,8))) return false;
	return true;
};

var ruleTel = function(nType) { // 验证电话号码
	var nID = this.val();
	var nRules;
	
	/* 国家代码为必须 可匹配 +86/086
	 * tel:0 仅电话 //匹配 086-0571-88888888-9999|+86-0571-88888888|0571-88888888|88888888-88 
	 * tel:1 仅手机 //匹配 13* 14* 15* 18*开头手机号 0*
	 * tel:2 电话与手机 全匹配
	 */
	if (nType === 1) {
		nRules = (/^(1[3|4|5|8][0-9]\d{8})?$/);
		/*nRules = (/^([\+|0]?(\d{2})-)(1[3|4|5|8][0-9]\d{8})?$/) ; //验证086+11位*/
	}else if(nType === 2){
		//nRules = (/(^(([\+|0]?(\d{2})-)((\d{4}|\d{3})-)(\d{7,8}))(-(\d{1,4}))?$)|(^([\+|0]?(\d{2})-)(1[3|4|5|8][0-9]\d{8})$)/);
		nRules = (/(^(([\+|0]?(\d{2})(-)?)?((\d{4}|\d{3})(-)?)(\d{7,8}))(-(\d{1,4}))?$)|(^(([\+|0]?(\d{2})(-)?)?(1[3|4|5|8][0-9]\d{8}))?$)/);
	}else{
		//nRules = (/^(([\+|0]?(\d{2})-)((\d{4}|\d{3})-)(\d{7,8}))(-(\d{1,4}))?$/); 
		nRules = (/^((([\+|0]?(\d{2})(-)?)?((\d{4}|\d{3})(-)?)(\d{7,8}))(-(\d{1,4}))?)?$/); 
	}
	if (!nRules.test(nID)) return false;
	return true;
};


/**********************************************************/

/* 例: allow='{rulePicType :"all"}'     全部匹配              */
/* 例: allow='{rulePicType :".jpg"}'    匹配指定格式          */
var allowTypeTemp = "";
var rulePicType = function(allowType) { // 图片格式

	var picName = this.val();
	var nRules;
	if (allowType == "all") {
		nRules = (/\.jpg$|\.jpeg$|\=y$/); //全部匹配.jpg,.jpeg格式
		allowTypeTemp =  ".jpg,.jpeg";
	}else{
		nRules = (/\allowType$/);//单一匹配allowType指定的格式(例:".jpg")
	}

	if (!nRules.test(picName)){return false};
	return true;
};

var ruleUserName = function() { // 验证用户名 只能输入4-20个字母、数字、下划线
	var ruleId = this.val();
	if (!(/^[a-zA-Z0-9_]{4,20}$/).test(ruleId)) return false;
	return true;
};

var ruleDateType = function(nType) { // 验证日期格式 yyyy-MM-dd 支持参数 0:时间为空时放行, 1:必填
	
	var _nType = nType || 0;
	if (_nType == 0) { //允许空
		if (this.val() == "") return true;
	}
	
	var reg=/^((((19|20)\d{2})-(0?[13-9]|1[012])-(0?[1-9]|[12]\d|30))|(((19|20)\d{2})-(0?[13578]|1[02])-31)|(((19|20)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))-0?2-29))$/;
    var strDate = this.val();
    if(!reg.test(strDate)){
        return false;
    }
    return true;
};

var password = function(nType,nStrength) { // 密码是否满足设定强度
	/*	调用 <input type="password" value='' allow="{password:[nType,nStrength], title:'密码'}"/>
	
		四种类型指 数字,小写字母,大写字母,字符
		nStrength == 1 密码含1种类型
		nStrength == 2 密码含2种类型
		nStrength == 3 密码含3种类型
		nStrength == 4 密码含4种类型
	*/

	var _nType = nType || 0;
	if (_nType == 0) { //允许空
		if (this.val() == "") return true;
	}
	
	var _nStrength = nStrength || 0;
	var _result = 1;
	var _password = this.val();

	_result = _password.replace(/^(?:([a-z])|([A-Z])|([0-9])|(.)){5,}|(.)+$/g, "$1$2$3$4$5").length;
    return _result >= _nStrength;
};

var ruleMobilephone = function() {	// 验证手机号码
	var mobileNum = this.val();
	var nRules = /^(([\+|0]?(\d{2})(-)?)?1[3|4|5|8][0-9]\d{8})?$/;

	return nRules.test(mobileNum);
	/*if (nType === 1) {
		nRules = (/^(1[3|4|5|8][0-9]\d{8})?$/);
	}else if(nType === 2){
		nRules = (/(^(([\+|0]?(\d{2})-)((\d{4}|\d{3})-)(\d{7,8}))(-(\d{1,4}))?$)|(^([\+|0]?(\d{2})-)(1[3|4|5|8][0-9]\d{8})$)/);
	}else{
		nRules = (/^(([\+|0]?(\d{2})-)((\d{4}|\d{3})-)(\d{7,8}))(-(\d{1,4}))?$/); 
	}
	if (!nRules.test(nID)) return false;
	return true;*/
}

var ruleTelephone = function() {	// 验证座机号码
	var telNum = this.val();
	var nRules = /^(([\+|0]?(\d{2})(-)?)?((\d{4}|\d{3})(-)?)(\d{7,8})(-(\d{1,4}))?)?$/;
	
	return nRules.test(telNum);
}

var ruleDomain = function() {	// 验证域名
	var validateStr = this.val();
	var ruleReg = /^((www|[0-9a-z-]+)\.)([0-9a-z-]+\.)*\w+$/;
	
	return ruleReg.test(validateStr);
}

jQuery.formValidate.addRule("password", password, ': 密码强度不够,请重新输入!');
jQuery.formValidate.addRule("date", ruleDateType, ': 日期格式不正确,请重新输入！\n\n正确格式为:2010-01-01');

jQuery.formValidate.addRule("picType", rulePicType, ': 只支持'+allowTypeTemp+'图片格式');
jQuery.formValidate.addRule("username", ruleUserName, "只能输入4-20个 字母、数字、下划线");
jQuery.formValidate.addRule("idcard", ruleIdcard, ': 请输入合法身份证号');
jQuery.formValidate.addRule("militaryId", ruleMilitaryId, ': 请输入合法军官证号\n\n例：空字第06054588');
jQuery.formValidate.addRule("compareIp", ruleCompareIp, '需大于等于起始IP\n\n并且两IP必需在同一个C段!');
jQuery.formValidate.addRule("compareIpB", ruleCompareIpB, '需大于等于起始IP\n\n并且两IP必需在同一个B段!');
//jQuery.formValidate.addRule("tel", ruleTel, ': \n请输入正确号码！ 例：\n 电话： 086-0571-88888888 \n 手机： 086-13688888888');
jQuery.formValidate.addRule("tel", ruleTel, Lang.formValidate.invalidfmt);

jQuery.formValidate.addRule("ipgroup", ruleIpGroup, Lang.formValidate.invalidfmt);
jQuery.formValidate.addRule("ip", ruleIp, "格式不正确或为保留IP地址");
jQuery.formValidate.addRule("extname", ruleExtName, Lang.formValidate.invalidExtName);

// Rules below are added by Ourai.
jQuery.formValidate.addRule("mobile", ruleMobilephone, Lang.formValidate.invalidfmt);
jQuery.formValidate.addRule("phone", ruleTelephone, Lang.formValidate.invalidfmt);
jQuery.formValidate.addRule("domain", ruleDomain, Lang.formValidate.invalidfmt);
