/*! * Validator v0.11.9 for Bootstrap 3, by @1000hz * Copyright 2017 Cina Saffary * Licensed under http://opensource.org/licenses/MIT * * https://github.com/1000hz/bootstrap-validator */ + function(a) {
"use strict";
function b(b) {
return b.is('[type="checkbox"]') ? b.prop("checked") : b.is('[type="radio"]') ? !!a('[name="' + b.attr("name") + '"]:checked').length : b.is("select[multiple]") ? (b.val() || []).length : b.val()
}
function c(b) {
return this.each(function() {
var c = a(this),
e = a.extend({}, d.DEFAULTS, c.data(), "object" == typeof b && b),
f = c.data("bs.validator");
(f || "destroy" != b) && (f || c.data("bs.validator", f = new d(this, e)), "string" == typeof b && f[b]())
})
}
var d = function(c, e) {
this.options = e, this.validators = a.extend({}, d.VALIDATORS, e.custom), this.$element = a(c), this.$btn = a('button[type="submit"], input[type="submit"]').filter('[form="' + this.$element.attr("id") + '"]').add(this.$element.find('input[type="submit"], button[type="submit"]')), this.update(), this.$element.on("input.bs.validator change.bs.validator focusout.bs.validator", a.proxy(this.onInput, this)), this.$element.on("submit.bs.validator", a.proxy(this.onSubmit, this)), this.$element.on("reset.bs.validator", a.proxy(this.reset, this)), this.$element.find("[data-match]").each(function() {
var c = a(this),
d = c.attr("data-match");
a(d).on("input.bs.validator", function() {
b(c) && c.trigger("input.bs.validator")
})
}), this.$inputs.filter(function() {
return b(a(this)) && !a(this).closest(".has-error").length
}).trigger("focusout"), this.$element.attr("novalidate", !0)
};
d.VERSION = "0.11.9", d.INPUT_SELECTOR = ':input:not([type="hidden"], [type="submit"], [type="reset"], button)', d.FOCUS_OFFSET = 20, d.DEFAULTS = {
delay: 500,
html: !1,
disable: !0,
focus: !0,
custom: {},
errors: {
match: "Does not match",
minlength: "Not long enough"
},
feedback: {
success: "glyphicon-ok",
error: "glyphicon-remove"
}
}, d.VALIDATORS = {
"native": function(a) {
var b = a[0];
return b.checkValidity ? !b.checkValidity() && !b.validity.valid && (b.validationMessage || "error!") : void 0
},
match: function(b) {
var c = b.attr("data-match");
return b.val() !== a(c).val() && d.DEFAULTS.errors.match
},
minlength: function(a) {
var b = a.attr("data-minlength");
return a.val().length < b && d.DEFAULTS.errors.minlength
}
}, d.prototype.update = function() {
var b = this;
return this.$inputs = this.$element.find(d.INPUT_SELECTOR).add(this.$element.find('[data-validate="true"]')).not(this.$element.find('[data-validate="false"]').each(function() {
b.clearErrors(a(this))
})), this.toggleSubmit(), this
}, d.prototype.onInput = function(b) {
var c = this,
d = a(b.target),
e = "focusout" !== b.type;
this.$inputs.is(d) && this.validateInput(d, e).done(function() {
c.toggleSubmit()
})
}, d.prototype.validateInput = function(c, d) {
var e = (b(c), c.data("bs.validator.errors"));
c.is('[type="radio"]') && (c = this.$element.find('input[name="' + c.attr("name") + '"]'));
var f = a.Event("validate.bs.validator", {
relatedTarget: c[0]
});
if (this.$element.trigger(f), !f.isDefaultPrevented()) {
var g = this;
return this.runValidators(c).done(function(b) {
c.data("bs.validator.errors", b), b.length ? d ? g.defer(c, g.showErrors) : g.showErrors(c) : g.clearErrors(c), e && b.toString() === e.toString() || (f = b.length ? a.Event("invalid.bs.validator", {
relatedTarget: c[0],
detail: b
}) : a.Event("valid.bs.validator", {
relatedTarget: c[0],
detail: e
}), g.$element.trigger(f)), g.toggleSubmit(), g.$element.trigger(a.Event("validated.bs.validator", {
relatedTarget: c[0]
}))
})
}
}, d.prototype.runValidators = function(c) {
function d(a) {
return c.attr("data-" + a + "-error")
}
function e() {
var a = c[0].validity;
return a.typeMismatch ? c.attr("data-type-error") : a.patternMismatch ? c.attr("data-pattern-error") : a.stepMismatch ? c.attr("data-step-error") : a.rangeOverflow ? c.attr("data-max-error") : a.rangeUnderflow ? c.attr("data-min-error") : a.valueMissing ? c.attr("data-required-error") : null
}
function f() {
return c.attr("data-error")
}
function g(a) {
return d(a) || e() || f()
}
var h = [],
i = a.Deferred();
return c.data("bs.validator.deferred") && c.data("bs.validator.deferred").reject(), c.data("bs.validator.deferred", i), a.each(this.validators, a.proxy(function(a, d) {
var e = null;
!b(c) && !c.attr("required") || void 0 === c.attr("data-" + a) && "native" != a || !(e = d.call(this, c)) || (e = g(a) || e, !~h.indexOf(e) && h.push(e))
}, this)), !h.length && b(c) && c.attr("data-remote") ? this.defer(c, function() {
var d = {};
d[c.attr("name")] = b(c), a.get(c.attr("data-remote"), d).fail(function(a, b, c) {
h.push(g("remote") || c)
}).always(function() {
i.resolve(h)
})
}) : i.resolve(h), i.promise()
}, d.prototype.validate = function() {
var b = this;
return a.when(this.$inputs.map(function() {
return b.validateInput(a(this), !1)
})).then(function() {
b.toggleSubmit(), b.focusError()
}), this
}, d.prototype.focusError = function() {
if (this.options.focus) {
var b = this.$element.find(".has-error :input:first");
0 !== b.length && (a("html, body").animate({
scrollTop: b.offset().top - d.FOCUS_OFFSET
}, 250), b.focus())
}
}, d.prototype.showErrors = function(b) {
var c = this.options.html ? "html" : "text",
d = b.data("bs.validator.errors"),
e = b.closest(".form-group"),
f = e.find(".help-block.with-errors"),
g = e.find(".form-control-feedback");
d.length && (d = a("<ul/>").addClass("list-unstyled").append(a.map(d, function(b) {
return a("<li/>")[c](b)
})), void 0 === f.data("bs.validator.originalContent") && f.data("bs.validator.originalContent", f.html()), f.empty().append(d), e.addClass("has-error has-danger"), e.hasClass("has-feedback") && g.removeClass(this.options.feedback.success) && g.addClass(this.options.feedback.error) && e.removeClass("has-success"))
}, d.prototype.clearErrors = function(a) {
var c = a.closest(".form-group"),
d = c.find(".help-block.with-errors"),
e = c.find(".form-control-feedback");
d.html(d.data("bs.validator.originalContent")), c.removeClass("has-error has-danger has-success"), c.hasClass("has-feedback") && e.removeClass(this.options.feedback.error) && e.removeClass(this.options.feedback.success) && b(a) && e.addClass(this.options.feedback.success) && c.addClass("has-success")
}, d.prototype.hasErrors = function() {
function b() {
return !!(a(this).data("bs.validator.errors") || []).length
}
return !!this.$inputs.filter(b).length
}, d.prototype.isIncomplete = function() {
function c() {
var c = b(a(this));
return !("string" == typeof c ? a.trim(c) : c)
}
return !!this.$inputs.filter("[required]").filter(c).length
}, d.prototype.onSubmit = function(a) {
this.validate(), (this.isIncomplete() || this.hasErrors()) && a.preventDefault()
}, d.prototype.toggleSubmit = function() {
this.options.disable && this.$btn.toggleClass("disabled", this.isIncomplete() || this.hasErrors())
}, d.prototype.defer = function(b, c) {
return c = a.proxy(c, this, b), this.options.delay ? (window.clearTimeout(b.data("bs.validator.timeout")), void b.data("bs.validator.timeout", window.setTimeout(c, this.options.delay))) : c()
}, d.prototype.reset = function() {
return this.$element.find(".form-control-feedback").removeClass(this.options.feedback.error).removeClass(this.options.feedback.success), this.$inputs.removeData(["bs.validator.errors", "bs.validator.deferred"]).each(function() {
var b = a(this),
c = b.data("bs.validator.timeout");
window.clearTimeout(c) && b.removeData("bs.validator.timeout")
}), this.$element.find(".help-block.with-errors").each(function() {
var b = a(this),
c = b.data("bs.validator.originalContent");
b.removeData("bs.validator.originalContent").html(c)
}), this.$btn.removeClass("disabled"), this.$element.find(".has-error, .has-danger, .has-success").removeClass("has-error has-danger has-success"), this
}, d.prototype.destroy = function() {
return this.reset(), this.$element.removeAttr("novalidate").removeData("bs.validator").off(".bs.validator"), this.$inputs.off(".bs.validator"), this.options = null, this.validators = null, this.$element = null, this.$btn = null, this.$inputs = null, this
};
var e = a.fn.validator;
a.fn.validator = c, a.fn.validator.Constructor = d, a.fn.validator.noConflict = function() {
return a.fn.validator = e, this
}, a(window).on("load", function() {
a('form[data-toggle="validator"]').each(function() {
var b = a(this);
c.call(b, b.data())
})
})
}(jQuery); |