/*! jquery validation plugin - v1.11.0 - 2/4/2013 * https://github.com/jzaefferer/jquery-validation * copyright (c) 2013 jörn zaefferer; licensed mit */ (function(e) { e.extend(e.fn, { validate: function(t) { if(!this.length) { t && t.debug && window.console && console.warn("nothing selected, can't validate, returning nothing."); return } var n = e.data(this[0], "validator"); return n ? n : (this.attr("novalidate", "novalidate"), n = new e.validator(t, this[0]), e.data(this[0], "validator", n), n.settings.onsubmit && (this.validatedelegate(":submit", "click", function(t) { n.settings.submithandler && (n.submitbutton = t.target), e(t.target).hasclass("cancel") && (n.cancelsubmit = !0) }), this.submit(function(t) { function r() { var r; return n.settings.submithandler ? (n.submitbutton && (r = e("").attr("name", n.submitbutton.name).val(n.submitbutton.value).appendto(n.currentform)), n.settings.submithandler.call(n, n.currentform, t), n.submitbutton && r.remove(), !1) : !0 } return n.settings.debug && t.preventdefault(), n.cancelsubmit ? (n.cancelsubmit = !1, r()) : n.form() ? n.pendingrequest ? (n.formsubmitted = !0, !1) : r() : (n.focusinvalid(), !1) })), n) }, valid: function() { if(e(this[0]).is("form")) return this.validate().form(); var t = !0, n = e(this[0].form).validate(); return this.each(function() { t &= n.element(this) }), t }, removeattrs: function(t) { var n = {}, r = this; return e.each(t.split(/\s/), function(e, t) { n[t] = r.attr(t), r.removeattr(t) }), n }, rules: function(t, n) { var r = this[0]; if(t) { var i = e.data(r.form, "validator").settings, s = i.rules, o = e.validator.staticrules(r); switch(t) { case "add": e.extend(o, e.validator.normalizerule(n)), s[r.name] = o, n.messages && (i.messages[r.name] = e.extend(i.messages[r.name], n.messages)); break; case "remove": if(!n) return delete s[r.name], o; var u = {}; return e.each(n.split(/\s/), function(e, t) { u[t] = o[t], delete o[t] }), u } } var a = e.validator.normalizerules(e.extend({}, e.validator.classrules(r), e.validator.attributerules(r), e.validator.datarules(r), e.validator.staticrules(r)), r); if(a.required) { var f = a.required; delete a.required, a = e.extend({ required: f }, a) } return a } }), e.extend(e.expr[":"], { blank: function(t) { return !e.trim("" + t.value) }, filled: function(t) { return !!e.trim("" + t.value) }, unchecked: function(e) { return !e.checked } }), e.validator = function(t, n) { this.settings = e.extend(!0, {}, e.validator.defaults, t), this.currentform = n, this.init() }, e.validator.format = function(t, n) { return arguments.length === 1 ? function() { var n = e.makearray(arguments); return n.unshift(t), e.validator.format.apply(this, n) } : (arguments.length > 2 && n.constructor !== array && (n = e.makearray(arguments).slice(1)), n.constructor !== array && (n = [n]), e.each(n, function(e, n) { t = t.replace(new regexp("\\{" + e + "\\}", "g"), function() { return n }) }), t) }, e.extend(e.validator, { defaults: { messages: {}, groups: {}, rules: {}, errorclass: "error", validclass: "valid", errorelement: "label", focusinvalid: !0, errorcontainer: e([]), errorlabelcontainer: e([]), onsubmit: !0, ignore: ":hidden", ignoretitle: !1, onfocusin: function(e, t) { this.lastactive = e, this.settings.focuscleanup && !this.blockfocuscleanup && (this.settings.unhighlight && this.settings.unhighlight.call(this, e, this.settings.errorclass, this.settings.validclass), this.addwrapper(this.errorsfor(e)).hide()) }, onfocusout: function(e, t) { !this.checkable(e) && (e.name in this.submitted || !this.optional(e)) && this.element(e) }, onkeyup: function(e, t) { if(t.which === 9 && this.elementvalue(e) === "") return; (e.name in this.submitted || e === this.lastelement) && this.element(e) }, onclick: function(e, t) { e.name in this.submitted ? this.element(e) : e.parentnode.name in this.submitted && this.element(e.parentnode) }, highlight: function(t, n, r) { t.type === "radio" ? this.findbyname(t.name).addclass(n).removeclass(r) : e(t).addclass(n).removeclass(r) }, unhighlight: function(t, n, r) { t.type === "radio" ? this.findbyname(t.name).removeclass(n).addclass(r) : e(t).removeclass(n).addclass(r) } }, setdefaults: function(t) { e.extend(e.validator.defaults, t) }, messages: { required: "该项为必填项", remote: "please fix this field.", email: "please enter a valid email address.", url: "请输入正确的网址,如:http://www.chinastar.com", date: "please enter a valid date.", dateiso: "please enter a valid date (iso).", number: "please enter a valid number.", digits: "please enter only digits.", creditcard: "please enter a valid credit card number.", equalto: "please enter the same value again.", maxlength: e.validator.format("输入不超过 {0} 个字"), minlength: e.validator.format("输入不少于 {0} 个字"), rangelength: e.validator.format("please enter a value between {0} and {1} characters long."), range: e.validator.format("please enter a value between {0} and {1}."), max: e.validator.format("please enter a value less than or equal to {0}."), min: e.validator.format("please enter a value greater than or equal to {0}.") }, autocreateranges: !1, prototype: { init: function() { function r(t) { var n = e.data(this[0].form, "validator"), r = "on" + t.type.replace(/^validate/, ""); n.settings[r] && n.settings[r].call(n, this[0], t) } this.labelcontainer = e(this.settings.errorlabelcontainer), this.errorcontext = this.labelcontainer.length && this.labelcontainer || e(this.currentform), this.containers = e(this.settings.errorcontainer).add(this.settings.errorlabelcontainer), this.submitted = {}, this.valuecache = {}, this.pendingrequest = 0, this.pending = {}, this.invalid = {}, this.reset(); var t = this.groups = {}; e.each(this.settings.groups, function(n, r) { typeof r == "string" && (r = r.split(/\s/)), e.each(r, function(e, r) { t[r] = n }) }); var n = this.settings.rules; e.each(n, function(t, r) { n[t] = e.validator.normalizerule(r) }), e(this.currentform).validatedelegate(":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'] ,[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'] ", "focusin focusout keyup", r).validatedelegate("[type='radio'], [type='checkbox'], select, option", "click", r), this.settings.invalidhandler && e(this.currentform).bind("invalid-form.validate", this.settings.invalidhandler) }, form: function() { return this.checkform(), e.extend(this.submitted, this.errormap), this.invalid = e.extend({}, this.errormap), this.valid() || e(this.currentform).triggerhandler("invalid-form", [this]), this.showerrors(), this.valid() }, checkform: function() { this.prepareform(); for(var e = 0, t = this.currentelements = this.elements(); t[e]; e++) this.check(t[e]); return this.valid() }, element: function(t) { t = this.validationtargetfor(this.clean(t)), this.lastelement = t, this.prepareelement(t), this.currentelements = e(t); var n = this.check(t) !== !1; return n ? delete this.invalid[t.name] : this.invalid[t.name] = !0, this.numberofinvalids() || (this.tohide = this.tohide.add(this.containers)), this.showerrors(), n }, showerrors: function(t) { if(t) { e.extend(this.errormap, t), this.errorlist = []; for(var n in t) this.errorlist.push({ message: t[n], element: this.findbyname(n)[0] }); this.successlist = e.grep(this.successlist, function(e) { return !(e.name in t) }) } this.settings.showerrors ? this.settings.showerrors.call(this, this.errormap, this.errorlist) : this.defaultshowerrors() }, resetform: function() { e.fn.resetform && e(this.currentform).resetform(), this.submitted = {}, this.lastelement = null, this.prepareform(), this.hideerrors(), this.elements().removeclass(this.settings.errorclass).removedata("previousvalue") }, numberofinvalids: function() { return this.objectlength(this.invalid) }, objectlength: function(e) { var t = 0; for(var n in e) t++; return t }, hideerrors: function() { this.addwrapper(this.tohide).hide() }, valid: function() { return this.size() === 0 }, size: function() { return this.errorlist.length }, focusinvalid: function() { if(this.settings.focusinvalid) try { e(this.findlastactive() || this.errorlist.length && this.errorlist[0].element || []).filter(":visible").focus().trigger("focusin") } catch(t) {} }, findlastactive: function() { var t = this.lastactive; return t && e.grep(this.errorlist, function(e) { return e.element.name === t.name }).length === 1 && t }, elements: function() { var t = this, n = {}; return e(this.currentform).find("input, select, textarea").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function() { return !this.name && t.settings.debug && window.console && console.error("%o has no name assigned", this), this.name in n || !t.objectlength(e(this).rules()) ? !1 : (n[this.name] = !0, !0) }) }, clean: function(t) { return e(t)[0] }, errors: function() { var t = this.settings.errorclass.replace(" ", "."); return e(this.settings.errorelement + "." + t, this.errorcontext) }, reset: function() { this.successlist = [], this.errorlist = [], this.errormap = {}, this.toshow = e([]), this.tohide = e([]), this.currentelements = e([]) }, prepareform: function() { this.reset(), this.tohide = this.errors().add(this.containers) }, prepareelement: function(e) { this.reset(), this.tohide = this.errorsfor(e) }, elementvalue: function(t) { var n = e(t).attr("type"), r = e(t).val(); return n === "radio" || n === "checkbox" ? e("input[name='" + e(t).attr("name") + "']:checked").val() : typeof r == "string" ? r.replace(/\r/g, "") : r }, check: function(t) { t = this.validationtargetfor(this.clean(t)); var n = e(t).rules(), r = !1, i = this.elementvalue(t), s; for(var o in n) { var u = { method: o, parameters: n[o] }; try { s = e.validator.methods[o].call(this, i, t, u.parameters); if(s === "dependency-mismatch") { r = !0; continue } r = !1; if(s === "pending") { this.tohide = this.tohide.not(this.errorsfor(t)); return } if(!s) return this.formatandadd(t, u), !1 } catch(a) { throw this.settings.debug && window.console && console.log("exception occured when checking element " + t.id + ", check the '" + u.method + "' method.", a), a } } if(r) return; return this.objectlength(n) && this.successlist.push(t), !0 }, customdatamessage: function(t, n) { return e(t).data("msg-" + n.tolowercase()) || t.attributes && e(t).attr("data-msg-" + n.tolowercase()) }, custommessage: function(e, t) { var n = this.settings.messages[e]; return n && (n.constructor === string ? n : n[t]) }, finddefined: function() { for(var e = 0; e < arguments.length; e++) if(arguments[e] !== undefined) return arguments[e]; return undefined }, defaultmessage: function(t, n) { return this.finddefined(this.custommessage(t.name, n), this.customdatamessage(t, n), !this.settings.ignoretitle && t.title || undefined, e.validator.messages[n], "warning: no message defined for " + t.name + "") }, formatandadd: function(t, n) { var r = this.defaultmessage(t, n.method), i = /\$?\{(\d+)\}/g; typeof r == "function" ? r = r.call(this, n.parameters, t) : i.test(r) && (r = e.validator.format(r.replace(i, "{$1}"), n.parameters)), this.errorlist.push({ message: r, element: t }), this.errormap[t.name] = r, this.submitted[t.name] = r }, addwrapper: function(e) { return this.settings.wrapper && (e = e.add(e.parent(this.settings.wrapper))), e }, defaultshowerrors: function() { var e, t; for(e = 0; this.errorlist[e]; e++) { var n = this.errorlist[e]; this.settings.highlight && this.settings.highlight.call(this, n.element, this.settings.errorclass, this.settings.validclass), this.showlabel(n.element, n.message) } this.errorlist.length && (this.toshow = this.toshow.add(this.containers)); if(this.settings.success) for(e = 0; this.successlist[e]; e++) this.showlabel(this.successlist[e]); if(this.settings.unhighlight) for(e = 0, t = this.validelements(); t[e]; e++) this.settings.unhighlight.call(this, t[e], this.settings.errorclass, this.settings.validclass); this.tohide = this.tohide.not(this.toshow), this.hideerrors(), this.addwrapper(this.toshow).show() }, validelements: function() { return this.currentelements.not(this.invalidelements()) }, invalidelements: function() { return e(this.errorlist).map(function() { return this.element }) }, showlabel: function(t, n) { var r = this.errorsfor(t); r.length ? (r.removeclass(this.settings.validclass).addclass(this.settings.errorclass), r.html(n)) : (r = e("<" + this.settings.errorelement + ">").attr("for", this.idorname(t)).addclass(this.settings.errorclass).html(n || ""), this.settings.wrapper && (r = r.hide().show().wrap("<" + this.settings.wrapper + "/>").parent()), this.labelcontainer.append(r).length || (this.settings.errorplacement ? this.settings.errorplacement(r, e(t)) : r.insertafter(t))), !n && this.settings.success && (r.text(""), typeof this.settings.success == "string" ? r.addclass(this.settings.success) : this.settings.success(r, t)), this.toshow = this.toshow.add(r) }, errorsfor: function(t) { var n = this.idorname(t); return this.errors().filter(function() { return e(this).attr("for") === n }) }, idorname: function(e) { return this.groups[e.name] || (this.checkable(e) ? e.name : e.id || e.name) }, validationtargetfor: function(e) { return this.checkable(e) && (e = this.findbyname(e.name).not(this.settings.ignore)[0]), e }, checkable: function(e) { return /radio|checkbox/i.test(e.type) }, findbyname: function(t) { return e(this.currentform).find("[name='" + t + "']") }, getlength: function(t, n) { switch(n.nodename.tolowercase()) { case "select": return e("option:selected", n).length; case "input": if(this.checkable(n)) return this.findbyname(n.name).filter(":checked").length } return t.length }, depend: function(e, t) { return this.dependtypes[typeof e] ? this.dependtypes[typeof e](e, t) : !0 }, dependtypes: { "boolean": function(e, t) { return e }, string: function(t, n) { return !!e(t, n.form).length }, "function": function(e, t) { return e(t) } }, optional: function(t) { var n = this.elementvalue(t); return !e.validator.methods.required.call(this, n, t) && "dependency-mismatch" }, startrequest: function(e) { this.pending[e.name] || (this.pendingrequest++, this.pending[e.name] = !0) }, stoprequest: function(t, n) { this.pendingrequest--, this.pendingrequest < 0 && (this.pendingrequest = 0), delete this.pending[t.name], n && this.pendingrequest === 0 && this.formsubmitted && this.form() ? (e(this.currentform).submit(), this.formsubmitted = !1) : !n && this.pendingrequest === 0 && this.formsubmitted && (e(this.currentform).triggerhandler("invalid-form", [this]), this.formsubmitted = !1) }, previousvalue: function(t) { return e.data(t, "previousvalue") || e.data(t, "previousvalue", { old: null, valid: !0, message: this.defaultmessage(t, "remote") }) } }, classrulesettings: { required: { required: !0 }, email: { email: !0 }, url: { url: !0 }, date: { date: !0 }, dateiso: { dateiso: !0 }, number: { number: !0 }, digits: { digits: !0 }, creditcard: { creditcard: !0 } }, addclassrules: function(t, n) { t.constructor === string ? this.classrulesettings[t] = n : e.extend(this.classrulesettings, t) }, classrules: function(t) { var n = {}, r = e(t).attr("class"); return r && e.each(r.split(" "), function() { this in e.validator.classrulesettings && e.extend(n, e.validator.classrulesettings[this]) }), n }, attributerules: function(t) { var n = {}, r = e(t); for(var i in e.validator.methods) { var s; i === "required" ? (s = r.get(0).getattribute(i), s === "" && (s = !0), s = !!s) : s = r.attr(i), s ? n[i] = s : r[0].getattribute("type") === i && (n[i] = !0) } return n.maxlength && /-1|2147483647|524288/.test(n.maxlength) && delete n.maxlength, n }, datarules: function(t) { var n, r, i = {}, s = e(t); for(n in e.validator.methods) r = s.data("rule-" + n.tolowercase()), r !== undefined && (i[n] = r); return i }, staticrules: function(t) { var n = {}, r = e.data(t.form, "validator"); return r.settings.rules && (n = e.validator.normalizerule(r.settings.rules[t.name]) || {}), n }, normalizerules: function(t, n) { return e.each(t, function(r, i) { if(i === !1) { delete t[r]; return } if(i.param || i.depends) { var s = !0; switch(typeof i.depends) { case "string": s = !!e(i.depends, n.form).length; break; case "function": s = i.depends.call(n, n) } s ? t[r] = i.param !== undefined ? i.param : !0 : delete t[r] } }), e.each(t, function(r, i) { t[r] = e.isfunction(i) ? i(n) : i }), e.each(["minlength", "maxlength"], function() { t[this] && (t[this] = number(t[this])) }), e.each(["rangelength"], function() { var n; t[this] && (e.isarray(t[this]) ? t[this] = [number(t[this][0]), number(t[this][1])] : typeof t[this] == "string" && (n = t[this].split(/[\s,]+/), t[this] = [number(n[0]), number(n[1])])) }), e.validator.autocreateranges && (t.min && t.max && (t.range = [t.min, t.max], delete t.min, delete t.max), t.minlength && t.maxlength && (t.rangelength = [t.minlength, t.maxlength], delete t.minlength, delete t.maxlength)), t }, normalizerule: function(t) { if(typeof t == "string") { var n = {}; e.each(t.split(/\s/), function() { n[this] = !0 }), t = n } return t }, addmethod: function(t, n, r) { e.validator.methods[t] = n, e.validator.messages[t] = r !== undefined ? r : e.validator.messages[t], n.length < 3 && e.validator.addclassrules(t, e.validator.normalizerule(t)) }, methods: { required: function(t, n, r) { if(!this.depend(r, n)) return "dependency-mismatch"; if(n.nodename.tolowercase() === "select") { var i = e(n).val(); return i && i.length > 0 } return this.checkable(n) ? this.getlength(t, n) > 0 : e.trim(t).length > 0 }, remote: function(t, n, r) { if(this.optional(n)) return "dependency-mismatch"; var i = this.previousvalue(n); this.settings.messages[n.name] || (this.settings.messages[n.name] = {}), i.originalmessage = this.settings.messages[n.name].remote, this.settings.messages[n.name].remote = i.message, r = typeof r == "string" && { url: r } || r; if(i.old === t) return i.valid; i.old = t; var s = this; this.startrequest(n); var o = {}; return o[n.name] = t, e.ajax(e.extend(!0, { url: r, mode: "abort", port: "validate" + n.name, datatype: "json", data: o, success: function(r) { s.settings.messages[n.name].remote = i.originalmessage; var o = r === !0 || r === "true"; if(o) { var u = s.formsubmitted; s.prepareelement(n), s.formsubmitted = u, s.successlist.push(n), delete s.invalid[n.name], s.showerrors() } else { var a = {}, f = r || s.defaultmessage(n, "remote"); a[n.name] = i.message = e.isfunction(f) ? f(t) : f, s.invalid[n.name] = !0, s.showerrors(a) } i.valid = o, s.stoprequest(n, o) } }, r)), "pending" }, minlength: function(t, n, r) { var i = e.isarray(t) ? t.length : this.getlength(e.trim(t), n); return this.optional(n) || i >= r }, maxlength: function(t, n, r) { var i = e.isarray(t) ? t.length : this.getlength(e.trim(t), n); return this.optional(n) || i <= r }, rangelength: function(t, n, r) { var i = e.isarray(t) ? t.length : this.getlength(e.trim(t), n); return this.optional(n) || i >= r[0] && i <= r[1] }, min: function(e, t, n) { return this.optional(t) || e >= n }, max: function(e, t, n) { return this.optional(t) || e <= n }, range: function(e, t, n) { return this.optional(t) || e >= n[0] && e <= n[1] }, email: function(e, t) { return this.optional(t) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(([a-z]|\d|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])*([a-z]|\d|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])))\.)+(([a-z]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(([a-z]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])*([a-z]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])))$/i.test(e) }, url: function(e, t) { return this.optional(t) || /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(([a-z]|\d|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])*([a-z]|\d|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])))\.)+(([a-z]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(([a-z]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])*([a-z]|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\ue000-\uf8ff]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(e) }, date: function(e, t) { return this.optional(t) || !/invalid|nan/.test((new date(e)).tostring()) }, dateiso: function(e, t) { return this.optional(t) || /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(e) }, number: function(e, t) { return this.optional(t) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(e) }, digits: function(e, t) { return this.optional(t) || /^\d+$/.test(e) }, creditcard: function(e, t) { if(this.optional(t)) return "dependency-mismatch"; if(/[^0-9 \-]+/.test(e)) return !1; var n = 0, r = 0, i = !1; e = e.replace(/\d/g, ""); for(var s = e.length - 1; s >= 0; s--) { var o = e.charat(s); r = parseint(o, 10), i && (r *= 2) > 9 && (r -= 9), n += r, i = !i } return n % 10 === 0 }, equalto: function(t, n, r) { var i = e(r); return this.settings.onfocusout && i.unbind(".validate-equalto").bind("blur.validate-equalto", function() { e(n).valid() }), t === i.val() } } }), e.format = e.validator.format })(jquery), function(e) { var t = {}; if(e.ajaxprefilter) e.ajaxprefilter(function(e, n, r) { var i = e.port; e.mode === "abort" && (t[i] && t[i].abort(), t[i] = r) }); else { var n = e.ajax; e.ajax = function(r) { var i = ("mode" in r ? r : e.ajaxsettings).mode, s = ("port" in r ? r : e.ajaxsettings).port; return i === "abort" ? (t[s] && t[s].abort(), t[s] = n.apply(this, arguments)) : n.apply(this, arguments) } } }(jquery), function(e) { e.extend(e.fn, { validatedelegate: function(t, n, r) { return this.bind(n, function(n) { var i = e(n.target); if(i.is(t)) return r.apply(i, arguments) }) } }) }(jquery);