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