/* expressive.annotations.validate.js - v2.7.4
 * Client-side component of ExpressiveAnnotations - annotation-based conditional validation library.
 * https://github.com/jwaliszko/ExpressiveAnnotations
 *
 * Copyright (c) 2014 Jarosław Waliszko
 * Licensed MIT: http://opensource.org/licenses/MIT */
!function(e,t){"use strict";var n=t.ea,r=t.console,i={settings:{debug:!1,optimize:!0,enumsAsNumbers:!0,registerAllMethods:!1,dependencyTriggers:"change keyup",apply:function(t){!function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])}(i.settings,t),function(){if(!a.isBool(i.settings.debug))throw"EA settings error: debug value must be a boolean (true or false)";if(!a.isBool(i.settings.optimize))throw"EA settings error: optimize value must be a boolean (true or false)";if(!a.isBool(i.settings.enumsAsNumbers))throw"EA settings error: enumsAsNumbers value must be a boolean (true or false)";if(!a.isBool(i.settings.registerAllMethods))throw"EA settings error: registerAllMethods value must be a boolean (true or false)";if(!a.isString(i.settings.dependencyTriggers)&&null!==i.settings.dependencyTriggers&&void 0!==i.settings.dependencyTriggers)throw"EA settings error: dependencyTriggers value must be a string (multiple event types can be bound at once by including each one separated by a space), null or undefined"}(),e("form").each(function(){e(this).find("input, select, textarea").off(".expressive.annotations"),d.bindFields(this,!0)}),s.info(a.string.format("EA settings applied:\n{0}",t))}},addMethod:function(e,t){o.addMethod(e,t)},addValueParser:function(e,t){a.addValueParser(e,t)},noConflict:function(){return t.ea===this&&(t.ea=n),this}},s={info:function(e){i.settings.debug&&r&&"function"==typeof r.log&&r.log("[info] "+s.prep(e,new Date))},warn:function(e){r&&"function"==typeof r.warn&&r.warn("[warn] "+s.prep(e,new Date))},fail:function(e){r&&"function"==typeof r.error&&r.error("[fail] "+s.prep(e,new Date))},prep:function(e,t){var n=(e=a.string.tryParse(e)).split("\n"),r=(void 0!==t&&null!==t?"("+a.datetime.stamp(t)+"): ":"")+n.shift();return n.length>0?r+"\n"+a.string.indent(n.join("\n"),19):r}},o={methods:{},addMethod:function(e,t){var n=this.methods[e];this.methods[e]=function(){return t.length===arguments.length?t.apply(this,arguments):"function"==typeof n?n.apply(this,arguments):t.apply(this,arguments)}},registerMethods:function(e,t,n){var r,o,u;if(this.initialize(),i.settings.registerAllMethods){for(o in this.methods)if(this.methods.hasOwnProperty(o)){if(e.hasOwnProperty(o)){s.warn(a.string.format("Field {0} - skipping {1}(...) method registration, naming conflict with the field identifier.",n,o));continue}u=this.methods[o],e[o]=u}}else for(r=0;r<t.length;r++)o=t[r],this.methods.hasOwnProperty(o)&&(u=this.methods[o],e[o]=u)},initialize:function(){var t=this;this.addMethod("Now",function(){return Date.now()}),this.addMethod("Today",function(){return new Date((new Date).setHours(0,0,0,0)).getTime()}),this.addMethod("ToDate",function(e){return Date.parse(e)}),this.addMethod("Date",function(e,t,n){return new Date(new Date(e,t-1,n).setFullYear(e)).getTime()}),this.addMethod("Date",function(e,t,n,r,i,s){return new Date(new Date(e,t-1,n,r,i,s).setFullYear(e)).getTime()}),this.addMethod("TimeSpan",function(e,t,n,r){return 1e3*r+6e4*n+36e5*t+864e5*e}),this.addMethod("Length",function(e){return null!==e&&void 0!==e?e.length:0}),this.addMethod("Trim",function(t){return null!==t&&void 0!==t?e.trim(t):null}),this.addMethod("Concat",function(e,t){return[e,t].join("")}),this.addMethod("Concat",function(e,t,n){return[e,t,n].join("")}),this.addMethod("CompareOrdinal",function(e,t){return e===t?0:null!==e&&null===t?1:null===e&&null!==t?-1:e>t?1:-1}),this.addMethod("CompareOrdinalIgnoreCase",function(e,n){return e=null!==e&&void 0!==e?e.toLowerCase():null,n=null!==n&&void 0!==n?n.toLowerCase():null,t.methods.CompareOrdinal(e,n)}),this.addMethod("StartsWith",function(e,t){return null!==e&&void 0!==e&&null!==t&&void 0!==t&&e.slice(0,t.length)===t}),this.addMethod("StartsWithIgnoreCase",function(e,n){return e=null!==e&&void 0!==e?e.toLowerCase():null,n=null!==n&&void 0!==n?n.toLowerCase():null,t.methods.StartsWith(e,n)}),this.addMethod("EndsWith",function(e,t){return null!==e&&void 0!==e&&null!==t&&void 0!==t&&e.slice(-t.length)===t}),this.addMethod("EndsWithIgnoreCase",function(e,n){return e=null!==e&&void 0!==e?e.toLowerCase():null,n=null!==n&&void 0!==n?n.toLowerCase():null,t.methods.EndsWith(e,n)}),this.addMethod("Contains",function(e,t){return null!==e&&void 0!==e&&null!==t&&void 0!==t&&e.indexOf(t)>-1}),this.addMethod("ContainsIgnoreCase",function(e,n){return e=null!==e&&void 0!==e?e.toLowerCase():null,n=null!==n&&void 0!==n?n.toLowerCase():null,t.methods.Contains(e,n)}),this.addMethod("IsNullOrWhiteSpace",function(e){return null===e||!/\S/.test(e)}),this.addMethod("IsDigitChain",function(e){return/^[0-9]+$/.test(e)}),this.addMethod("IsNumber",function(e){return/^[+-]?(?:(?:[0-9]+)|(?:[0-9]+[eE][+-]?[0-9]+)|(?:[0-9]*\.[0-9]+(?:[eE][+-]?[0-9]+)?))$/.test(e)}),this.addMethod("IsEmail",function(e){return/^[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(e)}),this.addMethod("IsPhone",function(e){return/^(\+\s?)?((?!\+.*)\(\+?\d+([\s\-\.]?\d+)?\)|\d+)([\s\-\.]?(\(\d+([\s\-\.]?\d+)?\)|\d+))*(\s?(x|ext\.?)\s?\d+)?$/.test(e)}),this.addMethod("IsUrl",function(e){return/^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/i.test(e)}),this.addMethod("IsRegexMatch",function(e,t){return null!==e&&void 0!==e&&null!==t&&void 0!==t&&new RegExp(t).test(e)}),this.addMethod("Guid",function(e){var t=a.guid.tryParse(e);if(t.error)throw t.msg;return t}),this.addMethod("Min",function(e){if(0===arguments.length)throw"no arguments";if(1===arguments.length&&a.isArray(e)){if(0===e.length)throw"empty sequence";return Math.min.apply(null,e)}return Math.min.apply(null,arguments)}),this.addMethod("Max",function(e){if(0===arguments.length)throw"no arguments";if(1===arguments.length&&a.isArray(e)){if(0===e.length)throw"empty sequence";return Math.max.apply(null,e)}return Math.max.apply(null,arguments)}),this.addMethod("Sum",function(e){if(0===arguments.length)throw"no arguments";var t,n,r=0;if(1===arguments.length&&a.isArray(e)){if(0===e.length)throw"empty sequence";for(t=0,n=e.length;t<n;t++)r+=parseFloat(e[t]);return r}for(t=0,n=arguments.length;t<n;t++)r+=parseFloat(arguments[t]);return r}),this.addMethod("Average",function(e){if(0===arguments.length)throw"no arguments";var n,r,i=new Array;if(1===arguments.length&&a.isArray(e)){if(0===e.length)throw"empty sequence";return t.methods.Sum(e)/e.length}for(n=0,r=arguments.length;n<r;n++)i.push(arguments[n]);return t.methods.Sum(i)/arguments.length})}},a={parsers:{},addValueParser:function(t,n){e.each(t.split(/\s+/),function(e,t){/\S/.test(t)&&(a.parsers[t]=n)})},array:{contains:function(e,t){for(var n=e.length;n--;)if(e[n]===t)return!0;return!1}},object:{keys:function(e){var t,n=[];for(t in e)e.hasOwnProperty(t)&&n.push(t);return n},tryParse:function(t){try{return e.parseJSON(t)}catch(e){return{error:!0,msg:"Given value was not recognized as a valid JSON. "+e}}}},string:{format:function(e,t){function n(e){var t=function(e,t){return"function"==typeof t?"function(...) {...}":t};return i.settings.registerAllMethods&&(t=null),e=a.isObject(e)?JSON.stringify(e,t,4):e,e=a.isString(e)?e.replace(/\$/g,"$$$$"):e}function r(e,t,n){return e.replace(new RegExp("\\{"+n+"\\}","gm"),t)}var s;if(t instanceof Array){for(s=0;s<t.length;s++)e=r(e,n(t[s]),s);return e}for(s=0;s<arguments.length-1;s++)e=r(e,n(arguments[s+1]),s);return e},indent:function(e,t){var n=Array((t||0)+1).join(" ");return e.replace(/^/gm,n)},tryParse:function(e){return a.isString(e)?e:void 0!==e&&null!==e?e.toString():{error:!0,msg:"Given value was not recognized as a valid string."}}},bool:{tryParse:function(t){return a.isBool(t)?t:!a.isString(t)||"true"!==(t=e.trim(t).toLowerCase())&&"false"!==t?{error:!0,msg:"Given value was not recognized as a valid boolean."}:"true"===t}},number:{tryParse:function(e){return function(e){return a.isNumeric(parseFloat(e))&&isFinite(e)}(e)?parseFloat(e):{error:!0,msg:"Given value was not recognized as a valid number."}}},timespan:{tryParse:function(e){if(a.isTimeSpan(e)){var t=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/.exec(e),n="-"===t[1]?-1:1,r={days:a.number.tryParse(t[2]||0)*n,hours:a.number.tryParse(t[3]||0)*n,minutes:a.number.tryParse(t[4]||0)*n,seconds:a.number.tryParse(t[5]||0)*n,milliseconds:a.number.tryParse(t[6]||0)*n};return r.milliseconds+1e3*r.seconds+6e4*r.minutes+36e5*r.hours+864e5*r.days}return{error:!0,msg:"Given value was not recognized as a valid .NET style timespan string."}}},datetime:{stamp:function(e){function t(e){return("0"+e).slice(-2)}return t(e.getHours())+":"+t(e.getMinutes())+":"+t(e.getSeconds())},tryParse:function(e){if(a.isDate(e))return e.getTime();if(a.isString(e)){var t=Date.parse(e);if(a.isNumeric(t))return t}return{error:!0,msg:"Given value was not recognized as a valid RFC 2822 or ISO 8601 date."}}},guid:{tryParse:function(e){return a.isGuid(e)?e.toUpperCase():{error:!0,msg:"Given value was not recognized as a valid guid - guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)."}}},enumeration:{tryParse:function(e){return i.settings.enumsAsNumbers?a.number.tryParse(e):a.string.tryParse(e)}},isTimeSpan:function(e){return/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/.test(e)},isNumeric:function(e){return"number"==typeof e&&!isNaN(e)},isDate:function(e){return e instanceof Date},isObject:function(e){return"object"==typeof e||e instanceof Object},isString:function(e){return"string"==typeof e||e instanceof String},isBool:function(e){return"boolean"==typeof e||e instanceof Boolean},isGuid:function(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e)},isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},tryParse:function(e,t,n,r){var i;if(null!==r&&void 0!==r){if(!(i=a.findValueParser(n,r)).error)return i(e,n);s.warn(i.msg)}return i=a.findValueParser(n,t),i.error?a.tryAutoParse(e,t):(s.warn(a.string.format("Overridden {0} type parsing runs for {1} field. All fields of {0} type are going to be parsed using your value parser. If such a behavior is unintentional, change the name of your value parser to one, which does not indicate at {0} (or any other) type name.",t,n)),i(e,n))},tryAutoParse:function(e,t){return a.hasOwnProperty(t)?a[t].tryParse(e):a.object.tryParse(e)},findValueParser:function(e,t){var n=a.parsers[t];return"function"==typeof n?n:{error:!0,msg:a.string.format("Custom value parser {0} not found. Consider its registration with ea.addValueParser(), or remove redundant ValueParser attribute from {1} model field.",t,e)}}},u={getPrefix:function(e){return void 0!==e&&null!==e?e.substr(0,e.lastIndexOf(".")+1):""},extractValue:function(t,n,r,i,o){var u,d,l,f;if(d=r+n,0===(u=e(t).find(a.string.format(':input[name="{0}"]',d))).length)throw a.string.format("DOM field {0} not found.",d);if(null===(l=function(e){switch(e.attr("type")){case"checkbox":return e.length>2&&s.warn(a.string.format("DOM field {0} is ambiguous (unless custom value parser is provided).",e.attr("name"))),e.is(":checked");case"radio":return e.filter(":checked").val();default:return e.length>1&&s.warn(a.string.format("DOM field {0} is ambiguous (unless custom value parser is provided).",e.attr("name"))),e.val()}}(u))||void 0===l||""===l)return null;if(null!==(f=a.tryParse(l,i,d,o))&&void 0!==f&&f.error)throw a.string.format("DOM field {0} value conversion to {1} failed. {2}",d,i,f.msg);return f},deserializeObject:function(e,t,n,r,s,o){function a(e,t,n){var r,i,s,o,a,u,d;for(d=/^([a-z_0-9]+)\[([0-9]+)\]$/i,r=e.split("."),i=n,s=0;s<r.length-1;s++)e=r[s],(o=d.exec(e))?(e=o[1],a=o[2],i.hasOwnProperty(e)||(i[e]={}),i[e][a]=i[e][a]||{},i=i[e][a]):(i.hasOwnProperty(e)||(i[e]={}),i=i[e]);e=r[r.length-1];var l=d.exec(e);l?(u=l[1],a=l[2],i[u]=i[u]||[],i[u][a]=t):i[e]=t}var u,d,l,f={};for(u in t)t.hasOwnProperty(u)&&(d=t[u],l=s[u],a(u,this.extractValue(e,u,o,d,l),f));for(u in n)n.hasOwnProperty(u)&&a(u,n[u],f);for(u in r)r.hasOwnProperty(u)&&a(u,i.settings.enumsAsNumbers?r[u]:u.split(".").pop(),f);return f},adjustGivenValue:function(e,t,n){e="checkbox"===t.type?t.checked:e;var r=t.name.replace(n.prefix,""),i=n.parsersMap[r];if(null!==i&&void 0!==i){var o=a.findValueParser(t.name,i);if(!o.error)return o(e,t.name);s.warn(o.msg)}return e},ctxEval:function(e,t){return new Function("expression","context","with(context){return eval(expression)}")(e,t)}},d={referencesMap:[],collectReferences:function(e,t,n){var r,i;for(r=0;r<e.length;r++)(i=n+e[r])!==t&&(this.referencesMap[i]=this.referencesMap[i]||[],a.array.contains(this.referencesMap[i],t)||this.referencesMap[i].push(t))},validateReferences:function(t,n){var r,i,o,u;if(u=e(n).validate(),void 0!==(o=this.referencesMap[t])&&null!==o)for(s.info(a.string.format("Validation triggered for the following dependencies of {0} field:\n{1}.",t,o.join(", "))),r=o.length;r--;)0!==(i=e(n).find(a.string.format(':input[data-val][name="{0}"]',o[r])).not(u.settings.ignore)).length&&i.valid();else s.info(a.string.format("No fields dependent on {0} detected.",t))},bindFields:function(t,n){if(null!==i.settings.dependencyTriggers&&void 0!==i.settings.dependencyTriggers&&""!==i.settings.dependencyTriggers){var r=[];e.each(i.settings.dependencyTriggers.split(/\s+/),function(e,t){/\S/.test(t)&&r.push(a.string.format("{0}.expressive.annotations",t))}),e(t).find("input, select, textarea").not(function(t,r){var i=e(r).hasClass("ea-triggers-bound");return e(r).addClass("ea-triggers-bound"),!n&&i}).on(r.join(" "),function(n){var r=e(this).attr("name");s.info(a.string.format("Dependency validation trigger - {0} event, handled.",n.type)),d.validateReferences(r,t)})}}},l=function(t,n){var r={prefix:u.getPrefix(n.element.name),form:n.form};for(var i in n.params)n.params.hasOwnProperty(i)&&(r[i]=void 0!==n.params[i]?e.parseJSON(n.params[i]):{});n.message&&(n.messages[t]=function(e,t){var r,i,s,o;r=n.message;for(i in e.errFieldsMap)if(e.errFieldsMap.hasOwnProperty(i)){s=e.errFieldsMap[i],o=u.extractValue(e.form,i,e.prefix,"string",null);var a=new RegExp(s,"g");r=r.replace(a,o)}return r}),d.bindFields(n.form),d.collectReferences(a.object.keys(r.fieldsMap),n.element.name,r.prefix),n.rules[t]=r},f=function(e,t,n,r){if(void 0!==(t=u.adjustGivenValue(t,n,r))&&null!==t&&""!==t){var d=u.deserializeObject(r.form,r.fieldsMap,r.constsMap,r.enumsMap,r.parsersMap,r.prefix);o.registerMethods(d,r.methodsList,n.name);s.info(a.string.format("Field {0} - {1} expression:\n[{2}]\nto be executed within the following context{3}:\n{4}",n.name,e,r.expression,i.settings.registerAllMethods?" (methods not shown)":"",d));var l=u.ctxEval(r.expression,d);return{valid:l,condition:l}}return{valid:!0,condition:void 0}},c=function(e,t,n,r){t=u.adjustGivenValue(t,n,r);var d,l=void 0,f="Field {0} - {1} expression:\n[{2}]\nto be executed within the following context{3}:\n{4}";return i.settings.optimize||(d=u.deserializeObject(r.form,r.fieldsMap,r.constsMap,r.enumsMap,r.parsersMap,r.prefix),o.registerMethods(d,r.methodsList,n.name),s.info(a.string.format(f,n.name,e,r.expression,i.settings.registerAllMethods?" (methods not shown)":"",d)),l=u.ctxEval(r.expression,d)),void 0===t||null===t||""===t||!/\S/.test(t)&&!r.allowEmpty?void 0!==l?{valid:!l,condition:l}:(d=u.deserializeObject(r.form,r.fieldsMap,r.constsMap,r.enumsMap,r.parsersMap,r.prefix),o.registerMethods(d,r.methodsList,n.name),s.info(a.string.format(f,n.name,e,r.expression,i.settings.registerAllMethods?" (methods not shown)":"",d)),l=u.ctxEval(r.expression,d),{valid:!l,condition:l}):{valid:!0,condition:l}},h=" abcdefghijklmnopqrstuvwxyz";e.each(h.split(""),function(){var t=a.string.format("requiredif{0}",e.trim(this));e.validator.unobtrusive.adapters.add(t,["expression","fieldsMap","constsMap","enumsMap","methodsList","parsersMap","errFieldsMap","allowEmpty"],function(e){l(t,e)})}),e.each(h.split(""),function(){var t=a.string.format("assertthat{0}",e.trim(this));e.validator.unobtrusive.adapters.add(t,["expression","fieldsMap","constsMap","enumsMap","methodsList","parsersMap","errFieldsMap"],function(e){l(t,e)})}),e.each(h.split(""),function(){var t=e.trim(this),n=a.string.format("assertthat{0}",t);e.validator.addMethod(n,function(t,r,i){try{var o=f(n,t,r,i);return s.info(a.string.format("Field {0} - {1} outcome: {2}, assertion {3}.",r.name,n,void 0===o.condition?"assertion expression computation redundant":o.condition?"expression true":"expression false",o.valid?"satisfied":"not satisfied")),e(r).trigger("eavalid",["assertthat",o.valid,i.expression]),o.valid}catch(e){s.fail(e)}},"")}),e.each(h.split(""),function(){var t=e.trim(this),n=a.string.format("requiredif{0}",t);e.validator.addMethod(n,function(r,i,o){try{var u=c(n,r,i,o);return s.info(a.string.format("Field {0} - {1} outcome: {2}, requirement {3}.",i.name,n,void 0===u.condition?"requirement expression computation redundant":u.condition?"required":"not required",u.valid?"satisfied":"not satisfied")),e(i).trigger("eavalid",["requiredif",u.valid,o.expression,u.condition,h.indexOf(t)]),u.valid}catch(e){s.fail(e)}},"")}),t.ea=i}(jQuery,window);
