
/**
 * 非空验证
 */
function RequiredValidationMethod() {
	
	this.errMsg = null;
	
	this.methodName = "required";

	this.validate = function(fieldObject) {
		if (fieldObject.value == "") {
			this.errMsg = fieldObject.title + "不能为空！";
			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 + "必须为整数格式！";
				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 + "必须精确到 " + this.params[0] + " 位小数！";
				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 + "必须为英文字符,数字或者下划线！";
				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 + "必须为中文字符！";
				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 + "不能超过 " + this.params[0] + " 个字符！";
				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 + "不能少于 " + this.params[0] + " 个字符！";
				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 + "格式错误！";
				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 + "必须为 " + this.params[0] + " 格式！";
				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 = document.getElementById(this.params[0]);
			if (target.value != fieldObject.value) {
				this.errMsg = fieldObject.title + "必须和" + target.title + "相等！";
				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 + "的值必须在 " + min + " 和 " + max + " 之间！";
					return false;
				}
			}

			if (min != "null" && max == "null") {
				if (Number(value) < Number(min)) {
					this.errMsg = fieldObject.title + "的值不能小于 " + min + "！";
					return false;
				}
			}

			if (min == "null" && max != "null") {
				if (Number(value) > Number(max)) {
					this.errMsg = fieldObject.title + "的值不能大于" + max + "！";
					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());