$.define(["jQuery", "util"], "validate", function($, util) {
	var returnTrue = function() {
			return true;
		},
		returnFalse = function() {
			return false;
		},
		vDef = function(ps, name) {
			return function(obj) {
				return "invalid validate[" + name + "] option";
			}
		},
		vRequired = function(msg) {
			return function(obj) {
				var v = obj.get();
				if((undefined === v) || ("" === v) || ($.isArray(v) && v.length === 0)) {
					return msg || "必输字段";
				}
			};
		},
		vMax = function(ps) {
			var tn = $.type(ps),
				msg = "不能大于";
			if(tn === "object") {
				msg = ps.msg || (msg + ps.val);
				ps = ps.val;
				tn = $.type(ps);
			} else {
				msg = msg + ps;
			}
			if(tn === "number") {
				return function(obj) {
					var val = obj.get();
					if(val) {
						if($.iaArray(val)) {
							if(val.length > ps) {
								return msg;
							}
						} else {
							if(val > ps) {
								return msg;
							}
						}
					} else if(0 === val) {
						if(0 > ps) {
							return msg;
						}
					}
					return true;
				};
			} else if(tn === "string") {
				var val = obj.get();
				if(val) {
					if(val > ps) {
						return msg;
					}
				}
			}

		},
		vMin = function(ps) {
			var tn = $.type(ps),
				msg = "不能小于";
			if(tn === "object") {
				msg = ps.msg || (msg + ps.val);
				ps = ps.val;
				tn = $.type(ps);
			} else {
				msg = msg + ps;
			}
			if(tn === "number") {
				return function(obj) {
					var val = obj.get();
					if(val) {
						if($.iaArray(val)) {
							if(val.length < ps) {
								return msg;
							}
						} else {
							if(val < ps) {
								return msg;
							}
						}
					} else if(0 === val) {
						if(0 > ps) {
							return msg;
						}
					}
					return true;
				};
			} else if(tn === "string") {
				var val = obj.get();
				if(val) {
					if(val < ps) {
						return msg;
					}
				}
			}
		},
		vLen = function(ps) {
			var msg = "长度不等于";
			if($.type(ps) === "object") {
				msg = ps.msg || (msg + ps.val);
				ps = ps.val;
			} else {
				msg = msg + ps;
			}
			return function(obj) {
				var val = obj.get();
				if(val || (val === "")) {
					if(val.length !== ps) {
						return msg;
					}
				}
			};
		},
		vMinLen = function(ps) {
			var msg = "长度小于";
			if($.type(ps) === "object") {
				msg = ps.msg || (msg + ps.val);
				ps = ps.val;
			} else {
				msg = msg + ps;
			}
			return function(obj) {
				var val = obj.get();
				if(val || (val === "")) {
					if(val.length < ps) {
						return msg;
					}
				}
			};
		},
		vMaxLen = function(ps) {
			var msg = "长度大于";
			if($.type(ps) === "object") {
				msg = ps.msg || (msg + ps.val);
				ps = ps.val;
			} else {
				msg = msg + ps;
			}
			return function(obj) {
				var val = obj.get();
				if(val || (val === "")) {
					if(val.length > ps) {
						return msg;
					}
				}
			};
		},
		impls = {
			"_def": vDef,
			"required": vRequired,
			"max": vMax,
			"min": vMin,
			"len": vLen,
			"minLen": vMinLen,
			"maxLen": vMaxLen
		},
		reg = function(name, hand) {
			impls[name] = hand;
		},
		parseRules = function(obj) {
			var ret = [];
			for(key in obj) {
				var impl = impls[key] || impls["_def"];
				ret.push(impl(obj[key], key));
			}
			return ret;
		},
		configForm = function(form, options) {
			for(var key in options) {
				var item = form.item(key),
					option = options[key];
				if(item && option) {
					item.addRules(parseRules(option));
				}
			}
		};

	return {
		register: reg,
		form: configForm,
	};

});