(function(){"use strict";angular.module("unobtrusive.validation",[]).provider("validation",[function(){function t(t){return n[t]}var n={};this.$get=["$injector","$sce",function(n,i){function u(n,t){return n.slice(0,t.length)==t}function f(n){return n.charAt(0).toLowerCase()+n.slice(1)}function e(r,e,o,s){var c=Object.keys(r).sort(),h={};return angular.forEach(c,function(c){var v,l,a;c!="val"&&c!="valIf"&&c!="valRealtime"&&u(c,"val")&&(v=!1,c.substr(3).charAt(0).toLowerCase()!=c.substr(3).charAt(0))&&((l=f(c.substr(3)),angular.forEach(h,function(n,t){if(u(l,t)){n.parameters[f(l.substr(t.length))]=r[c];v=!0;return}}),v)||(a=t(l),a?(h[l]={name:l,validate:a.validate,message:i.trustAsHtml(r[c]),parameters:[],injected:{},attributes:r,scope:o,ngModel:s,fail:function(n){e.fail(l,n)},pass:function(){e.pass(l)}},a.inject&&angular.forEach(a.inject,function(t){h[l].injected[t]=n.get(t)})):console.log("WARNING: Unhandled validation attribute: "+l)))}),h}var r={ensureValidation:function(n){return n["$$ validation"]=n["$$ validation"]||{cancelSuppress:!1,messages:{},data:{}},n["$$ validation"]},buildValidation:function(n,t,u,f){var s=!0,c=u.name,h,o;return f.suppressValidationMessages=!0,f.validationMessages={},o={enable:function(){s=!0;o.runValidations(r.dataValue(n,c));o.populateMessages()},disable:function(){s=!1;f.validationMessages={};angular.forEach(h,function(n,t){o.pass(t)});o.populateMessages()},populateMessages:function(){f.suppressValidationMessages||r.messageArray(n,c,f.validationMessages)},runValidations:function(t){return r.dataValue(n,c,t),s&&(f.validationMessages={},angular.forEach(h,function(n){n.validate(t,n)?n.pass():n.fail()}),o.populateMessages()),t},cancelSuppress:function(){f.suppressValidationMessages=!1;o.populateMessages()},enableSuppress:function(){f.suppressValidationMessages=!0},fail:function(n,t){s&&(f.$setValidity(n,!1),f.validationMessages[n]=t?i.trustAsHtml(t):h[n].message)},pass:function(n){f.$setValidity(n,!0)},showValidationSummary:!1},h=e(u,o,n,f),o},messageArray:function(n,t,i){return t?(i!==undefined&&(r.ensureValidation(n).messages[t]=i),r.ensureValidation(n).messages[t]):r.ensureValidation(n).messages},dataValue:function(n,t,i){return t?(i!==undefined&&(r.ensureValidation(n).data[t]=i),r.ensureValidation(n).data[t]):r.ensureValidation(n).data},hasCancelledSuppress:function(n){return r.ensureValidation(n).cancelSuppress},cancelSuppress:function(n){r.ensureValidation(n).cancelSuppress=!0},clearDotNetName:function(n,t){var i=r.ensureValidation(n);delete r.ensureValidation(n).messages[t];delete r.ensureValidation(n).data[t]}};return r}];this.getValidationType=t;this.addValidator=function(t,i,r){n[t]={validate:i,inject:r}}}]).directive("val",["validation",function(n){var t=function(t,i,r,u){var o,f,e;if(r.val=="true"){o=r.name;f=n.buildValidation(t,i,r,u);u.$parsers.unshift(f.runValidations);u.$formatters.unshift(f.runValidations);e=[t.$watch(n.hasCancelledSuppress,function(n){n&&f.cancelSuppress()})];r.valIf?e.push(t.$watch(r.valIf,function(n){n?f.enable():f.disable()})):f.enable();i.on("$destroy",function(){delete n.clearDotNetName(t,o);for(var i in e)e[i]()});i.on("blur",function(){f.cancelSuppress();t.$digest()});if(r.hasOwnProperty("valRealtime"))i.on("focus",function(){f.cancelSuppress();t.$digest()});else i.on("focus",function(){f.enableSuppress()})}};return{restrict:"A",require:"ngModel",link:t}}]).directive("form",["validation",function(n){return{restrict:"E",link:function(t){n.ensureValidation(t)}}}]).directive("valSubmit",["validation",function(n){return{restrict:"A",require:"^?form",link:function(t,i,r,u){i.on("click",function(i){u.$invalid&&(i.preventDefault(),n.showValidationSummary=!0,n.cancelSuppress(t),t.$digest())});var f=[t.$watch(function(){return u.$invalid},function(n){n?i.addClass("disabled"):i.removeClass("disabled")})];i.on("$destroy",function(){for(var n in f)f[n]()})}}}]).directive("valmsgSummary",["validation",function(n){return{restrict:"A",scope:{},template:'
- <\/span> <\/ul><\/div>
<\/div>',transclude:!0,link:function(t,i){t.started=!1;t.validationSummary=[];var r=t.$parent.$watchCollection(n.messageArray,function(r){if(n.showValidationSummary){var u=[],f=r;angular.forEach(f,function(n,i){f.hasOwnProperty(i)&&(t.started=!0,angular.forEach(n,function(n){n&&u.indexOf(n)==-1&&u.push(n)}))});t.validationSummary=u;t.started&&(u.length?(i.removeClass("validation-summary-valid"),i.addClass("validation-summary-errors")):(i.addClass("validation-summary-valid"),i.removeClass("validation-summary-errors")))}});i.on("$destroy",function(){r()})}}}]).directive("valBindMessages",["validation","$parse","$sce",function(n,t,i){return{restrict:"A",link:function(r,u,f){var o=t(f.valBindMessages),e=[r.$watchCollection(f.valBindMessages,function(t){var u=n.ensureValidation(r).messages={};angular.forEach(t,function(n){u[n.memberName]=u[n.memberName]||[];u[n.memberName].push(i.trustAsHtml(n.text))})})];u.on("$destroy",function(){angular.forEach(e,function(n){n()})})}}}]).directive("valError",["validation",function(n){return{restrict:"A",link:function(t,i,r){var u=t.$watchCollection(function(){return n.messageArray(t,r.valError)},function(n){n&&Object.keys(n).length?i.addClass("error"):i.removeClass("error")});i.on("$destroy",function(){u()})}}}]).directive("valmsgFor",["validation",function(n){return{restrict:"A",scope:{valmsgFor:"@"},template:'<\/span><\/span>',transclude:!0,link:function(t,i){t.validationSummary=[];var r=t.$parent.$watchCollection(function(){return n.messageArray(t.$parent,t.valmsgFor)},function(n){t.messages=n;n!==undefined&&(t.started=!0);t.started&&(n&&!Object.keys(n).length?(i.addClass("field-validation-valid"),i.removeClass("field-validation-error")):(i.removeClass("field-validation-valid"),i.addClass("field-validation-error")))});i.on("$destroy",function(){r()})}}}]).config(["validationProvider",function(n){function t(n){return n.substr(0,n.lastIndexOf(".")+1)}function i(n,t){return n.indexOf("*.")===0&&(n=n.replace("*.",t)),n}n.addValidator("required",function(n){return!!n});n.addValidator("regex",function(n,t){return!n||new RegExp(t.parameters.pattern).exec(n)});n.addValidator("email",function(n){return!n||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(n)});n.addValidator("creditcard",function(n){if(!n)return!0;if(/[^0-9 \-]+/.test(n))return!1;var u=0,t=0,r=!1,i,f;if(n=n.replace(/\D/g,""),n.length<13||n.length>19)return!1;for(i=n.length-1;i>=0;i--)f=n.charAt(i),t=parseInt(f,10),r&&(t*=2)>9&&(t-=9),u+=t,r=!r;return u%10==0});n.addValidator("date",function(n){return n?!/Invalid|NaN/.test(new Date(n).toString()):!0});n.addValidator("digits",function(n){return n?/^\d+$/.test(n):!0});n.addValidator("number",function(n){return n?/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(n):!0});n.addValidator("url",function(n){return n?/^(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(n):!0});n.addValidator("minlength",function(n,t){return n?n.length>=parseInt(t.parameters.min):!0});n.addValidator("maxlength",function(n,t){return n?n.length<=parseInt(t.parameters.max):!0});n.addValidator("length",function(n,t){return n?(!t.parameters.min||n.length>=parseInt(t.parameters.min))&&(!t.parameters.max||n.length<=parseInt(t.parameters.max)):!0});n.addValidator("range",function(n,t){if(!n)return!0;var i=parseFloat(n);return i<=parseFloat(t.parameters.max)&&i>=parseFloat(t.parameters.min)});n.addValidator("password",function(n,t){function i(n,t){var i=n.match(/\W/g);return i&&i.length>=t}return n?(!t.parameters.min||n.length>=t.parameters.min)&&(!t.parameters.nonalphamin||i(n,t.parameters.nonalphamin))&&(!t.parameters.regex||!!new RegExp(t.parameters.regex).exec(n)):!0});n.addValidator("equalto",function(n,r){var u=t(r.attributes.name),f=r.parameters.other,e=i(f,u),o=r.injected.validation.dataValue(r.scope,e);return o==n},["validation"]);n.addValidator("extension",function(n,t){if(!n)return!0;var i=typeof t.parameters.extension=="string"?t.parameters.extension.replace(/,/g,"|"):"png|jpe?g|gif";return n.match(new RegExp("\\.("+i+")$","i"))});n.addValidator("remote",function(n,r){var e,u,f;return(r.ngModel.remoteTimeout&&r.ngModel.remoteTimeout.resolve(),!n)?!0:(e=t(r.attributes.name),u={},u[r.attributes.name]=n,angular.forEach((r.parameters.additionalfields||"").split(","),function(n){var t=i(n,e);u[t]=r.injected.validation.dataValue(r.scope,t)}),f=r.injected.$q.defer(),r.ngModel.remoteTimeout=f,r.injected.$http({method:r.parameters.type,url:r.parameters.url,data:u,cache:!0,timeout:f.promise,responseType:"json"}).success(function(n){n!==!0&&n!=="true"&&r.fail(n)}),!0)},["validation","$http","$q"])}])})()