History

ModbusAdapters: Fixed security issues in Modbus configuration screen GSF.Web: Cleaned up new embedded resources

J. Ritchie Carroll committed 9 years ago

Commit 970956d1 parent 230686d36 files · +72369 −1648Browse files

Showing the changes to Source/Libraries/Adapters/ModbusAdapters/Scripts (3 of 36 files). Show all

Unified · Split

3 files
  1. Source/Libraries/Adapters/ModbusAdapters/Scripts/knockout-3.4.0.js +0 −123
  2. Source/Libraries/Adapters/ModbusAdapters/Scripts/knockout.mapping-latest.js +0 −21
  3. Source/Libraries/Adapters/ModbusAdapters/Scripts/knockout.validation.js +0 −1511
Source/Libraries/Adapters/ModbusAdapters/Scripts/knockout-3.4.0.js+0−123
@@ -1,123 +0,0 @@
1/*!
2 * Knockout JavaScript library v3.4.0
3 * (c) Steven Sanderson - http://knockoutjs.com/
4 * License: MIT (http://www.opensource.org/licenses/mit-license.php)
5 */
6
7(function() {(function(n){var x=this||(0,eval)("this"),u=x.document,M=x.navigator,v=x.jQuery,F=x.JSON;(function(n){"function"===typeof define&&define.amd?define(["exports","require"],n):"object"===typeof exports&&"object"===typeof module?n(module.exports||exports):n(x.ko={})})(function(N,O){function J(a,c){return null===a||typeof a in T?a===c:!1}function U(b,c){var d;return function(){d||(d=a.a.setTimeout(function(){d=n;b()},c))}}function V(b,c){var d;return function(){clearTimeout(d);d=a.a.setTimeout(b,c)}}function W(a,
8c){c&&c!==I?"beforeChange"===c?this.Kb(a):this.Ha(a,c):this.Lb(a)}function X(a,c){null!==c&&c.k&&c.k()}function Y(a,c){var d=this.Hc,e=d[s];e.R||(this.lb&&this.Ma[c]?(d.Pb(c,a,this.Ma[c]),this.Ma[c]=null,--this.lb):e.r[c]||d.Pb(c,a,e.s?{ia:a}:d.uc(a)))}function K(b,c,d,e){a.d[b]={init:function(b,g,k,l,m){var h,r;a.m(function(){var q=a.a.c(g()),p=!d!==!q,A=!r;if(A||c||p!==h)A&&a.va.Aa()&&(r=a.a.ua(a.f.childNodes(b),!0)),p?(A||a.f.da(b,a.a.ua(r)),a.eb(e?e(m,q):m,b)):a.f.xa(b),h=p},null,{i:b});return{controlsDescendantBindings:!0}}};
9a.h.ta[b]=!1;a.f.Z[b]=!0}var a="undefined"!==typeof N?N:{};a.b=function(b,c){for(var d=b.split("."),e=a,f=0;f<d.length-1;f++)e=e[d[f]];e[d[d.length-1]]=c};a.G=function(a,c,d){a[c]=d};a.version="3.4.0";a.b("version",a.version);a.options={deferUpdates:!1,useOnlyNativeEvents:!1};a.a=function(){function b(a,b){for(var c in a)a.hasOwnProperty(c)&&b(c,a[c])}function c(a,b){if(b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function d(a,b){a.__proto__=b;return a}function e(b,c,d,e){var h=b[c].match(r)||
10[];a.a.q(d.match(r),function(b){a.a.pa(h,b,e)});b[c]=h.join(" ")}var f={__proto__:[]}instanceof Array,g="function"===typeof Symbol,k={},l={};k[M&&/Firefox\/2/i.test(M.userAgent)?"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"];k.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" ");b(k,function(a,b){if(b.length)for(var c=0,d=b.length;c<d;c++)l[b[c]]=a});var m={propertychange:!0},h=u&&function(){for(var a=3,b=u.createElement("div"),c=
11b.getElementsByTagName("i");b.innerHTML="\x3c!--[if gt IE "+ ++a+"]><i></i><![endif]--\x3e",c[0];);return 4<a?a:n}(),r=/\S+/g;return{cc:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],q:function(a,b){for(var c=0,d=a.length;c<d;c++)b(a[c],c)},o:function(a,b){if("function"==typeof Array.prototype.indexOf)return Array.prototype.indexOf.call(a,b);for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},Sb:function(a,b,c){for(var d=0,e=a.length;d<e;d++)if(b.call(c,a[d],d))return a[d];
12return null},La:function(b,c){var d=a.a.o(b,c);0<d?b.splice(d,1):0===d&&b.shift()},Tb:function(b){b=b||[];for(var c=[],d=0,e=b.length;d<e;d++)0>a.a.o(c,b[d])&&c.push(b[d]);return c},fb:function(a,b){a=a||[];for(var c=[],d=0,e=a.length;d<e;d++)c.push(b(a[d],d));return c},Ka:function(a,b){a=a||[];for(var c=[],d=0,e=a.length;d<e;d++)b(a[d],d)&&c.push(a[d]);return c},ra:function(a,b){if(b instanceof Array)a.push.apply(a,b);else for(var c=0,d=b.length;c<d;c++)a.push(b[c]);return a},pa:function(b,c,d){var e=
13a.a.o(a.a.zb(b),c);0>e?d&&b.push(c):d||b.splice(e,1)},ka:f,extend:c,Xa:d,Ya:f?d:c,D:b,Ca:function(a,b){if(!a)return a;var c={},d;for(d in a)a.hasOwnProperty(d)&&(c[d]=b(a[d],d,a));return c},ob:function(b){for(;b.firstChild;)a.removeNode(b.firstChild)},jc:function(b){b=a.a.V(b);for(var c=(b[0]&&b[0].ownerDocument||u).createElement("div"),d=0,e=b.length;d<e;d++)c.appendChild(a.$(b[d]));return c},ua:function(b,c){for(var d=0,e=b.length,h=[];d<e;d++){var m=b[d].cloneNode(!0);h.push(c?a.$(m):m)}return h},
14da:function(b,c){a.a.ob(b);if(c)for(var d=0,e=c.length;d<e;d++)b.appendChild(c[d])},qc:function(b,c){var d=b.nodeType?[b]:b;if(0<d.length){for(var e=d[0],h=e.parentNode,m=0,l=c.length;m<l;m++)h.insertBefore(c[m],e);m=0;for(l=d.length;m<l;m++)a.removeNode(d[m])}},za:function(a,b){if(a.length){for(b=8===b.nodeType&&b.parentNode||b;a.length&&a[0].parentNode!==b;)a.splice(0,1);for(;1<a.length&&a[a.length-1].parentNode!==b;)a.length--;if(1<a.length){var c=a[0],d=a[a.length-1];for(a.length=0;c!==d;)a.push(c),
15c=c.nextSibling;a.push(d)}}return a},sc:function(a,b){7>h?a.setAttribute("selected",b):a.selected=b},$a:function(a){return null===a||a===n?"":a.trim?a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},nd:function(a,b){a=a||"";return b.length>a.length?!1:a.substring(0,b.length)===b},Mc:function(a,b){if(a===b)return!0;if(11===a.nodeType)return!1;if(b.contains)return b.contains(3===a.nodeType?a.parentNode:a);if(b.compareDocumentPosition)return 16==(b.compareDocumentPosition(a)&16);for(;a&&a!=
16b;)a=a.parentNode;return!!a},nb:function(b){return a.a.Mc(b,b.ownerDocument.documentElement)},Qb:function(b){return!!a.a.Sb(b,a.a.nb)},A:function(a){return a&&a.tagName&&a.tagName.toLowerCase()},Wb:function(b){return a.onError?function(){try{return b.apply(this,arguments)}catch(c){throw a.onError&&a.onError(c),c;}}:b},setTimeout:function(b,c){return setTimeout(a.a.Wb(b),c)},$b:function(b){setTimeout(function(){a.onError&&a.onError(b);throw b;},0)},p:function(b,c,d){var e=a.a.Wb(d);d=h&&m[c];if(a.options.useOnlyNativeEvents||
17d||!v)if(d||"function"!=typeof b.addEventListener)if("undefined"!=typeof b.attachEvent){var l=function(a){e.call(b,a)},f="on"+c;b.attachEvent(f,l);a.a.F.oa(b,function(){b.detachEvent(f,l)})}else throw Error("Browser doesn't support addEventListener or attachEvent");else b.addEventListener(c,e,!1);else v(b).bind(c,e)},Da:function(b,c){if(!b||!b.nodeType)throw Error("element must be a DOM node when calling triggerEvent");var d;"input"===a.a.A(b)&&b.type&&"click"==c.toLowerCase()?(d=b.type,d="checkbox"==
18d||"radio"==d):d=!1;if(a.options.useOnlyNativeEvents||!v||d)if("function"==typeof u.createEvent)if("function"==typeof b.dispatchEvent)d=u.createEvent(l[c]||"HTMLEvents"),d.initEvent(c,!0,!0,x,0,0,0,0,0,!1,!1,!1,!1,0,b),b.dispatchEvent(d);else throw Error("The supplied element doesn't support dispatchEvent");else if(d&&b.click)b.click();else if("undefined"!=typeof b.fireEvent)b.fireEvent("on"+c);else throw Error("Browser doesn't support triggering events");else v(b).trigger(c)},c:function(b){return a.H(b)?
19b():b},zb:function(b){return a.H(b)?b.t():b},bb:function(b,c,d){var h;c&&("object"===typeof b.classList?(h=b.classList[d?"add":"remove"],a.a.q(c.match(r),function(a){h.call(b.classList,a)})):"string"===typeof b.className.baseVal?e(b.className,"baseVal",c,d):e(b,"className",c,d))},Za:function(b,c){var d=a.a.c(c);if(null===d||d===n)d="";var e=a.f.firstChild(b);!e||3!=e.nodeType||a.f.nextSibling(e)?a.f.da(b,[b.ownerDocument.createTextNode(d)]):e.data=d;a.a.Rc(b)},rc:function(a,b){a.name=b;if(7>=h)try{a.mergeAttributes(u.createElement("<input name='"+
20a.name+"'/>"),!1)}catch(c){}},Rc:function(a){9<=h&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},Nc:function(a){if(h){var b=a.style.width;a.style.width=0;a.style.width=b}},hd:function(b,c){b=a.a.c(b);c=a.a.c(c);for(var d=[],e=b;e<=c;e++)d.push(e);return d},V:function(a){for(var b=[],c=0,d=a.length;c<d;c++)b.push(a[c]);return b},Yb:function(a){return g?Symbol(a):a},rd:6===h,sd:7===h,C:h,ec:function(b,c){for(var d=a.a.V(b.getElementsByTagName("input")).concat(a.a.V(b.getElementsByTagName("textarea"))),
21e="string"==typeof c?function(a){return a.name===c}:function(a){return c.test(a.name)},h=[],m=d.length-1;0<=m;m--)e(d[m])&&h.push(d[m]);return h},ed:function(b){return"string"==typeof b&&(b=a.a.$a(b))?F&&F.parse?F.parse(b):(new Function("return "+b))():null},Eb:function(b,c,d){if(!F||!F.stringify)throw Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");
22return F.stringify(a.a.c(b),c,d)},fd:function(c,d,e){e=e||{};var h=e.params||{},m=e.includeFields||this.cc,l=c;if("object"==typeof c&&"form"===a.a.A(c))for(var l=c.action,f=m.length-1;0<=f;f--)for(var g=a.a.ec(c,m[f]),k=g.length-1;0<=k;k--)h[g[k].name]=g[k].value;d=a.a.c(d);var r=u.createElement("form");r.style.display="none";r.action=l;r.method="post";for(var n in d)c=u.createElement("input"),c.type="hidden",c.name=n,c.value=a.a.Eb(a.a.c(d[n])),r.appendChild(c);b(h,function(a,b){var c=u.createElement("input");
23c.type="hidden";c.name=a;c.value=b;r.appendChild(c)});u.body.appendChild(r);e.submitter?e.submitter(r):r.submit();setTimeout(function(){r.parentNode.removeChild(r)},0)}}}();a.b("utils",a.a);a.b("utils.arrayForEach",a.a.q);a.b("utils.arrayFirst",a.a.Sb);a.b("utils.arrayFilter",a.a.Ka);a.b("utils.arrayGetDistinctValues",a.a.Tb);a.b("utils.arrayIndexOf",a.a.o);a.b("utils.arrayMap",a.a.fb);a.b("utils.arrayPushAll",a.a.ra);a.b("utils.arrayRemoveItem",a.a.La);a.b("utils.extend",a.a.extend);a.b("utils.fieldsIncludedWithJsonPost",
24a.a.cc);a.b("utils.getFormFields",a.a.ec);a.b("utils.peekObservable",a.a.zb);a.b("utils.postJson",a.a.fd);a.b("utils.parseJson",a.a.ed);a.b("utils.registerEventHandler",a.a.p);a.b("utils.stringifyJson",a.a.Eb);a.b("utils.range",a.a.hd);a.b("utils.toggleDomNodeCssClass",a.a.bb);a.b("utils.triggerEvent",a.a.Da);a.b("utils.unwrapObservable",a.a.c);a.b("utils.objectForEach",a.a.D);a.b("utils.addOrRemoveItem",a.a.pa);a.b("utils.setTextContent",a.a.Za);a.b("unwrap",a.a.c);Function.prototype.bind||(Function.prototype.bind=
25function(a){var c=this;if(1===arguments.length)return function(){return c.apply(a,arguments)};var d=Array.prototype.slice.call(arguments,1);return function(){var e=d.slice(0);e.push.apply(e,arguments);return c.apply(a,e)}});a.a.e=new function(){function a(b,g){var k=b[d];if(!k||"null"===k||!e[k]){if(!g)return n;k=b[d]="ko"+c++;e[k]={}}return e[k]}var c=0,d="__ko__"+(new Date).getTime(),e={};return{get:function(c,d){var e=a(c,!1);return e===n?n:e[d]},set:function(c,d,e){if(e!==n||a(c,!1)!==n)a(c,!0)[d]=
26e},clear:function(a){var b=a[d];return b?(delete e[b],a[d]=null,!0):!1},I:function(){return c++ +d}}};a.b("utils.domData",a.a.e);a.b("utils.domData.clear",a.a.e.clear);a.a.F=new function(){function b(b,c){var e=a.a.e.get(b,d);e===n&&c&&(e=[],a.a.e.set(b,d,e));return e}function c(d){var e=b(d,!1);if(e)for(var e=e.slice(0),l=0;l<e.length;l++)e[l](d);a.a.e.clear(d);a.a.F.cleanExternalData(d);if(f[d.nodeType])for(e=d.firstChild;d=e;)e=d.nextSibling,8===d.nodeType&&c(d)}var d=a.a.e.I(),e={1:!0,8:!0,9:!0},
27f={1:!0,9:!0};return{oa:function(a,c){if("function"!=typeof c)throw Error("Callback must be a function");b(a,!0).push(c)},pc:function(c,e){var l=b(c,!1);l&&(a.a.La(l,e),0==l.length&&a.a.e.set(c,d,n))},$:function(b){if(e[b.nodeType]&&(c(b),f[b.nodeType])){var d=[];a.a.ra(d,b.getElementsByTagName("*"));for(var l=0,m=d.length;l<m;l++)c(d[l])}return b},removeNode:function(b){a.$(b);b.parentNode&&b.parentNode.removeChild(b)},cleanExternalData:function(a){v&&"function"==typeof v.cleanData&&v.cleanData([a])}}};
28a.$=a.a.F.$;a.removeNode=a.a.F.removeNode;a.b("cleanNode",a.$);a.b("removeNode",a.removeNode);a.b("utils.domNodeDisposal",a.a.F);a.b("utils.domNodeDisposal.addDisposeCallback",a.a.F.oa);a.b("utils.domNodeDisposal.removeDisposeCallback",a.a.F.pc);(function(){var b=[0,"",""],c=[1,"<table>","</table>"],d=[3,"<table><tbody><tr>","</tr></tbody></table>"],e=[1,"<select multiple='multiple'>","</select>"],f={thead:c,tbody:c,tfoot:c,tr:[2,"<table><tbody>","</tbody></table>"],td:d,th:d,option:e,optgroup:e},
29g=8>=a.a.C;a.a.ma=function(c,d){var e;if(v)if(v.parseHTML)e=v.parseHTML(c,d)||[];else{if((e=v.clean([c],d))&&e[0]){for(var h=e[0];h.parentNode&&11!==h.parentNode.nodeType;)h=h.parentNode;h.parentNode&&h.parentNode.removeChild(h)}}else{(e=d)||(e=u);var h=e.parentWindow||e.defaultView||x,r=a.a.$a(c).toLowerCase(),q=e.createElement("div"),p;p=(r=r.match(/^<([a-z]+)[ >]/))&&f[r[1]]||b;r=p[0];p="ignored<div>"+p[1]+c+p[2]+"</div>";"function"==typeof h.innerShiv?q.appendChild(h.innerShiv(p)):(g&&e.appendChild(q),
30q.innerHTML=p,g&&q.parentNode.removeChild(q));for(;r--;)q=q.lastChild;e=a.a.V(q.lastChild.childNodes)}return e};a.a.Cb=function(b,c){a.a.ob(b);c=a.a.c(c);if(null!==c&&c!==n)if("string"!=typeof c&&(c=c.toString()),v)v(b).html(c);else for(var d=a.a.ma(c,b.ownerDocument),e=0;e<d.length;e++)b.appendChild(d[e])}})();a.b("utils.parseHtmlFragment",a.a.ma);a.b("utils.setHtml",a.a.Cb);a.M=function(){function b(c,e){if(c)if(8==c.nodeType){var f=a.M.lc(c.nodeValue);null!=f&&e.push({Lc:c,cd:f})}else if(1==c.nodeType)for(var f=
310,g=c.childNodes,k=g.length;f<k;f++)b(g[f],e)}var c={};return{wb:function(a){if("function"!=typeof a)throw Error("You can only pass a function to ko.memoization.memoize()");var b=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);c[b]=a;return"\x3c!--[ko_memo:"+b+"]--\x3e"},xc:function(a,b){var f=c[a];if(f===n)throw Error("Couldn't find any memo with ID "+a+". Perhaps it's already been unmemoized.");try{return f.apply(null,b||[]),
32!0}finally{delete c[a]}},yc:function(c,e){var f=[];b(c,f);for(var g=0,k=f.length;g<k;g++){var l=f[g].Lc,m=[l];e&&a.a.ra(m,e);a.M.xc(f[g].cd,m);l.nodeValue="";l.parentNode&&l.parentNode.removeChild(l)}},lc:function(a){return(a=a.match(/^\[ko_memo\:(.*?)\]$/))?a[1]:null}}}();a.b("memoization",a.M);a.b("memoization.memoize",a.M.wb);a.b("memoization.unmemoize",a.M.xc);a.b("memoization.parseMemoText",a.M.lc);a.b("memoization.unmemoizeDomNodeAndDescendants",a.M.yc);a.Y=function(){function b(){if(e)for(var b=
33e,c=0,m;g<e;)if(m=d[g++]){if(g>b){if(5E3<=++c){g=e;a.a.$b(Error("'Too much recursion' after processing "+c+" task groups."));break}b=e}try{m()}catch(h){a.a.$b(h)}}}function c(){b();g=e=d.length=0}var d=[],e=0,f=1,g=0;return{scheduler:x.MutationObserver?function(a){var b=u.createElement("div");(new MutationObserver(a)).observe(b,{attributes:!0});return function(){b.classList.toggle("foo")}}(c):u&&"onreadystatechange"in u.createElement("script")?function(a){var b=u.createElement("script");b.onreadystatechange=
34function(){b.onreadystatechange=null;u.documentElement.removeChild(b);b=null;a()};u.documentElement.appendChild(b)}:function(a){setTimeout(a,0)},Wa:function(b){e||a.Y.scheduler(c);d[e++]=b;return f++},cancel:function(a){a-=f-e;a>=g&&a<e&&(d[a]=null)},resetForTesting:function(){var a=e-g;g=e=d.length=0;return a},md:b}}();a.b("tasks",a.Y);a.b("tasks.schedule",a.Y.Wa);a.b("tasks.runEarly",a.Y.md);a.ya={throttle:function(b,c){b.throttleEvaluation=c;var d=null;return a.B({read:b,write:function(e){clearTimeout(d);
35d=a.a.setTimeout(function(){b(e)},c)}})},rateLimit:function(a,c){var d,e,f;"number"==typeof c?d=c:(d=c.timeout,e=c.method);a.cb=!1;f="notifyWhenChangesStop"==e?V:U;a.Ta(function(a){return f(a,d)})},deferred:function(b,c){if(!0!==c)throw Error("The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.");b.cb||(b.cb=!0,b.Ta(function(c){var e;return function(){a.Y.cancel(e);e=a.Y.Wa(c);b.notifySubscribers(n,"dirty")}}))},notify:function(a,c){a.equalityComparer=
36"always"==c?null:J}};var T={undefined:1,"boolean":1,number:1,string:1};a.b("extenders",a.ya);a.vc=function(b,c,d){this.ia=b;this.gb=c;this.Kc=d;this.R=!1;a.G(this,"dispose",this.k)};a.vc.prototype.k=function(){this.R=!0;this.Kc()};a.J=function(){a.a.Ya(this,D);D.rb(this)};var I="change",D={rb:function(a){a.K={};a.Nb=1},X:function(b,c,d){var e=this;d=d||I;var f=new a.vc(e,c?b.bind(c):b,function(){a.a.La(e.K[d],f);e.Ia&&e.Ia(d)});e.sa&&e.sa(d);e.K[d]||(e.K[d]=[]);e.K[d].push(f);return f},notifySubscribers:function(b,
37c){c=c||I;c===I&&this.zc();if(this.Pa(c))try{a.l.Ub();for(var d=this.K[c].slice(0),e=0,f;f=d[e];++e)f.R||f.gb(b)}finally{a.l.end()}},Na:function(){return this.Nb},Uc:function(a){return this.Na()!==a},zc:function(){++this.Nb},Ta:function(b){var c=this,d=a.H(c),e,f,g;c.Ha||(c.Ha=c.notifySubscribers,c.notifySubscribers=W);var k=b(function(){c.Mb=!1;d&&g===c&&(g=c());e=!1;c.tb(f,g)&&c.Ha(f=g)});c.Lb=function(a){c.Mb=e=!0;g=a;k()};c.Kb=function(a){e||(f=a,c.Ha(a,"beforeChange"))}},Pa:function(a){return this.K[a]&&
38this.K[a].length},Sc:function(b){if(b)return this.K[b]&&this.K[b].length||0;var c=0;a.a.D(this.K,function(a,b){"dirty"!==a&&(c+=b.length)});return c},tb:function(a,c){return!this.equalityComparer||!this.equalityComparer(a,c)},extend:function(b){var c=this;b&&a.a.D(b,function(b,e){var f=a.ya[b];"function"==typeof f&&(c=f(c,e)||c)});return c}};a.G(D,"subscribe",D.X);a.G(D,"extend",D.extend);a.G(D,"getSubscriptionsCount",D.Sc);a.a.ka&&a.a.Xa(D,Function.prototype);a.J.fn=D;a.hc=function(a){return null!=
39a&&"function"==typeof a.X&&"function"==typeof a.notifySubscribers};a.b("subscribable",a.J);a.b("isSubscribable",a.hc);a.va=a.l=function(){function b(a){d.push(e);e=a}function c(){e=d.pop()}var d=[],e,f=0;return{Ub:b,end:c,oc:function(b){if(e){if(!a.hc(b))throw Error("Only subscribable things can act as dependencies");e.gb.call(e.Gc,b,b.Cc||(b.Cc=++f))}},w:function(a,d,e){try{return b(),a.apply(d,e||[])}finally{c()}},Aa:function(){if(e)return e.m.Aa()},Sa:function(){if(e)return e.Sa}}}();a.b("computedContext",
40a.va);a.b("computedContext.getDependenciesCount",a.va.Aa);a.b("computedContext.isInitial",a.va.Sa);a.b("ignoreDependencies",a.qd=a.l.w);var E=a.a.Yb("_latestValue");a.N=function(b){function c(){if(0<arguments.length)return c.tb(c[E],arguments[0])&&(c.ga(),c[E]=arguments[0],c.fa()),this;a.l.oc(c);return c[E]}c[E]=b;a.a.ka||a.a.extend(c,a.J.fn);a.J.fn.rb(c);a.a.Ya(c,B);a.options.deferUpdates&&a.ya.deferred(c,!0);return c};var B={equalityComparer:J,t:function(){return this[E]},fa:function(){this.notifySubscribers(this[E])},
41ga:function(){this.notifySubscribers(this[E],"beforeChange")}};a.a.ka&&a.a.Xa(B,a.J.fn);var H=a.N.gd="__ko_proto__";B[H]=a.N;a.Oa=function(b,c){return null===b||b===n||b[H]===n?!1:b[H]===c?!0:a.Oa(b[H],c)};a.H=function(b){return a.Oa(b,a.N)};a.Ba=function(b){return"function"==typeof b&&b[H]===a.N||"function"==typeof b&&b[H]===a.B&&b.Vc?!0:!1};a.b("observable",a.N);a.b("isObservable",a.H);a.b("isWriteableObservable",a.Ba);a.b("isWritableObservable",a.Ba);a.b("observable.fn",B);a.G(B,"peek",B.t);a.G(B,
42"valueHasMutated",B.fa);a.G(B,"valueWillMutate",B.ga);a.la=function(b){b=b||[];if("object"!=typeof b||!("length"in b))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");b=a.N(b);a.a.Ya(b,a.la.fn);return b.extend({trackArrayChanges:!0})};a.la.fn={remove:function(b){for(var c=this.t(),d=[],e="function"!=typeof b||a.H(b)?function(a){return a===b}:b,f=0;f<c.length;f++){var g=c[f];e(g)&&(0===d.length&&this.ga(),d.push(g),c.splice(f,1),f--)}d.length&&
43this.fa();return d},removeAll:function(b){if(b===n){var c=this.t(),d=c.slice(0);this.ga();c.splice(0,c.length);this.fa();return d}return b?this.remove(function(c){return 0<=a.a.o(b,c)}):[]},destroy:function(b){var c=this.t(),d="function"!=typeof b||a.H(b)?function(a){return a===b}:b;this.ga();for(var e=c.length-1;0<=e;e--)d(c[e])&&(c[e]._destroy=!0);this.fa()},destroyAll:function(b){return b===n?this.destroy(function(){return!0}):b?this.destroy(function(c){return 0<=a.a.o(b,c)}):[]},indexOf:function(b){var c=
44this();return a.a.o(c,b)},replace:function(a,c){var d=this.indexOf(a);0<=d&&(this.ga(),this.t()[d]=c,this.fa())}};a.a.ka&&a.a.Xa(a.la.fn,a.N.fn);a.a.q("pop push reverse shift sort splice unshift".split(" "),function(b){a.la.fn[b]=function(){var a=this.t();this.ga();this.Vb(a,b,arguments);var d=a[b].apply(a,arguments);this.fa();return d===a?this:d}});a.a.q(["slice"],function(b){a.la.fn[b]=function(){var a=this();return a[b].apply(a,arguments)}});a.b("observableArray",a.la);a.ya.trackArrayChanges=function(b,
45c){function d(){if(!e){e=!0;var c=b.notifySubscribers;b.notifySubscribers=function(a,b){b&&b!==I||++k;return c.apply(this,arguments)};var d=[].concat(b.t()||[]);f=null;g=b.X(function(c){c=[].concat(c||[]);if(b.Pa("arrayChange")){var e;if(!f||1<k)f=a.a.ib(d,c,b.hb);e=f}d=c;f=null;k=0;e&&e.length&&b.notifySubscribers(e,"arrayChange")})}}b.hb={};c&&"object"==typeof c&&a.a.extend(b.hb,c);b.hb.sparse=!0;if(!b.Vb){var e=!1,f=null,g,k=0,l=b.sa,m=b.Ia;b.sa=function(a){l&&l.call(b,a);"arrayChange"===a&&d()};
46b.Ia=function(a){m&&m.call(b,a);"arrayChange"!==a||b.Pa("arrayChange")||(g.k(),e=!1)};b.Vb=function(b,c,d){function m(a,b,c){return l[l.length]={status:a,value:b,index:c}}if(e&&!k){var l=[],g=b.length,t=d.length,G=0;switch(c){case "push":G=g;case "unshift":for(c=0;c<t;c++)m("added",d[c],G+c);break;case "pop":G=g-1;case "shift":g&&m("deleted",b[G],G);break;case "splice":c=Math.min(Math.max(0,0>d[0]?g+d[0]:d[0]),g);for(var g=1===t?g:Math.min(c+(d[1]||0),g),t=c+t-2,G=Math.max(g,t),P=[],n=[],Q=2;c<G;++c,
47++Q)c<g&&n.push(m("deleted",b[c],c)),c<t&&P.push(m("added",d[Q],c));a.a.dc(n,P);break;default:return}f=l}}}};var s=a.a.Yb("_state");a.m=a.B=function(b,c,d){function e(){if(0<arguments.length){if("function"===typeof f)f.apply(g.pb,arguments);else throw Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");return this}a.l.oc(e);(g.S||g.s&&e.Qa())&&e.aa();return g.T}"object"===typeof b?d=b:(d=d||{},b&&(d.read=
48b));if("function"!=typeof d.read)throw Error("Pass a function that returns the value of the ko.computed");var f=d.write,g={T:n,S:!0,Ra:!1,Fb:!1,R:!1,Va:!1,s:!1,jd:d.read,pb:c||d.owner,i:d.disposeWhenNodeIsRemoved||d.i||null,wa:d.disposeWhen||d.wa,mb:null,r:{},L:0,bc:null};e[s]=g;e.Vc="function"===typeof f;a.a.ka||a.a.extend(e,a.J.fn);a.J.fn.rb(e);a.a.Ya(e,z);d.pure?(g.Va=!0,g.s=!0,a.a.extend(e,$)):d.deferEvaluation&&a.a.extend(e,aa);a.options.deferUpdates&&a.ya.deferred(e,!0);g.i&&(g.Fb=!0,g.i.nodeType||
49(g.i=null));g.s||d.deferEvaluation||e.aa();g.i&&e.ba()&&a.a.F.oa(g.i,g.mb=function(){e.k()});return e};var z={equalityComparer:J,Aa:function(){return this[s].L},Pb:function(a,c,d){if(this[s].Va&&c===this)throw Error("A 'pure' computed must not be called recursively");this[s].r[a]=d;d.Ga=this[s].L++;d.na=c.Na()},Qa:function(){var a,c,d=this[s].r;for(a in d)if(d.hasOwnProperty(a)&&(c=d[a],c.ia.Uc(c.na)))return!0},bd:function(){this.Fa&&!this[s].Ra&&this.Fa()},ba:function(){return this[s].S||0<this[s].L},
50ld:function(){this.Mb||this.ac()},uc:function(a){if(a.cb&&!this[s].i){var c=a.X(this.bd,this,"dirty"),d=a.X(this.ld,this);return{ia:a,k:function(){c.k();d.k()}}}return a.X(this.ac,this)},ac:function(){var b=this,c=b.throttleEvaluation;c&&0<=c?(clearTimeout(this[s].bc),this[s].bc=a.a.setTimeout(function(){b.aa(!0)},c)):b.Fa?b.Fa():b.aa(!0)},aa:function(b){var c=this[s],d=c.wa;if(!c.Ra&&!c.R){if(c.i&&!a.a.nb(c.i)||d&&d()){if(!c.Fb){this.k();return}}else c.Fb=!1;c.Ra=!0;try{this.Qc(b)}finally{c.Ra=!1}c.L||
51this.k()}},Qc:function(b){var c=this[s],d=c.Va?n:!c.L,e={Hc:this,Ma:c.r,lb:c.L};a.l.Ub({Gc:e,gb:Y,m:this,Sa:d});c.r={};c.L=0;e=this.Pc(c,e);this.tb(c.T,e)&&(c.s||this.notifySubscribers(c.T,"beforeChange"),c.T=e,c.s?this.zc():b&&this.notifySubscribers(c.T));d&&this.notifySubscribers(c.T,"awake")},Pc:function(b,c){try{var d=b.jd;return b.pb?d.call(b.pb):d()}finally{a.l.end(),c.lb&&!b.s&&a.a.D(c.Ma,X),b.S=!1}},t:function(){var a=this[s];(a.S&&!a.L||a.s&&this.Qa())&&this.aa();return a.T},Ta:function(b){a.J.fn.Ta.call(this,
52b);this.Fa=function(){this.Kb(this[s].T);this[s].S=!0;this.Lb(this)}},k:function(){var b=this[s];!b.s&&b.r&&a.a.D(b.r,function(a,b){b.k&&b.k()});b.i&&b.mb&&a.a.F.pc(b.i,b.mb);b.r=null;b.L=0;b.R=!0;b.S=!1;b.s=!1;b.i=null}},$={sa:function(b){var c=this,d=c[s];if(!d.R&&d.s&&"change"==b){d.s=!1;if(d.S||c.Qa())d.r=null,d.L=0,d.S=!0,c.aa();else{var e=[];a.a.D(d.r,function(a,b){e[b.Ga]=a});a.a.q(e,function(a,b){var e=d.r[a],l=c.uc(e.ia);l.Ga=b;l.na=e.na;d.r[a]=l})}d.R||c.notifySubscribers(d.T,"awake")}},
53Ia:function(b){var c=this[s];c.R||"change"!=b||this.Pa("change")||(a.a.D(c.r,function(a,b){b.k&&(c.r[a]={ia:b.ia,Ga:b.Ga,na:b.na},b.k())}),c.s=!0,this.notifySubscribers(n,"asleep"))},Na:function(){var b=this[s];b.s&&(b.S||this.Qa())&&this.aa();return a.J.fn.Na.call(this)}},aa={sa:function(a){"change"!=a&&"beforeChange"!=a||this.t()}};a.a.ka&&a.a.Xa(z,a.J.fn);var R=a.N.gd;a.m[R]=a.N;z[R]=a.m;a.Xc=function(b){return a.Oa(b,a.m)};a.Yc=function(b){return a.Oa(b,a.m)&&b[s]&&b[s].Va};a.b("computed",a.m);
54a.b("dependentObservable",a.m);a.b("isComputed",a.Xc);a.b("isPureComputed",a.Yc);a.b("computed.fn",z);a.G(z,"peek",z.t);a.G(z,"dispose",z.k);a.G(z,"isActive",z.ba);a.G(z,"getDependenciesCount",z.Aa);a.nc=function(b,c){if("function"===typeof b)return a.m(b,c,{pure:!0});b=a.a.extend({},b);b.pure=!0;return a.m(b,c)};a.b("pureComputed",a.nc);(function(){function b(a,f,g){g=g||new d;a=f(a);if("object"!=typeof a||null===a||a===n||a instanceof RegExp||a instanceof Date||a instanceof String||a instanceof
55Number||a instanceof Boolean)return a;var k=a instanceof Array?[]:{};g.save(a,k);c(a,function(c){var d=f(a[c]);switch(typeof d){case "boolean":case "number":case "string":case "function":k[c]=d;break;case "object":case "undefined":var h=g.get(d);k[c]=h!==n?h:b(d,f,g)}});return k}function c(a,b){if(a instanceof Array){for(var c=0;c<a.length;c++)b(c);"function"==typeof a.toJSON&&b("toJSON")}else for(c in a)b(c)}function d(){this.keys=[];this.Ib=[]}a.wc=function(c){if(0==arguments.length)throw Error("When calling ko.toJS, pass the object you want to convert.");
56return b(c,function(b){for(var c=0;a.H(b)&&10>c;c++)b=b();return b})};a.toJSON=function(b,c,d){b=a.wc(b);return a.a.Eb(b,c,d)};d.prototype={save:function(b,c){var d=a.a.o(this.keys,b);0<=d?this.Ib[d]=c:(this.keys.push(b),this.Ib.push(c))},get:function(b){b=a.a.o(this.keys,b);return 0<=b?this.Ib[b]:n}}})();a.b("toJS",a.wc);a.b("toJSON",a.toJSON);(function(){a.j={u:function(b){switch(a.a.A(b)){case "option":return!0===b.__ko__hasDomDataOptionValue__?a.a.e.get(b,a.d.options.xb):7>=a.a.C?b.getAttributeNode("value")&&
57b.getAttributeNode("value").specified?b.value:b.text:b.value;case "select":return 0<=b.selectedIndex?a.j.u(b.options[b.selectedIndex]):n;default:return b.value}},ha:function(b,c,d){switch(a.a.A(b)){case "option":switch(typeof c){case "string":a.a.e.set(b,a.d.options.xb,n);"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__;b.value=c;break;default:a.a.e.set(b,a.d.options.xb,c),b.__ko__hasDomDataOptionValue__=!0,b.value="number"===typeof c?c:""}break;case "select":if(""===c||
58null===c)c=n;for(var e=-1,f=0,g=b.options.length,k;f<g;++f)if(k=a.j.u(b.options[f]),k==c||""==k&&c===n){e=f;break}if(d||0<=e||c===n&&1<b.size)b.selectedIndex=e;break;default:if(null===c||c===n)c="";b.value=c}}}})();a.b("selectExtensions",a.j);a.b("selectExtensions.readValue",a.j.u);a.b("selectExtensions.writeValue",a.j.ha);a.h=function(){function b(b){b=a.a.$a(b);123===b.charCodeAt(0)&&(b=b.slice(1,-1));var c=[],d=b.match(e),r,k=[],p=0;if(d){d.push(",");for(var A=0,y;y=d[A];++A){var t=y.charCodeAt(0);
59if(44===t){if(0>=p){c.push(r&&k.length?{key:r,value:k.join("")}:{unknown:r||k.join("")});r=p=0;k=[];continue}}else if(58===t){if(!p&&!r&&1===k.length){r=k.pop();continue}}else 47===t&&A&&1<y.length?(t=d[A-1].match(f))&&!g[t[0]]&&(b=b.substr(b.indexOf(y)+1),d=b.match(e),d.push(","),A=-1,y="/"):40===t||123===t||91===t?++p:41===t||125===t||93===t?--p:r||k.length||34!==t&&39!==t||(y=y.slice(1,-1));k.push(y)}}return c}var c=["true","false","null","undefined"],d=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i,
60e=RegExp("\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|/(?:[^/\\\\]|\\\\.)*/w*|[^\\s:,/][^,\"'{}()/:[\\]]*[^\\s,\"'{}()/:[\\]]|[^\\s]","g"),f=/[\])"'A-Za-z0-9_$]+$/,g={"in":1,"return":1,"typeof":1},k={};return{ta:[],ea:k,yb:b,Ua:function(e,m){function h(b,e){var m;if(!A){var l=a.getBindingHandler(b);if(l&&l.preprocess&&!(e=l.preprocess(e,b,h)))return;if(l=k[b])m=e,0<=a.a.o(c,m)?m=!1:(l=m.match(d),m=null===l?!1:l[1]?"Object("+l[1]+")"+l[2]:m),l=m;l&&g.push("'"+b+"':function(_z){"+m+"=_z}")}p&&(e=
61"function(){return "+e+" }");f.push("'"+b+"':"+e)}m=m||{};var f=[],g=[],p=m.valueAccessors,A=m.bindingParams,y="string"===typeof e?b(e):e;a.a.q(y,function(a){h(a.key||a.unknown,a.value)});g.length&&h("_ko_property_writers","{"+g.join(",")+" }");return f.join(",")},ad:function(a,b){for(var c=0;c<a.length;c++)if(a[c].key==b)return!0;return!1},Ea:function(b,c,d,e,f){if(b&&a.H(b))!a.Ba(b)||f&&b.t()===e||b(e);else if((b=c.get("_ko_property_writers"))&&b[d])b[d](e)}}}();a.b("expressionRewriting",a.h);a.b("expressionRewriting.bindingRewriteValidators",
62a.h.ta);a.b("expressionRewriting.parseObjectLiteral",a.h.yb);a.b("expressionRewriting.preProcessBindings",a.h.Ua);a.b("expressionRewriting._twoWayBindings",a.h.ea);a.b("jsonExpressionRewriting",a.h);a.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",a.h.Ua);(function(){function b(a){return 8==a.nodeType&&g.test(f?a.text:a.nodeValue)}function c(a){return 8==a.nodeType&&k.test(f?a.text:a.nodeValue)}function d(a,d){for(var e=a,f=1,l=[];e=e.nextSibling;){if(c(e)&&(f--,0===f))return l;l.push(e);
63b(e)&&f++}if(!d)throw Error("Cannot find closing comment tag to match: "+a.nodeValue);return null}function e(a,b){var c=d(a,b);return c?0<c.length?c[c.length-1].nextSibling:a.nextSibling:null}var f=u&&"\x3c!--test--\x3e"===u.createComment("test").text,g=f?/^\x3c!--\s*ko(?:\s+([\s\S]+))?\s*--\x3e$/:/^\s*ko(?:\s+([\s\S]+))?\s*$/,k=f?/^\x3c!--\s*\/ko\s*--\x3e$/:/^\s*\/ko\s*$/,l={ul:!0,ol:!0};a.f={Z:{},childNodes:function(a){return b(a)?d(a):a.childNodes},xa:function(c){if(b(c)){c=a.f.childNodes(c);for(var d=
640,e=c.length;d<e;d++)a.removeNode(c[d])}else a.a.ob(c)},da:function(c,d){if(b(c)){a.f.xa(c);for(var e=c.nextSibling,f=0,l=d.length;f<l;f++)e.parentNode.insertBefore(d[f],e)}else a.a.da(c,d)},mc:function(a,c){b(a)?a.parentNode.insertBefore(c,a.nextSibling):a.firstChild?a.insertBefore(c,a.firstChild):a.appendChild(c)},gc:function(c,d,e){e?b(c)?c.parentNode.insertBefore(d,e.nextSibling):e.nextSibling?c.insertBefore(d,e.nextSibling):c.appendChild(d):a.f.mc(c,d)},firstChild:function(a){return b(a)?!a.nextSibling||
65c(a.nextSibling)?null:a.nextSibling:a.firstChild},nextSibling:function(a){b(a)&&(a=e(a));return a.nextSibling&&c(a.nextSibling)?null:a.nextSibling},Tc:b,pd:function(a){return(a=(f?a.text:a.nodeValue).match(g))?a[1]:null},kc:function(d){if(l[a.a.A(d)]){var h=d.firstChild;if(h){do if(1===h.nodeType){var f;f=h.firstChild;var g=null;if(f){do if(g)g.push(f);else if(b(f)){var k=e(f,!0);k?f=k:g=[f]}else c(f)&&(g=[f]);while(f=f.nextSibling)}if(f=g)for(g=h.nextSibling,k=0;k<f.length;k++)g?d.insertBefore(f[k],
66g):d.appendChild(f[k])}while(h=h.nextSibling)}}}}})();a.b("virtualElements",a.f);a.b("virtualElements.allowedBindings",a.f.Z);a.b("virtualElements.emptyNode",a.f.xa);a.b("virtualElements.insertAfter",a.f.gc);a.b("virtualElements.prepend",a.f.mc);a.b("virtualElements.setDomNodeChildren",a.f.da);(function(){a.Q=function(){this.Fc={}};a.a.extend(a.Q.prototype,{nodeHasBindings:function(b){switch(b.nodeType){case 1:return null!=b.getAttribute("data-bind")||a.g.getComponentNameForNode(b);case 8:return a.f.Tc(b);
67default:return!1}},getBindings:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b):null;return a.g.Ob(d,b,c,!1)},getBindingAccessors:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b,{valueAccessors:!0}):null;return a.g.Ob(d,b,c,!0)},getBindingsString:function(b){switch(b.nodeType){case 1:return b.getAttribute("data-bind");case 8:return a.f.pd(b);default:return null}},parseBindingsString:function(b,c,d,e){try{var f=this.Fc,g=b+(e&&e.valueAccessors||
68""),k;if(!(k=f[g])){var l,m="with($context){with($data||{}){return{"+a.h.Ua(b,e)+"}}}";l=new Function("$context","$element",m);k=f[g]=l}return k(c,d)}catch(h){throw h.message="Unable to parse bindings.\nBindings value: "+b+"\nMessage: "+h.message,h;}}});a.Q.instance=new a.Q})();a.b("bindingProvider",a.Q);(function(){function b(a){return function(){return a}}function c(a){return a()}function d(b){return a.a.Ca(a.l.w(b),function(a,c){return function(){return b()[c]}})}function e(c,e,h){return"function"===
69typeof c?d(c.bind(null,e,h)):a.a.Ca(c,b)}function f(a,b){return d(this.getBindings.bind(this,a,b))}function g(b,c,d){var e,h=a.f.firstChild(c),f=a.Q.instance,m=f.preprocessNode;if(m){for(;e=h;)h=a.f.nextSibling(e),m.call(f,e);h=a.f.firstChild(c)}for(;e=h;)h=a.f.nextSibling(e),k(b,e,d)}function k(b,c,d){var e=!0,h=1===c.nodeType;h&&a.f.kc(c);if(h&&d||a.Q.instance.nodeHasBindings(c))e=m(c,null,b,d).shouldBindDescendants;e&&!r[a.a.A(c)]&&g(b,c,!h)}function l(b){var c=[],d={},e=[];a.a.D(b,function Z(h){if(!d[h]){var f=
70a.getBindingHandler(h);f&&(f.after&&(e.push(h),a.a.q(f.after,function(c){if(b[c]){if(-1!==a.a.o(e,c))throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+e.join(", "));Z(c)}}),e.length--),c.push({key:h,fc:f}));d[h]=!0}});return c}function m(b,d,e,h){var m=a.a.e.get(b,q);if(!d){if(m)throw Error("You cannot apply bindings multiple times to the same element.");a.a.e.set(b,q,!0)}!m&&h&&a.tc(b,e);var g;if(d&&"function"!==typeof d)g=d;else{var k=a.Q.instance,r=k.getBindingAccessors||
71f,p=a.B(function(){(g=d?d(e,b):r.call(k,b,e))&&e.P&&e.P();return g},null,{i:b});g&&p.ba()||(p=null)}var u;if(g){var v=p?function(a){return function(){return c(p()[a])}}:function(a){return g[a]},s=function(){return a.a.Ca(p?p():g,c)};s.get=function(a){return g[a]&&c(v(a))};s.has=function(a){return a in g};h=l(g);a.a.q(h,function(c){var d=c.fc.init,h=c.fc.update,f=c.key;if(8===b.nodeType&&!a.f.Z[f])throw Error("The binding '"+f+"' cannot be used with virtual elements");try{"function"==typeof d&&a.l.w(function(){var a=
72d(b,v(f),s,e.$data,e);if(a&&a.controlsDescendantBindings){if(u!==n)throw Error("Multiple bindings ("+u+" and "+f+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");u=f}}),"function"==typeof h&&a.B(function(){h(b,v(f),s,e.$data,e)},null,{i:b})}catch(m){throw m.message='Unable to process binding "'+f+": "+g[f]+'"\nMessage: '+m.message,m;}})}return{shouldBindDescendants:u===n}}function h(b){return b&&b instanceof a.U?b:new a.U(b)}
73a.d={};var r={script:!0,textarea:!0,template:!0};a.getBindingHandler=function(b){return a.d[b]};a.U=function(b,c,d,e){var h=this,f="function"==typeof b&&!a.H(b),m,g=a.B(function(){var m=f?b():b,l=a.a.c(m);c?(c.P&&c.P(),a.a.extend(h,c),g&&(h.P=g)):(h.$parents=[],h.$root=l,h.ko=a);h.$rawData=m;h.$data=l;d&&(h[d]=l);e&&e(h,c,l);return h.$data},null,{wa:function(){return m&&!a.a.Qb(m)},i:!0});g.ba()&&(h.P=g,g.equalityComparer=null,m=[],g.Ac=function(b){m.push(b);a.a.F.oa(b,function(b){a.a.La(m,b);m.length||
74(g.k(),h.P=g=n)})})};a.U.prototype.createChildContext=function(b,c,d){return new a.U(b,this,c,function(a,b){a.$parentContext=b;a.$parent=b.$data;a.$parents=(b.$parents||[]).slice(0);a.$parents.unshift(a.$parent);d&&d(a)})};a.U.prototype.extend=function(b){return new a.U(this.P||this.$data,this,null,function(c,d){c.$rawData=d.$rawData;a.a.extend(c,"function"==typeof b?b():b)})};var q=a.a.e.I(),p=a.a.e.I();a.tc=function(b,c){if(2==arguments.length)a.a.e.set(b,p,c),c.P&&c.P.Ac(b);else return a.a.e.get(b,
75p)};a.Ja=function(b,c,d){1===b.nodeType&&a.f.kc(b);return m(b,c,h(d),!0)};a.Dc=function(b,c,d){d=h(d);return a.Ja(b,e(c,d,b),d)};a.eb=function(a,b){1!==b.nodeType&&8!==b.nodeType||g(h(a),b,!0)};a.Rb=function(a,b){!v&&x.jQuery&&(v=x.jQuery);if(b&&1!==b.nodeType&&8!==b.nodeType)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");b=b||x.document.body;k(h(a),b,!0)};a.kb=function(b){switch(b.nodeType){case 1:case 8:var c=a.tc(b);if(c)return c;
76if(b.parentNode)return a.kb(b.parentNode)}return n};a.Jc=function(b){return(b=a.kb(b))?b.$data:n};a.b("bindingHandlers",a.d);a.b("applyBindings",a.Rb);a.b("applyBindingsToDescendants",a.eb);a.b("applyBindingAccessorsToNode",a.Ja);a.b("applyBindingsToNode",a.Dc);a.b("contextFor",a.kb);a.b("dataFor",a.Jc)})();(function(b){function c(c,e){var m=f.hasOwnProperty(c)?f[c]:b,h;m?m.X(e):(m=f[c]=new a.J,m.X(e),d(c,function(b,d){var e=!(!d||!d.synchronous);g[c]={definition:b,Zc:e};delete f[c];h||e?m.notifySubscribers(b):
77a.Y.Wa(function(){m.notifySubscribers(b)})}),h=!0)}function d(a,b){e("getConfig",[a],function(c){c?e("loadComponent",[a,c],function(a){b(a,c)}):b(null,null)})}function e(c,d,f,h){h||(h=a.g.loaders.slice(0));var g=h.shift();if(g){var q=g[c];if(q){var p=!1;if(q.apply(g,d.concat(function(a){p?f(null):null!==a?f(a):e(c,d,f,h)}))!==b&&(p=!0,!g.suppressLoaderExceptions))throw Error("Component loaders must supply values by invoking the callback, not by returning values synchronously.");}else e(c,d,f,h)}else f(null)}
78var f={},g={};a.g={get:function(d,e){var f=g.hasOwnProperty(d)?g[d]:b;f?f.Zc?a.l.w(function(){e(f.definition)}):a.Y.Wa(function(){e(f.definition)}):c(d,e)},Xb:function(a){delete g[a]},Jb:e};a.g.loaders=[];a.b("components",a.g);a.b("components.get",a.g.get);a.b("components.clearCachedDefinition",a.g.Xb)})();(function(){function b(b,c,d,e){function g(){0===--y&&e(k)}var k={},y=2,t=d.template;d=d.viewModel;t?f(c,t,function(c){a.g.Jb("loadTemplate",[b,c],function(a){k.template=a;g()})}):g();d?f(c,d,function(c){a.g.Jb("loadViewModel",
79[b,c],function(a){k[l]=a;g()})}):g()}function c(a,b,d){if("function"===typeof b)d(function(a){return new b(a)});else if("function"===typeof b[l])d(b[l]);else if("instance"in b){var e=b.instance;d(function(){return e})}else"viewModel"in b?c(a,b.viewModel,d):a("Unknown viewModel value: "+b)}function d(b){switch(a.a.A(b)){case "script":return a.a.ma(b.text);case "textarea":return a.a.ma(b.value);case "template":if(e(b.content))return a.a.ua(b.content.childNodes)}return a.a.ua(b.childNodes)}function e(a){return x.DocumentFragment?
80a instanceof DocumentFragment:a&&11===a.nodeType}function f(a,b,c){"string"===typeof b.require?O||x.require?(O||x.require)([b.require],c):a("Uses require, but no AMD loader is present"):c(b)}function g(a){return function(b){throw Error("Component '"+a+"': "+b);}}var k={};a.g.register=function(b,c){if(!c)throw Error("Invalid configuration for "+b);if(a.g.ub(b))throw Error("Component "+b+" is already registered");k[b]=c};a.g.ub=function(a){return k.hasOwnProperty(a)};a.g.od=function(b){delete k[b];
81a.g.Xb(b)};a.g.Zb={getConfig:function(a,b){b(k.hasOwnProperty(a)?k[a]:null)},loadComponent:function(a,c,d){var e=g(a);f(e,c,function(c){b(a,e,c,d)})},loadTemplate:function(b,c,f){b=g(b);if("string"===typeof c)f(a.a.ma(c));else if(c instanceof Array)f(c);else if(e(c))f(a.a.V(c.childNodes));else if(c.element)if(c=c.element,x.HTMLElement?c instanceof HTMLElement:c&&c.tagName&&1===c.nodeType)f(d(c));else if("string"===typeof c){var l=u.getElementById(c);l?f(d(l)):b("Cannot find element with ID "+c)}else b("Unknown element type: "+
82c);else b("Unknown template value: "+c)},loadViewModel:function(a,b,d){c(g(a),b,d)}};var l="createViewModel";a.b("components.register",a.g.register);a.b("components.isRegistered",a.g.ub);a.b("components.unregister",a.g.od);a.b("components.defaultLoader",a.g.Zb);a.g.loaders.push(a.g.Zb);a.g.Bc=k})();(function(){function b(b,e){var f=b.getAttribute("params");if(f){var f=c.parseBindingsString(f,e,b,{valueAccessors:!0,bindingParams:!0}),f=a.a.Ca(f,function(c){return a.m(c,null,{i:b})}),g=a.a.Ca(f,function(c){var e=
83c.t();return c.ba()?a.m({read:function(){return a.a.c(c())},write:a.Ba(e)&&function(a){c()(a)},i:b}):e});g.hasOwnProperty("$raw")||(g.$raw=f);return g}return{$raw:{}}}a.g.getComponentNameForNode=function(b){var c=a.a.A(b);if(a.g.ub(c)&&(-1!=c.indexOf("-")||"[object HTMLUnknownElement]"==""+b||8>=a.a.C&&b.tagName===c))return c};a.g.Ob=function(c,e,f,g){if(1===e.nodeType){var k=a.g.getComponentNameForNode(e);if(k){c=c||{};if(c.component)throw Error('Cannot use the "component" binding on a custom element matching a component');
84var l={name:k,params:b(e,f)};c.component=g?function(){return l}:l}}return c};var c=new a.Q;9>a.a.C&&(a.g.register=function(a){return function(b){u.createElement(b);return a.apply(this,arguments)}}(a.g.register),u.createDocumentFragment=function(b){return function(){var c=b(),f=a.g.Bc,g;for(g in f)f.hasOwnProperty(g)&&c.createElement(g);return c}}(u.createDocumentFragment))})();(function(b){function c(b,c,d){c=c.template;if(!c)throw Error("Component '"+b+"' has no template");b=a.a.ua(c);a.f.da(d,b)}
85function d(a,b,c,d){var e=a.createViewModel;return e?e.call(a,d,{element:b,templateNodes:c}):d}var e=0;a.d.component={init:function(f,g,k,l,m){function h(){var a=r&&r.dispose;"function"===typeof a&&a.call(r);q=r=null}var r,q,p=a.a.V(a.f.childNodes(f));a.a.F.oa(f,h);a.m(function(){var l=a.a.c(g()),k,t;"string"===typeof l?k=l:(k=a.a.c(l.name),t=a.a.c(l.params));if(!k)throw Error("No component name specified");var n=q=++e;a.g.get(k,function(e){if(q===n){h();if(!e)throw Error("Unknown component '"+k+
86"'");c(k,e,f);var g=d(e,f,p,t);e=m.createChildContext(g,b,function(a){a.$component=g;a.$componentTemplateNodes=p});r=g;a.eb(e,f)}})},null,{i:f});return{controlsDescendantBindings:!0}}};a.f.Z.component=!0})();var S={"class":"className","for":"htmlFor"};a.d.attr={update:function(b,c){var d=a.a.c(c())||{};a.a.D(d,function(c,d){d=a.a.c(d);var g=!1===d||null===d||d===n;g&&b.removeAttribute(c);8>=a.a.C&&c in S?(c=S[c],g?b.removeAttribute(c):b[c]=d):g||b.setAttribute(c,d.toString());"name"===c&&a.a.rc(b,
87g?"":d.toString())})}};(function(){a.d.checked={after:["value","attr"],init:function(b,c,d){function e(){var e=b.checked,f=p?g():e;if(!a.va.Sa()&&(!l||e)){var m=a.l.w(c);if(h){var k=r?m.t():m;q!==f?(e&&(a.a.pa(k,f,!0),a.a.pa(k,q,!1)),q=f):a.a.pa(k,f,e);r&&a.Ba(m)&&m(k)}else a.h.Ea(m,d,"checked",f,!0)}}function f(){var d=a.a.c(c());b.checked=h?0<=a.a.o(d,g()):k?d:g()===d}var g=a.nc(function(){return d.has("checkedValue")?a.a.c(d.get("checkedValue")):d.has("value")?a.a.c(d.get("value")):b.value}),k=
88"checkbox"==b.type,l="radio"==b.type;if(k||l){var m=c(),h=k&&a.a.c(m)instanceof Array,r=!(h&&m.push&&m.splice),q=h?g():n,p=l||h;l&&!b.name&&a.d.uniqueName.init(b,function(){return!0});a.m(e,null,{i:b});a.a.p(b,"click",e);a.m(f,null,{i:b});m=n}}};a.h.ea.checked=!0;a.d.checkedValue={update:function(b,c){b.value=a.a.c(c())}}})();a.d.css={update:function(b,c){var d=a.a.c(c());null!==d&&"object"==typeof d?a.a.D(d,function(c,d){d=a.a.c(d);a.a.bb(b,c,d)}):(d=a.a.$a(String(d||"")),a.a.bb(b,b.__ko__cssValue,
89!1),b.__ko__cssValue=d,a.a.bb(b,d,!0))}};a.d.enable={update:function(b,c){var d=a.a.c(c());d&&b.disabled?b.removeAttribute("disabled"):d||b.disabled||(b.disabled=!0)}};a.d.disable={update:function(b,c){a.d.enable.update(b,function(){return!a.a.c(c())})}};a.d.event={init:function(b,c,d,e,f){var g=c()||{};a.a.D(g,function(g){"string"==typeof g&&a.a.p(b,g,function(b){var m,h=c()[g];if(h){try{var r=a.a.V(arguments);e=f.$data;r.unshift(e);m=h.apply(e,r)}finally{!0!==m&&(b.preventDefault?b.preventDefault():
90b.returnValue=!1)}!1===d.get(g+"Bubble")&&(b.cancelBubble=!0,b.stopPropagation&&b.stopPropagation())}})})}};a.d.foreach={ic:function(b){return function(){var c=b(),d=a.a.zb(c);if(!d||"number"==typeof d.length)return{foreach:c,templateEngine:a.W.sb};a.a.c(c);return{foreach:d.data,as:d.as,includeDestroyed:d.includeDestroyed,afterAdd:d.afterAdd,beforeRemove:d.beforeRemove,afterRender:d.afterRender,beforeMove:d.beforeMove,afterMove:d.afterMove,templateEngine:a.W.sb}}},init:function(b,c){return a.d.template.init(b,
91a.d.foreach.ic(c))},update:function(b,c,d,e,f){return a.d.template.update(b,a.d.foreach.ic(c),d,e,f)}};a.h.ta.foreach=!1;a.f.Z.foreach=!0;a.d.hasfocus={init:function(b,c,d){function e(e){b.__ko_hasfocusUpdating=!0;var f=b.ownerDocument;if("activeElement"in f){var g;try{g=f.activeElement}catch(h){g=f.body}e=g===b}f=c();a.h.Ea(f,d,"hasfocus",e,!0);b.__ko_hasfocusLastValue=e;b.__ko_hasfocusUpdating=!1}var f=e.bind(null,!0),g=e.bind(null,!1);a.a.p(b,"focus",f);a.a.p(b,"focusin",f);a.a.p(b,"blur",g);a.a.p(b,
92"focusout",g)},update:function(b,c){var d=!!a.a.c(c());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue===d||(d?b.focus():b.blur(),!d&&b.__ko_hasfocusLastValue&&b.ownerDocument.body.focus(),a.l.w(a.a.Da,null,[b,d?"focusin":"focusout"]))}};a.h.ea.hasfocus=!0;a.d.hasFocus=a.d.hasfocus;a.h.ea.hasFocus=!0;a.d.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Cb(b,c())}};K("if");K("ifnot",!1,!0);K("with",!0,!1,function(a,c){return a.createChildContext(c)});var L={};
93a.d.options={init:function(b){if("select"!==a.a.A(b))throw Error("options binding applies only to SELECT elements");for(;0<b.length;)b.remove(0);return{controlsDescendantBindings:!0}},update:function(b,c,d){function e(){return a.a.Ka(b.options,function(a){return a.selected})}function f(a,b,c){var d=typeof b;return"function"==d?b(a):"string"==d?a[b]:c}function g(c,e){if(A&&h)a.j.ha(b,a.a.c(d.get("value")),!0);else if(p.length){var f=0<=a.a.o(p,a.j.u(e[0]));a.a.sc(e[0],f);A&&!f&&a.l.w(a.a.Da,null,[b,
94"change"])}}var k=b.multiple,l=0!=b.length&&k?b.scrollTop:null,m=a.a.c(c()),h=d.get("valueAllowUnset")&&d.has("value"),r=d.get("optionsIncludeDestroyed");c={};var q,p=[];h||(k?p=a.a.fb(e(),a.j.u):0<=b.selectedIndex&&p.push(a.j.u(b.options[b.selectedIndex])));m&&("undefined"==typeof m.length&&(m=[m]),q=a.a.Ka(m,function(b){return r||b===n||null===b||!a.a.c(b._destroy)}),d.has("optionsCaption")&&(m=a.a.c(d.get("optionsCaption")),null!==m&&m!==n&&q.unshift(L)));var A=!1;c.beforeRemove=function(a){b.removeChild(a)};
95m=g;d.has("optionsAfterRender")&&"function"==typeof d.get("optionsAfterRender")&&(m=function(b,c){g(0,c);a.l.w(d.get("optionsAfterRender"),null,[c[0],b!==L?b:n])});a.a.Bb(b,q,function(c,e,g){g.length&&(p=!h&&g[0].selected?[a.j.u(g[0])]:[],A=!0);e=b.ownerDocument.createElement("option");c===L?(a.a.Za(e,d.get("optionsCaption")),a.j.ha(e,n)):(g=f(c,d.get("optionsValue"),c),a.j.ha(e,a.a.c(g)),c=f(c,d.get("optionsText"),g),a.a.Za(e,c));return[e]},c,m);a.l.w(function(){h?a.j.ha(b,a.a.c(d.get("value")),
96!0):(k?p.length&&e().length<p.length:p.length&&0<=b.selectedIndex?a.j.u(b.options[b.selectedIndex])!==p[0]:p.length||0<=b.selectedIndex)&&a.a.Da(b,"change")});a.a.Nc(b);l&&20<Math.abs(l-b.scrollTop)&&(b.scrollTop=l)}};a.d.options.xb=a.a.e.I();a.d.selectedOptions={after:["options","foreach"],init:function(b,c,d){a.a.p(b,"change",function(){var e=c(),f=[];a.a.q(b.getElementsByTagName("option"),function(b){b.selected&&f.push(a.j.u(b))});a.h.Ea(e,d,"selectedOptions",f)})},update:function(b,c){if("select"!=
97a.a.A(b))throw Error("values binding applies only to SELECT elements");var d=a.a.c(c()),e=b.scrollTop;d&&"number"==typeof d.length&&a.a.q(b.getElementsByTagName("option"),function(b){var c=0<=a.a.o(d,a.j.u(b));b.selected!=c&&a.a.sc(b,c)});b.scrollTop=e}};a.h.ea.selectedOptions=!0;a.d.style={update:function(b,c){var d=a.a.c(c()||{});a.a.D(d,function(c,d){d=a.a.c(d);if(null===d||d===n||!1===d)d="";b.style[c]=d})}};a.d.submit={init:function(b,c,d,e,f){if("function"!=typeof c())throw Error("The value for a submit binding must be a function");
98a.a.p(b,"submit",function(a){var d,e=c();try{d=e.call(f.$data,b)}finally{!0!==d&&(a.preventDefault?a.preventDefault():a.returnValue=!1)}})}};a.d.text={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Za(b,c())}};a.f.Z.text=!0;(function(){if(x&&x.navigator)var b=function(a){if(a)return parseFloat(a[1])},c=x.opera&&x.opera.version&&parseInt(x.opera.version()),d=x.navigator.userAgent,e=b(d.match(/^(?:(?!chrome).)*version\/([^ ]*) safari/i)),f=b(d.match(/Firefox\/([^ ]*)/));
99if(10>a.a.C)var g=a.a.e.I(),k=a.a.e.I(),l=function(b){var c=this.activeElement;(c=c&&a.a.e.get(c,k))&&c(b)},m=function(b,c){var d=b.ownerDocument;a.a.e.get(d,g)||(a.a.e.set(d,g,!0),a.a.p(d,"selectionchange",l));a.a.e.set(b,k,c)};a.d.textInput={init:function(b,d,g){function l(c,d){a.a.p(b,c,d)}function k(){var c=a.a.c(d());if(null===c||c===n)c="";v!==n&&c===v?a.a.setTimeout(k,4):b.value!==c&&(u=c,b.value=c)}function y(){s||(v=b.value,s=a.a.setTimeout(t,4))}function t(){clearTimeout(s);v=s=n;var c=
100b.value;u!==c&&(u=c,a.h.Ea(d(),g,"textInput",c))}var u=b.value,s,v,x=9==a.a.C?y:t;10>a.a.C?(l("propertychange",function(a){"value"===a.propertyName&&x(a)}),8==a.a.C&&(l("keyup",t),l("keydown",t)),8<=a.a.C&&(m(b,x),l("dragend",y))):(l("input",t),5>e&&"textarea"===a.a.A(b)?(l("keydown",y),l("paste",y),l("cut",y)):11>c?l("keydown",y):4>f&&(l("DOMAutoComplete",t),l("dragdrop",t),l("drop",t)));l("change",t);a.m(k,null,{i:b})}};a.h.ea.textInput=!0;a.d.textinput={preprocess:function(a,b,c){c("textInput",
101a)}}})();a.d.uniqueName={init:function(b,c){if(c()){var d="ko_unique_"+ ++a.d.uniqueName.Ic;a.a.rc(b,d)}}};a.d.uniqueName.Ic=0;a.d.value={after:["options","foreach"],init:function(b,c,d){if("input"!=b.tagName.toLowerCase()||"checkbox"!=b.type&&"radio"!=b.type){var e=["change"],f=d.get("valueUpdate"),g=!1,k=null;f&&("string"==typeof f&&(f=[f]),a.a.ra(e,f),e=a.a.Tb(e));var l=function(){k=null;g=!1;var e=c(),f=a.j.u(b);a.h.Ea(e,d,"value",f)};!a.a.C||"input"!=b.tagName.toLowerCase()||"text"!=b.type||
102"off"==b.autocomplete||b.form&&"off"==b.form.autocomplete||-1!=a.a.o(e,"propertychange")||(a.a.p(b,"propertychange",function(){g=!0}),a.a.p(b,"focus",function(){g=!1}),a.a.p(b,"blur",function(){g&&l()}));a.a.q(e,function(c){var d=l;a.a.nd(c,"after")&&(d=function(){k=a.j.u(b);a.a.setTimeout(l,0)},c=c.substring(5));a.a.p(b,c,d)});var m=function(){var e=a.a.c(c()),f=a.j.u(b);if(null!==k&&e===k)a.a.setTimeout(m,0);else if(e!==f)if("select"===a.a.A(b)){var g=d.get("valueAllowUnset"),f=function(){a.j.ha(b,
103e,g)};f();g||e===a.j.u(b)?a.a.setTimeout(f,0):a.l.w(a.a.Da,null,[b,"change"])}else a.j.ha(b,e)};a.m(m,null,{i:b})}else a.Ja(b,{checkedValue:c})},update:function(){}};a.h.ea.value=!0;a.d.visible={update:function(b,c){var d=a.a.c(c()),e="none"!=b.style.display;d&&!e?b.style.display="":!d&&e&&(b.style.display="none")}};(function(b){a.d[b]={init:function(c,d,e,f,g){return a.d.event.init.call(this,c,function(){var a={};a[b]=d();return a},e,f,g)}}})("click");a.O=function(){};a.O.prototype.renderTemplateSource=
104function(){throw Error("Override renderTemplateSource");};a.O.prototype.createJavaScriptEvaluatorBlock=function(){throw Error("Override createJavaScriptEvaluatorBlock");};a.O.prototype.makeTemplateSource=function(b,c){if("string"==typeof b){c=c||u;var d=c.getElementById(b);if(!d)throw Error("Cannot find template with ID "+b);return new a.v.n(d)}if(1==b.nodeType||8==b.nodeType)return new a.v.qa(b);throw Error("Unknown template type: "+b);};a.O.prototype.renderTemplate=function(a,c,d,e){a=this.makeTemplateSource(a,
105e);return this.renderTemplateSource(a,c,d,e)};a.O.prototype.isTemplateRewritten=function(a,c){return!1===this.allowTemplateRewriting?!0:this.makeTemplateSource(a,c).data("isRewritten")};a.O.prototype.rewriteTemplate=function(a,c,d){a=this.makeTemplateSource(a,d);c=c(a.text());a.text(c);a.data("isRewritten",!0)};a.b("templateEngine",a.O);a.Gb=function(){function b(b,c,d,k){b=a.h.yb(b);for(var l=a.h.ta,m=0;m<b.length;m++){var h=b[m].key;if(l.hasOwnProperty(h)){var r=l[h];if("function"===typeof r){if(h=
106r(b[m].value))throw Error(h);}else if(!r)throw Error("This template engine does not support the '"+h+"' binding within its templates");}}d="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+a.h.Ua(b,{valueAccessors:!0})+" } })()},'"+d.toLowerCase()+"')";return k.createJavaScriptEvaluatorBlock(d)+c}var c=/(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi,d=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;return{Oc:function(b,
107c,d){c.isTemplateRewritten(b,d)||c.rewriteTemplate(b,function(b){return a.Gb.dd(b,c)},d)},dd:function(a,f){return a.replace(c,function(a,c,d,e,h){return b(h,c,d,f)}).replace(d,function(a,c){return b(c,"\x3c!-- ko --\x3e","#comment",f)})},Ec:function(b,c){return a.M.wb(function(d,k){var l=d.nextSibling;l&&l.nodeName.toLowerCase()===c&&a.Ja(l,b,k)})}}}();a.b("__tr_ambtns",a.Gb.Ec);(function(){a.v={};a.v.n=function(b){if(this.n=b){var c=a.a.A(b);this.ab="script"===c?1:"textarea"===c?2:"template"==c&&
108b.content&&11===b.content.nodeType?3:4}};a.v.n.prototype.text=function(){var b=1===this.ab?"text":2===this.ab?"value":"innerHTML";if(0==arguments.length)return this.n[b];var c=arguments[0];"innerHTML"===b?a.a.Cb(this.n,c):this.n[b]=c};var b=a.a.e.I()+"_";a.v.n.prototype.data=function(c){if(1===arguments.length)return a.a.e.get(this.n,b+c);a.a.e.set(this.n,b+c,arguments[1])};var c=a.a.e.I();a.v.n.prototype.nodes=function(){var b=this.n;if(0==arguments.length)return(a.a.e.get(b,c)||{}).jb||(3===this.ab?
109b.content:4===this.ab?b:n);a.a.e.set(b,c,{jb:arguments[0]})};a.v.qa=function(a){this.n=a};a.v.qa.prototype=new a.v.n;a.v.qa.prototype.text=function(){if(0==arguments.length){var b=a.a.e.get(this.n,c)||{};b.Hb===n&&b.jb&&(b.Hb=b.jb.innerHTML);return b.Hb}a.a.e.set(this.n,c,{Hb:arguments[0]})};a.b("templateSources",a.v);a.b("templateSources.domElement",a.v.n);a.b("templateSources.anonymousTemplate",a.v.qa)})();(function(){function b(b,c,d){var e;for(c=a.f.nextSibling(c);b&&(e=b)!==c;)b=a.f.nextSibling(e),
110d(e,b)}function c(c,d){if(c.length){var e=c[0],f=c[c.length-1],g=e.parentNode,k=a.Q.instance,n=k.preprocessNode;if(n){b(e,f,function(a,b){var c=a.previousSibling,d=n.call(k,a);d&&(a===e&&(e=d[0]||b),a===f&&(f=d[d.length-1]||c))});c.length=0;if(!e)return;e===f?c.push(e):(c.push(e,f),a.a.za(c,g))}b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.Rb(d,b)});b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.M.yc(b,[d])});a.a.za(c,g)}}function d(a){return a.nodeType?a:0<a.length?a[0]:null}function e(b,
111e,f,k,q){q=q||{};var p=(b&&d(b)||f||{}).ownerDocument,n=q.templateEngine||g;a.Gb.Oc(f,n,p);f=n.renderTemplate(f,k,q,p);if("number"!=typeof f.length||0<f.length&&"number"!=typeof f[0].nodeType)throw Error("Template engine must return an array of DOM nodes");p=!1;switch(e){case "replaceChildren":a.f.da(b,f);p=!0;break;case "replaceNode":a.a.qc(b,f);p=!0;break;case "ignoreTargetNode":break;default:throw Error("Unknown renderMode: "+e);}p&&(c(f,k),q.afterRender&&a.l.w(q.afterRender,null,[f,k.$data]));
112return f}function f(b,c,d){return a.H(b)?b():"function"===typeof b?b(c,d):b}var g;a.Db=function(b){if(b!=n&&!(b instanceof a.O))throw Error("templateEngine must inherit from ko.templateEngine");g=b};a.Ab=function(b,c,h,k,q){h=h||{};if((h.templateEngine||g)==n)throw Error("Set a template engine before calling renderTemplate");q=q||"replaceChildren";if(k){var p=d(k);return a.B(function(){var g=c&&c instanceof a.U?c:new a.U(a.a.c(c)),n=f(b,g.$data,g),g=e(k,q,n,g,h);"replaceNode"==q&&(k=g,p=d(k))},null,
113{wa:function(){return!p||!a.a.nb(p)},i:p&&"replaceNode"==q?p.parentNode:p})}return a.M.wb(function(d){a.Ab(b,c,h,d,"replaceNode")})};a.kd=function(b,d,g,k,q){function p(a,b){c(b,s);g.afterRender&&g.afterRender(b,a);s=null}function u(a,c){s=q.createChildContext(a,g.as,function(a){a.$index=c});var d=f(b,a,s);return e(null,"ignoreTargetNode",d,s,g)}var s;return a.B(function(){var b=a.a.c(d)||[];"undefined"==typeof b.length&&(b=[b]);b=a.a.Ka(b,function(b){return g.includeDestroyed||b===n||null===b||!a.a.c(b._destroy)});
114a.l.w(a.a.Bb,null,[k,b,u,g,p])},null,{i:k})};var k=a.a.e.I();a.d.template={init:function(b,c){var d=a.a.c(c());if("string"==typeof d||d.name)a.f.xa(b);else{if("nodes"in d){if(d=d.nodes||[],a.H(d))throw Error('The "nodes" option must be a plain, non-observable array.');}else d=a.f.childNodes(b);d=a.a.jc(d);(new a.v.qa(b)).nodes(d)}return{controlsDescendantBindings:!0}},update:function(b,c,d,e,f){var g=c(),s;c=a.a.c(g);d=!0;e=null;"string"==typeof c?c={}:(g=c.name,"if"in c&&(d=a.a.c(c["if"])),d&&"ifnot"in
115c&&(d=!a.a.c(c.ifnot)),s=a.a.c(c.data));"foreach"in c?e=a.kd(g||b,d&&c.foreach||[],c,b,f):d?(f="data"in c?f.createChildContext(s,c.as):f,e=a.Ab(g||b,f,c,b)):a.f.xa(b);f=e;(s=a.a.e.get(b,k))&&"function"==typeof s.k&&s.k();a.a.e.set(b,k,f&&f.ba()?f:n)}};a.h.ta.template=function(b){b=a.h.yb(b);return 1==b.length&&b[0].unknown||a.h.ad(b,"name")?null:"This template engine does not support anonymous templates nested within its templates"};a.f.Z.template=!0})();a.b("setTemplateEngine",a.Db);a.b("renderTemplate",
116a.Ab);a.a.dc=function(a,c,d){if(a.length&&c.length){var e,f,g,k,l;for(e=f=0;(!d||e<d)&&(k=a[f]);++f){for(g=0;l=c[g];++g)if(k.value===l.value){k.moved=l.index;l.moved=k.index;c.splice(g,1);e=g=0;break}e+=g}}};a.a.ib=function(){function b(b,d,e,f,g){var k=Math.min,l=Math.max,m=[],h,n=b.length,q,p=d.length,s=p-n||1,u=n+p+1,t,v,x;for(h=0;h<=n;h++)for(v=t,m.push(t=[]),x=k(p,h+s),q=l(0,h-1);q<=x;q++)t[q]=q?h?b[h-1]===d[q-1]?v[q-1]:k(v[q]||u,t[q-1]||u)+1:q+1:h+1;k=[];l=[];s=[];h=n;for(q=p;h||q;)p=m[h][q]-
1171,q&&p===m[h][q-1]?l.push(k[k.length]={status:e,value:d[--q],index:q}):h&&p===m[h-1][q]?s.push(k[k.length]={status:f,value:b[--h],index:h}):(--q,--h,g.sparse||k.push({status:"retained",value:d[q]}));a.a.dc(s,l,!g.dontLimitMoves&&10*n);return k.reverse()}return function(a,d,e){e="boolean"===typeof e?{dontLimitMoves:e}:e||{};a=a||[];d=d||[];return a.length<d.length?b(a,d,"added","deleted",e):b(d,a,"deleted","added",e)}}();a.b("utils.compareArrays",a.a.ib);(function(){function b(b,c,d,k,l){var m=[],
118h=a.B(function(){var h=c(d,l,a.a.za(m,b))||[];0<m.length&&(a.a.qc(m,h),k&&a.l.w(k,null,[d,h,l]));m.length=0;a.a.ra(m,h)},null,{i:b,wa:function(){return!a.a.Qb(m)}});return{ca:m,B:h.ba()?h:n}}var c=a.a.e.I(),d=a.a.e.I();a.a.Bb=function(e,f,g,k,l){function m(b,c){w=q[c];v!==c&&(D[b]=w);w.qb(v++);a.a.za(w.ca,e);u.push(w);z.push(w)}function h(b,c){if(b)for(var d=0,e=c.length;d<e;d++)c[d]&&a.a.q(c[d].ca,function(a){b(a,d,c[d].ja)})}f=f||[];k=k||{};var r=a.a.e.get(e,c)===n,q=a.a.e.get(e,c)||[],p=a.a.fb(q,
119function(a){return a.ja}),s=a.a.ib(p,f,k.dontLimitMoves),u=[],t=0,v=0,x=[],z=[];f=[];for(var D=[],p=[],w,C=0,B,E;B=s[C];C++)switch(E=B.moved,B.status){case "deleted":E===n&&(w=q[t],w.B&&(w.B.k(),w.B=n),a.a.za(w.ca,e).length&&(k.beforeRemove&&(u.push(w),z.push(w),w.ja===d?w=null:f[C]=w),w&&x.push.apply(x,w.ca)));t++;break;case "retained":m(C,t++);break;case "added":E!==n?m(C,E):(w={ja:B.value,qb:a.N(v++)},u.push(w),z.push(w),r||(p[C]=w))}a.a.e.set(e,c,u);h(k.beforeMove,D);a.a.q(x,k.beforeRemove?a.$:
120a.removeNode);for(var C=0,r=a.f.firstChild(e),F;w=z[C];C++){w.ca||a.a.extend(w,b(e,g,w.ja,l,w.qb));for(t=0;s=w.ca[t];r=s.nextSibling,F=s,t++)s!==r&&a.f.gc(e,s,F);!w.Wc&&l&&(l(w.ja,w.ca,w.qb),w.Wc=!0)}h(k.beforeRemove,f);for(C=0;C<f.length;++C)f[C]&&(f[C].ja=d);h(k.afterMove,D);h(k.afterAdd,p)}})();a.b("utils.setDomNodeChildrenFromArrayMapping",a.a.Bb);a.W=function(){this.allowTemplateRewriting=!1};a.W.prototype=new a.O;a.W.prototype.renderTemplateSource=function(b,c,d,e){if(c=(9>a.a.C?0:b.nodes)?
121b.nodes():null)return a.a.V(c.cloneNode(!0).childNodes);b=b.text();return a.a.ma(b,e)};a.W.sb=new a.W;a.Db(a.W.sb);a.b("nativeTemplateEngine",a.W);(function(){a.vb=function(){var a=this.$c=function(){if(!v||!v.tmpl)return 0;try{if(0<=v.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(b,e,f,g){g=g||u;f=f||{};if(2>a)throw Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");var k=b.data("precompiled");
122k||(k=b.text()||"",k=v.template(null,"{{ko_with $item.koBindingContext}}"+k+"{{/ko_with}}"),b.data("precompiled",k));b=[e.$data];e=v.extend({koBindingContext:e},f.templateOptions);e=v.tmpl(k,b,e);e.appendTo(g.createElement("div"));v.fragments={};return e};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){u.write("<script type='text/html' id='"+a+"'>"+b+"\x3c/script>")};0<a&&(v.tmpl.tag.ko_code={open:"__.push($1 || '');"},
123v.tmpl.tag.ko_with={open:"with($1) {",close:"} "})};a.vb.prototype=new a.O;var b=new a.vb;0<b.$c&&a.Db(b);a.b("jqueryTmplTemplateEngine",a.vb)})()})})();})();
Source/Libraries/Adapters/ModbusAdapters/Scripts/knockout.mapping-latest.js+0−21
@@ -1,21 +0,0 @@
1/// Knockout Mapping plugin v2.4.0
2/// (c) 2013 Steven Sanderson, Roy Jacobs - http://knockoutjs.com/
3/// License: MIT (http://www.opensource.org/licenses/mit-license.php)
4(function(d){"function"===typeof require&&"object"===typeof exports&&"object"===typeof module?d(require("knockout"),exports):"function"===typeof define&&define.amd?define(["knockout","exports"],d):d(ko,ko.mapping={})})(function(d,f){function y(b,c){var a,e;for(e in c)if(c.hasOwnProperty(e)&&c[e])if(a=f.getType(b[e]),e&&b[e]&&"array"!==a&&"string"!==a)y(b[e],c[e]);else if("array"===f.getType(b[e])&&"array"===f.getType(c[e])){a=b;for(var d=e,l=b[e],n=c[e],t={},g=l.length-1;0<=g;--g)t[l[g]]=l[g];for(g=
5n.length-1;0<=g;--g)t[n[g]]=n[g];l=[];n=void 0;for(n in t)l.push(t[n]);a[d]=l}else b[e]=c[e]}function E(b,c){var a={};y(a,b);y(a,c);return a}function z(b,c){for(var a=E({},b),d=L.length-1;0<=d;d--){var f=L[d];a[f]&&(a[""]instanceof Object||(a[""]={}),a[""][f]=a[f],delete a[f])}c&&(a.ignore=h(c.ignore,a.ignore),a.include=h(c.include,a.include),a.copy=h(c.copy,a.copy),a.observe=h(c.observe,a.observe));a.ignore=h(a.ignore,j.ignore);a.include=h(a.include,j.include);a.copy=h(a.copy,j.copy);a.observe=h(a.observe,
6j.observe);a.mappedProperties=a.mappedProperties||{};a.copiedProperties=a.copiedProperties||{};return a}function h(b,c){"array"!==f.getType(b)&&(b="undefined"===f.getType(b)?[]:[b]);"array"!==f.getType(c)&&(c="undefined"===f.getType(c)?[]:[c]);return d.utils.arrayGetDistinctValues(b.concat(c))}function F(b,c,a,e,k,l,n){var t="array"===f.getType(d.utils.unwrapObservable(c));l=l||"";if(f.isMapped(b)){var g=d.utils.unwrapObservable(b)[p];a=E(g,a)}var j=n||k,h=function(){return a[e]&&a[e].create instanceof
7Function},x=function(b){var f=G,g=d.dependentObservable;d.dependentObservable=function(a,b,c){c=c||{};a&&"object"==typeof a&&(c=a);var e=c.deferEvaluation,M=!1;c.deferEvaluation=!0;a=new H(a,b,c);if(!e){var g=a,e=d.dependentObservable;d.dependentObservable=H;a=d.isWriteableObservable(g);d.dependentObservable=e;a=H({read:function(){M||(d.utils.arrayRemoveItem(f,g),M=!0);return g.apply(g,arguments)},write:a&&function(a){return g(a)},deferEvaluation:!0});f.push(a)}return a};d.dependentObservable.fn=
8H.fn;d.computed=d.dependentObservable;b=d.utils.unwrapObservable(k)instanceof Array?a[e].create({data:b||c,parent:j,skip:N}):a[e].create({data:b||c,parent:j});d.dependentObservable=g;d.computed=d.dependentObservable;return b},u=function(){return a[e]&&a[e].update instanceof Function},v=function(b,f){var g={data:f||c,parent:j,target:d.utils.unwrapObservable(b)};d.isWriteableObservable(b)&&(g.observable=b);return a[e].update(g)};if(n=I.get(c))return n;e=e||"";if(t){var t=[],s=!1,m=function(a){return a};
9a[e]&&a[e].key&&(m=a[e].key,s=!0);d.isObservable(b)||(b=d.observableArray([]),b.mappedRemove=function(a){var c="function"==typeof a?a:function(b){return b===m(a)};return b.remove(function(a){return c(m(a))})},b.mappedRemoveAll=function(a){var c=C(a,m);return b.remove(function(a){return-1!=d.utils.arrayIndexOf(c,m(a))})},b.mappedDestroy=function(a){var c="function"==typeof a?a:function(b){return b===m(a)};return b.destroy(function(a){return c(m(a))})},b.mappedDestroyAll=function(a){var c=C(a,m);return b.destroy(function(a){return-1!=
10d.utils.arrayIndexOf(c,m(a))})},b.mappedIndexOf=function(a){var c=C(b(),m);a=m(a);return d.utils.arrayIndexOf(c,a)},b.mappedCreate=function(a){if(-1!==b.mappedIndexOf(a))throw Error("There already is an object with the key that you specified.");var c=h()?x(a):a;u()&&(a=v(c,a),d.isWriteableObservable(c)?c(a):c=a);b.push(c);return c});n=C(d.utils.unwrapObservable(b),m).sort();g=C(c,m);s&&g.sort();s=d.utils.compareArrays(n,g);n={};var J,A=d.utils.unwrapObservable(c),y={},z=!0,g=0;for(J=A.length;g<J;g++){var r=
11m(A[g]);if(void 0===r||r instanceof Object){z=!1;break}y[r]=A[g]}var A=[],B=0,g=0;for(J=s.length;g<J;g++){var r=s[g],q,w=l+"["+g+"]";switch(r.status){case "added":var D=z?y[r.value]:K(d.utils.unwrapObservable(c),r.value,m);q=F(void 0,D,a,e,b,w,k);h()||(q=d.utils.unwrapObservable(q));w=O(d.utils.unwrapObservable(c),D,n);q===N?B++:A[w-B]=q;n[w]=!0;break;case "retained":D=z?y[r.value]:K(d.utils.unwrapObservable(c),r.value,m);q=K(b,r.value,m);F(q,D,a,e,b,w,k);w=O(d.utils.unwrapObservable(c),D,n);A[w]=
12q;n[w]=!0;break;case "deleted":q=K(b,r.value,m)}t.push({event:r.status,item:q})}b(A);a[e]&&a[e].arrayChanged&&d.utils.arrayForEach(t,function(b){a[e].arrayChanged(b.event,b.item)})}else if(P(c)){b=d.utils.unwrapObservable(b);if(!b){if(h())return s=x(),u()&&(s=v(s)),s;if(u())return v(s);b={}}u()&&(b=v(b));I.save(c,b);if(u())return b;Q(c,function(e){var f=l.length?l+"."+e:e;if(-1==d.utils.arrayIndexOf(a.ignore,f))if(-1!=d.utils.arrayIndexOf(a.copy,f))b[e]=c[e];else if("object"!=typeof c[e]&&"array"!=
13typeof c[e]&&0<a.observe.length&&-1==d.utils.arrayIndexOf(a.observe,f))b[e]=c[e],a.copiedProperties[f]=!0;else{var g=I.get(c[e]),k=F(b[e],c[e],a,e,b,f,b),g=g||k;if(0<a.observe.length&&-1==d.utils.arrayIndexOf(a.observe,f))b[e]=g(),a.copiedProperties[f]=!0;else{if(d.isWriteableObservable(b[e]))b[e](d.utils.unwrapObservable(g));else g=void 0===b[e]?g:d.utils.unwrapObservable(g),b[e]=g;a.mappedProperties[f]=!0}}})}else switch(f.getType(c)){case "function":u()?d.isWriteableObservable(c)?(c(v(c)),b=c):
14b=v(c):b=c;break;default:if(d.isWriteableObservable(b))return q=u()?v(b):d.utils.unwrapObservable(c),b(q),q;h()||u();b=h()?x():d.observable(d.utils.unwrapObservable(c));u()&&b(v(b))}return b}function O(b,c,a){for(var e=0,d=b.length;e<d;e++)if(!0!==a[e]&&b[e]===c)return e;return null}function R(b,c){var a;c&&(a=c(b));"undefined"===f.getType(a)&&(a=b);return d.utils.unwrapObservable(a)}function K(b,c,a){b=d.utils.unwrapObservable(b);for(var e=0,f=b.length;e<f;e++){var l=b[e];if(R(l,a)===c)return l}throw Error("When calling ko.update*, the key '"+
15c+"' was not found!");}function C(b,c){return d.utils.arrayMap(d.utils.unwrapObservable(b),function(a){return c?R(a,c):a})}function Q(b,c){if("array"===f.getType(b))for(var a=0;a<b.length;a++)c(a);else for(a in b)c(a)}function P(b){var c=f.getType(b);return("object"===c||"array"===c)&&null!==b}function T(){var b=[],c=[];this.save=function(a,e){var f=d.utils.arrayIndexOf(b,a);0<=f?c[f]=e:(b.push(a),c.push(e))};this.get=function(a){a=d.utils.arrayIndexOf(b,a);return 0<=a?c[a]:void 0}}function S(){var b=
16{},c=function(a){var c;try{c=a}catch(d){c="$$$"}a=b[c];void 0===a&&(a=new T,b[c]=a);return a};this.save=function(a,b){c(a).save(a,b)};this.get=function(a){return c(a).get(a)}}var p="__ko_mapping__",H=d.dependentObservable,B=0,G,I,L=["create","update","key","arrayChanged"],N={},x={include:["_destroy"],ignore:[],copy:[],observe:[]},j=x;f.isMapped=function(b){return(b=d.utils.unwrapObservable(b))&&b[p]};f.fromJS=function(b){if(0==arguments.length)throw Error("When calling ko.fromJS, pass the object you want to convert.");
17try{B++||(G=[],I=new S);var c,a;2==arguments.length&&(arguments[1][p]?a=arguments[1]:c=arguments[1]);3==arguments.length&&(c=arguments[1],a=arguments[2]);a&&(c=E(c,a[p]));c=z(c);var e=F(a,b,c);a&&(e=a);if(!--B)for(;G.length;){var d=G.pop();d&&d()}e[p]=E(e[p],c);return e}catch(f){throw B=0,f;}};f.fromJSON=function(b){var c=d.utils.parseJson(b);arguments[0]=c;return f.fromJS.apply(this,arguments)};f.updateFromJS=function(){throw Error("ko.mapping.updateFromJS, use ko.mapping.fromJS instead. Please note that the order of parameters is different!");
18};f.updateFromJSON=function(){throw Error("ko.mapping.updateFromJSON, use ko.mapping.fromJSON instead. Please note that the order of parameters is different!");};f.toJS=function(b,c){j||f.resetDefaultOptions();if(0==arguments.length)throw Error("When calling ko.mapping.toJS, pass the object you want to convert.");if("array"!==f.getType(j.ignore))throw Error("ko.mapping.defaultOptions().ignore should be an array.");if("array"!==f.getType(j.include))throw Error("ko.mapping.defaultOptions().include should be an array.");
19if("array"!==f.getType(j.copy))throw Error("ko.mapping.defaultOptions().copy should be an array.");c=z(c,b[p]);return f.visitModel(b,function(a){return d.utils.unwrapObservable(a)},c)};f.toJSON=function(b,c){var a=f.toJS(b,c);return d.utils.stringifyJson(a)};f.defaultOptions=function(){if(0<arguments.length)j=arguments[0];else return j};f.resetDefaultOptions=function(){j={include:x.include.slice(0),ignore:x.ignore.slice(0),copy:x.copy.slice(0)}};f.getType=function(b){if(b&&"object"===typeof b){if(b.constructor===
20Date)return"date";if(b.constructor===Array)return"array"}return typeof b};f.visitModel=function(b,c,a){a=a||{};a.visitedObjects=a.visitedObjects||new S;var e,k=d.utils.unwrapObservable(b);if(P(k))a=z(a,k[p]),c(b,a.parentName),e="array"===f.getType(k)?[]:{};else return c(b,a.parentName);a.visitedObjects.save(b,e);var l=a.parentName;Q(k,function(b){if(!(a.ignore&&-1!=d.utils.arrayIndexOf(a.ignore,b))){var j=k[b],g=a,h=l||"";"array"===f.getType(k)?l&&(h+="["+b+"]"):(l&&(h+="."),h+=b);g.parentName=h;
21if(!(-1===d.utils.arrayIndexOf(a.copy,b)&&-1===d.utils.arrayIndexOf(a.include,b)&&k[p]&&k[p].mappedProperties&&!k[p].mappedProperties[b]&&k[p].copiedProperties&&!k[p].copiedProperties[b]&&"array"!==f.getType(k)))switch(f.getType(d.utils.unwrapObservable(j))){case "object":case "array":case "undefined":g=a.visitedObjects.get(j);e[b]="undefined"!==f.getType(g)?g:f.visitModel(j,c,a);break;default:e[b]=c(j,a.parentName)}}});return e}});
Source/Libraries/Adapters/ModbusAdapters/Scripts/knockout.validation.js+0−1511
@@ -1,1511 +0,0 @@
1/*=============================================================================
2 Author: Eric M. Barnard - @ericmbarnard
3 License: MIT (http://opensource.org/licenses/mit-license.php)
4
5 Description: Validation Library for KnockoutJS
6 Version: 2.0.3
7===============================================================================
8*/
9/*globals require: false, exports: false, define: false, ko: false */
10
11(function (factory) {
12 // Module systems magic dance.
13
14 if (typeof require === "function" && typeof exports === "object" && typeof module === "object") {
15 // CommonJS or Node: hard-coded dependency on "knockout"
16 factory(require("knockout"), exports);
17 } else if (typeof define === "function" && define["amd"]) {
18 // AMD anonymous module with hard-coded dependency on "knockout"
19 define(["knockout", "exports"], factory);
20 } else {
21 // <script> tag: use the global `ko` object, attaching a `mapping` property
22 factory(ko, ko.validation = {});
23 }
24}(function ( ko, exports ) {
25
26 if (typeof (ko) === 'undefined') {
27 throw new Error('Knockout is required, please ensure it is loaded before loading this validation plug-in');
28 }
29
30 // create our namespace object
31 ko.validation = exports;
32
33 var kv = ko.validation,
34 koUtils = ko.utils,
35 unwrap = koUtils.unwrapObservable,
36 forEach = koUtils.arrayForEach,
37 extend = koUtils.extend;
38;/*global ko: false*/
39
40var defaults = {
41 registerExtenders: true,
42 messagesOnModified: true,
43 errorsAsTitle: true, // enables/disables showing of errors as title attribute of the target element.
44 errorsAsTitleOnModified: false, // shows the error when hovering the input field (decorateElement must be true)
45 messageTemplate: null,
46 insertMessages: true, // automatically inserts validation messages as <span></span>
47 parseInputAttributes: false, // parses the HTML5 validation attribute from a form element and adds that to the object
48 writeInputAttributes: false, // adds HTML5 input validation attributes to form elements that ko observable's are bound to
49 decorateInputElement: false, // false to keep backward compatibility
50 decorateElementOnModified: true,// true to keep backward compatibility
51 errorClass: null, // single class for error message and element
52 errorElementClass: 'validationElement', // class to decorate error element
53 errorMessageClass: 'validationMessage', // class to decorate error message
54 allowHtmlMessages: false, // allows HTML in validation messages
55 grouping: {
56 deep: false, //by default grouping is shallow
57 observable: true, //and using observables
58 live: false //react to changes to observableArrays if observable === true
59 },
60 validate: {
61 // throttle: 10
62 }
63};
64
65// make a copy so we can use 'reset' later
66var configuration = extend({}, defaults);
67
68configuration.html5Attributes = ['required', 'pattern', 'min', 'max', 'step'];
69configuration.html5InputTypes = ['email', 'number', 'date'];
70
71configuration.reset = function () {
72 extend(configuration, defaults);
73};
74
75kv.configuration = configuration;
76;kv.utils = (function () {
77 var seedId = new Date().getTime();
78
79 var domData = {}; //hash of data objects that we reference from dom elements
80 var domDataKey = '__ko_validation__';
81
82 return {
83 isArray: function (o) {
84 return o.isArray || Object.prototype.toString.call(o) === '[object Array]';
85 },
86 isObject: function (o) {
87 return o !== null && typeof o === 'object';
88 },
89 isNumber: function(o) {
90 return !isNaN(o);
91 },
92 isObservableArray: function(instance) {
93 return !!instance &&
94 typeof instance["remove"] === "function" &&
95 typeof instance["removeAll"] === "function" &&
96 typeof instance["destroy"] === "function" &&
97 typeof instance["destroyAll"] === "function" &&
98 typeof instance["indexOf"] === "function" &&
99 typeof instance["replace"] === "function";
100 },
101 values: function (o) {
102 var r = [];
103 for (var i in o) {
104 if (o.hasOwnProperty(i)) {
105 r.push(o[i]);
106 }
107 }
108 return r;
109 },
110 getValue: function (o) {
111 return (typeof o === 'function' ? o() : o);
112 },
113 hasAttribute: function (node, attr) {
114 return node.getAttribute(attr) !== null;
115 },
116 getAttribute: function (element, attr) {
117 return element.getAttribute(attr);
118 },
119 setAttribute: function (element, attr, value) {
120 return element.setAttribute(attr, value);
121 },
122 isValidatable: function (o) {
123 return !!(o && o.rules && o.isValid && o.isModified);
124 },
125 insertAfter: function (node, newNode) {
126 node.parentNode.insertBefore(newNode, node.nextSibling);
127 },
128 newId: function () {
129 return seedId += 1;
130 },
131 getConfigOptions: function (element) {
132 var options = kv.utils.contextFor(element);
133
134 return options || kv.configuration;
135 },
136 setDomData: function (node, data) {
137 var key = node[domDataKey];
138
139 if (!key) {
140 node[domDataKey] = key = kv.utils.newId();
141 }
142
143 domData[key] = data;
144 },
145 getDomData: function (node) {
146 var key = node[domDataKey];
147
148 if (!key) {
149 return undefined;
150 }
151
152 return domData[key];
153 },
154 contextFor: function (node) {
155 switch (node.nodeType) {
156 case 1:
157 case 8:
158 var context = kv.utils.getDomData(node);
159 if (context) { return context; }
160 if (node.parentNode) { return kv.utils.contextFor(node.parentNode); }
161 break;
162 }
163 return undefined;
164 },
165 isEmptyVal: function (val) {
166 if (val === undefined) {
167 return true;
168 }
169 if (val === null) {
170 return true;
171 }
172 if (val === "") {
173 return true;
174 }
175 },
176 getOriginalElementTitle: function (element) {
177 var savedOriginalTitle = kv.utils.getAttribute(element, 'data-orig-title'),
178 currentTitle = element.title,
179 hasSavedOriginalTitle = kv.utils.hasAttribute(element, 'data-orig-title');
180
181 return hasSavedOriginalTitle ?
182 savedOriginalTitle : currentTitle;
183 },
184 async: function (expr) {
185 if (window.setImmediate) { window.setImmediate(expr); }
186 else { window.setTimeout(expr, 0); }
187 },
188 forEach: function (object, callback) {
189 if (kv.utils.isArray(object)) {
190 return forEach(object, callback);
191 }
192 for (var prop in object) {
193 if (object.hasOwnProperty(prop)) {
194 callback(object[prop], prop);
195 }
196 }
197 }
198 };
199}());;var api = (function () {
200
201 var isInitialized = 0,
202 configuration = kv.configuration,
203 utils = kv.utils;
204
205 function cleanUpSubscriptions(context) {
206 forEach(context.subscriptions, function (subscription) {
207 subscription.dispose();
208 });
209 context.subscriptions = [];
210 }
211
212 function dispose(context) {
213 if (context.options.deep) {
214 forEach(context.flagged, function (obj) {
215 delete obj.__kv_traversed;
216 });
217 context.flagged.length = 0;
218 }
219
220 if (!context.options.live) {
221 cleanUpSubscriptions(context);
222 }
223 }
224
225 function runTraversal(obj, context) {
226 context.validatables = [];
227 cleanUpSubscriptions(context);
228 traverseGraph(obj, context);
229 dispose(context);
230 }
231
232 function traverseGraph(obj, context, level) {
233 var objValues = [],
234 val = obj.peek ? obj.peek() : obj;
235
236 if (obj.__kv_traversed === true) {
237 return;
238 }
239
240 if (context.options.deep) {
241 obj.__kv_traversed = true;
242 context.flagged.push(obj);
243 }
244
245 //default level value depends on deep option.
246 level = (level !== undefined ? level : context.options.deep ? 1 : -1);
247
248 // if object is observable then add it to the list
249 if (ko.isObservable(obj)) {
250 // ensure it's validatable but don't extend validatedObservable because it
251 // would overwrite isValid property.
252 if (!obj.errors && !utils.isValidatable(obj)) {
253 obj.extend({ validatable: true });
254 }
255 context.validatables.push(obj);
256
257 if (context.options.live && utils.isObservableArray(obj)) {
258 context.subscriptions.push(obj.subscribe(function () {
259 context.graphMonitor.valueHasMutated();
260 }));
261 }
262 }
263
264 //get list of values either from array or object but ignore non-objects
265 // and destroyed objects
266 if (val && !val._destroy) {
267 if (utils.isArray(val)) {
268 objValues = val;
269 }
270 else if (utils.isObject(val)) {
271 objValues = utils.values(val);
272 }
273 }
274
275 //process recursively if it is deep grouping
276 if (level !== 0) {
277 utils.forEach(objValues, function (observable) {
278 //but not falsy things and not HTML Elements
279 if (observable && !observable.nodeType && (!ko.isComputed(observable) || observable.rules)) {
280 traverseGraph(observable, context, level + 1);
281 }
282 });
283 }
284 }
285
286 function collectErrors(array) {
287 var errors = [];
288 forEach(array, function (observable) {
289 // Do not collect validatedObservable errors
290 if (utils.isValidatable(observable) && !observable.isValid()) {
291 // Use peek because we don't want a dependency for 'error' property because it
292 // changes before 'isValid' does. (Issue #99)
293 errors.push(observable.error.peek());
294 }
295 });
296 return errors;
297 }
298
299 return {
300 //Call this on startup
301 //any config can be overridden with the passed in options
302 init: function (options, force) {
303 //done run this multiple times if we don't really want to
304 if (isInitialized > 0 && !force) {
305 return;
306 }
307
308 //because we will be accessing options properties it has to be an object at least
309 options = options || {};
310 //if specific error classes are not provided then apply generic errorClass
311 //it has to be done on option so that options.errorClass can override default
312 //errorElementClass and errorMessage class but not those provided in options
313 options.errorElementClass = options.errorElementClass || options.errorClass || configuration.errorElementClass;
314 options.errorMessageClass = options.errorMessageClass || options.errorClass || configuration.errorMessageClass;
315
316 extend(configuration, options);
317
318 if (configuration.registerExtenders) {
319 kv.registerExtenders();
320 }
321
322 isInitialized = 1;
323 },
324
325 // resets the config back to its original state
326 reset: kv.configuration.reset,
327
328 // recursively walks a viewModel and creates an object that
329 // provides validation information for the entire viewModel
330 // obj -> the viewModel to walk
331 // options -> {
332 // deep: false, // if true, will walk past the first level of viewModel properties
333 // observable: false // if true, returns a computed observable indicating if the viewModel is valid
334 // }
335 group: function group(obj, options) { // array of observables or viewModel
336 options = extend(extend({}, configuration.grouping), options);
337
338 var context = {
339 options: options,
340 graphMonitor: ko.observable(),
341 flagged: [],
342 subscriptions: [],
343 validatables: []
344 };
345
346 var result = null;
347
348 //if using observables then traverse structure once and add observables
349 if (options.observable) {
350 result = ko.computed(function () {
351 context.graphMonitor(); //register dependency
352 runTraversal(obj, context);
353 return collectErrors(context.validatables);
354 });
355 }
356 else { //if not using observables then every call to error() should traverse the structure
357 result = function () {
358 runTraversal(obj, context);
359 return collectErrors(context.validatables);
360 };
361 }
362
363 result.showAllMessages = function (show) { // thanks @heliosPortal
364 if (show === undefined) {//default to true
365 show = true;
366 }
367
368 result.forEach(function (observable) {
369 if (utils.isValidatable(observable)) {
370 observable.isModified(show);
371 }
372 });
373 };
374
375 result.isAnyMessageShown = function () {
376 var invalidAndModifiedPresent;
377
378 invalidAndModifiedPresent = !!result.find(function (observable) {
379 return utils.isValidatable(observable) && !observable.isValid() && observable.isModified();
380 });
381 return invalidAndModifiedPresent;
382 };
383
384 result.filter = function(predicate) {
385 predicate = predicate || function () { return true; };
386 // ensure we have latest changes
387 result();
388
389 return koUtils.arrayFilter(context.validatables, predicate);
390 };
391
392 result.find = function(predicate) {
393 predicate = predicate || function () { return true; };
394 // ensure we have latest changes
395 result();
396
397 return koUtils.arrayFirst(context.validatables, predicate);
398 };
399
400 result.forEach = function(callback) {
401 callback = callback || function () { };
402 // ensure we have latest changes
403 result();
404
405 forEach(context.validatables, callback);
406 };
407
408 result.map = function(mapping) {
409 mapping = mapping || function (item) { return item; };
410 // ensure we have latest changes
411 result();
412
413 return koUtils.arrayMap(context.validatables, mapping);
414 };
415
416 /**
417 * @private You should not rely on this method being here.
418 * It's a private method and it may change in the future.
419 *
420 * @description Updates the validated object and collects errors from it.
421 */
422 result._updateState = function(newValue) {
423 if (!utils.isObject(newValue)) {
424 throw new Error('An object is required.');
425 }
426 obj = newValue;
427 if (options.observable) {
428 context.graphMonitor.valueHasMutated();
429 }
430 else {
431 runTraversal(newValue, context);
432 return collectErrors(context.validatables);
433 }
434 };
435 return result;
436 },
437
438 formatMessage: function (message, params, observable) {
439 if (utils.isObject(params) && params.typeAttr) {
440 params = params.value;
441 }
442 if (typeof message === 'function') {
443 return message(params, observable);
444 }
445 var replacements = unwrap(params);
446 if (replacements == null) {
447 replacements = [];
448 }
449 if (!utils.isArray(replacements)) {
450 replacements = [replacements];
451 }
452 return message.replace(/{(\d+)}/gi, function(match, index) {
453 if (typeof replacements[index] !== 'undefined') {
454 return replacements[index];
455 }
456 return match;
457 });
458 },
459
460 // addRule:
461 // This takes in a ko.observable and a Rule Context - which is just a rule name and params to supply to the validator
462 // ie: kv.addRule(myObservable, {
463 // rule: 'required',
464 // params: true
465 // });
466 //
467 addRule: function (observable, rule) {
468 observable.extend({ validatable: true });
469
470 var hasRule = !!koUtils.arrayFirst(observable.rules(), function(item) {
471 return item.rule && item.rule === rule.rule;
472 });
473
474 if (!hasRule) {
475 //push a Rule Context to the observables local array of Rule Contexts
476 observable.rules.push(rule);
477 }
478 return observable;
479 },
480
481 // addAnonymousRule:
482 // Anonymous Rules essentially have all the properties of a Rule, but are only specific for a certain property
483 // and developers typically are wanting to add them on the fly or not register a rule with the 'kv.rules' object
484 //
485 // Example:
486 // var test = ko.observable('something').extend{(
487 // validation: {
488 // validator: function(val, someOtherVal){
489 // return true;
490 // },
491 // message: "Something must be really wrong!',
492 // params: true
493 // }
494 // )};
495 addAnonymousRule: function (observable, ruleObj) {
496 if (ruleObj['message'] === undefined) {
497 ruleObj['message'] = 'Error';
498 }
499
500 //make sure onlyIf is honoured
501 if (ruleObj.onlyIf) {
502 ruleObj.condition = ruleObj.onlyIf;
503 }
504
505 //add the anonymous rule to the observable
506 kv.addRule(observable, ruleObj);
507 },
508
509 addExtender: function (ruleName) {
510 ko.extenders[ruleName] = function (observable, params) {
511 //params can come in a few flavors
512 // 1. Just the params to be passed to the validator
513 // 2. An object containing the Message to be used and the Params to pass to the validator
514 // 3. A condition when the validation rule to be applied
515 //
516 // Example:
517 // var test = ko.observable(3).extend({
518 // max: {
519 // message: 'This special field has a Max of {0}',
520 // params: 2,
521 // onlyIf: function() {
522 // return specialField.IsVisible();
523 // }
524 // }
525 // )};
526 //
527 if (params && (params.message || params.onlyIf)) { //if it has a message or condition object, then its an object literal to use
528 return kv.addRule(observable, {
529 rule: ruleName,
530 message: params.message,
531 params: utils.isEmptyVal(params.params) ? true : params.params,
532 condition: params.onlyIf
533 });
534 } else {
535 return kv.addRule(observable, {
536 rule: ruleName,
537 params: params
538 });
539 }
540 };
541 },
542
543 // loops through all kv.rules and adds them as extenders to
544 // ko.extenders
545 registerExtenders: function () { // root extenders optional, use 'validation' extender if would cause conflicts
546 if (configuration.registerExtenders) {
547 for (var ruleName in kv.rules) {
548 if (kv.rules.hasOwnProperty(ruleName)) {
549 if (!ko.extenders[ruleName]) {
550 kv.addExtender(ruleName);
551 }
552 }
553 }
554 }
555 },
556
557 //creates a span next to the @element with the specified error class
558 insertValidationMessage: function (element) {
559 var span = document.createElement('SPAN');
560 span.className = utils.getConfigOptions(element).errorMessageClass;
561 utils.insertAfter(element, span);
562 return span;
563 },
564
565 // if html-5 validation attributes have been specified, this parses
566 // the attributes on @element
567 parseInputValidationAttributes: function (element, valueAccessor) {
568 forEach(kv.configuration.html5Attributes, function (attr) {
569 if (utils.hasAttribute(element, attr)) {
570
571 var params = element.getAttribute(attr) || true;
572
573 if (attr === 'min' || attr === 'max')
574 {
575 // If we're validating based on the min and max attributes, we'll
576 // need to know what the 'type' attribute is set to
577 var typeAttr = element.getAttribute('type');
578 if (typeof typeAttr === "undefined" || !typeAttr)
579 {
580 // From http://www.w3.org/TR/html-markup/input:
581 // An input element with no type attribute specified represents the
582 // same thing as an input element with its type attribute set to "text".
583 typeAttr = "text";
584 }
585 params = {typeAttr: typeAttr, value: params};
586 }
587
588 kv.addRule(valueAccessor(), {
589 rule: attr,
590 params: params
591 });
592 }
593 });
594
595 var currentType = element.getAttribute('type');
596 forEach(kv.configuration.html5InputTypes, function (type) {
597 if (type === currentType) {
598 kv.addRule(valueAccessor(), {
599 rule: (type === 'date') ? 'dateISO' : type,
600 params: true
601 });
602 }
603 });
604 },
605
606 // writes html5 validation attributes on the element passed in
607 writeInputValidationAttributes: function (element, valueAccessor) {
608 var observable = valueAccessor();
609
610 if (!observable || !observable.rules) {
611 return;
612 }
613
614 var contexts = observable.rules(); // observable array
615
616 // loop through the attributes and add the information needed
617 forEach(kv.configuration.html5Attributes, function (attr) {
618 var ctx = koUtils.arrayFirst(contexts, function (ctx) {
619 return ctx.rule && ctx.rule.toLowerCase() === attr.toLowerCase();
620 });
621
622 if (!ctx) {
623 return;
624 }
625
626 // we have a rule matching a validation attribute at this point
627 // so lets add it to the element along with the params
628 ko.computed({
629 read: function() {
630 var params = ko.unwrap(ctx.params);
631
632 // we have to do some special things for the pattern validation
633 if (ctx.rule === "pattern" && params instanceof RegExp) {
634 // we need the pure string representation of the RegExpr without the //gi stuff
635 params = params.source;
636 }
637
638 element.setAttribute(attr, params);
639 },
640 disposeWhenNodeIsRemoved: element
641 });
642 });
643
644 contexts = null;
645 },
646
647 //take an existing binding handler and make it cause automatic validations
648 makeBindingHandlerValidatable: function (handlerName) {
649 var init = ko.bindingHandlers[handlerName].init;
650
651 ko.bindingHandlers[handlerName].init = function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
652
653 init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
654
655 return ko.bindingHandlers['validationCore'].init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
656 };
657 },
658
659 // visit an objects properties and apply validation rules from a definition
660 setRules: function (target, definition) {
661 var setRules = function (target, definition) {
662 if (!target || !definition) { return; }
663
664 for (var prop in definition) {
665 if (!definition.hasOwnProperty(prop)) { continue; }
666 var ruleDefinitions = definition[prop];
667
668 //check the target property exists and has a value
669 if (!target[prop]) { continue; }
670 var targetValue = target[prop],
671 unwrappedTargetValue = unwrap(targetValue),
672 rules = {},
673 nonRules = {};
674
675 for (var rule in ruleDefinitions) {
676 if (!ruleDefinitions.hasOwnProperty(rule)) { continue; }
677 if (kv.rules[rule]) {
678 rules[rule] = ruleDefinitions[rule];
679 } else {
680 nonRules[rule] = ruleDefinitions[rule];
681 }
682 }
683
684 //apply rules
685 if (ko.isObservable(targetValue)) {
686 targetValue.extend(rules);
687 }
688
689 //then apply child rules
690 //if it's an array, apply rules to all children
691 if (unwrappedTargetValue && utils.isArray(unwrappedTargetValue)) {
692 for (var i = 0; i < unwrappedTargetValue.length; i++) {
693 setRules(unwrappedTargetValue[i], nonRules);
694 }
695 //otherwise, just apply to this property
696 } else {
697 setRules(unwrappedTargetValue, nonRules);
698 }
699 }
700 };
701 setRules(target, definition);
702 }
703 };
704
705}());
706
707// expose api publicly
708extend(ko.validation, api);
709;//Validation Rules:
710// You can view and override messages or rules via:
711// kv.rules[ruleName]
712//
713// To implement a custom Rule, simply use this template:
714// kv.rules['<custom rule name>'] = {
715// validator: function (val, param) {
716// <custom logic>
717// return <true or false>;
718// },
719// message: '<custom validation message>' //optionally you can also use a '{0}' to denote a placeholder that will be replaced with your 'param'
720// };
721//
722// Example:
723// kv.rules['mustEqual'] = {
724// validator: function( val, mustEqualVal ){
725// return val === mustEqualVal;
726// },
727// message: 'This field must equal {0}'
728// };
729//
730kv.rules = {};
731kv.rules['required'] = {
732 validator: function (val, required) {
733 var testVal;
734
735 if (val === undefined || val === null) {
736 return !required;
737 }
738
739 testVal = val;
740 if (typeof (val) === 'string') {
741 if (String.prototype.trim) {
742 testVal = val.trim();
743 }
744 else {
745 testVal = val.replace(/^\s+|\s+$/g, '');
746 }
747 }
748
749 if (!required) {// if they passed: { required: false }, then don't require this
750 return true;
751 }
752
753 return ((testVal + '').length > 0);
754 },
755 message: 'This field is required.'
756};
757
758function minMaxValidatorFactory(validatorName) {
759 var isMaxValidation = validatorName === "max";
760
761 return function (val, options) {
762 if (kv.utils.isEmptyVal(val)) {
763 return true;
764 }
765
766 var comparisonValue, type;
767 if (options.typeAttr === undefined) {
768 // This validator is being called from javascript rather than
769 // being bound from markup
770 type = "text";
771 comparisonValue = options;
772 } else {
773 type = options.typeAttr;
774 comparisonValue = options.value;
775 }
776
777 // From http://www.w3.org/TR/2012/WD-html5-20121025/common-input-element-attributes.html#attr-input-min,
778 // if the value is parseable to a number, then the minimum should be numeric
779 if (!isNaN(comparisonValue) && !(comparisonValue instanceof Date)) {
780 type = "number";
781 }
782
783 var regex, valMatches, comparisonValueMatches;
784 switch (type.toLowerCase()) {
785 case "week":
786 regex = /^(\d{4})-W(\d{2})$/;
787 valMatches = val.match(regex);
788 if (valMatches === null) {
789 throw new Error("Invalid value for " + validatorName + " attribute for week input. Should look like " +
790 "'2000-W33' http://www.w3.org/TR/html-markup/input.week.html#input.week.attrs.min");
791 }
792 comparisonValueMatches = comparisonValue.match(regex);
793 // If no regex matches were found, validation fails
794 if (!comparisonValueMatches) {
795 return false;
796 }
797
798 if (isMaxValidation) {
799 return (valMatches[1] < comparisonValueMatches[1]) || // older year
800 // same year, older week
801 ((valMatches[1] === comparisonValueMatches[1]) && (valMatches[2] <= comparisonValueMatches[2]));
802 } else {
803 return (valMatches[1] > comparisonValueMatches[1]) || // newer year
804 // same year, newer week
805 ((valMatches[1] === comparisonValueMatches[1]) && (valMatches[2] >= comparisonValueMatches[2]));
806 }
807 break;
808
809 case "month":
810 regex = /^(\d{4})-(\d{2})$/;
811 valMatches = val.match(regex);
812 if (valMatches === null) {
813 throw new Error("Invalid value for " + validatorName + " attribute for month input. Should look like " +
814 "'2000-03' http://www.w3.org/TR/html-markup/input.month.html#input.month.attrs.min");
815 }
816 comparisonValueMatches = comparisonValue.match(regex);
817 // If no regex matches were found, validation fails
818 if (!comparisonValueMatches) {
819 return false;
820 }
821
822 if (isMaxValidation) {
823 return ((valMatches[1] < comparisonValueMatches[1]) || // older year
824 // same year, older month
825 ((valMatches[1] === comparisonValueMatches[1]) && (valMatches[2] <= comparisonValueMatches[2])));
826 } else {
827 return (valMatches[1] > comparisonValueMatches[1]) || // newer year
828 // same year, newer month
829 ((valMatches[1] === comparisonValueMatches[1]) && (valMatches[2] >= comparisonValueMatches[2]));
830 }
831 break;
832
833 case "number":
834 case "range":
835 if (isMaxValidation) {
836 return (!isNaN(val) && parseFloat(val) <= parseFloat(comparisonValue));
837 } else {
838 return (!isNaN(val) && parseFloat(val) >= parseFloat(comparisonValue));
839 }
840 break;
841
842 default:
843 if (isMaxValidation) {
844 return val <= comparisonValue;
845 } else {
846 return val >= comparisonValue;
847 }
848 }
849 };
850}
851
852kv.rules['min'] = {
853 validator: minMaxValidatorFactory("min"),
854 message: 'Please enter a value greater than or equal to {0}.'
855};
856
857kv.rules['max'] = {
858 validator: minMaxValidatorFactory("max"),
859 message: 'Please enter a value less than or equal to {0}.'
860};
861
862kv.rules['minLength'] = {
863 validator: function (val, minLength) {
864 if(kv.utils.isEmptyVal(val)) { return true; }
865 var normalizedVal = kv.utils.isNumber(val) ? ('' + val) : val;
866 return normalizedVal.length >= minLength;
867 },
868 message: 'Please enter at least {0} characters.'
869};
870
871kv.rules['maxLength'] = {
872 validator: function (val, maxLength) {
873 if(kv.utils.isEmptyVal(val)) { return true; }
874 var normalizedVal = kv.utils.isNumber(val) ? ('' + val) : val;
875 return normalizedVal.length <= maxLength;
876 },
877 message: 'Please enter no more than {0} characters.'
878};
879
880kv.rules['pattern'] = {
881 validator: function (val, regex) {
882 return kv.utils.isEmptyVal(val) || val.toString().match(regex) !== null;
883 },
884 message: 'Please check this value.'
885};
886
887kv.rules['step'] = {
888 validator: function (val, step) {
889
890 // in order to handle steps of .1 & .01 etc.. Modulus won't work
891 // if the value is a decimal, so we have to correct for that
892 if (kv.utils.isEmptyVal(val) || step === 'any') { return true; }
893 var dif = (val * 100) % (step * 100);
894 return Math.abs(dif) < 0.00001 || Math.abs(1 - dif) < 0.00001;
895 },
896 message: 'The value must increment by {0}.'
897};
898
899kv.rules['email'] = {
900 validator: function (val, validate) {
901 if (!validate) { return true; }
902
903 //I think an empty email address is also a valid entry
904 //if one want's to enforce entry it should be done with 'required: true'
905 return kv.utils.isEmptyVal(val) || (
906 // jquery validate regex - thanks Scott Gonzalez
907 validate && /^((([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(val)
908 );
909 },
910 message: 'Please enter a proper email address.'
911};
912
913kv.rules['date'] = {
914 validator: function (value, validate) {
915 if (!validate) { return true; }
916 return kv.utils.isEmptyVal(value) || (validate && !/Invalid|NaN/.test(new Date(value)));
917 },
918 message: 'Please enter a proper date.'
919};
920
921kv.rules['dateISO'] = {
922 validator: function (value, validate) {
923 if (!validate) { return true; }
924 return kv.utils.isEmptyVal(value) || (validate && /^\d{4}[-/](?:0?[1-9]|1[012])[-/](?:0?[1-9]|[12][0-9]|3[01])$/.test(value));
925 },
926 message: 'Please enter a proper date.'
927};
928
929kv.rules['number'] = {
930 validator: function (value, validate) {
931 if (!validate) { return true; }
932 return kv.utils.isEmptyVal(value) || (validate && /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value));
933 },
934 message: 'Please enter a number.'
935};
936
937kv.rules['digit'] = {
938 validator: function (value, validate) {
939 if (!validate) { return true; }
940 return kv.utils.isEmptyVal(value) || (validate && /^\d+$/.test(value));
941 },
942 message: 'Please enter a digit.'
943};
944
945kv.rules['phoneUS'] = {
946 validator: function (phoneNumber, validate) {
947 if (!validate) { return true; }
948 if (kv.utils.isEmptyVal(phoneNumber)) { return true; } // makes it optional, use 'required' rule if it should be required
949 if (typeof (phoneNumber) !== 'string') { return false; }
950 phoneNumber = phoneNumber.replace(/\s+/g, "");
951 return validate && phoneNumber.length > 9 && phoneNumber.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
952 },
953 message: 'Please specify a valid phone number.'
954};
955
956kv.rules['equal'] = {
957 validator: function (val, params) {
958 var otherValue = params;
959 return val === kv.utils.getValue(otherValue);
960 },
961 message: 'Values must equal.'
962};
963
964kv.rules['notEqual'] = {
965 validator: function (val, params) {
966 var otherValue = params;
967 return val !== kv.utils.getValue(otherValue);
968 },
969 message: 'Please choose another value.'
970};
971
972//unique in collection
973// options are:
974// collection: array or function returning (observable) array
975// in which the value has to be unique
976// valueAccessor: function that returns value from an object stored in collection
977// if it is null the value is compared directly
978// external: set to true when object you are validating is automatically updating collection
979kv.rules['unique'] = {
980 validator: function (val, options) {
981 var c = kv.utils.getValue(options.collection),
982 external = kv.utils.getValue(options.externalValue),
983 counter = 0;
984
985 if (!val || !c) { return true; }
986
987 koUtils.arrayFilter(c, function (item) {
988 if (val === (options.valueAccessor ? options.valueAccessor(item) : item)) { counter++; }
989 });
990 // if value is external even 1 same value in collection means the value is not unique
991 return counter < (!!external ? 1 : 2);
992 },
993 message: 'Please make sure the value is unique.'
994};
995
996
997//now register all of these!
998(function () {
999 kv.registerExtenders();
1000}());
1001;// The core binding handler
1002// this allows us to setup any value binding that internally always
1003// performs the same functionality
1004ko.bindingHandlers['validationCore'] = (function () {
1005
1006 return {
1007 init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
1008 var config = kv.utils.getConfigOptions(element);
1009 var observable = valueAccessor();
1010
1011 // parse html5 input validation attributes, optional feature
1012 if (config.parseInputAttributes) {
1013 kv.utils.async(function () { kv.parseInputValidationAttributes(element, valueAccessor); });
1014 }
1015
1016 // if requested insert message element and apply bindings
1017 if (config.insertMessages && kv.utils.isValidatable(observable)) {
1018
1019 // insert the <span></span>
1020 var validationMessageElement = kv.insertValidationMessage(element);
1021
1022 // if we're told to use a template, make sure that gets rendered
1023 if (config.messageTemplate) {
1024 ko.renderTemplate(config.messageTemplate, { field: observable }, null, validationMessageElement, 'replaceNode');
1025 } else {
1026 ko.applyBindingsToNode(validationMessageElement, { validationMessage: observable });
1027 }
1028 }
1029
1030 // write the html5 attributes if indicated by the config
1031 if (config.writeInputAttributes && kv.utils.isValidatable(observable)) {
1032
1033 kv.writeInputValidationAttributes(element, valueAccessor);
1034 }
1035
1036 // if requested, add binding to decorate element
1037 if (config.decorateInputElement && kv.utils.isValidatable(observable)) {
1038 ko.applyBindingsToNode(element, { validationElement: observable });
1039 }
1040 }
1041 };
1042
1043}());
1044
1045// override for KO's default 'value', 'checked', 'textInput' and selectedOptions bindings
1046kv.makeBindingHandlerValidatable("value");
1047kv.makeBindingHandlerValidatable("checked");
1048if (ko.bindingHandlers.textInput) {
1049 kv.makeBindingHandlerValidatable("textInput");
1050}
1051kv.makeBindingHandlerValidatable("selectedOptions");
1052
1053
1054ko.bindingHandlers['validationMessage'] = { // individual error message, if modified or post binding
1055 update: function (element, valueAccessor) {
1056 var obsv = valueAccessor(),
1057 config = kv.utils.getConfigOptions(element),
1058 val = unwrap(obsv),
1059 msg = null,
1060 isModified = false,
1061 isValid = false;
1062
1063 if (obsv === null || typeof obsv === 'undefined') {
1064 throw new Error('Cannot bind validationMessage to undefined value. data-bind expression: ' +
1065 element.getAttribute('data-bind'));
1066 }
1067
1068 isModified = obsv.isModified && obsv.isModified();
1069 isValid = obsv.isValid && obsv.isValid();
1070
1071 var error = null;
1072 if (!config.messagesOnModified || isModified) {
1073 error = isValid ? null : obsv.error;
1074 }
1075
1076 var isVisible = !config.messagesOnModified || isModified ? !isValid : false;
1077 var isCurrentlyVisible = element.style.display !== "none";
1078
1079 if (config.allowHtmlMessages) {
1080 koUtils.setHtml(element, error);
1081 } else {
1082 ko.bindingHandlers.text.update(element, function () { return error; });
1083 }
1084
1085 if (isCurrentlyVisible && !isVisible) {
1086 element.style.display = 'none';
1087 } else if (!isCurrentlyVisible && isVisible) {
1088 element.style.display = '';
1089 }
1090 }
1091};
1092
1093ko.bindingHandlers['validationElement'] = {
1094 update: function (element, valueAccessor, allBindingsAccessor) {
1095 var obsv = valueAccessor(),
1096 config = kv.utils.getConfigOptions(element),
1097 val = unwrap(obsv),
1098 msg = null,
1099 isModified = false,
1100 isValid = false;
1101
1102 if (obsv === null || typeof obsv === 'undefined') {
1103 throw new Error('Cannot bind validationElement to undefined value. data-bind expression: ' +
1104 element.getAttribute('data-bind'));
1105 }
1106
1107 isModified = obsv.isModified && obsv.isModified();
1108 isValid = obsv.isValid && obsv.isValid();
1109
1110 // create an evaluator function that will return something like:
1111 // css: { validationElement: true }
1112 var cssSettingsAccessor = function () {
1113 var css = {};
1114
1115 var shouldShow = ((!config.decorateElementOnModified || isModified) ? !isValid : false);
1116
1117 // css: { validationElement: false }
1118 css[config.errorElementClass] = shouldShow;
1119
1120 return css;
1121 };
1122
1123 //add or remove class on the element;
1124 ko.bindingHandlers.css.update(element, cssSettingsAccessor, allBindingsAccessor);
1125 if (!config.errorsAsTitle) { return; }
1126
1127 ko.bindingHandlers.attr.update(element, function () {
1128 var
1129 hasModification = !config.errorsAsTitleOnModified || isModified,
1130 title = kv.utils.getOriginalElementTitle(element);
1131
1132 if (hasModification && !isValid) {
1133 return { title: obsv.error, 'data-orig-title': title };
1134 } else if (!hasModification || isValid) {
1135 return { title: title, 'data-orig-title': null };
1136 }
1137 });
1138 }
1139};
1140
1141// ValidationOptions:
1142// This binding handler allows you to override the initial config by setting any of the options for a specific element or context of elements
1143//
1144// Example:
1145// <div data-bind="validationOptions: { insertMessages: true, messageTemplate: 'customTemplate', errorMessageClass: 'mySpecialClass'}">
1146// <input type="text" data-bind="value: someValue"/>
1147// <input type="text" data-bind="value: someValue2"/>
1148// </div>
1149ko.bindingHandlers['validationOptions'] = (function () {
1150 return {
1151 init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
1152 var options = unwrap(valueAccessor());
1153 if (options) {
1154 var newConfig = extend({}, kv.configuration);
1155 extend(newConfig, options);
1156
1157 //store the validation options on the node so we can retrieve it later
1158 kv.utils.setDomData(element, newConfig);
1159 }
1160 }
1161 };
1162}());
1163;// Validation Extender:
1164// This is for creating custom validation logic on the fly
1165// Example:
1166// var test = ko.observable('something').extend{(
1167// validation: {
1168// validator: function(val, someOtherVal){
1169// return true;
1170// },
1171// message: "Something must be really wrong!',
1172// params: true
1173// }
1174// )};
1175ko.extenders['validation'] = function (observable, rules) { // allow single rule or array
1176 forEach(kv.utils.isArray(rules) ? rules : [rules], function (rule) {
1177 // the 'rule' being passed in here has no name to identify a core Rule,
1178 // so we add it as an anonymous rule
1179 // If the developer is wanting to use a core Rule, but use a different message see the 'addExtender' logic for examples
1180 kv.addAnonymousRule(observable, rule);
1181 });
1182 return observable;
1183};
1184
1185//This is the extender that makes a Knockout Observable also 'Validatable'
1186//examples include:
1187// 1. var test = ko.observable('something').extend({validatable: true});
1188// this will ensure that the Observable object is setup properly to respond to rules
1189//
1190// 2. test.extend({validatable: false});
1191// this will remove the validation properties from the Observable object should you need to do that.
1192ko.extenders['validatable'] = function (observable, options) {
1193 if (!kv.utils.isObject(options)) {
1194 options = { enable: options };
1195 }
1196
1197 if (!('enable' in options)) {
1198 options.enable = true;
1199 }
1200
1201 if (options.enable && !kv.utils.isValidatable(observable)) {
1202 var config = kv.configuration.validate || {};
1203 var validationOptions = {
1204 throttleEvaluation : options.throttle || config.throttle
1205 };
1206
1207 observable.error = ko.observable(null); // holds the error message, we only need one since we stop processing validators when one is invalid
1208
1209 // observable.rules:
1210 // ObservableArray of Rule Contexts, where a Rule Context is simply the name of a rule and the params to supply to it
1211 //
1212 // Rule Context = { rule: '<rule name>', params: '<passed in params>', message: '<Override of default Message>' }
1213 observable.rules = ko.observableArray(); //holds the rule Contexts to use as part of validation
1214
1215 //in case async validation is occurring
1216 observable.isValidating = ko.observable(false);
1217
1218 //the true holder of whether the observable is valid or not
1219 observable.__valid__ = ko.observable(true);
1220
1221 observable.isModified = ko.observable(false);
1222
1223 // a semi-protected observable
1224 observable.isValid = ko.computed(observable.__valid__);
1225
1226 //manually set error state
1227 observable.setError = function (error) {
1228 var previousError = observable.error.peek();
1229 var previousIsValid = observable.__valid__.peek();
1230
1231 observable.error(error);
1232 observable.__valid__(false);
1233
1234 if (previousError !== error && !previousIsValid) {
1235 // if the observable was not valid before then isValid will not mutate,
1236 // hence causing any grouping to not display the latest error.
1237 observable.isValid.notifySubscribers();
1238 }
1239 };
1240
1241 //manually clear error state
1242 observable.clearError = function () {
1243 observable.error(null);
1244 observable.__valid__(true);
1245 return observable;
1246 };
1247
1248 //subscribe to changes in the observable
1249 var h_change = observable.subscribe(function () {
1250 observable.isModified(true);
1251 });
1252
1253 // we use a computed here to ensure that anytime a dependency changes, the
1254 // validation logic evaluates
1255 var h_obsValidationTrigger = ko.computed(extend({
1256 read: function () {
1257 var obs = observable(),
1258 ruleContexts = observable.rules();
1259
1260 kv.validateObservable(observable);
1261
1262 return true;
1263 }
1264 }, validationOptions));
1265
1266 extend(h_obsValidationTrigger, validationOptions);
1267
1268 observable._disposeValidation = function () {
1269 //first dispose of the subscriptions
1270 observable.isValid.dispose();
1271 observable.rules.removeAll();
1272 h_change.dispose();
1273 h_obsValidationTrigger.dispose();
1274
1275 delete observable['rules'];
1276 delete observable['error'];
1277 delete observable['isValid'];
1278 delete observable['isValidating'];
1279 delete observable['__valid__'];
1280 delete observable['isModified'];
1281 delete observable['setError'];
1282 delete observable['clearError'];
1283 delete observable['_disposeValidation'];
1284 };
1285 } else if (options.enable === false && observable._disposeValidation) {
1286 observable._disposeValidation();
1287 }
1288 return observable;
1289};
1290
1291function validateSync(observable, rule, ctx) {
1292 //Execute the validator and see if its valid
1293 if (!rule.validator(observable(), (ctx.params === undefined ? true : unwrap(ctx.params)))) { // default param is true, eg. required = true
1294
1295 //not valid, so format the error message and stick it in the 'error' variable
1296 observable.setError(kv.formatMessage(
1297 ctx.message || rule.message,
1298 unwrap(ctx.params),
1299 observable));
1300 return false;
1301 } else {
1302 return true;
1303 }
1304}
1305
1306function validateAsync(observable, rule, ctx) {
1307 observable.isValidating(true);
1308
1309 var callBack = function (valObj) {
1310 var isValid = false,
1311 msg = '';
1312
1313 if (!observable.__valid__()) {
1314
1315 // since we're returning early, make sure we turn this off
1316 observable.isValidating(false);
1317
1318 return; //if its already NOT valid, don't add to that
1319 }
1320
1321 //we were handed back a complex object
1322 if (valObj['message']) {
1323 isValid = valObj.isValid;
1324 msg = valObj.message;
1325 } else {
1326 isValid = valObj;
1327 }
1328
1329 if (!isValid) {
1330 //not valid, so format the error message and stick it in the 'error' variable
1331 observable.error(kv.formatMessage(
1332 msg || ctx.message || rule.message,
1333 unwrap(ctx.params),
1334 observable));
1335 observable.__valid__(isValid);
1336 }
1337
1338 // tell it that we're done
1339 observable.isValidating(false);
1340 };
1341
1342 kv.utils.async(function() {
1343 //fire the validator and hand it the callback
1344 rule.validator(observable(), ctx.params === undefined ? true : unwrap(ctx.params), callBack);
1345 });
1346}
1347
1348kv.validateObservable = function (observable) {
1349 var i = 0,
1350 rule, // the rule validator to execute
1351 ctx, // the current Rule Context for the loop
1352 ruleContexts = observable.rules(), //cache for iterator
1353 len = ruleContexts.length; //cache for iterator
1354
1355 for (; i < len; i++) {
1356
1357 //get the Rule Context info to give to the core Rule
1358 ctx = ruleContexts[i];
1359
1360 // checks an 'onlyIf' condition
1361 if (ctx.condition && !ctx.condition()) {
1362 continue;
1363 }
1364
1365 //get the core Rule to use for validation
1366 rule = ctx.rule ? kv.rules[ctx.rule] : ctx;
1367
1368 if (rule['async'] || ctx['async']) {
1369 //run async validation
1370 validateAsync(observable, rule, ctx);
1371
1372 } else {
1373 //run normal sync validation
1374 if (!validateSync(observable, rule, ctx)) {
1375 return false; //break out of the loop
1376 }
1377 }
1378 }
1379 //finally if we got this far, make the observable valid again!
1380 observable.clearError();
1381 return true;
1382};
1383;
1384var _locales = {};
1385var _currentLocale;
1386
1387kv.defineLocale = function(name, values) {
1388 if (name && values) {
1389 _locales[name.toLowerCase()] = values;
1390 return values;
1391 }
1392 return null;
1393};
1394
1395kv.locale = function(name) {
1396 if (name) {
1397 name = name.toLowerCase();
1398
1399 if (_locales.hasOwnProperty(name)) {
1400 kv.localize(_locales[name]);
1401 _currentLocale = name;
1402 }
1403 else {
1404 throw new Error('Localization ' + name + ' has not been loaded.');
1405 }
1406 }
1407 return _currentLocale;
1408};
1409
1410//quick function to override rule messages
1411kv.localize = function (msgTranslations) {
1412 var rules = kv.rules;
1413
1414 //loop the properties in the object and assign the msg to the rule
1415 for (var ruleName in msgTranslations) {
1416 if (rules.hasOwnProperty(ruleName)) {
1417 rules[ruleName].message = msgTranslations[ruleName];
1418 }
1419 }
1420};
1421
1422// Populate default locale (this will make en-US.js somewhat redundant)
1423(function() {
1424 var localeData = {};
1425 var rules = kv.rules;
1426
1427 for (var ruleName in rules) {
1428 if (rules.hasOwnProperty(ruleName)) {
1429 localeData[ruleName] = rules[ruleName].message;
1430 }
1431 }
1432 kv.defineLocale('en-us', localeData);
1433})();
1434
1435// No need to invoke locale because the messages are already defined along with the rules for en-US
1436_currentLocale = 'en-us';
1437;/**
1438 * Possible invocations:
1439 * applyBindingsWithValidation(viewModel)
1440 * applyBindingsWithValidation(viewModel, options)
1441 * applyBindingsWithValidation(viewModel, rootNode)
1442 * applyBindingsWithValidation(viewModel, rootNode, options)
1443 */
1444ko.applyBindingsWithValidation = function (viewModel, rootNode, options) {
1445 var node = document.body,
1446 config;
1447
1448 if (rootNode && rootNode.nodeType) {
1449 node = rootNode;
1450 config = options;
1451 }
1452 else {
1453 config = rootNode;
1454 }
1455
1456 kv.init();
1457
1458 if (config) {
1459 config = extend(extend({}, kv.configuration), config);
1460 kv.utils.setDomData(node, config);
1461 }
1462
1463 ko.applyBindings(viewModel, node);
1464};
1465
1466//override the original applyBindings so that we can ensure all new rules and what not are correctly registered
1467var origApplyBindings = ko.applyBindings;
1468ko.applyBindings = function (viewModel, rootNode) {
1469
1470 kv.init();
1471
1472 origApplyBindings(viewModel, rootNode);
1473};
1474
1475ko.validatedObservable = function (initialValue, options) {
1476 if (!options && !kv.utils.isObject(initialValue)) {
1477 return ko.observable(initialValue).extend({ validatable: true });
1478 }
1479
1480 var obsv = ko.observable(initialValue);
1481 obsv.errors = kv.group(kv.utils.isObject(initialValue) ? initialValue : {}, options);
1482 obsv.isValid = ko.observable(obsv.errors().length === 0);
1483
1484 if (ko.isObservable(obsv.errors)) {
1485 obsv.errors.subscribe(function(errors) {
1486 obsv.isValid(errors.length === 0);
1487 });
1488 }
1489 else {
1490 ko.computed(obsv.errors).subscribe(function (errors) {
1491 obsv.isValid(errors.length === 0);
1492 });
1493 }
1494
1495 obsv.subscribe(function(newValue) {
1496 if (!kv.utils.isObject(newValue)) {
1497 /*
1498 * The validation group works on objects.
1499 * Since the new value is a primitive (scalar, null or undefined) we need
1500 * to create an empty object to pass along.
1501 */
1502 newValue = {};
1503 }
1504 // Force the group to refresh
1505 obsv.errors._updateState(newValue);
1506 obsv.isValid(obsv.errors().length === 0);
1507 });
1508
1509 return obsv;
1510};
1511;}));

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t