!function(e){"function"==typeof require&&"object"==typeof exports&&"object"==typeof module?e(require("knockout"),exports):"function"==typeof define&&define.amd?define(["knockout","exports"],e):e(ko,ko.validation={})}(function(e,t){function r(e){var t="max"===e;return function(r,i){if(a.utils.isEmptyVal(r))return!0;var n,s;void 0===i.typeAttr?(s="text",n=i):(s=i.typeAttr,n=i.value),isNaN(n)||n instanceof Date||(s="number");var u,o,l;switch(s.toLowerCase()){case"week":if(u=/^(\d{4})-W(\d{2})$/,o=r.match(u),null===o)throw new Error("Invalid value for "+e+" attribute for week input. Should look like '2000-W33' http://www.w3.org/TR/html-markup/input.week.html#input.week.attrs.min");return l=n.match(u),l?t?o[1]l[1]||o[1]===l[1]&&o[2]>=l[2]:!1;case"month":if(u=/^(\d{4})-(\d{2})$/,o=r.match(u),null===o)throw new Error("Invalid value for "+e+" attribute for month input. Should look like '2000-03' http://www.w3.org/TR/html-markup/input.month.html#input.month.attrs.min");return l=n.match(u),l?t?o[1]l[1]||o[1]===l[1]&&o[2]>=l[2]:!1;case"number":case"range":return r=r.toString().split(".").join("").replace(",","."),t?!isNaN(r)&&parseFloat(r)<=parseFloat(n):!isNaN(r)&&parseFloat(r)>=parseFloat(n);default:return t?n>=r:r>=n}}}function i(e,t,r){return t.validator(e(),void 0===r.params?!0:u(r.params))?!0:(e.setError(a.formatMessage(r.message||t.message,u(r.params),e)),!1)}function n(e,t,r){e.isValidating(!0);var i=function(i){var n=!1,s="";return e.__valid__()?(i.message?(n=i.isValid,s=i.message):n=i,n||(e.error(a.formatMessage(s||r.message||t.message,u(r.params),e)),e.__valid__(n)),void e.isValidating(!1)):void e.isValidating(!1)};a.utils.async(function(){t.validator(e(),void 0===r.params?!0:u(r.params),i)})}if("undefined"==typeof e)throw new Error("Knockout is required, please ensure it is loaded before loading this validation plug-in");e.validation=t;var a=e.validation,s=e.utils,u=s.unwrapObservable,o=s.arrayForEach,l=s.extend,d={registerExtenders:!0,messagesOnModified:!0,errorsAsTitle:!0,errorsAsTitleOnModified:!1,messageTemplate:null,insertMessages:!0,parseInputAttributes:!1,writeInputAttributes:!1,decorateInputElement:!1,decorateElementOnModified:!0,errorClass:null,errorElementClass:"validationElement",errorMessageClass:"validationMessage",allowHtmlMessages:!1,grouping:{deep:!1,observable:!0,live:!1},validate:{}},f=l({},d);f.html5Attributes=["required","pattern","min","max","step"],f.html5InputTypes=["email","number","date"],f.reset=function(){l(f,d)},a.configuration=f,a.utils=function(){var e=(new Date).getTime(),t={},r="__ko_validation__";return{isArray:function(e){return e.isArray||"[object Array]"===Object.prototype.toString.call(e)},isObject:function(e){return null!==e&&"object"==typeof e},isNumber:function(e){return!isNaN(e)},isObservableArray:function(e){return!!e&&"function"==typeof e.remove&&"function"==typeof e.removeAll&&"function"==typeof e.destroy&&"function"==typeof e.destroyAll&&"function"==typeof e.indexOf&&"function"==typeof e.replace},values:function(e){var t=[];for(var r in e)e.hasOwnProperty(r)&&t.push(e[r]);return t},getValue:function(e){return"function"==typeof e?e():e},hasAttribute:function(e,t){return null!==e.getAttribute(t)},getAttribute:function(e,t){return e.getAttribute(t)},setAttribute:function(e,t,r){return e.setAttribute(t,r)},isValidatable:function(e){return!!(e&&e.rules&&e.isValid&&e.isModified)},insertAfter:function(e,t){e.parentNode.insertBefore(t,e.nextSibling)},newId:function(){return e+=1},getConfigOptions:function(e){var t=a.utils.contextFor(e);return t||a.configuration},setDomData:function(e,i){var n=e[r];n||(e[r]=n=a.utils.newId()),t[n]=i},getDomData:function(e){var i=e[r];return i?t[i]:void 0},contextFor:function(e){switch(e.nodeType){case 1:case 8:var t=a.utils.getDomData(e);if(t)return t;if(e.parentNode)return a.utils.contextFor(e.parentNode)}return void 0},isEmptyVal:function(e){return void 0===e?!0:null===e?!0:""===e?!0:void 0},getOriginalElementTitle:function(e){var t=a.utils.getAttribute(e,"data-orig-title"),r=e.title,i=a.utils.hasAttribute(e,"data-orig-title");return i?t:r},async:function(e){window.setImmediate?window.setImmediate(e):window.setTimeout(e,0)},forEach:function(e,t){if(a.utils.isArray(e))return o(e,t);for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)}}}();var c=function(){function t(e){o(e.subscriptions,function(e){e.dispose()}),e.subscriptions=[]}function r(e){e.options.deep&&(o(e.flagged,function(e){delete e.__kv_traversed}),e.flagged.length=0),e.options.live||t(e)}function i(e,i){i.validatables=[],t(i),n(e,i),r(i)}function n(t,r,i){var a=[],s=t.peek?t.peek():t;t.__kv_traversed!==!0&&(r.options.deep&&(t.__kv_traversed=!0,r.flagged.push(t)),i=void 0!==i?i:r.options.deep?1:-1,e.isObservable(t)&&(t.errors||p.isValidatable(t)||t.extend({validatable:!0}),r.validatables.push(t),r.options.live&&p.isObservableArray(t)&&r.subscriptions.push(t.subscribe(function(){r.graphMonitor.valueHasMutated()}))),s&&!s._destroy&&(p.isArray(s)?a=s:p.isObject(s)&&(a=p.values(s))),0!==i&&p.forEach(a,function(t){!t||t.nodeType||e.isComputed(t)&&!t.rules||n(t,r,i+1)}))}function d(e){var t=[];return o(e,function(e){p.isValidatable(e)&&!e.isValid()&&t.push(e.error.peek())}),t}var f=0,c=a.configuration,p=a.utils;return{init:function(e,t){f>0&&!t||(e=e||{},e.errorElementClass=e.errorElementClass||e.errorClass||c.errorElementClass,e.errorMessageClass=e.errorMessageClass||e.errorClass||c.errorMessageClass,l(c,e),c.registerExtenders&&a.registerExtenders(),f=1)},reset:a.configuration.reset,group:function(t,r){r=l(l({},c.grouping),r);var n={options:r,graphMonitor:e.observable(),flagged:[],subscriptions:[],validatables:[]},a=null;return a=r.observable?e.computed(function(){return n.graphMonitor(),i(t,n),d(n.validatables)}):function(){return i(t,n),d(n.validatables)},a.showAllMessages=function(e){void 0===e&&(e=!0),a.forEach(function(t){p.isValidatable(t)&&t.isModified(e)})},a.isAnyMessageShown=function(){var e;return e=!!a.find(function(e){return p.isValidatable(e)&&!e.isValid()&&e.isModified()})},a.filter=function(e){return e=e||function(){return!0},a(),s.arrayFilter(n.validatables,e)},a.find=function(e){return e=e||function(){return!0},a(),s.arrayFirst(n.validatables,e)},a.forEach=function(e){e=e||function(){},a(),o(n.validatables,e)},a.map=function(e){return e=e||function(e){return e},a(),s.arrayMap(n.validatables,e)},a._updateState=function(e){if(!p.isObject(e))throw new Error("An object is required.");return t=e,r.observable?void n.graphMonitor.valueHasMutated():(i(e,n),d(n.validatables))},a},formatMessage:function(e,t,r){if(p.isObject(t)&&t.typeAttr&&(t=t.value),"function"==typeof e)return e(t,r);var i=u(t);return null==i&&(i=[]),p.isArray(i)||(i=[i]),e.replace(/{(\d+)}/gi,function(e,t){return"undefined"!=typeof i[t]?i[t]:e})},addRule:function(e,t){e.extend({validatable:!0});var r=!!s.arrayFirst(e.rules(),function(e){return e.rule&&e.rule===t.rule});return r||e.rules.push(t),e},addAnonymousRule:function(e,t){void 0===t.message&&(t.message="Error"),t.onlyIf&&(t.condition=t.onlyIf),a.addRule(e,t)},addExtender:function(t){e.extenders[t]=function(e,r){return r&&(r.message||r.onlyIf)?a.addRule(e,{rule:t,message:r.message,params:p.isEmptyVal(r.params)?!0:r.params,condition:r.onlyIf}):a.addRule(e,{rule:t,params:r})}},registerExtenders:function(){if(c.registerExtenders)for(var t in a.rules)a.rules.hasOwnProperty(t)&&(e.extenders[t]||a.addExtender(t))},insertValidationMessage:function(e){var t=document.createElement("SPAN");return t.className=p.getConfigOptions(e).errorMessageClass,p.insertAfter(e,t),t},parseInputValidationAttributes:function(e,t){o(a.configuration.html5Attributes,function(r){if(p.hasAttribute(e,r)){var i=e.getAttribute(r)||!0;if("min"===r||"max"===r){var n=e.getAttribute("type");"undefined"!=typeof n&&n||(n="text"),i={typeAttr:n,value:i}}a.addRule(t(),{rule:r,params:i})}});var r=e.getAttribute("type");o(a.configuration.html5InputTypes,function(e){e===r&&a.addRule(t(),{rule:"date"===e?"dateISO":e,params:!0})})},writeInputValidationAttributes:function(t,r){var i=r();if(i&&i.rules){var n=i.rules();o(a.configuration.html5Attributes,function(r){var i=s.arrayFirst(n,function(e){return e.rule&&e.rule.toLowerCase()===r.toLowerCase()});i&&e.computed({read:function(){var n=e.unwrap(i.params);"pattern"===i.rule&&n instanceof RegExp&&(n=n.source),t.setAttribute(r,n)},disposeWhenNodeIsRemoved:t})}),n=null}},makeBindingHandlerValidatable:function(t){var r=e.bindingHandlers[t].init;e.bindingHandlers[t].init=function(t,i,n,a,s){return r(t,i,n,a,s),e.bindingHandlers.validationCore.init(t,i,n,a,s)}},setRules:function(t,r){var i=function(t,r){if(t&&r)for(var n in r)if(r.hasOwnProperty(n)){var s=r[n];if(t[n]){var o=t[n],l=u(o),d={},f={};for(var c in s)s.hasOwnProperty(c)&&(a.rules[c]?d[c]=s[c]:f[c]=s[c]);if(e.isObservable(o)&&o.extend(d),l&&p.isArray(l))for(var v=0;v0:!0)},message:"This field is required."},a.rules.min={validator:r("min"),message:"Please enter a value greater than or equal to {0}."},a.rules.max={validator:r("max"),message:"Please enter a value less than or equal to {0}."},a.rules.minLength={validator:function(e,t){if(a.utils.isEmptyVal(e))return!0;var r=a.utils.isNumber(e)?""+e:e;return r.length>=t},message:"Please enter at least {0} characters."},a.rules.maxLength={validator:function(e,t){if(a.utils.isEmptyVal(e))return!0;var r=a.utils.isNumber(e)?""+e:e;return r.length<=t},message:"Please enter no more than {0} characters."},a.rules.pattern={validator:function(e,t){return a.utils.isEmptyVal(e)||null!==e.toString().match(t)},message:"Please check this value."},a.rules.step={validator:function(e,t){if(a.utils.isEmptyVal(e)||"any"===t)return!0;var r=100*e%(100*t);return Math.abs(r)<1e-5||Math.abs(1-r)<1e-5},message:"The value must increment by {0}."},a.rules.email={validator:function(e,t){return t?a.utils.isEmptyVal(e)||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):!0},message:"Please enter a proper email address."},a.rules.date={validator:function(e,t){return t?a.utils.isEmptyVal(e)||t&&!/Invalid|NaN/.test(new Date(e)):!0},message:"Please enter a proper date."},a.rules.dateISO={validator:function(e,t){return t?a.utils.isEmptyVal(e)||t&&/^\d{4}[-\/](?:0?[1-9]|1[012])[-\/](?:0?[1-9]|[12][0-9]|3[01])$/.test(e):!0},message:"Please enter a proper date."},a.rules.number={validator:function(e,t){return t?a.utils.isEmptyVal(e)||t&&/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(e):!0},message:"Please enter a number."},a.rules.digit={validator:function(e,t){return t?a.utils.isEmptyVal(e)||t&&/^\d+$/.test(e):!0},message:"Please enter a digit."},a.rules.phoneUS={validator:function(e,t){return t?a.utils.isEmptyVal(e)?!0:"string"!=typeof e?!1:(e=e.replace(/\s+/g,""),t&&e.length>9&&e.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/)):!0},message:"Please specify a valid phone number."},a.rules.equal={validator:function(e,t){var r=t;return e===a.utils.getValue(r)},message:"Values must equal."},a.rules.notEqual={validator:function(e,t){var r=t;return e!==a.utils.getValue(r)},message:"Please choose another value."},a.rules.unique={validator:function(e,t){var r=a.utils.getValue(t.collection),i=a.utils.getValue(t.externalValue),n=0;return e&&r?(s.arrayFilter(r,function(r){e===(t.valueAccessor?t.valueAccessor(r):r)&&n++}),(i?1:2)>n):!0},message:"Please make sure the value is unique."},function(){a.registerExtenders()}(),e.bindingHandlers.validationCore=function(){return{init:function(t,r,i,n,s){var u=a.utils.getConfigOptions(t),o=r();if(u.parseInputAttributes&&a.utils.async(function(){a.parseInputValidationAttributes(t,r)}),u.insertMessages&&a.utils.isValidatable(o)){var l=a.insertValidationMessage(t);u.messageTemplate?e.renderTemplate(u.messageTemplate,{field:o},null,l,"replaceNode"):e.applyBindingsToNode(l,{validationMessage:o})}u.writeInputAttributes&&a.utils.isValidatable(o)&&a.writeInputValidationAttributes(t,r),u.decorateInputElement&&a.utils.isValidatable(o)&&e.applyBindingsToNode(t,{validationElement:o})}}}(),a.makeBindingHandlerValidatable("value"),a.makeBindingHandlerValidatable("checked"),e.bindingHandlers.textInput&&a.makeBindingHandlerValidatable("textInput"),a.makeBindingHandlerValidatable("selectedOptions"),e.bindingHandlers.validationMessage={update:function(t,r){var i=r(),n=a.utils.getConfigOptions(t),o=(u(i),!1),l=!1;if(null===i||"undefined"==typeof i)throw new Error("Cannot bind validationMessage to undefined value. data-bind expression: "+t.getAttribute("data-bind"));o=i.isModified&&i.isModified(),l=i.isValid&&i.isValid();var d=null;(!n.messagesOnModified||o)&&(d=l?null:i.error);var f=!n.messagesOnModified||o?!l:!1,c="none"!==t.style.display;n.allowHtmlMessages?s.setHtml(t,d):e.bindingHandlers.text.update(t,function(){return d}),c&&!f?t.style.display="none":!c&&f&&(t.style.display="")}},e.bindingHandlers.validationElement={update:function(t,r,i){var n=r(),s=a.utils.getConfigOptions(t),o=(u(n),!1),l=!1;if(null===n||"undefined"==typeof n)throw new Error("Cannot bind validationElement to undefined value. data-bind expression: "+t.getAttribute("data-bind"));o=n.isModified&&n.isModified(),l=n.isValid&&n.isValid();var d=function(){var e={},t=!s.decorateElementOnModified||o?!l:!1;return e[s.errorElementClass]=t,e};e.bindingHandlers.css.update(t,d,i),s.errorsAsTitle&&e.bindingHandlers.attr.update(t,function(){var e=!s.errorsAsTitleOnModified||o,r=a.utils.getOriginalElementTitle(t);return e&&!l?{title:n.error,"data-orig-title":r}:!e||l?{title:r,"data-orig-title":null}:void 0})}},e.bindingHandlers.validationOptions=function(){return{init:function(e,t,r,i,n){var s=u(t());if(s){var o=l({},a.configuration);l(o,s),a.utils.setDomData(e,o)}}}}(),e.extenders.validation=function(e,t){return o(a.utils.isArray(t)?t:[t],function(t){a.addAnonymousRule(e,t)}),e},e.extenders.validatable=function(t,r){if(a.utils.isObject(r)||(r={enable:r}),"enable"in r||(r.enable=!0),r.enable&&!a.utils.isValidatable(t)){var i=a.configuration.validate||{},n={throttleEvaluation:r.throttle||i.throttle};t.error=e.observable(null),t.rules=e.observableArray(),t.isValidating=e.observable(!1),t.__valid__=e.observable(!0),t.isModified=e.observable(!1),t.isValid=e.computed(t.__valid__),t.setError=function(e){var r=t.error.peek(),i=t.__valid__.peek();t.error(e),t.__valid__(!1),r===e||i||t.isValid.notifySubscribers()},t.clearError=function(){return t.error(null),t.__valid__(!0),t};var s=t.subscribe(function(){t.isModified(!0)}),u=e.computed(l({read:function(){t(),t.rules();return a.validateObservable(t),!0}},n));l(u,n),t._disposeValidation=function(){t.isValid.dispose(),t.rules.removeAll(),s.dispose(),u.dispose(),delete t.rules,delete t.error,delete t.isValid,delete t.isValidating,delete t.__valid__,delete t.isModified,delete t.setError,delete t.clearError,delete t._disposeValidation}}else r.enable===!1&&t._disposeValidation&&t._disposeValidation();return t},a.validateObservable=function(e){for(var t,r,s=0,u=e.rules(),o=u.length;o>s;s++)if(r=u[s],!r.condition||r.condition())if(t=r.rule?a.rules[r.rule]:r,t.async||r.async)n(e,t,r);else if(!i(e,t,r))return!1;return e.clearError(),!0};var p,v={};a.defineLocale=function(e,t){return e&&t?(v[e.toLowerCase()]=t,t):null},a.locale=function(e){if(e){if(e=e.toLowerCase(),!v.hasOwnProperty(e))throw new Error("Localization "+e+" has not been loaded.");a.localize(v[e]),p=e}return p},a.localize=function(e){var t=a.rules;for(var r in e)t.hasOwnProperty(r)&&(t[r].message=e[r])},function(){var e={},t=a.rules;for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r].message);a.defineLocale("en-us",e)}(),p="en-us",e.applyBindingsWithValidation=function(t,r,i){var n,s=document.body;r&&r.nodeType?(s=r,n=i):n=r,a.init(),n&&(n=l(l({},a.configuration),n),a.utils.setDomData(s,n)),e.applyBindings(t,s)};var g=e.applyBindings;e.applyBindings=function(e,t){a.init(),g(e,t)},e.validatedObservable=function(t,r){if(!r&&!a.utils.isObject(t))return e.observable(t).extend({validatable:!0});var i=e.observable(t);return i.errors=a.group(a.utils.isObject(t)?t:{},r),i.isValid=e.observable(0===i.errors().length),e.isObservable(i.errors)?i.errors.subscribe(function(e){i.isValid(0===e.length)}):e.computed(i.errors).subscribe(function(e){i.isValid(0===e.length)}),i.subscribe(function(e){a.utils.isObject(e)||(e={}),i.errors._updateState(e),i.isValid(0===i.errors().length)}),i}});