(function(c) {
	c.extend(c.fn, {validate:function(a) {
		if(this.length) {
			var b = c.data(this[0], "validator");
			if(b)return b;
			b = new c.validator(a, this[0]);
			c.data(this[0], "validator", b);
			if(b.settings.onsubmit) {
				this.find("input, button").filter(".cancel").click(function() {
					b.cancelSubmit = true
				});
				this.submit(function(d) {
					function e() {
						if(b.settings.submitHandler) {
							b.settings.submitHandler.call(b, b.currentForm);
							return false
						}return true
					}
					b.settings.debug && d.preventDefault();
					if(b.cancelSubmit) {
						b.cancelSubmit = false;
						return e()
					}if(b.form()) {
						if(b.pendingRequest) {
							b.formSubmitted = true;
							return false
						}return e()
					}else {
						b.focusInvalid();
						return false
					}
				})
			}return b
		}else a && a.debug && window.console && console.warn("nothing selected, can't validate, returning nothing")
	}, valid:function() {
		if(c(this[0]).is("form"))return this.validate().form();
		else {
			var a = false, b = c(this[0].form).validate();
			this.each(function() {
				a |= b.element(this)
			});
			return a
		}
	}, removeAttrs:function(a) {
		var b = {}, d = this;
		c.each(a.split(/\s/), function(e, f) {
			b[f] = d.attr(f);
			d.removeAttr(f)
		});
		return b
	}, rules:function(a, b) {
		var d = this[0];
		if(a) {
			var e = c.data(d.form, "validator").settings, f = e.rules, g = c.validator.staticRules(d);
			switch(a) {
				case "add":
					c.extend(g, c.validator.normalizeRule(b));
					f[d.name] = g;
					if(b.messages)e.messages[d.name] = c.extend(e.messages[d.name], b.messages);
					break;
				case "remove":
					if(!b) {
						delete f[d.name];
						return g
					}var h = {};
					c.each(b.split(/\s/), function(i, j) {
						h[j] = g[j];
						delete g[j]
					});
					return h
			}
		}a = c.validator.normalizeRules(c.extend({}, c.validator.metadataRules(d), c.validator.classRules(d), c.validator.attributeRules(d), c.validator.staticRules(d)), d);
		if(a.required) {
			b = a.required;
			delete a.required;
			a = c.extend({required:b}, a)
		}return a
	}});
	c.extend(c.expr[":"], {blank:function(a) {
		return!c.trim(a.value)
	}, filled:function(a) {
		return!!c.trim(a.value)
	}, unchecked:function(a) {
		return!a.checked
	}});
	c.format = function(a, b) {
		if(arguments.length == 1)return function() {
			var d = c.makeArray(arguments);
			d.unshift(a);
			return c.format.apply(this, d)
		};
		if(arguments.length > 2 && b.constructor != Array)b = c.makeArray(arguments).slice(1);
		if(b.constructor != Array)b = [b];
		c.each(b, function(d, e) {
			a = a.replace(new RegExp("\\{" + d + "\\}", "g"), e)
		});
		return a
	};
	c.validator = function(a, b) {
		this.settings = c.extend({}, c.validator.defaults, a);
		this.currentForm = b;
		this.init()
	};
	c.extend(c.validator, {defaults:{messages:{}, groups:{}, rules:{}, errorClass:"error", errorElement:"label", focusInvalid:true, errorContainer:c([]), errorLabelContainer:c([]), onsubmit:true, ignore:[], ignoreTitle:false, onfocusin:function(a) {
		this.lastActive = a;
		if(this.settings.focusCleanup && !this.blockFocusCleanup) {
			this.settings.unhighlight && this.settings.unhighlight.call(this, a, this.settings.errorClass);
			this.errorsFor(a).hide()
		}
	}, onfocusout:function(a) {
		if(!this.checkable(a) && (a.name in this.submitted || !this.optional(a)))this.element(a)
	}, onkeyup:function(a) {
		if(a.name in this.submitted || a == this.lastElement)this.element(a)
	}, onclick:function(a) {
		a.name in this.submitted && this.element(a)
	}, highlight:function(a, b) {
		c(a).addClass(b)
	}, unhighlight:function(a, b) {
		c(a).removeClass(b)
	}}, setDefaults:function(a) {
		c.extend(c.validator.defaults, a)
	}, messages:{required:"This field is required.", remote:"Please fix this field.", email:"Please enter a valid email address.", url:"Please enter a valid URL.", date:"Please enter a valid date.", dateISO:"Please enter a valid date (ISO).", dateDE:"Bitte geben Sie ein g\u00fcltiges Datum ein.", number:"Please enter a valid number.", numberDE:"Bitte geben Sie eine Nummer ein.", digits:"Please enter only digits", creditcard:"Please enter a valid credit card number.", equalTo:"Please enter the same value again.", 
	accept:"Please enter a value with a valid extension.", maxlength:c.format("Please enter no more than {0} characters."), minlength:c.format("Please enter at least {0} characters."), rangelength:c.format("Please enter a value between {0} and {1} characters long."), range:c.format("Please enter a value between {0} and {1}."), max:c.format("Please enter a value less than or equal to {0}."), min:c.format("Please enter a value greater than or equal to {0}.")}, autoCreateRanges:false, prototype:{init:function() {
		function a(e) {
			var f = c.data(this[0].form, "validator");
			f.settings["on" + e.type] && f.settings["on" + e.type].call(f, this[0])
		}
		this.labelContainer = c(this.settings.errorLabelContainer);
		this.errorContext = this.labelContainer.length && this.labelContainer || c(this.currentForm);
		this.containers = c(this.settings.errorContainer).add(this.settings.errorLabelContainer);
		this.submitted = {};
		this.valueCache = {};
		this.pendingRequest = 0;
		this.pending = {};
		this.invalid = {};
		this.reset();
		var b = this.groups = {};
		c.each(this.settings.groups, function(e, f) {
			c.each(f.split(/\s/), function(g, h) {
				b[h] = e
			})
		});
		var d = this.settings.rules;
		c.each(d, function(e, f) {
			d[e] = c.validator.normalizeRule(f)
		});
		c(this.currentForm).delegate("focusin focusout keyup", ":text, :password, :file, select, textarea", a).delegate("click", ":radio, :checkbox", a);
		this.settings.invalidHandler && c(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler)
	}, form:function() {
		this.checkForm();
		c.extend(this.submitted, this.errorMap);
		this.invalid = c.extend({}, this.errorMap);
		this.valid() || c(this.currentForm).triggerHandler("invalid-form", [this]);
		this.showErrors();
		return this.valid()
	}, checkForm:function() {
		this.prepareForm();
		for(var a = 0, b = this.currentElements = this.elements();b[a];a++)this.check(b[a]);
		return this.valid()
	}, element:function(a) {
		this.lastElement = a = this.clean(a);
		this.prepareElement(a);
		this.currentElements = c(a);
		var b = this.check(a);
		if(b)delete this.invalid[a.name];
		else this.invalid[a.name] = true;
		if(!this.numberOfInvalids())this.toHide = this.toHide.add(this.containers);
		this.showErrors();
		return b
	}, showErrors:function(a) {
		if(a) {
			c.extend(this.errorMap, a);
			this.errorList = [];
			for(var b in a)this.errorList.push({message:a[b], element:this.findByName(b)[0]});
			this.successList = c.grep(this.successList, function(d) {
				return!(d.name in a)
			})
		}this.settings.showErrors ? this.settings.showErrors.call(this, this.errorMap, this.errorList) : this.defaultShowErrors()
	}, resetForm:function() {
		c.fn.resetForm && c(this.currentForm).resetForm();
		this.submitted = {};
		this.prepareForm();
		this.hideErrors();
		this.elements().removeClass(this.settings.errorClass)
	}, numberOfInvalids:function() {
		return this.objectLength(this.invalid)
	}, objectLength:function(a) {
		var b = 0;
		for(var d in a)b++;
		return b
	}, 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 {
			c(this.findLastActive() || this.errorList.length && this.errorList[0].element || []).filter(":visible").focus()
		}catch(a) {
		}
	}, findLastActive:function() {
		var a = this.lastActive;
		return a && c.grep(this.errorList, function(b) {
			return b.element.name == a.name
		}).length == 1 && a
	}, elements:function() {
		var a = this, b = {};
		return c([]).add(this.currentForm.elements).filter(":input").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function() {
			!this.name && a.settings.debug && window.console && console.error("%o has no name assigned", this);
			if(this.name in b || !a.objectLength(c(this).rules()))return false;
			return b[this.name] = true
		})
	}, clean:function(a) {
		return c(a)[0]
	}, errors:function() {
		return c(this.settings.errorElement + "." + this.settings.errorClass, this.errorContext)
	}, reset:function() {
		this.successList = [];
		this.errorList = [];
		this.errorMap = {};
		this.toShow = c([]);
		this.toHide = c([]);
		this.formSubmitted = false;
		this.currentElements = c([])
	}, prepareForm:function() {
		this.reset();
		this.toHide = this.errors().add(this.containers)
	}, prepareElement:function(a) {
		this.reset();
		this.toHide = this.errorsFor(a)
	}, check:function(a) {
		a = this.clean(a);
		if(this.checkable(a))a = this.findByName(a.name)[0];
		var b = c(a).rules(), d = false;
		for(method in b) {
			var e = {method:method, parameters:b[method]};
			try {
				var f = c.validator.methods[method].call(this, a.value.replace(/\r/g, ""), a, e.parameters);
				if(f == "dependency-mismatch")d = true;
				else {
					d = false;
					if(f == "pending") {
						this.toHide = this.toHide.not(this.errorsFor(a));
						return
					}if(!f) {
						this.formatAndAdd(a, e);
						return false
					}
				}
			}catch(g) {
				this.settings.debug && window.console && console.log("exception occured when checking element " + a.id + ", check the '" + e.method + "' method");
				throw g;
			}
		}if(!d) {
			this.objectLength(b) && this.successList.push(a);
			return true
		}
	}, customMetaMessage:function(a, b) {
		if(c.metadata)return(a = this.settings.meta ? c(a).metadata()[this.settings.meta] : c(a).metadata()) && a.messages && a.messages[b]
	}, customMessage:function(a, b) {
		return(a = this.settings.messages[a]) && (a.constructor == String ? a : a[b])
	}, findDefined:function() {
		for(var a = 0;a < arguments.length;a++)if(arguments[a] !== undefined)return arguments[a]
	}, defaultMessage:function(a, b) {
		return this.findDefined(this.customMessage(a.name, b), this.customMetaMessage(a, b), !this.settings.ignoreTitle && c(a).attr("validate") || undefined, c.validator.messages[b], "<strong>Warning: No message defined for " + a.name + "</strong>")
	}, formatAndAdd:function(a, b) {
		var d = this.defaultMessage(a, b.method);
		if(typeof d == "function")d = d.call(this, b.parameters, a);
		this.errorList.push({message:d, element:a});
		this.errorMap[a.name] = d;
		this.submitted[a.name] = d
	}, addWrapper:function(a) {
		if(this.settings.wrapper)a = a.add(a.parents(this.settings.wrapper));
		return a
	}, defaultShowErrors:function() {
		for(var a = 0;this.errorList[a];a++) {
			var b = this.errorList[a];
			this.settings.highlight && this.settings.highlight.call(this, b.element, this.settings.errorClass);
			this.showLabel(b.element, b.message)
		}if(this.errorList.length)this.toShow = this.toShow.add(this.containers);
		if(this.settings.success)for(a = 0;this.successList[a];a++)this.showLabel(this.successList[a]);
		if(this.settings.unhighlight) {
			a = 0;
			for(b = this.validElements();b[a];a++)this.settings.unhighlight.call(this, b[a], this.settings.errorClass)
		}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 c(this.errorList).map(function() {
			return this.element
		})
	}, showLabel:function(a, b) {
		var d = this.errorsFor(a);
		if(d.length) {
			d.removeClass().addClass(this.settings.errorClass);
			d.attr("generated") && d.html(b)
		}else {
			d = c("<" + this.settings.errorElement + "/>").attr({"for":this.idOrName(a), generated:true}).addClass(this.settings.errorClass).html(b || "");
			if(this.settings.wrapper)d = d.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
			this.labelContainer.append(d).length || (this.settings.errorPlacement ? this.settings.errorPlacement(d, c(a)) : d.insertAfter(a))
		}if(!b && this.settings.success) {
			d.text("");
			typeof this.settings.success == "string" ? d.addClass(this.settings.success) : this.settings.success(d)
		}this.toShow = this.toShow.add(d)
	}, errorsFor:function(a) {
		return this.errors().filter("[for='" + this.idOrName(a) + "']")
	}, idOrName:function(a) {
		return this.groups[a.name] || (this.checkable(a) ? a.name : a.id || a.name)
	}, checkable:function(a) {
		return/radio|checkbox/i.test(a.type)
	}, findByName:function(a) {
		var b = this.currentForm;
		return c(document.getElementsByName(a)).map(function(d, e) {
			return e.form == b && e.name == a && e || null
		})
	}, getLength:function(a, b) {
		switch(b.nodeName.toLowerCase()) {
			case "select":
				return c("option:selected", b).length;
			case "input":
				if(this.checkable(b))return this.findByName(b.name).filter(":checked").length
		}
		return a.length
	}, depend:function(a, b) {
		return this.dependTypes[typeof a] ? this.dependTypes[typeof a](a, b) : true
	}, dependTypes:{"boolean":function(a) {
		return a
	}, string:function(a, b) {
		return!!c(a, b.form).length
	}, "function":function(a, b) {
		return a(b)
	}}, optional:function(a) {
		return!c.validator.methods.required.call(this, c.trim(a.value), a) && "dependency-mismatch"
	}, startRequest:function(a) {
		if(!this.pending[a.name]) {
			this.pendingRequest++;
			this.pending[a.name] = true
		}
	}, stopRequest:function(a, b) {
		this.pendingRequest--;
		if(this.pendingRequest < 0)this.pendingRequest = 0;
		delete this.pending[a.name];
		if(b && this.pendingRequest == 0 && this.formSubmitted && this.form())c(this.currentForm).submit();
		else!b && this.pendingRequest == 0 && this.formSubmitted && c(this.currentForm).triggerHandler("invalid-form", [this])
	}, previousValue:function(a) {
		return c.data(a, "previousValue") || c.data(a, "previousValue", previous = {old:null, valid:true, message:this.defaultMessage(a, "remote")})
	}}, classRuleSettings:{required:{required:true}, email:{email:true}, url:{url:true}, date:{date:true}, dateISO:{dateISO:true}, dateDE:{dateDE:true}, number:{number:true}, numberDE:{numberDE:true}, digits:{digits:true}, creditcard:{creditcard:true}}, addClassRules:function(a, b) {
		a.constructor == String ? (this.classRuleSettings[a] = b) : c.extend(this.classRuleSettings, a)
	}, classRules:function(a) {
		var b = {};
		(a = c(a).attr("class")) && c.each(a.split(" "), function() {
			this in c.validator.classRuleSettings && c.extend(b, c.validator.classRuleSettings[this])
		});
		return b
	}, attributeRules:function(a) {
		var b = {};
		a = c(a);
		for(method in c.validator.methods) {
			var d = a.attr(method);
			if(d)b[method] = d
		}b.maxlength && /-1|2147483647|524288/.test(b.maxlength) && delete b.maxlength;
		return b
	}, metadataRules:function(a) {
		if(!c.metadata)return{};
		var b = c.data(a.form, "validator").settings.meta;
		return b ? c(a).metadata()[b] : c(a).metadata()
	}, staticRules:function(a) {
		var b = {}, d = c.data(a.form, "validator");
		if(d.settings.rules)b = c.validator.normalizeRule(d.settings.rules[a.name]) || {};
		return b
	}, normalizeRules:function(a, b) {
		c.each(a, function(d, e) {
			if(e === false)delete a[d];
			else if(e.param || e.depends) {
				var f = true;
				switch(typeof e.depends) {
					case "string":
						f = !!c(e.depends, b.form).length;
						break;
					case "function":
						f = e.depends.call(b, b);
						break
				}
				if(f)a[d] = e.param !== undefined ? e.param : true;
				else delete a[d]
			}
		});
		c.each(a, function(d, e) {
			a[d] = c.isFunction(e) ? e(b) : e
		});
		c.each(["minlength", "maxlength", "min", "max"], function() {
			if(a[this])a[this] = Number(a[this])
		});
		c.each(["rangelength", "range"], function() {
			if(a[this])a[this] = [Number(a[this][0]), Number(a[this][1])]
		});
		if(c.validator.autoCreateRanges) {
			if(a.min && a.max) {
				a.range = [a.min, a.max];
				delete a.min;
				delete a.max
			}if(a.minlength && a.maxlength) {
				a.rangelength = [a.minlength, a.maxlength];
				delete a.minlength;
				delete a.maxlength
			}
		}a.messages && delete a.messages;
		return a
	}, normalizeRule:function(a) {
		if(typeof a == "string") {
			var b = {};
			c.each(a.split(/\s/), function() {
				b[this] = true
			});
			a = b
		}return a
	}, addMethod:function(a, b, d) {
		c.validator.methods[a] = b;
		c.validator.messages[a] = d;
		b.length < 3 && c.validator.addClassRules(a, c.validator.normalizeRule(a))
	}, methods:{required:function(a, b, d) {
		if(!this.depend(d, b))return"dependency-mismatch";
		switch(b.nodeName.toLowerCase()) {
			case "select":
				a = c("option:selected", b);
				return a.length > 0 && (b.type == "select-multiple" || (c.browser.msie && !a[0].attributes.value.specified ? a[0].text : a[0].value).length > 0);
			case "input":
				if(this.checkable(b))return this.getLength(a, b) > 0;
			default:
				return c.trim(a).length > 0
		}
	}, remote:function(a, b, d) {
		if(this.optional(b))return"dependency-mismatch";
		var e = this.previousValue(b);
		this.settings.messages[b.name] || (this.settings.messages[b.name] = {});
		this.settings.messages[b.name].remote = typeof e.message == "function" ? e.message(a) : e.message;
		d = typeof d == "string" && {url:d} || d;
		if(e.old !== a) {
			e.old = a;
			var f = this;
			this.startRequest(b);
			var g = {};
			g[b.name] = a;
			c.ajax(c.extend(true, {url:d, mode:"abort", port:"validate" + b.name, dataType:"json", data:g, success:function(h) {
				if(h) {
					var i = f.formSubmitted;
					f.prepareElement(b);
					f.formSubmitted = i;
					f.successList.push(b);
					f.showErrors()
				}else {
					i = {};
					i[b.name] = h || f.defaultMessage(b, "remote");
					f.showErrors(i)
				}e.valid = h;
				f.stopRequest(b, h)
			}}, d));
			return"pending"
		}else if(this.pending[b.name])return"pending";
		return e.valid
	}, minlength:function(a, b, d) {
		return this.optional(b) || this.getLength(c.trim(a), b) >= d
	}, maxlength:function(a, b, d) {
		return this.optional(b) || this.getLength(c.trim(a), b) <= d
	}, rangelength:function(a, b, d) {
		a = this.getLength(c.trim(a), b);
		return this.optional(b) || a >= d[0] && a <= d[1]
	}, min:function(a, b, d) {
		return this.optional(b) || a >= d
	}, max:function(a, b, d) {
		return this.optional(b) || a <= d
	}, range:function(a, b, d) {
		return this.optional(b) || a >= d[0] && a <= d[1]
	}, email:function(a, b) {
		return this.optional(b) || /^((([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(a)
	}, url:function(a, b) {
		return this.optional(b) || /^(https?|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(a)
	}, date:function(a, b) {
		return this.optional(b) || !/Invalid|NaN/.test(new Date(a))
	}, dateISO:function(a, b) {
		return this.optional(b) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(a)
	}, dateDE:function(a, b) {
		return this.optional(b) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(a)
	}, number:function(a, b) {
		return this.optional(b) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(a)
	}, numberDE:function(a, b) {
		return this.optional(b) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(a)
	}, digits:function(a, b) {
		return this.optional(b) || /^\d+$/.test(a)
	}, creditcard:function(a, b) {
		if(this.optional(b))return"dependency-mismatch";
		if(/[^0-9-]+/.test(a))return false;
		var d = b = 0, e = false;
		a = a.replace(/\D/g, "");
		for(n = a.length - 1;n >= 0;n--) {
			d = a.charAt(n);
			d = parseInt(d, 10);
			if(e)if((d *= 2) > 9)d -= 9;
			b += d;
			e = !e
		}return b % 10 == 0
	}, accept:function(a, b, d) {
		d = typeof d == "string" ? d : "png|jpe?g|gif";
		return this.optional(b) || a.match(new RegExp(".(" + d + ")$", "i"))
	}, equalTo:function(a, b, d) {
		return a == c(d).val()
	}}})
})(jQuery);
(function(c) {
	var a = c.ajax, b = {};
	c.ajax = function(d) {
		d = c.extend(d, c.extend({}, c.ajaxSettings, d));
		var e = d.port;
		if(d.mode == "abort") {
			b[e] && b[e].abort();
			return b[e] = a.apply(this, arguments)
		}return a.apply(this, arguments)
	}
})(jQuery);
(function(c) {
	c.each({focus:"focusin", blur:"focusout"}, function(a, b) {
		c.event.special[b] = {setup:function() {
			if(c.browser.msie)return false;
			this.addEventListener(a, c.event.special[b].handler, true)
		}, teardown:function() {
			if(c.browser.msie)return false;
			this.removeEventListener(a, c.event.special[b].handler, true)
		}, handler:function(d) {
			arguments[0] = c.event.fix(d);
			arguments[0].type = b;
			return c.event.handle.apply(this, arguments)
		}}
	});
	c.extend(c.fn, {delegate:function(a, b, d) {
		return this.bind(a, function(e) {
			var f = c(e.target);
			if(f.is(b))return d.apply(f, arguments)
		})
	}, triggerEvent:function(a, b) {
		return this.triggerHandler(a, [c.event.fix({type:a, target:b})])
	}})
})(jQuery);
