
/**
 * 非空验证
 */
function RequiredValidationMethod() {

	this.errMsg = null;

	this.methodName = "required";

	this.validate = function(fieldObject) {
		if (fieldObject.value == "") {
			this.errMsg = fieldObject.title + notNull;
			return false;
		}
		return true;
	}

}

RequiredValidationMethod.prototype = new ValidationMethod();
ValidationFactory.prototype.addMethod(new RequiredValidationMethod());

/**
 * 为空或整数
 */
function IntegerValidationMethod() {

	this.errMsg = null;

	this.methodName = "integer";

	this.validate = function(fieldObject) {
		if (fieldObject.value != "") {
			var exp = new RegExp("^-?\\d+$");
			if (exp.test(fieldObject.value) == false) {
				this.errMsg = fieldObject.title
						+ numberFormat;
				return false;
			}
		}
		return true;
	}

}

IntegerValidationMethod.prototype = new ValidationMethod();
ValidationFactory.prototype.addMethod(new IntegerValidationMethod());

/**
 * 为空或Double params[0] 小数点位数
 */
function DoubleValidationMethod() {

	this.errMsg = null;

	this.methodName = "double";

	this.validate = function(fieldObject) {
		if (fieldObject.value != "" && this.params.length > 0) {
			var exp = new RegExp("^-?\\d+\.\\d{" + this.params[0] + "}$");
			if (exp.test(fieldObject.value) == false) {
				this.errMsg = fieldObject.title
						+ precisionLimit + this.params[0]
						+ decimalDigits;
				return false;
			}
		}
		return true;
	}
}

DoubleValidationMethod.prototype = new ValidationMethod();
ValidationFactory.prototype.addMethod(new DoubleValidationMethod());

/**
 * 普通英文字符,字母数字和下划线
 */
function SingleCharValidationMethod() {

	this.errMsg = null;

	this.methodName = "singlechar";

	this.validate = function(fieldObject) {
		if (fieldObject.value != "") {
			var exp = new RegExp("^[A-Za-z0-9_]*$");
			if (exp.test(fieldObject.value) == false) {
				this.errMsg = fieldObject.title
						+ charNumberUnderLine;
				return false;
			}
		}
		return true;
	}

}

SingleCharValidationMethod.prototype = new ValidationMethod();
ValidationFactory.prototype.addMethod(new SingleCharValidationMethod());

/**
 * 中文字符
 */
function ZhCharValidationMethod() {

	this.errMsg = null;

	this.methodName = "zh";

	this.validate = function(fieldObject) {
		if (fieldObject.value != "") {
			var exp = new RegExp("^[\u4E00-\u9FA5\uF900-\uFA2D]*$");
			if (exp.test(fieldObject.value) == false) {
				this.errMsg = fieldObject.title
						+ zhWords;
				return false;
			}
		}
		return true;
	}
}

ZhCharValidationMethod.prototype = new ValidationMethod();
ValidationFactory.prototype.addMethod(new ZhCharValidationMethod());

/**
 * 最大长度,param[0] 长度值
 */
function MaxLengthValidationMethod() {

	this.errMsg = null;

	this.methodName = "maxlength";

	this.validate = function(fieldObject) {
		if (fieldObject.value != "" && this.params.length > 0) {
			if (fieldObject.value.length > Number(this.params[0])) {
				this.errMsg = fieldObject.title + charLengthLimit
						+ this.params[0] + charLengthMax;
				return false;
			}
		}
		return true;
	}
}

MaxLengthValidationMethod.prototype = new ValidationMethod();
ValidationFactory.prototype.addMethod(new MaxLengthValidationMethod());

/**
 * 最小长度,param[0] 长度值
 */
function MinLengthValidationMethod() {

	this.errMsg = null;

	this.methodName = "minlength";

	this.validate = function(fieldObject) {
		if (fieldObject.value != "" && this.params.length > 0) {
			if (fieldObject.value.length < Number(this.params[0])) {
				this.errMsg = fieldObject.title + charLengthMinorLimit
						+ this.params[0] + charLengthMinor;
				return false;
			}
		}
		return true;
	}
}

MinLengthValidationMethod.prototype = new ValidationMethod();
ValidationFactory.prototype.addMethod(new MinLengthValidationMethod());

/**
 * EMail
 */
function EmailValidationMethod() {

	this.errMsg = null;

	this.methodName = "email";

	this.validate = function(fieldObject) {
		if (fieldObject.value != "") {
			if (!checkEmail(fieldObject.value)) {
				this.errMsg = fieldObject.title
						+ formatError;
				return false;
			}
		}
		return true;
	}
}

EmailValidationMethod.prototype = new ValidationMethod();
ValidationFactory.prototype.addMethod(new EmailValidationMethod());

// email格式验证
function checkEmail(emailStr) {
	if (emailStr.length == 0) {
		return true;
	}
	var emailPat = /^(.+)@(.+)$/;
	var specialChars = "\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
	var validChars = "\[^\\s" + specialChars + "\]";
	var quotedUser = "(\"[^\"]*\")";
	var ipDomainPat = /^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
	var atom = validChars + '+';
	var word = "(" + atom + "|" + quotedUser + ")";
	var userPat = new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat = new RegExp("^" + atom + "(\\." + atom + ")*$");
	var matchArray = emailStr.match(emailPat);
	if (matchArray == null) {
		return false;
	}
	var user = matchArray[1];
	var domain = matchArray[2];
	if (user.match(userPat) == null) {
		return false;
	}
	var IPArray = domain.match(ipDomainPat);
	if (IPArray != null) {
		for (var i = 1; i <= 4; i++) {
			if (IPArray[i] > 255) {
				return false;
			}
		}
		return true;
	}
	var domainArray = domain.match(domainPat);
	if (domainArray == null) {
		return false;
	}
	var atomPat = new RegExp(atom, "g");
	var domArr = domain.match(atomPat);
	var len = domArr.length;
	if ((domArr[domArr.length - 1].length < 2)
			|| (domArr[domArr.length - 1].length > 3)) {
		return false;
	}
	if (len < 2) {
		return false;
	}
	return true;
}

/**
 * 日期格式,param[0]
 * 三个占位符的任意排列顺序。连接字符任意
 * 如yyyy-mm-dd , dd/mm/yyyy....
 */
function DateValidationMethod() {

	this.errMsg = null;

	this.methodName = "date";

	this.validate = function(fieldObject) {
		if (fieldObject.value != "" && this.params.length > 0) {
			if (!checkDate(fieldObject.value, this.params[0])) {
				this.errMsg = fieldObject.title + dateMustBe
						+ this.params[0] + dateMustBeFormat;
				return false;
			}
		}
		return true;
	}
}

DateValidationMethod.prototype = new ValidationMethod();
ValidationFactory.prototype.addMethod(new DateValidationMethod());

// date check
function checkDate(value, datePattern) {
	var MONTH = "mm";
	var DAY = "dd";
	var YEAR = "yyyy";
	var orderMonth = datePattern.indexOf(MONTH);
	var orderDay = datePattern.indexOf(DAY);
	var orderYear = datePattern.indexOf(YEAR);
	var bValid = true;
	var dateRegexp = null;

	if ((orderDay < orderYear && orderDay > orderMonth)) {
		var iDelim1 = orderMonth + MONTH.length;
		var iDelim2 = orderDay + DAY.length;
		var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
		var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
		if (iDelim1 == orderDay && iDelim2 == orderYear) {
			dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
		} else if (iDelim1 == orderDay) {
			dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2
					+ "](\\d{4})$");
		} else if (iDelim2 == orderYear) {
			dateRegexp = new RegExp("^(\\d{2})[" + delim1
					+ "](\\d{2})(\\d{4})$");
		} else {
			dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})["
					+ delim2 + "](\\d{4})$");
		}

		var matched = dateRegexp.exec(value);
		if (matched != null) {
			if (!ValidateMethodFactory.__isValidDate(matched[2], matched[1],
					matched[3])) {
				bValid = false;
			}
		} else {
			bValid = false;
		}
	} else if ((orderMonth < orderYear && orderMonth > orderDay)) {
		var iDelim1 = orderDay + DAY.length;
		var iDelim2 = orderMonth + MONTH.length;
		var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
		var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
		if (iDelim1 == orderMonth && iDelim2 == orderYear) {
			dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
		} else if (iDelim1 == orderMonth) {
			dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2
					+ "](\\d{4})$");
		} else if (iDelim2 == orderYear) {
			dateRegexp = new RegExp("^(\\d{2})[" + delim1
					+ "](\\d{2})(\\d{4})$");
		} else {
			dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})["
					+ delim2 + "](\\d{4})$");
		}
		var matched = dateRegexp.exec(value);
		if (matched != null) {
			if (!isValidDate(matched[1], matched[2], matched[3])) {
				bValid = false;
			}
		} else {
			bValid = false;
		}
	} else if ((orderMonth > orderYear && orderMonth < orderDay)) {
		var iDelim1 = orderYear + YEAR.length;
		var iDelim2 = orderMonth + MONTH.length;
		var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);

		var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
		if (iDelim1 == orderMonth && iDelim2 == orderDay) {
			dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
		} else if (iDelim1 == orderMonth) {
			dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2
					+ "](\\d{2})$");
		} else if (iDelim2 == orderDay) {
			dateRegexp = new RegExp("^(\\d{4})[" + delim1
					+ "](\\d{2})(\\d{2})$");
		} else {
			dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})["
					+ delim2 + "](\\d{2})$");
		}
		var matched = dateRegexp.exec(value);
		if (matched != null) {
			if (!isValidDate(matched[3], matched[2], matched[1])) {
				bValid = false;
			}
		} else {
			bValid = false;
		}
	} else {
		bValid = false;
	}
	return bValid;
}

function isValidDate(day, month, year) {
	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 leap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day > 29 || (day == 29 && !leap))
			return false;
	}

	return true;
}

/**
 * 与某一个域的值相等, param[0]
 * 要与之比较的域 id 名
 */
function EqualsValidationMethod() {

	this.errMsg = null;

	this.methodName = "equals";

	this.validate = function(fieldObject) {
		if (fieldObject.value != "" && this.params.length > 0) {
			var target = $(this.params[0]);
			if (target.value != fieldObject.value) {
				this.errMsg = fieldObject.title + fieldEqualOtherField1
						+ target.title + fieldEqualOtherField2;
				return false;
			}
		}
		return true;
	}
}

EqualsValidationMethod.prototype = new ValidationMethod();
ValidationFactory.prototype.addMethod(new EqualsValidationMethod());

/**
 * 值范围 param[0]最小值, param[1]最大值
 */
function ValueRangeValidationMethod() {

	this.errMsg = null;

	this.methodName = "range";

	this.validate = function(fieldObject) {
		if (fieldObject.value != "" && this.params.length > 0) {
			var min = this.params[0];
			var max = this.params[1];
			var value = fieldObject.value;

			if (min != "null" && max != "null") {
				if (Number(value) > Number(max) || Number(value) < Number(min)) {
					this.errMsg = fieldObject.title
							+ valueRange1 + min
							+ valueRange2 + max + valueRange3;
					return false;
				}
			}

			if (min != "null" && max == "null") {
				if (Number(value) < Number(min)) {
					this.errMsg = fieldObject.title
							+ valueRange4+ min
							+ valueRange5;
					return false;
				}
			}

			if (min == "null" && max != "null") {
				if (Number(value) > Number(max)) {
					this.errMsg = fieldObject.title
							+ valueRange6 + max
							+ valueRange5;
					return false;
				}
			}
		}
		return true;
	}
}

ValueRangeValidationMethod.prototype = new ValidationMethod();
ValidationFactory.prototype.addMethod(new ValueRangeValidationMethod());

/**
 * 自定义正则表达式 params[0]
 * 正则表达式，注意不能带有 ; , :
 * 三个关键符号, params[1]
 * 自定义的提示信息
 */
function MaskValidationMethod() {

	this.errMsg = null;

	this.methodName = "mask";

	this.validate = function(fieldObject) {
		if (fieldObject.value != "" && this.params.length > 0) {
			var exp = new RegExp(this.params[0]);
			if (exp.test(fieldObject.value) == false) {
				this.errMsg = fieldObject.title + this.params[1];
				return false;
			}
		}
		return true;
	}
}

MaskValidationMethod.prototype = new ValidationMethod();
ValidationFactory.prototype.addMethod(new MaskValidationMethod());

/**
 * 用户自定义函数 params[0]
 * 用户自定义的函数表达式
 */
function CustomFuncMethod() {

	this.errMsg = null;

	this.methodName = "func";

	this.validate = function(fieldObject) {
		if (fieldObject.value != "" && this.params.length > 0) {
			return eval(this.params[0] + "()");
		}
		return true;
	}
}

CustomFuncMethod.prototype = new ValidationMethod();
ValidationFactory.prototype.addMethod(new CustomFuncMethod());