

gc = window.gc || {};
j$ = jQuery;
gc.verify = {
	addVerify : function() {
		var args = arguments;
		window.setTimeout(function() {
			for(var i=0; i<args.length; i++) {
				var t = j$("#"+args[i]);
				t.one("checkout", gc.verify.checkOut);
				t.blur(function() {
					j$(this).trigger("checkout", [this]);
				}).change(function() {
					j$(this).trigger("checkout", [this]);
				});
			}
		}, 500, args);
	},
	addForm : function() {
		var args = arguments;
		window.setTimeout(function() {
			for(var i=0; i<args.length; i++) {
				j$("#" + args[i]).submit(function() {
					var form = this;
					window.at = j$(":text,textarea,:password,select, input[type='hidden'], :file", form).each(function() {
						j$(this).trigger("checkout", [this]);
					});
					var checkoutnum = j$("div[id$='errormsg']", form).length;
					if(checkoutnum > 0) {
						return false;
					} else {
						return true;
					}
				});
			}
		}, 1000, args);
	},

	checkForm : function(formid) {
		var form = document.getElementById(formid);
		var at = j$(":text,textarea,:password,select, input[type='hidden'], :file", form).each(function() {
			j$(this).trigger("checkout", [this]);
		});
		var checkoutnum = 0;
		checkoutnum = j$("div[id$='errormsg']", form).length;
		if(checkoutnum > 0) {
			return false;
		} else {
			return true;
		}
	},
	
	initVerify : function() {
		var t = j$("");
		//统一校验
		if(window.require) {
			t = j$(":text,textarea,:password,select, input[type='hidden'], :file");
			t = j$(":text,textarea,:password,select, input[type='hidden']");
			t.one("checkout", gc.verify.checkOut);
			t.blur(function() {
				j$(this).trigger("checkout", [this]);
			}).change(function() {
				j$(this).trigger("checkout", [this]);
			});
			j$(":file").one("checkout", gc.verify.checkOut).change(function() {
				j$(this).trigger("checkout", [this]);
			});
		}
		if(window.verify) {
			var ids = [];
			j$.each(verify, function(i) {
				ids.push("#"+i);
			});
			t = j$(ids.join(", "));
			t.one("checkout", gc.verify.checkOut);
			t.blur(function() {
				var type = (this.type).toLowerCase();
				if(type != "file") {
					j$(this).trigger("checkout", [this]);
				}
			}).change(function() {
				j$(this).trigger("checkout", [this]);
			});
		}

		if(window.formid) {
			j$("#" + formid).submit(function() {
				//var form = document.getElementById(formid);
				window.at = j$(":text,textarea,:password,select, input[type='hidden'], :file", this);
				window.at.each(function() {
					j$(this).trigger("checkout", [this]);
					
				});
				var checkoutnum = 0;
				checkoutnum = j$("div[id$='errormsg']", this).length;
				if(checkoutnum > 0) {
					return false;
				} else {
					window.clearTimeout(window[this.id+"timer"]);
					return true;
				}
			});
		}
	},

	/**
	 * 校验函数
	 */
	checkOut : function(e, elem) {
		var CHECKOUT = [];
		/**
		CHECKOUT.push(function() {
			j$(elem).attr("checkout", "start").dequeue("checkout");
		})
		**/
		if(window.require) {
			CHECKOUT.push(gc.verify.validataLib[require.rolename]);
		}
		if(window.verify) {
			var elem_verify = verify[elem.id];
			if(elem_verify) {
				j$.each(elem_verify, function(i) {
					CHECKOUT.push(gc.verify.validataLib[i]);
				});
			}
		}
		CHECKOUT.push(function() {
			//j$(elem).attr("checkout", "end");
			window.setTimeout(function() {
				j$(elem).one("checkout", gc.verify.checkOut);
			}, 100, elem);
		})
		j$(elem).queue("checkout", CHECKOUT).dequeue("checkout");
	},

	/**
	 * 错误处理函数
	 */
	dispose : function(elem, result, type) {
		if(result) {
			j$("#"+elem.id+"errormsg").remove();
			j$(elem).dequeue("checkout");
		} else {
			gc.verify.showMsg(elem, type);
			window.setTimeout(function() {
				j$(elem).one("checkout", gc.verify.checkOut);
			}, 100, elem);
		}
	},
	
	/**
	 * 显示错误信息
	 */
	showMsg : function(elem, type) {
		var errMsg = "";
		var elemid = "";
		errMsg = gc.verify.findVerifyInfo(elem, type).errMsg;
		if(elem.id) {
			elemid = elem.id;
		} else {
			elemid = Math.round(Math.random()*100000000);
			j$(elem).attr("id", elemid);
		}
		var errorElement = j$("#"+elemid+"errormsg");
		if(errorElement.length == 0) {
			var msg_html = '<div class="errorElement" id="'+elemid+'errormsg"><div class="errorText"></div></div>';
			errorElement = j$(msg_html);
		}
		errorElement.find(".errorText").html(errMsg);
		var msgbox = j$(elem).attr("msgbox");
		if(msgbox) {
			//if(msgbox.not(":empty")) {
				var mb = j$("#"+msgbox);
				//if(mb.children().length == 0) {
					mb.empty().append(errorElement)
				//}
			//}
		} else if(j$(elem).not(":input").length < 1) {
			j$(elem).parent().append(errorElement);
		} else {
			j$(elem).after(errorElement);
		}
	},

	/**
	 * 找到和元素相对应的规则配置,如果没有,将会返回null
	 */
	findVerifyInfo : function(elem, rolename) {
		var role = null;
		if(window.require) {
			if(require.rolename == rolename) {
				role = require;
			}
		}
		if(window.verify && verify[elem.id] && verify[elem.id][rolename]) {
			role = verify[elem.id][rolename];
		}
		return role;
	},
	
	validataLib : {
		isNeed : function() {
			var result = true;
			var self = j$(this);
			var value = j$.trim(this.value);
			self.data("error", true);
			if("" == value) {
				result = false;
				self.data("error", false);
			}
			var role = gc.verify.findVerifyInfo(this, "isNeed");
			if(role.params) {
				if(value == role.params) {
					result = false;
					self.data("error", false);
				}
			}
			gc.verify.dispose(this, result, "isNeed");
		},
		dateIsNeed : function() {
			var result = true;
			var self = j$(this);
			
			var value = j$.trim(this.value);
			self.data("error", true);
			if(! /^(\d{4,4})-(\d{2,2})-(\d{2,2})$/.test(value)) {
				result = false;
				self.data("error", false);
			}
			gc.verify.dispose(this, result, "dateIsNeed");
			window.setTimeout(function() {
				if(! self.data("error")) {
					self.trigger("checkout", [self[0]]);
				}
			}, 200, self);
		},
		isNum : function() {
			var result = true;
			var value = j$.trim(this.value);
			
			//result = new RegExp("^\\d*$").test(value);
			result = /^\d+.\d+$/.test(value) || /^\d*$/.test(value);
			if("" == value) {result = true;}
			gc.verify.dispose(this, result, "isNum");
		},
		isInt : function() {
			var result = true;
			var value = j$.trim(this.value);
			result = /^\d*$/.test(value);
			if("" == value) {result = true;}
			gc.verify.dispose(this, result, "isInt");
		},
		minLength : function() {
			var result = true;
			var value = j$.trim(this.value);
			var role = gc.verify.findVerifyInfo(this, "minLength");
			if(value.length < role.params) {
				result = false;
			}
			if("" == value) {result = true;}
			gc.verify.dispose(this, result, "minLength");
		},
		maxLength  :  function() {
			var result = true;
			var value = j$.trim(this.value);
			var role = gc.verify.findVerifyInfo(this, "maxLength");
			if(value.length > role.params) {
				result = false;
			}
			if("" == value) {result = true;}
			gc.verify.dispose(this, result, "maxLength");
		},
		regexp  :  function() {
			var result = true;
			var value = j$.trim(this.value);
			var role = gc.verify.findVerifyInfo(this, "regexp");
			result = role.params.test(value);
			if("" == value) {result = true;}
			gc.verify.dispose(this, result, "regexp");
		},
		isEmail : function() {
			var result = true;
			var value = j$.trim(this.value);
			result = new RegExp("\\w+(?:[-+.]\\w+)*@\\w+(?:[-.]\\w+)*\\.\\w+(?:[-.]\\w+)*").test(value);
			if("" == value) {result = true;}
			gc.verify.dispose(this, result, "isEmail");
		},
		isUrl : function() {
			var result = true;
			var value = j$.trim(this.value);
			var reD = /^(http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@\[\]\':+!]*([^\"\"])*)*$/;
			var reE = /^([0-9a-z-]+\.)+[0-9a-z-]+$/;
			if(!reD.test(value) && !reE.test(value)) {
				result = false;
			}
			if("" == value) {result = true;}
			gc.verify.dispose(this, result, "isUrl");
		},
		maxNum : function() {
			var result = true;
			var value = j$.trim(this.value);
			var role = gc.verify.findVerifyInfo(this, "maxNum");
			if(Number(value) > role.params) {
				result = false;
			}
			if("" == value) {result = true;}
			gc.verify.dispose(this, result, "maxNum");
		},
		minNum : function() {
			var result = true;
			var value = j$.trim(this.value);
			var role = gc.verify.findVerifyInfo(this, "minNum");
			if(Number(value) < role.params) {
				result = false;
			}
			if("" == value) {result = true;}
			gc.verify.dispose(this, result, "minNum");
		},
		checkBoxIsNeed : function() {
			var result = true;
			var role = gc.verify.findVerifyInfo(this, "checkBoxIsNeed");
			var num = j$("#"+role.params+ " :checkbox:checked").length;
			if(num < 1) {
				result = false;
			}
			gc.verify.dispose(this, result, "checkBoxIsNeed");
		},
		otherIsNeed : function() {
			var result = true;
			var value = j$.trim(this.value);
			var role = gc.verify.findVerifyInfo(this, "otherIsNeed");
			var params = role.params;
			var msgs = role.errMsg;
			var vr = {};
			var t = {};
			j$.each(params, function(i, j) {
				vr = window.verify[j] || {};
				vr.isNeed = {
					"errMsg" : msgs[i]
				}
				window.verify[j] = vr;
				t = j$("#"+j);
				if(value == "") {
					delete window.verify[j].isNeed;
				}
				
				t.blur();
			})
			
			gc.verify.dispose(this, result, "otherIsNeed");
		},
		minDate : function() {
			var self = this;
			var result = true;
			var role = gc.verify.findVerifyInfo(this, "minDate");
			var regexp = /^(\d{4,4})-(\d{2,2})-(\d{2,2})$/;
			var earlydate = role.params.match(regexp);
			var date = this.value.match(regexp);
			var earlyDate = new Date(new Number(earlydate[1]), new Number(earlydate[2]) -1, new Number(earlydate[3]));
			var currentDate = new Date(new Number(date[1]),new Number(date[2]) -1,new Number(date[3]));
			if(earlyDate > currentDate) {
				result = false;
			}
			if("" == value) {result = true;}
			gc.verify.dispose(this, result, "minDate");
			window.setTimeout(function() {
				j$(self).change();
			}, 300, self);
		},
		maxDate : function() {
			var self = this;
			var result = true;
			var role = gc.verify.findVerifyInfo(this, "maxDate");
			var regexp = /^(\d{4,4})-(\d{2,2})-(\d{2,2})$/;
			var laterdate = role.params.match(regexp);
			var date = this.value.match(regexp);
			var laterDate = new Date(new Number(laterdate[1]), new Number(laterdate[2]) -1, new Number(laterdate[3]));
			var currentDate = new Date(new Number(date[1]),new Number(date[2]) -1,new Number(date[3]));
			if(laterDate < currentDate) {
				result = false;
			}
			if("" == value) {result = true;}
			gc.verify.dispose(this, result, "maxDate");
			window.setTimeout(function() {
				j$(self).change();
			}, 300, self);
		},
		fileType : function() {
			var result = true;
			var value = j$.trim(this.value);
			var filetype = value.toLowerCase().split(".");
			filetype = filetype[filetype.length-1];
			var role = gc.verify.findVerifyInfo(this, "fileType");
			var index = j$.inArray(filetype, role.params);
			if(index == -1) {
				result = false;
			}
			if("" == value) {result = true;}
			gc.verify.dispose(this, result, "fileType");
		},
		isUnique : function() {
			var self = this;
			var value = j$.trim(this.value);
			if("" == value) {
				var result = true;
				gc.verify.dispose(this, result, "isUnique");
			}
			var role = gc.verify.findVerifyInfo(this, "isUnique");
			j$.get((role.params+encodeURIComponent(value)),  function(data) {
				var result = true;
				if(j$.trim(data) == "false") {
					result = false;
				}
				gc.verify.dispose(self, result, "isUnique");
			}, "text")
		},
		isEnglish : function() {
			var result = true;
			var value = j$.trim(this.value);
			result = /^[\x00-\xFF]*$/.test(value);
			if("" == value) {result = true;}
			gc.verify.dispose(this, result, "isEnglish");
		},
		isGt : function() {
			var result = true;
			var value = j$.trim(this.value);
			value = value.split(',').join('') - 0;
			var role = gc.verify.findVerifyInfo(this, "isGt");
			var pvalue = j$.trim(j$("#"+role.params).val()).split(',').join('');
			//if(pvalue == (""||0) || value == (""||0)) {
			if(pvalue == "" || value == "") {
			} else if(value < pvalue) {
				result = false;
			}
			gc.verify.dispose(this, result, "isGt");
			if(result) {
				j$("#"+role.params).change();
			}
		},
		hasChar : function() {
			var result = true;
			var value = j$.trim(this.value);
			if(value == "") {
				gc.verify.dispose(this, result, "hasChar");
			}
			value = value.split("");
			var role = gc.verify.findVerifyInfo(this, "hasChar");
			j$.each(role.params, function(i, j) {
				if(j$.inArray(j, value) == -1) {
					result = false;
					return false;
				}
			})
			gc.verify.dispose(this, result, "hasChar");
		},
		isLt : function() {
			var result = true;
			var value = j$.trim(this.value);
			value = value.split(',').join('') - 0;
			var role = gc.verify.findVerifyInfo(this, "isLt");
			var pvalue = j$.trim(j$("#"+role.params).val()).split(',').join('');
			//if(pvalue == (""||0) || value == (""||0)) {
			if(pvalue == "" || value == "") {
			} else if(value > pvalue) {
				result = false;
			}
			gc.verify.dispose(this, result, "isLt");
			if(result) {
				j$("#"+role.params).change();
			}
		},
		isPrice : function() {
			var result = true;
			var value = j$.trim(this.value);
			if(!(/^\d{1,3}(,\d{3})+(\.\d{1,2})?$/.test(value) || /^\d+(\.\d{0,2})?$/.test(value))) {
				result = false;
			}
			if("" == value) {result = true;}
			gc.verify.dispose(this, result, "isPrice");
		}
	},
	checkBoxIsNeed : function(formid, checkboxname) {
		var num = j$("#"+formid+" :checkbox[name='"+checkboxname+"']:checked").length;
		if(num < 1) {
			return false;
		} else {
			return true;
		}
	}
}

jQuery(function() {
	gc.verify.initVerify();
})



