From 0072edc2b4230a63afd270c24a34009e5ebdbdb7 Mon Sep 17 00:00:00 2001 From: BorisMoore Date: Wed, 27 Jan 2016 14:45:12 -0800 Subject: [PATCH] Commit 72 (v0.9.72 - Beta) - $.observe() improvements: New "**" wild card path for observing all changes under an object: "object.**" - for 'declarative observeAll' "http://jsviews.com/#observe@**" - Improvements to computed observables: 'depends' can now include both "**" wild card, and functions that observe changes and handle a callback programmatically. "http://jsviews.com/#computed@depends" - trigger=true now also accepts other truthy value e.g. trigger=1 - Improvements to - + + ``` HTML elements within 'top-level' page content can also be data-linked -- see [below](#jsv-quickstart@toplink). @@ -127,12 +138,12 @@ Jim with the `name` property of `person` object data-linked to the `"Jim"` text node and *two-way* data-linked to the `` -See: [Playing with JsViews](http://www.jsviews.com/#jsvplaying) for working samples, such as [this one](http://www.jsviews.com/#jsvplaying@twoway) +See: *[Playing with JsViews](http://www.jsviews.com/#jsvplaying)* for working samples, such as [this one](http://www.jsviews.com/#jsvplaying@twoway) [Learn more...](http://www.jsviews.com/#jsvlinktmpl) - + You can use data-linking not only for templated content, but also to data-bind to top-level HTML content in your page: ```js @@ -173,7 +184,7 @@ JsViews uses the *property change **observe() and observeAll()** -The [$.observe()](http://www.jsviews.com/#observe) and [$.observable().observeAll()](http://www.jsviews.com/#observeAll) APIs make it very easy for you to register event handlers or listeners, so your code can listen to specific observable changes made to your data objects or view models: +The [`$.observe()`](http://www.jsviews.com/#observe) and [`$.observable().observeAll()`](http://www.jsviews.com/#observeAll) APIs make it very easy for you to register event handlers or listeners, so your code can listen to specific observable changes made to your data objects or view models: ```js $.observe(person, "name", function(...) { @@ -222,16 +233,46 @@ $(".changeBtn").on("click", function() { // Get index of this 'item view'. (Equals index of person in people array) var index = view.index; - // Change the person.name - $.observable(person).setProperty("name", person.name + " " + index); + // Change the person.name + $.observable(person).setProperty("name", person.name + " " + index); }); ``` [Learn more...](http://www.jsviews.com/#$view) + +

Data-linked paths

+ +JsViews data-linked templates (and the `$.observe()` API) use the same [paths and expressions](http://www.jsviews.com/#paths) as JsRender templates, but in addition provide *'leaf'* data-binding -- such as: + +```html +{^{:team.manager.name`}} + + +``` + +But data-linked paths have additional support, such as linking deeper into paths: + +```html +{^{:team^manager.name}} +``` + +[Learn more...](http://www.jsviews.com/#linked-paths) + +

Computed observables

+ +JsViews also allows you to data-bind to computed values, such as: + +```html +{^{:shoppingCart.totalAmount()}} + +``` + +[Learn more...](http://www.jsviews.com/#computed) +

Documentation and APIs

-See the [www.jsviews.com](http://www.jsviews.com) site, including the [JsViews Quickstart](http://www.jsviews.com/#jsv-quickstart), [JsViews APIs](http://www.jsviews.com/#jsvapi) and [JsObservable APIs](http://www.jsviews.com/#jsoapi)topics. +See the [www.jsviews.com](http://www.jsviews.com) site, including the *[JsViews Quickstart](http://www.jsviews.com/#jsv-quickstart)*, [JsViews APIs](http://www.jsviews.com/#jsvapi) and [JsObservable APIs](http://www.jsviews.com/#jsoapi)topics.

Demos

Demos and samples can be found at [www.jsviews.com/#samples](http://www.jsviews.com/#samples), and throughout the [API documentation](http://www.jsviews.com/#jsvapi). diff --git a/jquery.observable.js b/jquery.observable.js index e79dcd0..465280d 100644 --- a/jquery.observable.js +++ b/jquery.observable.js @@ -1,4 +1,4 @@ -/*! JsObservable v0.9.71 (Beta): http://jsviews.com/#jsobservable */ +/*! JsObservable v0.9.72 (Beta): http://jsviews.com/#jsobservable */ /* * Subcomponent of JsViews * Data change events for data-linking @@ -44,7 +44,7 @@ if (!$ || !$.fn) { throw "JsObservable requires jQuery"; // We require jQuery } -var versionNumber = "v1.0.0-alpha", +var versionNumber = "v0.9.72", $observe, $observable, $views = $.views = @@ -100,19 +100,23 @@ if (!$.observe) { : data; }, - resolvePathObjects = function(paths, root) { - paths = $isArray(paths) ? paths : [paths]; + resolvePathObjects = function(paths, root, callback) { + paths = paths + ? $isArray(paths) + ? paths + : [paths] + : []; var i, path, object = root, nextObj = object, - l = paths.length, + l = paths && paths.length, out = []; for (i = 0; i < l; i++) { path = paths[i]; if ($isFunction(path)) { - out = out.concat(resolvePathObjects(path.call(root, root), root)); + out = out.concat(resolvePathObjects(path.call(root, root, callback), root)); continue; } else if ("" + path !== path) { root = nextObj = path; @@ -213,8 +217,8 @@ if (!$.observe) { if (prop !== $expando) { if (newObject = $observable._fltr(newAllPath, obj[prop], nextParentObs, filter)) { newParentObs = nextParentObs.slice(); - if (nestedArray && updatedTgt) { - newParentObs.unshift(updatedTgt); // For array change events need to add updated array to parentObs + if (nestedArray && updatedTgt && newParentObs[0] !== updatedTgt) { + newParentObs.unshift(updatedTgt); // For array change events when observing an array which is not the root, need to add updated array to parentObs } observeAll(namespace, newObject, cb, filter || (nestedArray ? undefined : 0), newParentObs, newAllPath, unobs, objMap); // If nested array, need to observe the array too - so set filter to undefined @@ -255,7 +259,7 @@ if (!$.observe) { if (objMap && notRemoving && $hasData(object) && objMap[obId = $data(object).obId]) { objMap[obId]++; return; // This object has already being observed/unobserved by this observeAll/unobserveAll call (must be a cyclic object graph) so skip, to avoid - // stack overflow/multiple instances of listener. See https://github.com/BorisMoore/jsviews/pull/305 + // stack overflow/multiple instances of listener. See jsviews/pull/305 // NOTE - WE DO NOT support ObserveAll on data with cyclic graphs which include DUPLICATE REFERENCES TO ARRAY PROPERTIES - such as data.children = data.descendants = [] } if (!objMap) { @@ -345,8 +349,6 @@ if (!$.observe) { // Duplicate exists, so skip. (This can happen e.g. with {^{for people ~foo=people}}) // or for cases with cyclic objects - e.g. obj.children = obj.descendants = [] return; - } else if (pathStr === "*" && data.prop !== pathStr) { - $(object).off(namespace, onObservableChange); } } } @@ -397,7 +399,7 @@ if (!$.observe) { // Uses the contextCb callback to execute the compiled exprOb template in the context of the view/data etc. to get the returned value, typically an object or array. // If it is an array, registers array binding var origRt = root; - // Note: For https://github.com/BorisMoore/jsviews/issues/292ctxCb will need var ctxCb = contextCb || function(exprOb, origRt) {return exprOb._jsv(origRt);}; + // Note: For jsviews/issues/292 ctxCb will need var ctxCb = contextCb || function(exprOb, origRt) {return exprOb._jsv(origRt);}; exprOb.ob = contextCb(exprOb, origRt); // Initialize object @@ -453,7 +455,7 @@ if (!$.observe) { var i, p, skip, parts, prop, path, dep, unobserve, callback, cbId, el, data, events, contextCb, items, cbBindings, depth, innerCb, parentObs, allPath, filter, initNsArr, initNsArrLen, ns = observeStr, - paths = this != 1 // Using != for IE<10 bug- see https://github.com/BorisMoore/jsviews/issues/237 + paths = this != 1 // Using != for IE<10 bug- see jsviews/issues/237 ? concat.apply([], arguments) // Flatten the arguments - this is a 'recursive call' with params using the 'wrapped array' // style - such as innerObserve([object], path.path, [origRoot], path.prm, innerCb, ...); : slice.call(arguments), // Don't flatten - this is the first 'top-level call, to innerObserve.apply(1, paths) @@ -511,7 +513,7 @@ if (!$.observe) { } object = root; if ("" + path === path) { - // Consider support for computed paths: https://github.com/BorisMoore/jsviews/issues/292 + // Consider support for computed paths: jsviews/issues/292 //if (/[\(\[\+]/.test(path)) { // var b={links:{}}, t = $sub.tmplFn("{:"+path+"}", b, true), items = t.paths[0]; // l += items.length - 1; @@ -576,14 +578,16 @@ if (!$.observe) { skip = 0; while (el--) { // Skip duplicates data = events[el].data; - if (data && data.cb === callback && data.ns === initialNs) { - if (data.prop === prop || data.prop === "*") { - if (p = parts.join(".")) { - data.paths.push(p); // We will skip this binding, but if it is not a leaf binding, - // need to keep bindings for rest of path, ready for if the object gets swapped. - } - skip++; + if (data + && data.cb._cId === callback._cId + && data.ns === initialNs + && !callback._inId // Don't skip if this is an innerCb for an object returned by a computed observable. + && (data.prop === prop || data.prop === "*" || data.prop === "**")) { + if (p = parts.join(".")) { + data.paths.push(p); // We will skip this binding, but if it is not a leaf binding, + // need to keep bindings for rest of path, ready for if the object gets swapped. } + skip++; } } if (skip) { @@ -592,17 +596,21 @@ if (!$.observe) { continue; } } - if (prop === "*") { + if (prop === "*" || prop === "**") { // "*" => all properties. "**" => all properties and sub-properties (i.e. deep observeAll behavior) if (!unobserve && events && events.length) { - // Remove existing bindings, since they will be duplicates with "*" + // Remove existing bindings, since they will be duplicates with "*" or "**" observeOnOff(ns, "", false, true); } - observeOnOff(ns, ""); // observe the object for any property change - for (p in object) { - // observing "*": So (in addition to listening to prop change, above) listen to arraychange on props of type array - if (p !== $expando) { - bindArray(object, unobserve, undefined, p); + if (prop === "*") { + observeOnOff(ns, ""); // observe the object for any property change + for (p in object) { + // observing "*": So (in addition to listening to prop change, above) listen to arraychange on props of type array + if (p !== $expando) { + bindArray(object, unobserve, undefined, p); + } } + } else { + $.observable(object)[(unobserve ? "un" : "") + "observeAll"](callback); // observe or unobserve the object for any property change } break; } else if (prop) { @@ -617,7 +625,7 @@ if (!$.observe) { if ($isFunction(prop)) { if (dep = prop.depends) { // This is a computed observable. We will observe any declared dependencies - innerObserve([object], resolvePathObjects(dep, object), callback, contextCb, unobserve); + innerObserve([object], resolvePathObjects(dep, object, callback), callback, contextCb, unobserve); } break; } @@ -638,7 +646,7 @@ if (!$.observe) { var initialNs, allowArray = this != false, // If this === false, this is a call from observeAndBind - doing binding of datalink expressions. We don't bind // arrayChange events in this scenario. Instead, {^{for}} and similar do specific arrayChange binding to the tagCtx.args[0] value, in onAfterLink. - // Note deliberately using this != false, rather than this !== false because of IE<10 bug- see https://github.com/BorisMoore/jsviews/issues/237 + // Note deliberately using this != false, rather than this !== false because of IE<10 bug- see jsviews/issues/237 paths = slice.call(arguments), origRoot = paths[0]; @@ -755,8 +763,8 @@ if (!$.observe) { // The view will be the this pointer for getter and setter. Note: this is the one scenario where path is "". || leaf; getter = property; - setter = property.set === true ? property : property.set; - property = property.call(leaf); // get - only treated as getter if also a setter. Otherwise it is simply a property of type function. See unit tests 'Can observe properties of type function'. + setter = getter.set === true ? getter : getter.set; + property = getter.call(leaf); // get - only treated as getter if also a setter. Otherwise it is simply a property of type function. See unit tests 'Can observe properties of type function'. } } diff --git a/jquery.observable.min.js b/jquery.observable.min.js index 3a603ee..bc80f9e 100644 --- a/jquery.observable.min.js +++ b/jquery.observable.min.js @@ -1,3 +1,3 @@ -/*! JsObservable v0.9.71 (Beta): http://jsviews.com/#jsobservable */ -!function(t){var e=(0,eval)("this"),n=e.jQuery;"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof exports?module.exports=n?t(n):function(e){return t(e)}:t(!1)}(function(t){"use strict";var e=(0,eval)("this"),n=t===!1;if(t=t||e.jQuery,!t||!t.fn)throw"JsObservable requires jQuery";var r,i,o="v1.0.0-alpha",a=t.views=t.views||n&&e.jsrender&&jsrender.views||{jsviews:o,sub:{}},s=a.sub,c=t.isFunction,l=t.isArray,f="object";if(!t.observe){var u=t.event.special,p=[].slice,h=[].splice,d=[].concat,v=t.expando,g=parseInt,b=/\S+/g,_=s.propChng=s.propChng||"propertyChange",y=s.arrChng=s.arrChng||"arrayChange",m=s._cbBnds=s._cbBnds||{},I=_+".observe",A=1,j=1,w=1,x=t.hasData,F=t.data,P={},C=function(t){return t._cId=t._cId||".obs"+j++},k=function(t){return this._data=t,this},T=function(t){return this._data=t,this},O=function(t){return l(t)?[t]:t},V=function(t,e){t=l(t)?t:[t];var n,r,i=e,o=i,a=t.length,s=[];for(n=0;a>n;n++)r=t[n],c(r)?s=s.concat(V(r.call(e,e),e)):""+r===r?(o!==i&&s.push(i=o),s.push(r)):(e=o=r,o!==i&&s.push(i=o));return s},D=function(t,e){for(var n in t)return;m[e]=void 0},H=function(t,e){function n(t){return typeof t===f&&(h[0]||p&&l(t))}if(!t.data||!t.data.off){var r,i,o,a=e.oldValue,s=e.value,c=t.data,u=c.observeAll,p=!c.cb.noArray,h=c.paths;t.type===y?(c.cb.array||c.cb).call(c,t,e):(c.prop===e.path||"*"===c.prop)&&(u?(r=u._path+"."+e.path,i=u.filter,o=[t.target].concat(u.parents()),n(a)&&Q(p,u.ns,[a],h,c.cb,!0,i,[o],r),n(s)&&Q(p,u.ns,[s],h,c.cb,void 0,i,[o],r)):(n(a)&&Q(p,[a],h,c.cb,!0),n(s)&&Q(p,[s],h,c.cb)),c.cb(t,e))}},Q=function(){var t=d.apply([],arguments);return r.apply(t.shift(),t)},S=function(t,e,n,r){t+""!==t&&(n=e,e=t,t=""),B(t,this._data,e,n,[],"root",r)},q=function(t,e,n){S.call(this,t,e,n,!0)},B=function(t,e,n,o,a,s,c,u){function p(t,e){for(g=t.length,_=s+"[]";g--;)h(t,g,e,1)}function h(e,r,a,s){var c,l;r!==v&&(c=i._fltr(_,e[r],y,o))&&(l=y.slice(),s&&m&&l.unshift(m),B(t,c,n,o||(s?void 0:0),l,_,a,u))}function d(t,e){switch(s=t.data.observeAll._path,m=t.target,e.change){case"insert":p(e.items);break;case"remove":p(e.items,!0);break;case"refresh":p(e.oldItems,!0),p(t.target);break;case"set":_=s+"."+e.path,h(e,"oldValue",!0),h(e,"value")}m=void 0,n.apply(this,arguments)}var g,b,_,y,m,I,A=!u||u.un||!c;if(e&&typeof e===f){if(y=[e].concat(a),b=l(e)?"":"*",u&&A&&x(e)&&u[I=F(e).obId])return void u[I]++;if(u||(u={un:c}),n){if(b||0!==o)if(d._cId=C(n),A)r(t,e,b,d,c,o,y,s),I=F(e).obId,u[I]=(u[I]||0)+1;else{if(--u[F(e).obId])return;r(t,e,b,d,c,o,y,s)}}else u&&(u[F(e).obId]=1),r(t,e,b,void 0,c,o,y,s);if(b)for(g in e)_=s+"."+g,h(e,g,c);else p(e,c)}},M=function(t){return t.indexOf(".")<0&&t.indexOf("[")<0},J=function(){return[].push.call(arguments,!0),r.apply(this,arguments)};r=function(){function e(){function o(e,r,i,o){var a,s,c=x(rt),l=O(rt),f=U,u=W;if(e=n?e+"."+n:e,q||o)c&&t(l).off(e,H);else{if(E=c&&t._data(rt))for(E=E&&E.events,E=E&&E[i?y:_],J=E&&E.length;J--;)if((z=E[J].data)&&z.cb&&z.cb._cId===B._cId&&z.ns===n){if(i)return;"*"===r&&z.prop!==r&&t(rt).off(e,H)}s=i?{}:{fullPath:Q,paths:r?[r]:[],prop:T},s.ns=n,s.cb=B,W&&(s.observeAll={_path:u,path:function(){return a=f.length,u.replace(/[[.]/g,function(e){return a--,"["===e?"["+t.inArray(f[a-1],f[a]):"."})},parents:function(){return f},filter:X,ns:n}),t(l).on(e,null,s,H),L&&((m[B._cId]=L)[F(rt).obId||F(rt,"obId",A++)]=rt)}}function s(t){var n=nt;return t.ob=G(t,n),t.cb=function(i,o){var a=t.ob,s=t.sb,c=G(t,n);c!==a&&(typeof a===f&&(u(a,!0),(s||r&&l(a))&&e([a],s,B,G,!0)),t.ob=c,typeof c===f&&(u(c),(s||r&&l(c))&&e([c],s,B,G))),B(i,o)}}function u(t,e,n,a){if(r){var s=rt,c=W;rt=t,a&&(rt=t[a],W+="."+a),X&&rt&&(rt=i._fltr(W,rt,a?[t].concat(U):U,X)),rt&&(n||l(rt))&&o(y+".observe"+(B?M=C(B):""),void 0,!0,e),rt=s,W=c}}var g,j,P,k,T,Q,S,q,B,M,J,z,E,G,K,L,N,R,U,W,X,Y,Z,$=I,tt=1!=this?d.apply([],arguments):p.call(arguments),et=tt.pop()||!1,nt=tt.shift(),rt=nt,it=tt.length;for(et+""===et&&(W=et,U=tt.pop(),X=tt.pop(),et=!!tt.pop(),it-=3),et===!!et&&(q=et,et=tt[it-1],et=it&&et+""!==et?(it--,tt.pop()):void 0),B=et,it&&c(tt[it-1])&&(G=B,B=tt.pop(),it--),$+=q?B?B._cId+(B._inId||""):"":(M=C(B))+(B._inId||""),q||(L=m[M]=m[M]||{}),Y=n&&n.match(b)||[""],Z=Y.length;Z--;)for(n=Y[Z],l(nt)?u(nt,q,!0):q&&0===it&&nt&&o($,""),N=0,g=0;it>g;g++)if(Q=tt[g],""!==Q&&void 0!==Q){if(rt=nt,""+Q===Q){if(k=Q.split("^"),k[1]&&(N=k[0].split(".").length,Q=k.join("."),N=Q.split(".").length-N),G&&(K=G(Q,nt))){it+=K.length-1,h.apply(tt,[g--,1].concat(K));continue}k=Q.split(".")}else c(Q)||(Q&&Q._jsv?(R=q?Q.cb:s(Q),R.noArray=!r,R._cId=B._cId,R._inId=R._inId||".obIn"+w++,(Q.bnd||Q.prm&&Q.prm.length||!Q.sb)&&e([rt],Q.path,[a],Q.prm,R,G,q),Q.sb&&e([Q.ob],Q.sb,B,G,q),Q=a,rt=void 0):rt=Q),k=[nt=Q];for(;rt&&void 0!==(T=k.shift());)if(typeof rt===f){if(""+T===T){if(""===T)continue;if(k.length1;)s=s[o.shift()];s&&a._setProperty(s,o[0],e,n)}return a},removeProperty:function(t){return this.setProperty(t,P),this},_setProperty:function(t,e,n,r){var i,o,a,s=e?t[e]:t;c(s)&&s.set&&(t=t._wrp||t,o=s,i=s.set===!0?s:s.set,s=s.call(t)),(s!==n||r&&s!=n)&&(!(s instanceof Date)||s>n||n>s)&&(i?(i.call(t,n),n=o.call(t)):(a=n===P)?void 0!==s?(delete t[e],n=void 0):e=void 0:e&&(t[e]=n),e&&this._trigger(t,{change:"set",path:e,value:n,oldValue:s,remove:a}))},_trigger:function(e,n){t(e).triggerHandler(_,n)}},T.prototype={_data:null,observeAll:S,unobserveAll:q,data:function(){return this._data},insert:function(t,e){var n=this._data;return 1===arguments.length&&(e=t,t=n.length),t=g(t),t>-1&&t<=n.length&&(e=l(e)?e:[e],e.length&&this._insert(t,e)),this},_insert:function(t,e){var n=this._data,r=n.length;h.apply(n,[t,0].concat(e)),this._trigger({change:"insert",index:t,items:e},r)},remove:function(t,e){var n,r=this._data;return void 0===t&&(t=r.length-1),t=g(t),e=e?g(e):0===e?0:1,e>-1&&t>-1&&(n=r.slice(t,t+e),e=n.length,e&&this._remove(t,e,n)),this},_remove:function(t,e,n){var r=this._data,i=r.length;r.splice(t,e),this._trigger({change:"remove",index:t,items:n},i)},move:function(t,e,n){if(n=n?g(n):0===n?0:1,t=g(t),e=g(e),n>0&&t>-1&&e>-1&&t!==e){var r=this._data.slice(t,t+n);n=r.length,n&&this._move(t,e,n,r)}return this},_move:function(t,e,n,r){var i=this._data,o=i.length;i.splice(t,n),h.apply(i,[e,0].concat(r)),this._trigger({change:"move",oldIndex:t,index:e,items:r},o)},refresh:function(t){var e=this._data.slice();return this._refresh(e,t),this},_refresh:function(t,e){var n=this._data,r=n.length;h.apply(n,[0,n.length].concat(e)),this._trigger({change:"refresh",oldItems:t},r)},_trigger:function(e,n){var r=this._data,i=r.length,o=t([r]);i!==n&&o.triggerHandler(_,{change:"set",path:"length",value:i,oldValue:n}),o.triggerHandler(y,e)}},u[_]=u[y]={remove:function(e){var n,r,i,o,a,s=e.data;if(s&&(s.off=!0,s=s.cb)&&(n=m[s._cId])){for(i=t._data(this).events[e.type],o=i.length;o--&&!r;)r=(a=i[o].data)&&a.cb&&a.cb._cId===s._cId;r||(delete n[F(this).obId],D(n,s._cId))}}},a.map=function(e){function n(t,n,r,o){var a,s=this;this.src&&this.unmap(),typeof t===f&&(s.src=t,s.tgt=r||s.tgt||[],s.options=n||s.options,s.update(),o||(e.obsSrc&&i(s.src).observeAll(s.obs=function(t,n){a||(a=!0,e.obsSrc(s,t,n),a=void 0)},s.srcFlt),e.obsTgt&&i(s.tgt).observeAll(s.obt=function(t,n){a||(a=!0,e.obsTgt(s,t,n),a=void 0)},s.tgtFlt)))}return c(e)&&(e={getTgt:e}),e.baseMap&&(e=t.extend({},e.baseMap,e)),e.map=function(t,e,r,i){return new n(t,e,r,i)},(n.prototype={srcFlt:e.srcFlt||M,tgtFlt:e.tgtFlt||M,update:function(t){var n=this;i(n.tgt).refresh(e.getTgt(n.src,n.options=t||n.options))},unmap:function(){var t=this;t.src&&(t.obs&&i(t.src).unobserveAll(t.obs,t.srcFlt),t.obt&&i(t.tgt).unobserveAll(t.obt,t.tgtFlt),t.src=void 0)},map:n,_def:e}).constructor=n,e}}return t}); +/*! JsObservable v0.9.72 (Beta): http://jsviews.com/#jsobservable */ +!function(t){var e=(0,eval)("this"),n=e.jQuery;"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof exports?module.exports=n?t(n):function(e){return t(e)}:t(!1)}(function(t){"use strict";var e=(0,eval)("this"),n=t===!1;if(t=t||e.jQuery,!t||!t.fn)throw"JsObservable requires jQuery";var r,i,o="v0.9.72",a=t.views=t.views||n&&e.jsrender&&jsrender.views||{jsviews:o,sub:{}},s=a.sub,c=t.isFunction,l=t.isArray,u="object";if(!t.observe){var f=t.event.special,p=[].slice,h=[].splice,d=[].concat,v=t.expando,g=parseInt,b=/\S+/g,_=s.propChng=s.propChng||"propertyChange",y=s.arrChng=s.arrChng||"arrayChange",m=s._cbBnds=s._cbBnds||{},I=_+".observe",A=1,j=1,w=1,x=t.hasData,F=t.data,P={},C=function(t){return t._cId=t._cId||".obs"+j++},k=function(t){return this._data=t,this},T=function(t){return this._data=t,this},O=function(t){return l(t)?[t]:t},V=function(t,e,n){t=t?l(t)?t:[t]:[];var r,i,o=e,a=o,s=t&&t.length,u=[];for(r=0;s>r;r++)i=t[r],c(i)?u=u.concat(V(i.call(e,e,n),e)):""+i===i?(a!==o&&u.push(o=a),u.push(i)):(e=a=i,a!==o&&u.push(o=a));return u},D=function(t,e){for(var n in t)return;m[e]=void 0},H=function(t,e){function n(t){return typeof t===u&&(h[0]||p&&l(t))}if(!t.data||!t.data.off){var r,i,o,a=e.oldValue,s=e.value,c=t.data,f=c.observeAll,p=!c.cb.noArray,h=c.paths;t.type===y?(c.cb.array||c.cb).call(c,t,e):(c.prop===e.path||"*"===c.prop)&&(f?(r=f._path+"."+e.path,i=f.filter,o=[t.target].concat(f.parents()),n(a)&&Q(p,f.ns,[a],h,c.cb,!0,i,[o],r),n(s)&&Q(p,f.ns,[s],h,c.cb,void 0,i,[o],r)):(n(a)&&Q(p,[a],h,c.cb,!0),n(s)&&Q(p,[s],h,c.cb)),c.cb(t,e))}},Q=function(){var t=d.apply([],arguments);return r.apply(t.shift(),t)},S=function(t,e,n,r){t+""!==t&&(n=e,e=t,t=""),B(t,this._data,e,n,[],"root",r)},q=function(t,e,n){S.call(this,t,e,n,!0)},B=function(t,e,n,o,a,s,c,f){function p(t,e){for(g=t.length,_=s+"[]";g--;)h(t,g,e,1)}function h(e,r,a,s){var c,l;r!==v&&(c=i._fltr(_,e[r],y,o))&&(l=y.slice(),s&&m&&l[0]!==m&&l.unshift(m),B(t,c,n,o||(s?void 0:0),l,_,a,f))}function d(t,e){switch(s=t.data.observeAll._path,m=t.target,e.change){case"insert":p(e.items);break;case"remove":p(e.items,!0);break;case"refresh":p(e.oldItems,!0),p(t.target);break;case"set":_=s+"."+e.path,h(e,"oldValue",!0),h(e,"value")}m=void 0,n.apply(this,arguments)}var g,b,_,y,m,I,A=!f||f.un||!c;if(e&&typeof e===u){if(y=[e].concat(a),b=l(e)?"":"*",f&&A&&x(e)&&f[I=F(e).obId])return void f[I]++;if(f||(f={un:c}),n){if(b||0!==o)if(d._cId=C(n),A)r(t,e,b,d,c,o,y,s),I=F(e).obId,f[I]=(f[I]||0)+1;else{if(--f[F(e).obId])return;r(t,e,b,d,c,o,y,s)}}else f&&(f[F(e).obId]=1),r(t,e,b,void 0,c,o,y,s);if(b)for(g in e)_=s+"."+g,h(e,g,c);else p(e,c)}},M=function(t){return t.indexOf(".")<0&&t.indexOf("[")<0},J=function(){return[].push.call(arguments,!0),r.apply(this,arguments)};r=function(){function e(){function o(e,r,i,o){var a,s,c=x(rt),l=O(rt),u=U,f=W;if(e=n?e+"."+n:e,q||o)c&&t(l).off(e,H);else{if(E=c&&t._data(rt))for(E=E&&E.events,E=E&&E[i?y:_],J=E&&E.length;J--;)if((z=E[J].data)&&z.cb&&z.cb._cId===B._cId&&z.ns===n&&i)return;s=i?{}:{fullPath:Q,paths:r?[r]:[],prop:T},s.ns=n,s.cb=B,W&&(s.observeAll={_path:f,path:function(){return a=u.length,f.replace(/[[.]/g,function(e){return a--,"["===e?"["+t.inArray(u[a-1],u[a]):"."})},parents:function(){return u},filter:X,ns:n}),t(l).on(e,null,s,H),L&&((m[B._cId]=L)[F(rt).obId||F(rt,"obId",A++)]=rt)}}function s(t){var n=nt;return t.ob=G(t,n),t.cb=function(i,o){var a=t.ob,s=t.sb,c=G(t,n);c!==a&&(typeof a===u&&(f(a,!0),(s||r&&l(a))&&e([a],s,B,G,!0)),t.ob=c,typeof c===u&&(f(c),(s||r&&l(c))&&e([c],s,B,G))),B(i,o)}}function f(t,e,n,a){if(r){var s=rt,c=W;rt=t,a&&(rt=t[a],W+="."+a),X&&rt&&(rt=i._fltr(W,rt,a?[t].concat(U):U,X)),rt&&(n||l(rt))&&o(y+".observe"+(B?M=C(B):""),void 0,!0,e),rt=s,W=c}}var g,j,P,k,T,Q,S,q,B,M,J,z,E,G,K,L,N,R,U,W,X,Y,Z,$=I,tt=1!=this?d.apply([],arguments):p.call(arguments),et=tt.pop()||!1,nt=tt.shift(),rt=nt,it=tt.length;for(et+""===et&&(W=et,U=tt.pop(),X=tt.pop(),et=!!tt.pop(),it-=3),et===!!et&&(q=et,et=tt[it-1],et=it&&et+""!==et?(it--,tt.pop()):void 0),B=et,it&&c(tt[it-1])&&(G=B,B=tt.pop(),it--),$+=q?B?B._cId+(B._inId||""):"":(M=C(B))+(B._inId||""),q||(L=m[M]=m[M]||{}),Y=n&&n.match(b)||[""],Z=Y.length;Z--;)for(n=Y[Z],l(nt)?f(nt,q,!0):q&&0===it&&nt&&o($,""),N=0,g=0;it>g;g++)if(Q=tt[g],""!==Q&&void 0!==Q){if(rt=nt,""+Q===Q){if(k=Q.split("^"),k[1]&&(N=k[0].split(".").length,Q=k.join("."),N=Q.split(".").length-N),G&&(K=G(Q,nt))){it+=K.length-1,h.apply(tt,[g--,1].concat(K));continue}k=Q.split(".")}else c(Q)||(Q&&Q._jsv?(R=q?Q.cb:s(Q),R.noArray=!r,R._cId=B._cId,R._inId=R._inId||".obIn"+w++,(Q.bnd||Q.prm&&Q.prm.length||!Q.sb)&&e([rt],Q.path,[a],Q.prm,R,G,q),Q.sb&&e([Q.ob],Q.sb,B,G,q),Q=a,rt=void 0):rt=Q),k=[nt=Q];for(;rt&&void 0!==(T=k.shift());)if(typeof rt===u){if(""+T===T){if(""===T)continue;if(k.length1;)s=s[o.shift()];s&&a._setProperty(s,o[0],e,n)}return a},removeProperty:function(t){return this.setProperty(t,P),this},_setProperty:function(t,e,n,r){var i,o,a,s=e?t[e]:t;c(s)&&s.set&&(t=t._wrp||t,o=s,i=o.set===!0?o:o.set,s=o.call(t)),(s!==n||r&&s!=n)&&(!(s instanceof Date)||s>n||n>s)&&(i?(i.call(t,n),n=o.call(t)):(a=n===P)?void 0!==s?(delete t[e],n=void 0):e=void 0:e&&(t[e]=n),e&&this._trigger(t,{change:"set",path:e,value:n,oldValue:s,remove:a}))},_trigger:function(e,n){t(e).triggerHandler(_,n)}},T.prototype={_data:null,observeAll:S,unobserveAll:q,data:function(){return this._data},insert:function(t,e){var n=this._data;return 1===arguments.length&&(e=t,t=n.length),t=g(t),t>-1&&t<=n.length&&(e=l(e)?e:[e],e.length&&this._insert(t,e)),this},_insert:function(t,e){var n=this._data,r=n.length;h.apply(n,[t,0].concat(e)),this._trigger({change:"insert",index:t,items:e},r)},remove:function(t,e){var n,r=this._data;return void 0===t&&(t=r.length-1),t=g(t),e=e?g(e):0===e?0:1,e>-1&&t>-1&&(n=r.slice(t,t+e),e=n.length,e&&this._remove(t,e,n)),this},_remove:function(t,e,n){var r=this._data,i=r.length;r.splice(t,e),this._trigger({change:"remove",index:t,items:n},i)},move:function(t,e,n){if(n=n?g(n):0===n?0:1,t=g(t),e=g(e),n>0&&t>-1&&e>-1&&t!==e){var r=this._data.slice(t,t+n);n=r.length,n&&this._move(t,e,n,r)}return this},_move:function(t,e,n,r){var i=this._data,o=i.length;i.splice(t,n),h.apply(i,[e,0].concat(r)),this._trigger({change:"move",oldIndex:t,index:e,items:r},o)},refresh:function(t){var e=this._data.slice();return this._refresh(e,t),this},_refresh:function(t,e){var n=this._data,r=n.length;h.apply(n,[0,n.length].concat(e)),this._trigger({change:"refresh",oldItems:t},r)},_trigger:function(e,n){var r=this._data,i=r.length,o=t([r]);i!==n&&o.triggerHandler(_,{change:"set",path:"length",value:i,oldValue:n}),o.triggerHandler(y,e)}},f[_]=f[y]={remove:function(e){var n,r,i,o,a,s=e.data;if(s&&(s.off=!0,s=s.cb)&&(n=m[s._cId])){for(i=t._data(this).events[e.type],o=i.length;o--&&!r;)r=(a=i[o].data)&&a.cb&&a.cb._cId===s._cId;r||(delete n[F(this).obId],D(n,s._cId))}}},a.map=function(e){function n(t,n,r,o){var a,s=this;this.src&&this.unmap(),typeof t===u&&(s.src=t,s.tgt=r||s.tgt||[],s.options=n||s.options,s.update(),o||(e.obsSrc&&i(s.src).observeAll(s.obs=function(t,n){a||(a=!0,e.obsSrc(s,t,n),a=void 0)},s.srcFlt),e.obsTgt&&i(s.tgt).observeAll(s.obt=function(t,n){a||(a=!0,e.obsTgt(s,t,n),a=void 0)},s.tgtFlt)))}return c(e)&&(e={getTgt:e}),e.baseMap&&(e=t.extend({},e.baseMap,e)),e.map=function(t,e,r,i){return new n(t,e,r,i)},(n.prototype={srcFlt:e.srcFlt||M,tgtFlt:e.tgtFlt||M,update:function(t){var n=this;i(n.tgt).refresh(e.getTgt(n.src,n.options=t||n.options))},unmap:function(){var t=this;t.src&&(t.obs&&i(t.src).unobserveAll(t.obs,t.srcFlt),t.obt&&i(t.tgt).unobserveAll(t.obt,t.tgtFlt),t.src=void 0)},map:n,_def:e}).constructor=n,e}}return t}); //# sourceMappingURL=jquery.observable.min.js.map \ No newline at end of file diff --git a/jquery.observable.min.js.map b/jquery.observable.min.js.map index f5645eb..7752c1a 100644 --- a/jquery.observable.min.js.map +++ b/jquery.observable.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["jquery.observable.js"],"names":["factory","global","eval","$","jQuery","define","amd","exports","module","setGlobals","fn","$observe","$observable","versionNumber","$views","views","jsrender","jsviews","sub","$sub","$isFunction","isFunction","$isArray","isArray","OBJECT","observe","$eventSpecial","event","special","slice","splice","concat","$expando","expando","PARSEINT","parseInt","rNotWhite","propertyChangeStr","propChng","arrayChangeStr","arrChng","cbBindingsStore","_cbBnds","observeStr","observeObjKey","observeCbKey","observeInnerCbKey","$hasData","hasData","$data","data","remove","getCbKey","cb","_cId","ObjectObservable","this","_data","ArrayObservable","wrapArray","resolvePathObjects","paths","root","i","path","object","nextObj","l","length","out","call","push","removeCbBindings","cbBindings","cbBindingsId","undefined","onObservableChange","ev","eventArgs","isOb","val","allowArray","off","allPath","filter","parentObs","oldValue","value","ctx","observeAll","noArray","type","array","prop","_path","target","parents","observe_apply","ns","args","apply","arguments","shift","$observeAll","namespace","unobserve","$unobserveAll","objMap","observeArrayItems","arr","unobs","newAllPath","filterAndObserveAll","obj","nestedArray","newObject","newParentObs","_fltr","nextParentObs","updatedTgt","unshift","wrappedCb","change","items","oldItems","isObject","obId","notRemoving","un","shallowFilter","indexOf","$unobserve","innerObserve","observeOnOff","pathStr","isArrayBinding","j","evData","obIdExpando","boundObOrArr","prntObs","allPth","initialNs","events","el","callback","fullPath","replace","all","inArray","on","getInnerCb","exprOb","origRt","ob","contextCb","sb","newObj","bindArray","unbind","relPath","prevObj","prevAllPath","cbId","p","skip","parts","dep","depth","innerCb","initNsArr","initNsArrLen","lastArg","pop","_inId","match","split","join","_jsv","bnd","prm","origRoot","nodeType","depends","getDeps","arg","deps","observable","set","Object","Array","_apply","prototype","unobserveAll","setProperty","nonStrict","key","pair","self","name","_setProperty","removeProperty","leaf","setter","getter","removeProp","property","_wrp","Date","_trigger","triggerHandler","insert","index","_insert","oldLength","numToRemove","_remove","move","oldIndex","newIndex","numToMove","_move","refresh","newItems","_refresh","$_data","handleObj","found","map","mapDef","Map","source","options","unbound","changing","src","unmap","tgt","update","obsSrc","obs","srcFlt","obsTgt","obt","tgtFlt","getTgt","baseMap","extend","_def","constructor"],"mappings":"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","file":"jquery.observable.min.js","sourcesContent":["/*! JsObservable v0.9.71 (Beta): http://jsviews.com/#jsobservable */\n/*\n * Subcomponent of JsViews\n * Data change events for data-linking\n *\n * Copyright 2015, Boris Moore\n * Released under the MIT License.\n */\n\n//jshint -W018, -W041\n\n(function(factory) {\n\t// global var is the this object, which is window when running in the usual browser environment\n\tvar global = (0, eval)('this'), // jshint ignore:line\n\t\t$ = global.jQuery;\n\n\tif (typeof define === \"function\" && define.amd) { // AMD script loader, e.g. RequireJS\n\t\tdefine([\"jquery\"], factory); // Require jQuery\n\t} else if (typeof exports === \"object\") { // CommonJS e.g. Browserify\n\t\tmodule.exports = $\n\t\t\t? factory($)\n\t\t\t: function($) { // If no global jQuery, take jQuery passed as parameter: require(\"jsobservable\")(jQuery)\n\t\t\t\treturn factory($);\n\t\t\t};\n\t} else { // Browser using plain - data-linked tag, close marker - // TODO add validation to track whether we are in attribute context (not yet hit preceding ending with a >) or element content of current 'parentTag' - // and accordingly disallow inserting script markers in attribute context. Similar for elCnt too, so no "" or "
...{{/if}}..." + // We validate with inTag so no script markers are inserted in attribute context e.g. for: + // "
" or "
...{{/if}}..." preceding = id ? (preceding + endOfElCnt + spaceBefore + (inTag ? "" : openScript + id + closeScript)+ spaceAfter + tag) : endOfElCnt || all; @@ -1095,13 +1103,13 @@ function viewLink(outerData, parentNode, prevNode, nextNode, html, refresh, cont if (validate && boundId) { if (inTag) { // JsViews data-linking tags are not allowed within element markup. - // See https://github.com/BorisMoore/jsviews/issues/303 + // See jsviews/issues/303 syntaxError('{^{ within elem markup (' + inTag + ' ). Use data-link="..."'); } if (id.charAt(0) === "#") { tagStack.unshift(id.slice(1)); } else if (id.slice(1) !== (bndId = tagStack.shift())) { - // See https://github.com/BorisMoore/jsviews/issues/213 + // See jsviews/issues/213 syntaxError('Closing tag for {^{...}} under different elem: <' + bndId + '>'); } } @@ -1413,7 +1421,7 @@ function viewLink(outerData, parentNode, prevNode, nextNode, html, refresh, cont if (tag.onBeforeLink) { tag.onBeforeLink(); } - // We data-link depth-last ("on the way in"), which is better for perf - and allows setting parent tags etc. + // We data-link depth-first ("on the way in"), which is better for perf - and allows setting parent tags etc. view = tag.tagCtx.view; addDataBinding(undefined, tag._prv, view, linkInfo.id); } else { @@ -1572,7 +1580,7 @@ function viewLink(outerData, parentNode, prevNode, nextNode, html, refresh, cont function addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, context) { // Add data binding for data-linked elements or {^{...}} data-linked tags - var tmpl, tokens, attr, convertBack, params, trimLen, tagExpr, linkFn, linkCtx, tag, rTagIndex, hasElse, + var tmpl, tokens, attr, convertBack, params, trimLen, tagExpr, linkFn, linkCtx, tag, rTagIndex, hasElse, lastIndex, linkExpressions = []; if (boundTagId) { @@ -1609,10 +1617,13 @@ function addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, // This is the first time this view template has been linked, so we compile the data-link expressions, and store them on the template. linkMarkup = normalizeLinkTag(linkMarkup, defaultAttr(node)); - rTagDatalink.lastIndex = 0; - + lastIndex = rTagDatalink.lastIndex = 0; while (tokens = rTagDatalink.exec(linkMarkup)) { // TODO require } to be followed by whitespace or $, and remove the \}(!\}) option. linkExpressions.push(tokens); + lastIndex = rTagDatalink.lastIndex; + } + if (lastIndex < linkMarkup.length) { + syntaxError(linkMarkup); } while (tokens = linkExpressions.shift()) { // Iterate over the data-link expressions, for different target attrs, @@ -1629,9 +1640,6 @@ function addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, tagExpr += "}{{/" + tokens[4] + "}"; } params = tokens[9]; - if (convertBack = tokens[10]) { - convertBack = convertBack.slice(1); - } linkCtx = { data: data, // source @@ -1645,10 +1653,13 @@ function addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, }; if (tokens[6]) { + convertBack = tokens[10]; linkCtx.convert = tokens[5] || ""; - if (!attr && convertBack !== undefined) { + if (!attr && convertBack !== undefined && defaultAttr(node)) { // Default target, so allow 2 way binding - linkCtx.convertBack = convertBack; + linkCtx.convertBack = convertBack = convertBack.slice(1); + } else { + convertBack = undefined; } } // Compile the linkFn expression which evaluates and binds a data-link expression @@ -1875,7 +1886,8 @@ function asyncElemChangeHandler(ev) { function bindElChange($elem, trig, onoff) { if (trig) { - $elem[onoff](trig === true ? "keydown" : trig, trig === true ? asyncElemChangeHandler : elemChangeHandler); + trig = "" + trig === trig ? trig : "keydown"; // Set trigger to (true || truey non-string (e.g. 1) || 'keydown'): Get 'keydown' with async + $elem[onoff](trig, trig === "keydown" ? asyncElemChangeHandler : elemChangeHandler); } } @@ -2001,7 +2013,7 @@ function removeViewBinding(bindId, linkedElemTag, elem) { for (objId in binding.bnd) { object = binding.bnd[objId]; obsId = binding.cbId; - if ($.isArray(object)) { + if ($isArray(object)) { $([object]).off(arrayChangeStr + obsId).off(propertyChangeStr + obsId); // There may be either or both of arrayChange and propertyChange } else { $(object).off(propertyChangeStr + obsId); @@ -2153,7 +2165,7 @@ $sub.viewInfos = viewInfos; // Expose viewInfos() as public helper method delimCloseChar0 = delimChars[2]; delimCloseChar1 = delimChars[3]; linkChar = delimChars[4]; - rTagDatalink = new RegExp("(?:^|\\s*)([\\w-]*)(\\" + linkChar + ")?(\\" + delimOpenChar1 + $sub.rTag + "\\" + delimCloseChar0 + ")", "g"); + rTagDatalink = new RegExp("(?:^|\\s*)([\\w-]*)(\\" + linkChar + ")?(\\" + delimOpenChar1 + $sub.rTag + "(:\\w*)?\\" + delimCloseChar0 + ")", "g"); // Default rTag: attr bind tagExpr tag converter colon html comment code params // (?:^|\s*)([\w-]*)(\^)?({(?:(?:(\w+(?=[\/\s}]))|(?:(\w+)?(:)|(>)|!--((?:[^-]|-(?!-))*)--|(\*)))\s*((?:[^}]|}(?!}))*?))}) @@ -2673,7 +2685,7 @@ $extend($tags["for"], { $observe(arrBinding[0], arrBinding[1], true); //unobserve previous array delete arrayBindings[i]; } - if (!arrayBindings[i] && $.isArray(data)) { + if (!arrayBindings[i] && $isArray(data)) { $observe(data, arrHandler = function(ev, eventArgs) { var tagCt = tagCtx; tag.onArrayChange(ev, eventArgs, tagCt, linkCtx); diff --git a/jquery.views.min.js b/jquery.views.min.js index f16d2c8..af40d45 100644 --- a/jquery.views.min.js +++ b/jquery.views.min.js @@ -1,3 +1,3 @@ -/*! jquery.views.js v0.9.71 (Beta): http://jsviews.com/ */ -!function(e){var t=(0,eval)("this"),n=t.jQuery;"function"==typeof define&&define.amd?define(["jquery","./jsrender","./jquery.observable"],e):"object"==typeof exports?module.exports=n?e(n):function(t){return e(t)}:e(!1)}(function(e,t,n){"use strict";function i(t,n,i){var r,a,o,l,s,d,v,p,c,g,u,h,_,m,b,k,x,C=t.target,y=C._jsvBnd;if(y)for(;g=it.exec(y);)if((g=Qe[g[1]])&&(b=g.to)){if(l=g.linkCtx,c=l.view,m=l.tag,p=e(C),h=c.hlp(ye),_=c.hlp(we),o=f(C),r=qe[o],void 0===i&&(i=re(o)?o(C):r?p[r]():p.attr(o)),d=b[1],b=b[0],b=b+""===b?[l.data,b]:b,d&&(s=re(d)?d:c.getRsc("converters",d)),s&&(i=s.call(m,i)),u=c.linkCtx,c.linkCtx=l,k={change:"change",oldValue:l._val,value:i},!(h&&(a=h.call(l,t,k)===!1)||m&&m.onBeforeChange&&(a=m.onBeforeChange(t,k)===!1)||void 0===i)&&(v=b[0],void 0!==i&&v)){if(v._jsv)for(x=v,v=l.data;x&&x.sb;)v=l._ctxCb(x,v),x=x.sb;m&&(m._.chging=!0),K(v).setProperty(b[2]||b[1],i),_&&_.call(l,t,k),m&&(m.onAfterChange&&m.onAfterChange(t,k),m._.chging=void 0),l._val=i}c.linkCtx=u}}function r(e,t,n){var i,r,o,s,d,v,p=this,g=p.tag,u=p.data,h=p.elem,_=p.convert,m=h.parentNode,b=p.view,k=b.linkCtx,x=b.hlp(ye);if(b.linkCtx=p,!(!m||x&&t&&x.call(p,e,t)===!1||t&&"*"!==e.data.prop&&e.data.prop!==t.path)){if(t&&(p.eventArgs=t),t||p._toLk){if(p._toLk=0,n._er)try{r=n(u,b)}catch(C){d=n._er,v=Y(C,b,new Function("data,view","return "+d+";")(u,b)),r=[{props:{},args:[v]}]}else r=n(u,b,H);if(i=a(r,p,g=p.tag,p.attr||f(h,!0,void 0!==_)),g){if(s=d||g._er,r=r[0]?r:[r],o=!s&&t&&g.onUpdate&&g.onUpdate(e,t,r)===!1,L(g,r,s),o||i===Ne)return i===de&&g.onBeforeLink&&g.onBeforeLink(),j(g),c(p,u,h),void(b.linkCtx=k);if(g._.chging)return;r=":"===g.tagName?H._cnvt(g.cvt,b,r[0]):H._tag(g,b,b.tmpl,r,!0,v)}else n._tag&&(_=""===_?Te:_,r=_?H._cnvt(_,b,r[0]||r):H._tag(n._tag,b,b.tmpl,r,!0,v),q(g=p.tag,!0),i=p.attr||i);l(r,p,i,g)&&t&&(x=b.hlp(we))&&x.call(p,e,t),p._noUpd=0,g&&(g._er=d,j(g,t))}c(p,u,h),b.linkCtx=k}}function a(t,n,i,r){var a,o,l,s,d=i&&i.parentElem||n.elem;if(void 0!==t){if(s=e(d),r=i&&i.attr||r,re(t)&&Y(n.expr+": missing parens"),l=/^css-/.test(r)&&r.slice(4))a=e.style(d,l),+t===t&&(a=parseInt(a));else if("link"!==r){if("value"===r)d.type===Ee&&(a=s.prop(r=Ae));else if(r===Be){if(d.value!==""+t)return r;a=s.prop(Ae)}void 0===a&&(o=qe[r],a=o?s[o]():s.attr(r))}n._val=a}return r}function o(e,t){e._df=t,e[(t?"set":"remove")+"Attribute"](Me,"")}function l(t,n,i,r){var a,l,s,d,f,v,p,g,u,h,_,m,b,k=i!==Ne&&void 0!==t&&!n._noUpd,x=n.data,C=r&&r.parentElem||n.elem,y=e(C),w=n.view,j=n._val,A=w.linkCtx,E=r||i===de;if(r&&(r.parentElem=r.parentElem||n.expr||r._elCnt?C:C.parentNode,l=r._prv,s=r._nxt),!k)return void(i===de&&r&&r.onBeforeLink&&r.onBeforeLink());if("visible"===i&&(i="css-display"),/^css-/.test(i))"visible"===n.attr&&(b=(C.currentStyle||rt.call($,C,"")).display,t?(t=C._jsvd||b,t!==Ne||(t=Je[m=C.nodeName])||(_=ee.createElement(m),ee.body.appendChild(_),t=Je[m]=(_.currentStyle||rt.call($,_,"")).display,ee.body.removeChild(_))):(C._jsvd=b,t=Ne)),(E=E||j!==t)&&e.style(C,i.slice(4),t);else if("link"!==i){if(/^data-/.test(i)&&e.data(C,i.slice(5),t),i===Ae)v=!0,t=t&&"false"!==t;else if(i===Be){if(C.value!==""+t)return void c(n,x,C);t=v=!0,i=Ae}else("selected"===i||"disabled"===i||"multiple"===i||"readonly"===i)&&(t=t&&"false"!==t?i:null);(a=qe[i])?i===de?(w.linkCtx=n,r&&r._.inline?(f=r.nodes(!0),r._elCnt&&(l&&l!==s?M(l,s,C,r._tgId,"^",!0):(p=C._df)&&(g=r._tgId+"^",u=p.indexOf("#"+g)+1,h=p.indexOf("/"+g),u&&h>0&&(u+=g.length,h>u&&(o(C,p.slice(0,u)+p.slice(h)),D(p.slice(u,h))))),l=l?l.previousSibling:s?s.previousSibling:C.lastChild),e(f).remove(),r&&r.onBeforeLink&&r.onBeforeLink(),d=w.link(w.data,C,l,s,t,r&&{tag:r._tgId,lazyLink:r.tagCtx.props.lazyLink})):(k&&y.empty(),r&&r.onBeforeLink&&r.onBeforeLink(),k&&(d=w.link(x,C,l,s,t,r&&{tag:r._tgId}))),w.linkCtx=A):(E=E||j!==t)&&("text"===i&&C.children&&!C.children[0]?void 0!==C.textContent?C.textContent=t:C.innerText=null===t?"":t:y[a](t)):(E=E||j!==t)&&y[v?"prop":"attr"](i,void 0!==t||v?t:null),n._val=t}return d||E}function s(e,t){var n=this,i=n.hlp(ye),r=n.hlp(we);if(!i||i.call(this,e,t)!==!1){if(t){var a=t.change,o=t.index,l=t.items;switch(a){case"insert":n.addViews(o,l);break;case"remove":n.removeViews(o,l.length);break;case"move":n.refresh();break;case"refresh":n.refresh()}}r&&r.call(this,e,t)}}function d(t){var n,i,r=t.type,a=t.data,o=t._.bnd;!t._.useKey&&o&&((i=t._.bndArr)&&(e([i[1]]).off(se,i[0]),t._.bndArr=void 0),o!==!!o?r?o._.arrVws[t._.id]=t:delete o._.arrVws[t._.id]:r&&a&&(n=function(e){e.data&&e.data.off||s.apply(t,arguments)},e([a]).on(se,n),t._.bndArr=[n,a]))}function f(e,t,n){var i=e.nodeName.toLowerCase(),r=te.merge[i]||e.contentEditable===Te&&{to:de,from:de};return r?t?"input"===i&&e.type===Be?Be:r.to:r.from:t?n?"text":de:""}function v(t,n,i,r,a,o,l){var s,d,f,v,p,c=t.parentElem,g=t._prv,u=t._nxt,h=t._elCnt;if(g&&g.parentNode!==c&&Y("Missing parentNode"),l){v=t.nodes(),h&&g&&g!==u&&M(g,u,c,t._.id,"_",!0),t.removeViews(void 0,void 0,!0),d=u,h&&(g=g?g.previousSibling:u?u.previousSibling:c.lastChild),e(v).remove();for(p in t._.bnds)S(p)}else{if(n){if(f=r[n-1],!f)return!1;g=f._nxt}h?(d=g,g=d?d.previousSibling:c.lastChild):d=g.nextSibling}s=i.render(a,o,t._.useKey&&l,t,l||n,!0),t.link(a,c,g,d,s,f)}function p(e,t,n){var i,r;return n?(r="^`",q(n,!0),i=n._tgId,i||(Qe[i=We++]=n,n._tgId=""+i)):(r="_`",q(be[i=t._.id]=t)),"#"+i+r+(void 0!=e?e:"")+"/"+i+r}function c(e,t,n){var i,r,a,o,l,s=e.tag,d=e.convertBack,f=[],v=e._bndId||""+We++,p=e._hdl;if(e._bndId=void 0,s&&(f=s.depends||f,f=re(f)?s.depends(s):f,a=s.linkedElem),!e._depends||""+e._depends!=""+f){for(e._depends&&K._apply(!1,[t],e._depends,p,!0),o=e.fn.deps.slice(),r=o.length;r--;)l=o[r],l._jsv&&(o[r]=ie({},l));i=K._apply(!1,[t],o,f,p,e._ctxCb),i.elem=n,i.linkCtx=e,i._tgId=v,n._jsvBnd=n._jsvBnd||"",n._jsvBnd+="&"+v,e._depends=f,e.view._.bnds[v]=v,Qe[v]=i,a&&(i.to=[[],d]),(a||void 0!==d)&&B(i,s&&s.convertBack||d),s&&(s.onAfterBind&&s.onAfterBind(i),s.flow||s._.inline||(n.setAttribute(xe,(n.getAttribute(xe)||"")+"#"+v+"^/"+v+"^"),s._tgId=""+v))}if(a&&a[0])for(s._.radio&&(a=a.find(Le)),r=a.length;r--;)a[r]._jsvBnd=a[r]._jsvBnd||n._jsvBnd+"+",a[r]._jsvLkEl=s}function g(e,t,n,i,r,a,o){return u(this,e,t,n,i,r,a,o)}function u(t,n,r,a,l,s,d,f){if(a===!0?(l=a,a=void 0):a="object"!=typeof a?void 0:ie({},a),t&&n){n=n.jquery?n:e(n),ce||(ce=ee.body,e(ce).on(Ce,i).on("blur","[contenteditable]",i));for(var v,c,g,u,h,m,b,k,C,y=p,w=a&&"replace"===a.target,j=n.length;j--;){if(b=n[j],s=s||ue(b),(C=s===Z)&&(Z.data=(Z.ctx=a||{}).root=r),""+t===t)_(t,b,s,void 0,!0,r,a);else{if(void 0!==t.markup)s.link===!1&&(a=a||{},a.link=y=!1),w&&(m=b.parentNode),g=t.render(r,a,l,s,void 0,y),m?(d=b.previousSibling,f=b.nextSibling,e.cleanData([b],!0),m.removeChild(b),b=m):(d=f=void 0,e(b).empty());else{if(t!==!0||s!==Z)break;k={lnk:1}}if(b._df&&!f){for(u=x(b._df,!0,Ye),v=0,c=u.length;c>v;v++)h=u[v],(h=be[h.id])&&void 0!==h.data&&h.parent.removeViews(h._.key,void 0,!0);o(b)}s.link(r,b,d,f,g,k,a)}C&&(Z.data=Z.ctx=void 0)}}return n}function h(t,n,i,r,a,l,f,v){function c(e,t,n,i,r,o,l,s,d,f,v,p,c,g){var u,h,_="";return g?(m=0,e):(A=d||f||"",i=i||v,n=n||c,Z&&!n&&(!e||i||A||o&&!m)&&(Z=void 0,G=Le.shift()),i=i||n,i&&(m=0,Z=void 0,K&&(n||c?He[G]||/;svg;|;math;/.test(";"+Le.join(";")+";")||(u="'<"+G+".../"):He[i]?u="'' in:\n"+a)),oe=ae,G=Le.shift(),ae=ze[G],v=v?"":"",oe&&(Ee+=se,se="",ae?Ee+="-":(_=v+Ve+"@"+Ee+Ie+(p||""),Ee=Ne.shift()))),ae?(o?se+=o:t=v||c||"",A&&(t+=A,se&&(t+=" "+xe+'="'+se+'"',se=""))):t=o?t+_+r+(m?"":Ve+o+Ie)+s+A:_||e,K&&l&&(m&&fe("{^{ within elem markup ("+m+' ). Use data-link="..."'),"#"===o.charAt(0)?Le.unshift(o.slice(1)):o.slice(1)!==(h=Le.shift())&&fe("Closing tag for {^{...}} under different elem: <"+h+">")),A&&(m=A,Le.unshift(G),G=A.slice(1),K&&Le[0]&&Le[0]===Ke[G]&&Y("Parent of must be "),Z=He[G],(ae=ze[G])&&!oe&&(Ne.unshift(Ee),Ee=""),oe=ae,Ee&&ae&&(Ee+="+")),t)}function g(e,t){var i,r,a,l,f,v,c,g=[];if(e){for("@"===e._tkns.charAt(0)&&(t=T.previousSibling,T.parentNode.removeChild(T),T=void 0),N=e.length;N--;){if(V=e[N],a=V.ch,i=V.path)for(L=i.length-1;r=i.charAt(L--);)"+"===r?"-"===i.charAt(L)?(L--,t=t.previousSibling):t=t.parentNode:t=t.lastChild;"^"===a?(A=Qe[f=V.id])&&(c=t&&(!T||T.parentNode!==t),(!T||c)&&(A.parentElem=t),V.elCnt&&c&&o(t,(V.open?"#":"/")+f+a+(t._df||"")),g.push([c?null:T,V])):(I=be[f=V.id])&&(I.parentElem||(I.parentElem=t||T&&T.parentNode||n,I._.onRender=p,I._.onArrayChange=s,d(I)),l=I.parentElem,V.open?(I._elCnt=V.elCnt,t&&!T?o(t,"#"+f+a+(t._df||"")):(I._prv||o(l,b(l._df,"#"+f+a)),I._prv=T)):(!t||T&&T.parentNode===t?T&&(I._nxt||o(l,b(l._df,"/"+f+a)),I._nxt=T):(o(t,"/"+f+a+(t._df||"")),I._nxt=void 0),w=I.linkCtx,(v=I.ctx&&I.ctx.onAfterCreate||Se)&&v.call(w,I)))}for(N=g.length;N--;)Be.push(g[N])}return!e||e.elCnt}function u(e){var t,n,i;if(e)for(N=e.length,L=0;N>L;L++)if(V=e[L],n=A=Qe[V.id].linkCtx.tag,i=A.tagName===F,!A.flow||i){if(!R){for(t=1;n=n.parent;)t++;H=H||t}!R&&t!==H||F&&!i||$.push(A)}}function h(){var o,l,s="",d={},v=_e+(ye?",["+Me+"]":"");for(S=Fe?n.querySelectorAll(v):e(v,n).get(),B=S.length,i&&i.innerHTML&&(D=Fe?i.querySelectorAll(v):e(v,i).get(),i=D.length?D[D.length-1]:i),H=0,E=0;B>E;E++)if(T=S[E],i&&!pe)pe=T===i;else{if(r&&T===r){ye&&(s+=k(T));break}if(T.parentNode)if(ye){if(s+=k(T),T._df){for(o=E+1;B>o&&T.contains(S[o]);)o++;d[o-1]=T._df}d[E]&&(s+=d[E]||"")}else Ce&&(V=x(T,void 0,et))&&(V=V[0])&&(ce=ce?V.id!==ce&&ce:V.open&&V.id),!ce&&De(x(T))&&T.getAttribute(he)&&Be.push([T])}if(ye&&(s+=n._df||"",(l=s.indexOf("#"+ye.id)+1)&&(s=s.slice(l+ye.id.length)),l=s.indexOf("/"+ye.id),l+1&&(s=s.slice(0,l)),u(x(s,void 0,tt))),void 0===a&&n.getAttribute(he)&&Be.push([n]),C(i,ae),C(r,ae),ye)return void(ge&&ge.resolve());for(ae&&Ee+se&&(T=r,Ee&&(r?g(x(Ee+"+",!0),r):g(x(Ee,!0),n)),g(x(se,!0),n),r&&(s=r.getAttribute(xe),(B=s.indexOf(de)+1)&&(s=s.slice(B+de.length-1)),r.setAttribute(xe,se+s))),B=Be.length,E=0;B>E;E++)T=Be[E],M=T[1],T=T[0],M?(A=Qe[M.id])&&((w=A.linkCtx)&&(A=w.tag,A.linkCtx=w),M.open?(T&&(A.parentElem=T.parentNode,A._prv=T),A._elCnt=M.elCnt,A.onBeforeLink&&A.onBeforeLink(),I=A.tagCtx.view,_(void 0,A._prv,I,M.id)):(A._nxt=T,A._.unlinked&&(z=A.tagCtx,I=z.view,j(A)))):_(T.getAttribute(he),T,ue(T),void 0,Ce,t,f);ge&&ge.resolve()}var m,w,A,E,B,L,N,S,T,I,V,M,D,q,P,U,O,$,R,F,z,K,H,J,Q,W,X,G,Z,ne,ie,re,ae,oe,le,se,de,pe,ce,ge,Ce,ye,we=this,Ae=we._.id+"_",Ee="",Be=[],Le=[],Ne=[],Se=we.hlp(je),De=g;if(l&&(ge=l.lazyLink&&e.Deferred(),l.tmpl?P="/"+l._.id+"_":(Ce=l.lnk,l.tag&&(Ae=l.tag+"^",l=!0),(ye=l.get)&&(De=u,$=ye.tags,R=ye.deep,F=ye.name)),l=l===!0),n=n?""+n===n?e(n)[0]:n.jquery?n[0]:n:we.parentElem||ee.body,K=!te.noValidate&&n.contentEditable!==Te,G=n.tagName.toLowerCase(),ae=!!ze[G],i=i&&y(i,ae),r=r&&y(r,ae)||null,void 0!=a){if(ie=ee.createElement("div"),ne=ie,de=se="",le="http://www.w3.org/2000/svg"===n.namespaceURI?"svg_ns":(X=ve.exec(a))&&X[1]||"",ke&&X&&X[2]&&Y("Unsupported: "+X[2]),ae){for(O=r;O&&!(U=x(O));)O=O.nextSibling;(re=U?U._tkns:n._df)&&(q=P||"",(l||!P)&&(q+="#"+Ae),L=re.indexOf(q),L+1&&(L+=q.length,de=se=re.slice(0,L),re=re.slice(L),U?O.setAttribute(xe,re):o(n,re)))}if(Z=void 0,a=(""+a).replace(Ge,c),K&&Le.length&&fe("Mismatched '<"+G+"...>' in:\n"+a),v)return;for(Re.appendChild(ie),le=me[le]||me.div,J=le[0],ne.innerHTML=le[1]+a+le[2];J--;)ne=ne.lastChild;for(Re.removeChild(ie),Q=ee.createDocumentFragment();W=ne.firstChild;)Q.appendChild(W);n.insertBefore(Q,r)}return ge?setTimeout(h,0):h(),ge&&ge.promise()}function _(e,t,n,i,r,a,o){var l,s,d,v,p,c,g,u,h,_,b,k=[];if(i)h=Qe[i],h=h.linkCtx?h.linkCtx.tag:h,u=h.linkCtx||{data:n.data,elem:h._elCnt?h.parentElem:t,view:n,ctx:n.ctx,attr:de,fn:h._.bnd,tag:h,_bndId:i},m(u,u.fn);else if(e&&t){for(a=r?a:n.data,l=n.tmpl,e=w(e,f(t)),ge.lastIndex=0;s=ge.exec(e);)k.push(s);for(;s=k.shift();){for(_=ge.lastIndex,d=s[1],c=s[3];k[0]&&"else"===k[0][4];)c+="}{"+k.shift()[3],b=!0;b&&(c+="}{{/"+s[4]+"}"),p=s[9],(v=s[10])&&(v=v.slice(1)),u={data:a,elem:t,view:n,ctx:o,attr:d,isLk:r,_toLk:1,_noUpd:s[2]},s[6]&&(u.convert=s[5]||"",d||void 0===v||(u.convertBack=v)),u.expr=d+c,g=l.links[c],g||(l.links[c]=g=ne.tmplFn(c,l,!0,v,b)),u.fn=g,m(u,g),ge.lastIndex=_}}}function m(e,t){function n(n,i){r.call(e,n,i,t)}n.noArray=!0,e.isLk&&q(e.view=new ne.View(ne.extendCtx(e.ctx,e.view.ctx),"link",e.view,e.data,e.expr,void 0,p)),e._ctxCb=I(e.view),e._hdl=n,n(!0)}function b(e,t){var n;return e?(n=e.indexOf(t),n+1?e.slice(0,n)+e.slice(n+t.length):e):""}function k(e){return e&&(""+e===e?e:e.tagName===Se?e.type.slice(3):1===e.nodeType&&e.getAttribute(xe)||"")}function x(e,t,n){function i(e,t,n,i,a,l){o.push({elCnt:r,id:i,ch:a,open:t,close:n,path:l,token:e})}var r,a,o=[];return(a=t?e:k(e))?(r=o.elCnt=e.tagName!==Se,r="@"===a.charAt(0)||r,o._tkns=a,a.replace(n||nt,i),o):void 0}function C(e,t){e&&("jsv"===e.type?e.parentNode.removeChild(e):t&&""===e.getAttribute(he)&&e.removeAttribute(he))}function y(e,t){for(var n=e;t&&n&&1!==n.nodeType;)n=n.previousSibling;return n&&(1!==n.nodeType?(n=ee.createElement(Se),n.type="jsv",e.parentNode.insertBefore(n,e)):k(n)||n.getAttribute(he)||n.setAttribute(he,"")),n}function w(t,n){return t=e.trim(t).replace(pe,"\\$&"),t.slice(-1)!==W?t=Q+":"+t+(n?":":"")+W:t}function j(t,n){var i,r,a,o,l,s,d,f,v=t.tagCtx,p=v.view,c=v.props,g=t.linkCtx=t.linkCtx||{tag:t,data:p.data,view:p,ctx:p.ctx};if(t.onAfterLink&&t.onAfterLink(v,g,n),t._.unlinked=void 0,i=t.targetTag?t.targetTag.linkedElem:t.linkedElem,!t.noVal&&(r=i&&i[0])){if((a=t._.radio)&&(i=i.find(Le)),a||!t._.chging){if(o=t.cvtArgs()[0],a||r!==g.elem){for(l=i.length;l--;)r=i[l],s=r._jsvLkEl,t._.inline&&(!s||s!==t&&s.targetTag!==t)&&(r._jsvLkEl=t,B(Qe[t._tgId],t.convertBack),r._jsvBnd="&"+t._tgId+"+"),a&&(r[Ae]=o===r.value);g._val=o}void 0!==o&&(a||void 0===r.value?r.contentEditable===Te&&(r.innerHTML=o):r.type===Ee?r[Ae]=o&&"false"!==o:i.val(o))}t.setSize&&(c.height&&i.height(c.height),c.width&&i.width(c.width)),c["class"]&&i.addClass(c["class"]),c.id&&(i[0].id=c.id),c.name&&i.attr("name",c.name)}(r=r||":"===t.tagName&&g.elem)&&(d=r._jsvTr,f=c.trigger,d!==f&&(r._jsvTr=f,i=i||e(r),E(i,d,"off"),E(i,f,"on")))}function A(e){setTimeout(function(){i(e)},0)}function E(e,t,n){t&&e[n](t===!0?"keydown":t,t===!0?A:i)}function B(e,t){var n,i,r,a,o,l=e.linkCtx,s=l.data,d=l.fn.paths;if(e&&d)if(d=(n=d._jsvto)||d[0],i=d&&d.length,!i||l.tag&&!l.tag.tagCtx.args.length)e.to=[[],t];else{if(a=d[i-1],a._jsv){for(o=a;a.sb&&a.sb._jsv;)r=a=a.sb;r=a.sb||r&&r.path,a=r?r.slice(1):o.path}e.to=r?[[o,a],t]:[l._ctxCb(r=a.split("^").join("."))||[s,r],t]}}function L(e,t,n){var i,r,a=e.tagCtx.view,o=e.tagCtxs||[e.tagCtx],l=o.length,s=!t;if(t=t||e._.bnd.call(a.tmpl,(e.linkCtx||a).data,a,H),n)o=e.tagCtxs=t,e.tagCtx=o[0];else for(;l--;)i=o[l],r=t[l],K(i.props).setProperty(r.props),ie(i.ctx,r.ctx),i.args=r.args,s&&(i.tmpl=r.tmpl);return ne._ths(e,o[0]),o}function N(e){for(var t,n,i,r=[],a=e.length,o=a;o--;)r.push(e[o]);for(o=a;o--;)if(n=r[o],n.parentNode){if(i=n._jsvBnd)for(i=i.slice(1).split("&"),n._jsvBnd="",t=i.length;t--;)S(i[t],n._jsvLkEl,n);D(k(n)+(n._df||""))}}function S(t,n,i){var r,a,o,l,s,d,f,v,p,c,g,u,h=Qe[t];if(n)i===n.linkedElem[0]&&(i._jsvLkEl=void 0,n.linkedElem=void 0);else if(h){delete Qe[t];for(r in h.bnd)l=h.bnd[r],s=h.cbId,e.isArray(l)?e([l]).off(se+s).off(le+s):e(l).off(le+s),delete h.bnd[r];if(a=h.linkCtx){if(o=a.tag){if(d=o.tagCtxs)for(f=d.length;f--;)(v=d[f].map)&&v.unmap();p=o.linkedElem,c=p&&p[0]||a.elem,(g=c&&c._jsvTr)&&(E(p||e(c),g,"off"),c._jsvTr=void 0),o.onDispose&&o.onDispose(),o._elCnt||(o._prv&&o._prv.parentNode.removeChild(o._prv),o._nxt&&o._nxt.parentNode.removeChild(o._nxt))}u=a.view,"link"===u.type?u.parent.removeViews(u._.key,void 0,!0):delete u._.bnds[t]}ne._cbBnds[h.cbId]=void 0}}function T(t){t?(t=t.jquery?t:e(t),t.each(function(){for(var e;(e=ue(this,!0))&&e.parent;)e.parent.removeViews(e._.key,void 0,!0);N(this.getElementsByTagName("*"))}),N(t)):(ce&&(e(ce).off(Ce,i).off("blur","[contenteditable]",i),ce=void 0),Z.removeViews(),N(ee.body.getElementsByTagName("*")))}function I(e){return function(t,n){var i,r,a=[n];if(e&&t){if(t._jsv)return t._jsv.call(e.tmpl,n,e,H);if("~"===t.charAt(0))return"~tag"===t.slice(0,4)&&(r=e.ctx,"."===t.charAt(4)&&(i=t.slice(5).split("."),r=r.tag),i)?r?[r,i.join("."),n]:[]:(t=t.slice(1).split("."),(n=e.hlp(t.shift()))&&(t.length&&a.unshift(t.join(".")),a.unshift(n)),n?a:[]);if("#"===t.charAt(0))return"#data"===t?[]:[e,t.replace(Xe,""),n]}}}function V(e){return e.type===Ee?e[Ae]:e.value}function M(e,t,n,i,r,a){var l,s,d,f,v,p,c,g=0,u=e===t;if(e){for(d=x(e)||[],l=0,s=d.length;s>l;l++){if(f=d[l],p=f.id,p===i&&f.ch===r){if(!a)break;s=0}u||(v="_"===f.ch?be[p]:Qe[p].linkCtx.tag,f.open?v._prv=t:f.close&&(v._nxt=t)),g+=p.length+2}g&&e.setAttribute(xe,e.getAttribute(xe).slice(g)),c=t?t.getAttribute(xe):n._df,(s=c.indexOf("/"+i+r)+1)&&(c=d._tkns.slice(0,g)+c.slice(s+(a?-1:i.length+1))),c&&(t?t.setAttribute(xe,c):o(n,c))}else o(n,b(n._df,"#"+i+r)),a||t||o(n,b(n._df,"/"+i+r))}function D(e){var t,n,i,r;if(r=x(e,!0,Ze))for(t=0,n=r.length;n>t;t++)i=r[t],"_"===i.ch?(i=be[i.id])&&i.type&&i.parent.removeViews(i._.key,void 0,!0):S(i.id)}function q(t,n){t.contents=function(t,n){t!==!!t&&(n=t,t=void 0);var i,r=e(this.nodes());return r[0]&&(i=n?r.filter(n):r,r=t&&n?i.add(r.find(n)):i),r},t.nodes=function(e,t,n){var i,r=this,a=r._elCnt,o=!t&&a,l=[];for(t=t||r._prv,n=n||r._nxt,i=o?t===r._nxt?r.parentElem.lastSibling:t:r._.inline===!1?t||r.linkCtx.elem.firstChild:t&&t.nextSibling;i&&(!n||i!==n);)(e||a||i.tagName!==Se)&&l.push(i),i=i.nextSibling;return l},t.childTags=function(e,t){e!==!!e&&(t=e,e=void 0);var n=this,i=n.link?n:n.tagCtx.view,r=n._prv,a=n._elCnt,o=[];return i.link(void 0,n.parentElem,a?r&&r.previousSibling:r,n._nxt,void 0,{get:{tags:o,deep:e,name:t,id:n.link?n._.id+"_":n._tgId+"^"}}),o},t.refresh=function(e){var t,n,i=this,r=i.linkCtx,a=i.tagCtx.view;return i.disposed&&Y("Removed tag"),void 0===e&&(e=H._tag(i,a,a.tmpl,L(i),!0)),e+""===e&&(n=i._.inline?de:r.attr||f(i.parentElem,!0),t=l(e,r,n,i)),j(i),t||i},t.update=function(e){var t=this.linkedElem;t&&i({target:t[0]},void 0,e)},n?t.domChange=function(){var t=this.parentElem,n=e.hasData(t)&&e._data(t).events,i="jsv-domchange";n&&n[i]&&e(t).triggerHandler(i,arguments)}:(t.addViews=function(e,t,n){var i,r,a=this,o=t.length,l=a.views;if(!a._.useKey&&o&&(n=a.tmpl)&&(r=l.length+o,r===a.data.length&&v(a,e,n,l,t,a.ctx)!==!1))for(i=e+o;r>i;i++)K(l[i]).setProperty("index",i);return a},t.removeViews=function(t,n,i){function r(t){var n,r,a,o,l,s,f=v[t];if(f&&f.link){if(n=f._.id,i||(s=f.nodes()),f.removeViews(void 0,void 0,!0),f.type=void 0,o=f._prv,l=f._nxt,a=f.parentElem,i||(f._elCnt&&M(o,l,a,n,"_"),e(s).remove()),!f._elCnt)try{o.parentNode.removeChild(o),l.parentNode.removeChild(l)}catch(p){}d(f);for(r in f._.bnds)S(r);delete be[n]}}var a,o,l,s=this,f=!s._.useKey,v=s.views;if(f&&(l=v.length),void 0===t)if(f){for(a=l;a--;)r(a);s.views=[]}else{for(o in v)r(o);s.views={}}else if(void 0===n&&(f?n=1:(r(t),delete v[t])),f&&n&&l-n===s.data.length){for(a=t+n;a-->t;)r(a);if(v.splice(t,n),l=v.length)for(;l>t;)K(v[t]).setProperty("index",t++)}return this},t.refresh=function(e){var t=this,n=t.parent;return n&&(v(t,t.index,t.tmpl,n.views,t.data,e,!0),d(t)),t},t.link=h)}function P(e,t,n){if("set"===n.change){for(var i=e.tgt,r=i.length;r--&&i[r].key!==n.path;);-1===r?n.path&&!n.remove&&K(i).insert({key:n.path,prop:n.value}):n.remove?K(i).remove(r):K(i[r]).setProperty("prop",n.value)}}function U(e,t,n){var i,r=e.src,a=n.change;"set"===a?"prop"===n.path?K(r).setProperty(t.target.key,n.value):(K(r).setProperty(n.oldValue,null),delete r[n.oldValue],K(r).setProperty(n.value,t.target.prop)):"remove"===a?(i=n.items[0],K(r).removeProperty(i.key),delete r[i.key]):"insert"===a&&(i=n.items[0],i.key&&K(r).setProperty(i.key,i.prop))}function O(e){return e.indexOf(".")<0}var $=(0,eval)("this"),R=e===!1;t=t||R&&$.jsrender,e=e||$.jQuery;var F="JsViews requires ";if(!e||!e.fn)throw F+"jQuery";t&&!t.fn&&t.views.sub._jq(e);var z,K,H=e.views;if(!H||!H.settings)throw F+"JsRender";var J,Q,W,X,G,Y,Z,ee=$.document,te=H.settings,ne=H.sub,ie=ne.extend,re=e.isFunction,ae=H.converters,oe=H.tags,le=ne.propChng=ne.propChng||"propertyChange",se=ne.arrChng=ne.arrChng||"arrayChange",de="html",fe=ne.syntaxErr,ve=/<(?!script)(\w+)(?:[^>]*(on\w+)\s*=)?[^>]*>/,pe=/['"\\]/g;if(e.link)return e;var ce,ge,ue,he,_e,me,be,ke,xe="data-jsv",Ce="change.jsv",ye="onBeforeChange",we="onAfterChange",je="onAfterCreate",Ae="checked",Ee="checkbox",Be="radio",Le="input[type=radio]",Ne="none",Se="SCRIPT",Te="true",Ie='">',Ve='',Me='',\n\topenScript = ' - data-linked tag, close marker\n\t\t\t// TODO add validation to track whether we are in attribute context (not yet hit preceding ending with a >) or element content of current 'parentTag'\n\t\t\t// and accordingly disallow inserting script markers in attribute context. Similar for elCnt too, so no \"
\" or \"
...{{/if}}...\"\n\t\t\tpreceding = id\n\t\t\t\t? (preceding + endOfElCnt + spaceBefore + (inTag ? \"\" : openScript + id + closeScript)+ spaceAfter + tag)\n\t\t\t\t: endOfElCnt || all;\n\t\t}\n\n\t\tif (validate && boundId) {\n\t\t\tif (inTag) {\n\t\t\t\t// JsViews data-linking tags are not allowed within element markup.\n\t\t\t\t// See https://github.com/BorisMoore/jsviews/issues/303\n\t\t\t\tsyntaxError('{^{ within elem markup (' + inTag + ' ). Use data-link=\"...\"');\n\t\t\t}\n\t\t\tif (id.charAt(0) === \"#\") {\n\t\t\t\ttagStack.unshift(id.slice(1));\n\t\t\t} else if (id.slice(1) !== (bndId = tagStack.shift())) {\n\t\t\t\t// See https://github.com/BorisMoore/jsviews/issues/213\n\t\t\t\tsyntaxError('Closing tag for {^{...}} under different elem: <' + bndId + '>');\n\t\t\t}\n\t\t}\n\t\tif (tag) {\n\t\t\tinTag = tag;\n\t\t\t// If there are ids (markers since the last tag), move them to the defer string\n\t\t\ttagStack.unshift(parentTag);\n\t\t\tparentTag = tag.slice(1);\n\t\t\tif (validate && tagStack[0] && tagStack[0] === badParent[parentTag]) {\n\t\t\t\t// Missing \n\t\t\t\t// TODO: replace this by smart insertion of tags\n\t\t\t\terror('Parent of must be ');\n\t\t\t}\n\t\t\tisVoid = voidElems[parentTag];\n\t\t\tif ((elCnt = elContent[parentTag]) && !prevElCnt) {\n\t\t\t\tdeferStack.unshift(defer);\n\t\t\t\tdefer = \"\";\n\t\t\t}\n\t\t\tprevElCnt = elCnt;\n//TODO Consider providing validation which throws if you place as child of , etc. - since if not caught,\n//this can cause errors subsequently which are difficult to debug.\n//\t\t\t\tif (elContent[tagStack[0]]>2 && !elCnt) {\n//\t\t\t\t\terror(parentTag + \" in \" + tagStack[0]);\n//\t\t\t\t}\n\t\t\tif (defer && elCnt) {\n\t\t\t\tdefer += \"+\"; // Will be used for stepping back through deferred tokens\n\t\t\t}\n\t\t}\n\t\treturn preceding;\n\t}\n\n\tfunction processViewInfos(vwInfos, targetParent) {\n\t\t// If targetParent, we are processing viewInfos (which may include navigation through '+-' paths) and hooking up to the right parentElem etc.\n\t\t// (and elem may also be defined - the next node)\n\t\t// If no targetParent, then we are processing viewInfos on newly inserted content\n\t\tvar deferPath, deferChar, bindChar, parentElem, id, onAftCr, deep,\n\t\t\taddedBindEls = [];\n\n\t\t// In elCnt context (element-only content model), prevNode is the first node after the open, nextNode is the first node after the close.\n\t\t// If both are null/undefined, then open and close are at end of parent content, so the view is empty, and its placeholder is the\n\t\t// 'lastChild' of the parentNode. If there is a prevNode, then it is either the first node in the view, or the view is empty and\n\t\t// its placeholder is the 'previousSibling' of the prevNode, which is also the nextNode.\n\t\tif (vwInfos) {\n\t\t\tif (vwInfos._tkns.charAt(0) === \"@\") {\n\t\t\t\t// We are processing newly inserted content. This is a special script element that was created in convertMarkers() to process deferred bindings,\n\t\t\t\t// and inserted following the target parent element - because no element tags (outside elCnt) were encountered to carry those binding tokens.\n\t\t\t\t// We will step back from the preceding sibling of this element, looking at targetParent elements until we find the one that the current binding\n\t\t\t\t// token belongs to. Set elem to null (the special script element), and remove it from the DOM.\n\t\t\t\ttargetParent = elem.previousSibling;\n\t\t\t\telem.parentNode.removeChild(elem);\n\t\t\t\telem = undefined;\n\t\t\t}\n\t\t\tlen = vwInfos.length;\n\t\t\twhile (len--) {\n\t\t\t\tvwInfo = vwInfos[len];\n//if (prevIds.indexOf(vwInfo.token) < 0) { // This token is a newly created view or tag binding\n\t\t\t\tbindChar = vwInfo.ch;\n\t\t\t\tif (deferPath = vwInfo.path) {\n\t\t\t\t\t// We have a 'deferred path'\n\t\t\t\t\tj = deferPath.length - 1;\n\t\t\t\t\twhile (deferChar = deferPath.charAt(j--)) {\n\t\t\t\t\t\t// Use the \"+\" and\"-\" characters to navigate the path back to the original parent node where the deferred bindings ocurred\n\t\t\t\t\t\tif (deferChar === \"+\") {\n\t\t\t\t\t\t\tif (deferPath.charAt(j) === \"-\") {\n\t\t\t\t\t\t\t\tj--;\n\t\t\t\t\t\t\t\ttargetParent = targetParent.previousSibling;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttargetParent = targetParent.parentNode;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttargetParent = targetParent.lastChild;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Note: Can use previousSibling and lastChild, not previousElementSibling and lastElementChild,\n\t\t\t\t\t\t// since we have removed white space within elCnt. Hence support IE < 9\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (bindChar === \"^\") {\n\t\t\t\t\tif (tag = bindingStore[id = vwInfo.id]) {\n\t\t\t\t\t\t// The binding may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\t\t// This is a tag binding\n\t\t\t\t\t\tdeep = targetParent && (!elem || elem.parentNode !== targetParent); // We are stepping back looking for the right targetParent,\n\t\t\t\t\t\t// or we are linking existing content and this element is in elCnt, not an immediate child of the targetParent.\n\t\t\t\t\t\tif (!elem || deep) {\n\t\t\t\t\t\t\ttag.parentElem = targetParent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (vwInfo.elCnt && deep) {\n\t\t\t\t\t\t\t// With element only content, if there is no following element, or if the binding is deeper than the following element\n\t\t\t\t\t\t\t// then we need to set the open or close token as a deferred binding annotation on the parent\n\t\t\t\t\t\t\tsetDefer(targetParent, (vwInfo.open ? \"#\" : \"/\") + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// This is an open or close marker for a data-linked tag {^{...}}. Add it to bindEls.\n\t\t\t\t\t\taddedBindEls.push([deep ? null : elem, vwInfo]);\n\t\t\t\t\t}\n\t\t\t\t} else if (view = viewStore[id = vwInfo.id]) {\n\t\t\t\t\t// The view may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\tif (!view.parentElem) {\n\t\t\t\t\t\t// If view is not already extended for JsViews, extend and initialize the view object created in JsRender, as a JsViews view\n\t\t\t\t\t\tview.parentElem = targetParent || elem && elem.parentNode || parentNode;\n\t\t\t\t\t\tview._.onRender = addBindingMarkers;\n\t\t\t\t\t\tview._.onArrayChange = arrayChangeHandler;\n\t\t\t\t\t\tsetArrayChangeLink(view);\n\t\t\t\t\t}\n\t\t\t\t\tparentElem = view.parentElem;\n\t\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t\t// This is an 'open view' node (preceding script marker node,\n\t\t\t\t\t\t// or if elCnt, the first element in the view, with a data-jsv annotation) for binding\n\t\t\t\t\t\tview._elCnt = vwInfo.elCnt;\n\t\t\t\t\t\tif (targetParent && !elem) {\n\t\t\t\t\t\t\tsetDefer(targetParent, \"#\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// No targetParent, so there is a ._nxt elem (and this is processing tokens on the elem)\n\t\t\t\t\t\t\tif (!view._prv) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This is a 'close view' marker node for binding\n\t\t\t\t\t\tif (targetParent && (!elem || elem.parentNode !== targetParent)) {\n\t\t\t\t\t\t\t// There is no ._nxt so add token to _df. It is deferred.\n\t\t\t\t\t\t\tsetDefer(targetParent, \"/\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t\tview._nxt = undefined;\n\t\t\t\t\t\t} else if (elem) {\n\t\t\t\t\t\t\t// This view did not have a ._nxt, but has one now, so token may be in _df, and must be removed. (No longer deferred)\n\t\t\t\t\t\t\tif (!view._nxt) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._nxt = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlinkCtx = view.linkCtx;\n\t\t\t\t\t\tif (onAftCr = view.ctx && view.ctx.onAfterCreate || onAfterCreate) {\n\t\t\t\t\t\t\tonAftCr.call(linkCtx, view);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n//}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlen = addedBindEls.length;\n\t\t\twhile (len--) {\n\t\t\t\t// These were added in reverse order to addedBindEls. We push them in BindEls in the correct order.\n\t\t\t\tbindEls.push(addedBindEls[len]);\n\t\t\t}\n\t\t}\n\t\treturn !vwInfos || vwInfos.elCnt;\n\t}\n\n\tfunction getViewInfos(vwInfos) {\n\t\t// Used by view.childTags() and tag.childTags()\n\t\t// Similar to processViewInfos in how it steps through bindings to find tags. Only finds data-linked tags.\n\t\tvar level, parentTag, named;\n\n\t\tif (vwInfos) {\n\t\t\tlen = vwInfos.length;\n\t\t\tfor (j = 0; j < len; j++) {\n\t\t\t\tvwInfo = vwInfos[j];\n\t\t\t\t// This is an open marker for a data-linked tag {^{...}}, within the content of the tag whose id is get.id. Add it to bindEls.\n\t\t\t\t// Note - if bindingStore[vwInfo.id]._is === \"tag\" then getViewInfos is being called too soon - during first linking pass\n\t\t\t\tparentTag = tag = bindingStore[vwInfo.id].linkCtx.tag;\n\t\t\t\tnamed = tag.tagName === tagName;\n\t\t\t\tif (!tag.flow || named) {\n\t\t\t\t\tif (!deep) {\n\t\t\t\t\t\tlevel = 1;\n\t\t\t\t\t\twhile (parentTag = parentTag.parent) {\n\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttagDepth = tagDepth || level; // The level of the first tag encountered.\n\t\t\t\t\t}\n\t\t\t\t\tif ((deep || level === tagDepth) && (!tagName || named)) {\n\t\t\t\t\t\t// Filter on top-level or tagName as appropriate\n\t\t\t\t\t\ttags.push(tag);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction dataLink() {\n\t\t//================ Data-link and fixup of data-jsv annotations ================\n\t\tvar j, index,\n\t\t\ttokens = \"\",\n\t\t\twrap = {},\n\t\t\tselector = linkViewsSel + (get ? \",[\" + deferAttr + \"]\" : \"\");\n\t\t\t// If a childTags() call, get = \",[\" + deferAttr + \"]\" - since we need to include elements that have a ._df expando for deferred tokens\n\n\t\telems = qsa ? parentNode.querySelectorAll(selector) : $(selector, parentNode).get();\n\t\tl = elems.length;\n\n\t\t// The prevNode will be in the returned query, since we called markPrevOrNextNode() on it.\n\t\t// But it may have contained nodes that satisfy the selector also.\n\t\tif (prevNode && prevNode.innerHTML) {\n\t\t\t// Find the last contained node of prevNode, to use as the prevNode - so we only link subsequent elems in the query\n\t\t\tprevNodes = qsa ? prevNode.querySelectorAll(selector) : $(selector, prevNode).get();\n\t\t\tprevNode = prevNodes.length ? prevNodes[prevNodes.length - 1] : prevNode;\n\t\t}\n\n\t\ttagDepth = 0;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = elems[i];\n\t\t\tif (prevNode && !found) {\n\t\t\t\t// If prevNode is set, not false, skip linking. If this element is the prevNode, set to false so subsequent elements will link.\n\t\t\t\tfound = (elem === prevNode);\n\t\t\t} else if (nextNode && elem === nextNode) {\n\t\t\t\t// If nextNode is set then break when we get to nextNode\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else if (elem.parentNode) {\n\t\t\t\t// elem has not been removed from DOM\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t\tif (elem._df) {\n\t\t\t\t\t\tj = i + 1;\n\t\t\t\t\t\twhile (j < l && elem.contains(elems[j])) {\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Add defered tokens after any tokens on descendant elements of this one\n\t\t\t\t\t\twrap[j-1] = elem._df;\n\t\t\t\t\t}\n\t\t\t\t\tif (wrap[i]) {\n\t\t\t\t\t\ttokens += wrap[i] || \"\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (isLink && (vwInfo = viewInfos(elem, undefined, rViewMarkers)) && (vwInfo = vwInfo[0])) {\n\t\t\t\t\t\t// If this is a link(trueOrString ...) call we will avoid re-binding to elems that are within template-rendered views\n\t\t\t\t\t\tskip = skip ? (vwInfo.id !== skip && skip) : vwInfo.open && vwInfo.id;\n\t\t\t\t\t}\n\t\t\t\t\tif (!skip && processInfos(viewInfos(elem))\n\t\t\t\t\t\t// If a link() call, processViewInfos() adds bindings to bindEls, and returns true for non-script nodes, for adding data-link bindings\n\t\t\t\t\t\t// If a childTags() call, getViewInfos returns array of tag bindings.\n\t\t\t\t\t\t\t&& elem.getAttribute($viewsLinkAttr)) {\n\t\t\t\t\t\tbindEls.push([elem]); // A data-linked element so add to bindEls too\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (get) {\n\t\t\ttokens += parentNode._df || \"\";\n\t\t\tif (index = tokens.indexOf(\"#\" + get.id) + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so start after the open token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(index + get.id.length);\n\t\t\t}\n\t\t\tindex = tokens.indexOf(\"/\" + get.id);\n\t\t\tif (index + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so don't look beyond the close token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(0, index);\n\t\t\t}\n\t\t\t// Call getViewInfos to add the found childTags to the tags array\n\t\t\tgetViewInfos(viewInfos(tokens, undefined, rOpenTagMarkers));\n\t\t}\n\n\t\tif (html === undefined && parentNode.getAttribute($viewsLinkAttr)) {\n\t\t\tbindEls.push([parentNode]); // Support data-linking top-level element directly (not within a data-linked container)\n\t\t}\n\n\t\t// Remove temporary marker script nodes they were added by markPrevOrNextNode\n\t\tunmarkPrevOrNextNode(prevNode, elCnt);\n\t\tunmarkPrevOrNextNode(nextNode, elCnt);\n\n\t\tif (get) {\n\t\t\tif (lazyLink) {\n\t\t\t\tlazyLink.resolve();\n\t\t\t}\n\t\t\treturn; // We have added childTags to the tags array, so we are done\n\t\t}\n\n\t\tif (elCnt && defer + ids) {\n\t\t\t// There are some views with elCnt, for which the open or close did not precede any HTML tag - so they have not been processed yet\n\t\t\telem = nextNode;\n\t\t\tif (defer) {\n\t\t\t\tif (nextNode) {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer + \"+\", true), nextNode);\n\t\t\t\t} else {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer, true), parentNode);\n\t\t\t\t}\n\t\t\t}\n\t\t\tprocessViewInfos(viewInfos(ids, true), parentNode);\n\t\t\t// If there were any tokens on nextNode which have now been associated with inserted HTML tags, remove them from nextNode\n\t\t\tif (nextNode) {\n\t\t\t\ttokens = nextNode.getAttribute(jsvAttrStr);\n\t\t\t\tif (l = tokens.indexOf(prevIds) + 1) {\n\t\t\t\t\ttokens = tokens.slice(l + prevIds.length - 1);\n\t\t\t\t}\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, ids + tokens);\n\t\t\t}\n\t\t}\n\n\t\t//================ Bind the data-linked elements and tags ================\n\t\tl = bindEls.length;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = bindEls[i];\n\t\t\tlinkInfo = elem[1];\n\t\t\telem = elem[0];\n\t\t\tif (linkInfo) {\n\t\t\t\tif (tag = bindingStore[linkInfo.id]) {\n\t\t\t\t\tif (linkCtx = tag.linkCtx) {\n\t\t\t\t\t\t// The tag may have been stored temporarily on the bindingStore - or may have already been replaced by the actual binding\n\t\t\t\t\t\ttag = linkCtx.tag;\n\t\t\t\t\t\ttag.linkCtx = linkCtx;\n\t\t\t\t\t}\n\t\t\t\t\tif (linkInfo.open) {\n\t\t\t\t\t\t// This is an 'open linked tag' binding annotation for a data-linked tag {^{...}}\n\t\t\t\t\t\tif (elem) {\n\t\t\t\t\t\t\ttag.parentElem = elem.parentNode;\n\t\t\t\t\t\t\ttag._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttag._elCnt = linkInfo.elCnt;\n\t\t\t\t\t\tif (tag.onBeforeLink) {\n\t\t\t\t\t\t\ttag.onBeforeLink();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// We data-link depth-last (\"on the way in\"), which is better for perf - and allows setting parent tags etc.\n\t\t\t\t\t\tview = tag.tagCtx.view;\n\t\t\t\t\t\taddDataBinding(undefined, tag._prv, view, linkInfo.id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttag._nxt = elem;\n\t\t\t\t\t\tif (tag._.unlinked) {\n\t\t\t\t\t\t\t// This is a 'close linked tag' binding annotation\n\t\t\t\t\t\t\t// Add data binding\n\t\t\t\t\t\t\ttagCtx = tag.tagCtx;\n\t\t\t\t\t\t\tview = tagCtx.view;\n\t\t\t\t\t\t\tcallAfterLink(tag);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Add data binding for a data-linked element (with data-link attribute)\n\t\t\t\taddDataBinding(elem.getAttribute($viewsLinkAttr), elem, $view(elem), undefined, isLink, outerData, context);\n\t\t\t}\n\t\t}\n\t\tif (lazyLink) {\n\t\t\tlazyLink.resolve();\n\t\t}\n\t}\n\t//==== /end of nested functions ====\n\n\tvar inTag, linkCtx, tag, i, l, j, len, elems, elem, view, vwInfo, linkInfo, prevNodes, token, prevView, nextView,\n\t\tnode, tags, deep, tagName, tagCtx, validate, tagDepth, depth, fragment, copiedNode, firstTag, parentTag,\n\t\tisVoid, wrapper, div, tokens, elCnt, prevElCnt, htmlTag, ids, prevIds, found, skip, lazyLink, isLink, get,\n\t\tself = this,\n\t\tthisId = self._.id + \"_\",\n\t\tdefer = \"\",\n\t\t// The marker ids for which no tag was encountered (empty views or final closing markers) which we carry over to container tag\n\t\tbindEls = [],\n\t\ttagStack = [],\n\t\tdeferStack = [],\n\t\tonAfterCreate = self.hlp(onAfterCreateStr),\n\t\tprocessInfos = processViewInfos;\n\n\tif (refresh) {\n\t\tlazyLink = refresh.lazyLink && $.Deferred();\n\t\tif (refresh.tmpl) {\n\t\t\t// refresh is the prevView, passed in from addViews()\n\t\t\tprevView = \"/\" + refresh._.id + \"_\";\n\t\t} else {\n\t\t\tisLink = refresh.lnk; // Top-level linking\n\t\t\tif (refresh.tag) {\n\t\t\t\tthisId = refresh.tag + \"^\";\n\t\t\t\trefresh = true;\n\t\t\t}\n\t\t\tif (get = refresh.get) {\n\t\t\t\tprocessInfos = getViewInfos;\n\t\t\t\ttags = get.tags;\n\t\t\t\tdeep = get.deep;\n\t\t\t\ttagName = get.name;\n\t\t\t}\n\t\t}\n\t\trefresh = refresh === true;\n\t}\n\n\tparentNode = parentNode\n\t\t? (\"\" + parentNode === parentNode\n\t\t\t? $(parentNode)[0] // It is a string, so treat as selector\n\t\t\t: parentNode.jquery\n\t\t\t\t? parentNode[0] // A jQuery object - take first element.\n\t\t\t\t: parentNode)\n\t\t: (self.parentElem // view.link()\n\t\t\t|| document.body); // link(null, data) to link the whole document\n\n\tvalidate = !$viewsSettings.noValidate && parentNode.contentEditable !== TRUE;\n\tparentTag = parentNode.tagName.toLowerCase();\n\telCnt = !!elContent[parentTag];\n\n\tprevNode = prevNode && markPrevOrNextNode(prevNode, elCnt);\n\tnextNode = nextNode && markPrevOrNextNode(nextNode, elCnt) || null;\n\n\tif (html != undefined) {\n\t\t//================ Insert html into DOM using documentFragments (and wrapping HTML appropriately). ================\n\t\t// Also convert markers to DOM annotations, based on content model.\n\t\t// Corresponds to nextNode ? $(nextNode).before(html) : $(parentNode).html(html);\n\t\t// but allows insertion to wrap correctly even with inserted script nodes. jQuery version will fail e.g. under tbody or select.\n\t\t// This version should also be slightly faster\n\t\tdiv = document.createElement(\"div\");\n\t\twrapper = div;\n\t\tprevIds = ids = \"\";\n\t\thtmlTag = parentNode.namespaceURI === \"http://www.w3.org/2000/svg\" ? \"svg_ns\" : (firstTag = rFirstElem.exec(html)) && firstTag[1] || \"\";\n\t\tif (noDomLevel0 && firstTag && firstTag[2]) {\n\t\t\terror(\"Unsupported: \" + firstTag[2]); // For security reasons, don't allow insertion of elements with onFoo attributes.\n\t\t}\n\t\tif (elCnt) {\n\t\t\t// Now look for following view, and find its tokens, or if not found, get the parentNode._df tokens\n\t\t\tnode = nextNode;\n\t\t\twhile (node && !(nextView = viewInfos(node))) {\n\t\t\t\tnode = node.nextSibling;\n\t\t\t}\n\t\t\tif (tokens = nextView ? nextView._tkns : parentNode._df) {\n\t\t\t\ttoken = prevView || \"\";\n\t\t\t\tif (refresh || !prevView) {\n\t\t\t\t\ttoken += \"#\" + thisId;\n\t\t\t\t}\n\t\t\t\tj = tokens.indexOf(token);\n\t\t\t\tif (j + 1) {\n\t\t\t\t\tj += token.length;\n\t\t\t\t\t// Transfer the initial tokens to inserted nodes, by setting them as the ids variable, picked up in convertMarkers\n\t\t\t\t\tprevIds = ids = tokens.slice(0, j);\n\t\t\t\t\ttokens = tokens.slice(j);\n\t\t\t\t\tif (nextView) {\n\t\t\t\t\t\tnode.setAttribute(jsvAttrStr, tokens);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetDefer(parentNode, tokens);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//================ Convert the markers to DOM annotations, based on content model. ================\n//\t\t\toldElCnt = elCnt;\n\t\tisVoid = undefined;\n\t\thtml = (\"\" + html).replace(rConvertMarkers, convertMarkers);\n//\t\t\tif (!!oldElCnt !== !!elCnt) {\n//\t\t\t\terror(\"Parse: \" + html); // Parse error. Content not well-formed?\n//\t\t\t}\n\t\tif (validate && tagStack.length) {\n\t\t\tsyntaxError(\"Mismatched '<\" + parentTag + \"...>' in:\\n\" + html); // Unmatched tag\n\t\t}\n\t\tif (validateOnly) {\n\t\t\treturn;\n\t\t}\n\t\t// Append wrapper element to doc fragment\n\t\tsafeFragment.appendChild(div);\n\n\t\t// Go to html and back, then peel off extra wrappers\n\t\t// Corresponds to jQuery $(nextNode).before(html) or $(parentNode).html(html);\n\t\t// but supports svg elements, and other features missing from jQuery version (and this version should also be slightly faster)\n\t\thtmlTag = wrapMap[htmlTag] || wrapMap.div;\n\t\tdepth = htmlTag[0];\n\t\twrapper.innerHTML = htmlTag[1] + html + htmlTag[2];\n\t\twhile (depth--) {\n\t\t\twrapper = wrapper.lastChild;\n\t\t}\n\t\tsafeFragment.removeChild(div);\n\t\tfragment = document.createDocumentFragment();\n\t\twhile (copiedNode = wrapper.firstChild) {\n\t\t\tfragment.appendChild(copiedNode);\n\t\t}\n\t\t// Insert into the DOM\n\t\tparentNode.insertBefore(fragment, nextNode);\n\t}\n\n\tif (lazyLink) {\n\t\tsetTimeout(dataLink, 0);\n\t} else {\n\t\tdataLink();\n\t}\n\n\treturn lazyLink && lazyLink.promise();\n}\n\nfunction addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, context) {\n\t// Add data binding for data-linked elements or {^{...}} data-linked tags\n\tvar tmpl, tokens, attr, convertBack, params, trimLen, tagExpr, linkFn, linkCtx, tag, rTagIndex, hasElse,\n\t\tlinkExpressions = [];\n\n\tif (boundTagId) {\n\t\t// boundTagId is a string for {^{...}} data-linked tag. So only one linkTag in linkMarkup\n\t\t// data and context parameters are undefined\n\t\ttag = bindingStore[boundTagId];\n\t\ttag = tag.linkCtx ? tag.linkCtx.tag : tag;\n\n\t\tlinkCtx = tag.linkCtx || {\n\t\t\tdata: currentView.data, // source\n\t\t\telem: tag._elCnt ? tag.parentElem : node, // target\n\t\t\tview: currentView,\n\t\t\tctx: currentView.ctx,\n\t\t\tattr: HTML, // Script marker nodes are associated with {^{ and always target HTML.\n\t\t\tfn: tag._.bnd,\n\t\t\ttag: tag,\n\t\t\t// Pass the boundTagId in the linkCtx, so that it can be picked up in observeAndBind\n\t\t\t_bndId: boundTagId\n\t\t};\n\t\tbindDataLinkTarget(linkCtx, linkCtx.fn);\n\t} else if (linkMarkup && node) {\n\t\t// If isLink then this is a top-level linking: .link(expression, target, data, ....) or\n\t\t// .link(true, target, data, ....) scenario - and data and context are passed in separately from the view\n\t\tdata = isLink ? data : currentView.data;\n\n\t\t// Compiled linkFn expressions could be stored in the tmpl.links array of the template\n\t\t// TODO - consider also caching globally so that if {{:foo}} or data-link=\"foo\" occurs in different places,\n\t\t// the compiled template for this is cached and only compiled once...\n\t\t//links = currentView.links || currentView.tmpl.links;\n\n\t\ttmpl = currentView.tmpl;\n\n//\t\t\tif (!(linkTags = links[linkMarkup])) {\n\t\t// This is the first time this view template has been linked, so we compile the data-link expressions, and store them on the template.\n\n\t\tlinkMarkup = normalizeLinkTag(linkMarkup, defaultAttr(node));\n\t\trTagDatalink.lastIndex = 0;\n\n\t\twhile (tokens = rTagDatalink.exec(linkMarkup)) { // TODO require } to be followed by whitespace or $, and remove the \\}(!\\}) option.\n\t\t\tlinkExpressions.push(tokens);\n\t\t}\n\t\twhile (tokens = linkExpressions.shift()) {\n\t\t\t// Iterate over the data-link expressions, for different target attrs,\n\t\t\t// e.g. ~description(firstName, lastName)}\"\n\t\t\t// tokens: [all, attr, bindOnly, tagExpr, tagName, converter, colon, html, comment, code, params]\n\t\t\trTagIndex = rTagDatalink.lastIndex;\n\t\t\tattr = tokens[1];\n\t\t\ttagExpr = tokens[3];\n\t\t\twhile (linkExpressions[0] && linkExpressions[0][4] === \"else\") { // If this is {someTag...} and is followed by an {else...} add to tagExpr\n\t\t\t\ttagExpr += \"}{\" + linkExpressions.shift()[3];\n\t\t\t\thasElse = true;\n\t\t\t}\n\t\t\tif (hasElse) { // If an {else} has been added, need also to add closing {{/someTag}}\n\t\t\t\ttagExpr += \"}{{/\" + tokens[4] + \"}\";\n\t\t\t}\n\t\t\tparams = tokens[9];\n\t\t\tif (convertBack = tokens[10]) {\n\t\t\t\tconvertBack = convertBack.slice(1);\n\t\t\t}\n\n\t\t\tlinkCtx = {\n\t\t\t\tdata: data, // source\n\t\t\t\telem: node, // target\n\t\t\t\tview: currentView,\n\t\t\t\tctx: context,\n\t\t\t\tattr: attr,\n\t\t\t\tisLk: isLink, // top-level linking?\n\t\t\t\t_toLk : 1, // Flag to data-link on initial data-link call rendering call\n\t\t\t\t_noUpd : tokens[2] // Flag for data-link=\"^{...}\" so on initial data-link call will bind, but not render)\n\t\t\t};\n\n\t\t\tif (tokens[6]) {\n\t\t\t\tlinkCtx.convert = tokens[5] || \"\";\n\t\t\t\tif (!attr && convertBack !== undefined) {\n\t\t\t\t\t// Default target, so allow 2 way binding\n\t\t\t\t\tlinkCtx.convertBack = convertBack;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Compile the linkFn expression which evaluates and binds a data-link expression\n\t\t\t// TODO - optimize for the case of simple data path with no conversion, helpers, etc.:\n\t\t\t// i.e. data-link=\"a.b.c\". Avoid creating new instances of Function every time. Can use a default function for all of these...\n\n\t\t\tlinkCtx.expr = attr + tagExpr;\n\t\t\tlinkFn = tmpl.links[tagExpr];\n\t\t\tif (!linkFn) {\n\t\t\t\ttmpl.links[tagExpr] = linkFn = $sub.tmplFn(tagExpr, tmpl, true, convertBack, hasElse);\n\t\t\t}\n\t\t\tlinkCtx.fn = linkFn;\n\t\t\tbindDataLinkTarget(linkCtx, linkFn);\n\t\t\t// We store rTagIndex in local scope, since this addDataBinding method can sometimes be called recursively,\n\t\t\t// and each is using the same rTagDatalink instance.\n\t\t\trTagDatalink.lastIndex = rTagIndex;\n\t\t}\n//\t\t}\n\t}\n}\n\nfunction bindDataLinkTarget(linkCtx, linkFn) {\n\t// Add data link bindings for a link expression in data-link attribute markup\n\tfunction handler(ev, eventArgs) {\n\t\tpropertyChangeHandler.call(linkCtx, ev, eventArgs, linkFn);\n\t\t// If the link expression uses a custom tag, the propertyChangeHandler call will call renderTag, which will set tagCtx on linkCtx\n\t}\n\thandler.noArray = true;\n\tif (linkCtx.isLk) {\n\t\t// Top-level linking: .link(expressionOrTrue, data, context) - so we need to create a view for the linking, with the data and ctx\n\t\t// which may be different than the current context of the target. Note that this view is not a standard data-linked view, so it will\n\t\t// be disposed only when its parent view is disposed.\n\t\taddLinkMethods(linkCtx.view = new $sub.View(\n\t\t\t$sub.extendCtx(linkCtx.ctx, linkCtx.view.ctx),\n\t\t\t\"link\", linkCtx.view, linkCtx.data, linkCtx.expr, undefined, addBindingMarkers));\n\t}\n\tlinkCtx._ctxCb = getContextCb(linkCtx.view); // _ctxCb is for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]}\n\tlinkCtx._hdl = handler;\n\thandler(true);\n}\n\n//=====================\n// Data-linking helpers\n//=====================\n\nfunction removeSubStr(str, substr) {\n\tvar k;\n\treturn str\n\t\t? (k = str.indexOf(substr),\n\t\t\t(k + 1\n\t\t\t\t? str.slice(0, k) + str.slice(k + substr.length)\n\t\t\t\t: str))\n\t\t: \"\";\n}\n\nfunction markerNodeInfo(node) {\n\treturn node &&\n\t\t(\"\" + node === node\n\t\t\t? node\n\t\t\t: node.tagName === SCRIPT\n\t\t\t\t? node.type.slice(3)\n\t\t\t\t: node.nodeType === 1 && node.getAttribute(jsvAttrStr) || \"\");\n}\n\nfunction viewInfos(node, isVal, rBinding) {\n\t// Test whether node is a script marker node, and if so, return metadata\n\tfunction getInfos(all, open, close, id, ch, elPath) {\n\t\tinfos.push({\n\t\t\telCnt: elCnt,\n\t\t\tid: id,\n\t\t\tch: ch,\n\t\t\topen: open,\n\t\t\tclose: close,\n\t\t\tpath: elPath,\n\t\t\ttoken: all\n\t\t});\n\t}\n\tvar elCnt, tokens,\n\t\tinfos = [];\n\tif (tokens = isVal ? node : markerNodeInfo(node)) {\n\t\telCnt = infos.elCnt = node.tagName !== SCRIPT;\n\t\telCnt = tokens.charAt(0) === \"@\" || elCnt;\n\t\tinfos._tkns = tokens;\n\t\t// rMarkerTokens = /(?:(#)|(\\/))(\\d+)([_^])([-+@\\d]+)?/g;\n\t\ttokens.replace(rBinding || rMarkerTokens, getInfos);\n\t\treturn infos;\n\t}\n}\n\nfunction unmarkPrevOrNextNode(node, elCnt) {\n\tif (node) {\n\t\tif (node.type === \"jsv\") {\n\t\t\tnode.parentNode.removeChild(node);\n\t\t} else if (elCnt && node.getAttribute($viewsLinkAttr) === \"\") {\n\t\t\tnode.removeAttribute($viewsLinkAttr);\n\t\t}\n\t}\n}\n\nfunction markPrevOrNextNode(node, elCnt) {\n\tvar marker = node;\n\twhile (elCnt && marker && marker.nodeType !== 1) {\n\t\tmarker = marker.previousSibling;\n\t}\n\tif (marker) {\n\t\tif (marker.nodeType !== 1) {\n\t\t\t// For text nodes, we will add a script node before\n\t\t\tmarker = document.createElement(SCRIPT);\n\t\t\tmarker.type = \"jsv\";\n\t\t\tnode.parentNode.insertBefore(marker, node);\n\t\t} else if (!markerNodeInfo(marker) && !marker.getAttribute($viewsLinkAttr)) {\n\t\t\t// For element nodes, we will add a data-link attribute (unless there is already one)\n\t\t\t// so that this node gets included in the node linking process.\n\t\t\tmarker.setAttribute($viewsLinkAttr, \"\");\n\t\t}\n\t}\n\treturn marker;\n}\n\nfunction normalizeLinkTag(linkMarkup, twoway) {\n\tlinkMarkup = $.trim(linkMarkup).replace(rEscapeQuotes, \"\\\\$&\");\n\treturn linkMarkup.slice(-1) !== delimCloseChar0\n\t// If simplified syntax is used: data-link=\"expression\", convert to data-link=\"{:expression}\",\n\t// or for inputs, data-link=\"{:expression:}\" for (default) two-way binding\n\t\t? linkMarkup = delimOpenChar1 + \":\" + linkMarkup + (twoway ? \":\" : \"\") + delimCloseChar0\n\t\t: linkMarkup;\n}\n\n//===========================\n// Methods for views and tags\n//===========================\n\nfunction callAfterLink(tag, eventArgs) {\n\tvar $linkedElem, linkedElem, radioButtons, val, l, linkedTag, oldTrig, newTrig,\n\t\ttagCtx = tag.tagCtx,\n\t\tview = tagCtx.view,\n\t\tprops = tagCtx.props,\n\t\tlinkCtx = tag.linkCtx = tag.linkCtx || {\n\t\t\ttag: tag,\n\t\t\tdata: view.data,\n\t\t\tview: view,\n\t\t\tctx: view.ctx\n\t\t};\n\n\tif (tag.onAfterLink) {\n\t\ttag.onAfterLink(tagCtx, linkCtx, eventArgs);\n\t}\n\ttag._.unlinked = undefined;\n\t$linkedElem = tag.targetTag ? tag.targetTag.linkedElem : tag.linkedElem;\n\tif (!tag.noVal && (linkedElem = $linkedElem && $linkedElem[0])) {\n\t\tif (radioButtons = tag._.radio) {\n\t\t\t$linkedElem = $linkedElem.find(RADIOINPUT);\n\t\t}\n\t\tif (radioButtons || !tag._.chging) {\n\t\t\tval = tag.cvtArgs()[0];\n\n\t\t\tif (radioButtons || linkedElem !== linkCtx.elem) {\n\t\t\t\tl = $linkedElem.length;\n\t\t\t\twhile (l--) {\n\t\t\t\t\tlinkedElem = $linkedElem[l];\n\t\t\t\t\tlinkedTag = linkedElem._jsvLkEl;\n\t\t\t\t\tif (tag._.inline && (!linkedTag || linkedTag !== tag && linkedTag.targetTag !== tag)) {\n\t\t\t\t\t\t// For data-linked tags, identify the linkedElem with the tag, for \"to\" binding\n\t\t\t\t\t\t// (For data-linked elements, if not yet bound, we identify later when the linkCtx.elem is bound)\n\t\t\t\t\t\tlinkedElem._jsvLkEl = tag;\n\t\t\t\t\t\tbindTo(bindingStore[tag._tgId], tag.convertBack);\n\t\t\t\t\t\tlinkedElem._jsvBnd = \"&\" + tag._tgId + \"+\"; // Add a \"+\" for cloned binding - so removing\n\t\t\t\t\t\t// elems with cloned bindings will not remove the 'parent' binding from the bindingStore.\n\t\t\t\t\t}\n\t\t\t\t\tif (radioButtons) {\n\t\t\t\t\t\t// For radio button, set to if val === value. For others set val() to val, below\n\t\t\t\t\t\tlinkedElem[CHECKED] = val === linkedElem.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlinkCtx._val = val;\n\t\t\t}\n\t\t\tif (val !== undefined) {\n\t\t\t\tif (!radioButtons && linkedElem.value !== undefined) {\n\t\t\t\t\tif (linkedElem.type === CHECKBOX) {\n\t\t\t\t\t\tlinkedElem[CHECKED] = val && val !== \"false\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$linkedElem.val(val);\n\t\t\t\t\t}\n\t\t\t\t} else if (linkedElem.contentEditable === TRUE) {\n\t\t\t\t\tlinkedElem.innerHTML = val;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (tag.setSize) {\n\t\t\tif (props.height) {\n\t\t\t\t$linkedElem.height(props.height);\n\t\t\t}\n\t\t\tif (props.width) {\n\t\t\t\t$linkedElem.width(props.width);\n\t\t\t}\n\t\t}\n\t\tif (props[\"class\"]) {\n\t\t\t$linkedElem.addClass(props[\"class\"]);\n\t\t}\n\t\tif (props.id) {\n\t\t\t$linkedElem[0].id = props.id;\n\t\t}\n\t\tif (props.name) {\n\t\t\t$linkedElem.attr(\"name\", props.name);\n\t\t}\n\t}\n\tif (linkedElem = linkedElem || tag.tagName === \":\" && linkCtx.elem) {\n\t\toldTrig = linkedElem._jsvTr;\n\t\tnewTrig = props.trigger;\n\t\tif (oldTrig !== newTrig) {\n\t\t\tlinkedElem._jsvTr = newTrig;\n\t\t\t$linkedElem = $linkedElem || $(linkedElem);\n\t\t\tbindElChange($linkedElem, oldTrig, \"off\");\n\t\t\tbindElChange($linkedElem, newTrig, \"on\");\n\t\t}\n\t}\n}\n\nfunction asyncElemChangeHandler(ev) {\n\tsetTimeout(function() {\n\t\telemChangeHandler(ev);\n\t}, 0);\n}\n\nfunction bindElChange($elem, trig, onoff) {\n\tif (trig) {\n\t\t$elem[onoff](trig === true ? \"keydown\" : trig, trig === true ? asyncElemChangeHandler : elemChangeHandler);\n\t}\n}\n\nfunction bindTo(binding, cvtBk) {\n\t// Two-way binding.\n\t// We set the binding.to[1] to be the cvtBack, and binding.to[0] to be either the path to the target, or [object, path] where the target is the path on the provided object.\n\t// So for a computed path with an object call: a.b.getObject().d.e, then we set to[0] to be [exprOb, \"d.e\"], and we bind to the path on the returned object, exprOb.ob, as target\n\t// Otherwise our target is the first path, paths[0], which we will convert with contextCb() for paths like ~a.b.c or #x.y.z\n\n\tvar bindto, pathIndex, path, lastPath, bindtoOb,\n\t\tlinkCtx = binding.linkCtx,\n\t\tsource = linkCtx.data,\n\t\tpaths = linkCtx.fn.paths;\n\tif (binding && paths) {\n\t\tpaths = (bindto = paths._jsvto) || paths[0];\n\t\tpathIndex = paths && paths.length;\n\t\tif (pathIndex && (!linkCtx.tag || linkCtx.tag.tagCtx.args.length)) {\n\t\t\tlastPath = paths[pathIndex - 1];\n\t\t\tif (lastPath._jsv) {\n\t\t\t\tbindtoOb = lastPath;\n\t\t\t\twhile (lastPath.sb && lastPath.sb._jsv) {\n\t\t\t\t\tpath = lastPath = lastPath.sb;\n\t\t\t\t}\n\t\t\t\tpath = lastPath.sb || path && path.path;\n\t\t\t\tlastPath = path ? path.slice(1) : bindtoOb.path;\n\t\t\t}\n\t\t\tbinding.to = path\n\t\t\t\t? [ // \"...someexpr().lastpath...\" - so need to get the bindtoOb 'exprOb' object for this view-binding\n\t\t\t\t\t[\n\t\t\t\t\t\tbindtoOb, // 'exprOb' for this expression and view-binding. So bindtoOb.ob is current object returned by expression.\n\t\t\t\t\t\tlastPath\n\t\t\t\t\t],\n\t\t\t\t\tcvtBk\n\t\t\t\t]\n\t\t\t\t: [\n\t\t\t\t\tlinkCtx._ctxCb(path = lastPath.split(\"^\").join(\".\")) || [source, path],\n\t\t\t\t\tcvtBk\n\t\t\t\t];\n\t\t} else {\n\t\t\tbinding.to = [[], cvtBk];\n\t\t}\n\t}\n}\n\nfunction mergeCtxs(tag, newCtxs, replace) { // Merge updated tagCtxs into tag.tagCtxs\n\tvar tagCtx, newTagCtx,\n\t\tview = tag.tagCtx.view,\n\t\ttagCtxs = tag.tagCtxs || [tag.tagCtx],\n\t\tl = tagCtxs.length,\n\t\trefresh = !newCtxs;\n\n\tnewCtxs = newCtxs || tag._.bnd.call(view.tmpl, (tag.linkCtx || view).data, view, $views);\n\n\tif (replace) {\n\t\t// Replace previous tagCtxs by new ones, rather than merging\n\t\ttagCtxs = tag.tagCtxs = newCtxs;\n\t\ttag.tagCtx = tagCtxs[0];\n\t} else {\n\t\twhile (l--) {\n\t\t\ttagCtx = tagCtxs[l];\n\t\t\tnewTagCtx = newCtxs[l];\n\t\t\t$observable(tagCtx.props).setProperty(newTagCtx.props);\n\t\t\t$extend(tagCtx.ctx, newTagCtx.ctx); // We don't support propagating ctx variables, ~foo, observably, to nested views. So extend, not setProperty...\n\t\t\ttagCtx.args = newTagCtx.args;\n\t\t\tif (refresh) {\n\t\t\t\ttagCtx.tmpl = newTagCtx.tmpl;\n\t\t\t}\n\t\t}\n\t}\n\t$sub._ths(tag, tagCtxs[0]); // tagHandlersFromProps\n\treturn tagCtxs;\n}\n\n//=========\n// Disposal\n//=========\n\nfunction clean(elems) {\n\t// Remove data-link bindings, or contained views\n\tvar l, elem, bindings,\n\t\telemArray = [],\n\t\tlen = elems.length,\n\t\ti = len;\n\twhile (i--) {\n\t\t// Copy into an array, so that deletion of nodes from DOM will not cause our 'i' counter to get shifted\n\t\t// (Note: This seems as fast or faster than elemArray = [].slice.call(elems); ...)\n\t\telemArray.push(elems[i]);\n\t}\n\ti = len;\n\twhile (i--) {\n\t\telem = elemArray[i];\n\t\tif (elem.parentNode) {\n\t\t\t// Has not already been removed from the DOM\n\t\t\tif (bindings = elem._jsvBnd) {\n\t\t\t\t// Get propertyChange bindings for this element\n\t\t\t\t// This may be an element with data-link, or the opening script marker node for a data-linked tag {^{...}}\n\t\t\t\t// bindings is a string with the syntax: \"(&bindingId)*\"\n\t\t\t\tbindings = bindings.slice(1).split(\"&\");\n\t\t\t\telem._jsvBnd = \"\";\n\t\t\t\tl = bindings.length;\n\t\t\t\twhile (l--) {\n\t\t\t\t\t// Remove associated bindings\n\t\t\t\t\tremoveViewBinding(bindings[l], elem._jsvLkEl, elem); // unbind bindings with this bindingId on this view\n\t\t\t\t}\n\t\t\t}\n\t\t\tdisposeTokens(markerNodeInfo(elem) + (elem._df || \"\"));\n\t\t}\n\t}\n}\n\nfunction removeViewBinding(bindId, linkedElemTag, elem) {\n\t// Unbind\n\tvar objId, linkCtx, tag, object, obsId, tagCtxs, l, map, $linkedElem, linkedElem, trigger, view,\n\t\tbinding = bindingStore[bindId];\n\n\tif (linkedElemTag) {\n\t\tif (elem === linkedElemTag.linkedElem[0]) {\n\t\t\telem._jsvLkEl = undefined;\n\t\t\tlinkedElemTag.linkedElem = undefined;\n\t\t}\n\t} else if (binding) {\n\t\tdelete bindingStore[bindId]; // Delete already, so call to onDispose handler below cannot trigger recursive deletion (through recursive call to jQuery cleanData)\n\t\tfor (objId in binding.bnd) {\n\t\t\tobject = binding.bnd[objId];\n\t\t\tobsId = binding.cbId;\n\t\t\tif ($.isArray(object)) {\n\t\t\t\t$([object]).off(arrayChangeStr + obsId).off(propertyChangeStr + obsId); // There may be either or both of arrayChange and propertyChange\n\t\t\t} else {\n\t\t\t\t$(object).off(propertyChangeStr + obsId);\n\t\t\t}\n\t\t\tdelete binding.bnd[objId];\n\t\t}\n\n\t\tif (linkCtx = binding.linkCtx) {\n\t\t\tif (tag = linkCtx.tag) {\n\t\t\t\tif (tagCtxs = tag.tagCtxs) {\n\t\t\t\t\tl = tagCtxs.length;\n\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\tif (map = tagCtxs[l].map) {\n\t\t\t\t\t\t\tmap.unmap(); //unobserve\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$linkedElem = tag.linkedElem;\n\t\t\t\tlinkedElem = $linkedElem && $linkedElem[0] || linkCtx.elem;\n\n\t\t\t\tif (trigger = linkedElem && linkedElem._jsvTr) {\n\t\t\t\t\tbindElChange($linkedElem || $(linkedElem), trigger, \"off\");\n\t\t\t\t\tlinkedElem._jsvTr = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (tag.onDispose) {\n\t\t\t\t\ttag.onDispose();\n\t\t\t\t}\n\n\t\t\t\tif (!tag._elCnt) {\n\t\t\t\t\tif (tag._prv) {\n\t\t\t\t\t\ttag._prv.parentNode.removeChild(tag._prv);\n\t\t\t\t\t}\n\t\t\t\t\tif (tag._nxt) {\n\t\t\t\t\t\ttag._nxt.parentNode.removeChild(tag._nxt);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tview = linkCtx.view;\n\t\t\tif (view.type === \"link\") {\n\t\t\t\tview.parent.removeViews(view._.key, undefined, true); // A \"link\" view is associated with the binding, so should be disposed with binding.\n\t\t\t} else {\n\t\t\t\tdelete view._.bnds[bindId];\n\t\t\t}\n\t\t}\n\t\t$sub._cbBnds[binding.cbId] = undefined;\n\t}\n}\n\nfunction $unlink(to) {\n\tif (to) {\n\t\tto = to.jquery ? to : $(to);\n\t\tto.each(function() {\n\t\t\tvar innerView;\n\t\t\t//TODO fix this for better perf. Rather that calling inner view multiple times which does querySelectorAll each time, consider a single querySelectorAll\n\t\t\t// or simply call view.removeViews() on the top-level views under the target 'to' node, then clean(...)\n\t\t\twhile ((innerView = $view(this, true)) && innerView.parent) {\n\t\t\t\tinnerView.parent.removeViews(innerView._.key, undefined, true);\n\t\t\t}\n\t\t\tclean(this.getElementsByTagName(\"*\"));\n\t\t});\n\t\tclean(to);\n\t} else {\n\t\t// Call to $.unlink() is equivalent to $.unlink(true, \"body\")\n\t\tif (activeBody) {\n\t\t\t$(activeBody)\n\t\t\t\t.off(elementChangeStr, elemChangeHandler)\n\t\t\t\t.off('blur', '[contenteditable]', elemChangeHandler);\n\t\t\tactiveBody = undefined;\n\t\t}\n\t\ttopView.removeViews();\n\t\tclean(document.body.getElementsByTagName(\"*\"));\n\t}\n}\n\n//========\n// Helpers\n//========\n\nfunction getContextCb(view) {\n\t// TODO Consider exposing or allowing override, as public API\n\treturn function(path, object) {\n\t\t// TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on\n\t\t// the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times\n\t\tvar tokens, tag,\n\t\t\titems = [object];\n\t\tif (view && path) {\n\t\t\tif (path._jsv) {\n\t\t\t\treturn path._jsv.call(view.tmpl, object, view, $views);\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"~\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"~a.b.c\" string:\n\t\t\t\t// [helperObject 'a', \"a.b.c\" currentDataItem] so currentDataItem becomes the object for subsequent paths.\n\t\t\t\tif (path.slice(0, 4) === \"~tag\") {\n\t\t\t\t\ttag = view.ctx;\n\t\t\t\t\tif (path.charAt(4) === \".\") {\n\t\t\t\t\t\t// \"~tag.xxx\"\n\t\t\t\t\t\ttokens = path.slice(5).split(\".\");\n\t\t\t\t\t\ttag = tag.tag;\n\t\t\t\t\t}\n\t\t\t\t\tif (tokens) {\n\t\t\t\t\t\treturn tag ? [tag, tokens.join(\".\"), object] : [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpath = path.slice(1).split(\".\");\n\t\t\t\tif (object = view.hlp(path.shift())) {\n\t\t\t\t\tif (path.length) {\n\t\t\t\t\t\titems.unshift(path.join(\".\"));\n\t\t\t\t\t}\n\t\t\t\t\titems.unshift(object);\n\t\t\t\t}\n\t\t\t\treturn object ? items : [];\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"#\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"#a.b.c\" string: [view, \"a.b.c\" currentDataItem]\n\t\t\t\t// so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes.\n\t\t\t\treturn path === \"#data\" ? [] : [view, path.replace(rViewPath, \"\"), object];\n\t\t\t}\n\t\t}\n\t};\n}\n\nfunction inputAttrib(elem) {\n\treturn elem.type === CHECKBOX ? elem[CHECKED] : elem.value;\n}\n\n//========================== Initialize ==========================\n\n//=====================\n// JsRender integration\n//=====================\n\n$sub.onStore.template = function(name, item) {\n\titem.link = tmplLink;\n\tif (name) {\n\t\t$.link[name] = function() {\n\t\t\treturn tmplLink.apply(item, arguments);\n\t\t};\n\t}\n};\n\n$sub.viewInfos = viewInfos; // Expose viewInfos() as public helper method\n\n// Initialize default delimiters\n($viewsSettings.delimiters = function() {\n\tvar delimChars = oldJsvDelimiters.apply(0, arguments);\n\tdelimOpenChar0 = delimChars[0];\n\tdelimOpenChar1 = delimChars[1];\n\tdelimCloseChar0 = delimChars[2];\n\tdelimCloseChar1 = delimChars[3];\n\tlinkChar = delimChars[4];\n\trTagDatalink = new RegExp(\"(?:^|\\\\s*)([\\\\w-]*)(\\\\\" + linkChar + \")?(\\\\\" + delimOpenChar1 + $sub.rTag + \"\\\\\" + delimCloseChar0 + \")\", \"g\");\n\n\t// Default rTag: attr bind tagExpr tag converter colon html comment code params\n\t// (?:^|\\s*)([\\w-]*)(\\^)?({(?:(?:(\\w+(?=[\\/\\s}]))|(?:(\\w+)?(:)|(>)|!--((?:[^-]|-(?!-))*)--|(\\*)))\\s*((?:[^}]|}(?!}))*?))})\n\treturn this;\n})(); // jshint ignore:line\n\n//====================================\n// Additional members for linked views\n//====================================\n\nfunction transferViewTokens(prevNode, nextNode, parentElem, id, viewOrTagChar, refresh) {\n\t// Transfer tokens on prevNode of viewToRemove/viewToRefresh to nextNode or parentElem._df\n\tvar i, l, vwInfos, vwInfo, viewOrTag, viewId, tokens,\n\t\tprecedingLength = 0,\n\t\temptyView = prevNode === nextNode;\n\n\tif (prevNode) {\n\t\t// prevNode is either the first node in the viewOrTag, or has been replaced by the vwInfos tokens string\n\t\tvwInfos = viewInfos(prevNode) || [];\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\t// Step through views or tags on the prevNode\n\t\t\tvwInfo = vwInfos[i];\n\t\t\tviewId = vwInfo.id;\n\t\t\tif (viewId === id && vwInfo.ch === viewOrTagChar) {\n\t\t\t\tif (refresh) {\n\t\t\t\t\t// This is viewOrTagToRefresh, this is the last viewOrTag to process...\n\t\t\t\t\tl = 0;\n\t\t\t\t} else {\n\t\t\t\t\t// This is viewOrTagToRemove, so we are done...\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!emptyView) {\n\t\t\t\tviewOrTag = vwInfo.ch === \"_\"\n\t\t\t\t\t? viewStore[viewId]\n\t\t\t\t\t: bindingStore[viewId].linkCtx.tag;\n\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t// A \"#m\" token\n\t\t\t\t\tviewOrTag._prv = nextNode;\n\t\t\t\t} else if (vwInfo.close) {\n\t\t\t\t\t// A \"/m\" token\n\t\t\t\t\tviewOrTag._nxt = nextNode;\n\t\t\t\t}\n\t\t\t}\n\t\t\tprecedingLength += viewId.length + 2;\n\t\t}\n\n\t\tif (precedingLength) {\n\t\t\tprevNode.setAttribute(jsvAttrStr, prevNode.getAttribute(jsvAttrStr).slice(precedingLength));\n\t\t}\n\t\ttokens = nextNode ? nextNode.getAttribute(jsvAttrStr) : parentElem._df;\n\t\tif (l = tokens.indexOf(\"/\" + id + viewOrTagChar) + 1) {\n\t\t\ttokens = vwInfos._tkns.slice(0, precedingLength) + tokens.slice(l + (refresh ? -1 : id.length + 1));\n\t\t}\n\t\tif (tokens) {\n\t\t\tif (nextNode) {\n\t\t\t\t// If viewOrTagToRemove was an empty viewOrTag, we will remove both #n and /n\n\t\t\t\t// (and any intervening tokens) from the nextNode (=== prevNode)\n\t\t\t\t// If viewOrTagToRemove was not empty, we will take tokens preceding #n from prevNode,\n\t\t\t\t// and concatenate with tokens following /n on nextNode\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, tokens);\n\t\t\t} else {\n\t\t\t\tsetDefer(parentElem, tokens);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// !prevNode, so there may be a deferred nodes token on the parentElem. Remove it.\n\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + viewOrTagChar));\n\t\tif (!refresh && !nextNode) {\n\t\t\t// If this viewOrTag is being removed, and there was no .nxt, remove closing token from deferred tokens\n\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + viewOrTagChar));\n\t\t}\n\t}\n}\n\nfunction disposeTokens(tokens) {\n\tvar i, l, vwItem, vwInfos;\n\tif (vwInfos = viewInfos(tokens, true, rOpenMarkers)) {\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\tvwItem = vwInfos[i];\n\t\t\tif (vwItem.ch === \"_\") {\n\t\t\t\tif ((vwItem = viewStore[vwItem.id]) && vwItem.type) {\n\t\t\t\t\t// If this is the _prv (prevNode) for a view, remove the view\n\t\t\t\t\t// - unless view.type is undefined, in which case it is already being removed\n\t\t\t\t\tvwItem.parent.removeViews(vwItem._.key, undefined, true);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tremoveViewBinding(vwItem.id); // unbind bindings with this bindingId on this view\n\t\t\t}\n\t\t}\n\t}\n}\n\n//====================================\n// Add link methods to data-linked view or tag\n//====================================\nfunction addLinkMethods(tagOrView, isTag) {\n\n\ttagOrView.contents = function(deep, select) {\n\t\t// For a view or a tag, return jQuery object with the content nodes,\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is getContents(selector)\n\t\t\tselect = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\t\tvar filtered,\n\t\t\tnodes = $(this.nodes());\n\t\tif (nodes[0]) {\n\t\t\tfiltered = select ? nodes.filter(select) : nodes;\n\t\t\tnodes = deep && select ? filtered.add(nodes.find(select)) : filtered;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.nodes = function(withMarkers, prevNode, nextNode) {\n\t\t// For a view or a tag, return top-level nodes\n\t\t// Do not return any script marker nodes, unless withMarkers is true\n\t\t// Optionally limit range, by passing in prevNode or nextNode parameters\n\n\t\tvar node,\n\t\t\tself = this,\n\t\t\telCnt = self._elCnt,\n\t\t\tprevIsFirstNode = !prevNode && elCnt,\n\t\t\tnodes = [];\n\n\t\tprevNode = prevNode || self._prv;\n\t\tnextNode = nextNode || self._nxt;\n\n\t\tnode = prevIsFirstNode\n\t\t\t? (prevNode === self._nxt\n\t\t\t\t? self.parentElem.lastSibling\n\t\t\t\t: prevNode)\n\t\t\t: (self._.inline === false\n\t\t\t\t? prevNode || self.linkCtx.elem.firstChild\n\t\t\t\t: prevNode && prevNode.nextSibling);\n\n\t\twhile (node && (!nextNode || node !== nextNode)) {\n\t\t\tif (withMarkers || elCnt || node.tagName !== SCRIPT) {\n\t\t\t\t// All the top-level nodes in the view\n\t\t\t\t// (except script marker nodes, unless withMarkers = true)\n\t\t\t\t// (Note: If a script marker node, viewInfo.elCnt undefined)\n\t\t\t\tnodes.push(node);\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.childTags = function(deep, tagName) {\n\t\t// For a view or a tag, return child tags - at any depth, or as immediate children only.\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is childTags(tagName) - which looks for top-level tags of given tagName\n\t\t\ttagName = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\n\t\tvar self = this,\n\t\t\tview = self.link ? self : self.tagCtx.view, // this may be a view or a tag. If a tag, get the view from tag.view.tagCtx\n\t\t\tprevNode = self._prv,\n\t\t\telCnt = self._elCnt,\n\t\t\ttags = [];\n\n\t\tview.link(\n\t\t\tundefined,\n\t\t\tself.parentElem,\n\t\t\telCnt ? prevNode && prevNode.previousSibling : prevNode,\n\t\t\tself._nxt,\n\t\t\tundefined,\n\t\t\t{get:{\n\t\t\t\ttags: tags,\n\t\t\t\tdeep: deep,\n\t\t\t\tname: tagName,\n\t\t\t\tid: self.link ? self._.id + \"_\" : self._tgId + \"^\"\n\t\t\t}}\n\t\t);\n\t\treturn tags;\n\t};\n\n\ttagOrView.refresh = function(sourceValue) {\n\t\tvar promise, attr,\n\t\t\ttag = this,\n\t\t\tlinkCtx = tag.linkCtx,\n\t\t\tview = tag.tagCtx.view;\n\n\t\tif (tag.disposed) { error(\"Removed tag\"); }\n\t\tif (sourceValue === undefined) {\n\t\t\tsourceValue = $views._tag(tag, view, view.tmpl, mergeCtxs(tag), true); // Get rendered HTML for tag, based on refreshed tagCtxs\n\t\t}\n\t\tif (sourceValue + \"\" === sourceValue) {\n\t\t\t// If no rendered content, sourceValue will not be a string (can be 0 or undefined)\n\t\t\tattr = tag._.inline ? HTML : (linkCtx.attr || defaultAttr(tag.parentElem, true));\n\t\t\tpromise = updateContent(sourceValue, linkCtx, attr, tag);\n\t\t}\n\n\t\tcallAfterLink(tag);\n\t\treturn promise || tag;\n\t};\n\n\ttagOrView.update = function(value) {\n\t\tvar linkedElem = this.linkedElem;\n\t\tif (linkedElem) {\n\t\t\telemChangeHandler({\n\t\t\t\ttarget: linkedElem[0]\n\t\t\t}, undefined, value);\n\t\t}\n\t};\n\n\tif (isTag) {\n\t\ttagOrView.domChange = function() { // domChange notification support\n\t\t\tvar elem = this.parentElem,\n\t\t\t\thasListener = $.hasData(elem) && $._data(elem).events,\n\t\t\t\tdomChangeNotification = \"jsv-domchange\";\n\n\t\t\tif (hasListener && hasListener[domChangeNotification]) {\n\t\t\t\t// Only trigger handler if there is a handler listening for this event. (Note using triggerHandler - so no event bubbling.)\n\t\t\t\t$(elem).triggerHandler(domChangeNotification, arguments);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t\t// Note: a linked view will also, after linking have nodes[], _prv (prevNode), _nxt (nextNode) ...\n\t\ttagOrView.addViews = function(index, dataItems, tmpl) {\n\t\t\t// if view is not an array view, do nothing\n\t\t\tvar i, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\titemsCount = dataItems.length,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (!self._.useKey && itemsCount && (tmpl = self.tmpl)) {\n\t\t\t\t// view is of type \"array\"\n\t\t\t\t// Use passed-in template if provided, since self added view may use a different template than the original one used to render the array.\n\t\t\t\tviewsCount = views.length + itemsCount;\n\n\t\t\t\tif (viewsCount === self.data.length // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\t\t&& renderAndLink(self, index, tmpl, views, dataItems, self.ctx) !== false) {\n\t\t\t\t\tfor (i = index + itemsCount; i < viewsCount; i++) {\n\t\t\t\t\t\t$observable(views[i]).setProperty(\"index\", i);\n\t\t\t\t\t\t// This is fixing up index, but not key, and not index on child views. From child views, use view.getIndex()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn self;\n\t\t};\n\n\t\ttagOrView.removeViews = function(index, itemsCount, keepNodes) {\n\t\t\t// view.removeViews() removes all the child views\n\t\t\t// view.removeViews(index) removes the child view with specified index or key\n\t\t\t// view.removeViews(index, count) removes the specified nummber of child views, starting with the specified index\n\t\t\tfunction removeView(index) {\n\t\t\t\tvar id, bindId, parentElem, prevNode, nextNode, nodesToRemove,\n\t\t\t\t\tviewToRemove = views[index];\n\n\t\t\t\tif (viewToRemove && viewToRemove.link) {\n\t\t\t\t\tid = viewToRemove._.id;\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tnodesToRemove = viewToRemove.nodes();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove child views, without removing nodes\n\t\t\t\t\tviewToRemove.removeViews(undefined, undefined, true);\n\n\t\t\t\t\tviewToRemove.type = undefined; // Set type to undefined: used as a flag that this view is being removed\n\t\t\t\t\tprevNode = viewToRemove._prv;\n\t\t\t\t\tnextNode = viewToRemove._nxt;\n\t\t\t\t\tparentElem = viewToRemove.parentElem;\n\t\t\t\t\t// If prevNode and nextNode are the same, the view is empty\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tif (viewToRemove._elCnt) {\n\t\t\t\t\t\t\t// if keepNodes is false (and transferring of tokens has not already been done at a higher level)\n\t\t\t\t\t\t\t// then transfer tokens from prevNode which is being removed, to nextNode.\n\t\t\t\t\t\t\ttransferViewTokens(prevNode, nextNode, parentElem, id, \"_\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(nodesToRemove).remove();\n\t\t\t\t\t}\n\t\t\t\t\tif (!viewToRemove._elCnt) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tprevNode.parentNode.removeChild(prevNode); // (prevNode.parentNode is parentElem, except if jQuery Mobile or similar has inserted an intermediate wrapper\n\t\t\t\t\t\t\tnextNode.parentNode.removeChild(nextNode);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\t\t\t\t\tsetArrayChangeLink(viewToRemove);\n\t\t\t\t\tfor (bindId in viewToRemove._.bnds) {\n\t\t\t\t\t\tremoveViewBinding(bindId);\n\t\t\t\t\t}\n\t\t\t\t\tdelete viewStore[id];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar current, view, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\tisArray = !self._.useKey,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (isArray) {\n\t\t\t\tviewsCount = views.length;\n\t\t\t}\n\t\t\tif (index === undefined) {\n\t\t\t\t// Remove all child views\n\t\t\t\tif (isArray) {\n\t\t\t\t\t// views and data are arrays\n\t\t\t\t\tcurrent = viewsCount;\n\t\t\t\t\twhile (current--) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = [];\n\t\t\t\t} else {\n\t\t\t\t\t// views and data are objects\n\t\t\t\t\tfor (view in views) {\n\t\t\t\t\t\t// Remove by key\n\t\t\t\t\t\tremoveView(view);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = {};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (itemsCount === undefined) {\n\t\t\t\t\tif (isArray) {\n\t\t\t\t\t\t// The parentView is data array view.\n\t\t\t\t\t\t// Set itemsCount to 1, to remove this item\n\t\t\t\t\t\titemsCount = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Remove child view with key 'index'\n\t\t\t\t\t\tremoveView(index);\n\t\t\t\t\t\tdelete views[index];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isArray && itemsCount\n\t\t\t\t\t&& viewsCount - itemsCount === self.data.length) { // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\tcurrent = index + itemsCount;\n\t\t\t\t\t// Remove indexed items (parentView is data array view);\n\t\t\t\t\twhile (current-- > index) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tviews.splice(index, itemsCount);\n\t\t\t\t\tif (viewsCount = views.length) {\n\t\t\t\t\t\t// Fixup index on following view items...\n\t\t\t\t\t\twhile (index < viewsCount) {\n\t\t\t\t\t\t\t$observable(views[index]).setProperty(\"index\", index++);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\ttagOrView.refresh = function(context) {\n\t\t\tvar self = this,\n\t\t\t\tparent = self.parent;\n\n\t\t\tif (parent) {\n\t\t\t\trenderAndLink(self, self.index, self.tmpl, parent.views, self.data, context, true);\n\t\t\t\tsetArrayChangeLink(self);\n\t\t\t}\n\t\t\treturn self;\n\t\t};\n\n\t\ttagOrView.link = viewLink;\n\t}\n}\n\n//========================\n// JsViews-specific converters\n//========================\n\n$converters.merge = function(val) {\n\t// Special converter used in data-linking to space-separated lists, such as className:\n\t// Currently only supports toggle semantics - and has no effect if toggle string is not specified\n\t// data-link=\"class{merge:boolExpr toggle=className}\"\n\tvar regularExpression,\n\t\tcurrentValue = this.linkCtx._val || \"\",\n\t\ttoggle = this.tagCtx.props.toggle;\n\n\tif (toggle) {\n\t\t// We are toggling the class specified by the toggle property,\n\t\t// and the boolean val binding is driving the insert/remove toggle\n\n\t\tregularExpression = toggle.replace(/[\\\\^$.|?*+()[{]/g, \"\\\\$&\");\n\t\t// Escape any regular expression special characters (metacharacters) within the toggle string\n\t\tregularExpression = \"(\\\\s(?=\" + regularExpression + \"$)|(\\\\s)|^)(\" + regularExpression + \"(\\\\s|$))\";\n\t\t// Example: /(\\s(?=myclass$)|(\\s)|^)?(myclass(\\s|$))/ - so matches (\" myclass\" or \" \" or ^ ) followed by (\"myclass \" or \"myclass$\") where ^/$ are beginning/end of string\n\t\tcurrentValue = currentValue.replace(new RegExp(regularExpression), \"$2\");\n\t\tval = currentValue + (val ? (currentValue && \" \") + toggle : \"\");\n\t}\n\treturn val;\n};\n\n//========================\n// JsViews-specific tags\n//========================\n\n$tags(\"on\", {\n\tattr: NONE,\n\tinit: function(tagCtx) {\n\t\tvar tag = this,\n\t\t\tprops = tagCtx.props,\n\t\t\tcontent = tagCtx.content,\n\t\t\telemType = props.elem;\n\n\t\tif (tag._.inline) {\n\t\t\ttag.attr = HTML;\n\t\t\telemType = (elemType || \"span\") + \">\";\n\t\t\ttag.template = \"<\" + elemType + (props.label || content.markup || tagCtx.params.args[0]) + \" 1) {\n\t\t\t// Perf optimization for common cases\n\n\t\t\tnode = \"\" + node === node\n\t\t\t\t? $(node)[0]\n\t\t\t\t: node.jquery\n\t\t\t\t\t? node[0]\n\t\t\t\t\t: node;\n\n\t\t\tif (node) {\n\t\t\t\tif (inner) {\n\t\t\t\t\tgetInnerView(node._df, true);\n\t\t\t\t\tif (!view) {\n\t\t\t\t\t\t// Treat supplied node as a container element and return the first view encountered.\n\t\t\t\t\t\telems = qsa ? node.querySelectorAll(bindElsSel) : $(bindElsSel, node).get();\n\t\t\t\t\t\tl = elems.length;\n\t\t\t\t\t\tfor (i = 0; !view && i < l; i++) {\n\t\t\t\t\t\t\tgetInnerView(elems[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn view;\n\t\t\t\t}\n\t\t\t\twhile (node) {\n\t\t\t\t\t// Move back through siblings and up through parents to find preceding node which is a _prv (prevNode)\n\t\t\t\t\t// script marker node for a non-element-content view, or a _prv (first node) for an elCnt view\n\t\t\t\t\tif (vwInfos = viewInfos(node, undefined, rViewMarkers)) {\n\t\t\t\t\t\tl = vwInfos.length;\n\t\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\t\tview = vwInfos[l];\n\t\t\t\t\t\t\tif (view.open) {\n\t\t\t\t\t\t\t\tif (level < 1) {\n\t\t\t\t\t\t\t\t\tview = viewStore[view.id];\n\t\t\t\t\t\t\t\t\treturn view && type ? view.get(type) : view || topView;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlevel--;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// level starts at zero. If we hit a view.close, then we move level to 1, and we don't return a view until\n\t\t\t\t\t\t\t\t// we are back at level zero (or a parent view with level < 0)\n\t\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.previousSibling || node.parentNode;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn topView;\n\t},\n\n\tlink: $views.link = $link,\n\tunlink: $views.unlink = $unlink,\n\n\t//=====================\n\t// override $.cleanData\n\t//=====================\n\tcleanData: function(elems) {\n\t\tif (elems.length && isCleanCall) {\n\t\t\t// Remove JsViews bindings. Also, remove from the DOM any corresponding script marker nodes\n\t\t\tclean(elems);\n\t\t}\n\t\toldCleanData.apply($, arguments);\n\t}\n});\n\n// Possible future addition - e.g. for ckeditor tag control\n//$views.utility = {\n//\tvalidate: function(html) {\n//\t\ttry {\n//\t\t\ttopView.link(undefined, document.createElement(\"div\"), undefined, undefined, html, undefined, undefined, 1);\n//\t\t}\n//\t\tcatch (e) {\n//\t\t\treturn e.message;\n//\t\t}\n//\t}\n//};\n\n//===============================\n// Extend jQuery instance plugins\n//===============================\n\n$extend($.fn, {\n\tlink: function(expr, from, context, noIteration, parentView, prevNode, nextNode) {\n\t\treturn $link(expr, this, from, context, noIteration, parentView, prevNode, nextNode);\n\t},\n\tunlink: function() {\n\t\treturn $unlink(this);\n\t},\n\tview: function(inner, type) {\n\t\treturn $view(this[0], inner, type);\n\t}\n});\n\n//==============================================================================\n// Override jQuery methods that call our overridden cleanData, for disposal etc.\n//==============================================================================\n\n$.each([HTML, \"replaceWith\", \"empty\", \"remove\"], function(i, name) {\n\tvar oldFn = $.fn[name];\n\t$.fn[name] = function() {\n\t\tvar result;\n\t\tisCleanCall = 1; // Make sure cleanData does disposal only when coming from these calls.\n\t\ttry {\n\t\t\tresult = oldFn.apply(this, arguments);\n\t\t}\n\t\tfinally {\n\t\t\tisCleanCall = 0;\n\t\t}\n\t\treturn result;\n\t};\n});\n\n//===============\n// Extend topView\n//===============\n\naddLinkMethods($extend(topView = $sub.topView, {tmpl: {links: {}}}));\n\nviewStore = { 0: topView }; // Top-level view\n\n//=========================\n// Extend $.views.settings\n//=========================\n\n$viewsSettings({\n\twrapMap: wrapMap = {\n\t\toption: [1, \"\"],\n\t\tlegend: [1, \"
\", \"
\"],\n\t\tarea: [1, \"\", \"\"],\n\t\tparam: [1, \"\", \"\"],\n\t\tthead: [1, \"
\", \"
\"],\n\t\ttr: [2, \"\", \"
\"],\n\t\ttd: [3, \"\", \"
\"],\n\t\tcol: [2, \"\", \"
\"],\n\t\tsvg_ns: [1, \"\", \"\"],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\tdiv: $.support.htmlSerialize ? [0, \"\", \"\"] : [1, \"X
\", \"
\"]\n\t},\n\tlinkAttr: $viewsLinkAttr = \"data-link\",\n\tmerge: {\n\t\tinput: {\n\t\t\tfrom: inputAttrib, to: \"value\"\n\t\t},\n\t\ttextarea: valueBinding,\n\t\tselect: valueBinding,\n\t\toptgroup: {\n\t\t\tto: \"label\"\n\t\t}\n\t},\n\tjsrDbgMode: $viewsSettings.debugMode, // debugMode for JsRender\n\tdebugMode: function(debugMode) { // debugMode for JsViews\n\t\t$viewsSettings._dbgMode = debugMode !== false;\n\t\tif ($viewsSettings._dbgMode) {\n\t\t\tglobal._jsv = { // In debug mode create global _jsv, for accessing views, etc\n\t\t\t\tviews: viewStore,\n\t\t\t\tbindings: bindingStore\n\t\t\t};\n\t\t} else if (global._jsv) {\n\t\t\tglobal._jsv = undefined; // In IE8 cannot do delete global._jsv\n\t\t}\n\t},\n\tjsv: function() {\n\t\t$viewsSettings.debugMode($viewsSettings._dbgMode);\n\t\t$viewsLinkAttr = $viewsSettings.linkAttr;\n\t\terror = $views._err;\n\t\tlinkViewsSel = bindElsSel + \",[\" + $viewsLinkAttr + \"]\";\n\t\tnoDomLevel0 = $viewsSettings.noDomLevel0;\n\t\twrapMap.optgroup = wrapMap.option;\n\t\twrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n\t\twrapMap.th = wrapMap.td;\n\t}\n});\n\n\treturn $;\n}));\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["jquery.views.js"],"names":["factory","global","eval","$","jQuery","define","amd","exports","module","jsr","jso","elemChangeHandler","ev","params","sourceValue","setter","cancel","fromAttr","linkCtx","cvtBack","cnvtName","target","$source","view","binding","oldLinkCtx","onBeforeChange","onAfterChange","tag","to","eventArgs","exprOb","source","bindings","_jsvBnd","rSplitBindings","exec","bindingStore","hlp","onBeforeChangeStr","onAfterChangeStr","defaultAttr","fnSetters","undefined","$isFunction","attr","data","getRsc","elem","nodeName","_jsvSel","multiple","call","change","oldValue","_val","value","_jsv","sb","_ctxCb","_","chging","$observable","setProperty","propertyChangeHandler","linkFn","noUpdate","forceUpdate","hasError","onError","this","cvt","convert","parentElem","parentNode","onEvent","prop","path","_toLk","_er","e","error","Function","props","args","$views","getTargetVal","onUpdate","mergeCtxs","NONE","HTML","onBeforeLink","callAfterLink","observeAndBind","tagName","_cnvt","_tag","tmpl","TRUE","addLinkMethods","updateContent","_noUpd","currentValue","css","$target","expr","test","slice","style","parseInt","type","CHECKBOX","CHECKED","RADIO","setDefer","_df","deferAttr","prevNode","nextNode","promise","nodesToRemove","useProp","tokens","id","openIndex","closeIndex","testElem","cStyle","jsvSel","renders","targetParent","targetVal","_elCnt","_prv","_nxt","currentStyle","getComputedStyle","display","_jsvd","displayStyles","document","createElement","body","appendChild","removeChild","$isArray","inline","nodes","transferViewTokens","_tgId","indexOf","length","disposeTokens","previousSibling","lastChild","remove","link","lazyLink","tagCtx","empty","children","textContent","innerText","selected","inArray","arrayChangeHandler","self","action","index","items","addViews","removeViews","refresh","setArrayChangeLink","handler","arrayBinding","bound","bnd","useKey","bndArr","off","arrayChangeStr","arrVws","apply","arguments","on","linkGetVal","toLowerCase","$viewsSettings","merge","contentEditable","from","renderAndLink","views","context","html","linkToNode","prevView","bindId","elCnt","bnds","removeViewBinding","nextSibling","render","addBindingMarkers","end","bindingKey","viewStore","l","linkedElem","exprFnDeps","cvtBk","convertBack","depends","_bndId","_hdl","_depends","_apply","fn","deps","$extend","bindTo","onAfterBind","flow","setAttribute","jsvAttrStr","getAttribute","radio","find","RADIOINPUT","_jsvLkEl","tmplLink","noIteration","parentView","$link","tmplOrLinkExpr","jquery","activeBody","elementChangeStr","i","k","vwInfos","placeholderParent","targetEl","topLevelCall","onRender","replaceMode","$view","topView","ctx","root","addDataBinding","markup","cleanData","lnk","viewInfos","rOpenViewMarkers","parent","key","viewLink","outerData","validateOnly","convertMarkers","all","preceding","selfClose","closeTag","spaceBefore","boundId","spaceAfter","tag1","tag2","closeTag2","spaceAfterClose","selfClose2","endOpenTag","errorMsg","bndId","endOfElCnt","inTag","isVoid","parentTag","tagStack","shift","validate","voidElems","join","syntaxError","prevElCnt","elContent","defer","ids","openScript","closeScript","deferStack","charAt","unshift","badParent","processViewInfos","deferPath","deferChar","bindChar","onAftCr","deep","addedBindEls","_tkns","len","vwInfo","ch","j","open","push","onArrayChange","removeSubStr","onAfterCreate","bindEls","getViewInfos","level","named","tagDepth","tags","dataLink","wrap","selector","linkViewsSel","get","elems","qsa","querySelectorAll","innerHTML","prevNodes","found","markerNodeInfo","contains","isLink","rViewMarkers","skip","processInfos","$viewsLinkAttr","rOpenTagMarkers","unmarkPrevOrNextNode","resolve","prevIds","linkInfo","unlinked","token","nextView","node","depth","fragment","copiedNode","firstTag","wrapper","div","htmlTag","thisId","onAfterCreateStr","Deferred","name","noValidate","markPrevOrNextNode","namespaceURI","rFirstElem","noDomLevel0","replace","rConvertMarkers","safeFragment","wrapMap","createDocumentFragment","firstChild","insertBefore","setTimeout","linkMarkup","currentView","boundTagId","tagExpr","rTagIndex","hasElse","lastIndex","linkExpressions","bindDataLinkTarget","normalizeLinkTag","rTagDatalink","isLk","links","$sub","tmplFn","noArray","View","extendCtx","getContextCb","str","substr","SCRIPT","nodeType","isVal","rBinding","getInfos","close","elPath","infos","rMarkerTokens","removeAttribute","marker","twoway","trim","rEscapeQuotes","delimCloseChar0","delimOpenChar1","$linkedElem","radioButtons","val","linkedTag","oldTrig","newTrig","onAfterLink","targetTag","noVal","cvtArgs","setSize","height","width","addClass","_jsvTr","trigger","bindElChange","asyncElemChangeHandler","$elem","trig","onoff","bindto","pathIndex","lastPath","bindtoOb","paths","_jsvto","split","newCtxs","newTagCtx","tagCtxs","_ths","clean","elemArray","linkedElemTag","objId","object","obsId","map","cbId","propertyChangeStr","unmap","onDispose","_cbBnds","$unlink","each","innerView","getElementsByTagName","rViewPath","inputAttrib","viewOrTagChar","viewOrTag","viewId","precedingLength","emptyView","vwItem","rOpenMarkers","tagOrView","isTag","contents","select","filtered","filter","add","withMarkers","prevIsFirstNode","lastSibling","childTags","disposed","update","domChange","hasListener","hasData","_data","events","domChangeNotification","triggerHandler","dataItems","viewsCount","itemsCount","keepNodes","removeView","viewToRemove","current","isArray","splice","observeProps","tgt","insert","observeMappedProps","item","src","removeProperty","shallowArrayFilter","allPath","setGlobals","jsrender","requiresStr","sub","_jq","$observe","settings","delimOpenChar0","delimCloseChar1","linkChar","extend","isFunction","$converters","converters","$tags","propChng","arrChng","syntaxErr","bindElsSel","input","text","valueBinding","isCleanCall","oldCleanData","oldJsvDelimiters","delimiters","querySelector","ol","ul","table","tbody","thead","tfoot","tr","colgroup","dl","optgroup","svg","svg_ns","br","img","hr","area","base","col","meta","command","embed","keygen","param","track","wbr","observable","observe","onStore","template","delimChars","RegExp","rTag","regularExpression","toggle","init","content","elemType","label","contextOb","activeElem","_evs","_sel","_hlr","concat","arrayView","targetLength","noVws","oldItems","done","arrHandler","arrBinding","arrayBindings","_ars","tagCt","tci","prevArg","different","baseTag","dataMap","getTgt","obsSrc","obsTgt","tgtFlt","inner","getInnerView","nd","isVl","unlink","oldFn","result","option","legend","td","support","htmlSerialize","linkAttr","textarea","jsrDbgMode","debugMode","_dbgMode","jsv","_err","caption","th"],"mappings":"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","file":"jquery.views.min.js","sourcesContent":["/*! jquery.views.js v0.9.72 (Beta): http://jsviews.com/ */\n/*\n * Interactive data-driven views using JsRender templates.\n * Subcomponent of JsViews\n * Requires jQuery and jsrender.js (Best-of-breed templating in browser or on Node.js)\n * See JsRender at http://jsviews.com/#download and http://github.com/BorisMoore/jsrender\n * Also requires jquery.observable.js\n * See JsObservable at http://jsviews.com/#download and http://github.com/BorisMoore/jsviews\n *\n * Copyright 2015, Boris Moore\n * Released under the MIT License.\n */\n\n//jshint -W018, -W041\n\n(function(factory) {\n\t// global var is the this object, which is window when running in the usual browser environment\n\tvar global = (0, eval)('this'), // jshint ignore:line\n\t\t$ = global.jQuery;\n\n\tif (typeof define === \"function\" && define.amd) { // AMD script loader, e.g. RequireJS\n\t\tdefine([\"jquery\", \"./jsrender\", \"./jquery.observable\"], factory); // Require jQuery, JsRender, JsObservable\n\t} else if (typeof exports === \"object\") { // CommonJS e.g. Browserify\n\t\tmodule.exports = $\n\t\t\t? factory($)\n\t\t\t: function($) { // If no global jQuery, take jQuery passed as parameter (with JsRender and JsObservable): require(\"jquery.views\")(jQuery)\n\t\t\t\treturn factory($);\n\t\t\t};\n\t} else { // Browser using plain ',\n\topenScript = ' - data-linked tag, close marker\n\t\t\t// We validate with inTag so no script markers are inserted in attribute context e.g. for:\n\t\t\t// \"\" or \"
...{{/if}}...\"\n\t\t\tpreceding = id\n\t\t\t\t? (preceding + endOfElCnt + spaceBefore + (inTag ? \"\" : openScript + id + closeScript)+ spaceAfter + tag)\n\t\t\t\t: endOfElCnt || all;\n\t\t}\n\n\t\tif (validate && boundId) {\n\t\t\tif (inTag) {\n\t\t\t\t// JsViews data-linking tags are not allowed within element markup.\n\t\t\t\t// See jsviews/issues/303\n\t\t\t\tsyntaxError('{^{ within elem markup (' + inTag + ' ). Use data-link=\"...\"');\n\t\t\t}\n\t\t\tif (id.charAt(0) === \"#\") {\n\t\t\t\ttagStack.unshift(id.slice(1));\n\t\t\t} else if (id.slice(1) !== (bndId = tagStack.shift())) {\n\t\t\t\t// See jsviews/issues/213\n\t\t\t\tsyntaxError('Closing tag for {^{...}} under different elem: <' + bndId + '>');\n\t\t\t}\n\t\t}\n\t\tif (tag) {\n\t\t\tinTag = tag;\n\t\t\t// If there are ids (markers since the last tag), move them to the defer string\n\t\t\ttagStack.unshift(parentTag);\n\t\t\tparentTag = tag.slice(1);\n\t\t\tif (validate && tagStack[0] && tagStack[0] === badParent[parentTag]) {\n\t\t\t\t// Missing \n\t\t\t\t// TODO: replace this by smart insertion of tags\n\t\t\t\terror('Parent of must be ');\n\t\t\t}\n\t\t\tisVoid = voidElems[parentTag];\n\t\t\tif ((elCnt = elContent[parentTag]) && !prevElCnt) {\n\t\t\t\tdeferStack.unshift(defer);\n\t\t\t\tdefer = \"\";\n\t\t\t}\n\t\t\tprevElCnt = elCnt;\n//TODO Consider providing validation which throws if you place as child of , etc. - since if not caught,\n//this can cause errors subsequently which are difficult to debug.\n//\t\t\t\tif (elContent[tagStack[0]]>2 && !elCnt) {\n//\t\t\t\t\terror(parentTag + \" in \" + tagStack[0]);\n//\t\t\t\t}\n\t\t\tif (defer && elCnt) {\n\t\t\t\tdefer += \"+\"; // Will be used for stepping back through deferred tokens\n\t\t\t}\n\t\t}\n\t\treturn preceding;\n\t}\n\n\tfunction processViewInfos(vwInfos, targetParent) {\n\t\t// If targetParent, we are processing viewInfos (which may include navigation through '+-' paths) and hooking up to the right parentElem etc.\n\t\t// (and elem may also be defined - the next node)\n\t\t// If no targetParent, then we are processing viewInfos on newly inserted content\n\t\tvar deferPath, deferChar, bindChar, parentElem, id, onAftCr, deep,\n\t\t\taddedBindEls = [];\n\n\t\t// In elCnt context (element-only content model), prevNode is the first node after the open, nextNode is the first node after the close.\n\t\t// If both are null/undefined, then open and close are at end of parent content, so the view is empty, and its placeholder is the\n\t\t// 'lastChild' of the parentNode. If there is a prevNode, then it is either the first node in the view, or the view is empty and\n\t\t// its placeholder is the 'previousSibling' of the prevNode, which is also the nextNode.\n\t\tif (vwInfos) {\n\t\t\tif (vwInfos._tkns.charAt(0) === \"@\") {\n\t\t\t\t// We are processing newly inserted content. This is a special script element that was created in convertMarkers() to process deferred bindings,\n\t\t\t\t// and inserted following the target parent element - because no element tags (outside elCnt) were encountered to carry those binding tokens.\n\t\t\t\t// We will step back from the preceding sibling of this element, looking at targetParent elements until we find the one that the current binding\n\t\t\t\t// token belongs to. Set elem to null (the special script element), and remove it from the DOM.\n\t\t\t\ttargetParent = elem.previousSibling;\n\t\t\t\telem.parentNode.removeChild(elem);\n\t\t\t\telem = undefined;\n\t\t\t}\n\t\t\tlen = vwInfos.length;\n\t\t\twhile (len--) {\n\t\t\t\tvwInfo = vwInfos[len];\n//if (prevIds.indexOf(vwInfo.token) < 0) { // This token is a newly created view or tag binding\n\t\t\t\tbindChar = vwInfo.ch;\n\t\t\t\tif (deferPath = vwInfo.path) {\n\t\t\t\t\t// We have a 'deferred path'\n\t\t\t\t\tj = deferPath.length - 1;\n\t\t\t\t\twhile (deferChar = deferPath.charAt(j--)) {\n\t\t\t\t\t\t// Use the \"+\" and\"-\" characters to navigate the path back to the original parent node where the deferred bindings ocurred\n\t\t\t\t\t\tif (deferChar === \"+\") {\n\t\t\t\t\t\t\tif (deferPath.charAt(j) === \"-\") {\n\t\t\t\t\t\t\t\tj--;\n\t\t\t\t\t\t\t\ttargetParent = targetParent.previousSibling;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttargetParent = targetParent.parentNode;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttargetParent = targetParent.lastChild;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Note: Can use previousSibling and lastChild, not previousElementSibling and lastElementChild,\n\t\t\t\t\t\t// since we have removed white space within elCnt. Hence support IE < 9\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (bindChar === \"^\") {\n\t\t\t\t\tif (tag = bindingStore[id = vwInfo.id]) {\n\t\t\t\t\t\t// The binding may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\t\t// This is a tag binding\n\t\t\t\t\t\tdeep = targetParent && (!elem || elem.parentNode !== targetParent); // We are stepping back looking for the right targetParent,\n\t\t\t\t\t\t// or we are linking existing content and this element is in elCnt, not an immediate child of the targetParent.\n\t\t\t\t\t\tif (!elem || deep) {\n\t\t\t\t\t\t\ttag.parentElem = targetParent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (vwInfo.elCnt && deep) {\n\t\t\t\t\t\t\t// With element only content, if there is no following element, or if the binding is deeper than the following element\n\t\t\t\t\t\t\t// then we need to set the open or close token as a deferred binding annotation on the parent\n\t\t\t\t\t\t\tsetDefer(targetParent, (vwInfo.open ? \"#\" : \"/\") + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// This is an open or close marker for a data-linked tag {^{...}}. Add it to bindEls.\n\t\t\t\t\t\taddedBindEls.push([deep ? null : elem, vwInfo]);\n\t\t\t\t\t}\n\t\t\t\t} else if (view = viewStore[id = vwInfo.id]) {\n\t\t\t\t\t// The view may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\tif (!view.parentElem) {\n\t\t\t\t\t\t// If view is not already extended for JsViews, extend and initialize the view object created in JsRender, as a JsViews view\n\t\t\t\t\t\tview.parentElem = targetParent || elem && elem.parentNode || parentNode;\n\t\t\t\t\t\tview._.onRender = addBindingMarkers;\n\t\t\t\t\t\tview._.onArrayChange = arrayChangeHandler;\n\t\t\t\t\t\tsetArrayChangeLink(view);\n\t\t\t\t\t}\n\t\t\t\t\tparentElem = view.parentElem;\n\t\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t\t// This is an 'open view' node (preceding script marker node,\n\t\t\t\t\t\t// or if elCnt, the first element in the view, with a data-jsv annotation) for binding\n\t\t\t\t\t\tview._elCnt = vwInfo.elCnt;\n\t\t\t\t\t\tif (targetParent && !elem) {\n\t\t\t\t\t\t\tsetDefer(targetParent, \"#\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// No targetParent, so there is a ._nxt elem (and this is processing tokens on the elem)\n\t\t\t\t\t\t\tif (!view._prv) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This is a 'close view' marker node for binding\n\t\t\t\t\t\tif (targetParent && (!elem || elem.parentNode !== targetParent)) {\n\t\t\t\t\t\t\t// There is no ._nxt so add token to _df. It is deferred.\n\t\t\t\t\t\t\tsetDefer(targetParent, \"/\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t\tview._nxt = undefined;\n\t\t\t\t\t\t} else if (elem) {\n\t\t\t\t\t\t\t// This view did not have a ._nxt, but has one now, so token may be in _df, and must be removed. (No longer deferred)\n\t\t\t\t\t\t\tif (!view._nxt) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._nxt = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlinkCtx = view.linkCtx;\n\t\t\t\t\t\tif (onAftCr = view.ctx && view.ctx.onAfterCreate || onAfterCreate) {\n\t\t\t\t\t\t\tonAftCr.call(linkCtx, view);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n//}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlen = addedBindEls.length;\n\t\t\twhile (len--) {\n\t\t\t\t// These were added in reverse order to addedBindEls. We push them in BindEls in the correct order.\n\t\t\t\tbindEls.push(addedBindEls[len]);\n\t\t\t}\n\t\t}\n\t\treturn !vwInfos || vwInfos.elCnt;\n\t}\n\n\tfunction getViewInfos(vwInfos) {\n\t\t// Used by view.childTags() and tag.childTags()\n\t\t// Similar to processViewInfos in how it steps through bindings to find tags. Only finds data-linked tags.\n\t\tvar level, parentTag, named;\n\n\t\tif (vwInfos) {\n\t\t\tlen = vwInfos.length;\n\t\t\tfor (j = 0; j < len; j++) {\n\t\t\t\tvwInfo = vwInfos[j];\n\t\t\t\t// This is an open marker for a data-linked tag {^{...}}, within the content of the tag whose id is get.id. Add it to bindEls.\n\t\t\t\t// Note - if bindingStore[vwInfo.id]._is === \"tag\" then getViewInfos is being called too soon - during first linking pass\n\t\t\t\tparentTag = tag = bindingStore[vwInfo.id].linkCtx.tag;\n\t\t\t\tnamed = tag.tagName === tagName;\n\t\t\t\tif (!tag.flow || named) {\n\t\t\t\t\tif (!deep) {\n\t\t\t\t\t\tlevel = 1;\n\t\t\t\t\t\twhile (parentTag = parentTag.parent) {\n\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttagDepth = tagDepth || level; // The level of the first tag encountered.\n\t\t\t\t\t}\n\t\t\t\t\tif ((deep || level === tagDepth) && (!tagName || named)) {\n\t\t\t\t\t\t// Filter on top-level or tagName as appropriate\n\t\t\t\t\t\ttags.push(tag);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction dataLink() {\n\t\t//================ Data-link and fixup of data-jsv annotations ================\n\t\tvar j, index,\n\t\t\ttokens = \"\",\n\t\t\twrap = {},\n\t\t\tselector = linkViewsSel + (get ? \",[\" + deferAttr + \"]\" : \"\");\n\t\t\t// If a childTags() call, get = \",[\" + deferAttr + \"]\" - since we need to include elements that have a ._df expando for deferred tokens\n\n\t\telems = qsa ? parentNode.querySelectorAll(selector) : $(selector, parentNode).get();\n\t\tl = elems.length;\n\n\t\t// The prevNode will be in the returned query, since we called markPrevOrNextNode() on it.\n\t\t// But it may have contained nodes that satisfy the selector also.\n\t\tif (prevNode && prevNode.innerHTML) {\n\t\t\t// Find the last contained node of prevNode, to use as the prevNode - so we only link subsequent elems in the query\n\t\t\tprevNodes = qsa ? prevNode.querySelectorAll(selector) : $(selector, prevNode).get();\n\t\t\tprevNode = prevNodes.length ? prevNodes[prevNodes.length - 1] : prevNode;\n\t\t}\n\n\t\ttagDepth = 0;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = elems[i];\n\t\t\tif (prevNode && !found) {\n\t\t\t\t// If prevNode is set, not false, skip linking. If this element is the prevNode, set to false so subsequent elements will link.\n\t\t\t\tfound = (elem === prevNode);\n\t\t\t} else if (nextNode && elem === nextNode) {\n\t\t\t\t// If nextNode is set then break when we get to nextNode\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else if (elem.parentNode) {\n\t\t\t\t// elem has not been removed from DOM\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t\tif (elem._df) {\n\t\t\t\t\t\tj = i + 1;\n\t\t\t\t\t\twhile (j < l && elem.contains(elems[j])) {\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Add defered tokens after any tokens on descendant elements of this one\n\t\t\t\t\t\twrap[j-1] = elem._df;\n\t\t\t\t\t}\n\t\t\t\t\tif (wrap[i]) {\n\t\t\t\t\t\ttokens += wrap[i] || \"\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (isLink && (vwInfo = viewInfos(elem, undefined, rViewMarkers)) && (vwInfo = vwInfo[0])) {\n\t\t\t\t\t\t// If this is a link(trueOrString ...) call we will avoid re-binding to elems that are within template-rendered views\n\t\t\t\t\t\tskip = skip ? (vwInfo.id !== skip && skip) : vwInfo.open && vwInfo.id;\n\t\t\t\t\t}\n\t\t\t\t\tif (!skip && processInfos(viewInfos(elem))\n\t\t\t\t\t\t// If a link() call, processViewInfos() adds bindings to bindEls, and returns true for non-script nodes, for adding data-link bindings\n\t\t\t\t\t\t// If a childTags() call, getViewInfos returns array of tag bindings.\n\t\t\t\t\t\t\t&& elem.getAttribute($viewsLinkAttr)) {\n\t\t\t\t\t\tbindEls.push([elem]); // A data-linked element so add to bindEls too\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (get) {\n\t\t\ttokens += parentNode._df || \"\";\n\t\t\tif (index = tokens.indexOf(\"#\" + get.id) + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so start after the open token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(index + get.id.length);\n\t\t\t}\n\t\t\tindex = tokens.indexOf(\"/\" + get.id);\n\t\t\tif (index + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so don't look beyond the close token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(0, index);\n\t\t\t}\n\t\t\t// Call getViewInfos to add the found childTags to the tags array\n\t\t\tgetViewInfos(viewInfos(tokens, undefined, rOpenTagMarkers));\n\t\t}\n\n\t\tif (html === undefined && parentNode.getAttribute($viewsLinkAttr)) {\n\t\t\tbindEls.push([parentNode]); // Support data-linking top-level element directly (not within a data-linked container)\n\t\t}\n\n\t\t// Remove temporary marker script nodes they were added by markPrevOrNextNode\n\t\tunmarkPrevOrNextNode(prevNode, elCnt);\n\t\tunmarkPrevOrNextNode(nextNode, elCnt);\n\n\t\tif (get) {\n\t\t\tif (lazyLink) {\n\t\t\t\tlazyLink.resolve();\n\t\t\t}\n\t\t\treturn; // We have added childTags to the tags array, so we are done\n\t\t}\n\n\t\tif (elCnt && defer + ids) {\n\t\t\t// There are some views with elCnt, for which the open or close did not precede any HTML tag - so they have not been processed yet\n\t\t\telem = nextNode;\n\t\t\tif (defer) {\n\t\t\t\tif (nextNode) {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer + \"+\", true), nextNode);\n\t\t\t\t} else {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer, true), parentNode);\n\t\t\t\t}\n\t\t\t}\n\t\t\tprocessViewInfos(viewInfos(ids, true), parentNode);\n\t\t\t// If there were any tokens on nextNode which have now been associated with inserted HTML tags, remove them from nextNode\n\t\t\tif (nextNode) {\n\t\t\t\ttokens = nextNode.getAttribute(jsvAttrStr);\n\t\t\t\tif (l = tokens.indexOf(prevIds) + 1) {\n\t\t\t\t\ttokens = tokens.slice(l + prevIds.length - 1);\n\t\t\t\t}\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, ids + tokens);\n\t\t\t}\n\t\t}\n\n\t\t//================ Bind the data-linked elements and tags ================\n\t\tl = bindEls.length;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = bindEls[i];\n\t\t\tlinkInfo = elem[1];\n\t\t\telem = elem[0];\n\t\t\tif (linkInfo) {\n\t\t\t\tif (tag = bindingStore[linkInfo.id]) {\n\t\t\t\t\tif (linkCtx = tag.linkCtx) {\n\t\t\t\t\t\t// The tag may have been stored temporarily on the bindingStore - or may have already been replaced by the actual binding\n\t\t\t\t\t\ttag = linkCtx.tag;\n\t\t\t\t\t\ttag.linkCtx = linkCtx;\n\t\t\t\t\t}\n\t\t\t\t\tif (linkInfo.open) {\n\t\t\t\t\t\t// This is an 'open linked tag' binding annotation for a data-linked tag {^{...}}\n\t\t\t\t\t\tif (elem) {\n\t\t\t\t\t\t\ttag.parentElem = elem.parentNode;\n\t\t\t\t\t\t\ttag._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttag._elCnt = linkInfo.elCnt;\n\t\t\t\t\t\tif (tag.onBeforeLink) {\n\t\t\t\t\t\t\ttag.onBeforeLink();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// We data-link depth-first (\"on the way in\"), which is better for perf - and allows setting parent tags etc.\n\t\t\t\t\t\tview = tag.tagCtx.view;\n\t\t\t\t\t\taddDataBinding(undefined, tag._prv, view, linkInfo.id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttag._nxt = elem;\n\t\t\t\t\t\tif (tag._.unlinked) {\n\t\t\t\t\t\t\t// This is a 'close linked tag' binding annotation\n\t\t\t\t\t\t\t// Add data binding\n\t\t\t\t\t\t\ttagCtx = tag.tagCtx;\n\t\t\t\t\t\t\tview = tagCtx.view;\n\t\t\t\t\t\t\tcallAfterLink(tag);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Add data binding for a data-linked element (with data-link attribute)\n\t\t\t\taddDataBinding(elem.getAttribute($viewsLinkAttr), elem, $view(elem), undefined, isLink, outerData, context);\n\t\t\t}\n\t\t}\n\t\tif (lazyLink) {\n\t\t\tlazyLink.resolve();\n\t\t}\n\t}\n\t//==== /end of nested functions ====\n\n\tvar inTag, linkCtx, tag, i, l, j, len, elems, elem, view, vwInfo, linkInfo, prevNodes, token, prevView, nextView,\n\t\tnode, tags, deep, tagName, tagCtx, validate, tagDepth, depth, fragment, copiedNode, firstTag, parentTag,\n\t\tisVoid, wrapper, div, tokens, elCnt, prevElCnt, htmlTag, ids, prevIds, found, skip, lazyLink, isLink, get,\n\t\tself = this,\n\t\tthisId = self._.id + \"_\",\n\t\tdefer = \"\",\n\t\t// The marker ids for which no tag was encountered (empty views or final closing markers) which we carry over to container tag\n\t\tbindEls = [],\n\t\ttagStack = [],\n\t\tdeferStack = [],\n\t\tonAfterCreate = self.hlp(onAfterCreateStr),\n\t\tprocessInfos = processViewInfos;\n\n\tif (refresh) {\n\t\tlazyLink = refresh.lazyLink && $.Deferred();\n\t\tif (refresh.tmpl) {\n\t\t\t// refresh is the prevView, passed in from addViews()\n\t\t\tprevView = \"/\" + refresh._.id + \"_\";\n\t\t} else {\n\t\t\tisLink = refresh.lnk; // Top-level linking\n\t\t\tif (refresh.tag) {\n\t\t\t\tthisId = refresh.tag + \"^\";\n\t\t\t\trefresh = true;\n\t\t\t}\n\t\t\tif (get = refresh.get) {\n\t\t\t\tprocessInfos = getViewInfos;\n\t\t\t\ttags = get.tags;\n\t\t\t\tdeep = get.deep;\n\t\t\t\ttagName = get.name;\n\t\t\t}\n\t\t}\n\t\trefresh = refresh === true;\n\t}\n\n\tparentNode = parentNode\n\t\t? (\"\" + parentNode === parentNode\n\t\t\t? $(parentNode)[0] // It is a string, so treat as selector\n\t\t\t: parentNode.jquery\n\t\t\t\t? parentNode[0] // A jQuery object - take first element.\n\t\t\t\t: parentNode)\n\t\t: (self.parentElem // view.link()\n\t\t\t|| document.body); // link(null, data) to link the whole document\n\n\tvalidate = !$viewsSettings.noValidate && parentNode.contentEditable !== TRUE;\n\tparentTag = parentNode.tagName.toLowerCase();\n\telCnt = !!elContent[parentTag];\n\n\tprevNode = prevNode && markPrevOrNextNode(prevNode, elCnt);\n\tnextNode = nextNode && markPrevOrNextNode(nextNode, elCnt) || null;\n\n\tif (html != undefined) {\n\t\t//================ Insert html into DOM using documentFragments (and wrapping HTML appropriately). ================\n\t\t// Also convert markers to DOM annotations, based on content model.\n\t\t// Corresponds to nextNode ? $(nextNode).before(html) : $(parentNode).html(html);\n\t\t// but allows insertion to wrap correctly even with inserted script nodes. jQuery version will fail e.g. under tbody or select.\n\t\t// This version should also be slightly faster\n\t\tdiv = document.createElement(\"div\");\n\t\twrapper = div;\n\t\tprevIds = ids = \"\";\n\t\thtmlTag = parentNode.namespaceURI === \"http://www.w3.org/2000/svg\" ? \"svg_ns\" : (firstTag = rFirstElem.exec(html)) && firstTag[1] || \"\";\n\t\tif (noDomLevel0 && firstTag && firstTag[2]) {\n\t\t\terror(\"Unsupported: \" + firstTag[2]); // For security reasons, don't allow insertion of elements with onFoo attributes.\n\t\t}\n\t\tif (elCnt) {\n\t\t\t// Now look for following view, and find its tokens, or if not found, get the parentNode._df tokens\n\t\t\tnode = nextNode;\n\t\t\twhile (node && !(nextView = viewInfos(node))) {\n\t\t\t\tnode = node.nextSibling;\n\t\t\t}\n\t\t\tif (tokens = nextView ? nextView._tkns : parentNode._df) {\n\t\t\t\ttoken = prevView || \"\";\n\t\t\t\tif (refresh || !prevView) {\n\t\t\t\t\ttoken += \"#\" + thisId;\n\t\t\t\t}\n\t\t\t\tj = tokens.indexOf(token);\n\t\t\t\tif (j + 1) {\n\t\t\t\t\tj += token.length;\n\t\t\t\t\t// Transfer the initial tokens to inserted nodes, by setting them as the ids variable, picked up in convertMarkers\n\t\t\t\t\tprevIds = ids = tokens.slice(0, j);\n\t\t\t\t\ttokens = tokens.slice(j);\n\t\t\t\t\tif (nextView) {\n\t\t\t\t\t\tnode.setAttribute(jsvAttrStr, tokens);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetDefer(parentNode, tokens);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//================ Convert the markers to DOM annotations, based on content model. ================\n//\t\t\toldElCnt = elCnt;\n\t\tisVoid = undefined;\n\t\thtml = (\"\" + html).replace(rConvertMarkers, convertMarkers);\n//\t\t\tif (!!oldElCnt !== !!elCnt) {\n//\t\t\t\terror(\"Parse: \" + html); // Parse error. Content not well-formed?\n//\t\t\t}\n\t\tif (validate && tagStack.length) {\n\t\t\tsyntaxError(\"Mismatched '<\" + parentTag + \"...>' in:\\n\" + html); // Unmatched tag\n\t\t}\n\t\tif (validateOnly) {\n\t\t\treturn;\n\t\t}\n\t\t// Append wrapper element to doc fragment\n\t\tsafeFragment.appendChild(div);\n\n\t\t// Go to html and back, then peel off extra wrappers\n\t\t// Corresponds to jQuery $(nextNode).before(html) or $(parentNode).html(html);\n\t\t// but supports svg elements, and other features missing from jQuery version (and this version should also be slightly faster)\n\t\thtmlTag = wrapMap[htmlTag] || wrapMap.div;\n\t\tdepth = htmlTag[0];\n\t\twrapper.innerHTML = htmlTag[1] + html + htmlTag[2];\n\t\twhile (depth--) {\n\t\t\twrapper = wrapper.lastChild;\n\t\t}\n\t\tsafeFragment.removeChild(div);\n\t\tfragment = document.createDocumentFragment();\n\t\twhile (copiedNode = wrapper.firstChild) {\n\t\t\tfragment.appendChild(copiedNode);\n\t\t}\n\t\t// Insert into the DOM\n\t\tparentNode.insertBefore(fragment, nextNode);\n\t}\n\n\tif (lazyLink) {\n\t\tsetTimeout(dataLink, 0);\n\t} else {\n\t\tdataLink();\n\t}\n\n\treturn lazyLink && lazyLink.promise();\n}\n\nfunction addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, context) {\n\t// Add data binding for data-linked elements or {^{...}} data-linked tags\n\tvar tmpl, tokens, attr, convertBack, params, trimLen, tagExpr, linkFn, linkCtx, tag, rTagIndex, hasElse, lastIndex,\n\t\tlinkExpressions = [];\n\n\tif (boundTagId) {\n\t\t// boundTagId is a string for {^{...}} data-linked tag. So only one linkTag in linkMarkup\n\t\t// data and context parameters are undefined\n\t\ttag = bindingStore[boundTagId];\n\t\ttag = tag.linkCtx ? tag.linkCtx.tag : tag;\n\n\t\tlinkCtx = tag.linkCtx || {\n\t\t\tdata: currentView.data, // source\n\t\t\telem: tag._elCnt ? tag.parentElem : node, // target\n\t\t\tview: currentView,\n\t\t\tctx: currentView.ctx,\n\t\t\tattr: HTML, // Script marker nodes are associated with {^{ and always target HTML.\n\t\t\tfn: tag._.bnd,\n\t\t\ttag: tag,\n\t\t\t// Pass the boundTagId in the linkCtx, so that it can be picked up in observeAndBind\n\t\t\t_bndId: boundTagId\n\t\t};\n\t\tbindDataLinkTarget(linkCtx, linkCtx.fn);\n\t} else if (linkMarkup && node) {\n\t\t// If isLink then this is a top-level linking: .link(expression, target, data, ....) or\n\t\t// .link(true, target, data, ....) scenario - and data and context are passed in separately from the view\n\t\tdata = isLink ? data : currentView.data;\n\n\t\t// Compiled linkFn expressions could be stored in the tmpl.links array of the template\n\t\t// TODO - consider also caching globally so that if {{:foo}} or data-link=\"foo\" occurs in different places,\n\t\t// the compiled template for this is cached and only compiled once...\n\t\t//links = currentView.links || currentView.tmpl.links;\n\n\t\ttmpl = currentView.tmpl;\n\n//\t\t\tif (!(linkTags = links[linkMarkup])) {\n\t\t// This is the first time this view template has been linked, so we compile the data-link expressions, and store them on the template.\n\n\t\tlinkMarkup = normalizeLinkTag(linkMarkup, defaultAttr(node));\n\t\tlastIndex = rTagDatalink.lastIndex = 0;\n\t\twhile (tokens = rTagDatalink.exec(linkMarkup)) { // TODO require } to be followed by whitespace or $, and remove the \\}(!\\}) option.\n\t\t\tlinkExpressions.push(tokens);\n\t\t\tlastIndex = rTagDatalink.lastIndex;\n\t\t}\n\t\tif (lastIndex < linkMarkup.length) {\n\t\t\tsyntaxError(linkMarkup);\n\t\t}\n\t\twhile (tokens = linkExpressions.shift()) {\n\t\t\t// Iterate over the data-link expressions, for different target attrs,\n\t\t\t// e.g. ~description(firstName, lastName)}\"\n\t\t\t// tokens: [all, attr, bindOnly, tagExpr, tagName, converter, colon, html, comment, code, params]\n\t\t\trTagIndex = rTagDatalink.lastIndex;\n\t\t\tattr = tokens[1];\n\t\t\ttagExpr = tokens[3];\n\t\t\twhile (linkExpressions[0] && linkExpressions[0][4] === \"else\") { // If this is {someTag...} and is followed by an {else...} add to tagExpr\n\t\t\t\ttagExpr += \"}{\" + linkExpressions.shift()[3];\n\t\t\t\thasElse = true;\n\t\t\t}\n\t\t\tif (hasElse) { // If an {else} has been added, need also to add closing {{/someTag}}\n\t\t\t\ttagExpr += \"}{{/\" + tokens[4] + \"}\";\n\t\t\t}\n\t\t\tparams = tokens[9];\n\n\t\t\tlinkCtx = {\n\t\t\t\tdata: data, // source\n\t\t\t\telem: node, // target\n\t\t\t\tview: currentView,\n\t\t\t\tctx: context,\n\t\t\t\tattr: attr,\n\t\t\t\tisLk: isLink, // top-level linking?\n\t\t\t\t_toLk : 1, // Flag to data-link on initial data-link call rendering call\n\t\t\t\t_noUpd : tokens[2] // Flag for data-link=\"^{...}\" so on initial data-link call will bind, but not render)\n\t\t\t};\n\n\t\t\tif (tokens[6]) {\n\t\t\t\tconvertBack = tokens[10];\n\t\t\t\tlinkCtx.convert = tokens[5] || \"\";\n\t\t\t\tif (!attr && convertBack !== undefined && defaultAttr(node)) {\n\t\t\t\t\t// Default target, so allow 2 way binding\n\t\t\t\t\tlinkCtx.convertBack = convertBack = convertBack.slice(1);\n\t\t\t\t} else {\n\t\t\t\t\tconvertBack = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Compile the linkFn expression which evaluates and binds a data-link expression\n\t\t\t// TODO - optimize for the case of simple data path with no conversion, helpers, etc.:\n\t\t\t// i.e. data-link=\"a.b.c\". Avoid creating new instances of Function every time. Can use a default function for all of these...\n\n\t\t\tlinkCtx.expr = attr + tagExpr;\n\t\t\tlinkFn = tmpl.links[tagExpr];\n\t\t\tif (!linkFn) {\n\t\t\t\ttmpl.links[tagExpr] = linkFn = $sub.tmplFn(tagExpr, tmpl, true, convertBack, hasElse);\n\t\t\t}\n\t\t\tlinkCtx.fn = linkFn;\n\t\t\tbindDataLinkTarget(linkCtx, linkFn);\n\t\t\t// We store rTagIndex in local scope, since this addDataBinding method can sometimes be called recursively,\n\t\t\t// and each is using the same rTagDatalink instance.\n\t\t\trTagDatalink.lastIndex = rTagIndex;\n\t\t}\n//\t\t}\n\t}\n}\n\nfunction bindDataLinkTarget(linkCtx, linkFn) {\n\t// Add data link bindings for a link expression in data-link attribute markup\n\tfunction handler(ev, eventArgs) {\n\t\tpropertyChangeHandler.call(linkCtx, ev, eventArgs, linkFn);\n\t\t// If the link expression uses a custom tag, the propertyChangeHandler call will call renderTag, which will set tagCtx on linkCtx\n\t}\n\thandler.noArray = true;\n\tif (linkCtx.isLk) {\n\t\t// Top-level linking: .link(expressionOrTrue, data, context) - so we need to create a view for the linking, with the data and ctx\n\t\t// which may be different than the current context of the target. Note that this view is not a standard data-linked view, so it will\n\t\t// be disposed only when its parent view is disposed.\n\t\taddLinkMethods(linkCtx.view = new $sub.View(\n\t\t\t$sub.extendCtx(linkCtx.ctx, linkCtx.view.ctx),\n\t\t\t\"link\", linkCtx.view, linkCtx.data, linkCtx.expr, undefined, addBindingMarkers));\n\t}\n\tlinkCtx._ctxCb = getContextCb(linkCtx.view); // _ctxCb is for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]}\n\tlinkCtx._hdl = handler;\n\thandler(true);\n}\n\n//=====================\n// Data-linking helpers\n//=====================\n\nfunction removeSubStr(str, substr) {\n\tvar k;\n\treturn str\n\t\t? (k = str.indexOf(substr),\n\t\t\t(k + 1\n\t\t\t\t? str.slice(0, k) + str.slice(k + substr.length)\n\t\t\t\t: str))\n\t\t: \"\";\n}\n\nfunction markerNodeInfo(node) {\n\treturn node &&\n\t\t(\"\" + node === node\n\t\t\t? node\n\t\t\t: node.tagName === SCRIPT\n\t\t\t\t? node.type.slice(3)\n\t\t\t\t: node.nodeType === 1 && node.getAttribute(jsvAttrStr) || \"\");\n}\n\nfunction viewInfos(node, isVal, rBinding) {\n\t// Test whether node is a script marker node, and if so, return metadata\n\tfunction getInfos(all, open, close, id, ch, elPath) {\n\t\tinfos.push({\n\t\t\telCnt: elCnt,\n\t\t\tid: id,\n\t\t\tch: ch,\n\t\t\topen: open,\n\t\t\tclose: close,\n\t\t\tpath: elPath,\n\t\t\ttoken: all\n\t\t});\n\t}\n\tvar elCnt, tokens,\n\t\tinfos = [];\n\tif (tokens = isVal ? node : markerNodeInfo(node)) {\n\t\telCnt = infos.elCnt = node.tagName !== SCRIPT;\n\t\telCnt = tokens.charAt(0) === \"@\" || elCnt;\n\t\tinfos._tkns = tokens;\n\t\t// rMarkerTokens = /(?:(#)|(\\/))(\\d+)([_^])([-+@\\d]+)?/g;\n\t\ttokens.replace(rBinding || rMarkerTokens, getInfos);\n\t\treturn infos;\n\t}\n}\n\nfunction unmarkPrevOrNextNode(node, elCnt) {\n\tif (node) {\n\t\tif (node.type === \"jsv\") {\n\t\t\tnode.parentNode.removeChild(node);\n\t\t} else if (elCnt && node.getAttribute($viewsLinkAttr) === \"\") {\n\t\t\tnode.removeAttribute($viewsLinkAttr);\n\t\t}\n\t}\n}\n\nfunction markPrevOrNextNode(node, elCnt) {\n\tvar marker = node;\n\twhile (elCnt && marker && marker.nodeType !== 1) {\n\t\tmarker = marker.previousSibling;\n\t}\n\tif (marker) {\n\t\tif (marker.nodeType !== 1) {\n\t\t\t// For text nodes, we will add a script node before\n\t\t\tmarker = document.createElement(SCRIPT);\n\t\t\tmarker.type = \"jsv\";\n\t\t\tnode.parentNode.insertBefore(marker, node);\n\t\t} else if (!markerNodeInfo(marker) && !marker.getAttribute($viewsLinkAttr)) {\n\t\t\t// For element nodes, we will add a data-link attribute (unless there is already one)\n\t\t\t// so that this node gets included in the node linking process.\n\t\t\tmarker.setAttribute($viewsLinkAttr, \"\");\n\t\t}\n\t}\n\treturn marker;\n}\n\nfunction normalizeLinkTag(linkMarkup, twoway) {\n\tlinkMarkup = $.trim(linkMarkup).replace(rEscapeQuotes, \"\\\\$&\");\n\treturn linkMarkup.slice(-1) !== delimCloseChar0\n\t// If simplified syntax is used: data-link=\"expression\", convert to data-link=\"{:expression}\",\n\t// or for inputs, data-link=\"{:expression:}\" for (default) two-way binding\n\t\t? linkMarkup = delimOpenChar1 + \":\" + linkMarkup + (twoway ? \":\" : \"\") + delimCloseChar0\n\t\t: linkMarkup;\n}\n\n//===========================\n// Methods for views and tags\n//===========================\n\nfunction callAfterLink(tag, eventArgs) {\n\tvar $linkedElem, linkedElem, radioButtons, val, l, linkedTag, oldTrig, newTrig,\n\t\ttagCtx = tag.tagCtx,\n\t\tview = tagCtx.view,\n\t\tprops = tagCtx.props,\n\t\tlinkCtx = tag.linkCtx = tag.linkCtx || {\n\t\t\ttag: tag,\n\t\t\tdata: view.data,\n\t\t\tview: view,\n\t\t\tctx: view.ctx\n\t\t};\n\n\tif (tag.onAfterLink) {\n\t\ttag.onAfterLink(tagCtx, linkCtx, eventArgs);\n\t}\n\ttag._.unlinked = undefined;\n\t$linkedElem = tag.targetTag ? tag.targetTag.linkedElem : tag.linkedElem;\n\tif (!tag.noVal && (linkedElem = $linkedElem && $linkedElem[0])) {\n\t\tif (radioButtons = tag._.radio) {\n\t\t\t$linkedElem = $linkedElem.find(RADIOINPUT);\n\t\t}\n\t\tif (radioButtons || !tag._.chging) {\n\t\t\tval = tag.cvtArgs()[0];\n\n\t\t\tif (radioButtons || linkedElem !== linkCtx.elem) {\n\t\t\t\tl = $linkedElem.length;\n\t\t\t\twhile (l--) {\n\t\t\t\t\tlinkedElem = $linkedElem[l];\n\t\t\t\t\tlinkedTag = linkedElem._jsvLkEl;\n\t\t\t\t\tif (tag._.inline && (!linkedTag || linkedTag !== tag && linkedTag.targetTag !== tag)) {\n\t\t\t\t\t\t// For data-linked tags, identify the linkedElem with the tag, for \"to\" binding\n\t\t\t\t\t\t// (For data-linked elements, if not yet bound, we identify later when the linkCtx.elem is bound)\n\t\t\t\t\t\tlinkedElem._jsvLkEl = tag;\n\t\t\t\t\t\tbindTo(bindingStore[tag._tgId], tag.convertBack);\n\t\t\t\t\t\tlinkedElem._jsvBnd = \"&\" + tag._tgId + \"+\"; // Add a \"+\" for cloned binding - so removing\n\t\t\t\t\t\t// elems with cloned bindings will not remove the 'parent' binding from the bindingStore.\n\t\t\t\t\t}\n\t\t\t\t\tif (radioButtons) {\n\t\t\t\t\t\t// For radio button, set to if val === value. For others set val() to val, below\n\t\t\t\t\t\tlinkedElem[CHECKED] = val === linkedElem.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlinkCtx._val = val;\n\t\t\t}\n\t\t\tif (val !== undefined) {\n\t\t\t\tif (!radioButtons && linkedElem.value !== undefined) {\n\t\t\t\t\tif (linkedElem.type === CHECKBOX) {\n\t\t\t\t\t\tlinkedElem[CHECKED] = val && val !== \"false\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$linkedElem.val(val);\n\t\t\t\t\t}\n\t\t\t\t} else if (linkedElem.contentEditable === TRUE) {\n\t\t\t\t\tlinkedElem.innerHTML = val;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (tag.setSize) {\n\t\t\tif (props.height) {\n\t\t\t\t$linkedElem.height(props.height);\n\t\t\t}\n\t\t\tif (props.width) {\n\t\t\t\t$linkedElem.width(props.width);\n\t\t\t}\n\t\t}\n\t\tif (props[\"class\"]) {\n\t\t\t$linkedElem.addClass(props[\"class\"]);\n\t\t}\n\t\tif (props.id) {\n\t\t\t$linkedElem[0].id = props.id;\n\t\t}\n\t\tif (props.name) {\n\t\t\t$linkedElem.attr(\"name\", props.name);\n\t\t}\n\t}\n\tif (linkedElem = linkedElem || tag.tagName === \":\" && linkCtx.elem) {\n\t\toldTrig = linkedElem._jsvTr;\n\t\tnewTrig = props.trigger;\n\t\tif (oldTrig !== newTrig) {\n\t\t\tlinkedElem._jsvTr = newTrig;\n\t\t\t$linkedElem = $linkedElem || $(linkedElem);\n\t\t\tbindElChange($linkedElem, oldTrig, \"off\");\n\t\t\tbindElChange($linkedElem, newTrig, \"on\");\n\t\t}\n\t}\n}\n\nfunction asyncElemChangeHandler(ev) {\n\tsetTimeout(function() {\n\t\telemChangeHandler(ev);\n\t}, 0);\n}\n\nfunction bindElChange($elem, trig, onoff) {\n\tif (trig) {\n\t\ttrig = \"\" + trig === trig ? trig : \"keydown\"; // Set trigger to (true || truey non-string (e.g. 1) || 'keydown'): Get 'keydown' with async\n\t\t$elem[onoff](trig, trig === \"keydown\" ? asyncElemChangeHandler : elemChangeHandler);\n\t}\n}\n\nfunction bindTo(binding, cvtBk) {\n\t// Two-way binding.\n\t// We set the binding.to[1] to be the cvtBack, and binding.to[0] to be either the path to the target, or [object, path] where the target is the path on the provided object.\n\t// So for a computed path with an object call: a.b.getObject().d.e, then we set to[0] to be [exprOb, \"d.e\"], and we bind to the path on the returned object, exprOb.ob, as target\n\t// Otherwise our target is the first path, paths[0], which we will convert with contextCb() for paths like ~a.b.c or #x.y.z\n\n\tvar bindto, pathIndex, path, lastPath, bindtoOb,\n\t\tlinkCtx = binding.linkCtx,\n\t\tsource = linkCtx.data,\n\t\tpaths = linkCtx.fn.paths;\n\tif (binding && paths) {\n\t\tpaths = (bindto = paths._jsvto) || paths[0];\n\t\tpathIndex = paths && paths.length;\n\t\tif (pathIndex && (!linkCtx.tag || linkCtx.tag.tagCtx.args.length)) {\n\t\t\tlastPath = paths[pathIndex - 1];\n\t\t\tif (lastPath._jsv) {\n\t\t\t\tbindtoOb = lastPath;\n\t\t\t\twhile (lastPath.sb && lastPath.sb._jsv) {\n\t\t\t\t\tpath = lastPath = lastPath.sb;\n\t\t\t\t}\n\t\t\t\tpath = lastPath.sb || path && path.path;\n\t\t\t\tlastPath = path ? path.slice(1) : bindtoOb.path;\n\t\t\t}\n\t\t\tbinding.to = path\n\t\t\t\t? [ // \"...someexpr().lastpath...\" - so need to get the bindtoOb 'exprOb' object for this view-binding\n\t\t\t\t\t[\n\t\t\t\t\t\tbindtoOb, // 'exprOb' for this expression and view-binding. So bindtoOb.ob is current object returned by expression.\n\t\t\t\t\t\tlastPath\n\t\t\t\t\t],\n\t\t\t\t\tcvtBk\n\t\t\t\t]\n\t\t\t\t: [\n\t\t\t\t\tlinkCtx._ctxCb(path = lastPath.split(\"^\").join(\".\")) || [source, path],\n\t\t\t\t\tcvtBk\n\t\t\t\t];\n\t\t} else {\n\t\t\tbinding.to = [[], cvtBk];\n\t\t}\n\t}\n}\n\nfunction mergeCtxs(tag, newCtxs, replace) { // Merge updated tagCtxs into tag.tagCtxs\n\tvar tagCtx, newTagCtx,\n\t\tview = tag.tagCtx.view,\n\t\ttagCtxs = tag.tagCtxs || [tag.tagCtx],\n\t\tl = tagCtxs.length,\n\t\trefresh = !newCtxs;\n\n\tnewCtxs = newCtxs || tag._.bnd.call(view.tmpl, (tag.linkCtx || view).data, view, $views);\n\n\tif (replace) {\n\t\t// Replace previous tagCtxs by new ones, rather than merging\n\t\ttagCtxs = tag.tagCtxs = newCtxs;\n\t\ttag.tagCtx = tagCtxs[0];\n\t} else {\n\t\twhile (l--) {\n\t\t\ttagCtx = tagCtxs[l];\n\t\t\tnewTagCtx = newCtxs[l];\n\t\t\t$observable(tagCtx.props).setProperty(newTagCtx.props);\n\t\t\t$extend(tagCtx.ctx, newTagCtx.ctx); // We don't support propagating ctx variables, ~foo, observably, to nested views. So extend, not setProperty...\n\t\t\ttagCtx.args = newTagCtx.args;\n\t\t\tif (refresh) {\n\t\t\t\ttagCtx.tmpl = newTagCtx.tmpl;\n\t\t\t}\n\t\t}\n\t}\n\t$sub._ths(tag, tagCtxs[0]); // tagHandlersFromProps\n\treturn tagCtxs;\n}\n\n//=========\n// Disposal\n//=========\n\nfunction clean(elems) {\n\t// Remove data-link bindings, or contained views\n\tvar l, elem, bindings,\n\t\telemArray = [],\n\t\tlen = elems.length,\n\t\ti = len;\n\twhile (i--) {\n\t\t// Copy into an array, so that deletion of nodes from DOM will not cause our 'i' counter to get shifted\n\t\t// (Note: This seems as fast or faster than elemArray = [].slice.call(elems); ...)\n\t\telemArray.push(elems[i]);\n\t}\n\ti = len;\n\twhile (i--) {\n\t\telem = elemArray[i];\n\t\tif (elem.parentNode) {\n\t\t\t// Has not already been removed from the DOM\n\t\t\tif (bindings = elem._jsvBnd) {\n\t\t\t\t// Get propertyChange bindings for this element\n\t\t\t\t// This may be an element with data-link, or the opening script marker node for a data-linked tag {^{...}}\n\t\t\t\t// bindings is a string with the syntax: \"(&bindingId)*\"\n\t\t\t\tbindings = bindings.slice(1).split(\"&\");\n\t\t\t\telem._jsvBnd = \"\";\n\t\t\t\tl = bindings.length;\n\t\t\t\twhile (l--) {\n\t\t\t\t\t// Remove associated bindings\n\t\t\t\t\tremoveViewBinding(bindings[l], elem._jsvLkEl, elem); // unbind bindings with this bindingId on this view\n\t\t\t\t}\n\t\t\t}\n\t\t\tdisposeTokens(markerNodeInfo(elem) + (elem._df || \"\"));\n\t\t}\n\t}\n}\n\nfunction removeViewBinding(bindId, linkedElemTag, elem) {\n\t// Unbind\n\tvar objId, linkCtx, tag, object, obsId, tagCtxs, l, map, $linkedElem, linkedElem, trigger, view,\n\t\tbinding = bindingStore[bindId];\n\n\tif (linkedElemTag) {\n\t\tif (elem === linkedElemTag.linkedElem[0]) {\n\t\t\telem._jsvLkEl = undefined;\n\t\t\tlinkedElemTag.linkedElem = undefined;\n\t\t}\n\t} else if (binding) {\n\t\tdelete bindingStore[bindId]; // Delete already, so call to onDispose handler below cannot trigger recursive deletion (through recursive call to jQuery cleanData)\n\t\tfor (objId in binding.bnd) {\n\t\t\tobject = binding.bnd[objId];\n\t\t\tobsId = binding.cbId;\n\t\t\tif ($isArray(object)) {\n\t\t\t\t$([object]).off(arrayChangeStr + obsId).off(propertyChangeStr + obsId); // There may be either or both of arrayChange and propertyChange\n\t\t\t} else {\n\t\t\t\t$(object).off(propertyChangeStr + obsId);\n\t\t\t}\n\t\t\tdelete binding.bnd[objId];\n\t\t}\n\n\t\tif (linkCtx = binding.linkCtx) {\n\t\t\tif (tag = linkCtx.tag) {\n\t\t\t\tif (tagCtxs = tag.tagCtxs) {\n\t\t\t\t\tl = tagCtxs.length;\n\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\tif (map = tagCtxs[l].map) {\n\t\t\t\t\t\t\tmap.unmap(); //unobserve\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$linkedElem = tag.linkedElem;\n\t\t\t\tlinkedElem = $linkedElem && $linkedElem[0] || linkCtx.elem;\n\n\t\t\t\tif (trigger = linkedElem && linkedElem._jsvTr) {\n\t\t\t\t\tbindElChange($linkedElem || $(linkedElem), trigger, \"off\");\n\t\t\t\t\tlinkedElem._jsvTr = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (tag.onDispose) {\n\t\t\t\t\ttag.onDispose();\n\t\t\t\t}\n\n\t\t\t\tif (!tag._elCnt) {\n\t\t\t\t\tif (tag._prv) {\n\t\t\t\t\t\ttag._prv.parentNode.removeChild(tag._prv);\n\t\t\t\t\t}\n\t\t\t\t\tif (tag._nxt) {\n\t\t\t\t\t\ttag._nxt.parentNode.removeChild(tag._nxt);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tview = linkCtx.view;\n\t\t\tif (view.type === \"link\") {\n\t\t\t\tview.parent.removeViews(view._.key, undefined, true); // A \"link\" view is associated with the binding, so should be disposed with binding.\n\t\t\t} else {\n\t\t\t\tdelete view._.bnds[bindId];\n\t\t\t}\n\t\t}\n\t\t$sub._cbBnds[binding.cbId] = undefined;\n\t}\n}\n\nfunction $unlink(to) {\n\tif (to) {\n\t\tto = to.jquery ? to : $(to);\n\t\tto.each(function() {\n\t\t\tvar innerView;\n\t\t\t//TODO fix this for better perf. Rather that calling inner view multiple times which does querySelectorAll each time, consider a single querySelectorAll\n\t\t\t// or simply call view.removeViews() on the top-level views under the target 'to' node, then clean(...)\n\t\t\twhile ((innerView = $view(this, true)) && innerView.parent) {\n\t\t\t\tinnerView.parent.removeViews(innerView._.key, undefined, true);\n\t\t\t}\n\t\t\tclean(this.getElementsByTagName(\"*\"));\n\t\t});\n\t\tclean(to);\n\t} else {\n\t\t// Call to $.unlink() is equivalent to $.unlink(true, \"body\")\n\t\tif (activeBody) {\n\t\t\t$(activeBody)\n\t\t\t\t.off(elementChangeStr, elemChangeHandler)\n\t\t\t\t.off('blur', '[contenteditable]', elemChangeHandler);\n\t\t\tactiveBody = undefined;\n\t\t}\n\t\ttopView.removeViews();\n\t\tclean(document.body.getElementsByTagName(\"*\"));\n\t}\n}\n\n//========\n// Helpers\n//========\n\nfunction getContextCb(view) {\n\t// TODO Consider exposing or allowing override, as public API\n\treturn function(path, object) {\n\t\t// TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on\n\t\t// the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times\n\t\tvar tokens, tag,\n\t\t\titems = [object];\n\t\tif (view && path) {\n\t\t\tif (path._jsv) {\n\t\t\t\treturn path._jsv.call(view.tmpl, object, view, $views);\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"~\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"~a.b.c\" string:\n\t\t\t\t// [helperObject 'a', \"a.b.c\" currentDataItem] so currentDataItem becomes the object for subsequent paths.\n\t\t\t\tif (path.slice(0, 4) === \"~tag\") {\n\t\t\t\t\ttag = view.ctx;\n\t\t\t\t\tif (path.charAt(4) === \".\") {\n\t\t\t\t\t\t// \"~tag.xxx\"\n\t\t\t\t\t\ttokens = path.slice(5).split(\".\");\n\t\t\t\t\t\ttag = tag.tag;\n\t\t\t\t\t}\n\t\t\t\t\tif (tokens) {\n\t\t\t\t\t\treturn tag ? [tag, tokens.join(\".\"), object] : [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpath = path.slice(1).split(\".\");\n\t\t\t\tif (object = view.hlp(path.shift())) {\n\t\t\t\t\tif (path.length) {\n\t\t\t\t\t\titems.unshift(path.join(\".\"));\n\t\t\t\t\t}\n\t\t\t\t\titems.unshift(object);\n\t\t\t\t}\n\t\t\t\treturn object ? items : [];\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"#\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"#a.b.c\" string: [view, \"a.b.c\" currentDataItem]\n\t\t\t\t// so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes.\n\t\t\t\treturn path === \"#data\" ? [] : [view, path.replace(rViewPath, \"\"), object];\n\t\t\t}\n\t\t}\n\t};\n}\n\nfunction inputAttrib(elem) {\n\treturn elem.type === CHECKBOX ? elem[CHECKED] : elem.value;\n}\n\n//========================== Initialize ==========================\n\n//=====================\n// JsRender integration\n//=====================\n\n$sub.onStore.template = function(name, item) {\n\titem.link = tmplLink;\n\tif (name) {\n\t\t$.link[name] = function() {\n\t\t\treturn tmplLink.apply(item, arguments);\n\t\t};\n\t}\n};\n\n$sub.viewInfos = viewInfos; // Expose viewInfos() as public helper method\n\n// Initialize default delimiters\n($viewsSettings.delimiters = function() {\n\tvar delimChars = oldJsvDelimiters.apply(0, arguments);\n\tdelimOpenChar0 = delimChars[0];\n\tdelimOpenChar1 = delimChars[1];\n\tdelimCloseChar0 = delimChars[2];\n\tdelimCloseChar1 = delimChars[3];\n\tlinkChar = delimChars[4];\n\trTagDatalink = new RegExp(\"(?:^|\\\\s*)([\\\\w-]*)(\\\\\" + linkChar + \")?(\\\\\" + delimOpenChar1 + $sub.rTag + \"(:\\\\w*)?\\\\\" + delimCloseChar0 + \")\", \"g\");\n\n\t// Default rTag: attr bind tagExpr tag converter colon html comment code params\n\t// (?:^|\\s*)([\\w-]*)(\\^)?({(?:(?:(\\w+(?=[\\/\\s}]))|(?:(\\w+)?(:)|(>)|!--((?:[^-]|-(?!-))*)--|(\\*)))\\s*((?:[^}]|}(?!}))*?))})\n\treturn this;\n})(); // jshint ignore:line\n\n//====================================\n// Additional members for linked views\n//====================================\n\nfunction transferViewTokens(prevNode, nextNode, parentElem, id, viewOrTagChar, refresh) {\n\t// Transfer tokens on prevNode of viewToRemove/viewToRefresh to nextNode or parentElem._df\n\tvar i, l, vwInfos, vwInfo, viewOrTag, viewId, tokens,\n\t\tprecedingLength = 0,\n\t\temptyView = prevNode === nextNode;\n\n\tif (prevNode) {\n\t\t// prevNode is either the first node in the viewOrTag, or has been replaced by the vwInfos tokens string\n\t\tvwInfos = viewInfos(prevNode) || [];\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\t// Step through views or tags on the prevNode\n\t\t\tvwInfo = vwInfos[i];\n\t\t\tviewId = vwInfo.id;\n\t\t\tif (viewId === id && vwInfo.ch === viewOrTagChar) {\n\t\t\t\tif (refresh) {\n\t\t\t\t\t// This is viewOrTagToRefresh, this is the last viewOrTag to process...\n\t\t\t\t\tl = 0;\n\t\t\t\t} else {\n\t\t\t\t\t// This is viewOrTagToRemove, so we are done...\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!emptyView) {\n\t\t\t\tviewOrTag = vwInfo.ch === \"_\"\n\t\t\t\t\t? viewStore[viewId]\n\t\t\t\t\t: bindingStore[viewId].linkCtx.tag;\n\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t// A \"#m\" token\n\t\t\t\t\tviewOrTag._prv = nextNode;\n\t\t\t\t} else if (vwInfo.close) {\n\t\t\t\t\t// A \"/m\" token\n\t\t\t\t\tviewOrTag._nxt = nextNode;\n\t\t\t\t}\n\t\t\t}\n\t\t\tprecedingLength += viewId.length + 2;\n\t\t}\n\n\t\tif (precedingLength) {\n\t\t\tprevNode.setAttribute(jsvAttrStr, prevNode.getAttribute(jsvAttrStr).slice(precedingLength));\n\t\t}\n\t\ttokens = nextNode ? nextNode.getAttribute(jsvAttrStr) : parentElem._df;\n\t\tif (l = tokens.indexOf(\"/\" + id + viewOrTagChar) + 1) {\n\t\t\ttokens = vwInfos._tkns.slice(0, precedingLength) + tokens.slice(l + (refresh ? -1 : id.length + 1));\n\t\t}\n\t\tif (tokens) {\n\t\t\tif (nextNode) {\n\t\t\t\t// If viewOrTagToRemove was an empty viewOrTag, we will remove both #n and /n\n\t\t\t\t// (and any intervening tokens) from the nextNode (=== prevNode)\n\t\t\t\t// If viewOrTagToRemove was not empty, we will take tokens preceding #n from prevNode,\n\t\t\t\t// and concatenate with tokens following /n on nextNode\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, tokens);\n\t\t\t} else {\n\t\t\t\tsetDefer(parentElem, tokens);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// !prevNode, so there may be a deferred nodes token on the parentElem. Remove it.\n\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + viewOrTagChar));\n\t\tif (!refresh && !nextNode) {\n\t\t\t// If this viewOrTag is being removed, and there was no .nxt, remove closing token from deferred tokens\n\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + viewOrTagChar));\n\t\t}\n\t}\n}\n\nfunction disposeTokens(tokens) {\n\tvar i, l, vwItem, vwInfos;\n\tif (vwInfos = viewInfos(tokens, true, rOpenMarkers)) {\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\tvwItem = vwInfos[i];\n\t\t\tif (vwItem.ch === \"_\") {\n\t\t\t\tif ((vwItem = viewStore[vwItem.id]) && vwItem.type) {\n\t\t\t\t\t// If this is the _prv (prevNode) for a view, remove the view\n\t\t\t\t\t// - unless view.type is undefined, in which case it is already being removed\n\t\t\t\t\tvwItem.parent.removeViews(vwItem._.key, undefined, true);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tremoveViewBinding(vwItem.id); // unbind bindings with this bindingId on this view\n\t\t\t}\n\t\t}\n\t}\n}\n\n//====================================\n// Add link methods to data-linked view or tag\n//====================================\nfunction addLinkMethods(tagOrView, isTag) {\n\n\ttagOrView.contents = function(deep, select) {\n\t\t// For a view or a tag, return jQuery object with the content nodes,\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is getContents(selector)\n\t\t\tselect = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\t\tvar filtered,\n\t\t\tnodes = $(this.nodes());\n\t\tif (nodes[0]) {\n\t\t\tfiltered = select ? nodes.filter(select) : nodes;\n\t\t\tnodes = deep && select ? filtered.add(nodes.find(select)) : filtered;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.nodes = function(withMarkers, prevNode, nextNode) {\n\t\t// For a view or a tag, return top-level nodes\n\t\t// Do not return any script marker nodes, unless withMarkers is true\n\t\t// Optionally limit range, by passing in prevNode or nextNode parameters\n\n\t\tvar node,\n\t\t\tself = this,\n\t\t\telCnt = self._elCnt,\n\t\t\tprevIsFirstNode = !prevNode && elCnt,\n\t\t\tnodes = [];\n\n\t\tprevNode = prevNode || self._prv;\n\t\tnextNode = nextNode || self._nxt;\n\n\t\tnode = prevIsFirstNode\n\t\t\t? (prevNode === self._nxt\n\t\t\t\t? self.parentElem.lastSibling\n\t\t\t\t: prevNode)\n\t\t\t: (self._.inline === false\n\t\t\t\t? prevNode || self.linkCtx.elem.firstChild\n\t\t\t\t: prevNode && prevNode.nextSibling);\n\n\t\twhile (node && (!nextNode || node !== nextNode)) {\n\t\t\tif (withMarkers || elCnt || node.tagName !== SCRIPT) {\n\t\t\t\t// All the top-level nodes in the view\n\t\t\t\t// (except script marker nodes, unless withMarkers = true)\n\t\t\t\t// (Note: If a script marker node, viewInfo.elCnt undefined)\n\t\t\t\tnodes.push(node);\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.childTags = function(deep, tagName) {\n\t\t// For a view or a tag, return child tags - at any depth, or as immediate children only.\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is childTags(tagName) - which looks for top-level tags of given tagName\n\t\t\ttagName = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\n\t\tvar self = this,\n\t\t\tview = self.link ? self : self.tagCtx.view, // this may be a view or a tag. If a tag, get the view from tag.view.tagCtx\n\t\t\tprevNode = self._prv,\n\t\t\telCnt = self._elCnt,\n\t\t\ttags = [];\n\n\t\tview.link(\n\t\t\tundefined,\n\t\t\tself.parentElem,\n\t\t\telCnt ? prevNode && prevNode.previousSibling : prevNode,\n\t\t\tself._nxt,\n\t\t\tundefined,\n\t\t\t{get:{\n\t\t\t\ttags: tags,\n\t\t\t\tdeep: deep,\n\t\t\t\tname: tagName,\n\t\t\t\tid: self.link ? self._.id + \"_\" : self._tgId + \"^\"\n\t\t\t}}\n\t\t);\n\t\treturn tags;\n\t};\n\n\ttagOrView.refresh = function(sourceValue) {\n\t\tvar promise, attr,\n\t\t\ttag = this,\n\t\t\tlinkCtx = tag.linkCtx,\n\t\t\tview = tag.tagCtx.view;\n\n\t\tif (tag.disposed) { error(\"Removed tag\"); }\n\t\tif (sourceValue === undefined) {\n\t\t\tsourceValue = $views._tag(tag, view, view.tmpl, mergeCtxs(tag), true); // Get rendered HTML for tag, based on refreshed tagCtxs\n\t\t}\n\t\tif (sourceValue + \"\" === sourceValue) {\n\t\t\t// If no rendered content, sourceValue will not be a string (can be 0 or undefined)\n\t\t\tattr = tag._.inline ? HTML : (linkCtx.attr || defaultAttr(tag.parentElem, true));\n\t\t\tpromise = updateContent(sourceValue, linkCtx, attr, tag);\n\t\t}\n\n\t\tcallAfterLink(tag);\n\t\treturn promise || tag;\n\t};\n\n\ttagOrView.update = function(value) {\n\t\tvar linkedElem = this.linkedElem;\n\t\tif (linkedElem) {\n\t\t\telemChangeHandler({\n\t\t\t\ttarget: linkedElem[0]\n\t\t\t}, undefined, value);\n\t\t}\n\t};\n\n\tif (isTag) {\n\t\ttagOrView.domChange = function() { // domChange notification support\n\t\t\tvar elem = this.parentElem,\n\t\t\t\thasListener = $.hasData(elem) && $._data(elem).events,\n\t\t\t\tdomChangeNotification = \"jsv-domchange\";\n\n\t\t\tif (hasListener && hasListener[domChangeNotification]) {\n\t\t\t\t// Only trigger handler if there is a handler listening for this event. (Note using triggerHandler - so no event bubbling.)\n\t\t\t\t$(elem).triggerHandler(domChangeNotification, arguments);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t\t// Note: a linked view will also, after linking have nodes[], _prv (prevNode), _nxt (nextNode) ...\n\t\ttagOrView.addViews = function(index, dataItems, tmpl) {\n\t\t\t// if view is not an array view, do nothing\n\t\t\tvar i, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\titemsCount = dataItems.length,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (!self._.useKey && itemsCount && (tmpl = self.tmpl)) {\n\t\t\t\t// view is of type \"array\"\n\t\t\t\t// Use passed-in template if provided, since self added view may use a different template than the original one used to render the array.\n\t\t\t\tviewsCount = views.length + itemsCount;\n\n\t\t\t\tif (viewsCount === self.data.length // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\t\t&& renderAndLink(self, index, tmpl, views, dataItems, self.ctx) !== false) {\n\t\t\t\t\tfor (i = index + itemsCount; i < viewsCount; i++) {\n\t\t\t\t\t\t$observable(views[i]).setProperty(\"index\", i);\n\t\t\t\t\t\t// This is fixing up index, but not key, and not index on child views. From child views, use view.getIndex()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn self;\n\t\t};\n\n\t\ttagOrView.removeViews = function(index, itemsCount, keepNodes) {\n\t\t\t// view.removeViews() removes all the child views\n\t\t\t// view.removeViews(index) removes the child view with specified index or key\n\t\t\t// view.removeViews(index, count) removes the specified nummber of child views, starting with the specified index\n\t\t\tfunction removeView(index) {\n\t\t\t\tvar id, bindId, parentElem, prevNode, nextNode, nodesToRemove,\n\t\t\t\t\tviewToRemove = views[index];\n\n\t\t\t\tif (viewToRemove && viewToRemove.link) {\n\t\t\t\t\tid = viewToRemove._.id;\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tnodesToRemove = viewToRemove.nodes();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove child views, without removing nodes\n\t\t\t\t\tviewToRemove.removeViews(undefined, undefined, true);\n\n\t\t\t\t\tviewToRemove.type = undefined; // Set type to undefined: used as a flag that this view is being removed\n\t\t\t\t\tprevNode = viewToRemove._prv;\n\t\t\t\t\tnextNode = viewToRemove._nxt;\n\t\t\t\t\tparentElem = viewToRemove.parentElem;\n\t\t\t\t\t// If prevNode and nextNode are the same, the view is empty\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tif (viewToRemove._elCnt) {\n\t\t\t\t\t\t\t// if keepNodes is false (and transferring of tokens has not already been done at a higher level)\n\t\t\t\t\t\t\t// then transfer tokens from prevNode which is being removed, to nextNode.\n\t\t\t\t\t\t\ttransferViewTokens(prevNode, nextNode, parentElem, id, \"_\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(nodesToRemove).remove();\n\t\t\t\t\t}\n\t\t\t\t\tif (!viewToRemove._elCnt) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tprevNode.parentNode.removeChild(prevNode); // (prevNode.parentNode is parentElem, except if jQuery Mobile or similar has inserted an intermediate wrapper\n\t\t\t\t\t\t\tnextNode.parentNode.removeChild(nextNode);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\t\t\t\t\tsetArrayChangeLink(viewToRemove);\n\t\t\t\t\tfor (bindId in viewToRemove._.bnds) {\n\t\t\t\t\t\tremoveViewBinding(bindId);\n\t\t\t\t\t}\n\t\t\t\t\tdelete viewStore[id];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar current, view, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\tisArray = !self._.useKey,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (isArray) {\n\t\t\t\tviewsCount = views.length;\n\t\t\t}\n\t\t\tif (index === undefined) {\n\t\t\t\t// Remove all child views\n\t\t\t\tif (isArray) {\n\t\t\t\t\t// views and data are arrays\n\t\t\t\t\tcurrent = viewsCount;\n\t\t\t\t\twhile (current--) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = [];\n\t\t\t\t} else {\n\t\t\t\t\t// views and data are objects\n\t\t\t\t\tfor (view in views) {\n\t\t\t\t\t\t// Remove by key\n\t\t\t\t\t\tremoveView(view);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = {};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (itemsCount === undefined) {\n\t\t\t\t\tif (isArray) {\n\t\t\t\t\t\t// The parentView is data array view.\n\t\t\t\t\t\t// Set itemsCount to 1, to remove this item\n\t\t\t\t\t\titemsCount = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Remove child view with key 'index'\n\t\t\t\t\t\tremoveView(index);\n\t\t\t\t\t\tdelete views[index];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isArray && itemsCount\n\t\t\t\t\t&& viewsCount - itemsCount === self.data.length) { // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\tcurrent = index + itemsCount;\n\t\t\t\t\t// Remove indexed items (parentView is data array view);\n\t\t\t\t\twhile (current-- > index) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tviews.splice(index, itemsCount);\n\t\t\t\t\tif (viewsCount = views.length) {\n\t\t\t\t\t\t// Fixup index on following view items...\n\t\t\t\t\t\twhile (index < viewsCount) {\n\t\t\t\t\t\t\t$observable(views[index]).setProperty(\"index\", index++);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\ttagOrView.refresh = function(context) {\n\t\t\tvar self = this,\n\t\t\t\tparent = self.parent;\n\n\t\t\tif (parent) {\n\t\t\t\trenderAndLink(self, self.index, self.tmpl, parent.views, self.data, context, true);\n\t\t\t\tsetArrayChangeLink(self);\n\t\t\t}\n\t\t\treturn self;\n\t\t};\n\n\t\ttagOrView.link = viewLink;\n\t}\n}\n\n//========================\n// JsViews-specific converters\n//========================\n\n$converters.merge = function(val) {\n\t// Special converter used in data-linking to space-separated lists, such as className:\n\t// Currently only supports toggle semantics - and has no effect if toggle string is not specified\n\t// data-link=\"class{merge:boolExpr toggle=className}\"\n\tvar regularExpression,\n\t\tcurrentValue = this.linkCtx._val || \"\",\n\t\ttoggle = this.tagCtx.props.toggle;\n\n\tif (toggle) {\n\t\t// We are toggling the class specified by the toggle property,\n\t\t// and the boolean val binding is driving the insert/remove toggle\n\n\t\tregularExpression = toggle.replace(/[\\\\^$.|?*+()[{]/g, \"\\\\$&\");\n\t\t// Escape any regular expression special characters (metacharacters) within the toggle string\n\t\tregularExpression = \"(\\\\s(?=\" + regularExpression + \"$)|(\\\\s)|^)(\" + regularExpression + \"(\\\\s|$))\";\n\t\t// Example: /(\\s(?=myclass$)|(\\s)|^)?(myclass(\\s|$))/ - so matches (\" myclass\" or \" \" or ^ ) followed by (\"myclass \" or \"myclass$\") where ^/$ are beginning/end of string\n\t\tcurrentValue = currentValue.replace(new RegExp(regularExpression), \"$2\");\n\t\tval = currentValue + (val ? (currentValue && \" \") + toggle : \"\");\n\t}\n\treturn val;\n};\n\n//========================\n// JsViews-specific tags\n//========================\n\n$tags(\"on\", {\n\tattr: NONE,\n\tinit: function(tagCtx) {\n\t\tvar tag = this,\n\t\t\tprops = tagCtx.props,\n\t\t\tcontent = tagCtx.content,\n\t\t\telemType = props.elem;\n\n\t\tif (tag._.inline) {\n\t\t\ttag.attr = HTML;\n\t\t\telemType = (elemType || \"span\") + \">\";\n\t\t\ttag.template = \"<\" + elemType + (props.label || content.markup || tagCtx.params.args[0]) + \" 1) {\n\t\t\t// Perf optimization for common cases\n\n\t\t\tnode = \"\" + node === node\n\t\t\t\t? $(node)[0]\n\t\t\t\t: node.jquery\n\t\t\t\t\t? node[0]\n\t\t\t\t\t: node;\n\n\t\t\tif (node) {\n\t\t\t\tif (inner) {\n\t\t\t\t\tgetInnerView(node._df, true);\n\t\t\t\t\tif (!view) {\n\t\t\t\t\t\t// Treat supplied node as a container element and return the first view encountered.\n\t\t\t\t\t\telems = qsa ? node.querySelectorAll(bindElsSel) : $(bindElsSel, node).get();\n\t\t\t\t\t\tl = elems.length;\n\t\t\t\t\t\tfor (i = 0; !view && i < l; i++) {\n\t\t\t\t\t\t\tgetInnerView(elems[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn view;\n\t\t\t\t}\n\t\t\t\twhile (node) {\n\t\t\t\t\t// Move back through siblings and up through parents to find preceding node which is a _prv (prevNode)\n\t\t\t\t\t// script marker node for a non-element-content view, or a _prv (first node) for an elCnt view\n\t\t\t\t\tif (vwInfos = viewInfos(node, undefined, rViewMarkers)) {\n\t\t\t\t\t\tl = vwInfos.length;\n\t\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\t\tview = vwInfos[l];\n\t\t\t\t\t\t\tif (view.open) {\n\t\t\t\t\t\t\t\tif (level < 1) {\n\t\t\t\t\t\t\t\t\tview = viewStore[view.id];\n\t\t\t\t\t\t\t\t\treturn view && type ? view.get(type) : view || topView;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlevel--;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// level starts at zero. If we hit a view.close, then we move level to 1, and we don't return a view until\n\t\t\t\t\t\t\t\t// we are back at level zero (or a parent view with level < 0)\n\t\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.previousSibling || node.parentNode;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn topView;\n\t},\n\n\tlink: $views.link = $link,\n\tunlink: $views.unlink = $unlink,\n\n\t//=====================\n\t// override $.cleanData\n\t//=====================\n\tcleanData: function(elems) {\n\t\tif (elems.length && isCleanCall) {\n\t\t\t// Remove JsViews bindings. Also, remove from the DOM any corresponding script marker nodes\n\t\t\tclean(elems);\n\t\t}\n\t\toldCleanData.apply($, arguments);\n\t}\n});\n\n// Possible future addition - e.g. for ckeditor tag control\n//$views.utility = {\n//\tvalidate: function(html) {\n//\t\ttry {\n//\t\t\ttopView.link(undefined, document.createElement(\"div\"), undefined, undefined, html, undefined, undefined, 1);\n//\t\t}\n//\t\tcatch (e) {\n//\t\t\treturn e.message;\n//\t\t}\n//\t}\n//};\n\n//===============================\n// Extend jQuery instance plugins\n//===============================\n\n$extend($.fn, {\n\tlink: function(expr, from, context, noIteration, parentView, prevNode, nextNode) {\n\t\treturn $link(expr, this, from, context, noIteration, parentView, prevNode, nextNode);\n\t},\n\tunlink: function() {\n\t\treturn $unlink(this);\n\t},\n\tview: function(inner, type) {\n\t\treturn $view(this[0], inner, type);\n\t}\n});\n\n//==============================================================================\n// Override jQuery methods that call our overridden cleanData, for disposal etc.\n//==============================================================================\n\n$.each([HTML, \"replaceWith\", \"empty\", \"remove\"], function(i, name) {\n\tvar oldFn = $.fn[name];\n\t$.fn[name] = function() {\n\t\tvar result;\n\t\tisCleanCall = 1; // Make sure cleanData does disposal only when coming from these calls.\n\t\ttry {\n\t\t\tresult = oldFn.apply(this, arguments);\n\t\t}\n\t\tfinally {\n\t\t\tisCleanCall = 0;\n\t\t}\n\t\treturn result;\n\t};\n});\n\n//===============\n// Extend topView\n//===============\n\naddLinkMethods($extend(topView = $sub.topView, {tmpl: {links: {}}}));\n\nviewStore = { 0: topView }; // Top-level view\n\n//=========================\n// Extend $.views.settings\n//=========================\n\n$viewsSettings({\n\twrapMap: wrapMap = {\n\t\toption: [1, \"\"],\n\t\tlegend: [1, \"
\", \"
\"],\n\t\tarea: [1, \"\", \"\"],\n\t\tparam: [1, \"\", \"\"],\n\t\tthead: [1, \"
\", \"
\"],\n\t\ttr: [2, \"\", \"
\"],\n\t\ttd: [3, \"\", \"
\"],\n\t\tcol: [2, \"\", \"
\"],\n\t\tsvg_ns: [1, \"\", \"\"],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\tdiv: $.support.htmlSerialize ? [0, \"\", \"\"] : [1, \"X
\", \"
\"]\n\t},\n\tlinkAttr: $viewsLinkAttr = \"data-link\",\n\tmerge: {\n\t\tinput: {\n\t\t\tfrom: inputAttrib, to: \"value\"\n\t\t},\n\t\ttextarea: valueBinding,\n\t\tselect: valueBinding,\n\t\toptgroup: {\n\t\t\tto: \"label\"\n\t\t}\n\t},\n\tjsrDbgMode: $viewsSettings.debugMode, // debugMode for JsRender\n\tdebugMode: function(debugMode) { // debugMode for JsViews\n\t\t$viewsSettings._dbgMode = debugMode !== false;\n\t\tif ($viewsSettings._dbgMode) {\n\t\t\tglobal._jsv = { // In debug mode create global _jsv, for accessing views, etc\n\t\t\t\tviews: viewStore,\n\t\t\t\tbindings: bindingStore\n\t\t\t};\n\t\t} else if (global._jsv) {\n\t\t\tglobal._jsv = undefined; // In IE8 cannot do delete global._jsv\n\t\t}\n\t},\n\tjsv: function() {\n\t\t$viewsSettings.debugMode($viewsSettings._dbgMode);\n\t\t$viewsLinkAttr = $viewsSettings.linkAttr;\n\t\terror = $views._err;\n\t\tlinkViewsSel = bindElsSel + \",[\" + $viewsLinkAttr + \"]\";\n\t\tnoDomLevel0 = $viewsSettings.noDomLevel0;\n\t\twrapMap.optgroup = wrapMap.option;\n\t\twrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n\t\twrapMap.th = wrapMap.td;\n\t}\n});\n\n\treturn $;\n}));\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/jsrender.js b/jsrender.js index 0d46f83..e3c1aaa 100644 --- a/jsrender.js +++ b/jsrender.js @@ -1,4 +1,4 @@ -/*! JsRender v0.9.71 (Beta): http://jsviews.com/#jsrender */ +/*! JsRender v0.9.72 (Beta): http://jsviews.com/#jsrender */ /*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */ /* * Best-of-breed templating in browser or on Node.js. @@ -44,7 +44,7 @@ var global = (0, eval)('this'), // jshint ignore:line $ = $ && $.fn ? $ : global.jQuery; // $ is jQuery passed in by CommonJS loader (Browserify), or global jQuery. -var versionNumber = "v1.0.0-beta", +var versionNumber = "v0.9.72", jsvStoreName, rTag, rTmplString, topView, $views, //TODO tmplFnsCache = {}, @@ -55,7 +55,7 @@ var versionNumber = "v1.0.0-beta", rPath = /^(!*?)(?:null|true|false|\d[\d.]*|([\w$]+|\.|~([\w$]+)|#(view|([\w$]+))?)([\w$.^]*?)(?:[.[^]([\w$]+)\]?)?)$/g, // not object helper view viewProperty pathTokens leafToken - rParams = /(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(!*?[#~]?[\w$.^]+)?\s*((\+\+|--)|\+|-|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?[#~]?[\w$.^]+)([([])?)|(,\s*)|(\(?)\\?(?:(')|("))|(?:\s*(([)\]])(?=\s*[.^]|\s*$|[^\(\[])|[)\]])([([]?))|(\s+)/g, + rParams = /(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(!*?[#~]?[\w$.^]+)?\s*((\+\+|--)|\+|-|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?[#~]?[\w$.^]+)([([])?)|(,\s*)|(\(?)\\?(?:(')|("))|(?:\s*(([)\]])(?=\s*[.^]|\s*$|[^([])|[)\]])([([]?))|(\s+)/g, // lftPrn0 lftPrn bound path operator err eq path2 prn comma lftPrn2 apos quot rtPrn rtPrnDot prn2 space // (left paren? followed by (path? followed by operator) or (path followed by left paren?)) or comma or apos or quot or right paren or space @@ -230,15 +230,15 @@ function $viewsDelimiters(openChars, closeChars, link) { // Build regex with new delimiters // [tag (followed by / space or }) or cvtr+colon or html or code] followed by space+params then convertBack? rTag = "(?:(\\w+(?=[\\/\\s\\" + delimCloseChar0 + "]))|(\\w+)?(:)|(>)|(\\*))\\s*((?:[^\\" - + delimCloseChar0 + "]|\\" + delimCloseChar0 + "(?!\\" + delimCloseChar1 + "))*?)(:\\w*)?"; + + delimCloseChar0 + "]|\\" + delimCloseChar0 + "(?!\\" + delimCloseChar1 + "))*?)"; // make rTag available to JsViews (or other components) for parsing binding expressions $sub.rTag = "(?:" + rTag + ")"; // { ^? { tag+params slash? or closingTag or comment - rTag = new RegExp("(?:" + openChars + rTag + "(\\/)?|\\" + delimOpenChar0 + "\\" + delimOpenChar1 + "(?:(?:\\/(\\w+))|!--[\\s\\S]*?--))" + closeChars, "g"); + rTag = new RegExp("(?:" + openChars + rTag + "(\\/)?|\\" + delimOpenChar0 + "\\" + delimOpenChar1 + "(?:(?:\\/(\\w+))\\s*|!--[\\s\\S]*?--))" + closeChars, "g"); - // Default: bind tagName cvt cln html code params cvtBk slash closeBlk comment - // /(?:{(\^)?{(?:(\w+(?=[/\s}]))|(\w+)?(:)|(>)|(\*))\s*((?:[^}]|}(?!}))*?)(:\w*)?(\/)?|{{(?:(?:\/(\w+))|!--[\s\S]*?--))}}/g + // Default: bind tagName cvt cln html code params slash closeBlk comment + // /(?:{(\^)?{(?:(\w+(?=[/\s}]))|(\w+)?(:)|(>)|(\*))\s*((?:[^}]|}(?!}))*?)(\/)?|{{(?:(?:\/(\w+))|!--[\s\S]*?--))}}/g rTmplString = new RegExp("<.*>|([^\\\\]|^)[{}]|" + openChars + ".*" + closeChars); // rTmplString looks for html tags or { or } char not preceded by \\, or JsRender tags {{xxx}}. Each of these strings are considered @@ -382,7 +382,7 @@ function convertVal(converter, view, tagCtx, onError) { tagName: ":", cvt: converter, flow: true, - tagCtx: tagCtx, + tagCtx: tagCtx }); if (linkCtx) { linkCtx.tag = tag; @@ -1106,6 +1106,7 @@ function renderWithViews(tmpl, data, context, noIteration, view, key, onRender, context = context || {}; context.link = false; } + if (itemVar = tagCtx.props.itemVar) { if (itemVar.charAt(0) !== "~") { syntaxError("Use itemVar='~myItem'"); @@ -1223,11 +1224,11 @@ function tmplFn(markup, tmpl, isLinkExpr, convertBack, hasElse) { } } - function parseTag(all, bind, tagName, converter, colon, html, codeTag, params, convertBack, slash, closeBlock, index) { + function parseTag(all, bind, tagName, converter, colon, html, codeTag, params, slash, closeBlock, index) { /* - bind tagName cvt cln html code params cvtBk slash closeBlk comment -/(?:{(\^)?{(?:(\w+(?=[/\s}]))|(\w+)?(:)|(>)|(\*))\s*((?:[^}]|}(?!}))*?)(:\w*)?(\/)?|{{(?:(?:\/(\w+))|!--[\s\S]*?--))}}/g + bind tagName cvt cln html code params slash closeBlk comment +/(?:{(\^)?{(?:(\w+(?=[/\s}]))|(\w+)?(:)|(>)|(\*))\s*((?:[^}]|}(?!}))*?)(\/)?|{{(?:(?:\/(\w+))|!--[\s\S]*?--))}}/g (?: {(\^)?{ bind @@ -1246,7 +1247,6 @@ function tmplFn(markup, tmpl, isLinkExpr, convertBack, hasElse) { ( params (?:[^}]|}(?!}))*? ) - (:\w*)? convertBack (\/)? slash | {{ @@ -1260,16 +1260,9 @@ function tmplFn(markup, tmpl, isLinkExpr, convertBack, hasElse) { */ - if (codeTag && convertBack) { - params = convertBack; - convertBack = undefined; - } - if (codeTag && bind || convertBack && !colon || slash && !tagName) { + if (codeTag && bind || slash && !tagName || params && params.slice(-1) === ":") { syntaxError(all); } - if (convertBack) { - convertBack = convertBack.slice(1); - } // Build abstract syntax tree (AST): [tagName, converter, params, content, hash, bindings, contentMarkup] if (html) { @@ -1384,6 +1377,9 @@ function tmplFn(markup, tmpl, isLinkExpr, convertBack, hasElse) { // result = markup; if (isLinkExpr) { + if (convertBack !== undefined) { + markup = markup.slice(0, -convertBack.length - 2) + delimCloseChar1; + } markup = delimOpenChar0 + markup + delimCloseChar1; } @@ -1443,8 +1439,8 @@ function paramStructure(parts, type) { function parseParams(params, pathBindings, tmpl) { function parseTokens(all, lftPrn0, lftPrn, bound, path, operator, err, eq, path2, prn, comma, lftPrn2, apos, quot, rtPrn, rtPrnDot, prn2, space, index, full) { - // /(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(!*?[#~]?[\w$.^]+)?\s*((\+\+|--)|\+|-|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?[#~]?[\w$.^]+)([([])?)|(,\s*)|(\(?)\\?(?:(')|("))|(?:\s*(([)\]])(?=\s*[.^]|\s*$|\s)|[)\]])([([]?))|(\s+)/g, - // lftPrn0 lftPrn bound path operator err eq path2 prn comma lftPrn2 apos quot rtPrn rtPrnDot prn2 space + // /(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(!*?[#~]?[\w$.^]+)?\s*((\+\+|--)|\+|-|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?[#~]?[\w$.^]+)([([])?)|(,\s*)|(\(?)\\?(?:(')|("))|(?:\s*(([)\]])(?=\s*[.^]|\s*$|[^([])|[)\]])([([]?))|(\s+)/g, + // lftPrn0 lftPrn bound path operator err eq path2 prn comma lftPrn2 apos quot rtPrn rtPrnDot prn2 space // (left paren? followed by (path? followed by operator) or (path followed by paren?)) or comma or apos or quot or right paren or space bound = bindings && bound; if (bound && !eq) { @@ -1460,8 +1456,8 @@ function parseParams(params, pathBindings, tmpl) { var expr, exprFn, binds, theOb, newOb; function parsePath(allPath, not, object, helper, view, viewProperty, pathTokens, leafToken) { - // rPath = /^(?:null|true|false|\d[\d.]*|(!*?)([\w$]+|\.|~([\w$]+)|#(view|([\w$]+))?)([\w$.^]*?)(?:[.[^]([\w$]+)\]?)?)$/g, - // none object helper view viewProperty pathTokens leafToken + //rPath = /^(!*?)(?:null|true|false|\d[\d.]*|([\w$]+|\.|~([\w$]+)|#(view|([\w$]+))?)([\w$.^]*?)(?:[.[^]([\w$]+)\]?)?)$/g, + // not object helper view viewProperty pathTokens leafToken var subPath = object === "."; if (object) { path = path.slice(not.length); diff --git a/jsrender.min.js b/jsrender.min.js index e141bd6..495a4a2 100644 --- a/jsrender.min.js +++ b/jsrender.min.js @@ -1,4 +1,4 @@ -/*! JsRender v0.9.71 (Beta): http://jsviews.com/#jsrender */ +/*! JsRender v0.9.72 (Beta): http://jsviews.com/#jsrender */ /*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */ -!function(e){var t=(0,eval)("this"),n=t.jQuery;"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=n?e(n):function(t){if(t&&!t.fn)throw"Provide jQuery or null";return e(t)}:e(!1)}(function(e){"use strict";function t(e,t){return function(){var n,r=this,i=r.base;return r.base=e,n=t.apply(r,arguments),r.base=i,n}}function n(e,n){return G(n)&&(n=t(e?e._d?e:t(a,e):a,n),n._d=1),n}function r(e,t){for(var r in t.props)_e.test(r)&&(e[r]=n(e[r],t.props[r]))}function i(e){return e}function a(){return""}function s(e){try{throw"dbg breakpoint"}catch(t){}return this.base?this.baseApply(arguments):e}function o(e){re._dbgMode=e!==!1}function d(t){this.name=(e.link?"JsViews":"JsRender")+" Error",this.message=t||this.name}function p(e,t){var n;for(n in t)e[n]=t[n];return e}function l(e,t,n){return(0!==this||e)&&(se=e?e.charAt(0):se,oe=e?e.charAt(1):oe,de=t?t.charAt(0):de,pe=t?t.charAt(1):pe,le=n||le,e="\\"+se+"(\\"+le+")?\\"+oe,t="\\"+de+"\\"+pe,D="(?:(\\w+(?=[\\/\\s\\"+de+"]))|(\\w+)?(:)|(>)|(\\*))\\s*((?:[^\\"+de+"]|\\"+de+"(?!\\"+pe+"))*?)(:\\w*)?",ne.rTag="(?:"+D+")",D=new RegExp("(?:"+e+D+"(\\/)?|\\"+se+"\\"+oe+"(?:(?:\\/(\\w+))|!--[\\s\\S]*?--))"+t,"g"),P=new RegExp("<.*>|([^\\\\]|^)[{}]|"+e+".*"+t)),[se,oe,de,pe,le]}function u(e,t){t||e===!0||(t=e,e=void 0);var n,r,i,a,s=this,o=!t||"root"===t;if(e){if(a=t&&s.type===t&&s,!a)if(n=s.views,s._.useKey){for(r in n)if(a=t?n[r].get(e,t):n[r])break}else for(r=0,i=n.length;!a&&i>r;r++)a=t?n[r].get(e,t):n[r]}else if(o)for(;s.parent;)a=s,s=s.parent;else for(;s&&!a;)a=s.type===t?s:void 0,s=s.parent;return a}function c(){var e=this.get("item");return e?e.index:void 0}function f(){return this.index}function g(e){var t,n=this,r=n.linkCtx,i=(n.ctx||{})[e];return void 0===i&&r&&r.ctx&&(i=r.ctx[e]),void 0===i&&(i=ee[e]),i&&G(i)&&!i._wrp&&(t=function(){return i.apply(this&&this!==L?this:n,arguments)},t._wrp=n,p(t,i)),t||i}function v(e){return e&&(e.fn?e:this.getRsc("templates",e)||X(e))}function m(e,t,n,i){var a,s,o="number"==typeof n&&t.tmpl.bnds[n-1],d=t.linkCtx;return void 0!==i?n=i={props:{},args:[i]}:o&&(n=o(t.data,t,z)),s=n.args[0],(e||o)&&(a=d&&d.tag,a||(a=p(new ne._tg,{_:{inline:!d,bnd:o,unlinked:!0},tagName:":",cvt:e,flow:!0,tagCtx:n}),d&&(d.tag=a,a.linkCtx=d),n.ctx=K(n.ctx,(d?d.view:t).ctx)),a._er=i&&s,r(a,n),n.view=t,a.ctx=n.ctx||{},n.ctx=void 0,s=a.cvtArgs(a.convert||"true"!==e&&e)[0],s=o&&t._.onRender?t._.onRender(s,t,a):s),void 0!=s?s:""}function h(e){var t=this,n=t.tagCtx,r=n.view,i=n.args;return e=t.convert||e,e=e&&(""+e===e?r.getRsc("converters",e)||M("Unknown converter: '"+e+"'"):e),i=i.length||n.index?e?i.slice():i:[r.data],e&&(e.depends&&(t.depends=ne.getDeps(t.depends,t,e.depends,e)),i[0]=e.apply(t,i)),i}function w(e,t){for(var n,r,i=this;void 0===n&&i;)r=i.tmpl&&i.tmpl[e],n=r&&r[t],i=i.parent;return n||z[e][t]}function x(e,t,n,i,a,s){t=t||Z;var o,d,p,l,u,c,f,g,v,m,h,w,x,b,_,y,k,j,C,T="",A=t.linkCtx||0,V=t.ctx,$=n||t.tmpl,N="number"==typeof i&&t.tmpl.bnds[i-1];for("tag"===e._is?(o=e,e=o.tagName,i=o.tagCtxs,p=o.template):(d=t.getRsc("tags",e)||M("Unknown tag: {{"+e+"}} "),p=d.template),void 0!==s?(T+=s,i=s=[{props:{},args:[]}]):N&&(i=N(t.data,t,z)),g=i.length,f=0;g>f;f++)m=i[f],(!A||!A.tag||f&&!A.tag._.inline||o._er)&&((w=$.tmpls&&m.tmpl)&&(w=m.content=$.tmpls[w-1]),m.index=f,m.tmpl=w,m.render=R,m.view=t,m.ctx=K(m.ctx,V)),(n=m.props.tmpl)&&(m.tmpl=t.getTmpl(n)),o||(o=new d._ctr,x=!!o.init,o.parent=c=V&&V.tag,o.tagCtxs=i,C=o.dataMap,A&&(o._.inline=!1,A.tag=o,o.linkCtx=A),(o._.bnd=N||A.fn)?o._.arrVws={}:o.dataBoundOnly&&M("{^{"+e+"}} tag must be data-bound")),i=o.tagCtxs,C=o.dataMap,m.tag=o,C&&i&&(m.map=i[f].map),o.flow||(h=m.ctx=m.ctx||{},l=o.parents=h.parentTags=V&&K(h.parentTags,V.parentTags)||{},c&&(l[c.tagName]=c),l[o.tagName]=h.tag=o);if(!(o._er=s)){for(r(o,i[0]),o.rendering={},f=0;g>f;f++)m=o.tagCtx=i[f],k=m.props,y=o.cvtArgs(),(b=k.dataMap||C)&&(y.length||k.dataMap)&&(_=m.map,(!_||_.src!==y[0]||a)&&(_&&_.src&&_.unmap(),_=m.map=b.map(y[0],k,void 0,!o._.bnd)),y=[_.tgt]),o.ctx=m.ctx,f||(x&&(j=o.template,o.init(m,A,o.ctx),x=void 0),A&&(A.attr=o.attr=A.attr||o.attr),u=o.attr,o._.noVws=u&&u!==Ce),v=void 0,o.render&&(v=o.render.apply(o,y)),y.length||(y=[t]),void 0===v&&(v=m.render(y[0],!0)||(a?void 0:"")),T=T?T+(v||""):v;o.rendering=void 0}return o.tagCtx=i[0],o.ctx=o.tagCtx.ctx,o._.noVws&&o._.inline&&(T="text"===u?Y.html(T):""),N&&t._.onRender?t._.onRender(T,t,o):T}function b(e,t,n,r,i,a,s,o){var d,p,l,u=this,f="array"===t;u.content=o,u.views=f?[]:{},u.parent=n,u.type=t||"top",u.data=r,u.tmpl=i,l=u._={key:0,useKey:f?0:1,id:""+ke++,onRender:s,bnds:{}},u.linked=!!s,n?(d=n.views,p=n._,p.useKey?(d[l.key="_"+p.useKey++]=u,u.index=Ve,u.getIndex=c):d.length===(l.key=u.index=a)?d.push(u):d.splice(a,0,u),u.ctx=e||n.ctx):u.ctx=e}function _(e){var t,n,r,i,a,s,o;for(t in Ee)if(a=Ee[t],(s=a.compile)&&(n=e[t+"s"]))for(r in n)i=n[r]=s(r,n[r],e,0),i._is=t,i&&(o=ne.onStore[t])&&o(r,i,s)}function y(e,t,r){function i(){var t=this;t._={inline:!0,unlinked:!0},t.tagName=e}var a,s,o,d=new ne._tg;if(G(t)?t={depends:t.depends,render:t}:""+t===t&&(t={template:t}),s=t.baseTag){t.flow=!!t.flow,t.baseTag=s=""+s===s?r&&r.tags[s]||te[s]:s,d=p(d,s);for(o in t)d[o]=n(s[o],t[o])}else d=p(d,t);return void 0!==(a=d.template)&&(d.template=""+a===a?X[a]||X(a):a),d.init!==!1&&((i.prototype=d).constructor=d._ctr=i),r&&(d._parentTmpl=r),d}function k(e){return this.base.apply(this,e)}function j(t,n,r,i){function a(n){var a,o;if(""+n===n||n.nodeType>0&&(s=n)){if(!s)if(/^\.\/[^\\:*?"<>]*$/.test(n))(o=X[t=t||n])?n=o:s=document.getElementById(n);else if(e.fn&&!P.test(n))try{s=e(document).find(n)[0]}catch(d){}s&&(i?n=s.innerHTML:(a=s.getAttribute(Ae),a?a!==Re?(n=X[a],delete X[a]):e.fn&&(n=e.data(s)[Re]):(t=t||(e.fn?Re:n),n=j(t,s.innerHTML,r,i)),n.tmplName=t=t||a,t!==Re&&(X[t]=n),s.setAttribute(Ae,t),e.fn&&e.data(s,Re,n))),s=void 0}else n.fn||(n=void 0);return n}var s,o,d=n=n||"";return 0===i&&(i=void 0,d=a(d)),i=i||(n.markup?n:{}),i.tmplName=t,r&&(i._parentTmpl=r),!d&&n.markup&&(d=a(n.markup))&&d.fn&&(d=d.markup),void 0!==d?(d.fn||n.fn?d.fn&&(o=d):(n=T(d,i),N(d.replace(ve,"\\$&"),n)),o||(_(i),o=p(function(){return n.render.apply(n,arguments)},n)),t&&!r&&t!==Re&&(Me[t]=o),o):void 0}function C(e){function t(t,n){this.tgt=e.getTgt(t,n)}return G(e)&&(e={getTgt:e}),e.baseMap&&(e=p(p({},e.baseMap),e)),e.map=function(e,n){return new t(e,n)},e}function T(t,n){var r,i=re.wrapMap||{},a=p({tmpls:[],links:{},bnds:[],_is:"template",render:R},n);return a.markup=t,n.htmlTag||(r=we.exec(t),a.htmlTag=r?r[1].toLowerCase():""),r=i[a.htmlTag],r&&r!==i.div&&(a.markup=e.trim(a.markup)),a}function A(e,t){function n(i,a,s){var o,d,p,l;if(i&&typeof i===Te&&!i.nodeType&&!i.markup&&!i.getTgt){for(p in i)n(p,i[p],a);return z}return void 0===a&&(a=i,i=void 0),i&&""+i!==i&&(s=a,a=i,i=void 0),l=s?s[r]=s[r]||{}:n,d=t.compile,null===a?i&&delete l[i]:(a=d?d(i,a,s,0):a,i&&(l[i]=a)),d&&a&&(a._is=e),a&&(o=ne.onStore[e])&&o(i,a,d),a}var r=e+"s";z[r]=n}function R(e,t,n,r,i,a){var s,o,d,p,l,u,c,f,g=r,v="";if(t===!0?(n=t,t=void 0):typeof t!==Te&&(t=void 0),(d=this.tag)?(l=this,g=g||l.view,p=g.getTmpl(d.template||l.tmpl),arguments.length||(e=g)):p=this,p){if(!g&&e&&"view"===e._is&&(g=e),g&&e===g&&(e=g.data),u=!g,ie=ie||u,g||((t=t||{}).root=e),!ie||re.useViews||p.useViews||g&&g!==Z)v=V(p,e,t,n,g,i,a,d);else{if(g?(c=g.data,f=g.index,g.index=Ve):(g=Z,g.data=e,g.ctx=t),W(e)&&!n)for(s=0,o=e.length;o>s;s++)g.index=s,g.data=e[s],v+=p.fn(e[s],g,z);else g.data=e,v+=p.fn(e,g,z);g.data=c,g.index=f}u&&(ie=void 0)}return v}function V(e,t,n,r,i,a,s,o){function d(e){_=p({},n),_[x]=e}var l,u,c,f,g,v,m,h,w,x,_,y,k="";if(o&&(w=o.tagName,y=o.tagCtx,n=n?K(n,o.ctx):o.ctx,e===i.content?m=e!==i.ctx._wrp?i.ctx._wrp:void 0:e!==y.content?e===o.template?(m=y.tmpl,n._wrp=y.content):m=y.content||i.content:m=i.content,y.props.link===!1&&(n=n||{},n.link=!1),(x=y.props.itemVar)&&("~"!==x.charAt(0)&&$("Use itemVar='~myItem'"),x=x.slice(1))),i&&(s=s||i._.onRender,n=K(n,i.ctx)),a===!0&&(v=!0,a=0),s&&(n&&n.link===!1||o&&o._.noVws)&&(s=void 0),h=s,s===!0&&(h=void 0,s=i._.onRender),n=e.helpers?K(e.helpers,n):n,_=n,W(t)&&!r)for(c=v?i:void 0!==a&&i||new b(n,"array",i,t,e,a,s),i&&i._.useKey&&(c._.bnd=!o||o._.bnd&&o),x&&(c.it=x),x=c.it,l=0,u=t.length;u>l;l++)x&&d(t[l]),f=new b(_,"item",c,t[l],e,(a||0)+l,s,m),g=e.fn(t[l],f,z),k+=c._.onRender?c._.onRender(g,f):g;else x&&d(t),c=v?i:new b(_,w||"data",i,t,e,a,s,m),o&&!o.flow&&(c.tag=o),k+=e.fn(t,c,z);return h?h(k,c):k}function M(e,t,n){var r=re.onError(e,t,n);if(""+e===e)throw new ne.Err(r);return!t.linkCtx&&t.linked?Y.html(r):r}function $(e){M("Syntax error\n"+e)}function N(e,t,n,r,i){function a(t){t-=f,t&&v.push(e.substr(f,t).replace(fe,"\\n"))}function s(t,n){t&&(t+="}}",$((n?"{{"+n+"}} block has {{/"+t+" without {{"+t:"Unmatched or missing {{/"+t)+", in template:\n"+e))}function o(r,o,d,c,h,w,x,b,_,y,k,j){x&&_&&(b=_,_=void 0),(x&&o||_&&!h||y&&!d)&&$(r),_&&(_=_.slice(1)),w&&(h=":",c=Ce),y=y||n&&!i;var C=(o||n)&&[[]],T="",A="",R="",V="",M="",N="",E="",S="",U=!y&&!h;d=d||(b=b||"#data",h),a(j),f=j+r.length,x?u&&v.push(["*","\n"+b.replace(/^:/,"ret+= ").replace(ge,"$1")+";\n"]):d?("else"===d&&(he.test(b)&&$('for "{{else if expr}}" use "{{else expr}}"'),C=m[7]&&[[]],m[8]=e.substring(m[8],j),m=g.pop(),v=m[2],U=!0),b&&I(b.replace(fe," "),C,t).replace(me,function(e,t,n,r,i,a,s,o){return r="'"+i+"':",s?(A+=a+",",V+="'"+o+"',"):n?(R+=r+a+",",N+=r+"'"+o+"',"):t?E+=a:("trigger"===i&&(S+=a),T+=r+a+",",M+=r+"'"+o+"',",l=l||_e.test(i)),""}).slice(0,-1),C&&C[0]&&C.pop(),p=[d,c||!!_||l||"",U&&[],F(V,M,N),F(A,T,R),E,S,C||0],v.push(p),U&&(g.push(m),m=p,m[8]=f)):k&&(s(k!==m[0]&&"else"!==m[0]&&k,m[0]),m[8]=e.substring(m[8],j),m=g.pop()),s(!m&&k),v=m[2]}var d,p,l,u=re.allowCode||t&&t.allowCode,c=[],f=0,g=[],v=c,m=[,,c];return u&&(t.allowCode=u),n&&(e=se+e+pe),s(g[0]&&g[0][2].pop()[0]),e.replace(D,o),a(e.length),(f=c[c.length-1])&&s(""+f!==f&&+f[8]===f[8]&&f[0]),n?(d=U(c,e,n),E(d,[c[0][7]])):d=U(c,t),d}function E(e,t){var n,r,i=0,a=t.length;for(e.deps=[];a>i;i++){r=t[i];for(n in r)"_jsvto"!==n&&r[n].length&&(e.deps=e.deps.concat(r[n]))}e.paths=r}function F(e,t,n){return[e.slice(0,-1),t.slice(0,-1),n.slice(0,-1)]}function S(e,t){return"\n "+(t?t+":{":"")+"args:["+e[0]+"]"+(e[1]||!t?",\n props:{"+e[1]+"}":"")+(e[2]?",\n ctx:{"+e[2]+"}":"")}function I(e,t,n){function r(r,h,w,x,b,_,y,k,j,C,T,A,R,V,M,E,F,S,I,U){function K(e,n,r,s,o,d,u,c){var f="."===r;if(r&&(b=b.slice(n.length),f||(e=(s?'view.hlp("'+s+'")':o?"view":"data")+(c?(d?"."+d:s?"":o?"":"."+r)+(u||""):(c=s?"":o?d||"":r,"")),e+=c?"."+c:"",e=n+("view.data"===e.slice(0,9)?e.slice(5):e)),p)){if(q="linkTo"===i?a=t._jsvto=t._jsvto||[]:l.bd,B=f&&q[q.length-1]){if(B._jsv){for(;B.sb;)B=B.sb;B.bnd&&(b="^"+b.slice(1)),B.sb=b,B.bnd=B.bnd||"^"===b.charAt(0)}}else q.push(b);m[g]=I+(f?1:0)}return e}x=p&&x,x&&!k&&(b=x+b),_=_||"",w=w||h||A,b=b||j,C=C||F||"";var J,O,q,B,L;if(!y||d||o){if(p&&E&&!d&&!o&&(!i||s||a)&&(J=m[g-1],U.length-1>I-(J||0))){if(J=U.slice(J,I+r.length),O!==!0)if(q=a||u[g-1].bd,B=q[q.length-1],B&&B.prm){for(;B.sb&&B.sb.prm;)B=B.sb;L=B.sb={path:B.sb,bnd:B.bnd}}else q.push(L={path:q.pop()});E=oe+":"+J+" onerror=''"+de,O=f[E],O||(f[E]=!0,f[E]=O=N(E,n,!0)),O!==!0&&L&&(L._jsv=O,L.prm=l.bd,L.bnd=L.bnd||L.path&&L.path.indexOf("^")>=0)}return d?(d=!R,d?r:A+'"'):o?(o=!V,o?r:A+'"'):(w?(m[g]=I++,l=u[++g]={bd:[]},w):"")+(S?g?"":(c=U.slice(c,I),(i?(i=s=a=!1,"\b"):"\b,")+c+(c=I+r.length,p&&t.push(l.bd=[]),"\b")):k?(g&&$(e),p&&t.pop(),i=b,s=x,c=I+r.length,x&&(p=l.bd=t[i]=[]),b+":"):b?b.split("^").join(".").replace(ue,K)+(C?(l=u[++g]={bd:[]},v[g]=!0,C):_):_?_:M?(v[g]=!1,l=u[--g],M+(C?(l=u[++g],v[g]=!0,C):"")):T?(v[g]||$(e),","):h?"":(d=R,o=V,'"'))}$(e)}var i,a,s,o,d,p=t&&t[0],l={bd:p},u={0:l},c=0,f=n?n.links:p&&(p.links=p.links||{}),g=0,v={},m={},h=(e+(n?" ":"")).replace(ce,r);return!g&&h||$(e)}function U(e,t,n){var r,i,a,s,o,d,p,l,u,c,f,g,v,m,h,w,x,b,_,y,k,j,C,A,R,V,M,N,F,I,K=0,J=re.useViews||t.useViews||t.tags||t.templates||t.helpers||t.converters,O="",q={},B=e.length;for(""+t===t?(b=n?'data-link="'+t.replace(fe," ").slice(1,-1)+'"':t,t=0):(b=t.tmplName||"unnamed",t.allowCode&&(q.allowCode=!0),t.debug&&(q.debug=!0),f=t.bnds,x=t.tmpls),r=0;B>r;r++)if(i=e[r],""+i===i)O+='\n+"'+i+'"';else if(a=i[0],"*"===a)O+=";\n"+i[1]+"\nret=ret";else{if(s=i[1],k=!n&&i[2],o=S(i[3],"params")+"},"+S(v=i[4]),N=i[5],I=i[6],j=i[8]&&i[8].replace(ge,"$1"),(R="else"===a)?g&&g.push(i[7]):(K=0,f&&(g=i[7])&&(g=[g],K=f.push(1))),J=J||v[1]||v[2]||g||/view.(?!index)/.test(v[0]),(V=":"===a)?s&&(a=s===Ce?">":s+a):(k&&(_=T(j,q),_.tmplName=b+"/"+a,_.useViews=_.useViews||J,U(k,_),J=_.useViews,x.push(_)),R||(y=a,J=J||a&&(!te[a]||!te[a].flow),A=O,O=""),C=e[r+1],C=C&&"else"===C[0]),F=N?";\ntry{\nret+=":"\n+",m="",h="",V&&(g||I||s&&s!==Ce)){if(M="return {"+o+"};",w='c("'+s+'",view,',M=new Function("data,view,j,u"," // "+b+" "+K+" "+a+"\n"+M),M._er=N,m=w+K+",",h=")",M._tag=a,n)return M;E(M,g),c=!0}if(O+=V?(n?(N?"\ntry{\n":"")+"return ":F)+(c?(c=void 0,J=u=!0,w+(g?(f[K-1]=M,K):"{"+o+"}")+")"):">"===a?(p=!0,"h("+v[0]+")"):(l=!0,"((v="+(v[0]||"data")+')!=null?v:"")')):(d=!0,"\n{view:view,tmpl:"+(k?x.length:"0")+","+o+"},"),y&&!C){if(O="["+O.slice(0,-1)+"]",w='t("'+y+'",view,this,',n||g){if(O=new Function("data,view,j,u"," // "+b+" "+K+" "+y+"\nreturn "+O+";"),O._er=N,O._tag=y,g&&E(f[K-1]=O,g),n)return O;m=w+K+",undefined,",h=")"}O=A+F+w+(K||O)+")",g=0,y=0}N&&(J=!0,O+=";\n}catch(e){ret"+(n?"urn ":"+=")+m+"j._err(e,view,"+N+")"+h+";}\n"+(n?"":"ret=ret"))}O="// "+b+"\nvar v"+(d?",t=j._tag":"")+(u?",c=j._cnvt":"")+(p?",h=j.converters.html":"")+(n?";\n":',ret=""\n')+(q.debug?"debugger;":"")+O+(n?"\n":";\nreturn ret;"),re._dbgMode&&(O="try {\n"+O+"\n}catch(e){\nreturn j._err(e, view);\n}");try{O=new Function("data,view,j,u",O)}catch(L){$("Compiled template code:\n\n"+O+'\n: "'+L.message+'"')}return t&&(t.fn=O,t.useViews=!!J),O}function K(e,t){return e&&e!==t?t?p(p({},t),e):e:t&&p({},t)}function J(e){return je[e]||(je[e]="&#"+e.charCodeAt(0)+";")}function O(e){var t,n,r=[];if(typeof e===Te)for(t in e)n=e[t],n&&n.toJSON&&!n.toJSON()||G(n)||r.push({key:t,prop:n});return r}function q(t,n,r){var i=this.jquery&&(this[0]||M('Unknown template: "'+this.selector+'"')),a=i.getAttribute(Ae);return R.call(a?e.data(i)[Re]:X(i),t,n,r)}function B(e){return void 0!=e?be.test(e)&&(""+e).replace(ye,J)||e:""}var L=(0,eval)("this"),Q=e===!1;e=e&&e.fn?e:L.jQuery;var H,D,P,Z,z,G,W,X,Y,ee,te,ne,re,ie,ae="v1.0.0-beta",se="{",oe="{",de="}",pe="}",le="^",ue=/^(!*?)(?:null|true|false|\d[\d.]*|([\w$]+|\.|~([\w$]+)|#(view|([\w$]+))?)([\w$.^]*?)(?:[.[^]([\w$]+)\]?)?)$/g,ce=/(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(!*?[#~]?[\w$.^]+)?\s*((\+\+|--)|\+|-|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?[#~]?[\w$.^]+)([([])?)|(,\s*)|(\(?)\\?(?:(')|("))|(?:\s*(([)\]])(?=\s*[.^]|\s*$|[^\(\[])|[)\]])([([]?))|(\s+)/g,fe=/[ \t]*(\r\n|\n|\r)/g,ge=/\\(['"])/g,ve=/['"\\]/g,me=/(?:\x08|^)(onerror:)?(?:(~?)(([\w$_\.]+):)?([^\x08]+))\x08(,)?([^\x08]+)/gi,he=/^if\s/,we=/<(\w+)[>\s]/,xe=/[\x00`><"'&]/g,be=/[\x00`><\"'&]/,_e=/^on[A-Z]|^convert(Back)?$/,ye=xe,ke=0,je={"&":"&","<":"<",">":">","\x00":"�","'":"'",'"':""","`":"`"},Ce="html",Te="object",Ae="data-jsv-tmpl",Re="jsvTmpl",Ve="For #index in nested block use #getIndex().",Me={},$e=L.jsrender,Ne=$e&&e&&!e.render,Ee={template:{compile:j},tag:{compile:y},helper:{},converter:{}};if(z={jsviews:ae,settings:function(e){p(re,e),o(re._dbgMode),re.jsv&&re.jsv()},sub:{View:b,Err:d,tmplFn:N,parse:I,extend:p,extendCtx:K,syntaxErr:$,onStore:{},_ths:r,_tg:function(){}},map:C,_cnvt:m,_tag:x,_err:M},(d.prototype=new Error).constructor=d,c.depends=function(){return[this.get("item"),"index"]},f.depends="index",b.prototype={get:u,getIndex:f,getRsc:w,getTmpl:v,hlp:g,_is:"view"},!($e||e&&e.render)){for(H in Ee)A(H,Ee[H]);X=z.templates,Y=z.converters,ee=z.helpers,te=z.tags,ne=z.sub,re=z.settings,ne._tg.prototype={baseApply:k,cvtArgs:h},Z=ne.topView=new b,e?(e.fn.render=q,e.observable&&(p(ne,e.views.sub),z.map=e.views.map)):(e={},Q&&(L.jsrender=e),e.renderFile=e.__express=e.compile=function(){throw"Node.js: use npm jsrender, or jsrender-node.js"},e.isFunction=function(e){return"function"==typeof e},e.isArray=Array.isArray||function(e){return"[object Array]"==={}.toString.call(e)},ne._jq=function(t){t!==e&&(p(t,e),e=t,e.fn.render=q,delete e.jsrender)},e.jsrender=ae),G=e.isFunction,W=e.isArray,e.render=Me,e.views=z,e.templates=X=z.templates,re({debugMode:o,delimiters:l,onError:function(e,t,n){return t&&(e=void 0===n?"{Error: "+(e.message||e)+"}":G(n)?n(e,t):n),void 0==e?"":e},_dbgMode:!1}),te({"if":{render:function(e){var t=this,n=t.tagCtx,r=t.rendering.done||!e&&(arguments.length||!n.index)?"":(t.rendering.done=!0,t.selected=n.index,n.render(n.view,!0));return r},flow:!0},"for":{render:function(e){var t,n=!arguments.length,r=this,i=r.tagCtx,a="",s=0;return r.rendering.done||(t=n?i.view.data:e,void 0!==t&&(a+=i.render(t,n),s+=W(t)?t.length:1),(r.rendering.done=s)&&(r.selected=i.index)),a},flow:!0},props:{baseTag:"for",dataMap:C(O),flow:!0},include:{flow:!0},"*":{render:i,flow:!0},":*":{render:i,flow:!0},dbg:ee.dbg=Y.dbg=s}),Y({html:B,attr:B,url:function(e){return void 0!=e?encodeURI(""+e):null===e?e:""}}),l()}return Ne&&$e.views.sub._jq(e),e||$e}); +!function(e){var t=(0,eval)("this"),n=t.jQuery;"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=n?e(n):function(t){if(t&&!t.fn)throw"Provide jQuery or null";return e(t)}:e(!1)}(function(e){"use strict";function t(e,t){return function(){var n,r=this,i=r.base;return r.base=e,n=t.apply(r,arguments),r.base=i,n}}function n(e,n){return G(n)&&(n=t(e?e._d?e:t(a,e):a,n),n._d=1),n}function r(e,t){for(var r in t.props)_e.test(r)&&(e[r]=n(e[r],t.props[r]))}function i(e){return e}function a(){return""}function s(e){try{throw"dbg breakpoint"}catch(t){}return this.base?this.baseApply(arguments):e}function o(e){re._dbgMode=e!==!1}function d(t){this.name=(e.link?"JsViews":"JsRender")+" Error",this.message=t||this.name}function p(e,t){var n;for(n in t)e[n]=t[n];return e}function l(e,t,n){return(0!==this||e)&&(se=e?e.charAt(0):se,oe=e?e.charAt(1):oe,de=t?t.charAt(0):de,pe=t?t.charAt(1):pe,le=n||le,e="\\"+se+"(\\"+le+")?\\"+oe,t="\\"+de+"\\"+pe,D="(?:(\\w+(?=[\\/\\s\\"+de+"]))|(\\w+)?(:)|(>)|(\\*))\\s*((?:[^\\"+de+"]|\\"+de+"(?!\\"+pe+"))*?)",ne.rTag="(?:"+D+")",D=new RegExp("(?:"+e+D+"(\\/)?|\\"+se+"\\"+oe+"(?:(?:\\/(\\w+))\\s*|!--[\\s\\S]*?--))"+t,"g"),P=new RegExp("<.*>|([^\\\\]|^)[{}]|"+e+".*"+t)),[se,oe,de,pe,le]}function u(e,t){t||e===!0||(t=e,e=void 0);var n,r,i,a,s=this,o=!t||"root"===t;if(e){if(a=t&&s.type===t&&s,!a)if(n=s.views,s._.useKey){for(r in n)if(a=t?n[r].get(e,t):n[r])break}else for(r=0,i=n.length;!a&&i>r;r++)a=t?n[r].get(e,t):n[r]}else if(o)for(;s.parent;)a=s,s=s.parent;else for(;s&&!a;)a=s.type===t?s:void 0,s=s.parent;return a}function c(){var e=this.get("item");return e?e.index:void 0}function f(){return this.index}function g(e){var t,n=this,r=n.linkCtx,i=(n.ctx||{})[e];return void 0===i&&r&&r.ctx&&(i=r.ctx[e]),void 0===i&&(i=ee[e]),i&&G(i)&&!i._wrp&&(t=function(){return i.apply(this&&this!==L?this:n,arguments)},t._wrp=n,p(t,i)),t||i}function v(e){return e&&(e.fn?e:this.getRsc("templates",e)||X(e))}function m(e,t,n,i){var a,s,o="number"==typeof n&&t.tmpl.bnds[n-1],d=t.linkCtx;return void 0!==i?n=i={props:{},args:[i]}:o&&(n=o(t.data,t,z)),s=n.args[0],(e||o)&&(a=d&&d.tag,a||(a=p(new ne._tg,{_:{inline:!d,bnd:o,unlinked:!0},tagName:":",cvt:e,flow:!0,tagCtx:n}),d&&(d.tag=a,a.linkCtx=d),n.ctx=K(n.ctx,(d?d.view:t).ctx)),a._er=i&&s,r(a,n),n.view=t,a.ctx=n.ctx||{},n.ctx=void 0,s=a.cvtArgs(a.convert||"true"!==e&&e)[0],s=o&&t._.onRender?t._.onRender(s,t,a):s),void 0!=s?s:""}function h(e){var t=this,n=t.tagCtx,r=n.view,i=n.args;return e=t.convert||e,e=e&&(""+e===e?r.getRsc("converters",e)||M("Unknown converter: '"+e+"'"):e),i=i.length||n.index?e?i.slice():i:[r.data],e&&(e.depends&&(t.depends=ne.getDeps(t.depends,t,e.depends,e)),i[0]=e.apply(t,i)),i}function w(e,t){for(var n,r,i=this;void 0===n&&i;)r=i.tmpl&&i.tmpl[e],n=r&&r[t],i=i.parent;return n||z[e][t]}function x(e,t,n,i,a,s){t=t||Z;var o,d,p,l,u,c,f,g,v,m,h,w,x,b,_,y,k,j,C,T="",A=t.linkCtx||0,V=t.ctx,$=n||t.tmpl,N="number"==typeof i&&t.tmpl.bnds[i-1];for("tag"===e._is?(o=e,e=o.tagName,i=o.tagCtxs,p=o.template):(d=t.getRsc("tags",e)||M("Unknown tag: {{"+e+"}} "),p=d.template),void 0!==s?(T+=s,i=s=[{props:{},args:[]}]):N&&(i=N(t.data,t,z)),g=i.length,f=0;g>f;f++)m=i[f],(!A||!A.tag||f&&!A.tag._.inline||o._er)&&((w=$.tmpls&&m.tmpl)&&(w=m.content=$.tmpls[w-1]),m.index=f,m.tmpl=w,m.render=R,m.view=t,m.ctx=K(m.ctx,V)),(n=m.props.tmpl)&&(m.tmpl=t.getTmpl(n)),o||(o=new d._ctr,x=!!o.init,o.parent=c=V&&V.tag,o.tagCtxs=i,C=o.dataMap,A&&(o._.inline=!1,A.tag=o,o.linkCtx=A),(o._.bnd=N||A.fn)?o._.arrVws={}:o.dataBoundOnly&&M("{^{"+e+"}} tag must be data-bound")),i=o.tagCtxs,C=o.dataMap,m.tag=o,C&&i&&(m.map=i[f].map),o.flow||(h=m.ctx=m.ctx||{},l=o.parents=h.parentTags=V&&K(h.parentTags,V.parentTags)||{},c&&(l[c.tagName]=c),l[o.tagName]=h.tag=o);if(!(o._er=s)){for(r(o,i[0]),o.rendering={},f=0;g>f;f++)m=o.tagCtx=i[f],k=m.props,y=o.cvtArgs(),(b=k.dataMap||C)&&(y.length||k.dataMap)&&(_=m.map,(!_||_.src!==y[0]||a)&&(_&&_.src&&_.unmap(),_=m.map=b.map(y[0],k,void 0,!o._.bnd)),y=[_.tgt]),o.ctx=m.ctx,f||(x&&(j=o.template,o.init(m,A,o.ctx),x=void 0),A&&(A.attr=o.attr=A.attr||o.attr),u=o.attr,o._.noVws=u&&u!==Ce),v=void 0,o.render&&(v=o.render.apply(o,y)),y.length||(y=[t]),void 0===v&&(v=m.render(y[0],!0)||(a?void 0:"")),T=T?T+(v||""):v;o.rendering=void 0}return o.tagCtx=i[0],o.ctx=o.tagCtx.ctx,o._.noVws&&o._.inline&&(T="text"===u?Y.html(T):""),N&&t._.onRender?t._.onRender(T,t,o):T}function b(e,t,n,r,i,a,s,o){var d,p,l,u=this,f="array"===t;u.content=o,u.views=f?[]:{},u.parent=n,u.type=t||"top",u.data=r,u.tmpl=i,l=u._={key:0,useKey:f?0:1,id:""+ke++,onRender:s,bnds:{}},u.linked=!!s,n?(d=n.views,p=n._,p.useKey?(d[l.key="_"+p.useKey++]=u,u.index=Ve,u.getIndex=c):d.length===(l.key=u.index=a)?d.push(u):d.splice(a,0,u),u.ctx=e||n.ctx):u.ctx=e}function _(e){var t,n,r,i,a,s,o;for(t in Ee)if(a=Ee[t],(s=a.compile)&&(n=e[t+"s"]))for(r in n)i=n[r]=s(r,n[r],e,0),i._is=t,i&&(o=ne.onStore[t])&&o(r,i,s)}function y(e,t,r){function i(){var t=this;t._={inline:!0,unlinked:!0},t.tagName=e}var a,s,o,d=new ne._tg;if(G(t)?t={depends:t.depends,render:t}:""+t===t&&(t={template:t}),s=t.baseTag){t.flow=!!t.flow,t.baseTag=s=""+s===s?r&&r.tags[s]||te[s]:s,d=p(d,s);for(o in t)d[o]=n(s[o],t[o])}else d=p(d,t);return void 0!==(a=d.template)&&(d.template=""+a===a?X[a]||X(a):a),d.init!==!1&&((i.prototype=d).constructor=d._ctr=i),r&&(d._parentTmpl=r),d}function k(e){return this.base.apply(this,e)}function j(t,n,r,i){function a(n){var a,o;if(""+n===n||n.nodeType>0&&(s=n)){if(!s)if(/^\.\/[^\\:*?"<>]*$/.test(n))(o=X[t=t||n])?n=o:s=document.getElementById(n);else if(e.fn&&!P.test(n))try{s=e(document).find(n)[0]}catch(d){}s&&(i?n=s.innerHTML:(a=s.getAttribute(Ae),a?a!==Re?(n=X[a],delete X[a]):e.fn&&(n=e.data(s)[Re]):(t=t||(e.fn?Re:n),n=j(t,s.innerHTML,r,i)),n.tmplName=t=t||a,t!==Re&&(X[t]=n),s.setAttribute(Ae,t),e.fn&&e.data(s,Re,n))),s=void 0}else n.fn||(n=void 0);return n}var s,o,d=n=n||"";return 0===i&&(i=void 0,d=a(d)),i=i||(n.markup?n:{}),i.tmplName=t,r&&(i._parentTmpl=r),!d&&n.markup&&(d=a(n.markup))&&d.fn&&(d=d.markup),void 0!==d?(d.fn||n.fn?d.fn&&(o=d):(n=T(d,i),N(d.replace(ve,"\\$&"),n)),o||(_(i),o=p(function(){return n.render.apply(n,arguments)},n)),t&&!r&&t!==Re&&(Me[t]=o),o):void 0}function C(e){function t(t,n){this.tgt=e.getTgt(t,n)}return G(e)&&(e={getTgt:e}),e.baseMap&&(e=p(p({},e.baseMap),e)),e.map=function(e,n){return new t(e,n)},e}function T(t,n){var r,i=re.wrapMap||{},a=p({tmpls:[],links:{},bnds:[],_is:"template",render:R},n);return a.markup=t,n.htmlTag||(r=we.exec(t),a.htmlTag=r?r[1].toLowerCase():""),r=i[a.htmlTag],r&&r!==i.div&&(a.markup=e.trim(a.markup)),a}function A(e,t){function n(i,a,s){var o,d,p,l;if(i&&typeof i===Te&&!i.nodeType&&!i.markup&&!i.getTgt){for(p in i)n(p,i[p],a);return z}return void 0===a&&(a=i,i=void 0),i&&""+i!==i&&(s=a,a=i,i=void 0),l=s?s[r]=s[r]||{}:n,d=t.compile,null===a?i&&delete l[i]:(a=d?d(i,a,s,0):a,i&&(l[i]=a)),d&&a&&(a._is=e),a&&(o=ne.onStore[e])&&o(i,a,d),a}var r=e+"s";z[r]=n}function R(e,t,n,r,i,a){var s,o,d,p,l,u,c,f,g=r,v="";if(t===!0?(n=t,t=void 0):typeof t!==Te&&(t=void 0),(d=this.tag)?(l=this,g=g||l.view,p=g.getTmpl(d.template||l.tmpl),arguments.length||(e=g)):p=this,p){if(!g&&e&&"view"===e._is&&(g=e),g&&e===g&&(e=g.data),u=!g,ie=ie||u,g||((t=t||{}).root=e),!ie||re.useViews||p.useViews||g&&g!==Z)v=V(p,e,t,n,g,i,a,d);else{if(g?(c=g.data,f=g.index,g.index=Ve):(g=Z,g.data=e,g.ctx=t),W(e)&&!n)for(s=0,o=e.length;o>s;s++)g.index=s,g.data=e[s],v+=p.fn(e[s],g,z);else g.data=e,v+=p.fn(e,g,z);g.data=c,g.index=f}u&&(ie=void 0)}return v}function V(e,t,n,r,i,a,s,o){function d(e){_=p({},n),_[x]=e}var l,u,c,f,g,v,m,h,w,x,_,y,k="";if(o&&(w=o.tagName,y=o.tagCtx,n=n?K(n,o.ctx):o.ctx,e===i.content?m=e!==i.ctx._wrp?i.ctx._wrp:void 0:e!==y.content?e===o.template?(m=y.tmpl,n._wrp=y.content):m=y.content||i.content:m=i.content,y.props.link===!1&&(n=n||{},n.link=!1),(x=y.props.itemVar)&&("~"!==x.charAt(0)&&$("Use itemVar='~myItem'"),x=x.slice(1))),i&&(s=s||i._.onRender,n=K(n,i.ctx)),a===!0&&(v=!0,a=0),s&&(n&&n.link===!1||o&&o._.noVws)&&(s=void 0),h=s,s===!0&&(h=void 0,s=i._.onRender),n=e.helpers?K(e.helpers,n):n,_=n,W(t)&&!r)for(c=v?i:void 0!==a&&i||new b(n,"array",i,t,e,a,s),i&&i._.useKey&&(c._.bnd=!o||o._.bnd&&o),x&&(c.it=x),x=c.it,l=0,u=t.length;u>l;l++)x&&d(t[l]),f=new b(_,"item",c,t[l],e,(a||0)+l,s,m),g=e.fn(t[l],f,z),k+=c._.onRender?c._.onRender(g,f):g;else x&&d(t),c=v?i:new b(_,w||"data",i,t,e,a,s,m),o&&!o.flow&&(c.tag=o),k+=e.fn(t,c,z);return h?h(k,c):k}function M(e,t,n){var r=re.onError(e,t,n);if(""+e===e)throw new ne.Err(r);return!t.linkCtx&&t.linked?Y.html(r):r}function $(e){M("Syntax error\n"+e)}function N(e,t,n,r,i){function a(t){t-=f,t&&v.push(e.substr(f,t).replace(fe,"\\n"))}function s(t,n){t&&(t+="}}",$((n?"{{"+n+"}} block has {{/"+t+" without {{"+t:"Unmatched or missing {{/"+t)+", in template:\n"+e))}function o(o,d,c,h,w,x,b,_,y,k,j){(b&&d||y&&!c||_&&":"===_.slice(-1))&&$(o),x&&(w=":",h=Ce),y=y||n&&!i;var C=(d||n)&&[[]],T="",A="",R="",V="",M="",N="",E="",S="",U=!y&&!w;c=c||(_=_||"#data",w),a(j),f=j+o.length,b?u&&v.push(["*","\n"+_.replace(/^:/,"ret+= ").replace(ge,"$1")+";\n"]):c?("else"===c&&(he.test(_)&&$('for "{{else if expr}}" use "{{else expr}}"'),C=m[7]&&[[]],m[8]=e.substring(m[8],j),m=g.pop(),v=m[2],U=!0),_&&I(_.replace(fe," "),C,t).replace(me,function(e,t,n,r,i,a,s,o){return r="'"+i+"':",s?(A+=a+",",V+="'"+o+"',"):n?(R+=r+a+",",N+=r+"'"+o+"',"):t?E+=a:("trigger"===i&&(S+=a),T+=r+a+",",M+=r+"'"+o+"',",l=l||_e.test(i)),""}).slice(0,-1),C&&C[0]&&C.pop(),p=[c,h||!!r||l||"",U&&[],F(V,M,N),F(A,T,R),E,S,C||0],v.push(p),U&&(g.push(m),m=p,m[8]=f)):k&&(s(k!==m[0]&&"else"!==m[0]&&k,m[0]),m[8]=e.substring(m[8],j),m=g.pop()),s(!m&&k),v=m[2]}var d,p,l,u=re.allowCode||t&&t.allowCode,c=[],f=0,g=[],v=c,m=[,,c];return u&&(t.allowCode=u),n&&(void 0!==r&&(e=e.slice(0,-r.length-2)+pe),e=se+e+pe),s(g[0]&&g[0][2].pop()[0]),e.replace(D,o),a(e.length),(f=c[c.length-1])&&s(""+f!==f&&+f[8]===f[8]&&f[0]),n?(d=U(c,e,n),E(d,[c[0][7]])):d=U(c,t),d}function E(e,t){var n,r,i=0,a=t.length;for(e.deps=[];a>i;i++){r=t[i];for(n in r)"_jsvto"!==n&&r[n].length&&(e.deps=e.deps.concat(r[n]))}e.paths=r}function F(e,t,n){return[e.slice(0,-1),t.slice(0,-1),n.slice(0,-1)]}function S(e,t){return"\n "+(t?t+":{":"")+"args:["+e[0]+"]"+(e[1]||!t?",\n props:{"+e[1]+"}":"")+(e[2]?",\n ctx:{"+e[2]+"}":"")}function I(e,t,n){function r(r,h,w,x,b,_,y,k,j,C,T,A,R,V,M,E,F,S,I,U){function K(e,n,r,s,o,d,u,c){var f="."===r;if(r&&(b=b.slice(n.length),f||(e=(s?'view.hlp("'+s+'")':o?"view":"data")+(c?(d?"."+d:s?"":o?"":"."+r)+(u||""):(c=s?"":o?d||"":r,"")),e+=c?"."+c:"",e=n+("view.data"===e.slice(0,9)?e.slice(5):e)),p)){if(q="linkTo"===i?a=t._jsvto=t._jsvto||[]:l.bd,B=f&&q[q.length-1]){if(B._jsv){for(;B.sb;)B=B.sb;B.bnd&&(b="^"+b.slice(1)),B.sb=b,B.bnd=B.bnd||"^"===b.charAt(0)}}else q.push(b);m[g]=I+(f?1:0)}return e}x=p&&x,x&&!k&&(b=x+b),_=_||"",w=w||h||A,b=b||j,C=C||F||"";var J,O,q,B,L;if(!y||d||o){if(p&&E&&!d&&!o&&(!i||s||a)&&(J=m[g-1],U.length-1>I-(J||0))){if(J=U.slice(J,I+r.length),O!==!0)if(q=a||u[g-1].bd,B=q[q.length-1],B&&B.prm){for(;B.sb&&B.sb.prm;)B=B.sb;L=B.sb={path:B.sb,bnd:B.bnd}}else q.push(L={path:q.pop()});E=oe+":"+J+" onerror=''"+de,O=f[E],O||(f[E]=!0,f[E]=O=N(E,n,!0)),O!==!0&&L&&(L._jsv=O,L.prm=l.bd,L.bnd=L.bnd||L.path&&L.path.indexOf("^")>=0)}return d?(d=!R,d?r:A+'"'):o?(o=!V,o?r:A+'"'):(w?(m[g]=I++,l=u[++g]={bd:[]},w):"")+(S?g?"":(c=U.slice(c,I),(i?(i=s=a=!1,"\b"):"\b,")+c+(c=I+r.length,p&&t.push(l.bd=[]),"\b")):k?(g&&$(e),p&&t.pop(),i=b,s=x,c=I+r.length,x&&(p=l.bd=t[i]=[]),b+":"):b?b.split("^").join(".").replace(ue,K)+(C?(l=u[++g]={bd:[]},v[g]=!0,C):_):_?_:M?(v[g]=!1,l=u[--g],M+(C?(l=u[++g],v[g]=!0,C):"")):T?(v[g]||$(e),","):h?"":(d=R,o=V,'"'))}$(e)}var i,a,s,o,d,p=t&&t[0],l={bd:p},u={0:l},c=0,f=n?n.links:p&&(p.links=p.links||{}),g=0,v={},m={},h=(e+(n?" ":"")).replace(ce,r);return!g&&h||$(e)}function U(e,t,n){var r,i,a,s,o,d,p,l,u,c,f,g,v,m,h,w,x,b,_,y,k,j,C,A,R,V,M,N,F,I,K=0,J=re.useViews||t.useViews||t.tags||t.templates||t.helpers||t.converters,O="",q={},B=e.length;for(""+t===t?(b=n?'data-link="'+t.replace(fe," ").slice(1,-1)+'"':t,t=0):(b=t.tmplName||"unnamed",t.allowCode&&(q.allowCode=!0),t.debug&&(q.debug=!0),f=t.bnds,x=t.tmpls),r=0;B>r;r++)if(i=e[r],""+i===i)O+='\n+"'+i+'"';else if(a=i[0],"*"===a)O+=";\n"+i[1]+"\nret=ret";else{if(s=i[1],k=!n&&i[2],o=S(i[3],"params")+"},"+S(v=i[4]),N=i[5],I=i[6],j=i[8]&&i[8].replace(ge,"$1"),(R="else"===a)?g&&g.push(i[7]):(K=0,f&&(g=i[7])&&(g=[g],K=f.push(1))),J=J||v[1]||v[2]||g||/view.(?!index)/.test(v[0]),(V=":"===a)?s&&(a=s===Ce?">":s+a):(k&&(_=T(j,q),_.tmplName=b+"/"+a,_.useViews=_.useViews||J,U(k,_),J=_.useViews,x.push(_)),R||(y=a,J=J||a&&(!te[a]||!te[a].flow),A=O,O=""),C=e[r+1],C=C&&"else"===C[0]),F=N?";\ntry{\nret+=":"\n+",m="",h="",V&&(g||I||s&&s!==Ce)){if(M="return {"+o+"};",w='c("'+s+'",view,',M=new Function("data,view,j,u"," // "+b+" "+K+" "+a+"\n"+M),M._er=N,m=w+K+",",h=")",M._tag=a,n)return M;E(M,g),c=!0}if(O+=V?(n?(N?"\ntry{\n":"")+"return ":F)+(c?(c=void 0,J=u=!0,w+(g?(f[K-1]=M,K):"{"+o+"}")+")"):">"===a?(p=!0,"h("+v[0]+")"):(l=!0,"((v="+(v[0]||"data")+')!=null?v:"")')):(d=!0,"\n{view:view,tmpl:"+(k?x.length:"0")+","+o+"},"),y&&!C){if(O="["+O.slice(0,-1)+"]",w='t("'+y+'",view,this,',n||g){if(O=new Function("data,view,j,u"," // "+b+" "+K+" "+y+"\nreturn "+O+";"),O._er=N,O._tag=y,g&&E(f[K-1]=O,g),n)return O;m=w+K+",undefined,",h=")"}O=A+F+w+(K||O)+")",g=0,y=0}N&&(J=!0,O+=";\n}catch(e){ret"+(n?"urn ":"+=")+m+"j._err(e,view,"+N+")"+h+";}\n"+(n?"":"ret=ret"))}O="// "+b+"\nvar v"+(d?",t=j._tag":"")+(u?",c=j._cnvt":"")+(p?",h=j.converters.html":"")+(n?";\n":',ret=""\n')+(q.debug?"debugger;":"")+O+(n?"\n":";\nreturn ret;"),re._dbgMode&&(O="try {\n"+O+"\n}catch(e){\nreturn j._err(e, view);\n}");try{O=new Function("data,view,j,u",O)}catch(L){$("Compiled template code:\n\n"+O+'\n: "'+L.message+'"')}return t&&(t.fn=O,t.useViews=!!J),O}function K(e,t){return e&&e!==t?t?p(p({},t),e):e:t&&p({},t)}function J(e){return je[e]||(je[e]="&#"+e.charCodeAt(0)+";")}function O(e){var t,n,r=[];if(typeof e===Te)for(t in e)n=e[t],n&&n.toJSON&&!n.toJSON()||G(n)||r.push({key:t,prop:n});return r}function q(t,n,r){var i=this.jquery&&(this[0]||M('Unknown template: "'+this.selector+'"')),a=i.getAttribute(Ae);return R.call(a?e.data(i)[Re]:X(i),t,n,r)}function B(e){return void 0!=e?be.test(e)&&(""+e).replace(ye,J)||e:""}var L=(0,eval)("this"),Q=e===!1;e=e&&e.fn?e:L.jQuery;var H,D,P,Z,z,G,W,X,Y,ee,te,ne,re,ie,ae="v0.9.72",se="{",oe="{",de="}",pe="}",le="^",ue=/^(!*?)(?:null|true|false|\d[\d.]*|([\w$]+|\.|~([\w$]+)|#(view|([\w$]+))?)([\w$.^]*?)(?:[.[^]([\w$]+)\]?)?)$/g,ce=/(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(!*?[#~]?[\w$.^]+)?\s*((\+\+|--)|\+|-|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?[#~]?[\w$.^]+)([([])?)|(,\s*)|(\(?)\\?(?:(')|("))|(?:\s*(([)\]])(?=\s*[.^]|\s*$|[^([])|[)\]])([([]?))|(\s+)/g,fe=/[ \t]*(\r\n|\n|\r)/g,ge=/\\(['"])/g,ve=/['"\\]/g,me=/(?:\x08|^)(onerror:)?(?:(~?)(([\w$_\.]+):)?([^\x08]+))\x08(,)?([^\x08]+)/gi,he=/^if\s/,we=/<(\w+)[>\s]/,xe=/[\x00`><"'&]/g,be=/[\x00`><\"'&]/,_e=/^on[A-Z]|^convert(Back)?$/,ye=xe,ke=0,je={"&":"&","<":"<",">":">","\x00":"�","'":"'",'"':""","`":"`"},Ce="html",Te="object",Ae="data-jsv-tmpl",Re="jsvTmpl",Ve="For #index in nested block use #getIndex().",Me={},$e=L.jsrender,Ne=$e&&e&&!e.render,Ee={template:{compile:j},tag:{compile:y},helper:{},converter:{}};if(z={jsviews:ae,settings:function(e){p(re,e),o(re._dbgMode),re.jsv&&re.jsv()},sub:{View:b,Err:d,tmplFn:N,parse:I,extend:p,extendCtx:K,syntaxErr:$,onStore:{},_ths:r,_tg:function(){}},map:C,_cnvt:m,_tag:x,_err:M},(d.prototype=new Error).constructor=d,c.depends=function(){return[this.get("item"),"index"]},f.depends="index",b.prototype={get:u,getIndex:f,getRsc:w,getTmpl:v,hlp:g,_is:"view"},!($e||e&&e.render)){for(H in Ee)A(H,Ee[H]);X=z.templates,Y=z.converters,ee=z.helpers,te=z.tags,ne=z.sub,re=z.settings,ne._tg.prototype={baseApply:k,cvtArgs:h},Z=ne.topView=new b,e?(e.fn.render=q,e.observable&&(p(ne,e.views.sub),z.map=e.views.map)):(e={},Q&&(L.jsrender=e),e.renderFile=e.__express=e.compile=function(){throw"Node.js: use npm jsrender, or jsrender-node.js"},e.isFunction=function(e){return"function"==typeof e},e.isArray=Array.isArray||function(e){return"[object Array]"==={}.toString.call(e)},ne._jq=function(t){t!==e&&(p(t,e),e=t,e.fn.render=q,delete e.jsrender)},e.jsrender=ae),G=e.isFunction,W=e.isArray,e.render=Me,e.views=z,e.templates=X=z.templates,re({debugMode:o,delimiters:l,onError:function(e,t,n){return t&&(e=void 0===n?"{Error: "+(e.message||e)+"}":G(n)?n(e,t):n),void 0==e?"":e},_dbgMode:!1}),te({"if":{render:function(e){var t=this,n=t.tagCtx,r=t.rendering.done||!e&&(arguments.length||!n.index)?"":(t.rendering.done=!0,t.selected=n.index,n.render(n.view,!0));return r},flow:!0},"for":{render:function(e){var t,n=!arguments.length,r=this,i=r.tagCtx,a="",s=0;return r.rendering.done||(t=n?i.view.data:e,void 0!==t&&(a+=i.render(t,n),s+=W(t)?t.length:1),(r.rendering.done=s)&&(r.selected=i.index)),a},flow:!0},props:{baseTag:"for",dataMap:C(O),flow:!0},include:{flow:!0},"*":{render:i,flow:!0},":*":{render:i,flow:!0},dbg:ee.dbg=Y.dbg=s}),Y({html:B,attr:B,url:function(e){return void 0!=e?encodeURI(""+e):null===e?e:""}}),l()}return Ne&&$e.views.sub._jq(e),e||$e}); //# sourceMappingURL=jsrender.min.js.map \ No newline at end of file diff --git a/jsrender.min.js.map b/jsrender.min.js.map index 2c53051..fed6e21 100644 --- a/jsrender.min.js.map +++ b/jsrender.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["jsrender.js"],"names":["factory","global","eval","$","jQuery","define","amd","exports","module","fn","getDerivedMethod","baseMethod","method","ret","tag","this","prevBase","base","apply","arguments","getMethod","$isFunction","_d","noop","tagHandlersFromProps","tagCtx","prop","props","rHasHandlers","test","retVal","val","dbgBreak","e","baseApply","dbgMode","debugMode","$viewsSettings","_dbgMode","JsViewsError","message","name","link","$extend","target","source","$viewsDelimiters","openChars","closeChars","delimOpenChar0","charAt","delimOpenChar1","delimCloseChar0","delimCloseChar1","linkChar","rTag","$sub","RegExp","rTmplString","getView","inner","type","undefined","views","i","l","found","view","root","_","useKey","get","length","parent","getNestedIndex","index","getIndex","getHelper","helper","wrapped","ctx","linkCtx","res","$helpers","_wrp","getTemplate","tmpl","getRsc","$templates","convertVal","converter","onError","value","boundTag","bnds","args","data","$views","_tg","inline","bnd","unlinked","tagName","cvt","flow","extendCtx","_er","cvtArgs","convert","onRender","convertArgs","error","slice","depends","getDeps","getResource","resourceType","itemName","store","renderTag","parentView","tagCtxs","isUpdate","topView","tagDef","template","tags","attr","parentTag","itemRet","tagCtxCtx","content","callInit","mapDef","thisMap","initialTmpl","tagDataMap","parentTmpl","_is","tmpls","render","renderContent","getTmpl","_ctr","init","dataMap","arrVws","dataBoundOnly","map","parents","parentTags","rendering","src","unmap","tgt","noVws","HTML","$converters","html","View","context","key","contentTmpl","parentView_","self_","self","isArray","id","viewId","linked","indexStr","push","splice","compileChildResources","storeName","resources","resourceName","resource","settings","compile","onStore","jsvStores","compileTag","Tag","baseTag","compiledDef","$tags","prototype","constructor","_parentTmpl","compileTmpl","options","lookupTemplate","currentName","nodeType","elem","document","getElementById","find","innerHTML","getAttribute","tmplAttr","jsvTmpl","tmplName","setAttribute","compiledTmpl","tmplOrMarkup","markup","tmplObject","tmplFn","replace","rEscapeQuotes","$render","Map","getTgt","baseMap","htmlTag","wrapMap","links","rFirstElem","exec","toLowerCase","div","trim","registerStore","storeSettings","theStore","item","thisStore","OBJECT","storeNames","noIteration","isTopRenderCall","prevData","prevIndex","result","isRenderCall","useViews","renderWithViews","$isArray","setItemVar","newCtx","itemVar","newView","childView","itemResult","swapContent","outerOnRender","syntaxError","helpers","it","fallback","Err","isLinkExpr","convertBack","hasElse","pushprecedingContent","shift","loc","substr","rNewLine","blockTagCheck","block","parseTag","all","bind","colon","codeTag","params","slash","closeBlock","pathBindings","ctxProps","paramsArgs","paramsProps","paramsCtxProps","useTrigger","allowCode","rUnescapeQuotes","rTestElseIf","current","substring","stack","pop","parseParams","rBuildHash","onerror","isCtx","keyToken","keyValue","arg","param","hasHandlers","newNode","parsedParam","astTop","buildCode","setPaths","pathsArr","paths","deps","concat","paramStructure","parts","parseTokens","lftPrn0","lftPrn","bound","path","operator","err","eq","path2","prn","comma","lftPrn2","apos","quot","rtPrn","rtPrnDot","prn2","space","full","parsePath","allPath","not","object","viewProperty","pathTokens","leafToken","subPath","bindings","binds","named","bindto","_jsvto","bndCtx","bd","theOb","_jsv","sb","pathStart","parenDepth","expr","exprFn","newOb","aposed","quoted","boundName","bndStack","prm","tmplLinks","indexOf","paramIndex","split","join","rPath","fnCall","rParams","ast","node","hasTag","hasEncoder","getsVal","hasCnvt","useCnvt","tmplBindings","boundOnErrStart","boundOnErrEnd","tagRender","nestedTmpls","nestedTmpl","tagAndElses","nextIsElse","oldCode","isElse","isGetVal","tagCtxFn","tagStart","trigger","tmplBindingKey","templates","converters","code","tmplOptions","debug","Function","_tag","parentContext","getCharEntity","ch","charEntities","charCodeAt","getTargetProps","toJSON","$fnRender","tmplElem","jquery","selector","call","htmlEncode","text","rIsHtml","rHtmlEncode","setGlobals","jsvStoreName","versionNumber","rAttrEncode","&","<",">","\u0000","'","\"","`","jsr","jsrender","jsrToJq","jsviews","jsv","sub","parse","extend","syntaxErr","_ths","_cnvt","_err","Error","hlp","observable","renderFile","__express","isFunction","ob","Array","obj","_jq","jq","delimiters","if","done","selected","for","finalElse","include","*",":*","dbg","url","encodeURI"],"mappings":"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","file":"jsrender.min.js","sourcesContent":["/*! JsRender v0.9.71 (Beta): http://jsviews.com/#jsrender */\n/*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */\n/*\n * Best-of-breed templating in browser or on Node.js.\n * Does not require jQuery, or HTML DOM\n * Integrates with JsViews (http://jsviews.com/#jsviews)\n *\n * Copyright 2015, Boris Moore\n * Released under the MIT License.\n */\n\n//jshint -W018, -W041\n\n(function(factory) {\n\t// global var is the this object, which is window when running in the usual browser environment\n\tvar global = (0, eval)('this'), // jshint ignore:line\n\t\t$ = global.jQuery;\n\n\tif (typeof define === \"function\" && define.amd) { // AMD script loader, e.g. RequireJS\n\t\tdefine(factory);\n\t} else if (typeof exports === \"object\") { // CommonJS e.g. Browserify\n\t\tmodule.exports = $\n\t\t\t? factory($)\n\t\t\t: function($) { // If no global jQuery, take optional jQuery passed as parameter: require('jsrender')(jQuery)\n\t\t\t\tif ($ && !$.fn) {\n\t\t\t\t\tthrow \"Provide jQuery or null\";\n\t\t\t\t}\n\t\t\t\treturn factory($);\n\t\t\t};\n\t} else { // Browser using plain - data-linked tag, close marker - // TODO add validation to track whether we are in attribute context (not yet hit preceding ending with a >) or element content of current 'parentTag' - // and accordingly disallow inserting script markers in attribute context. Similar for elCnt too, so no "" or "
...{{/if}}..." + // We validate with inTag so no script markers are inserted in attribute context e.g. for: + // "
" or "
...{{/if}}..." preceding = id ? (preceding + endOfElCnt + spaceBefore + (inTag ? "" : openScript + id + closeScript)+ spaceAfter + tag) : endOfElCnt || all; @@ -4025,13 +4036,13 @@ function viewLink(outerData, parentNode, prevNode, nextNode, html, refresh, cont if (validate && boundId) { if (inTag) { // JsViews data-linking tags are not allowed within element markup. - // See https://github.com/BorisMoore/jsviews/issues/303 + // See jsviews/issues/303 syntaxError('{^{ within elem markup (' + inTag + ' ). Use data-link="..."'); } if (id.charAt(0) === "#") { tagStack.unshift(id.slice(1)); } else if (id.slice(1) !== (bndId = tagStack.shift())) { - // See https://github.com/BorisMoore/jsviews/issues/213 + // See jsviews/issues/213 syntaxError('Closing tag for {^{...}} under different elem: <' + bndId + '>'); } } @@ -4343,7 +4354,7 @@ function viewLink(outerData, parentNode, prevNode, nextNode, html, refresh, cont if (tag.onBeforeLink) { tag.onBeforeLink(); } - // We data-link depth-last ("on the way in"), which is better for perf - and allows setting parent tags etc. + // We data-link depth-first ("on the way in"), which is better for perf - and allows setting parent tags etc. view = tag.tagCtx.view; addDataBinding(undefined, tag._prv, view, linkInfo.id); } else { @@ -4502,7 +4513,7 @@ function viewLink(outerData, parentNode, prevNode, nextNode, html, refresh, cont function addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, context) { // Add data binding for data-linked elements or {^{...}} data-linked tags - var tmpl, tokens, attr, convertBack, params, trimLen, tagExpr, linkFn, linkCtx, tag, rTagIndex, hasElse, + var tmpl, tokens, attr, convertBack, params, trimLen, tagExpr, linkFn, linkCtx, tag, rTagIndex, hasElse, lastIndex, linkExpressions = []; if (boundTagId) { @@ -4539,10 +4550,13 @@ function addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, // This is the first time this view template has been linked, so we compile the data-link expressions, and store them on the template. linkMarkup = normalizeLinkTag(linkMarkup, defaultAttr(node)); - rTagDatalink.lastIndex = 0; - + lastIndex = rTagDatalink.lastIndex = 0; while (tokens = rTagDatalink.exec(linkMarkup)) { // TODO require } to be followed by whitespace or $, and remove the \}(!\}) option. linkExpressions.push(tokens); + lastIndex = rTagDatalink.lastIndex; + } + if (lastIndex < linkMarkup.length) { + syntaxError(linkMarkup); } while (tokens = linkExpressions.shift()) { // Iterate over the data-link expressions, for different target attrs, @@ -4559,9 +4573,6 @@ function addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, tagExpr += "}{{/" + tokens[4] + "}"; } params = tokens[9]; - if (convertBack = tokens[10]) { - convertBack = convertBack.slice(1); - } linkCtx = { data: data, // source @@ -4575,10 +4586,13 @@ function addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, }; if (tokens[6]) { + convertBack = tokens[10]; linkCtx.convert = tokens[5] || ""; - if (!attr && convertBack !== undefined) { + if (!attr && convertBack !== undefined && defaultAttr(node)) { // Default target, so allow 2 way binding - linkCtx.convertBack = convertBack; + linkCtx.convertBack = convertBack = convertBack.slice(1); + } else { + convertBack = undefined; } } // Compile the linkFn expression which evaluates and binds a data-link expression @@ -4805,7 +4819,8 @@ function asyncElemChangeHandler(ev) { function bindElChange($elem, trig, onoff) { if (trig) { - $elem[onoff](trig === true ? "keydown" : trig, trig === true ? asyncElemChangeHandler : elemChangeHandler); + trig = "" + trig === trig ? trig : "keydown"; // Set trigger to (true || truey non-string (e.g. 1) || 'keydown'): Get 'keydown' with async + $elem[onoff](trig, trig === "keydown" ? asyncElemChangeHandler : elemChangeHandler); } } @@ -4931,7 +4946,7 @@ function removeViewBinding(bindId, linkedElemTag, elem) { for (objId in binding.bnd) { object = binding.bnd[objId]; obsId = binding.cbId; - if ($.isArray(object)) { + if ($isArray(object)) { $([object]).off(arrayChangeStr + obsId).off(propertyChangeStr + obsId); // There may be either or both of arrayChange and propertyChange } else { $(object).off(propertyChangeStr + obsId); @@ -5083,7 +5098,7 @@ $sub.viewInfos = viewInfos; // Expose viewInfos() as public helper method delimCloseChar0 = delimChars[2]; delimCloseChar1 = delimChars[3]; linkChar = delimChars[4]; - rTagDatalink = new RegExp("(?:^|\\s*)([\\w-]*)(\\" + linkChar + ")?(\\" + delimOpenChar1 + $sub.rTag + "\\" + delimCloseChar0 + ")", "g"); + rTagDatalink = new RegExp("(?:^|\\s*)([\\w-]*)(\\" + linkChar + ")?(\\" + delimOpenChar1 + $sub.rTag + "(:\\w*)?\\" + delimCloseChar0 + ")", "g"); // Default rTag: attr bind tagExpr tag converter colon html comment code params // (?:^|\s*)([\w-]*)(\^)?({(?:(?:(\w+(?=[\/\s}]))|(?:(\w+)?(:)|(>)|!--((?:[^-]|-(?!-))*)--|(\*)))\s*((?:[^}]|}(?!}))*?))}) @@ -5603,7 +5618,7 @@ $extend($tags["for"], { $observe(arrBinding[0], arrBinding[1], true); //unobserve previous array delete arrayBindings[i]; } - if (!arrayBindings[i] && $.isArray(data)) { + if (!arrayBindings[i] && $isArray(data)) { $observe(data, arrHandler = function(ev, eventArgs) { var tagCt = tagCtx; tag.onArrayChange(ev, eventArgs, tagCt, linkCtx); diff --git a/jsviews.min.js b/jsviews.min.js index a1d4d1b..3a2ff47 100644 --- a/jsviews.min.js +++ b/jsviews.min.js @@ -1,5 +1,5 @@ -/*! jsviews.js v0.9.71 (Beta) single-file version: http://jsviews.com/ */ +/*! jsviews.js v0.9.72 (Beta) single-file version: http://jsviews.com/ */ /*! includes JsRender, JsObservable and JsViews - see: http://jsviews.com/#download */ -!function(e){var t=(0,eval)("this"),n=t.jQuery;"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof exports?module.exports=n?e(n):function(t){return e(t)}:e(!1)}(function(e){"use strict";function t(e,t){return function(){var n,r=this,i=r.base;return r.base=e,n=t.apply(r,arguments),r.base=i,n}}function n(e,n){return Re(n)&&(n=t(e?e._d?e:t(a,e):a,n),n._d=1),n}function r(e,t){for(var r in t.props)st.test(r)&&(e[r]=n(e[r],t.props[r]))}function i(e){return e}function a(){return""}function o(e){try{throw"dbg breakpoint"}catch(t){}return this.base?this.baseApply(arguments):e}function s(e){qe._dbgMode=e!==!1}function l(t){this.name=(e.link?"JsViews":"JsRender")+" Error",this.message=t||this.name}function d(e,t){var n;for(n in t)e[n]=t[n];return e}function c(e,t,n){return(0!==this||e)&&(Je=e?e.charAt(0):Je,ze=e?e.charAt(1):ze,Qe=t?t.charAt(0):Qe,We=t?t.charAt(1):We,Xe=n||Xe,e="\\"+Je+"(\\"+Xe+")?\\"+ze,t="\\"+Qe+"\\"+We,Ve="(?:(\\w+(?=[\\/\\s\\"+Qe+"]))|(\\w+)?(:)|(>)|(\\*))\\s*((?:[^\\"+Qe+"]|\\"+Qe+"(?!\\"+We+"))*?)(:\\w*)?",Ue.rTag="(?:"+Ve+")",Ve=new RegExp("(?:"+e+Ve+"(\\/)?|\\"+Je+"\\"+ze+"(?:(?:\\/(\\w+))|!--[\\s\\S]*?--))"+t,"g"),Ne=new RegExp("<.*>|([^\\\\]|^)[{}]|"+e+".*"+t)),[Je,ze,Qe,We,Xe]}function f(e,t){t||e===!0||(t=e,e=void 0);var n,r,i,a,o=this,s=!t||"root"===t;if(e){if(a=t&&o.type===t&&o,!a)if(n=o.views,o._.useKey){for(r in n)if(a=t?n[r].get(e,t):n[r])break}else for(r=0,i=n.length;!a&&i>r;r++)a=t?n[r].get(e,t):n[r]}else if(s)for(;o.parent;)a=o,o=o.parent;else for(;o&&!a;)a=o.type===t?o:void 0,o=o.parent;return a}function p(){var e=this.get("item");return e?e.index:void 0}function u(){return this.index}function v(e){var t,n=this,r=n.linkCtx,i=(n.ctx||{})[e];return void 0===i&&r&&r.ctx&&(i=r.ctx[e]),void 0===i&&(i=De[e]),i&&Re(i)&&!i._wrp&&(t=function(){return i.apply(this&&this!==Ie?this:n,arguments)},t._wrp=n,d(t,i)),t||i}function g(e){return e&&(e.fn?e:this.getRsc("templates",e)||Fe(e))}function h(e,t,n,i){var a,o,s="number"==typeof n&&t.tmpl.bnds[n-1],l=t.linkCtx;return void 0!==i?n=i={props:{},args:[i]}:s&&(n=s(t.data,t,Be)),o=n.args[0],(e||s)&&(a=l&&l.tag,a||(a=d(new Ue._tg,{_:{inline:!l,bnd:s,unlinked:!0},tagName:":",cvt:e,flow:!0,tagCtx:n}),l&&(l.tag=a,a.linkCtx=l),n.ctx=F(n.ctx,(l?l.view:t).ctx)),a._er=i&&o,r(a,n),n.view=t,a.ctx=n.ctx||{},n.ctx=void 0,o=a.cvtArgs(a.convert||"true"!==e&&e)[0],o=s&&t._.onRender?t._.onRender(o,t,a):o),void 0!=o?o:""}function _(e){var t=this,n=t.tagCtx,r=n.view,i=n.args;return e=t.convert||e,e=e&&(""+e===e?r.getRsc("converters",e)||V("Unknown converter: '"+e+"'"):e),i=i.length||n.index?e?i.slice():i:[r.data],e&&(e.depends&&(t.depends=Ue.getDeps(t.depends,t,e.depends,e)),i[0]=e.apply(t,i)),i}function m(e,t){for(var n,r,i=this;void 0===n&&i;)r=i.tmpl&&i.tmpl[e],n=r&&r[t],i=i.parent;return n||Be[e][t]}function b(e,t,n,i,a,o){t=t||Se;var s,l,d,c,f,p,u,v,g,h,_,m,b,x,y,w,k,C,j,A="",I=t.linkCtx||0,T=t.ctx,N=n||t.tmpl,S="number"==typeof i&&t.tmpl.bnds[i-1];for("tag"===e._is?(s=e,e=s.tagName,i=s.tagCtxs,d=s.template):(l=t.getRsc("tags",e)||V("Unknown tag: {{"+e+"}} "),d=l.template),void 0!==o?(A+=o,i=o=[{props:{},args:[]}]):S&&(i=S(t.data,t,Be)),v=i.length,u=0;v>u;u++)h=i[u],(!I||!I.tag||u&&!I.tag._.inline||s._er)&&((m=N.tmpls&&h.tmpl)&&(m=h.content=N.tmpls[m-1]),h.index=u,h.tmpl=m,h.render=E,h.view=t,h.ctx=F(h.ctx,T)),(n=h.props.tmpl)&&(h.tmpl=t.getTmpl(n)),s||(s=new l._ctr,b=!!s.init,s.parent=p=T&&T.tag,s.tagCtxs=i,j=s.dataMap,I&&(s._.inline=!1,I.tag=s,s.linkCtx=I),(s._.bnd=S||I.fn)?s._.arrVws={}:s.dataBoundOnly&&V("{^{"+e+"}} tag must be data-bound")),i=s.tagCtxs,j=s.dataMap,h.tag=s,j&&i&&(h.map=i[u].map),s.flow||(_=h.ctx=h.ctx||{},c=s.parents=_.parentTags=T&&F(_.parentTags,T.parentTags)||{},p&&(c[p.tagName]=p),c[s.tagName]=_.tag=s);if(!(s._er=o)){for(r(s,i[0]),s.rendering={},u=0;v>u;u++)h=s.tagCtx=i[u],k=h.props,w=s.cvtArgs(),(x=k.dataMap||j)&&(w.length||k.dataMap)&&(y=h.map,(!y||y.src!==w[0]||a)&&(y&&y.src&&y.unmap(),y=h.map=x.map(w[0],k,void 0,!s._.bnd)),w=[y.tgt]),s.ctx=h.ctx,u||(b&&(C=s.template,s.init(h,I,s.ctx),b=void 0),I&&(I.attr=s.attr=I.attr||s.attr),f=s.attr,s._.noVws=f&&f!==ft),g=void 0,s.render&&(g=s.render.apply(s,w)),w.length||(w=[t]),void 0===g&&(g=h.render(w[0],!0)||(a?void 0:"")),A=A?A+(g||""):g;s.rendering=void 0}return s.tagCtx=i[0],s.ctx=s.tagCtx.ctx,s._.noVws&&s._.inline&&(A="text"===f?Pe.html(A):""),S&&t._.onRender?t._.onRender(A,t,s):A}function x(e,t,n,r,i,a,o,s){var l,d,c,f=this,u="array"===t;f.content=s,f.views=u?[]:{},f.parent=n,f.type=t||"top",f.data=r,f.tmpl=i,c=f._={key:0,useKey:u?0:1,id:""+dt++,onRender:o,bnds:{}},f.linked=!!o,n?(l=n.views,d=n._,d.useKey?(l[c.key="_"+d.useKey++]=f,f.index=gt,f.getIndex=p):l.length===(c.key=f.index=a)?l.push(f):l.splice(a,0,f),f.ctx=e||n.ctx):f.ctx=e}function y(e){var t,n,r,i,a,o,s;for(t in bt)if(a=bt[t],(o=a.compile)&&(n=e[t+"s"]))for(r in n)i=n[r]=o(r,n[r],e,0),i._is=t,i&&(s=Ue.onStore[t])&&s(r,i,o)}function w(e,t,r){function i(){var t=this;t._={inline:!0,unlinked:!0},t.tagName=e}var a,o,s,l=new Ue._tg;if(Re(t)?t={depends:t.depends,render:t}:""+t===t&&(t={template:t}),o=t.baseTag){t.flow=!!t.flow,t.baseTag=o=""+o===o?r&&r.tags[o]||Oe[o]:o,l=d(l,o);for(s in t)l[s]=n(o[s],t[s])}else l=d(l,t);return void 0!==(a=l.template)&&(l.template=""+a===a?Fe[a]||Fe(a):a),l.init!==!1&&((i.prototype=l).constructor=l._ctr=i),r&&(l._parentTmpl=r),l}function k(e){return this.base.apply(this,e)}function C(t,n,r,i){function a(n){var a,s;if(""+n===n||n.nodeType>0&&(o=n)){if(!o)if(/^\.\/[^\\:*?"<>]*$/.test(n))(s=Fe[t=t||n])?n=s:o=document.getElementById(n);else if(e.fn&&!Ne.test(n))try{o=e(document).find(n)[0]}catch(l){}o&&(i?n=o.innerHTML:(a=o.getAttribute(ut),a?a!==vt?(n=Fe[a],delete Fe[a]):e.fn&&(n=e.data(o)[vt]):(t=t||(e.fn?vt:n),n=C(t,o.innerHTML,r,i)),n.tmplName=t=t||a,t!==vt&&(Fe[t]=n),o.setAttribute(ut,t),e.fn&&e.data(o,vt,n))),o=void 0}else n.fn||(n=void 0);return n}var o,s,l=n=n||"";return 0===i&&(i=void 0,l=a(l)),i=i||(n.markup?n:{}),i.tmplName=t,r&&(i._parentTmpl=r),!l&&n.markup&&(l=a(n.markup))&&l.fn&&(l=l.markup),void 0!==l?(l.fn||n.fn?l.fn&&(s=l):(n=A(l,i),S(l.replace(tt,"\\$&"),n)),s||(y(i),s=d(function(){return n.render.apply(n,arguments)},n)),t&&!r&&t!==vt&&(ht[t]=s),s):void 0}function j(e){function t(t,n){this.tgt=e.getTgt(t,n)}return Re(e)&&(e={getTgt:e}),e.baseMap&&(e=d(d({},e.baseMap),e)),e.map=function(e,n){return new t(e,n)},e}function A(t,n){var r,i=qe.wrapMap||{},a=d({tmpls:[],links:{},bnds:[],_is:"template",render:E},n);return a.markup=t,n.htmlTag||(r=it.exec(t),a.htmlTag=r?r[1].toLowerCase():""),r=i[a.htmlTag],r&&r!==i.div&&(a.markup=e.trim(a.markup)),a}function I(e,t){function n(i,a,o){var s,l,d,c;if(i&&typeof i===pt&&!i.nodeType&&!i.markup&&!i.getTgt){for(d in i)n(d,i[d],a);return Be}return void 0===a&&(a=i,i=void 0),i&&""+i!==i&&(o=a,a=i,i=void 0),c=o?o[r]=o[r]||{}:n,l=t.compile,null===a?i&&delete c[i]:(a=l?l(i,a,o,0):a,i&&(c[i]=a)),l&&a&&(a._is=e),a&&(s=Ue.onStore[e])&&s(i,a,l),a}var r=e+"s";Be[r]=n}function E(e,t,n,r,i,a){var o,s,l,d,c,f,p,u,v=r,g="";if(t===!0?(n=t,t=void 0):typeof t!==pt&&(t=void 0),(l=this.tag)?(c=this,v=v||c.view,d=v.getTmpl(l.template||c.tmpl),arguments.length||(e=v)):d=this,d){if(!v&&e&&"view"===e._is&&(v=e),v&&e===v&&(e=v.data),f=!v,Ke=Ke||f,v||((t=t||{}).root=e),!Ke||qe.useViews||d.useViews||v&&v!==Se)g=T(d,e,t,n,v,i,a,l);else{if(v?(p=v.data,u=v.index,v.index=gt):(v=Se,v.data=e,v.ctx=t),$e(e)&&!n)for(o=0,s=e.length;s>o;o++)v.index=o,v.data=e[o],g+=d.fn(e[o],v,Be);else v.data=e,g+=d.fn(e,v,Be);v.data=p,v.index=u}f&&(Ke=void 0)}return g}function T(e,t,n,r,i,a,o,s){function l(e){y=d({},n),y[b]=e}var c,f,p,u,v,g,h,_,m,b,y,w,k="";if(s&&(m=s.tagName,w=s.tagCtx,n=n?F(n,s.ctx):s.ctx,e===i.content?h=e!==i.ctx._wrp?i.ctx._wrp:void 0:e!==w.content?e===s.template?(h=w.tmpl,n._wrp=w.content):h=w.content||i.content:h=i.content,w.props.link===!1&&(n=n||{},n.link=!1),(b=w.props.itemVar)&&("~"!==b.charAt(0)&&N("Use itemVar='~myItem'"),b=b.slice(1))),i&&(o=o||i._.onRender,n=F(n,i.ctx)),a===!0&&(g=!0,a=0),o&&(n&&n.link===!1||s&&s._.noVws)&&(o=void 0),_=o,o===!0&&(_=void 0,o=i._.onRender),n=e.helpers?F(e.helpers,n):n,y=n,$e(t)&&!r)for(p=g?i:void 0!==a&&i||new x(n,"array",i,t,e,a,o),i&&i._.useKey&&(p._.bnd=!s||s._.bnd&&s),b&&(p.it=b),b=p.it,c=0,f=t.length;f>c;c++)b&&l(t[c]),u=new x(y,"item",p,t[c],e,(a||0)+c,o,h),v=e.fn(t[c],u,Be),k+=p._.onRender?p._.onRender(v,u):v;else b&&l(t),p=g?i:new x(y,m||"data",i,t,e,a,o,h),s&&!s.flow&&(p.tag=s),k+=e.fn(t,p,Be);return _?_(k,p):k}function V(e,t,n){var r=qe.onError(e,t,n);if(""+e===e)throw new Ue.Err(r);return!t.linkCtx&&t.linked?Pe.html(r):r}function N(e){V("Syntax error\n"+e)}function S(e,t,n,r,i){function a(t){t-=u,t&&g.push(e.substr(u,t).replace(Ye,"\\n"))}function o(t,n){t&&(t+="}}",N((n?"{{"+n+"}} block has {{/"+t+" without {{"+t:"Unmatched or missing {{/"+t)+", in template:\n"+e))}function s(r,s,l,p,_,m,b,x,y,w,k,C){b&&y&&(x=y,y=void 0),(b&&s||y&&!_||w&&!l)&&N(r),y&&(y=y.slice(1)),m&&(_=":",p=ft),w=w||n&&!i;var j=(s||n)&&[[]],A="",I="",E="",T="",V="",S="",B="",M="",$=!w&&!_;l=l||(x=x||"#data",_),a(C),u=C+r.length,b?f&&g.push(["*","\n"+x.replace(/^:/,"ret+= ").replace(et,"$1")+";\n"]):l?("else"===l&&(rt.test(x)&&N('for "{{else if expr}}" use "{{else expr}}"'),j=h[7]&&[[]],h[8]=e.substring(h[8],C),h=v.pop(),g=h[2],$=!0),x&&R(x.replace(Ye," "),j,t).replace(nt,function(e,t,n,r,i,a,o,s){return r="'"+i+"':",o?(I+=a+",",T+="'"+s+"',"):n?(E+=r+a+",",S+=r+"'"+s+"',"):t?B+=a:("trigger"===i&&(M+=a),A+=r+a+",",V+=r+"'"+s+"',",c=c||st.test(i)),""}).slice(0,-1),j&&j[0]&&j.pop(),d=[l,p||!!y||c||"",$&&[],L(T,V,S),L(I,A,E),B,M,j||0],g.push(d),$&&(v.push(h),h=d,h[8]=u)):k&&(o(k!==h[0]&&"else"!==h[0]&&k,h[0]),h[8]=e.substring(h[8],C),h=v.pop()),o(!h&&k),g=h[2]}var l,d,c,f=qe.allowCode||t&&t.allowCode,p=[],u=0,v=[],g=p,h=[,,p];return f&&(t.allowCode=f),n&&(e=Je+e+We),o(v[0]&&v[0][2].pop()[0]),e.replace(Ve,s),a(e.length),(u=p[p.length-1])&&o(""+u!==u&&+u[8]===u[8]&&u[0]),n?(l=$(p,e,n),B(l,[p[0][7]])):l=$(p,t),l}function B(e,t){var n,r,i=0,a=t.length;for(e.deps=[];a>i;i++){r=t[i];for(n in r)"_jsvto"!==n&&r[n].length&&(e.deps=e.deps.concat(r[n]))}e.paths=r}function L(e,t,n){return[e.slice(0,-1),t.slice(0,-1),n.slice(0,-1)]}function M(e,t){return"\n "+(t?t+":{":"")+"args:["+e[0]+"]"+(e[1]||!t?",\n props:{"+e[1]+"}":"")+(e[2]?",\n ctx:{"+e[2]+"}":"")}function R(e,t,n){function r(r,_,m,b,x,y,w,k,C,j,A,I,E,T,V,B,L,M,R,$){function F(e,n,r,o,s,l,f,p){var u="."===r;if(r&&(x=x.slice(n.length),u||(e=(o?'view.hlp("'+o+'")':s?"view":"data")+(p?(l?"."+l:o?"":s?"":"."+r)+(f||""):(p=o?"":s?l||"":r,"")),e+=p?"."+p:"",e=n+("view.data"===e.slice(0,9)?e.slice(5):e)),d)){if(O="linkTo"===i?a=t._jsvto=t._jsvto||[]:c.bd,U=u&&O[O.length-1]){if(U._jsv){for(;U.sb;)U=U.sb;U.bnd&&(x="^"+x.slice(1)),U.sb=x,U.bnd=U.bnd||"^"===x.charAt(0)}}else O.push(x);h[v]=R+(u?1:0)}return e}b=d&&b,b&&!k&&(x=b+x),y=y||"",m=m||_||I,x=x||C,j=j||L||"";var P,D,O,U,q;if(!w||l||s){if(d&&B&&!l&&!s&&(!i||o||a)&&(P=h[v-1],$.length-1>R-(P||0))){if(P=$.slice(P,R+r.length),D!==!0)if(O=a||f[v-1].bd,U=O[O.length-1],U&&U.prm){for(;U.sb&&U.sb.prm;)U=U.sb;q=U.sb={path:U.sb,bnd:U.bnd}}else O.push(q={path:O.pop()});B=ze+":"+P+" onerror=''"+Qe,D=u[B],D||(u[B]=!0,u[B]=D=S(B,n,!0)),D!==!0&&q&&(q._jsv=D,q.prm=c.bd,q.bnd=q.bnd||q.path&&q.path.indexOf("^")>=0)}return l?(l=!E,l?r:I+'"'):s?(s=!T,s?r:I+'"'):(m?(h[v]=R++,c=f[++v]={bd:[]},m):"")+(M?v?"":(p=$.slice(p,R),(i?(i=o=a=!1,"\b"):"\b,")+p+(p=R+r.length,d&&t.push(c.bd=[]),"\b")):k?(v&&N(e),d&&t.pop(),i=x,o=b,p=R+r.length,b&&(d=c.bd=t[i]=[]),x+":"):x?x.split("^").join(".").replace(Ze,F)+(j?(c=f[++v]={bd:[]},g[v]=!0,j):y):y?y:V?(g[v]=!1,c=f[--v],V+(j?(c=f[++v],g[v]=!0,j):"")):A?(g[v]||N(e),","):_?"":(l=E,s=T,'"'))}N(e)}var i,a,o,s,l,d=t&&t[0],c={bd:d},f={0:c},p=0,u=n?n.links:d&&(d.links=d.links||{}),v=0,g={},h={},_=(e+(n?" ":"")).replace(Ge,r);return!v&&_||N(e)}function $(e,t,n){var r,i,a,o,s,l,d,c,f,p,u,v,g,h,_,m,b,x,y,w,k,C,j,I,E,T,V,S,L,R,F=0,P=qe.useViews||t.useViews||t.tags||t.templates||t.helpers||t.converters,D="",O={},U=e.length;for(""+t===t?(x=n?'data-link="'+t.replace(Ye," ").slice(1,-1)+'"':t,t=0):(x=t.tmplName||"unnamed",t.allowCode&&(O.allowCode=!0),t.debug&&(O.debug=!0),u=t.bnds,b=t.tmpls),r=0;U>r;r++)if(i=e[r],""+i===i)D+='\n+"'+i+'"';else if(a=i[0],"*"===a)D+=";\n"+i[1]+"\nret=ret";else{if(o=i[1],k=!n&&i[2],s=M(i[3],"params")+"},"+M(g=i[4]),S=i[5],R=i[6],C=i[8]&&i[8].replace(et,"$1"),(E="else"===a)?v&&v.push(i[7]):(F=0,u&&(v=i[7])&&(v=[v],F=u.push(1))),P=P||g[1]||g[2]||v||/view.(?!index)/.test(g[0]),(T=":"===a)?o&&(a=o===ft?">":o+a):(k&&(y=A(C,O),y.tmplName=x+"/"+a,y.useViews=y.useViews||P,$(k,y),P=y.useViews,b.push(y)),E||(w=a,P=P||a&&(!Oe[a]||!Oe[a].flow),I=D,D=""),j=e[r+1],j=j&&"else"===j[0]),L=S?";\ntry{\nret+=":"\n+",h="",_="",T&&(v||R||o&&o!==ft)){if(V="return {"+s+"};",m='c("'+o+'",view,',V=new Function("data,view,j,u"," // "+x+" "+F+" "+a+"\n"+V),V._er=S,h=m+F+",",_=")",V._tag=a,n)return V;B(V,v),p=!0}if(D+=T?(n?(S?"\ntry{\n":"")+"return ":L)+(p?(p=void 0,P=f=!0,m+(v?(u[F-1]=V,F):"{"+s+"}")+")"):">"===a?(d=!0,"h("+g[0]+")"):(c=!0,"((v="+(g[0]||"data")+')!=null?v:"")')):(l=!0,"\n{view:view,tmpl:"+(k?b.length:"0")+","+s+"},"),w&&!j){if(D="["+D.slice(0,-1)+"]",m='t("'+w+'",view,this,',n||v){if(D=new Function("data,view,j,u"," // "+x+" "+F+" "+w+"\nreturn "+D+";"),D._er=S,D._tag=w,v&&B(u[F-1]=D,v),n)return D;h=m+F+",undefined,",_=")"}D=I+L+m+(F||D)+")",v=0,w=0}S&&(P=!0,D+=";\n}catch(e){ret"+(n?"urn ":"+=")+h+"j._err(e,view,"+S+")"+_+";}\n"+(n?"":"ret=ret"))}D="// "+x+"\nvar v"+(l?",t=j._tag":"")+(f?",c=j._cnvt":"")+(d?",h=j.converters.html":"")+(n?";\n":',ret=""\n')+(O.debug?"debugger;":"")+D+(n?"\n":";\nreturn ret;"),qe._dbgMode&&(D="try {\n"+D+"\n}catch(e){\nreturn j._err(e, view);\n}");try{D=new Function("data,view,j,u",D)}catch(q){N("Compiled template code:\n\n"+D+'\n: "'+q.message+'"')}return t&&(t.fn=D,t.useViews=!!P),D}function F(e,t){return e&&e!==t?t?d(d({},t),e):e:t&&d({},t)}function P(e){return ct[e]||(ct[e]="&#"+e.charCodeAt(0)+";")}function D(e){var t,n,r=[];if(typeof e===pt)for(t in e)n=e[t],n&&n.toJSON&&!n.toJSON()||Re(n)||r.push({key:t,prop:n});return r}function O(t,n,r){var i=this.jquery&&(this[0]||V('Unknown template: "'+this.selector+'"')),a=i.getAttribute(ut);return E.call(a?e.data(i)[vt]:Fe(i),t,n,r)}function U(e){return void 0!=e?ot.test(e)&&(""+e).replace(lt,P)||e:""}function q(t,n,r){var i,a,o,s,l,d,c,f,p,u,v,g,h,_,m,b,x,y=t.target,w=y._jsvBnd;if(w)for(;u=On.exec(w);)if((u=Sn[u[1]])&&(m=u.to)){if(s=u.linkCtx,p=s.view,_=s.tag,f=e(y),g=p.hlp(sn),h=p.hlp(ln),o=X(y),i=yn[o],void 0===r&&(r=Re(o)?o(y):i?f[i]():f.attr(o)),d=m[1],m=m[0],m=m+""===m?[s.data,m]:m,d&&(l=Re(d)?d:p.getRsc("converters",d)),l&&(r=l.call(_,r)),v=p.linkCtx,p.linkCtx=s,b={change:"change",oldValue:s._val,value:r},!(g&&(a=g.call(s,t,b)===!1)||_&&_.onBeforeChange&&(a=_.onBeforeChange(t,b)===!1)||void 0===r)&&(c=m[0],void 0!==r&&c)){if(c._jsv)for(x=c,c=s.data;x&&x.sb;)c=s._ctxCb(x,c),x=x.sb;_&&(_._.chging=!0),Me(c).setProperty(m[2]||m[1],r),h&&h.call(s,t,b),_&&(_.onAfterChange&&_.onAfterChange(t,b),_._.chging=void 0),s._val=r}p.linkCtx=v}}function K(e,t,n){var r,i,a,o,s,l,d=this,c=d.tag,f=d.data,p=d.elem,u=d.convert,v=p.parentNode,g=d.view,h=g.linkCtx,_=g.hlp(sn);if(g.linkCtx=d,!(!v||_&&t&&_.call(d,e,t)===!1||t&&"*"!==e.data.prop&&e.data.prop!==t.path)){if(t&&(d.eventArgs=t),t||d._toLk){if(d._toLk=0,n._er)try{i=n(f,g)}catch(m){s=n._er,l=V(m,g,new Function("data,view","return "+s+";")(f,g)),i=[{props:{},args:[l]}]}else i=n(f,g,Be);if(r=H(i,d,c=d.tag,d.attr||X(p,!0,void 0!==u)),c){if(o=s||c._er,i=i[0]?i:[i],a=!o&&t&&c.onUpdate&&c.onUpdate(e,t,i)===!1,ge(c,i,o),a||r===vn)return r===ft&&c.onBeforeLink&&c.onBeforeLink(),fe(c),Y(d,f,p),void(g.linkCtx=h);if(c._.chging)return;i=":"===c.tagName?Be._cnvt(c.cvt,g,i[0]):Be._tag(c,g,g.tmpl,i,!0,l)}else n._tag&&(u=""===u?hn:u,i=u?Be._cnvt(u,g,i[0]||i):Be._tag(n._tag,g,g.tmpl,i,!0,l),ke(c=d.tag,!0),r=d.attr||r);z(i,d,r,c)&&t&&(_=g.hlp(ln))&&_.call(d,e,t),d._noUpd=0,c&&(c._er=s,fe(c,t))}Y(d,f,p),g.linkCtx=h}}function H(t,n,r,i){var a,o,s,l,d=r&&r.parentElem||n.elem;if(void 0!==t){if(l=e(d),i=r&&r.attr||i,Re(t)&&V(n.expr+": missing parens"),s=/^css-/.test(i)&&i.slice(4))a=e.style(d,s),+t===t&&(a=parseInt(a));else if("link"!==i){if("value"===i)d.type===fn&&(a=l.prop(i=cn));else if(i===pn){if(d.value!==""+t)return i;a=l.prop(cn)}void 0===a&&(o=yn[i],a=o?l[o]():l.attr(i))}n._val=a}return i}function J(e,t){e._df=t,e[(t?"set":"remove")+"Attribute"](bn,"")}function z(t,n,r,i){var a,o,s,l,d,c,f,p,u,v,g,h,_,m=r!==vn&&void 0!==t&&!n._noUpd,b=n.data,x=i&&i.parentElem||n.elem,y=e(x),w=n.view,k=n._val,C=w.linkCtx,j=i||r===ft;if(i&&(i.parentElem=i.parentElem||n.expr||i._elCnt?x:x.parentNode,o=i._prv,s=i._nxt),!m)return void(r===ft&&i&&i.onBeforeLink&&i.onBeforeLink());if("visible"===r&&(r="css-display"),/^css-/.test(r))"visible"===n.attr&&(_=(x.currentStyle||Un.call(Ie,x,"")).display,t?(t=x._jsvd||_,t!==vn||(t=Nn[h=x.nodeName])||(g=document.createElement(h),document.body.appendChild(g),t=Nn[h]=(g.currentStyle||Un.call(Ie,g,"")).display,document.body.removeChild(g))):(x._jsvd=_,t=vn)),(j=j||k!==t)&&e.style(x,r.slice(4),t);else if("link"!==r){if(/^data-/.test(r)&&e.data(x,r.slice(5),t),r===cn)c=!0,t=t&&"false"!==t;else if(r===pn){if(x.value!==""+t)return void Y(n,b,x);t=c=!0,r=cn}else("selected"===r||"disabled"===r||"multiple"===r||"readonly"===r)&&(t=t&&"false"!==t?r:null);(a=yn[r])?r===ft?(w.linkCtx=n,i&&i._.inline?(d=i.nodes(!0),i._elCnt&&(o&&o!==s?ye(o,s,x,i._tgId,"^",!0):(f=x._df)&&(p=i._tgId+"^",u=f.indexOf("#"+p)+1,v=f.indexOf("/"+p),u&&v>0&&(u+=p.length,v>u&&(J(x,f.slice(0,u)+f.slice(v)),we(f.slice(u,v))))),o=o?o.previousSibling:s?s.previousSibling:x.lastChild),e(d).remove(),i&&i.onBeforeLink&&i.onBeforeLink(),l=w.link(w.data,x,o,s,t,i&&{tag:i._tgId,lazyLink:i.tagCtx.props.lazyLink})):(m&&y.empty(),i&&i.onBeforeLink&&i.onBeforeLink(),m&&(l=w.link(b,x,o,s,t,i&&{tag:i._tgId}))),w.linkCtx=C):(j=j||k!==t)&&("text"===r&&x.children&&!x.children[0]?void 0!==x.textContent?x.textContent=t:x.innerText=null===t?"":t:y[a](t)):(j=j||k!==t)&&y[c?"prop":"attr"](r,void 0!==t||c?t:null),n._val=t}return l||j}function Q(e,t){var n=this,r=n.hlp(sn),i=n.hlp(ln);if(!r||r.call(this,e,t)!==!1){if(t){var a=t.change,o=t.index,s=t.items;switch(a){case"insert":n.addViews(o,s);break;case"remove":n.removeViews(o,s.length);break;case"move":n.refresh();break;case"refresh":n.refresh()}}i&&i.call(this,e,t)}}function W(t){var n,r,i=t.type,a=t.data,o=t._.bnd;!t._.useKey&&o&&((r=t._.bndArr)&&(e([r[1]]).off(Et,r[0]),t._.bndArr=void 0),o!==!!o?i?o._.arrVws[t._.id]=t:delete o._.arrVws[t._.id]:i&&a&&(n=function(e){e.data&&e.data.off||Q.apply(t,arguments)},e([a]).on(Et,n),t._.bndArr=[n,a]))}function X(e,t,n){var r=e.nodeName.toLowerCase(),i=qe.merge[r]||e.contentEditable===hn&&{to:ft,from:ft};return i?t?"input"===r&&e.type===pn?pn:i.to:i.from:t?n?"text":ft:""}function Z(t,n,r,i,a,o,s){var l,d,c,f,p,u=t.parentElem,v=t._prv,g=t._nxt,h=t._elCnt;if(v&&v.parentNode!==u&&V("Missing parentNode"),s){f=t.nodes(),h&&v&&v!==g&&ye(v,g,u,t._.id,"_",!0),t.removeViews(void 0,void 0,!0),d=g,h&&(v=v?v.previousSibling:g?g.previousSibling:u.lastChild),e(f).remove();for(p in t._.bnds)_e(p)}else{if(n){if(c=i[n-1],!c)return!1;v=c._nxt}h?(d=v,v=d?d.previousSibling:u.lastChild):d=v.nextSibling}l=r.render(a,o,t._.useKey&&s,t,s||n,!0),t.link(a,u,v,d,l,c)}function G(e,t,n){var r,i;return n?(i="^`",ke(n,!0),r=n._tgId,r||(Sn[r=Bn++]=n,n._tgId=""+r)):(i="_`",ke(nn[r=t._.id]=t)),"#"+r+i+(void 0!=e?e:"")+"/"+r+i}function Y(e,t,n){var r,i,a,o,s,l=e.tag,c=e.convertBack,f=[],p=e._bndId||""+Bn++,u=e._hdl;if(e._bndId=void 0,l&&(f=l.depends||f,f=Re(f)?l.depends(l):f,a=l.linkedElem),!e._depends||""+e._depends!=""+f){for(e._depends&&Me._apply(!1,[t],e._depends,u,!0),o=e.fn.deps.slice(),i=o.length;i--;)s=o[i],s._jsv&&(o[i]=d({},s));r=Me._apply(!1,[t],o,f,u,e._ctxCb),r.elem=n,r.linkCtx=e,r._tgId=p,n._jsvBnd=n._jsvBnd||"",n._jsvBnd+="&"+p,e._depends=f,e.view._.bnds[p]=p,Sn[p]=r,a&&(r.to=[[],c]),(a||void 0!==c)&&ve(r,l&&l.convertBack||c),l&&(l.onAfterBind&&l.onAfterBind(r),l.flow||l._.inline||(n.setAttribute(an,(n.getAttribute(an)||"")+"#"+p+"^/"+p+"^"),l._tgId=""+p))}if(a&&a[0])for(l._.radio&&(a=a.find(un)),i=a.length;i--;)a[i]._jsvBnd=a[i]._jsvBnd||n._jsvBnd+"+",a[i]._jsvLkEl=l}function ee(e,t,n,r,i,a,o){return te(this,e,t,n,r,i,a,o)}function te(t,n,r,i,a,o,s,l){if(i===!0?(a=i,i=void 0):i="object"!=typeof i?void 0:d({},i),t&&n){n=n.jquery?n:e(n),Xt||(Xt=document.body,e(Xt).on(on,q).on("blur","[contenteditable]",q));for(var c,f,p,u,v,g,h,_,m,b=G,x=i&&"replace"===i.target,y=n.length;y--;){if(h=n[y],o=o||Gt(h),(m=o===Se)&&(Se.data=(Se.ctx=i||{}).root=r),""+t===t)re(t,h,o,void 0,!0,r,i);else{if(void 0!==t.markup)o.link===!1&&(i=i||{},i.link=b=!1),x&&(g=h.parentNode),p=t.render(r,i,a,o,void 0,b),g?(s=h.previousSibling,l=h.nextSibling,e.cleanData([h],!0),g.removeChild(h),h=g):(s=l=void 0,e(h).empty());else{if(t!==!0||o!==Se)break;_={lnk:1}}if(h._df&&!l){for(u=se(h._df,!0,Rn),c=0,f=u.length;f>c;c++)v=u[c],(v=nn[v.id])&&void 0!==v.data&&v.parent.removeViews(v._.key,void 0,!0);J(h)}o.link(r,h,s,l,p,_,i)}m&&(Se.data=Se.ctx=void 0)}}return n}function ne(t,n,r,i,a,o,s,l){function d(e,t,n,r,i,o,s,l,d,c,f,p,v,h){var _,m,b="";return h?(u=0,e):(g=d||c||"",r=r||f,n=n||v,q&&!n&&(!e||r||g||o&&!u)&&(q=void 0,U=me.shift()),r=r||n,r&&(u=0,q=void 0,R&&(n||v?Vn[U]||/;svg;|;math;/.test(";"+me.join(";")+";")||(_="'<"+U+".../"):Vn[r]?_="'' in:\n"+a)),Z=X,U=me.shift(),X=En[U],f=f?"":"",Z&&(he+=ee,ee="",X?he+="-":(b=f+mn+"@"+he+_n+(p||""),he=be.shift()))),X?(o?ee+=o:t=f||v||"",g&&(t+=g,ee&&(t+=" "+an+'="'+ee+'"',ee=""))):t=o?t+b+i+(u?"":mn+o+_n)+l+g:b||e,R&&s&&(u&&N("{^{ within elem markup ("+u+' ). Use data-link="..."'),"#"===o.charAt(0)?me.unshift(o.slice(1)):o.slice(1)!==(m=me.shift())&&N("Closing tag for {^{...}} under different elem: <"+m+">")),g&&(u=g,me.unshift(U),U=g.slice(1),R&&me[0]&&me[0]===Tn[U]&&V("Parent of must be "),q=Vn[U],(X=En[U])&&!Z&&(be.unshift(he),he=""),Z=X,he&&X&&(he+="+")),t)}function c(e,t){var r,i,a,o,s,l,d,c=[];if(e){for("@"===e._tkns.charAt(0)&&(t=y.previousSibling,y.parentNode.removeChild(y),y=void 0),b=e.length;b--;){if(k=e[b],a=k.ch,r=k.path)for(m=r.length-1;i=r.charAt(m--);)"+"===i?"-"===r.charAt(m)?(m--,t=t.previousSibling):t=t.parentNode:t=t.lastChild;"^"===a?(g=Sn[s=k.id])&&(d=t&&(!y||y.parentNode!==t),(!y||d)&&(g.parentElem=t),k.elCnt&&d&&J(t,(k.open?"#":"/")+s+a+(t._df||"")),c.push([d?null:y,k])):(w=nn[s=k.id])&&(w.parentElem||(w.parentElem=t||y&&y.parentNode||n,w._.onRender=G,w._.onArrayChange=Q,W(w)),o=w.parentElem,k.open?(w._elCnt=k.elCnt,t&&!y?J(t,"#"+s+a+(t._df||"")):(w._prv||J(o,ae(o._df,"#"+s+a)),w._prv=y)):(!t||y&&y.parentNode===t?y&&(w._nxt||J(o,ae(o._df,"/"+s+a)),w._nxt=y):(J(t,"/"+s+a+(t._df||"")),w._nxt=void 0),v=w.linkCtx,(l=w.ctx&&w.ctx.onAfterCreate||xe)&&l.call(v,w)))}for(b=c.length;b--;)_e.push(c[b])}return!e||e.elCnt}function f(e){var t,n,r;if(e)for(b=e.length,m=0;b>m;m++)if(k=e[m],n=g=Sn[k.id].linkCtx.tag,r=g.tagName===L,!g.flow||r){if(!B){for(t=1;n=n.parent;)t++;$=$||t}!B&&t!==$||L&&!r||S.push(g)}}function p(){var o,l,d="",p={},u=en+(ue?",["+bn+"]":"");for(x=In?n.querySelectorAll(u):e(u,n).get(),_=x.length,r&&r.innerHTML&&(j=In?r.querySelectorAll(u):e(u,r).get(),r=j.length?j[j.length-1]:r),$=0,h=0;_>h;h++)if(y=x[h],r&&!ne)ne=y===r;else{if(i&&y===i){ue&&(d+=oe(y));break}if(y.parentNode)if(ue){if(d+=oe(y),y._df){for(o=h+1;_>o&&y.contains(x[o]);)o++;p[o-1]=y._df}p[h]&&(d+=p[h]||"")}else pe&&(k=se(y,void 0,Fn))&&(k=k[0])&&(ie=ie?k.id!==ie&&ie:k.open&&k.id),!ie&&ye(se(y))&&y.getAttribute(Yt)&&_e.push([y])}if(ue&&(d+=n._df||"",(l=d.indexOf("#"+ue.id)+1)&&(d=d.slice(l+ue.id.length)),l=d.indexOf("/"+ue.id),l+1&&(d=d.slice(0,l)),f(se(d,void 0,Pn))),void 0===a&&n.getAttribute(Yt)&&_e.push([n]),le(r,X),le(i,X),ue)return void(ce&&ce.resolve());for(X&&he+ee&&(y=i,he&&(i?c(se(he+"+",!0),i):c(se(he,!0),n)),c(se(ee,!0),n),i&&(d=i.getAttribute(an),(_=d.indexOf(te)+1)&&(d=d.slice(_+te.length-1)),i.setAttribute(an,ee+d))),_=_e.length,h=0;_>h;h++)y=_e[h],C=y[1],y=y[0],C?(g=Sn[C.id])&&((v=g.linkCtx)&&(g=v.tag,g.linkCtx=v),C.open?(y&&(g.parentElem=y.parentNode,g._prv=y),g._elCnt=C.elCnt,g.onBeforeLink&&g.onBeforeLink(),w=g.tagCtx.view,re(void 0,g._prv,w,C.id)):(g._nxt=y,g._.unlinked&&(M=g.tagCtx,w=M.view,fe(g)))):re(y.getAttribute(Yt),y,Gt(y),void 0,pe,t,s);ce&&ce.resolve()}var u,v,g,h,_,m,b,x,y,w,k,C,j,A,I,E,T,S,B,L,M,R,$,F,P,D,O,U,q,K,H,z,X,Z,Y,ee,te,ne,ie,ce,pe,ue,ve=this,ge=ve._.id+"_",he="",_e=[],me=[],be=[],xe=ve.hlp(dn),ye=c;if(o&&(ce=o.lazyLink&&e.Deferred(),o.tmpl?I="/"+o._.id+"_":(pe=o.lnk,o.tag&&(ge=o.tag+"^",o=!0),(ue=o.get)&&(ye=f,S=ue.tags,B=ue.deep,L=ue.name)),o=o===!0),n=n?""+n===n?e(n)[0]:n.jquery?n[0]:n:ve.parentElem||document.body,R=!qe.noValidate&&n.contentEditable!==hn,U=n.tagName.toLowerCase(),X=!!En[U],r=r&&de(r,X),i=i&&de(i,X)||null,void 0!=a){if(H=document.createElement("div"),K=H,te=ee="",Y="http://www.w3.org/2000/svg"===n.namespaceURI?"svg_ns":(O=it.exec(a))&&O[1]||"",rn&&O&&O[2]&&V("Unsupported: "+O[2]),X){for(T=i;T&&!(E=se(T));)T=T.nextSibling;(z=E?E._tkns:n._df)&&(A=I||"",(o||!I)&&(A+="#"+ge),m=z.indexOf(A),m+1&&(m+=A.length,te=ee=z.slice(0,m),z=z.slice(m),E?T.setAttribute(an,z):J(n,z)))}if(q=void 0,a=(""+a).replace(Mn,d),R&&me.length&&N("Mismatched '<"+U+"...>' in:\n"+a),l)return;for(An.appendChild(H),Y=tn[Y]||tn.div,F=Y[0],K.innerHTML=Y[1]+a+Y[2];F--;)K=K.lastChild;for(An.removeChild(H),P=document.createDocumentFragment();D=K.firstChild;)P.appendChild(D);n.insertBefore(P,i)}return ce?setTimeout(p,0):p(),ce&&ce.promise()}function re(e,t,n,r,i,a,o){var s,l,d,c,f,p,u,v,g,h,_,m=[];if(r)g=Sn[r],g=g.linkCtx?g.linkCtx.tag:g,v=g.linkCtx||{data:n.data,elem:g._elCnt?g.parentElem:t,view:n,ctx:n.ctx,attr:ft,fn:g._.bnd,tag:g,_bndId:r},ie(v,v.fn);else if(e&&t){for(a=i?a:n.data,s=n.tmpl,e=ce(e,X(t)),Zt.lastIndex=0;l=Zt.exec(e);)m.push(l);for(;l=m.shift();){for(h=Zt.lastIndex,d=l[1],p=l[3];m[0]&&"else"===m[0][4];)p+="}{"+m.shift()[3],_=!0;_&&(p+="}{{/"+l[4]+"}"),f=l[9],(c=l[10])&&(c=c.slice(1)),v={data:a,elem:t,view:n,ctx:o,attr:d,isLk:i,_toLk:1,_noUpd:l[2]},l[6]&&(v.convert=l[5]||"",d||void 0===c||(v.convertBack=c)),v.expr=d+p,u=s.links[p],u||(s.links[p]=u=Ue.tmplFn(p,s,!0,c,_)),v.fn=u,ie(v,u),Zt.lastIndex=h}}}function ie(e,t){function n(n,r){K.call(e,n,r,t)}n.noArray=!0,e.isLk&&ke(e.view=new Ue.View(Ue.extendCtx(e.ctx,e.view.ctx),"link",e.view,e.data,e.expr,void 0,G)),e._ctxCb=be(e.view),e._hdl=n,n(!0)}function ae(e,t){var n;return e?(n=e.indexOf(t),n+1?e.slice(0,n)+e.slice(n+t.length):e):""}function oe(e){return e&&(""+e===e?e:e.tagName===gn?e.type.slice(3):1===e.nodeType&&e.getAttribute(an)||"")}function se(e,t,n){function r(e,t,n,r,a,s){o.push({elCnt:i,id:r,ch:a,open:t,close:n,path:s,token:e})}var i,a,o=[];return(a=t?e:oe(e))?(i=o.elCnt=e.tagName!==gn,i="@"===a.charAt(0)||i,o._tkns=a,a.replace(n||Dn,r),o):void 0}function le(e,t){e&&("jsv"===e.type?e.parentNode.removeChild(e):t&&""===e.getAttribute(Yt)&&e.removeAttribute(Yt))}function de(e,t){for(var n=e;t&&n&&1!==n.nodeType;)n=n.previousSibling;return n&&(1!==n.nodeType?(n=document.createElement(gn),n.type="jsv",e.parentNode.insertBefore(n,e)):oe(n)||n.getAttribute(Yt)||n.setAttribute(Yt,"")),n}function ce(t,n){return t=e.trim(t).replace(tt,"\\$&"),t.slice(-1)!==Qe?t=ze+":"+t+(n?":":"")+Qe:t}function fe(t,n){var r,i,a,o,s,l,d,c,f=t.tagCtx,p=f.view,u=f.props,v=t.linkCtx=t.linkCtx||{tag:t,data:p.data,view:p,ctx:p.ctx};if(t.onAfterLink&&t.onAfterLink(f,v,n),t._.unlinked=void 0,r=t.targetTag?t.targetTag.linkedElem:t.linkedElem,!t.noVal&&(i=r&&r[0])){if((a=t._.radio)&&(r=r.find(un)),a||!t._.chging){if(o=t.cvtArgs()[0],a||i!==v.elem){for(s=r.length;s--;)i=r[s],l=i._jsvLkEl,t._.inline&&(!l||l!==t&&l.targetTag!==t)&&(i._jsvLkEl=t,ve(Sn[t._tgId],t.convertBack),i._jsvBnd="&"+t._tgId+"+"),a&&(i[cn]=o===i.value);v._val=o}void 0!==o&&(a||void 0===i.value?i.contentEditable===hn&&(i.innerHTML=o):i.type===fn?i[cn]=o&&"false"!==o:r.val(o))}t.setSize&&(u.height&&r.height(u.height),u.width&&r.width(u.width)),u["class"]&&r.addClass(u["class"]),u.id&&(r[0].id=u.id),u.name&&r.attr("name",u.name)}(i=i||":"===t.tagName&&v.elem)&&(d=i._jsvTr,c=u.trigger,d!==c&&(i._jsvTr=c,r=r||e(i),ue(r,d,"off"),ue(r,c,"on")))}function pe(e){setTimeout(function(){q(e)},0)}function ue(e,t,n){t&&e[n](t===!0?"keydown":t,t===!0?pe:q)}function ve(e,t){var n,r,i,a,o,s=e.linkCtx,l=s.data,d=s.fn.paths;if(e&&d)if(d=(n=d._jsvto)||d[0],r=d&&d.length,!r||s.tag&&!s.tag.tagCtx.args.length)e.to=[[],t];else{if(a=d[r-1],a._jsv){for(o=a;a.sb&&a.sb._jsv;)i=a=a.sb;i=a.sb||i&&i.path,a=i?i.slice(1):o.path}e.to=i?[[o,a],t]:[s._ctxCb(i=a.split("^").join("."))||[l,i],t]}}function ge(e,t,n){var r,i,a=e.tagCtx.view,o=e.tagCtxs||[e.tagCtx],s=o.length,l=!t;if(t=t||e._.bnd.call(a.tmpl,(e.linkCtx||a).data,a,Be),n)o=e.tagCtxs=t,e.tagCtx=o[0];else for(;s--;)r=o[s],i=t[s],Me(r.props).setProperty(i.props),d(r.ctx,i.ctx),r.args=i.args,l&&(r.tmpl=i.tmpl);return Ue._ths(e,o[0]),o}function he(e){for(var t,n,r,i=[],a=e.length,o=a;o--;)i.push(e[o]);for(o=a;o--;)if(n=i[o],n.parentNode){if(r=n._jsvBnd)for(r=r.slice(1).split("&"),n._jsvBnd="",t=r.length;t--;)_e(r[t],n._jsvLkEl,n);we(oe(n)+(n._df||""))}}function _e(t,n,r){var i,a,o,s,l,d,c,f,p,u,v,g,h=Sn[t];if(n)r===n.linkedElem[0]&&(r._jsvLkEl=void 0,n.linkedElem=void 0);else if(h){delete Sn[t];for(i in h.bnd)s=h.bnd[i],l=h.cbId,e.isArray(s)?e([s]).off(Et+l).off(It+l):e(s).off(It+l),delete h.bnd[i];if(a=h.linkCtx){if(o=a.tag){if(d=o.tagCtxs)for(c=d.length;c--;)(f=d[c].map)&&f.unmap();p=o.linkedElem,u=p&&p[0]||a.elem,(v=u&&u._jsvTr)&&(ue(p||e(u),v,"off"),u._jsvTr=void 0),o.onDispose&&o.onDispose(),o._elCnt||(o._prv&&o._prv.parentNode.removeChild(o._prv),o._nxt&&o._nxt.parentNode.removeChild(o._nxt))}g=a.view,"link"===g.type?g.parent.removeViews(g._.key,void 0,!0):delete g._.bnds[t]}Ue._cbBnds[h.cbId]=void 0}}function me(t){t?(t=t.jquery?t:e(t),t.each(function(){for(var e;(e=Gt(this,!0))&&e.parent;)e.parent.removeViews(e._.key,void 0,!0);he(this.getElementsByTagName("*"))}),he(t)):(Xt&&(e(Xt).off(on,q).off("blur","[contenteditable]",q),Xt=void 0),Se.removeViews(),he(document.body.getElementsByTagName("*")))}function be(e){return function(t,n){var r,i,a=[n];if(e&&t){if(t._jsv)return t._jsv.call(e.tmpl,n,e,Be);if("~"===t.charAt(0))return"~tag"===t.slice(0,4)&&(i=e.ctx,"."===t.charAt(4)&&(r=t.slice(5).split("."),i=i.tag),r)?i?[i,r.join("."),n]:[]:(t=t.slice(1).split("."),(n=e.hlp(t.shift()))&&(t.length&&a.unshift(t.join(".")),a.unshift(n)),n?a:[]);if("#"===t.charAt(0))return"#data"===t?[]:[e,t.replace(Ln,""),n]}}}function xe(e){return e.type===fn?e[cn]:e.value}function ye(e,t,n,r,i,a){var o,s,l,d,c,f,p,u=0,v=e===t;if(e){for(l=se(e)||[],o=0,s=l.length;s>o;o++){if(d=l[o],f=d.id,f===r&&d.ch===i){if(!a)break;s=0}v||(c="_"===d.ch?nn[f]:Sn[f].linkCtx.tag,d.open?c._prv=t:d.close&&(c._nxt=t)),u+=f.length+2}u&&e.setAttribute(an,e.getAttribute(an).slice(u)),p=t?t.getAttribute(an):n._df,(s=p.indexOf("/"+r+i)+1)&&(p=l._tkns.slice(0,u)+p.slice(s+(a?-1:r.length+1))),p&&(t?t.setAttribute(an,p):J(n,p))}else J(n,ae(n._df,"#"+r+i)),a||t||J(n,ae(n._df,"/"+r+i))}function we(e){var t,n,r,i;if(i=se(e,!0,$n))for(t=0,n=i.length;n>t;t++)r=i[t],"_"===r.ch?(r=nn[r.id])&&r.type&&r.parent.removeViews(r._.key,void 0,!0):_e(r.id)}function ke(t,n){t.contents=function(t,n){t!==!!t&&(n=t,t=void 0);var r,i=e(this.nodes());return i[0]&&(r=n?i.filter(n):i,i=t&&n?r.add(i.find(n)):r),i},t.nodes=function(e,t,n){var r,i=this,a=i._elCnt,o=!t&&a,s=[];for(t=t||i._prv,n=n||i._nxt,r=o?t===i._nxt?i.parentElem.lastSibling:t:i._.inline===!1?t||i.linkCtx.elem.firstChild:t&&t.nextSibling;r&&(!n||r!==n);)(e||a||r.tagName!==gn)&&s.push(r),r=r.nextSibling;return s},t.childTags=function(e,t){e!==!!e&&(t=e,e=void 0);var n=this,r=n.link?n:n.tagCtx.view,i=n._prv,a=n._elCnt,o=[];return r.link(void 0,n.parentElem,a?i&&i.previousSibling:i,n._nxt,void 0,{get:{tags:o,deep:e,name:t,id:n.link?n._.id+"_":n._tgId+"^"}}),o},t.refresh=function(e){ -var t,n,r=this,i=r.linkCtx,a=r.tagCtx.view;return r.disposed&&V("Removed tag"),void 0===e&&(e=Be._tag(r,a,a.tmpl,ge(r),!0)),e+""===e&&(n=r._.inline?ft:i.attr||X(r.parentElem,!0),t=z(e,i,n,r)),fe(r),t||r},t.update=function(e){var t=this.linkedElem;t&&q({target:t[0]},void 0,e)},n?t.domChange=function(){var t=this.parentElem,n=e.hasData(t)&&e._data(t).events,r="jsv-domchange";n&&n[r]&&e(t).triggerHandler(r,arguments)}:(t.addViews=function(e,t,n){var r,i,a=this,o=t.length,s=a.views;if(!a._.useKey&&o&&(n=a.tmpl)&&(i=s.length+o,i===a.data.length&&Z(a,e,n,s,t,a.ctx)!==!1))for(r=e+o;i>r;r++)Me(s[r]).setProperty("index",r);return a},t.removeViews=function(t,n,r){function i(t){var n,i,a,o,s,l,d=c[t];if(d&&d.link){if(n=d._.id,r||(l=d.nodes()),d.removeViews(void 0,void 0,!0),d.type=void 0,o=d._prv,s=d._nxt,a=d.parentElem,r||(d._elCnt&&ye(o,s,a,n,"_"),e(l).remove()),!d._elCnt)try{o.parentNode.removeChild(o),s.parentNode.removeChild(s)}catch(f){}W(d);for(i in d._.bnds)_e(i);delete nn[n]}}var a,o,s,l=this,d=!l._.useKey,c=l.views;if(d&&(s=c.length),void 0===t)if(d){for(a=s;a--;)i(a);l.views=[]}else{for(o in c)i(o);l.views={}}else if(void 0===n&&(d?n=1:(i(t),delete c[t])),d&&n&&s-n===l.data.length){for(a=t+n;a-->t;)i(a);if(c.splice(t,n),s=c.length)for(;s>t;)Me(c[t]).setProperty("index",t++)}return this},t.refresh=function(e){var t=this,n=t.parent;return n&&(Z(t,t.index,t.tmpl,n.views,t.data,e,!0),W(t)),t},t.link=ne)}function Ce(e,t,n){if("set"===n.change){for(var r=e.tgt,i=r.length;i--&&r[i].key!==n.path;);-1===i?n.path&&!n.remove&&Me(r).insert({key:n.path,prop:n.value}):n.remove?Me(r).remove(i):Me(r[i]).setProperty("prop",n.value)}}function je(e,t,n){var r,i=e.src,a=n.change;"set"===a?"prop"===n.path?Me(i).setProperty(t.target.key,n.value):(Me(i).setProperty(n.oldValue,null),delete i[n.oldValue],Me(i).setProperty(n.value,t.target.prop)):"remove"===a?(r=n.items[0],Me(i).removeProperty(r.key),delete i[r.key]):"insert"===a&&(r=n.items[0],r.key&&Me(i).setProperty(r.key,r.prop))}function Ae(e){return e.indexOf(".")<0}var Ie=(0,eval)("this"),Ee=e===!1;if(e=e||Ie.jQuery,!e||!e.fn)throw"JsViews requires jQuery";var Te,Ve,Ne,Se,Be,Le,Me,Re,$e,Fe,Pe,De,Oe,Ue,qe,Ke,He="v1.0.0-beta",Je="{",ze="{",Qe="}",We="}",Xe="^",Ze=/^(!*?)(?:null|true|false|\d[\d.]*|([\w$]+|\.|~([\w$]+)|#(view|([\w$]+))?)([\w$.^]*?)(?:[.[^]([\w$]+)\]?)?)$/g,Ge=/(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(!*?[#~]?[\w$.^]+)?\s*((\+\+|--)|\+|-|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?[#~]?[\w$.^]+)([([])?)|(,\s*)|(\(?)\\?(?:(')|("))|(?:\s*(([)\]])(?=\s*[.^]|\s*$|[^\(\[])|[)\]])([([]?))|(\s+)/g,Ye=/[ \t]*(\r\n|\n|\r)/g,et=/\\(['"])/g,tt=/['"\\]/g,nt=/(?:\x08|^)(onerror:)?(?:(~?)(([\w$_\.]+):)?([^\x08]+))\x08(,)?([^\x08]+)/gi,rt=/^if\s/,it=/<(\w+)[>\s]/,at=/[\x00`><"'&]/g,ot=/[\x00`><\"'&]/,st=/^on[A-Z]|^convert(Back)?$/,lt=at,dt=0,ct={"&":"&","<":"<",">":">","\x00":"�","'":"'",'"':""","`":"`"},ft="html",pt="object",ut="data-jsv-tmpl",vt="jsvTmpl",gt="For #index in nested block use #getIndex().",ht={},_t=Ie.jsrender,mt=_t&&e&&!e.render,bt={template:{compile:C},tag:{compile:w},helper:{},converter:{}};if(Be={jsviews:He,settings:function(e){d(qe,e),s(qe._dbgMode),qe.jsv&&qe.jsv()},sub:{View:x,Err:l,tmplFn:S,parse:R,extend:d,extendCtx:F,syntaxErr:N,onStore:{},_ths:r,_tg:function(){}},map:j,_cnvt:h,_tag:b,_err:V},(l.prototype=new Error).constructor=l,p.depends=function(){return[this.get("item"),"index"]},u.depends="index",x.prototype={get:f,getIndex:u,getRsc:m,getTmpl:g,hlp:v,_is:"view"},!(_t||e&&e.render)){for(Te in bt)I(Te,bt[Te]);Fe=Be.templates,Pe=Be.converters,De=Be.helpers,Oe=Be.tags,Ue=Be.sub,qe=Be.settings,Ue._tg.prototype={baseApply:k,cvtArgs:_},Se=Ue.topView=new x,e?(e.fn.render=O,e.observable&&(d(Ue,e.views.sub),Be.map=e.views.map)):(e={},Ee&&(Ie.jsrender=e),e.renderFile=e.__express=e.compile=function(){throw"Node.js: use npm jsrender, or jsrender-node.js"},e.isFunction=function(e){return"function"==typeof e},e.isArray=Array.isArray||function(e){return"[object Array]"==={}.toString.call(e)},Ue._jq=function(t){t!==e&&(d(t,e),e=t,e.fn.render=O,delete e.jsrender)},e.jsrender=He),Re=e.isFunction,$e=e.isArray,e.render=ht,e.views=Be,e.templates=Fe=Be.templates,qe({debugMode:s,delimiters:c,onError:function(e,t,n){return t&&(e=void 0===n?"{Error: "+(e.message||e)+"}":Re(n)?n(e,t):n),void 0==e?"":e},_dbgMode:!1}),Oe({"if":{render:function(e){var t=this,n=t.tagCtx,r=t.rendering.done||!e&&(arguments.length||!n.index)?"":(t.rendering.done=!0,t.selected=n.index,n.render(n.view,!0));return r},flow:!0},"for":{render:function(e){var t,n=!arguments.length,r=this,i=r.tagCtx,a="",o=0;return r.rendering.done||(t=n?i.view.data:e,void 0!==t&&(a+=i.render(t,n),o+=$e(t)?t.length:1),(r.rendering.done=o)&&(r.selected=i.index)),a},flow:!0},props:{baseTag:"for",dataMap:j(D),flow:!0},include:{flow:!0},"*":{render:i,flow:!0},":*":{render:i,flow:!0},dbg:De.dbg=Pe.dbg=o}),Pe({html:U,attr:U,url:function(e){return void 0!=e?encodeURI(""+e):null===e?e:""}}),c()}if(mt&&_t.views.sub._jq(e),Be=e.views,Ue=Be.sub,Re=e.isFunction,$e=e.isArray,!e.observe){var xt=e.event.special,yt=[].slice,wt=[].splice,kt=[].concat,Ct=e.expando,jt=parseInt,At=/\S+/g,It=Ue.propChng=Ue.propChng||"propertyChange",Et=Ue.arrChng=Ue.arrChng||"arrayChange",Tt=Ue._cbBnds=Ue._cbBnds||{},Vt=It+".observe",Nt=1,St=1,Bt=1,Lt=e.hasData,Mt=e.data,Rt={},$t=function(e){return e._cId=e._cId||".obs"+St++},Ft=function(e){return this._data=e,this},Pt=function(e){return this._data=e,this},Dt=function(e){return $e(e)?[e]:e},Ot=function(e,t){e=$e(e)?e:[e];var n,r,i=t,a=i,o=e.length,s=[];for(n=0;o>n;n++)r=e[n],Re(r)?s=s.concat(Ot(r.call(t,t),t)):""+r===r?(a!==i&&s.push(i=a),s.push(r)):(t=a=r,a!==i&&s.push(i=a));return s},Ut=function(e,t){for(var n in e)return;Tt[t]=void 0},qt=function(e,t){function n(e){return typeof e===pt&&(f[0]||c&&$e(e))}if(!e.data||!e.data.off){var r,i,a,o=t.oldValue,s=t.value,l=e.data,d=l.observeAll,c=!l.cb.noArray,f=l.paths;e.type===Et?(l.cb.array||l.cb).call(l,e,t):(l.prop===t.path||"*"===l.prop)&&(d?(r=d._path+"."+t.path,i=d.filter,a=[e.target].concat(d.parents()),n(o)&&Kt(c,d.ns,[o],f,l.cb,!0,i,[a],r),n(s)&&Kt(c,d.ns,[s],f,l.cb,void 0,i,[a],r)):(n(o)&&Kt(c,[o],f,l.cb,!0),n(s)&&Kt(c,[s],f,l.cb)),l.cb(e,t))}},Kt=function(){var e=kt.apply([],arguments);return Le.apply(e.shift(),e)},Ht=function(e,t,n,r){e+""!==e&&(n=t,t=e,e=""),zt(e,this._data,t,n,[],"root",r)},Jt=function(e,t,n){Ht.call(this,e,t,n,!0)},zt=function(e,t,n,r,i,a,o,s){function l(e,t){for(f=e.length,u=a+"[]";f--;)d(e,f,t,1)}function d(t,i,a,o){var l,d;i!==Ct&&(l=Me._fltr(u,t[i],v,r))&&(d=v.slice(),o&&g&&d.unshift(g),zt(e,l,n,r||(o?void 0:0),d,u,a,s))}function c(e,t){switch(a=e.data.observeAll._path,g=e.target,t.change){case"insert":l(t.items);break;case"remove":l(t.items,!0);break;case"refresh":l(t.oldItems,!0),l(e.target);break;case"set":u=a+"."+t.path,d(t,"oldValue",!0),d(t,"value")}g=void 0,n.apply(this,arguments)}var f,p,u,v,g,h,_=!s||s.un||!o;if(t&&typeof t===pt){if(v=[t].concat(i),p=$e(t)?"":"*",s&&_&&Lt(t)&&s[h=Mt(t).obId])return void s[h]++;if(s||(s={un:o}),n){if(p||0!==r)if(c._cId=$t(n),_)Le(e,t,p,c,o,r,v,a),h=Mt(t).obId,s[h]=(s[h]||0)+1;else{if(--s[Mt(t).obId])return;Le(e,t,p,c,o,r,v,a)}}else s&&(s[Mt(t).obId]=1),Le(e,t,p,void 0,o,r,v,a);if(p)for(f in t)u=a+"."+f,d(t,f,o);else l(t,o)}},Qt=function(e){return e.indexOf(".")<0&&e.indexOf("[")<0},Wt=function(){return[].push.call(arguments,!0),Le.apply(this,arguments)};Le=function(){function t(){function i(t,r,i,a){var o,s,l=Lt(M),d=Dt(M),c=A,f=I;if(t=n?t+"."+n:t,g||a)l&&e(d).off(t,qt);else{if(x=l&&e._data(M))for(x=x&&x.events,x=x&&x[i?Et:It],m=x&&x.length;m--;)if((b=x[m].data)&&b.cb&&b.cb._cId===h._cId&&b.ns===n){if(i)return;"*"===r&&b.prop!==r&&e(M).off(t,qt)}s=i?{}:{fullPath:u,paths:r?[r]:[],prop:p},s.ns=n,s.cb=h,I&&(s.observeAll={_path:f,path:function(){return o=c.length,f.replace(/[[.]/g,function(t){return o--,"["===t?"["+e.inArray(c[o-1],c[o]):"."})},parents:function(){return c},filter:E,ns:n}),e(d).on(t,null,s,qt),k&&((Tt[h._cId]=k)[Mt(M).obId||Mt(M,"obId",Nt++)]=M)}}function o(e){var n=L;return e.ob=y(e,n),e.cb=function(i,a){var o=e.ob,l=e.sb,d=y(e,n);d!==o&&(typeof o===pt&&(s(o,!0),(l||r&&$e(o))&&t([o],l,h,y,!0)),e.ob=d,typeof d===pt&&(s(d),(l||r&&$e(d))&&t([d],l,h,y))),h(i,a)}}function s(e,t,n,a){if(r){var o=M,s=I;M=e,a&&(M=e[a],I+="."+a),E&&M&&(M=Me._fltr(I,M,a?[e].concat(A):A,E)),M&&(n||$e(M))&&i(Et+".observe"+(h?_=$t(h):""),void 0,!0,t),M=o,I=s}}var l,d,c,f,p,u,v,g,h,_,m,b,x,y,w,k,C,j,A,I,E,T,V,N=Vt,S=1!=this?kt.apply([],arguments):yt.call(arguments),B=S.pop()||!1,L=S.shift(),M=L,R=S.length;for(B+""===B&&(I=B,A=S.pop(),E=S.pop(),B=!!S.pop(),R-=3),B===!!B&&(g=B,B=S[R-1],B=R&&B+""!==B?(R--,S.pop()):void 0),h=B,R&&Re(S[R-1])&&(y=h,h=S.pop(),R--),N+=g?h?h._cId+(h._inId||""):"":(_=$t(h))+(h._inId||""),g||(k=Tt[_]=Tt[_]||{}),T=n&&n.match(At)||[""],V=T.length;V--;)for(n=T[V],$e(L)?s(L,g,!0):g&&0===R&&L&&i(N,""),C=0,l=0;R>l;l++)if(u=S[l],""!==u&&void 0!==u){if(M=L,""+u===u){if(f=u.split("^"),f[1]&&(C=f[0].split(".").length,u=f.join("."),C=u.split(".").length-C),y&&(w=y(u,L))){R+=w.length-1,wt.apply(S,[l--,1].concat(w));continue}f=u.split(".")}else Re(u)||(u&&u._jsv?(j=g?u.cb:o(u),j.noArray=!r,j._cId=h._cId,j._inId=j._inId||".obIn"+Bt++,(u.bnd||u.prm&&u.prm.length||!u.sb)&&t([M],u.path,[a],u.prm,j,y,g),u.sb&&t([u.ob],u.sb,h,y,g),u=a,M=void 0):M=u),f=[L=u];for(;M&&void 0!==(p=f.shift());)if(typeof M===pt){if(""+p===p){if(""===p)continue;if(f.length1;)s=s[a.shift()];s&&o._setProperty(s,a[0],t,n)}return o},removeProperty:function(e){return this.setProperty(e,Rt),this},_setProperty:function(e,t,n,r){var i,a,o,s=t?e[t]:e;Re(s)&&s.set&&(e=e._wrp||e,a=s,i=s.set===!0?s:s.set,s=s.call(e)),(s!==n||r&&s!=n)&&(!(s instanceof Date)||s>n||n>s)&&(i?(i.call(e,n),n=a.call(e)):(o=n===Rt)?void 0!==s?(delete e[t],n=void 0):t=void 0:t&&(e[t]=n),t&&this._trigger(e,{change:"set",path:t,value:n,oldValue:s,remove:o}))},_trigger:function(t,n){e(t).triggerHandler(It,n)}},Pt.prototype={_data:null,observeAll:Ht,unobserveAll:Jt,data:function(){return this._data},insert:function(e,t){var n=this._data;return 1===arguments.length&&(t=e,e=n.length),e=jt(e),e>-1&&e<=n.length&&(t=$e(t)?t:[t],t.length&&this._insert(e,t)),this},_insert:function(e,t){var n=this._data,r=n.length;wt.apply(n,[e,0].concat(t)),this._trigger({change:"insert",index:e,items:t},r)},remove:function(e,t){var n,r=this._data;return void 0===e&&(e=r.length-1),e=jt(e),t=t?jt(t):0===t?0:1,t>-1&&e>-1&&(n=r.slice(e,e+t),t=n.length,t&&this._remove(e,t,n)),this},_remove:function(e,t,n){var r=this._data,i=r.length;r.splice(e,t),this._trigger({change:"remove",index:e,items:n},i)},move:function(e,t,n){if(n=n?jt(n):0===n?0:1,e=jt(e),t=jt(t),n>0&&e>-1&&t>-1&&e!==t){var r=this._data.slice(e,e+n);n=r.length,n&&this._move(e,t,n,r)}return this},_move:function(e,t,n,r){var i=this._data,a=i.length;i.splice(e,n),wt.apply(i,[t,0].concat(r)),this._trigger({change:"move",oldIndex:e,index:t,items:r},a)},refresh:function(e){var t=this._data.slice();return this._refresh(t,e),this},_refresh:function(e,t){var n=this._data,r=n.length;wt.apply(n,[0,n.length].concat(t)),this._trigger({change:"refresh",oldItems:e},r)},_trigger:function(t,n){var r=this._data,i=r.length,a=e([r]);i!==n&&a.triggerHandler(It,{change:"set",path:"length",value:i,oldValue:n}),a.triggerHandler(Et,t)}},xt[It]=xt[Et]={remove:function(t){var n,r,i,a,o,s=t.data;if(s&&(s.off=!0,s=s.cb)&&(n=Tt[s._cId])){for(i=e._data(this).events[t.type],a=i.length;a--&&!r;)r=(o=i[a].data)&&o.cb&&o.cb._cId===s._cId;r||(delete n[Mt(this).obId],Ut(n,s._cId))}}},Be.map=function(t){function n(e,n,r,i){var a,o=this;this.src&&this.unmap(),typeof e===pt&&(o.src=e,o.tgt=r||o.tgt||[],o.options=n||o.options,o.update(),i||(t.obsSrc&&Me(o.src).observeAll(o.obs=function(e,n){a||(a=!0,t.obsSrc(o,e,n),a=void 0)},o.srcFlt),t.obsTgt&&Me(o.tgt).observeAll(o.obt=function(e,n){a||(a=!0,t.obsTgt(o,e,n),a=void 0)},o.tgtFlt)))}return Re(t)&&(t={getTgt:t}),t.baseMap&&(t=e.extend({},t.baseMap,t)),t.map=function(e,t,r,i){return new n(e,t,r,i)},(n.prototype={srcFlt:t.srcFlt||Qt,tgtFlt:t.tgtFlt||Qt,update:function(e){var n=this;Me(n.tgt).refresh(t.getTgt(n.src,n.options=e||n.options))},unmap:function(){var e=this;e.src&&(e.obs&&Me(e.src).unobserveAll(e.obs,e.srcFlt),e.obt&&Me(e.tgt).unobserveAll(e.obt,e.tgtFlt),e.src=void 0)},map:n,_def:t}).constructor=n,t}}if(qe=Be.settings,Pe=Be.converters,Oe=Be.tags,it=/<(?!script)(\w+)(?:[^>]*(on\w+)\s*=)?[^>]*>/,e.link)return e;var Xt,Zt,Gt,Yt,en,tn,nn,rn,an="data-jsv",on="change.jsv",sn="onBeforeChange",ln="onAfterChange",dn="onAfterCreate",cn="checked",fn="checkbox",pn="radio",un="input[type=radio]",vn="none",gn="SCRIPT",hn="true",_n='">',mn='',mn='',\n\topenScript = ' - data-linked tag, close marker\n\t\t\t// TODO add validation to track whether we are in attribute context (not yet hit preceding ending with a >) or element content of current 'parentTag'\n\t\t\t// and accordingly disallow inserting script markers in attribute context. Similar for elCnt too, so no \"
\" or \"
...{{/if}}...\"\n\t\t\tpreceding = id\n\t\t\t\t? (preceding + endOfElCnt + spaceBefore + (inTag ? \"\" : openScript + id + closeScript)+ spaceAfter + tag)\n\t\t\t\t: endOfElCnt || all;\n\t\t}\n\n\t\tif (validate && boundId) {\n\t\t\tif (inTag) {\n\t\t\t\t// JsViews data-linking tags are not allowed within element markup.\n\t\t\t\t// See https://github.com/BorisMoore/jsviews/issues/303\n\t\t\t\tsyntaxError('{^{ within elem markup (' + inTag + ' ). Use data-link=\"...\"');\n\t\t\t}\n\t\t\tif (id.charAt(0) === \"#\") {\n\t\t\t\ttagStack.unshift(id.slice(1));\n\t\t\t} else if (id.slice(1) !== (bndId = tagStack.shift())) {\n\t\t\t\t// See https://github.com/BorisMoore/jsviews/issues/213\n\t\t\t\tsyntaxError('Closing tag for {^{...}} under different elem: <' + bndId + '>');\n\t\t\t}\n\t\t}\n\t\tif (tag) {\n\t\t\tinTag = tag;\n\t\t\t// If there are ids (markers since the last tag), move them to the defer string\n\t\t\ttagStack.unshift(parentTag);\n\t\t\tparentTag = tag.slice(1);\n\t\t\tif (validate && tagStack[0] && tagStack[0] === badParent[parentTag]) {\n\t\t\t\t// Missing \n\t\t\t\t// TODO: replace this by smart insertion of tags\n\t\t\t\terror('Parent of must be ');\n\t\t\t}\n\t\t\tisVoid = voidElems[parentTag];\n\t\t\tif ((elCnt = elContent[parentTag]) && !prevElCnt) {\n\t\t\t\tdeferStack.unshift(defer);\n\t\t\t\tdefer = \"\";\n\t\t\t}\n\t\t\tprevElCnt = elCnt;\n//TODO Consider providing validation which throws if you place as child of , etc. - since if not caught,\n//this can cause errors subsequently which are difficult to debug.\n//\t\t\t\tif (elContent[tagStack[0]]>2 && !elCnt) {\n//\t\t\t\t\terror(parentTag + \" in \" + tagStack[0]);\n//\t\t\t\t}\n\t\t\tif (defer && elCnt) {\n\t\t\t\tdefer += \"+\"; // Will be used for stepping back through deferred tokens\n\t\t\t}\n\t\t}\n\t\treturn preceding;\n\t}\n\n\tfunction processViewInfos(vwInfos, targetParent) {\n\t\t// If targetParent, we are processing viewInfos (which may include navigation through '+-' paths) and hooking up to the right parentElem etc.\n\t\t// (and elem may also be defined - the next node)\n\t\t// If no targetParent, then we are processing viewInfos on newly inserted content\n\t\tvar deferPath, deferChar, bindChar, parentElem, id, onAftCr, deep,\n\t\t\taddedBindEls = [];\n\n\t\t// In elCnt context (element-only content model), prevNode is the first node after the open, nextNode is the first node after the close.\n\t\t// If both are null/undefined, then open and close are at end of parent content, so the view is empty, and its placeholder is the\n\t\t// 'lastChild' of the parentNode. If there is a prevNode, then it is either the first node in the view, or the view is empty and\n\t\t// its placeholder is the 'previousSibling' of the prevNode, which is also the nextNode.\n\t\tif (vwInfos) {\n\t\t\tif (vwInfos._tkns.charAt(0) === \"@\") {\n\t\t\t\t// We are processing newly inserted content. This is a special script element that was created in convertMarkers() to process deferred bindings,\n\t\t\t\t// and inserted following the target parent element - because no element tags (outside elCnt) were encountered to carry those binding tokens.\n\t\t\t\t// We will step back from the preceding sibling of this element, looking at targetParent elements until we find the one that the current binding\n\t\t\t\t// token belongs to. Set elem to null (the special script element), and remove it from the DOM.\n\t\t\t\ttargetParent = elem.previousSibling;\n\t\t\t\telem.parentNode.removeChild(elem);\n\t\t\t\telem = undefined;\n\t\t\t}\n\t\t\tlen = vwInfos.length;\n\t\t\twhile (len--) {\n\t\t\t\tvwInfo = vwInfos[len];\n//if (prevIds.indexOf(vwInfo.token) < 0) { // This token is a newly created view or tag binding\n\t\t\t\tbindChar = vwInfo.ch;\n\t\t\t\tif (deferPath = vwInfo.path) {\n\t\t\t\t\t// We have a 'deferred path'\n\t\t\t\t\tj = deferPath.length - 1;\n\t\t\t\t\twhile (deferChar = deferPath.charAt(j--)) {\n\t\t\t\t\t\t// Use the \"+\" and\"-\" characters to navigate the path back to the original parent node where the deferred bindings ocurred\n\t\t\t\t\t\tif (deferChar === \"+\") {\n\t\t\t\t\t\t\tif (deferPath.charAt(j) === \"-\") {\n\t\t\t\t\t\t\t\tj--;\n\t\t\t\t\t\t\t\ttargetParent = targetParent.previousSibling;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttargetParent = targetParent.parentNode;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttargetParent = targetParent.lastChild;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Note: Can use previousSibling and lastChild, not previousElementSibling and lastElementChild,\n\t\t\t\t\t\t// since we have removed white space within elCnt. Hence support IE < 9\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (bindChar === \"^\") {\n\t\t\t\t\tif (tag = bindingStore[id = vwInfo.id]) {\n\t\t\t\t\t\t// The binding may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\t\t// This is a tag binding\n\t\t\t\t\t\tdeep = targetParent && (!elem || elem.parentNode !== targetParent); // We are stepping back looking for the right targetParent,\n\t\t\t\t\t\t// or we are linking existing content and this element is in elCnt, not an immediate child of the targetParent.\n\t\t\t\t\t\tif (!elem || deep) {\n\t\t\t\t\t\t\ttag.parentElem = targetParent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (vwInfo.elCnt && deep) {\n\t\t\t\t\t\t\t// With element only content, if there is no following element, or if the binding is deeper than the following element\n\t\t\t\t\t\t\t// then we need to set the open or close token as a deferred binding annotation on the parent\n\t\t\t\t\t\t\tsetDefer(targetParent, (vwInfo.open ? \"#\" : \"/\") + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// This is an open or close marker for a data-linked tag {^{...}}. Add it to bindEls.\n\t\t\t\t\t\taddedBindEls.push([deep ? null : elem, vwInfo]);\n\t\t\t\t\t}\n\t\t\t\t} else if (view = viewStore[id = vwInfo.id]) {\n\t\t\t\t\t// The view may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\tif (!view.parentElem) {\n\t\t\t\t\t\t// If view is not already extended for JsViews, extend and initialize the view object created in JsRender, as a JsViews view\n\t\t\t\t\t\tview.parentElem = targetParent || elem && elem.parentNode || parentNode;\n\t\t\t\t\t\tview._.onRender = addBindingMarkers;\n\t\t\t\t\t\tview._.onArrayChange = arrayChangeHandler;\n\t\t\t\t\t\tsetArrayChangeLink(view);\n\t\t\t\t\t}\n\t\t\t\t\tparentElem = view.parentElem;\n\t\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t\t// This is an 'open view' node (preceding script marker node,\n\t\t\t\t\t\t// or if elCnt, the first element in the view, with a data-jsv annotation) for binding\n\t\t\t\t\t\tview._elCnt = vwInfo.elCnt;\n\t\t\t\t\t\tif (targetParent && !elem) {\n\t\t\t\t\t\t\tsetDefer(targetParent, \"#\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// No targetParent, so there is a ._nxt elem (and this is processing tokens on the elem)\n\t\t\t\t\t\t\tif (!view._prv) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This is a 'close view' marker node for binding\n\t\t\t\t\t\tif (targetParent && (!elem || elem.parentNode !== targetParent)) {\n\t\t\t\t\t\t\t// There is no ._nxt so add token to _df. It is deferred.\n\t\t\t\t\t\t\tsetDefer(targetParent, \"/\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t\tview._nxt = undefined;\n\t\t\t\t\t\t} else if (elem) {\n\t\t\t\t\t\t\t// This view did not have a ._nxt, but has one now, so token may be in _df, and must be removed. (No longer deferred)\n\t\t\t\t\t\t\tif (!view._nxt) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._nxt = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlinkCtx = view.linkCtx;\n\t\t\t\t\t\tif (onAftCr = view.ctx && view.ctx.onAfterCreate || onAfterCreate) {\n\t\t\t\t\t\t\tonAftCr.call(linkCtx, view);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n//}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlen = addedBindEls.length;\n\t\t\twhile (len--) {\n\t\t\t\t// These were added in reverse order to addedBindEls. We push them in BindEls in the correct order.\n\t\t\t\tbindEls.push(addedBindEls[len]);\n\t\t\t}\n\t\t}\n\t\treturn !vwInfos || vwInfos.elCnt;\n\t}\n\n\tfunction getViewInfos(vwInfos) {\n\t\t// Used by view.childTags() and tag.childTags()\n\t\t// Similar to processViewInfos in how it steps through bindings to find tags. Only finds data-linked tags.\n\t\tvar level, parentTag, named;\n\n\t\tif (vwInfos) {\n\t\t\tlen = vwInfos.length;\n\t\t\tfor (j = 0; j < len; j++) {\n\t\t\t\tvwInfo = vwInfos[j];\n\t\t\t\t// This is an open marker for a data-linked tag {^{...}}, within the content of the tag whose id is get.id. Add it to bindEls.\n\t\t\t\t// Note - if bindingStore[vwInfo.id]._is === \"tag\" then getViewInfos is being called too soon - during first linking pass\n\t\t\t\tparentTag = tag = bindingStore[vwInfo.id].linkCtx.tag;\n\t\t\t\tnamed = tag.tagName === tagName;\n\t\t\t\tif (!tag.flow || named) {\n\t\t\t\t\tif (!deep) {\n\t\t\t\t\t\tlevel = 1;\n\t\t\t\t\t\twhile (parentTag = parentTag.parent) {\n\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttagDepth = tagDepth || level; // The level of the first tag encountered.\n\t\t\t\t\t}\n\t\t\t\t\tif ((deep || level === tagDepth) && (!tagName || named)) {\n\t\t\t\t\t\t// Filter on top-level or tagName as appropriate\n\t\t\t\t\t\ttags.push(tag);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction dataLink() {\n\t\t//================ Data-link and fixup of data-jsv annotations ================\n\t\tvar j, index,\n\t\t\ttokens = \"\",\n\t\t\twrap = {},\n\t\t\tselector = linkViewsSel + (get ? \",[\" + deferAttr + \"]\" : \"\");\n\t\t\t// If a childTags() call, get = \",[\" + deferAttr + \"]\" - since we need to include elements that have a ._df expando for deferred tokens\n\n\t\telems = qsa ? parentNode.querySelectorAll(selector) : $(selector, parentNode).get();\n\t\tl = elems.length;\n\n\t\t// The prevNode will be in the returned query, since we called markPrevOrNextNode() on it.\n\t\t// But it may have contained nodes that satisfy the selector also.\n\t\tif (prevNode && prevNode.innerHTML) {\n\t\t\t// Find the last contained node of prevNode, to use as the prevNode - so we only link subsequent elems in the query\n\t\t\tprevNodes = qsa ? prevNode.querySelectorAll(selector) : $(selector, prevNode).get();\n\t\t\tprevNode = prevNodes.length ? prevNodes[prevNodes.length - 1] : prevNode;\n\t\t}\n\n\t\ttagDepth = 0;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = elems[i];\n\t\t\tif (prevNode && !found) {\n\t\t\t\t// If prevNode is set, not false, skip linking. If this element is the prevNode, set to false so subsequent elements will link.\n\t\t\t\tfound = (elem === prevNode);\n\t\t\t} else if (nextNode && elem === nextNode) {\n\t\t\t\t// If nextNode is set then break when we get to nextNode\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else if (elem.parentNode) {\n\t\t\t\t// elem has not been removed from DOM\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t\tif (elem._df) {\n\t\t\t\t\t\tj = i + 1;\n\t\t\t\t\t\twhile (j < l && elem.contains(elems[j])) {\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Add defered tokens after any tokens on descendant elements of this one\n\t\t\t\t\t\twrap[j-1] = elem._df;\n\t\t\t\t\t}\n\t\t\t\t\tif (wrap[i]) {\n\t\t\t\t\t\ttokens += wrap[i] || \"\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (isLink && (vwInfo = viewInfos(elem, undefined, rViewMarkers)) && (vwInfo = vwInfo[0])) {\n\t\t\t\t\t\t// If this is a link(trueOrString ...) call we will avoid re-binding to elems that are within template-rendered views\n\t\t\t\t\t\tskip = skip ? (vwInfo.id !== skip && skip) : vwInfo.open && vwInfo.id;\n\t\t\t\t\t}\n\t\t\t\t\tif (!skip && processInfos(viewInfos(elem))\n\t\t\t\t\t\t// If a link() call, processViewInfos() adds bindings to bindEls, and returns true for non-script nodes, for adding data-link bindings\n\t\t\t\t\t\t// If a childTags() call, getViewInfos returns array of tag bindings.\n\t\t\t\t\t\t\t&& elem.getAttribute($viewsLinkAttr)) {\n\t\t\t\t\t\tbindEls.push([elem]); // A data-linked element so add to bindEls too\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (get) {\n\t\t\ttokens += parentNode._df || \"\";\n\t\t\tif (index = tokens.indexOf(\"#\" + get.id) + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so start after the open token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(index + get.id.length);\n\t\t\t}\n\t\t\tindex = tokens.indexOf(\"/\" + get.id);\n\t\t\tif (index + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so don't look beyond the close token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(0, index);\n\t\t\t}\n\t\t\t// Call getViewInfos to add the found childTags to the tags array\n\t\t\tgetViewInfos(viewInfos(tokens, undefined, rOpenTagMarkers));\n\t\t}\n\n\t\tif (html === undefined && parentNode.getAttribute($viewsLinkAttr)) {\n\t\t\tbindEls.push([parentNode]); // Support data-linking top-level element directly (not within a data-linked container)\n\t\t}\n\n\t\t// Remove temporary marker script nodes they were added by markPrevOrNextNode\n\t\tunmarkPrevOrNextNode(prevNode, elCnt);\n\t\tunmarkPrevOrNextNode(nextNode, elCnt);\n\n\t\tif (get) {\n\t\t\tif (lazyLink) {\n\t\t\t\tlazyLink.resolve();\n\t\t\t}\n\t\t\treturn; // We have added childTags to the tags array, so we are done\n\t\t}\n\n\t\tif (elCnt && defer + ids) {\n\t\t\t// There are some views with elCnt, for which the open or close did not precede any HTML tag - so they have not been processed yet\n\t\t\telem = nextNode;\n\t\t\tif (defer) {\n\t\t\t\tif (nextNode) {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer + \"+\", true), nextNode);\n\t\t\t\t} else {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer, true), parentNode);\n\t\t\t\t}\n\t\t\t}\n\t\t\tprocessViewInfos(viewInfos(ids, true), parentNode);\n\t\t\t// If there were any tokens on nextNode which have now been associated with inserted HTML tags, remove them from nextNode\n\t\t\tif (nextNode) {\n\t\t\t\ttokens = nextNode.getAttribute(jsvAttrStr);\n\t\t\t\tif (l = tokens.indexOf(prevIds) + 1) {\n\t\t\t\t\ttokens = tokens.slice(l + prevIds.length - 1);\n\t\t\t\t}\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, ids + tokens);\n\t\t\t}\n\t\t}\n\n\t\t//================ Bind the data-linked elements and tags ================\n\t\tl = bindEls.length;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = bindEls[i];\n\t\t\tlinkInfo = elem[1];\n\t\t\telem = elem[0];\n\t\t\tif (linkInfo) {\n\t\t\t\tif (tag = bindingStore[linkInfo.id]) {\n\t\t\t\t\tif (linkCtx = tag.linkCtx) {\n\t\t\t\t\t\t// The tag may have been stored temporarily on the bindingStore - or may have already been replaced by the actual binding\n\t\t\t\t\t\ttag = linkCtx.tag;\n\t\t\t\t\t\ttag.linkCtx = linkCtx;\n\t\t\t\t\t}\n\t\t\t\t\tif (linkInfo.open) {\n\t\t\t\t\t\t// This is an 'open linked tag' binding annotation for a data-linked tag {^{...}}\n\t\t\t\t\t\tif (elem) {\n\t\t\t\t\t\t\ttag.parentElem = elem.parentNode;\n\t\t\t\t\t\t\ttag._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttag._elCnt = linkInfo.elCnt;\n\t\t\t\t\t\tif (tag.onBeforeLink) {\n\t\t\t\t\t\t\ttag.onBeforeLink();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// We data-link depth-last (\"on the way in\"), which is better for perf - and allows setting parent tags etc.\n\t\t\t\t\t\tview = tag.tagCtx.view;\n\t\t\t\t\t\taddDataBinding(undefined, tag._prv, view, linkInfo.id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttag._nxt = elem;\n\t\t\t\t\t\tif (tag._.unlinked) {\n\t\t\t\t\t\t\t// This is a 'close linked tag' binding annotation\n\t\t\t\t\t\t\t// Add data binding\n\t\t\t\t\t\t\ttagCtx = tag.tagCtx;\n\t\t\t\t\t\t\tview = tagCtx.view;\n\t\t\t\t\t\t\tcallAfterLink(tag);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Add data binding for a data-linked element (with data-link attribute)\n\t\t\t\taddDataBinding(elem.getAttribute($viewsLinkAttr), elem, $view(elem), undefined, isLink, outerData, context);\n\t\t\t}\n\t\t}\n\t\tif (lazyLink) {\n\t\t\tlazyLink.resolve();\n\t\t}\n\t}\n\t//==== /end of nested functions ====\n\n\tvar inTag, linkCtx, tag, i, l, j, len, elems, elem, view, vwInfo, linkInfo, prevNodes, token, prevView, nextView,\n\t\tnode, tags, deep, tagName, tagCtx, validate, tagDepth, depth, fragment, copiedNode, firstTag, parentTag,\n\t\tisVoid, wrapper, div, tokens, elCnt, prevElCnt, htmlTag, ids, prevIds, found, skip, lazyLink, isLink, get,\n\t\tself = this,\n\t\tthisId = self._.id + \"_\",\n\t\tdefer = \"\",\n\t\t// The marker ids for which no tag was encountered (empty views or final closing markers) which we carry over to container tag\n\t\tbindEls = [],\n\t\ttagStack = [],\n\t\tdeferStack = [],\n\t\tonAfterCreate = self.hlp(onAfterCreateStr),\n\t\tprocessInfos = processViewInfos;\n\n\tif (refresh) {\n\t\tlazyLink = refresh.lazyLink && $.Deferred();\n\t\tif (refresh.tmpl) {\n\t\t\t// refresh is the prevView, passed in from addViews()\n\t\t\tprevView = \"/\" + refresh._.id + \"_\";\n\t\t} else {\n\t\t\tisLink = refresh.lnk; // Top-level linking\n\t\t\tif (refresh.tag) {\n\t\t\t\tthisId = refresh.tag + \"^\";\n\t\t\t\trefresh = true;\n\t\t\t}\n\t\t\tif (get = refresh.get) {\n\t\t\t\tprocessInfos = getViewInfos;\n\t\t\t\ttags = get.tags;\n\t\t\t\tdeep = get.deep;\n\t\t\t\ttagName = get.name;\n\t\t\t}\n\t\t}\n\t\trefresh = refresh === true;\n\t}\n\n\tparentNode = parentNode\n\t\t? (\"\" + parentNode === parentNode\n\t\t\t? $(parentNode)[0] // It is a string, so treat as selector\n\t\t\t: parentNode.jquery\n\t\t\t\t? parentNode[0] // A jQuery object - take first element.\n\t\t\t\t: parentNode)\n\t\t: (self.parentElem // view.link()\n\t\t\t|| document.body); // link(null, data) to link the whole document\n\n\tvalidate = !$viewsSettings.noValidate && parentNode.contentEditable !== TRUE;\n\tparentTag = parentNode.tagName.toLowerCase();\n\telCnt = !!elContent[parentTag];\n\n\tprevNode = prevNode && markPrevOrNextNode(prevNode, elCnt);\n\tnextNode = nextNode && markPrevOrNextNode(nextNode, elCnt) || null;\n\n\tif (html != undefined) {\n\t\t//================ Insert html into DOM using documentFragments (and wrapping HTML appropriately). ================\n\t\t// Also convert markers to DOM annotations, based on content model.\n\t\t// Corresponds to nextNode ? $(nextNode).before(html) : $(parentNode).html(html);\n\t\t// but allows insertion to wrap correctly even with inserted script nodes. jQuery version will fail e.g. under tbody or select.\n\t\t// This version should also be slightly faster\n\t\tdiv = document.createElement(\"div\");\n\t\twrapper = div;\n\t\tprevIds = ids = \"\";\n\t\thtmlTag = parentNode.namespaceURI === \"http://www.w3.org/2000/svg\" ? \"svg_ns\" : (firstTag = rFirstElem.exec(html)) && firstTag[1] || \"\";\n\t\tif (noDomLevel0 && firstTag && firstTag[2]) {\n\t\t\terror(\"Unsupported: \" + firstTag[2]); // For security reasons, don't allow insertion of elements with onFoo attributes.\n\t\t}\n\t\tif (elCnt) {\n\t\t\t// Now look for following view, and find its tokens, or if not found, get the parentNode._df tokens\n\t\t\tnode = nextNode;\n\t\t\twhile (node && !(nextView = viewInfos(node))) {\n\t\t\t\tnode = node.nextSibling;\n\t\t\t}\n\t\t\tif (tokens = nextView ? nextView._tkns : parentNode._df) {\n\t\t\t\ttoken = prevView || \"\";\n\t\t\t\tif (refresh || !prevView) {\n\t\t\t\t\ttoken += \"#\" + thisId;\n\t\t\t\t}\n\t\t\t\tj = tokens.indexOf(token);\n\t\t\t\tif (j + 1) {\n\t\t\t\t\tj += token.length;\n\t\t\t\t\t// Transfer the initial tokens to inserted nodes, by setting them as the ids variable, picked up in convertMarkers\n\t\t\t\t\tprevIds = ids = tokens.slice(0, j);\n\t\t\t\t\ttokens = tokens.slice(j);\n\t\t\t\t\tif (nextView) {\n\t\t\t\t\t\tnode.setAttribute(jsvAttrStr, tokens);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetDefer(parentNode, tokens);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//================ Convert the markers to DOM annotations, based on content model. ================\n//\t\t\toldElCnt = elCnt;\n\t\tisVoid = undefined;\n\t\thtml = (\"\" + html).replace(rConvertMarkers, convertMarkers);\n//\t\t\tif (!!oldElCnt !== !!elCnt) {\n//\t\t\t\terror(\"Parse: \" + html); // Parse error. Content not well-formed?\n//\t\t\t}\n\t\tif (validate && tagStack.length) {\n\t\t\tsyntaxError(\"Mismatched '<\" + parentTag + \"...>' in:\\n\" + html); // Unmatched tag\n\t\t}\n\t\tif (validateOnly) {\n\t\t\treturn;\n\t\t}\n\t\t// Append wrapper element to doc fragment\n\t\tsafeFragment.appendChild(div);\n\n\t\t// Go to html and back, then peel off extra wrappers\n\t\t// Corresponds to jQuery $(nextNode).before(html) or $(parentNode).html(html);\n\t\t// but supports svg elements, and other features missing from jQuery version (and this version should also be slightly faster)\n\t\thtmlTag = wrapMap[htmlTag] || wrapMap.div;\n\t\tdepth = htmlTag[0];\n\t\twrapper.innerHTML = htmlTag[1] + html + htmlTag[2];\n\t\twhile (depth--) {\n\t\t\twrapper = wrapper.lastChild;\n\t\t}\n\t\tsafeFragment.removeChild(div);\n\t\tfragment = document.createDocumentFragment();\n\t\twhile (copiedNode = wrapper.firstChild) {\n\t\t\tfragment.appendChild(copiedNode);\n\t\t}\n\t\t// Insert into the DOM\n\t\tparentNode.insertBefore(fragment, nextNode);\n\t}\n\n\tif (lazyLink) {\n\t\tsetTimeout(dataLink, 0);\n\t} else {\n\t\tdataLink();\n\t}\n\n\treturn lazyLink && lazyLink.promise();\n}\n\nfunction addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, context) {\n\t// Add data binding for data-linked elements or {^{...}} data-linked tags\n\tvar tmpl, tokens, attr, convertBack, params, trimLen, tagExpr, linkFn, linkCtx, tag, rTagIndex, hasElse,\n\t\tlinkExpressions = [];\n\n\tif (boundTagId) {\n\t\t// boundTagId is a string for {^{...}} data-linked tag. So only one linkTag in linkMarkup\n\t\t// data and context parameters are undefined\n\t\ttag = bindingStore[boundTagId];\n\t\ttag = tag.linkCtx ? tag.linkCtx.tag : tag;\n\n\t\tlinkCtx = tag.linkCtx || {\n\t\t\tdata: currentView.data, // source\n\t\t\telem: tag._elCnt ? tag.parentElem : node, // target\n\t\t\tview: currentView,\n\t\t\tctx: currentView.ctx,\n\t\t\tattr: HTML, // Script marker nodes are associated with {^{ and always target HTML.\n\t\t\tfn: tag._.bnd,\n\t\t\ttag: tag,\n\t\t\t// Pass the boundTagId in the linkCtx, so that it can be picked up in observeAndBind\n\t\t\t_bndId: boundTagId\n\t\t};\n\t\tbindDataLinkTarget(linkCtx, linkCtx.fn);\n\t} else if (linkMarkup && node) {\n\t\t// If isLink then this is a top-level linking: .link(expression, target, data, ....) or\n\t\t// .link(true, target, data, ....) scenario - and data and context are passed in separately from the view\n\t\tdata = isLink ? data : currentView.data;\n\n\t\t// Compiled linkFn expressions could be stored in the tmpl.links array of the template\n\t\t// TODO - consider also caching globally so that if {{:foo}} or data-link=\"foo\" occurs in different places,\n\t\t// the compiled template for this is cached and only compiled once...\n\t\t//links = currentView.links || currentView.tmpl.links;\n\n\t\ttmpl = currentView.tmpl;\n\n//\t\t\tif (!(linkTags = links[linkMarkup])) {\n\t\t// This is the first time this view template has been linked, so we compile the data-link expressions, and store them on the template.\n\n\t\tlinkMarkup = normalizeLinkTag(linkMarkup, defaultAttr(node));\n\t\trTagDatalink.lastIndex = 0;\n\n\t\twhile (tokens = rTagDatalink.exec(linkMarkup)) { // TODO require } to be followed by whitespace or $, and remove the \\}(!\\}) option.\n\t\t\tlinkExpressions.push(tokens);\n\t\t}\n\t\twhile (tokens = linkExpressions.shift()) {\n\t\t\t// Iterate over the data-link expressions, for different target attrs,\n\t\t\t// e.g. ~description(firstName, lastName)}\"\n\t\t\t// tokens: [all, attr, bindOnly, tagExpr, tagName, converter, colon, html, comment, code, params]\n\t\t\trTagIndex = rTagDatalink.lastIndex;\n\t\t\tattr = tokens[1];\n\t\t\ttagExpr = tokens[3];\n\t\t\twhile (linkExpressions[0] && linkExpressions[0][4] === \"else\") { // If this is {someTag...} and is followed by an {else...} add to tagExpr\n\t\t\t\ttagExpr += \"}{\" + linkExpressions.shift()[3];\n\t\t\t\thasElse = true;\n\t\t\t}\n\t\t\tif (hasElse) { // If an {else} has been added, need also to add closing {{/someTag}}\n\t\t\t\ttagExpr += \"}{{/\" + tokens[4] + \"}\";\n\t\t\t}\n\t\t\tparams = tokens[9];\n\t\t\tif (convertBack = tokens[10]) {\n\t\t\t\tconvertBack = convertBack.slice(1);\n\t\t\t}\n\n\t\t\tlinkCtx = {\n\t\t\t\tdata: data, // source\n\t\t\t\telem: node, // target\n\t\t\t\tview: currentView,\n\t\t\t\tctx: context,\n\t\t\t\tattr: attr,\n\t\t\t\tisLk: isLink, // top-level linking?\n\t\t\t\t_toLk : 1, // Flag to data-link on initial data-link call rendering call\n\t\t\t\t_noUpd : tokens[2] // Flag for data-link=\"^{...}\" so on initial data-link call will bind, but not render)\n\t\t\t};\n\n\t\t\tif (tokens[6]) {\n\t\t\t\tlinkCtx.convert = tokens[5] || \"\";\n\t\t\t\tif (!attr && convertBack !== undefined) {\n\t\t\t\t\t// Default target, so allow 2 way binding\n\t\t\t\t\tlinkCtx.convertBack = convertBack;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Compile the linkFn expression which evaluates and binds a data-link expression\n\t\t\t// TODO - optimize for the case of simple data path with no conversion, helpers, etc.:\n\t\t\t// i.e. data-link=\"a.b.c\". Avoid creating new instances of Function every time. Can use a default function for all of these...\n\n\t\t\tlinkCtx.expr = attr + tagExpr;\n\t\t\tlinkFn = tmpl.links[tagExpr];\n\t\t\tif (!linkFn) {\n\t\t\t\ttmpl.links[tagExpr] = linkFn = $sub.tmplFn(tagExpr, tmpl, true, convertBack, hasElse);\n\t\t\t}\n\t\t\tlinkCtx.fn = linkFn;\n\t\t\tbindDataLinkTarget(linkCtx, linkFn);\n\t\t\t// We store rTagIndex in local scope, since this addDataBinding method can sometimes be called recursively,\n\t\t\t// and each is using the same rTagDatalink instance.\n\t\t\trTagDatalink.lastIndex = rTagIndex;\n\t\t}\n//\t\t}\n\t}\n}\n\nfunction bindDataLinkTarget(linkCtx, linkFn) {\n\t// Add data link bindings for a link expression in data-link attribute markup\n\tfunction handler(ev, eventArgs) {\n\t\tpropertyChangeHandler.call(linkCtx, ev, eventArgs, linkFn);\n\t\t// If the link expression uses a custom tag, the propertyChangeHandler call will call renderTag, which will set tagCtx on linkCtx\n\t}\n\thandler.noArray = true;\n\tif (linkCtx.isLk) {\n\t\t// Top-level linking: .link(expressionOrTrue, data, context) - so we need to create a view for the linking, with the data and ctx\n\t\t// which may be different than the current context of the target. Note that this view is not a standard data-linked view, so it will\n\t\t// be disposed only when its parent view is disposed.\n\t\taddLinkMethods(linkCtx.view = new $sub.View(\n\t\t\t$sub.extendCtx(linkCtx.ctx, linkCtx.view.ctx),\n\t\t\t\"link\", linkCtx.view, linkCtx.data, linkCtx.expr, undefined, addBindingMarkers));\n\t}\n\tlinkCtx._ctxCb = getContextCb(linkCtx.view); // _ctxCb is for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]}\n\tlinkCtx._hdl = handler;\n\thandler(true);\n}\n\n//=====================\n// Data-linking helpers\n//=====================\n\nfunction removeSubStr(str, substr) {\n\tvar k;\n\treturn str\n\t\t? (k = str.indexOf(substr),\n\t\t\t(k + 1\n\t\t\t\t? str.slice(0, k) + str.slice(k + substr.length)\n\t\t\t\t: str))\n\t\t: \"\";\n}\n\nfunction markerNodeInfo(node) {\n\treturn node &&\n\t\t(\"\" + node === node\n\t\t\t? node\n\t\t\t: node.tagName === SCRIPT\n\t\t\t\t? node.type.slice(3)\n\t\t\t\t: node.nodeType === 1 && node.getAttribute(jsvAttrStr) || \"\");\n}\n\nfunction viewInfos(node, isVal, rBinding) {\n\t// Test whether node is a script marker node, and if so, return metadata\n\tfunction getInfos(all, open, close, id, ch, elPath) {\n\t\tinfos.push({\n\t\t\telCnt: elCnt,\n\t\t\tid: id,\n\t\t\tch: ch,\n\t\t\topen: open,\n\t\t\tclose: close,\n\t\t\tpath: elPath,\n\t\t\ttoken: all\n\t\t});\n\t}\n\tvar elCnt, tokens,\n\t\tinfos = [];\n\tif (tokens = isVal ? node : markerNodeInfo(node)) {\n\t\telCnt = infos.elCnt = node.tagName !== SCRIPT;\n\t\telCnt = tokens.charAt(0) === \"@\" || elCnt;\n\t\tinfos._tkns = tokens;\n\t\t// rMarkerTokens = /(?:(#)|(\\/))(\\d+)([_^])([-+@\\d]+)?/g;\n\t\ttokens.replace(rBinding || rMarkerTokens, getInfos);\n\t\treturn infos;\n\t}\n}\n\nfunction unmarkPrevOrNextNode(node, elCnt) {\n\tif (node) {\n\t\tif (node.type === \"jsv\") {\n\t\t\tnode.parentNode.removeChild(node);\n\t\t} else if (elCnt && node.getAttribute($viewsLinkAttr) === \"\") {\n\t\t\tnode.removeAttribute($viewsLinkAttr);\n\t\t}\n\t}\n}\n\nfunction markPrevOrNextNode(node, elCnt) {\n\tvar marker = node;\n\twhile (elCnt && marker && marker.nodeType !== 1) {\n\t\tmarker = marker.previousSibling;\n\t}\n\tif (marker) {\n\t\tif (marker.nodeType !== 1) {\n\t\t\t// For text nodes, we will add a script node before\n\t\t\tmarker = document.createElement(SCRIPT);\n\t\t\tmarker.type = \"jsv\";\n\t\t\tnode.parentNode.insertBefore(marker, node);\n\t\t} else if (!markerNodeInfo(marker) && !marker.getAttribute($viewsLinkAttr)) {\n\t\t\t// For element nodes, we will add a data-link attribute (unless there is already one)\n\t\t\t// so that this node gets included in the node linking process.\n\t\t\tmarker.setAttribute($viewsLinkAttr, \"\");\n\t\t}\n\t}\n\treturn marker;\n}\n\nfunction normalizeLinkTag(linkMarkup, twoway) {\n\tlinkMarkup = $.trim(linkMarkup).replace(rEscapeQuotes, \"\\\\$&\");\n\treturn linkMarkup.slice(-1) !== delimCloseChar0\n\t// If simplified syntax is used: data-link=\"expression\", convert to data-link=\"{:expression}\",\n\t// or for inputs, data-link=\"{:expression:}\" for (default) two-way binding\n\t\t? linkMarkup = delimOpenChar1 + \":\" + linkMarkup + (twoway ? \":\" : \"\") + delimCloseChar0\n\t\t: linkMarkup;\n}\n\n//===========================\n// Methods for views and tags\n//===========================\n\nfunction callAfterLink(tag, eventArgs) {\n\tvar $linkedElem, linkedElem, radioButtons, val, l, linkedTag, oldTrig, newTrig,\n\t\ttagCtx = tag.tagCtx,\n\t\tview = tagCtx.view,\n\t\tprops = tagCtx.props,\n\t\tlinkCtx = tag.linkCtx = tag.linkCtx || {\n\t\t\ttag: tag,\n\t\t\tdata: view.data,\n\t\t\tview: view,\n\t\t\tctx: view.ctx\n\t\t};\n\n\tif (tag.onAfterLink) {\n\t\ttag.onAfterLink(tagCtx, linkCtx, eventArgs);\n\t}\n\ttag._.unlinked = undefined;\n\t$linkedElem = tag.targetTag ? tag.targetTag.linkedElem : tag.linkedElem;\n\tif (!tag.noVal && (linkedElem = $linkedElem && $linkedElem[0])) {\n\t\tif (radioButtons = tag._.radio) {\n\t\t\t$linkedElem = $linkedElem.find(RADIOINPUT);\n\t\t}\n\t\tif (radioButtons || !tag._.chging) {\n\t\t\tval = tag.cvtArgs()[0];\n\n\t\t\tif (radioButtons || linkedElem !== linkCtx.elem) {\n\t\t\t\tl = $linkedElem.length;\n\t\t\t\twhile (l--) {\n\t\t\t\t\tlinkedElem = $linkedElem[l];\n\t\t\t\t\tlinkedTag = linkedElem._jsvLkEl;\n\t\t\t\t\tif (tag._.inline && (!linkedTag || linkedTag !== tag && linkedTag.targetTag !== tag)) {\n\t\t\t\t\t\t// For data-linked tags, identify the linkedElem with the tag, for \"to\" binding\n\t\t\t\t\t\t// (For data-linked elements, if not yet bound, we identify later when the linkCtx.elem is bound)\n\t\t\t\t\t\tlinkedElem._jsvLkEl = tag;\n\t\t\t\t\t\tbindTo(bindingStore[tag._tgId], tag.convertBack);\n\t\t\t\t\t\tlinkedElem._jsvBnd = \"&\" + tag._tgId + \"+\"; // Add a \"+\" for cloned binding - so removing\n\t\t\t\t\t\t// elems with cloned bindings will not remove the 'parent' binding from the bindingStore.\n\t\t\t\t\t}\n\t\t\t\t\tif (radioButtons) {\n\t\t\t\t\t\t// For radio button, set to if val === value. For others set val() to val, below\n\t\t\t\t\t\tlinkedElem[CHECKED] = val === linkedElem.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlinkCtx._val = val;\n\t\t\t}\n\t\t\tif (val !== undefined) {\n\t\t\t\tif (!radioButtons && linkedElem.value !== undefined) {\n\t\t\t\t\tif (linkedElem.type === CHECKBOX) {\n\t\t\t\t\t\tlinkedElem[CHECKED] = val && val !== \"false\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$linkedElem.val(val);\n\t\t\t\t\t}\n\t\t\t\t} else if (linkedElem.contentEditable === TRUE) {\n\t\t\t\t\tlinkedElem.innerHTML = val;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (tag.setSize) {\n\t\t\tif (props.height) {\n\t\t\t\t$linkedElem.height(props.height);\n\t\t\t}\n\t\t\tif (props.width) {\n\t\t\t\t$linkedElem.width(props.width);\n\t\t\t}\n\t\t}\n\t\tif (props[\"class\"]) {\n\t\t\t$linkedElem.addClass(props[\"class\"]);\n\t\t}\n\t\tif (props.id) {\n\t\t\t$linkedElem[0].id = props.id;\n\t\t}\n\t\tif (props.name) {\n\t\t\t$linkedElem.attr(\"name\", props.name);\n\t\t}\n\t}\n\tif (linkedElem = linkedElem || tag.tagName === \":\" && linkCtx.elem) {\n\t\toldTrig = linkedElem._jsvTr;\n\t\tnewTrig = props.trigger;\n\t\tif (oldTrig !== newTrig) {\n\t\t\tlinkedElem._jsvTr = newTrig;\n\t\t\t$linkedElem = $linkedElem || $(linkedElem);\n\t\t\tbindElChange($linkedElem, oldTrig, \"off\");\n\t\t\tbindElChange($linkedElem, newTrig, \"on\");\n\t\t}\n\t}\n}\n\nfunction asyncElemChangeHandler(ev) {\n\tsetTimeout(function() {\n\t\telemChangeHandler(ev);\n\t}, 0);\n}\n\nfunction bindElChange($elem, trig, onoff) {\n\tif (trig) {\n\t\t$elem[onoff](trig === true ? \"keydown\" : trig, trig === true ? asyncElemChangeHandler : elemChangeHandler);\n\t}\n}\n\nfunction bindTo(binding, cvtBk) {\n\t// Two-way binding.\n\t// We set the binding.to[1] to be the cvtBack, and binding.to[0] to be either the path to the target, or [object, path] where the target is the path on the provided object.\n\t// So for a computed path with an object call: a.b.getObject().d.e, then we set to[0] to be [exprOb, \"d.e\"], and we bind to the path on the returned object, exprOb.ob, as target\n\t// Otherwise our target is the first path, paths[0], which we will convert with contextCb() for paths like ~a.b.c or #x.y.z\n\n\tvar bindto, pathIndex, path, lastPath, bindtoOb,\n\t\tlinkCtx = binding.linkCtx,\n\t\tsource = linkCtx.data,\n\t\tpaths = linkCtx.fn.paths;\n\tif (binding && paths) {\n\t\tpaths = (bindto = paths._jsvto) || paths[0];\n\t\tpathIndex = paths && paths.length;\n\t\tif (pathIndex && (!linkCtx.tag || linkCtx.tag.tagCtx.args.length)) {\n\t\t\tlastPath = paths[pathIndex - 1];\n\t\t\tif (lastPath._jsv) {\n\t\t\t\tbindtoOb = lastPath;\n\t\t\t\twhile (lastPath.sb && lastPath.sb._jsv) {\n\t\t\t\t\tpath = lastPath = lastPath.sb;\n\t\t\t\t}\n\t\t\t\tpath = lastPath.sb || path && path.path;\n\t\t\t\tlastPath = path ? path.slice(1) : bindtoOb.path;\n\t\t\t}\n\t\t\tbinding.to = path\n\t\t\t\t? [ // \"...someexpr().lastpath...\" - so need to get the bindtoOb 'exprOb' object for this view-binding\n\t\t\t\t\t[\n\t\t\t\t\t\tbindtoOb, // 'exprOb' for this expression and view-binding. So bindtoOb.ob is current object returned by expression.\n\t\t\t\t\t\tlastPath\n\t\t\t\t\t],\n\t\t\t\t\tcvtBk\n\t\t\t\t]\n\t\t\t\t: [\n\t\t\t\t\tlinkCtx._ctxCb(path = lastPath.split(\"^\").join(\".\")) || [source, path],\n\t\t\t\t\tcvtBk\n\t\t\t\t];\n\t\t} else {\n\t\t\tbinding.to = [[], cvtBk];\n\t\t}\n\t}\n}\n\nfunction mergeCtxs(tag, newCtxs, replace) { // Merge updated tagCtxs into tag.tagCtxs\n\tvar tagCtx, newTagCtx,\n\t\tview = tag.tagCtx.view,\n\t\ttagCtxs = tag.tagCtxs || [tag.tagCtx],\n\t\tl = tagCtxs.length,\n\t\trefresh = !newCtxs;\n\n\tnewCtxs = newCtxs || tag._.bnd.call(view.tmpl, (tag.linkCtx || view).data, view, $views);\n\n\tif (replace) {\n\t\t// Replace previous tagCtxs by new ones, rather than merging\n\t\ttagCtxs = tag.tagCtxs = newCtxs;\n\t\ttag.tagCtx = tagCtxs[0];\n\t} else {\n\t\twhile (l--) {\n\t\t\ttagCtx = tagCtxs[l];\n\t\t\tnewTagCtx = newCtxs[l];\n\t\t\t$observable(tagCtx.props).setProperty(newTagCtx.props);\n\t\t\t$extend(tagCtx.ctx, newTagCtx.ctx); // We don't support propagating ctx variables, ~foo, observably, to nested views. So extend, not setProperty...\n\t\t\ttagCtx.args = newTagCtx.args;\n\t\t\tif (refresh) {\n\t\t\t\ttagCtx.tmpl = newTagCtx.tmpl;\n\t\t\t}\n\t\t}\n\t}\n\t$sub._ths(tag, tagCtxs[0]); // tagHandlersFromProps\n\treturn tagCtxs;\n}\n\n//=========\n// Disposal\n//=========\n\nfunction clean(elems) {\n\t// Remove data-link bindings, or contained views\n\tvar l, elem, bindings,\n\t\telemArray = [],\n\t\tlen = elems.length,\n\t\ti = len;\n\twhile (i--) {\n\t\t// Copy into an array, so that deletion of nodes from DOM will not cause our 'i' counter to get shifted\n\t\t// (Note: This seems as fast or faster than elemArray = [].slice.call(elems); ...)\n\t\telemArray.push(elems[i]);\n\t}\n\ti = len;\n\twhile (i--) {\n\t\telem = elemArray[i];\n\t\tif (elem.parentNode) {\n\t\t\t// Has not already been removed from the DOM\n\t\t\tif (bindings = elem._jsvBnd) {\n\t\t\t\t// Get propertyChange bindings for this element\n\t\t\t\t// This may be an element with data-link, or the opening script marker node for a data-linked tag {^{...}}\n\t\t\t\t// bindings is a string with the syntax: \"(&bindingId)*\"\n\t\t\t\tbindings = bindings.slice(1).split(\"&\");\n\t\t\t\telem._jsvBnd = \"\";\n\t\t\t\tl = bindings.length;\n\t\t\t\twhile (l--) {\n\t\t\t\t\t// Remove associated bindings\n\t\t\t\t\tremoveViewBinding(bindings[l], elem._jsvLkEl, elem); // unbind bindings with this bindingId on this view\n\t\t\t\t}\n\t\t\t}\n\t\t\tdisposeTokens(markerNodeInfo(elem) + (elem._df || \"\"));\n\t\t}\n\t}\n}\n\nfunction removeViewBinding(bindId, linkedElemTag, elem) {\n\t// Unbind\n\tvar objId, linkCtx, tag, object, obsId, tagCtxs, l, map, $linkedElem, linkedElem, trigger, view,\n\t\tbinding = bindingStore[bindId];\n\n\tif (linkedElemTag) {\n\t\tif (elem === linkedElemTag.linkedElem[0]) {\n\t\t\telem._jsvLkEl = undefined;\n\t\t\tlinkedElemTag.linkedElem = undefined;\n\t\t}\n\t} else if (binding) {\n\t\tdelete bindingStore[bindId]; // Delete already, so call to onDispose handler below cannot trigger recursive deletion (through recursive call to jQuery cleanData)\n\t\tfor (objId in binding.bnd) {\n\t\t\tobject = binding.bnd[objId];\n\t\t\tobsId = binding.cbId;\n\t\t\tif ($.isArray(object)) {\n\t\t\t\t$([object]).off(arrayChangeStr + obsId).off(propertyChangeStr + obsId); // There may be either or both of arrayChange and propertyChange\n\t\t\t} else {\n\t\t\t\t$(object).off(propertyChangeStr + obsId);\n\t\t\t}\n\t\t\tdelete binding.bnd[objId];\n\t\t}\n\n\t\tif (linkCtx = binding.linkCtx) {\n\t\t\tif (tag = linkCtx.tag) {\n\t\t\t\tif (tagCtxs = tag.tagCtxs) {\n\t\t\t\t\tl = tagCtxs.length;\n\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\tif (map = tagCtxs[l].map) {\n\t\t\t\t\t\t\tmap.unmap(); //unobserve\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$linkedElem = tag.linkedElem;\n\t\t\t\tlinkedElem = $linkedElem && $linkedElem[0] || linkCtx.elem;\n\n\t\t\t\tif (trigger = linkedElem && linkedElem._jsvTr) {\n\t\t\t\t\tbindElChange($linkedElem || $(linkedElem), trigger, \"off\");\n\t\t\t\t\tlinkedElem._jsvTr = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (tag.onDispose) {\n\t\t\t\t\ttag.onDispose();\n\t\t\t\t}\n\n\t\t\t\tif (!tag._elCnt) {\n\t\t\t\t\tif (tag._prv) {\n\t\t\t\t\t\ttag._prv.parentNode.removeChild(tag._prv);\n\t\t\t\t\t}\n\t\t\t\t\tif (tag._nxt) {\n\t\t\t\t\t\ttag._nxt.parentNode.removeChild(tag._nxt);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tview = linkCtx.view;\n\t\t\tif (view.type === \"link\") {\n\t\t\t\tview.parent.removeViews(view._.key, undefined, true); // A \"link\" view is associated with the binding, so should be disposed with binding.\n\t\t\t} else {\n\t\t\t\tdelete view._.bnds[bindId];\n\t\t\t}\n\t\t}\n\t\t$sub._cbBnds[binding.cbId] = undefined;\n\t}\n}\n\nfunction $unlink(to) {\n\tif (to) {\n\t\tto = to.jquery ? to : $(to);\n\t\tto.each(function() {\n\t\t\tvar innerView;\n\t\t\t//TODO fix this for better perf. Rather that calling inner view multiple times which does querySelectorAll each time, consider a single querySelectorAll\n\t\t\t// or simply call view.removeViews() on the top-level views under the target 'to' node, then clean(...)\n\t\t\twhile ((innerView = $view(this, true)) && innerView.parent) {\n\t\t\t\tinnerView.parent.removeViews(innerView._.key, undefined, true);\n\t\t\t}\n\t\t\tclean(this.getElementsByTagName(\"*\"));\n\t\t});\n\t\tclean(to);\n\t} else {\n\t\t// Call to $.unlink() is equivalent to $.unlink(true, \"body\")\n\t\tif (activeBody) {\n\t\t\t$(activeBody)\n\t\t\t\t.off(elementChangeStr, elemChangeHandler)\n\t\t\t\t.off('blur', '[contenteditable]', elemChangeHandler);\n\t\t\tactiveBody = undefined;\n\t\t}\n\t\ttopView.removeViews();\n\t\tclean(document.body.getElementsByTagName(\"*\"));\n\t}\n}\n\n//========\n// Helpers\n//========\n\nfunction getContextCb(view) {\n\t// TODO Consider exposing or allowing override, as public API\n\treturn function(path, object) {\n\t\t// TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on\n\t\t// the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times\n\t\tvar tokens, tag,\n\t\t\titems = [object];\n\t\tif (view && path) {\n\t\t\tif (path._jsv) {\n\t\t\t\treturn path._jsv.call(view.tmpl, object, view, $views);\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"~\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"~a.b.c\" string:\n\t\t\t\t// [helperObject 'a', \"a.b.c\" currentDataItem] so currentDataItem becomes the object for subsequent paths.\n\t\t\t\tif (path.slice(0, 4) === \"~tag\") {\n\t\t\t\t\ttag = view.ctx;\n\t\t\t\t\tif (path.charAt(4) === \".\") {\n\t\t\t\t\t\t// \"~tag.xxx\"\n\t\t\t\t\t\ttokens = path.slice(5).split(\".\");\n\t\t\t\t\t\ttag = tag.tag;\n\t\t\t\t\t}\n\t\t\t\t\tif (tokens) {\n\t\t\t\t\t\treturn tag ? [tag, tokens.join(\".\"), object] : [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpath = path.slice(1).split(\".\");\n\t\t\t\tif (object = view.hlp(path.shift())) {\n\t\t\t\t\tif (path.length) {\n\t\t\t\t\t\titems.unshift(path.join(\".\"));\n\t\t\t\t\t}\n\t\t\t\t\titems.unshift(object);\n\t\t\t\t}\n\t\t\t\treturn object ? items : [];\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"#\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"#a.b.c\" string: [view, \"a.b.c\" currentDataItem]\n\t\t\t\t// so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes.\n\t\t\t\treturn path === \"#data\" ? [] : [view, path.replace(rViewPath, \"\"), object];\n\t\t\t}\n\t\t}\n\t};\n}\n\nfunction inputAttrib(elem) {\n\treturn elem.type === CHECKBOX ? elem[CHECKED] : elem.value;\n}\n\n//========================== Initialize ==========================\n\n//=====================\n// JsRender integration\n//=====================\n\n$sub.onStore.template = function(name, item) {\n\titem.link = tmplLink;\n\tif (name) {\n\t\t$.link[name] = function() {\n\t\t\treturn tmplLink.apply(item, arguments);\n\t\t};\n\t}\n};\n\n$sub.viewInfos = viewInfos; // Expose viewInfos() as public helper method\n\n// Initialize default delimiters\n($viewsSettings.delimiters = function() {\n\tvar delimChars = oldJsvDelimiters.apply(0, arguments);\n\tdelimOpenChar0 = delimChars[0];\n\tdelimOpenChar1 = delimChars[1];\n\tdelimCloseChar0 = delimChars[2];\n\tdelimCloseChar1 = delimChars[3];\n\tlinkChar = delimChars[4];\n\trTagDatalink = new RegExp(\"(?:^|\\\\s*)([\\\\w-]*)(\\\\\" + linkChar + \")?(\\\\\" + delimOpenChar1 + $sub.rTag + \"\\\\\" + delimCloseChar0 + \")\", \"g\");\n\n\t// Default rTag: attr bind tagExpr tag converter colon html comment code params\n\t// (?:^|\\s*)([\\w-]*)(\\^)?({(?:(?:(\\w+(?=[\\/\\s}]))|(?:(\\w+)?(:)|(>)|!--((?:[^-]|-(?!-))*)--|(\\*)))\\s*((?:[^}]|}(?!}))*?))})\n\treturn this;\n})(); // jshint ignore:line\n\n//====================================\n// Additional members for linked views\n//====================================\n\nfunction transferViewTokens(prevNode, nextNode, parentElem, id, viewOrTagChar, refresh) {\n\t// Transfer tokens on prevNode of viewToRemove/viewToRefresh to nextNode or parentElem._df\n\tvar i, l, vwInfos, vwInfo, viewOrTag, viewId, tokens,\n\t\tprecedingLength = 0,\n\t\temptyView = prevNode === nextNode;\n\n\tif (prevNode) {\n\t\t// prevNode is either the first node in the viewOrTag, or has been replaced by the vwInfos tokens string\n\t\tvwInfos = viewInfos(prevNode) || [];\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\t// Step through views or tags on the prevNode\n\t\t\tvwInfo = vwInfos[i];\n\t\t\tviewId = vwInfo.id;\n\t\t\tif (viewId === id && vwInfo.ch === viewOrTagChar) {\n\t\t\t\tif (refresh) {\n\t\t\t\t\t// This is viewOrTagToRefresh, this is the last viewOrTag to process...\n\t\t\t\t\tl = 0;\n\t\t\t\t} else {\n\t\t\t\t\t// This is viewOrTagToRemove, so we are done...\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!emptyView) {\n\t\t\t\tviewOrTag = vwInfo.ch === \"_\"\n\t\t\t\t\t? viewStore[viewId]\n\t\t\t\t\t: bindingStore[viewId].linkCtx.tag;\n\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t// A \"#m\" token\n\t\t\t\t\tviewOrTag._prv = nextNode;\n\t\t\t\t} else if (vwInfo.close) {\n\t\t\t\t\t// A \"/m\" token\n\t\t\t\t\tviewOrTag._nxt = nextNode;\n\t\t\t\t}\n\t\t\t}\n\t\t\tprecedingLength += viewId.length + 2;\n\t\t}\n\n\t\tif (precedingLength) {\n\t\t\tprevNode.setAttribute(jsvAttrStr, prevNode.getAttribute(jsvAttrStr).slice(precedingLength));\n\t\t}\n\t\ttokens = nextNode ? nextNode.getAttribute(jsvAttrStr) : parentElem._df;\n\t\tif (l = tokens.indexOf(\"/\" + id + viewOrTagChar) + 1) {\n\t\t\ttokens = vwInfos._tkns.slice(0, precedingLength) + tokens.slice(l + (refresh ? -1 : id.length + 1));\n\t\t}\n\t\tif (tokens) {\n\t\t\tif (nextNode) {\n\t\t\t\t// If viewOrTagToRemove was an empty viewOrTag, we will remove both #n and /n\n\t\t\t\t// (and any intervening tokens) from the nextNode (=== prevNode)\n\t\t\t\t// If viewOrTagToRemove was not empty, we will take tokens preceding #n from prevNode,\n\t\t\t\t// and concatenate with tokens following /n on nextNode\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, tokens);\n\t\t\t} else {\n\t\t\t\tsetDefer(parentElem, tokens);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// !prevNode, so there may be a deferred nodes token on the parentElem. Remove it.\n\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + viewOrTagChar));\n\t\tif (!refresh && !nextNode) {\n\t\t\t// If this viewOrTag is being removed, and there was no .nxt, remove closing token from deferred tokens\n\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + viewOrTagChar));\n\t\t}\n\t}\n}\n\nfunction disposeTokens(tokens) {\n\tvar i, l, vwItem, vwInfos;\n\tif (vwInfos = viewInfos(tokens, true, rOpenMarkers)) {\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\tvwItem = vwInfos[i];\n\t\t\tif (vwItem.ch === \"_\") {\n\t\t\t\tif ((vwItem = viewStore[vwItem.id]) && vwItem.type) {\n\t\t\t\t\t// If this is the _prv (prevNode) for a view, remove the view\n\t\t\t\t\t// - unless view.type is undefined, in which case it is already being removed\n\t\t\t\t\tvwItem.parent.removeViews(vwItem._.key, undefined, true);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tremoveViewBinding(vwItem.id); // unbind bindings with this bindingId on this view\n\t\t\t}\n\t\t}\n\t}\n}\n\n//====================================\n// Add link methods to data-linked view or tag\n//====================================\nfunction addLinkMethods(tagOrView, isTag) {\n\n\ttagOrView.contents = function(deep, select) {\n\t\t// For a view or a tag, return jQuery object with the content nodes,\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is getContents(selector)\n\t\t\tselect = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\t\tvar filtered,\n\t\t\tnodes = $(this.nodes());\n\t\tif (nodes[0]) {\n\t\t\tfiltered = select ? nodes.filter(select) : nodes;\n\t\t\tnodes = deep && select ? filtered.add(nodes.find(select)) : filtered;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.nodes = function(withMarkers, prevNode, nextNode) {\n\t\t// For a view or a tag, return top-level nodes\n\t\t// Do not return any script marker nodes, unless withMarkers is true\n\t\t// Optionally limit range, by passing in prevNode or nextNode parameters\n\n\t\tvar node,\n\t\t\tself = this,\n\t\t\telCnt = self._elCnt,\n\t\t\tprevIsFirstNode = !prevNode && elCnt,\n\t\t\tnodes = [];\n\n\t\tprevNode = prevNode || self._prv;\n\t\tnextNode = nextNode || self._nxt;\n\n\t\tnode = prevIsFirstNode\n\t\t\t? (prevNode === self._nxt\n\t\t\t\t? self.parentElem.lastSibling\n\t\t\t\t: prevNode)\n\t\t\t: (self._.inline === false\n\t\t\t\t? prevNode || self.linkCtx.elem.firstChild\n\t\t\t\t: prevNode && prevNode.nextSibling);\n\n\t\twhile (node && (!nextNode || node !== nextNode)) {\n\t\t\tif (withMarkers || elCnt || node.tagName !== SCRIPT) {\n\t\t\t\t// All the top-level nodes in the view\n\t\t\t\t// (except script marker nodes, unless withMarkers = true)\n\t\t\t\t// (Note: If a script marker node, viewInfo.elCnt undefined)\n\t\t\t\tnodes.push(node);\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.childTags = function(deep, tagName) {\n\t\t// For a view or a tag, return child tags - at any depth, or as immediate children only.\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is childTags(tagName) - which looks for top-level tags of given tagName\n\t\t\ttagName = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\n\t\tvar self = this,\n\t\t\tview = self.link ? self : self.tagCtx.view, // this may be a view or a tag. If a tag, get the view from tag.view.tagCtx\n\t\t\tprevNode = self._prv,\n\t\t\telCnt = self._elCnt,\n\t\t\ttags = [];\n\n\t\tview.link(\n\t\t\tundefined,\n\t\t\tself.parentElem,\n\t\t\telCnt ? prevNode && prevNode.previousSibling : prevNode,\n\t\t\tself._nxt,\n\t\t\tundefined,\n\t\t\t{get:{\n\t\t\t\ttags: tags,\n\t\t\t\tdeep: deep,\n\t\t\t\tname: tagName,\n\t\t\t\tid: self.link ? self._.id + \"_\" : self._tgId + \"^\"\n\t\t\t}}\n\t\t);\n\t\treturn tags;\n\t};\n\n\ttagOrView.refresh = function(sourceValue) {\n\t\tvar promise, attr,\n\t\t\ttag = this,\n\t\t\tlinkCtx = tag.linkCtx,\n\t\t\tview = tag.tagCtx.view;\n\n\t\tif (tag.disposed) { error(\"Removed tag\"); }\n\t\tif (sourceValue === undefined) {\n\t\t\tsourceValue = $views._tag(tag, view, view.tmpl, mergeCtxs(tag), true); // Get rendered HTML for tag, based on refreshed tagCtxs\n\t\t}\n\t\tif (sourceValue + \"\" === sourceValue) {\n\t\t\t// If no rendered content, sourceValue will not be a string (can be 0 or undefined)\n\t\t\tattr = tag._.inline ? HTML : (linkCtx.attr || defaultAttr(tag.parentElem, true));\n\t\t\tpromise = updateContent(sourceValue, linkCtx, attr, tag);\n\t\t}\n\n\t\tcallAfterLink(tag);\n\t\treturn promise || tag;\n\t};\n\n\ttagOrView.update = function(value) {\n\t\tvar linkedElem = this.linkedElem;\n\t\tif (linkedElem) {\n\t\t\telemChangeHandler({\n\t\t\t\ttarget: linkedElem[0]\n\t\t\t}, undefined, value);\n\t\t}\n\t};\n\n\tif (isTag) {\n\t\ttagOrView.domChange = function() { // domChange notification support\n\t\t\tvar elem = this.parentElem,\n\t\t\t\thasListener = $.hasData(elem) && $._data(elem).events,\n\t\t\t\tdomChangeNotification = \"jsv-domchange\";\n\n\t\t\tif (hasListener && hasListener[domChangeNotification]) {\n\t\t\t\t// Only trigger handler if there is a handler listening for this event. (Note using triggerHandler - so no event bubbling.)\n\t\t\t\t$(elem).triggerHandler(domChangeNotification, arguments);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t\t// Note: a linked view will also, after linking have nodes[], _prv (prevNode), _nxt (nextNode) ...\n\t\ttagOrView.addViews = function(index, dataItems, tmpl) {\n\t\t\t// if view is not an array view, do nothing\n\t\t\tvar i, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\titemsCount = dataItems.length,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (!self._.useKey && itemsCount && (tmpl = self.tmpl)) {\n\t\t\t\t// view is of type \"array\"\n\t\t\t\t// Use passed-in template if provided, since self added view may use a different template than the original one used to render the array.\n\t\t\t\tviewsCount = views.length + itemsCount;\n\n\t\t\t\tif (viewsCount === self.data.length // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\t\t&& renderAndLink(self, index, tmpl, views, dataItems, self.ctx) !== false) {\n\t\t\t\t\tfor (i = index + itemsCount; i < viewsCount; i++) {\n\t\t\t\t\t\t$observable(views[i]).setProperty(\"index\", i);\n\t\t\t\t\t\t// This is fixing up index, but not key, and not index on child views. From child views, use view.getIndex()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn self;\n\t\t};\n\n\t\ttagOrView.removeViews = function(index, itemsCount, keepNodes) {\n\t\t\t// view.removeViews() removes all the child views\n\t\t\t// view.removeViews(index) removes the child view with specified index or key\n\t\t\t// view.removeViews(index, count) removes the specified nummber of child views, starting with the specified index\n\t\t\tfunction removeView(index) {\n\t\t\t\tvar id, bindId, parentElem, prevNode, nextNode, nodesToRemove,\n\t\t\t\t\tviewToRemove = views[index];\n\n\t\t\t\tif (viewToRemove && viewToRemove.link) {\n\t\t\t\t\tid = viewToRemove._.id;\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tnodesToRemove = viewToRemove.nodes();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove child views, without removing nodes\n\t\t\t\t\tviewToRemove.removeViews(undefined, undefined, true);\n\n\t\t\t\t\tviewToRemove.type = undefined; // Set type to undefined: used as a flag that this view is being removed\n\t\t\t\t\tprevNode = viewToRemove._prv;\n\t\t\t\t\tnextNode = viewToRemove._nxt;\n\t\t\t\t\tparentElem = viewToRemove.parentElem;\n\t\t\t\t\t// If prevNode and nextNode are the same, the view is empty\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tif (viewToRemove._elCnt) {\n\t\t\t\t\t\t\t// if keepNodes is false (and transferring of tokens has not already been done at a higher level)\n\t\t\t\t\t\t\t// then transfer tokens from prevNode which is being removed, to nextNode.\n\t\t\t\t\t\t\ttransferViewTokens(prevNode, nextNode, parentElem, id, \"_\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(nodesToRemove).remove();\n\t\t\t\t\t}\n\t\t\t\t\tif (!viewToRemove._elCnt) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tprevNode.parentNode.removeChild(prevNode); // (prevNode.parentNode is parentElem, except if jQuery Mobile or similar has inserted an intermediate wrapper\n\t\t\t\t\t\t\tnextNode.parentNode.removeChild(nextNode);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\t\t\t\t\tsetArrayChangeLink(viewToRemove);\n\t\t\t\t\tfor (bindId in viewToRemove._.bnds) {\n\t\t\t\t\t\tremoveViewBinding(bindId);\n\t\t\t\t\t}\n\t\t\t\t\tdelete viewStore[id];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar current, view, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\tisArray = !self._.useKey,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (isArray) {\n\t\t\t\tviewsCount = views.length;\n\t\t\t}\n\t\t\tif (index === undefined) {\n\t\t\t\t// Remove all child views\n\t\t\t\tif (isArray) {\n\t\t\t\t\t// views and data are arrays\n\t\t\t\t\tcurrent = viewsCount;\n\t\t\t\t\twhile (current--) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = [];\n\t\t\t\t} else {\n\t\t\t\t\t// views and data are objects\n\t\t\t\t\tfor (view in views) {\n\t\t\t\t\t\t// Remove by key\n\t\t\t\t\t\tremoveView(view);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = {};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (itemsCount === undefined) {\n\t\t\t\t\tif (isArray) {\n\t\t\t\t\t\t// The parentView is data array view.\n\t\t\t\t\t\t// Set itemsCount to 1, to remove this item\n\t\t\t\t\t\titemsCount = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Remove child view with key 'index'\n\t\t\t\t\t\tremoveView(index);\n\t\t\t\t\t\tdelete views[index];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isArray && itemsCount\n\t\t\t\t\t&& viewsCount - itemsCount === self.data.length) { // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\tcurrent = index + itemsCount;\n\t\t\t\t\t// Remove indexed items (parentView is data array view);\n\t\t\t\t\twhile (current-- > index) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tviews.splice(index, itemsCount);\n\t\t\t\t\tif (viewsCount = views.length) {\n\t\t\t\t\t\t// Fixup index on following view items...\n\t\t\t\t\t\twhile (index < viewsCount) {\n\t\t\t\t\t\t\t$observable(views[index]).setProperty(\"index\", index++);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\ttagOrView.refresh = function(context) {\n\t\t\tvar self = this,\n\t\t\t\tparent = self.parent;\n\n\t\t\tif (parent) {\n\t\t\t\trenderAndLink(self, self.index, self.tmpl, parent.views, self.data, context, true);\n\t\t\t\tsetArrayChangeLink(self);\n\t\t\t}\n\t\t\treturn self;\n\t\t};\n\n\t\ttagOrView.link = viewLink;\n\t}\n}\n\n//========================\n// JsViews-specific converters\n//========================\n\n$converters.merge = function(val) {\n\t// Special converter used in data-linking to space-separated lists, such as className:\n\t// Currently only supports toggle semantics - and has no effect if toggle string is not specified\n\t// data-link=\"class{merge:boolExpr toggle=className}\"\n\tvar regularExpression,\n\t\tcurrentValue = this.linkCtx._val || \"\",\n\t\ttoggle = this.tagCtx.props.toggle;\n\n\tif (toggle) {\n\t\t// We are toggling the class specified by the toggle property,\n\t\t// and the boolean val binding is driving the insert/remove toggle\n\n\t\tregularExpression = toggle.replace(/[\\\\^$.|?*+()[{]/g, \"\\\\$&\");\n\t\t// Escape any regular expression special characters (metacharacters) within the toggle string\n\t\tregularExpression = \"(\\\\s(?=\" + regularExpression + \"$)|(\\\\s)|^)(\" + regularExpression + \"(\\\\s|$))\";\n\t\t// Example: /(\\s(?=myclass$)|(\\s)|^)?(myclass(\\s|$))/ - so matches (\" myclass\" or \" \" or ^ ) followed by (\"myclass \" or \"myclass$\") where ^/$ are beginning/end of string\n\t\tcurrentValue = currentValue.replace(new RegExp(regularExpression), \"$2\");\n\t\tval = currentValue + (val ? (currentValue && \" \") + toggle : \"\");\n\t}\n\treturn val;\n};\n\n//========================\n// JsViews-specific tags\n//========================\n\n$tags(\"on\", {\n\tattr: NONE,\n\tinit: function(tagCtx) {\n\t\tvar tag = this,\n\t\t\tprops = tagCtx.props,\n\t\t\tcontent = tagCtx.content,\n\t\t\telemType = props.elem;\n\n\t\tif (tag._.inline) {\n\t\t\ttag.attr = HTML;\n\t\t\telemType = (elemType || \"span\") + \">\";\n\t\t\ttag.template = \"<\" + elemType + (props.label || content.markup || tagCtx.params.args[0]) + \" 1) {\n\t\t\t// Perf optimization for common cases\n\n\t\t\tnode = \"\" + node === node\n\t\t\t\t? $(node)[0]\n\t\t\t\t: node.jquery\n\t\t\t\t\t? node[0]\n\t\t\t\t\t: node;\n\n\t\t\tif (node) {\n\t\t\t\tif (inner) {\n\t\t\t\t\tgetInnerView(node._df, true);\n\t\t\t\t\tif (!view) {\n\t\t\t\t\t\t// Treat supplied node as a container element and return the first view encountered.\n\t\t\t\t\t\telems = qsa ? node.querySelectorAll(bindElsSel) : $(bindElsSel, node).get();\n\t\t\t\t\t\tl = elems.length;\n\t\t\t\t\t\tfor (i = 0; !view && i < l; i++) {\n\t\t\t\t\t\t\tgetInnerView(elems[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn view;\n\t\t\t\t}\n\t\t\t\twhile (node) {\n\t\t\t\t\t// Move back through siblings and up through parents to find preceding node which is a _prv (prevNode)\n\t\t\t\t\t// script marker node for a non-element-content view, or a _prv (first node) for an elCnt view\n\t\t\t\t\tif (vwInfos = viewInfos(node, undefined, rViewMarkers)) {\n\t\t\t\t\t\tl = vwInfos.length;\n\t\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\t\tview = vwInfos[l];\n\t\t\t\t\t\t\tif (view.open) {\n\t\t\t\t\t\t\t\tif (level < 1) {\n\t\t\t\t\t\t\t\t\tview = viewStore[view.id];\n\t\t\t\t\t\t\t\t\treturn view && type ? view.get(type) : view || topView;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlevel--;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// level starts at zero. If we hit a view.close, then we move level to 1, and we don't return a view until\n\t\t\t\t\t\t\t\t// we are back at level zero (or a parent view with level < 0)\n\t\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.previousSibling || node.parentNode;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn topView;\n\t},\n\n\tlink: $views.link = $link,\n\tunlink: $views.unlink = $unlink,\n\n\t//=====================\n\t// override $.cleanData\n\t//=====================\n\tcleanData: function(elems) {\n\t\tif (elems.length && isCleanCall) {\n\t\t\t// Remove JsViews bindings. Also, remove from the DOM any corresponding script marker nodes\n\t\t\tclean(elems);\n\t\t}\n\t\toldCleanData.apply($, arguments);\n\t}\n});\n\n// Possible future addition - e.g. for ckeditor tag control\n//$views.utility = {\n//\tvalidate: function(html) {\n//\t\ttry {\n//\t\t\ttopView.link(undefined, document.createElement(\"div\"), undefined, undefined, html, undefined, undefined, 1);\n//\t\t}\n//\t\tcatch (e) {\n//\t\t\treturn e.message;\n//\t\t}\n//\t}\n//};\n\n//===============================\n// Extend jQuery instance plugins\n//===============================\n\n$extend($.fn, {\n\tlink: function(expr, from, context, noIteration, parentView, prevNode, nextNode) {\n\t\treturn $link(expr, this, from, context, noIteration, parentView, prevNode, nextNode);\n\t},\n\tunlink: function() {\n\t\treturn $unlink(this);\n\t},\n\tview: function(inner, type) {\n\t\treturn $view(this[0], inner, type);\n\t}\n});\n\n//==============================================================================\n// Override jQuery methods that call our overridden cleanData, for disposal etc.\n//==============================================================================\n\n$.each([HTML, \"replaceWith\", \"empty\", \"remove\"], function(i, name) {\n\tvar oldFn = $.fn[name];\n\t$.fn[name] = function() {\n\t\tvar result;\n\t\tisCleanCall = 1; // Make sure cleanData does disposal only when coming from these calls.\n\t\ttry {\n\t\t\tresult = oldFn.apply(this, arguments);\n\t\t}\n\t\tfinally {\n\t\t\tisCleanCall = 0;\n\t\t}\n\t\treturn result;\n\t};\n});\n\n//===============\n// Extend topView\n//===============\n\naddLinkMethods($extend(topView = $sub.topView, {tmpl: {links: {}}}));\n\nviewStore = { 0: topView }; // Top-level view\n\n//=========================\n// Extend $.views.settings\n//=========================\n\n$viewsSettings({\n\twrapMap: wrapMap = {\n\t\toption: [1, \"\"],\n\t\tlegend: [1, \"
\", \"
\"],\n\t\tarea: [1, \"\", \"\"],\n\t\tparam: [1, \"\", \"\"],\n\t\tthead: [1, \"
\", \"
\"],\n\t\ttr: [2, \"\", \"
\"],\n\t\ttd: [3, \"\", \"
\"],\n\t\tcol: [2, \"\", \"
\"],\n\t\tsvg_ns: [1, \"\", \"\"],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\tdiv: $.support.htmlSerialize ? [0, \"\", \"\"] : [1, \"X
\", \"
\"]\n\t},\n\tlinkAttr: $viewsLinkAttr = \"data-link\",\n\tmerge: {\n\t\tinput: {\n\t\t\tfrom: inputAttrib, to: \"value\"\n\t\t},\n\t\ttextarea: valueBinding,\n\t\tselect: valueBinding,\n\t\toptgroup: {\n\t\t\tto: \"label\"\n\t\t}\n\t},\n\tjsrDbgMode: $viewsSettings.debugMode, // debugMode for JsRender\n\tdebugMode: function(debugMode) { // debugMode for JsViews\n\t\t$viewsSettings._dbgMode = debugMode !== false;\n\t\tif ($viewsSettings._dbgMode) {\n\t\t\tglobal._jsv = { // In debug mode create global _jsv, for accessing views, etc\n\t\t\t\tviews: viewStore,\n\t\t\t\tbindings: bindingStore\n\t\t\t};\n\t\t} else if (global._jsv) {\n\t\t\tglobal._jsv = undefined; // In IE8 cannot do delete global._jsv\n\t\t}\n\t},\n\tjsv: function() {\n\t\t$viewsSettings.debugMode($viewsSettings._dbgMode);\n\t\t$viewsLinkAttr = $viewsSettings.linkAttr;\n\t\terror = $views._err;\n\t\tlinkViewsSel = bindElsSel + \",[\" + $viewsLinkAttr + \"]\";\n\t\tnoDomLevel0 = $viewsSettings.noDomLevel0;\n\t\twrapMap.optgroup = wrapMap.option;\n\t\twrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n\t\twrapMap.th = wrapMap.td;\n\t}\n});\n\nreturn $;\n}));\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["jsviews.js"],"names":["factory","global","eval","$","jQuery","define","amd","exports","module","getDerivedMethod","baseMethod","method","ret","tag","this","prevBase","base","apply","arguments","getMethod","$isFunction","_d","noop","tagHandlersFromProps","tagCtx","prop","props","rHasHandlers","test","retVal","val","dbgBreak","e","baseApply","dbgMode","debugMode","$viewsSettings","_dbgMode","JsViewsError","message","name","link","$extend","target","source","$viewsDelimiters","openChars","closeChars","delimOpenChar0","charAt","delimOpenChar1","delimCloseChar0","delimCloseChar1","linkChar","rTag","$sub","RegExp","rTmplString","getView","inner","type","undefined","views","i","l","found","view","root","_","useKey","get","length","parent","getNestedIndex","index","getIndex","getHelper","helper","wrapped","ctx","linkCtx","res","$helpers","_wrp","getTemplate","tmpl","fn","getRsc","$templates","convertVal","converter","onError","value","boundTag","bnds","args","data","$views","_tg","inline","bnd","unlinked","tagName","cvt","flow","extendCtx","_er","cvtArgs","convert","onRender","convertArgs","error","slice","depends","getDeps","getResource","resourceType","itemName","store","renderTag","parentView","tagCtxs","isUpdate","topView","tagDef","template","tags","attr","parentTag","itemRet","tagCtxCtx","content","callInit","mapDef","thisMap","initialTmpl","tagDataMap","parentTmpl","_is","tmpls","render","renderContent","getTmpl","_ctr","init","dataMap","arrVws","dataBoundOnly","map","parents","parentTags","rendering","src","unmap","tgt","noVws","HTML","$converters","html","View","context","key","contentTmpl","parentView_","self_","self","isArray","id","viewId","linked","indexStr","push","splice","compileChildResources","storeName","resources","resourceName","resource","settings","compile","onStore","jsvStores","compileTag","Tag","baseTag","compiledDef","$tags","prototype","constructor","_parentTmpl","compileTmpl","options","lookupTemplate","currentName","nodeType","elem","document","getElementById","find","innerHTML","getAttribute","tmplAttr","jsvTmpl","tmplName","setAttribute","compiledTmpl","tmplOrMarkup","markup","tmplObject","tmplFn","replace","rEscapeQuotes","$render","Map","getTgt","baseMap","htmlTag","wrapMap","links","rFirstElem","exec","toLowerCase","div","trim","registerStore","storeSettings","theStore","item","thisStore","OBJECT","storeNames","noIteration","isTopRenderCall","prevData","prevIndex","result","isRenderCall","useViews","renderWithViews","$isArray","setItemVar","newCtx","itemVar","newView","childView","itemResult","swapContent","outerOnRender","syntaxError","helpers","it","fallback","Err","isLinkExpr","convertBack","hasElse","pushprecedingContent","shift","loc","substr","rNewLine","blockTagCheck","block","parseTag","all","bind","colon","codeTag","params","slash","closeBlock","pathBindings","ctxProps","paramsArgs","paramsProps","paramsCtxProps","useTrigger","allowCode","rUnescapeQuotes","rTestElseIf","current","substring","stack","pop","parseParams","rBuildHash","onerror","isCtx","keyToken","keyValue","arg","param","hasHandlers","newNode","parsedParam","astTop","buildCode","setPaths","pathsArr","paths","deps","concat","paramStructure","parts","parseTokens","lftPrn0","lftPrn","bound","path","operator","err","eq","path2","prn","comma","lftPrn2","apos","quot","rtPrn","rtPrnDot","prn2","space","full","parsePath","allPath","not","object","viewProperty","pathTokens","leafToken","subPath","bindings","binds","named","bindto","_jsvto","bndCtx","bd","theOb","_jsv","sb","pathStart","parenDepth","expr","exprFn","newOb","aposed","quoted","boundName","bndStack","prm","tmplLinks","indexOf","paramIndex","split","join","rPath","fnCall","rParams","ast","node","hasTag","hasEncoder","getsVal","hasCnvt","useCnvt","tmplBindings","boundOnErrStart","boundOnErrEnd","tagRender","nestedTmpls","nestedTmpl","tagAndElses","nextIsElse","oldCode","isElse","isGetVal","tagCtxFn","tagStart","trigger","tmplBindingKey","templates","converters","code","tmplOptions","debug","Function","_tag","parentContext","getCharEntity","ch","charEntities","charCodeAt","getTargetProps","toJSON","$fnRender","tmplElem","jquery","selector","call","htmlEncode","text","rIsHtml","rHtmlEncode","elemChangeHandler","ev","sourceValue","setter","cancel","fromAttr","cvtBack","cnvtName","$source","binding","oldLinkCtx","onBeforeChange","onAfterChange","to","eventArgs","exprOb","_jsvBnd","rSplitBindings","bindingStore","hlp","onBeforeChangeStr","onAfterChangeStr","defaultAttr","fnSetters","nodeName","_jsvSel","multiple","change","oldValue","_val","_ctxCb","chging","$observable","setProperty","propertyChangeHandler","linkFn","noUpdate","forceUpdate","hasError","parentElem","parentNode","onEvent","_toLk","getTargetVal","onUpdate","mergeCtxs","NONE","onBeforeLink","callAfterLink","observeAndBind","_cnvt","TRUE","addLinkMethods","updateContent","_noUpd","currentValue","css","$target","style","parseInt","CHECKBOX","CHECKED","RADIO","setDefer","_df","deferAttr","prevNode","nextNode","promise","nodesToRemove","useProp","tokens","openIndex","closeIndex","testElem","cStyle","jsvSel","renders","targetParent","targetVal","_elCnt","_prv","_nxt","currentStyle","getComputedStyle","display","_jsvd","displayStyles","createElement","body","appendChild","removeChild","nodes","transferViewTokens","_tgId","disposeTokens","previousSibling","lastChild","remove","lazyLink","empty","children","textContent","innerText","selected","inArray","arrayChangeHandler","action","items","addViews","removeViews","refresh","setArrayChangeLink","handler","arrayBinding","bndArr","off","arrayChangeStr","on","linkGetVal","merge","contentEditable","from","renderAndLink","linkToNode","prevView","bindId","elCnt","removeViewBinding","nextSibling","addBindingMarkers","end","bindingKey","viewStore","linkedElem","exprFnDeps","cvtBk","_bndId","_hdl","_depends","_apply","bindTo","onAfterBind","jsvAttrStr","radio","RADIOINPUT","_jsvLkEl","tmplLink","$link","tmplOrLinkExpr","activeBody","elementChangeStr","k","vwInfos","placeholderParent","targetEl","topLevelCall","replaceMode","$view","addDataBinding","cleanData","lnk","viewInfos","rOpenViewMarkers","viewLink","outerData","validateOnly","convertMarkers","preceding","selfClose","closeTag","spaceBefore","boundId","spaceAfter","tag1","tag2","closeTag2","spaceAfterClose","selfClose2","endOpenTag","errorMsg","bndId","endOfElCnt","inTag","isVoid","tagStack","validate","voidElems","prevElCnt","elContent","defer","ids","openScript","closeScript","deferStack","unshift","badParent","processViewInfos","deferPath","deferChar","bindChar","onAftCr","deep","addedBindEls","_tkns","len","vwInfo","j","open","onArrayChange","removeSubStr","onAfterCreate","bindEls","getViewInfos","level","tagDepth","dataLink","wrap","linkViewsSel","elems","qsa","querySelectorAll","prevNodes","markerNodeInfo","contains","isLink","rViewMarkers","skip","processInfos","$viewsLinkAttr","rOpenTagMarkers","unmarkPrevOrNextNode","resolve","prevIds","linkInfo","token","nextView","depth","fragment","copiedNode","firstTag","wrapper","thisId","onAfterCreateStr","Deferred","noValidate","markPrevOrNextNode","namespaceURI","noDomLevel0","rConvertMarkers","safeFragment","createDocumentFragment","firstChild","insertBefore","setTimeout","linkMarkup","currentView","boundTagId","tagExpr","rTagIndex","lastIndex","linkExpressions","bindDataLinkTarget","normalizeLinkTag","rTagDatalink","isLk","noArray","getContextCb","str","SCRIPT","isVal","rBinding","getInfos","close","elPath","infos","rMarkerTokens","removeAttribute","marker","twoway","$linkedElem","radioButtons","linkedTag","oldTrig","newTrig","onAfterLink","targetTag","noVal","setSize","height","width","addClass","_jsvTr","bindElChange","asyncElemChangeHandler","$elem","trig","onoff","pathIndex","lastPath","bindtoOb","newCtxs","newTagCtx","_ths","clean","elemArray","linkedElemTag","objId","obsId","cbId","propertyChangeStr","onDispose","_cbBnds","$unlink","each","innerView","getElementsByTagName","rViewPath","inputAttrib","viewOrTagChar","viewOrTag","precedingLength","emptyView","vwItem","rOpenMarkers","tagOrView","isTag","contents","select","filtered","filter","add","withMarkers","prevIsFirstNode","lastSibling","childTags","disposed","update","domChange","hasListener","hasData","_data","events","domChangeNotification","triggerHandler","dataItems","viewsCount","itemsCount","keepNodes","removeView","viewToRemove","observeProps","insert","observeMappedProps","removeProperty","shallowArrayFilter","setGlobals","jsvStoreName","$observe","versionNumber","rAttrEncode","&","<",">","\u0000","'","\"","`","jsr","jsrender","jsrToJq","jsviews","jsv","sub","parse","extend","syntaxErr","_err","Error","observable","renderFile","__express","isFunction","ob","Array","obj","_jq","jq","delimiters","if","done","for","finalElse","include","*",":*","dbg","url","encodeURI","observe","$eventSpecial","event","special","$expando","expando","PARSEINT","rNotWhite","propChng","arrChng","cbBindingsStore","observeStr","observeObjKey","observeCbKey","observeInnerCbKey","$hasData","$data","getCbKey","cb","_cId","ObjectObservable","ArrayObservable","wrapArray","resolvePathObjects","callback","nextObj","out","removeCbBindings","cbBindings","cbBindingsId","onObservableChange","isOb","allowArray","parentObs","observeAll","array","_path","observe_apply","ns","$observeAll","namespace","unobserve","$unobserveAll","objMap","observeArrayItems","arr","unobs","newAllPath","filterAndObserveAll","nestedArray","newObject","newParentObs","_fltr","nextParentObs","updatedTgt","wrappedCb","oldItems","isObject","obId","notRemoving","un","shallowFilter","$unobserve","innerObserve","observeOnOff","pathStr","isArrayBinding","evData","obIdExpando","boundObOrArr","prntObs","allPth","initialNs","el","fullPath","getInnerCb","origRt","contextCb","newObj","bindArray","unbind","relPath","prevObj","prevAllPath","p","dep","innerCb","initNsArr","initNsArrLen","lastArg","_inId","match","origRoot","set","Object","unobserveAll","nonStrict","pair","_setProperty","leaf","getter","removeProp","property","Date","_trigger","_insert","oldLength","numToRemove","_remove","move","oldIndex","newIndex","numToMove","_move","newItems","_refresh","$_data","handleObj","unbound","changing","obsSrc","obs","srcFlt","obsTgt","obt","tgtFlt","_def","bindElsSel","input","valueBinding","isCleanCall","oldCleanData","oldJsvDelimiters","querySelector","ol","ul","table","tbody","thead","tfoot","tr","colgroup","dl","optgroup","svg","svg_ns","br","img","hr","area","col","meta","command","embed","keygen","track","wbr","requiresStr","delimChars","regularExpression","toggle","elemType","label","contextOb","activeElem","_evs","_sel","_hlr","arrayView","targetLength","arrHandler","arrBinding","arrayBindings","_ars","tagCt","tci","prevArg","different","getInnerView","nd","isVl","unlink","oldFn","option","legend","td","support","htmlSerialize","linkAttr","textarea","jsrDbgMode","caption","th"],"mappings":"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","file":"jsviews.min.js","sourcesContent":["/*! jsviews.js v0.9.72 (Beta) single-file version: http://jsviews.com/ */\n/*! includes JsRender, JsObservable and JsViews - see: http://jsviews.com/#download */\n\n/* Interactive data-driven views using JsRender templates */\n\n//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< JsRender >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n/* JsRender:\n * See http://jsviews.com/#jsrender and http://github.com/BorisMoore/jsrender\n * Copyright 2015, Boris Moore\n * Released under the MIT License.\n */\n\n//jshint -W018, -W041\n\n(function(factory) {\n\t// global var is the this object, which is window when running in the usual browser environment\n\tvar global = (0, eval)('this'), // jshint ignore:line\n\t\t$ = global.jQuery;\n\n\tif (typeof define === \"function\" && define.amd) { // AMD script loader, e.g. RequireJS\n\t\tdefine([\"jquery\"], factory); // Require jQuery\n\t} else if (typeof exports === \"object\") { // CommonJS e.g. Browserify\n\t\tmodule.exports = $\n\t\t\t? factory($)\n\t\t\t: function($) { // If no global jQuery, take jQuery passed as parameter: require(\"jsviews\")(jQuery)\n\t\t\t\treturn factory($);\n\t\t\t};\n\t} else { // Browser using plain ',\n\topenScript = ' - data-linked tag, close marker\n\t\t\t// We validate with inTag so no script markers are inserted in attribute context e.g. for:\n\t\t\t// \"\" or \"
...{{/if}}...\"\n\t\t\tpreceding = id\n\t\t\t\t? (preceding + endOfElCnt + spaceBefore + (inTag ? \"\" : openScript + id + closeScript)+ spaceAfter + tag)\n\t\t\t\t: endOfElCnt || all;\n\t\t}\n\n\t\tif (validate && boundId) {\n\t\t\tif (inTag) {\n\t\t\t\t// JsViews data-linking tags are not allowed within element markup.\n\t\t\t\t// See jsviews/issues/303\n\t\t\t\tsyntaxError('{^{ within elem markup (' + inTag + ' ). Use data-link=\"...\"');\n\t\t\t}\n\t\t\tif (id.charAt(0) === \"#\") {\n\t\t\t\ttagStack.unshift(id.slice(1));\n\t\t\t} else if (id.slice(1) !== (bndId = tagStack.shift())) {\n\t\t\t\t// See jsviews/issues/213\n\t\t\t\tsyntaxError('Closing tag for {^{...}} under different elem: <' + bndId + '>');\n\t\t\t}\n\t\t}\n\t\tif (tag) {\n\t\t\tinTag = tag;\n\t\t\t// If there are ids (markers since the last tag), move them to the defer string\n\t\t\ttagStack.unshift(parentTag);\n\t\t\tparentTag = tag.slice(1);\n\t\t\tif (validate && tagStack[0] && tagStack[0] === badParent[parentTag]) {\n\t\t\t\t// Missing \n\t\t\t\t// TODO: replace this by smart insertion of tags\n\t\t\t\terror('Parent of must be ');\n\t\t\t}\n\t\t\tisVoid = voidElems[parentTag];\n\t\t\tif ((elCnt = elContent[parentTag]) && !prevElCnt) {\n\t\t\t\tdeferStack.unshift(defer);\n\t\t\t\tdefer = \"\";\n\t\t\t}\n\t\t\tprevElCnt = elCnt;\n//TODO Consider providing validation which throws if you place as child of , etc. - since if not caught,\n//this can cause errors subsequently which are difficult to debug.\n//\t\t\t\tif (elContent[tagStack[0]]>2 && !elCnt) {\n//\t\t\t\t\terror(parentTag + \" in \" + tagStack[0]);\n//\t\t\t\t}\n\t\t\tif (defer && elCnt) {\n\t\t\t\tdefer += \"+\"; // Will be used for stepping back through deferred tokens\n\t\t\t}\n\t\t}\n\t\treturn preceding;\n\t}\n\n\tfunction processViewInfos(vwInfos, targetParent) {\n\t\t// If targetParent, we are processing viewInfos (which may include navigation through '+-' paths) and hooking up to the right parentElem etc.\n\t\t// (and elem may also be defined - the next node)\n\t\t// If no targetParent, then we are processing viewInfos on newly inserted content\n\t\tvar deferPath, deferChar, bindChar, parentElem, id, onAftCr, deep,\n\t\t\taddedBindEls = [];\n\n\t\t// In elCnt context (element-only content model), prevNode is the first node after the open, nextNode is the first node after the close.\n\t\t// If both are null/undefined, then open and close are at end of parent content, so the view is empty, and its placeholder is the\n\t\t// 'lastChild' of the parentNode. If there is a prevNode, then it is either the first node in the view, or the view is empty and\n\t\t// its placeholder is the 'previousSibling' of the prevNode, which is also the nextNode.\n\t\tif (vwInfos) {\n\t\t\tif (vwInfos._tkns.charAt(0) === \"@\") {\n\t\t\t\t// We are processing newly inserted content. This is a special script element that was created in convertMarkers() to process deferred bindings,\n\t\t\t\t// and inserted following the target parent element - because no element tags (outside elCnt) were encountered to carry those binding tokens.\n\t\t\t\t// We will step back from the preceding sibling of this element, looking at targetParent elements until we find the one that the current binding\n\t\t\t\t// token belongs to. Set elem to null (the special script element), and remove it from the DOM.\n\t\t\t\ttargetParent = elem.previousSibling;\n\t\t\t\telem.parentNode.removeChild(elem);\n\t\t\t\telem = undefined;\n\t\t\t}\n\t\t\tlen = vwInfos.length;\n\t\t\twhile (len--) {\n\t\t\t\tvwInfo = vwInfos[len];\n//if (prevIds.indexOf(vwInfo.token) < 0) { // This token is a newly created view or tag binding\n\t\t\t\tbindChar = vwInfo.ch;\n\t\t\t\tif (deferPath = vwInfo.path) {\n\t\t\t\t\t// We have a 'deferred path'\n\t\t\t\t\tj = deferPath.length - 1;\n\t\t\t\t\twhile (deferChar = deferPath.charAt(j--)) {\n\t\t\t\t\t\t// Use the \"+\" and\"-\" characters to navigate the path back to the original parent node where the deferred bindings ocurred\n\t\t\t\t\t\tif (deferChar === \"+\") {\n\t\t\t\t\t\t\tif (deferPath.charAt(j) === \"-\") {\n\t\t\t\t\t\t\t\tj--;\n\t\t\t\t\t\t\t\ttargetParent = targetParent.previousSibling;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttargetParent = targetParent.parentNode;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttargetParent = targetParent.lastChild;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Note: Can use previousSibling and lastChild, not previousElementSibling and lastElementChild,\n\t\t\t\t\t\t// since we have removed white space within elCnt. Hence support IE < 9\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (bindChar === \"^\") {\n\t\t\t\t\tif (tag = bindingStore[id = vwInfo.id]) {\n\t\t\t\t\t\t// The binding may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\t\t// This is a tag binding\n\t\t\t\t\t\tdeep = targetParent && (!elem || elem.parentNode !== targetParent); // We are stepping back looking for the right targetParent,\n\t\t\t\t\t\t// or we are linking existing content and this element is in elCnt, not an immediate child of the targetParent.\n\t\t\t\t\t\tif (!elem || deep) {\n\t\t\t\t\t\t\ttag.parentElem = targetParent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (vwInfo.elCnt && deep) {\n\t\t\t\t\t\t\t// With element only content, if there is no following element, or if the binding is deeper than the following element\n\t\t\t\t\t\t\t// then we need to set the open or close token as a deferred binding annotation on the parent\n\t\t\t\t\t\t\tsetDefer(targetParent, (vwInfo.open ? \"#\" : \"/\") + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// This is an open or close marker for a data-linked tag {^{...}}. Add it to bindEls.\n\t\t\t\t\t\taddedBindEls.push([deep ? null : elem, vwInfo]);\n\t\t\t\t\t}\n\t\t\t\t} else if (view = viewStore[id = vwInfo.id]) {\n\t\t\t\t\t// The view may have been deleted, for example in a different handler to an array collectionChange event\n\t\t\t\t\tif (!view.parentElem) {\n\t\t\t\t\t\t// If view is not already extended for JsViews, extend and initialize the view object created in JsRender, as a JsViews view\n\t\t\t\t\t\tview.parentElem = targetParent || elem && elem.parentNode || parentNode;\n\t\t\t\t\t\tview._.onRender = addBindingMarkers;\n\t\t\t\t\t\tview._.onArrayChange = arrayChangeHandler;\n\t\t\t\t\t\tsetArrayChangeLink(view);\n\t\t\t\t\t}\n\t\t\t\t\tparentElem = view.parentElem;\n\t\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t\t// This is an 'open view' node (preceding script marker node,\n\t\t\t\t\t\t// or if elCnt, the first element in the view, with a data-jsv annotation) for binding\n\t\t\t\t\t\tview._elCnt = vwInfo.elCnt;\n\t\t\t\t\t\tif (targetParent && !elem) {\n\t\t\t\t\t\t\tsetDefer(targetParent, \"#\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// No targetParent, so there is a ._nxt elem (and this is processing tokens on the elem)\n\t\t\t\t\t\t\tif (!view._prv) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This is a 'close view' marker node for binding\n\t\t\t\t\t\tif (targetParent && (!elem || elem.parentNode !== targetParent)) {\n\t\t\t\t\t\t\t// There is no ._nxt so add token to _df. It is deferred.\n\t\t\t\t\t\t\tsetDefer(targetParent, \"/\" + id + bindChar + (targetParent._df || \"\"));\n\t\t\t\t\t\t\tview._nxt = undefined;\n\t\t\t\t\t\t} else if (elem) {\n\t\t\t\t\t\t\t// This view did not have a ._nxt, but has one now, so token may be in _df, and must be removed. (No longer deferred)\n\t\t\t\t\t\t\tif (!view._nxt) {\n\t\t\t\t\t\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + bindChar));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview._nxt = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlinkCtx = view.linkCtx;\n\t\t\t\t\t\tif (onAftCr = view.ctx && view.ctx.onAfterCreate || onAfterCreate) {\n\t\t\t\t\t\t\tonAftCr.call(linkCtx, view);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n//}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlen = addedBindEls.length;\n\t\t\twhile (len--) {\n\t\t\t\t// These were added in reverse order to addedBindEls. We push them in BindEls in the correct order.\n\t\t\t\tbindEls.push(addedBindEls[len]);\n\t\t\t}\n\t\t}\n\t\treturn !vwInfos || vwInfos.elCnt;\n\t}\n\n\tfunction getViewInfos(vwInfos) {\n\t\t// Used by view.childTags() and tag.childTags()\n\t\t// Similar to processViewInfos in how it steps through bindings to find tags. Only finds data-linked tags.\n\t\tvar level, parentTag, named;\n\n\t\tif (vwInfos) {\n\t\t\tlen = vwInfos.length;\n\t\t\tfor (j = 0; j < len; j++) {\n\t\t\t\tvwInfo = vwInfos[j];\n\t\t\t\t// This is an open marker for a data-linked tag {^{...}}, within the content of the tag whose id is get.id. Add it to bindEls.\n\t\t\t\t// Note - if bindingStore[vwInfo.id]._is === \"tag\" then getViewInfos is being called too soon - during first linking pass\n\t\t\t\tparentTag = tag = bindingStore[vwInfo.id].linkCtx.tag;\n\t\t\t\tnamed = tag.tagName === tagName;\n\t\t\t\tif (!tag.flow || named) {\n\t\t\t\t\tif (!deep) {\n\t\t\t\t\t\tlevel = 1;\n\t\t\t\t\t\twhile (parentTag = parentTag.parent) {\n\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttagDepth = tagDepth || level; // The level of the first tag encountered.\n\t\t\t\t\t}\n\t\t\t\t\tif ((deep || level === tagDepth) && (!tagName || named)) {\n\t\t\t\t\t\t// Filter on top-level or tagName as appropriate\n\t\t\t\t\t\ttags.push(tag);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction dataLink() {\n\t\t//================ Data-link and fixup of data-jsv annotations ================\n\t\tvar j, index,\n\t\t\ttokens = \"\",\n\t\t\twrap = {},\n\t\t\tselector = linkViewsSel + (get ? \",[\" + deferAttr + \"]\" : \"\");\n\t\t\t// If a childTags() call, get = \",[\" + deferAttr + \"]\" - since we need to include elements that have a ._df expando for deferred tokens\n\n\t\telems = qsa ? parentNode.querySelectorAll(selector) : $(selector, parentNode).get();\n\t\tl = elems.length;\n\n\t\t// The prevNode will be in the returned query, since we called markPrevOrNextNode() on it.\n\t\t// But it may have contained nodes that satisfy the selector also.\n\t\tif (prevNode && prevNode.innerHTML) {\n\t\t\t// Find the last contained node of prevNode, to use as the prevNode - so we only link subsequent elems in the query\n\t\t\tprevNodes = qsa ? prevNode.querySelectorAll(selector) : $(selector, prevNode).get();\n\t\t\tprevNode = prevNodes.length ? prevNodes[prevNodes.length - 1] : prevNode;\n\t\t}\n\n\t\ttagDepth = 0;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = elems[i];\n\t\t\tif (prevNode && !found) {\n\t\t\t\t// If prevNode is set, not false, skip linking. If this element is the prevNode, set to false so subsequent elements will link.\n\t\t\t\tfound = (elem === prevNode);\n\t\t\t} else if (nextNode && elem === nextNode) {\n\t\t\t\t// If nextNode is set then break when we get to nextNode\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else if (elem.parentNode) {\n\t\t\t\t// elem has not been removed from DOM\n\t\t\t\tif (get) {\n\t\t\t\t\ttokens += markerNodeInfo(elem);\n\t\t\t\t\tif (elem._df) {\n\t\t\t\t\t\tj = i + 1;\n\t\t\t\t\t\twhile (j < l && elem.contains(elems[j])) {\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Add defered tokens after any tokens on descendant elements of this one\n\t\t\t\t\t\twrap[j-1] = elem._df;\n\t\t\t\t\t}\n\t\t\t\t\tif (wrap[i]) {\n\t\t\t\t\t\ttokens += wrap[i] || \"\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (isLink && (vwInfo = viewInfos(elem, undefined, rViewMarkers)) && (vwInfo = vwInfo[0])) {\n\t\t\t\t\t\t// If this is a link(trueOrString ...) call we will avoid re-binding to elems that are within template-rendered views\n\t\t\t\t\t\tskip = skip ? (vwInfo.id !== skip && skip) : vwInfo.open && vwInfo.id;\n\t\t\t\t\t}\n\t\t\t\t\tif (!skip && processInfos(viewInfos(elem))\n\t\t\t\t\t\t// If a link() call, processViewInfos() adds bindings to bindEls, and returns true for non-script nodes, for adding data-link bindings\n\t\t\t\t\t\t// If a childTags() call, getViewInfos returns array of tag bindings.\n\t\t\t\t\t\t\t&& elem.getAttribute($viewsLinkAttr)) {\n\t\t\t\t\t\tbindEls.push([elem]); // A data-linked element so add to bindEls too\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (get) {\n\t\t\ttokens += parentNode._df || \"\";\n\t\t\tif (index = tokens.indexOf(\"#\" + get.id) + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so start after the open token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(index + get.id.length);\n\t\t\t}\n\t\t\tindex = tokens.indexOf(\"/\" + get.id);\n\t\t\tif (index + 1) {\n\t\t\t\t// We are looking for view.childTags() or tag.childTags() - so don't look beyond the close token of the parent view or tag.\n\t\t\t\ttokens = tokens.slice(0, index);\n\t\t\t}\n\t\t\t// Call getViewInfos to add the found childTags to the tags array\n\t\t\tgetViewInfos(viewInfos(tokens, undefined, rOpenTagMarkers));\n\t\t}\n\n\t\tif (html === undefined && parentNode.getAttribute($viewsLinkAttr)) {\n\t\t\tbindEls.push([parentNode]); // Support data-linking top-level element directly (not within a data-linked container)\n\t\t}\n\n\t\t// Remove temporary marker script nodes they were added by markPrevOrNextNode\n\t\tunmarkPrevOrNextNode(prevNode, elCnt);\n\t\tunmarkPrevOrNextNode(nextNode, elCnt);\n\n\t\tif (get) {\n\t\t\tif (lazyLink) {\n\t\t\t\tlazyLink.resolve();\n\t\t\t}\n\t\t\treturn; // We have added childTags to the tags array, so we are done\n\t\t}\n\n\t\tif (elCnt && defer + ids) {\n\t\t\t// There are some views with elCnt, for which the open or close did not precede any HTML tag - so they have not been processed yet\n\t\t\telem = nextNode;\n\t\t\tif (defer) {\n\t\t\t\tif (nextNode) {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer + \"+\", true), nextNode);\n\t\t\t\t} else {\n\t\t\t\t\tprocessViewInfos(viewInfos(defer, true), parentNode);\n\t\t\t\t}\n\t\t\t}\n\t\t\tprocessViewInfos(viewInfos(ids, true), parentNode);\n\t\t\t// If there were any tokens on nextNode which have now been associated with inserted HTML tags, remove them from nextNode\n\t\t\tif (nextNode) {\n\t\t\t\ttokens = nextNode.getAttribute(jsvAttrStr);\n\t\t\t\tif (l = tokens.indexOf(prevIds) + 1) {\n\t\t\t\t\ttokens = tokens.slice(l + prevIds.length - 1);\n\t\t\t\t}\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, ids + tokens);\n\t\t\t}\n\t\t}\n\n\t\t//================ Bind the data-linked elements and tags ================\n\t\tl = bindEls.length;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\telem = bindEls[i];\n\t\t\tlinkInfo = elem[1];\n\t\t\telem = elem[0];\n\t\t\tif (linkInfo) {\n\t\t\t\tif (tag = bindingStore[linkInfo.id]) {\n\t\t\t\t\tif (linkCtx = tag.linkCtx) {\n\t\t\t\t\t\t// The tag may have been stored temporarily on the bindingStore - or may have already been replaced by the actual binding\n\t\t\t\t\t\ttag = linkCtx.tag;\n\t\t\t\t\t\ttag.linkCtx = linkCtx;\n\t\t\t\t\t}\n\t\t\t\t\tif (linkInfo.open) {\n\t\t\t\t\t\t// This is an 'open linked tag' binding annotation for a data-linked tag {^{...}}\n\t\t\t\t\t\tif (elem) {\n\t\t\t\t\t\t\ttag.parentElem = elem.parentNode;\n\t\t\t\t\t\t\ttag._prv = elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttag._elCnt = linkInfo.elCnt;\n\t\t\t\t\t\tif (tag.onBeforeLink) {\n\t\t\t\t\t\t\ttag.onBeforeLink();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// We data-link depth-first (\"on the way in\"), which is better for perf - and allows setting parent tags etc.\n\t\t\t\t\t\tview = tag.tagCtx.view;\n\t\t\t\t\t\taddDataBinding(undefined, tag._prv, view, linkInfo.id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttag._nxt = elem;\n\t\t\t\t\t\tif (tag._.unlinked) {\n\t\t\t\t\t\t\t// This is a 'close linked tag' binding annotation\n\t\t\t\t\t\t\t// Add data binding\n\t\t\t\t\t\t\ttagCtx = tag.tagCtx;\n\t\t\t\t\t\t\tview = tagCtx.view;\n\t\t\t\t\t\t\tcallAfterLink(tag);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Add data binding for a data-linked element (with data-link attribute)\n\t\t\t\taddDataBinding(elem.getAttribute($viewsLinkAttr), elem, $view(elem), undefined, isLink, outerData, context);\n\t\t\t}\n\t\t}\n\t\tif (lazyLink) {\n\t\t\tlazyLink.resolve();\n\t\t}\n\t}\n\t//==== /end of nested functions ====\n\n\tvar inTag, linkCtx, tag, i, l, j, len, elems, elem, view, vwInfo, linkInfo, prevNodes, token, prevView, nextView,\n\t\tnode, tags, deep, tagName, tagCtx, validate, tagDepth, depth, fragment, copiedNode, firstTag, parentTag,\n\t\tisVoid, wrapper, div, tokens, elCnt, prevElCnt, htmlTag, ids, prevIds, found, skip, lazyLink, isLink, get,\n\t\tself = this,\n\t\tthisId = self._.id + \"_\",\n\t\tdefer = \"\",\n\t\t// The marker ids for which no tag was encountered (empty views or final closing markers) which we carry over to container tag\n\t\tbindEls = [],\n\t\ttagStack = [],\n\t\tdeferStack = [],\n\t\tonAfterCreate = self.hlp(onAfterCreateStr),\n\t\tprocessInfos = processViewInfos;\n\n\tif (refresh) {\n\t\tlazyLink = refresh.lazyLink && $.Deferred();\n\t\tif (refresh.tmpl) {\n\t\t\t// refresh is the prevView, passed in from addViews()\n\t\t\tprevView = \"/\" + refresh._.id + \"_\";\n\t\t} else {\n\t\t\tisLink = refresh.lnk; // Top-level linking\n\t\t\tif (refresh.tag) {\n\t\t\t\tthisId = refresh.tag + \"^\";\n\t\t\t\trefresh = true;\n\t\t\t}\n\t\t\tif (get = refresh.get) {\n\t\t\t\tprocessInfos = getViewInfos;\n\t\t\t\ttags = get.tags;\n\t\t\t\tdeep = get.deep;\n\t\t\t\ttagName = get.name;\n\t\t\t}\n\t\t}\n\t\trefresh = refresh === true;\n\t}\n\n\tparentNode = parentNode\n\t\t? (\"\" + parentNode === parentNode\n\t\t\t? $(parentNode)[0] // It is a string, so treat as selector\n\t\t\t: parentNode.jquery\n\t\t\t\t? parentNode[0] // A jQuery object - take first element.\n\t\t\t\t: parentNode)\n\t\t: (self.parentElem // view.link()\n\t\t\t|| document.body); // link(null, data) to link the whole document\n\n\tvalidate = !$viewsSettings.noValidate && parentNode.contentEditable !== TRUE;\n\tparentTag = parentNode.tagName.toLowerCase();\n\telCnt = !!elContent[parentTag];\n\n\tprevNode = prevNode && markPrevOrNextNode(prevNode, elCnt);\n\tnextNode = nextNode && markPrevOrNextNode(nextNode, elCnt) || null;\n\n\tif (html != undefined) {\n\t\t//================ Insert html into DOM using documentFragments (and wrapping HTML appropriately). ================\n\t\t// Also convert markers to DOM annotations, based on content model.\n\t\t// Corresponds to nextNode ? $(nextNode).before(html) : $(parentNode).html(html);\n\t\t// but allows insertion to wrap correctly even with inserted script nodes. jQuery version will fail e.g. under tbody or select.\n\t\t// This version should also be slightly faster\n\t\tdiv = document.createElement(\"div\");\n\t\twrapper = div;\n\t\tprevIds = ids = \"\";\n\t\thtmlTag = parentNode.namespaceURI === \"http://www.w3.org/2000/svg\" ? \"svg_ns\" : (firstTag = rFirstElem.exec(html)) && firstTag[1] || \"\";\n\t\tif (noDomLevel0 && firstTag && firstTag[2]) {\n\t\t\terror(\"Unsupported: \" + firstTag[2]); // For security reasons, don't allow insertion of elements with onFoo attributes.\n\t\t}\n\t\tif (elCnt) {\n\t\t\t// Now look for following view, and find its tokens, or if not found, get the parentNode._df tokens\n\t\t\tnode = nextNode;\n\t\t\twhile (node && !(nextView = viewInfos(node))) {\n\t\t\t\tnode = node.nextSibling;\n\t\t\t}\n\t\t\tif (tokens = nextView ? nextView._tkns : parentNode._df) {\n\t\t\t\ttoken = prevView || \"\";\n\t\t\t\tif (refresh || !prevView) {\n\t\t\t\t\ttoken += \"#\" + thisId;\n\t\t\t\t}\n\t\t\t\tj = tokens.indexOf(token);\n\t\t\t\tif (j + 1) {\n\t\t\t\t\tj += token.length;\n\t\t\t\t\t// Transfer the initial tokens to inserted nodes, by setting them as the ids variable, picked up in convertMarkers\n\t\t\t\t\tprevIds = ids = tokens.slice(0, j);\n\t\t\t\t\ttokens = tokens.slice(j);\n\t\t\t\t\tif (nextView) {\n\t\t\t\t\t\tnode.setAttribute(jsvAttrStr, tokens);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetDefer(parentNode, tokens);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//================ Convert the markers to DOM annotations, based on content model. ================\n//\t\t\toldElCnt = elCnt;\n\t\tisVoid = undefined;\n\t\thtml = (\"\" + html).replace(rConvertMarkers, convertMarkers);\n//\t\t\tif (!!oldElCnt !== !!elCnt) {\n//\t\t\t\terror(\"Parse: \" + html); // Parse error. Content not well-formed?\n//\t\t\t}\n\t\tif (validate && tagStack.length) {\n\t\t\tsyntaxError(\"Mismatched '<\" + parentTag + \"...>' in:\\n\" + html); // Unmatched tag\n\t\t}\n\t\tif (validateOnly) {\n\t\t\treturn;\n\t\t}\n\t\t// Append wrapper element to doc fragment\n\t\tsafeFragment.appendChild(div);\n\n\t\t// Go to html and back, then peel off extra wrappers\n\t\t// Corresponds to jQuery $(nextNode).before(html) or $(parentNode).html(html);\n\t\t// but supports svg elements, and other features missing from jQuery version (and this version should also be slightly faster)\n\t\thtmlTag = wrapMap[htmlTag] || wrapMap.div;\n\t\tdepth = htmlTag[0];\n\t\twrapper.innerHTML = htmlTag[1] + html + htmlTag[2];\n\t\twhile (depth--) {\n\t\t\twrapper = wrapper.lastChild;\n\t\t}\n\t\tsafeFragment.removeChild(div);\n\t\tfragment = document.createDocumentFragment();\n\t\twhile (copiedNode = wrapper.firstChild) {\n\t\t\tfragment.appendChild(copiedNode);\n\t\t}\n\t\t// Insert into the DOM\n\t\tparentNode.insertBefore(fragment, nextNode);\n\t}\n\n\tif (lazyLink) {\n\t\tsetTimeout(dataLink, 0);\n\t} else {\n\t\tdataLink();\n\t}\n\n\treturn lazyLink && lazyLink.promise();\n}\n\nfunction addDataBinding(linkMarkup, node, currentView, boundTagId, isLink, data, context) {\n\t// Add data binding for data-linked elements or {^{...}} data-linked tags\n\tvar tmpl, tokens, attr, convertBack, params, trimLen, tagExpr, linkFn, linkCtx, tag, rTagIndex, hasElse, lastIndex,\n\t\tlinkExpressions = [];\n\n\tif (boundTagId) {\n\t\t// boundTagId is a string for {^{...}} data-linked tag. So only one linkTag in linkMarkup\n\t\t// data and context parameters are undefined\n\t\ttag = bindingStore[boundTagId];\n\t\ttag = tag.linkCtx ? tag.linkCtx.tag : tag;\n\n\t\tlinkCtx = tag.linkCtx || {\n\t\t\tdata: currentView.data, // source\n\t\t\telem: tag._elCnt ? tag.parentElem : node, // target\n\t\t\tview: currentView,\n\t\t\tctx: currentView.ctx,\n\t\t\tattr: HTML, // Script marker nodes are associated with {^{ and always target HTML.\n\t\t\tfn: tag._.bnd,\n\t\t\ttag: tag,\n\t\t\t// Pass the boundTagId in the linkCtx, so that it can be picked up in observeAndBind\n\t\t\t_bndId: boundTagId\n\t\t};\n\t\tbindDataLinkTarget(linkCtx, linkCtx.fn);\n\t} else if (linkMarkup && node) {\n\t\t// If isLink then this is a top-level linking: .link(expression, target, data, ....) or\n\t\t// .link(true, target, data, ....) scenario - and data and context are passed in separately from the view\n\t\tdata = isLink ? data : currentView.data;\n\n\t\t// Compiled linkFn expressions could be stored in the tmpl.links array of the template\n\t\t// TODO - consider also caching globally so that if {{:foo}} or data-link=\"foo\" occurs in different places,\n\t\t// the compiled template for this is cached and only compiled once...\n\t\t//links = currentView.links || currentView.tmpl.links;\n\n\t\ttmpl = currentView.tmpl;\n\n//\t\t\tif (!(linkTags = links[linkMarkup])) {\n\t\t// This is the first time this view template has been linked, so we compile the data-link expressions, and store them on the template.\n\n\t\tlinkMarkup = normalizeLinkTag(linkMarkup, defaultAttr(node));\n\t\tlastIndex = rTagDatalink.lastIndex = 0;\n\t\twhile (tokens = rTagDatalink.exec(linkMarkup)) { // TODO require } to be followed by whitespace or $, and remove the \\}(!\\}) option.\n\t\t\tlinkExpressions.push(tokens);\n\t\t\tlastIndex = rTagDatalink.lastIndex;\n\t\t}\n\t\tif (lastIndex < linkMarkup.length) {\n\t\t\tsyntaxError(linkMarkup);\n\t\t}\n\t\twhile (tokens = linkExpressions.shift()) {\n\t\t\t// Iterate over the data-link expressions, for different target attrs,\n\t\t\t// e.g. ~description(firstName, lastName)}\"\n\t\t\t// tokens: [all, attr, bindOnly, tagExpr, tagName, converter, colon, html, comment, code, params]\n\t\t\trTagIndex = rTagDatalink.lastIndex;\n\t\t\tattr = tokens[1];\n\t\t\ttagExpr = tokens[3];\n\t\t\twhile (linkExpressions[0] && linkExpressions[0][4] === \"else\") { // If this is {someTag...} and is followed by an {else...} add to tagExpr\n\t\t\t\ttagExpr += \"}{\" + linkExpressions.shift()[3];\n\t\t\t\thasElse = true;\n\t\t\t}\n\t\t\tif (hasElse) { // If an {else} has been added, need also to add closing {{/someTag}}\n\t\t\t\ttagExpr += \"}{{/\" + tokens[4] + \"}\";\n\t\t\t}\n\t\t\tparams = tokens[9];\n\n\t\t\tlinkCtx = {\n\t\t\t\tdata: data, // source\n\t\t\t\telem: node, // target\n\t\t\t\tview: currentView,\n\t\t\t\tctx: context,\n\t\t\t\tattr: attr,\n\t\t\t\tisLk: isLink, // top-level linking?\n\t\t\t\t_toLk : 1, // Flag to data-link on initial data-link call rendering call\n\t\t\t\t_noUpd : tokens[2] // Flag for data-link=\"^{...}\" so on initial data-link call will bind, but not render)\n\t\t\t};\n\n\t\t\tif (tokens[6]) {\n\t\t\t\tconvertBack = tokens[10];\n\t\t\t\tlinkCtx.convert = tokens[5] || \"\";\n\t\t\t\tif (!attr && convertBack !== undefined && defaultAttr(node)) {\n\t\t\t\t\t// Default target, so allow 2 way binding\n\t\t\t\t\tlinkCtx.convertBack = convertBack = convertBack.slice(1);\n\t\t\t\t} else {\n\t\t\t\t\tconvertBack = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Compile the linkFn expression which evaluates and binds a data-link expression\n\t\t\t// TODO - optimize for the case of simple data path with no conversion, helpers, etc.:\n\t\t\t// i.e. data-link=\"a.b.c\". Avoid creating new instances of Function every time. Can use a default function for all of these...\n\n\t\t\tlinkCtx.expr = attr + tagExpr;\n\t\t\tlinkFn = tmpl.links[tagExpr];\n\t\t\tif (!linkFn) {\n\t\t\t\ttmpl.links[tagExpr] = linkFn = $sub.tmplFn(tagExpr, tmpl, true, convertBack, hasElse);\n\t\t\t}\n\t\t\tlinkCtx.fn = linkFn;\n\t\t\tbindDataLinkTarget(linkCtx, linkFn);\n\t\t\t// We store rTagIndex in local scope, since this addDataBinding method can sometimes be called recursively,\n\t\t\t// and each is using the same rTagDatalink instance.\n\t\t\trTagDatalink.lastIndex = rTagIndex;\n\t\t}\n//\t\t}\n\t}\n}\n\nfunction bindDataLinkTarget(linkCtx, linkFn) {\n\t// Add data link bindings for a link expression in data-link attribute markup\n\tfunction handler(ev, eventArgs) {\n\t\tpropertyChangeHandler.call(linkCtx, ev, eventArgs, linkFn);\n\t\t// If the link expression uses a custom tag, the propertyChangeHandler call will call renderTag, which will set tagCtx on linkCtx\n\t}\n\thandler.noArray = true;\n\tif (linkCtx.isLk) {\n\t\t// Top-level linking: .link(expressionOrTrue, data, context) - so we need to create a view for the linking, with the data and ctx\n\t\t// which may be different than the current context of the target. Note that this view is not a standard data-linked view, so it will\n\t\t// be disposed only when its parent view is disposed.\n\t\taddLinkMethods(linkCtx.view = new $sub.View(\n\t\t\t$sub.extendCtx(linkCtx.ctx, linkCtx.view.ctx),\n\t\t\t\"link\", linkCtx.view, linkCtx.data, linkCtx.expr, undefined, addBindingMarkers));\n\t}\n\tlinkCtx._ctxCb = getContextCb(linkCtx.view); // _ctxCb is for filtering/appending to dependency paths: function(path, object) { return [(object|path)*]}\n\tlinkCtx._hdl = handler;\n\thandler(true);\n}\n\n//=====================\n// Data-linking helpers\n//=====================\n\nfunction removeSubStr(str, substr) {\n\tvar k;\n\treturn str\n\t\t? (k = str.indexOf(substr),\n\t\t\t(k + 1\n\t\t\t\t? str.slice(0, k) + str.slice(k + substr.length)\n\t\t\t\t: str))\n\t\t: \"\";\n}\n\nfunction markerNodeInfo(node) {\n\treturn node &&\n\t\t(\"\" + node === node\n\t\t\t? node\n\t\t\t: node.tagName === SCRIPT\n\t\t\t\t? node.type.slice(3)\n\t\t\t\t: node.nodeType === 1 && node.getAttribute(jsvAttrStr) || \"\");\n}\n\nfunction viewInfos(node, isVal, rBinding) {\n\t// Test whether node is a script marker node, and if so, return metadata\n\tfunction getInfos(all, open, close, id, ch, elPath) {\n\t\tinfos.push({\n\t\t\telCnt: elCnt,\n\t\t\tid: id,\n\t\t\tch: ch,\n\t\t\topen: open,\n\t\t\tclose: close,\n\t\t\tpath: elPath,\n\t\t\ttoken: all\n\t\t});\n\t}\n\tvar elCnt, tokens,\n\t\tinfos = [];\n\tif (tokens = isVal ? node : markerNodeInfo(node)) {\n\t\telCnt = infos.elCnt = node.tagName !== SCRIPT;\n\t\telCnt = tokens.charAt(0) === \"@\" || elCnt;\n\t\tinfos._tkns = tokens;\n\t\t// rMarkerTokens = /(?:(#)|(\\/))(\\d+)([_^])([-+@\\d]+)?/g;\n\t\ttokens.replace(rBinding || rMarkerTokens, getInfos);\n\t\treturn infos;\n\t}\n}\n\nfunction unmarkPrevOrNextNode(node, elCnt) {\n\tif (node) {\n\t\tif (node.type === \"jsv\") {\n\t\t\tnode.parentNode.removeChild(node);\n\t\t} else if (elCnt && node.getAttribute($viewsLinkAttr) === \"\") {\n\t\t\tnode.removeAttribute($viewsLinkAttr);\n\t\t}\n\t}\n}\n\nfunction markPrevOrNextNode(node, elCnt) {\n\tvar marker = node;\n\twhile (elCnt && marker && marker.nodeType !== 1) {\n\t\tmarker = marker.previousSibling;\n\t}\n\tif (marker) {\n\t\tif (marker.nodeType !== 1) {\n\t\t\t// For text nodes, we will add a script node before\n\t\t\tmarker = document.createElement(SCRIPT);\n\t\t\tmarker.type = \"jsv\";\n\t\t\tnode.parentNode.insertBefore(marker, node);\n\t\t} else if (!markerNodeInfo(marker) && !marker.getAttribute($viewsLinkAttr)) {\n\t\t\t// For element nodes, we will add a data-link attribute (unless there is already one)\n\t\t\t// so that this node gets included in the node linking process.\n\t\t\tmarker.setAttribute($viewsLinkAttr, \"\");\n\t\t}\n\t}\n\treturn marker;\n}\n\nfunction normalizeLinkTag(linkMarkup, twoway) {\n\tlinkMarkup = $.trim(linkMarkup).replace(rEscapeQuotes, \"\\\\$&\");\n\treturn linkMarkup.slice(-1) !== delimCloseChar0\n\t// If simplified syntax is used: data-link=\"expression\", convert to data-link=\"{:expression}\",\n\t// or for inputs, data-link=\"{:expression:}\" for (default) two-way binding\n\t\t? linkMarkup = delimOpenChar1 + \":\" + linkMarkup + (twoway ? \":\" : \"\") + delimCloseChar0\n\t\t: linkMarkup;\n}\n\n//===========================\n// Methods for views and tags\n//===========================\n\nfunction callAfterLink(tag, eventArgs) {\n\tvar $linkedElem, linkedElem, radioButtons, val, l, linkedTag, oldTrig, newTrig,\n\t\ttagCtx = tag.tagCtx,\n\t\tview = tagCtx.view,\n\t\tprops = tagCtx.props,\n\t\tlinkCtx = tag.linkCtx = tag.linkCtx || {\n\t\t\ttag: tag,\n\t\t\tdata: view.data,\n\t\t\tview: view,\n\t\t\tctx: view.ctx\n\t\t};\n\n\tif (tag.onAfterLink) {\n\t\ttag.onAfterLink(tagCtx, linkCtx, eventArgs);\n\t}\n\ttag._.unlinked = undefined;\n\t$linkedElem = tag.targetTag ? tag.targetTag.linkedElem : tag.linkedElem;\n\tif (!tag.noVal && (linkedElem = $linkedElem && $linkedElem[0])) {\n\t\tif (radioButtons = tag._.radio) {\n\t\t\t$linkedElem = $linkedElem.find(RADIOINPUT);\n\t\t}\n\t\tif (radioButtons || !tag._.chging) {\n\t\t\tval = tag.cvtArgs()[0];\n\n\t\t\tif (radioButtons || linkedElem !== linkCtx.elem) {\n\t\t\t\tl = $linkedElem.length;\n\t\t\t\twhile (l--) {\n\t\t\t\t\tlinkedElem = $linkedElem[l];\n\t\t\t\t\tlinkedTag = linkedElem._jsvLkEl;\n\t\t\t\t\tif (tag._.inline && (!linkedTag || linkedTag !== tag && linkedTag.targetTag !== tag)) {\n\t\t\t\t\t\t// For data-linked tags, identify the linkedElem with the tag, for \"to\" binding\n\t\t\t\t\t\t// (For data-linked elements, if not yet bound, we identify later when the linkCtx.elem is bound)\n\t\t\t\t\t\tlinkedElem._jsvLkEl = tag;\n\t\t\t\t\t\tbindTo(bindingStore[tag._tgId], tag.convertBack);\n\t\t\t\t\t\tlinkedElem._jsvBnd = \"&\" + tag._tgId + \"+\"; // Add a \"+\" for cloned binding - so removing\n\t\t\t\t\t\t// elems with cloned bindings will not remove the 'parent' binding from the bindingStore.\n\t\t\t\t\t}\n\t\t\t\t\tif (radioButtons) {\n\t\t\t\t\t\t// For radio button, set to if val === value. For others set val() to val, below\n\t\t\t\t\t\tlinkedElem[CHECKED] = val === linkedElem.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlinkCtx._val = val;\n\t\t\t}\n\t\t\tif (val !== undefined) {\n\t\t\t\tif (!radioButtons && linkedElem.value !== undefined) {\n\t\t\t\t\tif (linkedElem.type === CHECKBOX) {\n\t\t\t\t\t\tlinkedElem[CHECKED] = val && val !== \"false\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$linkedElem.val(val);\n\t\t\t\t\t}\n\t\t\t\t} else if (linkedElem.contentEditable === TRUE) {\n\t\t\t\t\tlinkedElem.innerHTML = val;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (tag.setSize) {\n\t\t\tif (props.height) {\n\t\t\t\t$linkedElem.height(props.height);\n\t\t\t}\n\t\t\tif (props.width) {\n\t\t\t\t$linkedElem.width(props.width);\n\t\t\t}\n\t\t}\n\t\tif (props[\"class\"]) {\n\t\t\t$linkedElem.addClass(props[\"class\"]);\n\t\t}\n\t\tif (props.id) {\n\t\t\t$linkedElem[0].id = props.id;\n\t\t}\n\t\tif (props.name) {\n\t\t\t$linkedElem.attr(\"name\", props.name);\n\t\t}\n\t}\n\tif (linkedElem = linkedElem || tag.tagName === \":\" && linkCtx.elem) {\n\t\toldTrig = linkedElem._jsvTr;\n\t\tnewTrig = props.trigger;\n\t\tif (oldTrig !== newTrig) {\n\t\t\tlinkedElem._jsvTr = newTrig;\n\t\t\t$linkedElem = $linkedElem || $(linkedElem);\n\t\t\tbindElChange($linkedElem, oldTrig, \"off\");\n\t\t\tbindElChange($linkedElem, newTrig, \"on\");\n\t\t}\n\t}\n}\n\nfunction asyncElemChangeHandler(ev) {\n\tsetTimeout(function() {\n\t\telemChangeHandler(ev);\n\t}, 0);\n}\n\nfunction bindElChange($elem, trig, onoff) {\n\tif (trig) {\n\t\ttrig = \"\" + trig === trig ? trig : \"keydown\"; // Set trigger to (true || truey non-string (e.g. 1) || 'keydown'): Get 'keydown' with async\n\t\t$elem[onoff](trig, trig === \"keydown\" ? asyncElemChangeHandler : elemChangeHandler);\n\t}\n}\n\nfunction bindTo(binding, cvtBk) {\n\t// Two-way binding.\n\t// We set the binding.to[1] to be the cvtBack, and binding.to[0] to be either the path to the target, or [object, path] where the target is the path on the provided object.\n\t// So for a computed path with an object call: a.b.getObject().d.e, then we set to[0] to be [exprOb, \"d.e\"], and we bind to the path on the returned object, exprOb.ob, as target\n\t// Otherwise our target is the first path, paths[0], which we will convert with contextCb() for paths like ~a.b.c or #x.y.z\n\n\tvar bindto, pathIndex, path, lastPath, bindtoOb,\n\t\tlinkCtx = binding.linkCtx,\n\t\tsource = linkCtx.data,\n\t\tpaths = linkCtx.fn.paths;\n\tif (binding && paths) {\n\t\tpaths = (bindto = paths._jsvto) || paths[0];\n\t\tpathIndex = paths && paths.length;\n\t\tif (pathIndex && (!linkCtx.tag || linkCtx.tag.tagCtx.args.length)) {\n\t\t\tlastPath = paths[pathIndex - 1];\n\t\t\tif (lastPath._jsv) {\n\t\t\t\tbindtoOb = lastPath;\n\t\t\t\twhile (lastPath.sb && lastPath.sb._jsv) {\n\t\t\t\t\tpath = lastPath = lastPath.sb;\n\t\t\t\t}\n\t\t\t\tpath = lastPath.sb || path && path.path;\n\t\t\t\tlastPath = path ? path.slice(1) : bindtoOb.path;\n\t\t\t}\n\t\t\tbinding.to = path\n\t\t\t\t? [ // \"...someexpr().lastpath...\" - so need to get the bindtoOb 'exprOb' object for this view-binding\n\t\t\t\t\t[\n\t\t\t\t\t\tbindtoOb, // 'exprOb' for this expression and view-binding. So bindtoOb.ob is current object returned by expression.\n\t\t\t\t\t\tlastPath\n\t\t\t\t\t],\n\t\t\t\t\tcvtBk\n\t\t\t\t]\n\t\t\t\t: [\n\t\t\t\t\tlinkCtx._ctxCb(path = lastPath.split(\"^\").join(\".\")) || [source, path],\n\t\t\t\t\tcvtBk\n\t\t\t\t];\n\t\t} else {\n\t\t\tbinding.to = [[], cvtBk];\n\t\t}\n\t}\n}\n\nfunction mergeCtxs(tag, newCtxs, replace) { // Merge updated tagCtxs into tag.tagCtxs\n\tvar tagCtx, newTagCtx,\n\t\tview = tag.tagCtx.view,\n\t\ttagCtxs = tag.tagCtxs || [tag.tagCtx],\n\t\tl = tagCtxs.length,\n\t\trefresh = !newCtxs;\n\n\tnewCtxs = newCtxs || tag._.bnd.call(view.tmpl, (tag.linkCtx || view).data, view, $views);\n\n\tif (replace) {\n\t\t// Replace previous tagCtxs by new ones, rather than merging\n\t\ttagCtxs = tag.tagCtxs = newCtxs;\n\t\ttag.tagCtx = tagCtxs[0];\n\t} else {\n\t\twhile (l--) {\n\t\t\ttagCtx = tagCtxs[l];\n\t\t\tnewTagCtx = newCtxs[l];\n\t\t\t$observable(tagCtx.props).setProperty(newTagCtx.props);\n\t\t\t$extend(tagCtx.ctx, newTagCtx.ctx); // We don't support propagating ctx variables, ~foo, observably, to nested views. So extend, not setProperty...\n\t\t\ttagCtx.args = newTagCtx.args;\n\t\t\tif (refresh) {\n\t\t\t\ttagCtx.tmpl = newTagCtx.tmpl;\n\t\t\t}\n\t\t}\n\t}\n\t$sub._ths(tag, tagCtxs[0]); // tagHandlersFromProps\n\treturn tagCtxs;\n}\n\n//=========\n// Disposal\n//=========\n\nfunction clean(elems) {\n\t// Remove data-link bindings, or contained views\n\tvar l, elem, bindings,\n\t\telemArray = [],\n\t\tlen = elems.length,\n\t\ti = len;\n\twhile (i--) {\n\t\t// Copy into an array, so that deletion of nodes from DOM will not cause our 'i' counter to get shifted\n\t\t// (Note: This seems as fast or faster than elemArray = [].slice.call(elems); ...)\n\t\telemArray.push(elems[i]);\n\t}\n\ti = len;\n\twhile (i--) {\n\t\telem = elemArray[i];\n\t\tif (elem.parentNode) {\n\t\t\t// Has not already been removed from the DOM\n\t\t\tif (bindings = elem._jsvBnd) {\n\t\t\t\t// Get propertyChange bindings for this element\n\t\t\t\t// This may be an element with data-link, or the opening script marker node for a data-linked tag {^{...}}\n\t\t\t\t// bindings is a string with the syntax: \"(&bindingId)*\"\n\t\t\t\tbindings = bindings.slice(1).split(\"&\");\n\t\t\t\telem._jsvBnd = \"\";\n\t\t\t\tl = bindings.length;\n\t\t\t\twhile (l--) {\n\t\t\t\t\t// Remove associated bindings\n\t\t\t\t\tremoveViewBinding(bindings[l], elem._jsvLkEl, elem); // unbind bindings with this bindingId on this view\n\t\t\t\t}\n\t\t\t}\n\t\t\tdisposeTokens(markerNodeInfo(elem) + (elem._df || \"\"));\n\t\t}\n\t}\n}\n\nfunction removeViewBinding(bindId, linkedElemTag, elem) {\n\t// Unbind\n\tvar objId, linkCtx, tag, object, obsId, tagCtxs, l, map, $linkedElem, linkedElem, trigger, view,\n\t\tbinding = bindingStore[bindId];\n\n\tif (linkedElemTag) {\n\t\tif (elem === linkedElemTag.linkedElem[0]) {\n\t\t\telem._jsvLkEl = undefined;\n\t\t\tlinkedElemTag.linkedElem = undefined;\n\t\t}\n\t} else if (binding) {\n\t\tdelete bindingStore[bindId]; // Delete already, so call to onDispose handler below cannot trigger recursive deletion (through recursive call to jQuery cleanData)\n\t\tfor (objId in binding.bnd) {\n\t\t\tobject = binding.bnd[objId];\n\t\t\tobsId = binding.cbId;\n\t\t\tif ($isArray(object)) {\n\t\t\t\t$([object]).off(arrayChangeStr + obsId).off(propertyChangeStr + obsId); // There may be either or both of arrayChange and propertyChange\n\t\t\t} else {\n\t\t\t\t$(object).off(propertyChangeStr + obsId);\n\t\t\t}\n\t\t\tdelete binding.bnd[objId];\n\t\t}\n\n\t\tif (linkCtx = binding.linkCtx) {\n\t\t\tif (tag = linkCtx.tag) {\n\t\t\t\tif (tagCtxs = tag.tagCtxs) {\n\t\t\t\t\tl = tagCtxs.length;\n\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\tif (map = tagCtxs[l].map) {\n\t\t\t\t\t\t\tmap.unmap(); //unobserve\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$linkedElem = tag.linkedElem;\n\t\t\t\tlinkedElem = $linkedElem && $linkedElem[0] || linkCtx.elem;\n\n\t\t\t\tif (trigger = linkedElem && linkedElem._jsvTr) {\n\t\t\t\t\tbindElChange($linkedElem || $(linkedElem), trigger, \"off\");\n\t\t\t\t\tlinkedElem._jsvTr = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (tag.onDispose) {\n\t\t\t\t\ttag.onDispose();\n\t\t\t\t}\n\n\t\t\t\tif (!tag._elCnt) {\n\t\t\t\t\tif (tag._prv) {\n\t\t\t\t\t\ttag._prv.parentNode.removeChild(tag._prv);\n\t\t\t\t\t}\n\t\t\t\t\tif (tag._nxt) {\n\t\t\t\t\t\ttag._nxt.parentNode.removeChild(tag._nxt);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tview = linkCtx.view;\n\t\t\tif (view.type === \"link\") {\n\t\t\t\tview.parent.removeViews(view._.key, undefined, true); // A \"link\" view is associated with the binding, so should be disposed with binding.\n\t\t\t} else {\n\t\t\t\tdelete view._.bnds[bindId];\n\t\t\t}\n\t\t}\n\t\t$sub._cbBnds[binding.cbId] = undefined;\n\t}\n}\n\nfunction $unlink(to) {\n\tif (to) {\n\t\tto = to.jquery ? to : $(to);\n\t\tto.each(function() {\n\t\t\tvar innerView;\n\t\t\t//TODO fix this for better perf. Rather that calling inner view multiple times which does querySelectorAll each time, consider a single querySelectorAll\n\t\t\t// or simply call view.removeViews() on the top-level views under the target 'to' node, then clean(...)\n\t\t\twhile ((innerView = $view(this, true)) && innerView.parent) {\n\t\t\t\tinnerView.parent.removeViews(innerView._.key, undefined, true);\n\t\t\t}\n\t\t\tclean(this.getElementsByTagName(\"*\"));\n\t\t});\n\t\tclean(to);\n\t} else {\n\t\t// Call to $.unlink() is equivalent to $.unlink(true, \"body\")\n\t\tif (activeBody) {\n\t\t\t$(activeBody)\n\t\t\t\t.off(elementChangeStr, elemChangeHandler)\n\t\t\t\t.off('blur', '[contenteditable]', elemChangeHandler);\n\t\t\tactiveBody = undefined;\n\t\t}\n\t\ttopView.removeViews();\n\t\tclean(document.body.getElementsByTagName(\"*\"));\n\t}\n}\n\n//========\n// Helpers\n//========\n\nfunction getContextCb(view) {\n\t// TODO Consider exposing or allowing override, as public API\n\treturn function(path, object) {\n\t\t// TODO consider only calling the contextCb on the initial token in path '~a.b.c' and not calling again on\n\t\t// the individual tokens, 'a', 'b', 'c'... Currently it is called multiple times\n\t\tvar tokens, tag,\n\t\t\titems = [object];\n\t\tif (view && path) {\n\t\t\tif (path._jsv) {\n\t\t\t\treturn path._jsv.call(view.tmpl, object, view, $views);\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"~\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"~a.b.c\" string:\n\t\t\t\t// [helperObject 'a', \"a.b.c\" currentDataItem] so currentDataItem becomes the object for subsequent paths.\n\t\t\t\tif (path.slice(0, 4) === \"~tag\") {\n\t\t\t\t\ttag = view.ctx;\n\t\t\t\t\tif (path.charAt(4) === \".\") {\n\t\t\t\t\t\t// \"~tag.xxx\"\n\t\t\t\t\t\ttokens = path.slice(5).split(\".\");\n\t\t\t\t\t\ttag = tag.tag;\n\t\t\t\t\t}\n\t\t\t\t\tif (tokens) {\n\t\t\t\t\t\treturn tag ? [tag, tokens.join(\".\"), object] : [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpath = path.slice(1).split(\".\");\n\t\t\t\tif (object = view.hlp(path.shift())) {\n\t\t\t\t\tif (path.length) {\n\t\t\t\t\t\titems.unshift(path.join(\".\"));\n\t\t\t\t\t}\n\t\t\t\t\titems.unshift(object);\n\t\t\t\t}\n\t\t\t\treturn object ? items : [];\n\t\t\t}\n\t\t\tif (path.charAt(0) === \"#\") {\n\t\t\t\t// We return new items to insert into the sequence, replacing the \"#a.b.c\" string: [view, \"a.b.c\" currentDataItem]\n\t\t\t\t// so currentDataItem becomes the object for subsequent paths. The 'true' flag makes the paths bind only to leaf changes.\n\t\t\t\treturn path === \"#data\" ? [] : [view, path.replace(rViewPath, \"\"), object];\n\t\t\t}\n\t\t}\n\t};\n}\n\nfunction inputAttrib(elem) {\n\treturn elem.type === CHECKBOX ? elem[CHECKED] : elem.value;\n}\n\n//========================== Initialize ==========================\n\n//=====================\n// JsRender integration\n//=====================\n\n$sub.onStore.template = function(name, item) {\n\titem.link = tmplLink;\n\tif (name) {\n\t\t$.link[name] = function() {\n\t\t\treturn tmplLink.apply(item, arguments);\n\t\t};\n\t}\n};\n\n$sub.viewInfos = viewInfos; // Expose viewInfos() as public helper method\n\n// Initialize default delimiters\n($viewsSettings.delimiters = function() {\n\tvar delimChars = oldJsvDelimiters.apply(0, arguments);\n\tdelimOpenChar0 = delimChars[0];\n\tdelimOpenChar1 = delimChars[1];\n\tdelimCloseChar0 = delimChars[2];\n\tdelimCloseChar1 = delimChars[3];\n\tlinkChar = delimChars[4];\n\trTagDatalink = new RegExp(\"(?:^|\\\\s*)([\\\\w-]*)(\\\\\" + linkChar + \")?(\\\\\" + delimOpenChar1 + $sub.rTag + \"(:\\\\w*)?\\\\\" + delimCloseChar0 + \")\", \"g\");\n\n\t// Default rTag: attr bind tagExpr tag converter colon html comment code params\n\t// (?:^|\\s*)([\\w-]*)(\\^)?({(?:(?:(\\w+(?=[\\/\\s}]))|(?:(\\w+)?(:)|(>)|!--((?:[^-]|-(?!-))*)--|(\\*)))\\s*((?:[^}]|}(?!}))*?))})\n\treturn this;\n})(); // jshint ignore:line\n\n//====================================\n// Additional members for linked views\n//====================================\n\nfunction transferViewTokens(prevNode, nextNode, parentElem, id, viewOrTagChar, refresh) {\n\t// Transfer tokens on prevNode of viewToRemove/viewToRefresh to nextNode or parentElem._df\n\tvar i, l, vwInfos, vwInfo, viewOrTag, viewId, tokens,\n\t\tprecedingLength = 0,\n\t\temptyView = prevNode === nextNode;\n\n\tif (prevNode) {\n\t\t// prevNode is either the first node in the viewOrTag, or has been replaced by the vwInfos tokens string\n\t\tvwInfos = viewInfos(prevNode) || [];\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\t// Step through views or tags on the prevNode\n\t\t\tvwInfo = vwInfos[i];\n\t\t\tviewId = vwInfo.id;\n\t\t\tif (viewId === id && vwInfo.ch === viewOrTagChar) {\n\t\t\t\tif (refresh) {\n\t\t\t\t\t// This is viewOrTagToRefresh, this is the last viewOrTag to process...\n\t\t\t\t\tl = 0;\n\t\t\t\t} else {\n\t\t\t\t\t// This is viewOrTagToRemove, so we are done...\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!emptyView) {\n\t\t\t\tviewOrTag = vwInfo.ch === \"_\"\n\t\t\t\t\t? viewStore[viewId]\n\t\t\t\t\t: bindingStore[viewId].linkCtx.tag;\n\t\t\t\tif (vwInfo.open) {\n\t\t\t\t\t// A \"#m\" token\n\t\t\t\t\tviewOrTag._prv = nextNode;\n\t\t\t\t} else if (vwInfo.close) {\n\t\t\t\t\t// A \"/m\" token\n\t\t\t\t\tviewOrTag._nxt = nextNode;\n\t\t\t\t}\n\t\t\t}\n\t\t\tprecedingLength += viewId.length + 2;\n\t\t}\n\n\t\tif (precedingLength) {\n\t\t\tprevNode.setAttribute(jsvAttrStr, prevNode.getAttribute(jsvAttrStr).slice(precedingLength));\n\t\t}\n\t\ttokens = nextNode ? nextNode.getAttribute(jsvAttrStr) : parentElem._df;\n\t\tif (l = tokens.indexOf(\"/\" + id + viewOrTagChar) + 1) {\n\t\t\ttokens = vwInfos._tkns.slice(0, precedingLength) + tokens.slice(l + (refresh ? -1 : id.length + 1));\n\t\t}\n\t\tif (tokens) {\n\t\t\tif (nextNode) {\n\t\t\t\t// If viewOrTagToRemove was an empty viewOrTag, we will remove both #n and /n\n\t\t\t\t// (and any intervening tokens) from the nextNode (=== prevNode)\n\t\t\t\t// If viewOrTagToRemove was not empty, we will take tokens preceding #n from prevNode,\n\t\t\t\t// and concatenate with tokens following /n on nextNode\n\t\t\t\tnextNode.setAttribute(jsvAttrStr, tokens);\n\t\t\t} else {\n\t\t\t\tsetDefer(parentElem, tokens);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// !prevNode, so there may be a deferred nodes token on the parentElem. Remove it.\n\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"#\" + id + viewOrTagChar));\n\t\tif (!refresh && !nextNode) {\n\t\t\t// If this viewOrTag is being removed, and there was no .nxt, remove closing token from deferred tokens\n\t\t\tsetDefer(parentElem, removeSubStr(parentElem._df, \"/\" + id + viewOrTagChar));\n\t\t}\n\t}\n}\n\nfunction disposeTokens(tokens) {\n\tvar i, l, vwItem, vwInfos;\n\tif (vwInfos = viewInfos(tokens, true, rOpenMarkers)) {\n\t\tfor (i = 0, l = vwInfos.length; i < l; i++) {\n\t\t\tvwItem = vwInfos[i];\n\t\t\tif (vwItem.ch === \"_\") {\n\t\t\t\tif ((vwItem = viewStore[vwItem.id]) && vwItem.type) {\n\t\t\t\t\t// If this is the _prv (prevNode) for a view, remove the view\n\t\t\t\t\t// - unless view.type is undefined, in which case it is already being removed\n\t\t\t\t\tvwItem.parent.removeViews(vwItem._.key, undefined, true);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tremoveViewBinding(vwItem.id); // unbind bindings with this bindingId on this view\n\t\t\t}\n\t\t}\n\t}\n}\n\n//====================================\n// Add link methods to data-linked view or tag\n//====================================\nfunction addLinkMethods(tagOrView, isTag) {\n\n\ttagOrView.contents = function(deep, select) {\n\t\t// For a view or a tag, return jQuery object with the content nodes,\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is getContents(selector)\n\t\t\tselect = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\t\tvar filtered,\n\t\t\tnodes = $(this.nodes());\n\t\tif (nodes[0]) {\n\t\t\tfiltered = select ? nodes.filter(select) : nodes;\n\t\t\tnodes = deep && select ? filtered.add(nodes.find(select)) : filtered;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.nodes = function(withMarkers, prevNode, nextNode) {\n\t\t// For a view or a tag, return top-level nodes\n\t\t// Do not return any script marker nodes, unless withMarkers is true\n\t\t// Optionally limit range, by passing in prevNode or nextNode parameters\n\n\t\tvar node,\n\t\t\tself = this,\n\t\t\telCnt = self._elCnt,\n\t\t\tprevIsFirstNode = !prevNode && elCnt,\n\t\t\tnodes = [];\n\n\t\tprevNode = prevNode || self._prv;\n\t\tnextNode = nextNode || self._nxt;\n\n\t\tnode = prevIsFirstNode\n\t\t\t? (prevNode === self._nxt\n\t\t\t\t? self.parentElem.lastSibling\n\t\t\t\t: prevNode)\n\t\t\t: (self._.inline === false\n\t\t\t\t? prevNode || self.linkCtx.elem.firstChild\n\t\t\t\t: prevNode && prevNode.nextSibling);\n\n\t\twhile (node && (!nextNode || node !== nextNode)) {\n\t\t\tif (withMarkers || elCnt || node.tagName !== SCRIPT) {\n\t\t\t\t// All the top-level nodes in the view\n\t\t\t\t// (except script marker nodes, unless withMarkers = true)\n\t\t\t\t// (Note: If a script marker node, viewInfo.elCnt undefined)\n\t\t\t\tnodes.push(node);\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t}\n\t\treturn nodes;\n\t};\n\n\ttagOrView.childTags = function(deep, tagName) {\n\t\t// For a view or a tag, return child tags - at any depth, or as immediate children only.\n\t\tif (deep !== !!deep) {\n\t\t\t// deep not boolean, so this is childTags(tagName) - which looks for top-level tags of given tagName\n\t\t\ttagName = deep;\n\t\t\tdeep = undefined;\n\t\t}\n\n\t\tvar self = this,\n\t\t\tview = self.link ? self : self.tagCtx.view, // this may be a view or a tag. If a tag, get the view from tag.view.tagCtx\n\t\t\tprevNode = self._prv,\n\t\t\telCnt = self._elCnt,\n\t\t\ttags = [];\n\n\t\tview.link(\n\t\t\tundefined,\n\t\t\tself.parentElem,\n\t\t\telCnt ? prevNode && prevNode.previousSibling : prevNode,\n\t\t\tself._nxt,\n\t\t\tundefined,\n\t\t\t{get:{\n\t\t\t\ttags: tags,\n\t\t\t\tdeep: deep,\n\t\t\t\tname: tagName,\n\t\t\t\tid: self.link ? self._.id + \"_\" : self._tgId + \"^\"\n\t\t\t}}\n\t\t);\n\t\treturn tags;\n\t};\n\n\ttagOrView.refresh = function(sourceValue) {\n\t\tvar promise, attr,\n\t\t\ttag = this,\n\t\t\tlinkCtx = tag.linkCtx,\n\t\t\tview = tag.tagCtx.view;\n\n\t\tif (tag.disposed) { error(\"Removed tag\"); }\n\t\tif (sourceValue === undefined) {\n\t\t\tsourceValue = $views._tag(tag, view, view.tmpl, mergeCtxs(tag), true); // Get rendered HTML for tag, based on refreshed tagCtxs\n\t\t}\n\t\tif (sourceValue + \"\" === sourceValue) {\n\t\t\t// If no rendered content, sourceValue will not be a string (can be 0 or undefined)\n\t\t\tattr = tag._.inline ? HTML : (linkCtx.attr || defaultAttr(tag.parentElem, true));\n\t\t\tpromise = updateContent(sourceValue, linkCtx, attr, tag);\n\t\t}\n\n\t\tcallAfterLink(tag);\n\t\treturn promise || tag;\n\t};\n\n\ttagOrView.update = function(value) {\n\t\tvar linkedElem = this.linkedElem;\n\t\tif (linkedElem) {\n\t\t\telemChangeHandler({\n\t\t\t\ttarget: linkedElem[0]\n\t\t\t}, undefined, value);\n\t\t}\n\t};\n\n\tif (isTag) {\n\t\ttagOrView.domChange = function() { // domChange notification support\n\t\t\tvar elem = this.parentElem,\n\t\t\t\thasListener = $.hasData(elem) && $._data(elem).events,\n\t\t\t\tdomChangeNotification = \"jsv-domchange\";\n\n\t\t\tif (hasListener && hasListener[domChangeNotification]) {\n\t\t\t\t// Only trigger handler if there is a handler listening for this event. (Note using triggerHandler - so no event bubbling.)\n\t\t\t\t$(elem).triggerHandler(domChangeNotification, arguments);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t\t// Note: a linked view will also, after linking have nodes[], _prv (prevNode), _nxt (nextNode) ...\n\t\ttagOrView.addViews = function(index, dataItems, tmpl) {\n\t\t\t// if view is not an array view, do nothing\n\t\t\tvar i, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\titemsCount = dataItems.length,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (!self._.useKey && itemsCount && (tmpl = self.tmpl)) {\n\t\t\t\t// view is of type \"array\"\n\t\t\t\t// Use passed-in template if provided, since self added view may use a different template than the original one used to render the array.\n\t\t\t\tviewsCount = views.length + itemsCount;\n\n\t\t\t\tif (viewsCount === self.data.length // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\t\t&& renderAndLink(self, index, tmpl, views, dataItems, self.ctx) !== false) {\n\t\t\t\t\tfor (i = index + itemsCount; i < viewsCount; i++) {\n\t\t\t\t\t\t$observable(views[i]).setProperty(\"index\", i);\n\t\t\t\t\t\t// This is fixing up index, but not key, and not index on child views. From child views, use view.getIndex()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn self;\n\t\t};\n\n\t\ttagOrView.removeViews = function(index, itemsCount, keepNodes) {\n\t\t\t// view.removeViews() removes all the child views\n\t\t\t// view.removeViews(index) removes the child view with specified index or key\n\t\t\t// view.removeViews(index, count) removes the specified nummber of child views, starting with the specified index\n\t\t\tfunction removeView(index) {\n\t\t\t\tvar id, bindId, parentElem, prevNode, nextNode, nodesToRemove,\n\t\t\t\t\tviewToRemove = views[index];\n\n\t\t\t\tif (viewToRemove && viewToRemove.link) {\n\t\t\t\t\tid = viewToRemove._.id;\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tnodesToRemove = viewToRemove.nodes();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove child views, without removing nodes\n\t\t\t\t\tviewToRemove.removeViews(undefined, undefined, true);\n\n\t\t\t\t\tviewToRemove.type = undefined; // Set type to undefined: used as a flag that this view is being removed\n\t\t\t\t\tprevNode = viewToRemove._prv;\n\t\t\t\t\tnextNode = viewToRemove._nxt;\n\t\t\t\t\tparentElem = viewToRemove.parentElem;\n\t\t\t\t\t// If prevNode and nextNode are the same, the view is empty\n\t\t\t\t\tif (!keepNodes) {\n\t\t\t\t\t\t// Remove the HTML nodes from the DOM, unless they have already been removed, including nodes of child views\n\t\t\t\t\t\tif (viewToRemove._elCnt) {\n\t\t\t\t\t\t\t// if keepNodes is false (and transferring of tokens has not already been done at a higher level)\n\t\t\t\t\t\t\t// then transfer tokens from prevNode which is being removed, to nextNode.\n\t\t\t\t\t\t\ttransferViewTokens(prevNode, nextNode, parentElem, id, \"_\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(nodesToRemove).remove();\n\t\t\t\t\t}\n\t\t\t\t\tif (!viewToRemove._elCnt) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tprevNode.parentNode.removeChild(prevNode); // (prevNode.parentNode is parentElem, except if jQuery Mobile or similar has inserted an intermediate wrapper\n\t\t\t\t\t\t\tnextNode.parentNode.removeChild(nextNode);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\t\t\t\t\tsetArrayChangeLink(viewToRemove);\n\t\t\t\t\tfor (bindId in viewToRemove._.bnds) {\n\t\t\t\t\t\tremoveViewBinding(bindId);\n\t\t\t\t\t}\n\t\t\t\t\tdelete viewStore[id];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar current, view, viewsCount,\n\t\t\t\tself = this,\n\t\t\t\tisArray = !self._.useKey,\n\t\t\t\tviews = self.views;\n\n\t\t\tif (isArray) {\n\t\t\t\tviewsCount = views.length;\n\t\t\t}\n\t\t\tif (index === undefined) {\n\t\t\t\t// Remove all child views\n\t\t\t\tif (isArray) {\n\t\t\t\t\t// views and data are arrays\n\t\t\t\t\tcurrent = viewsCount;\n\t\t\t\t\twhile (current--) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = [];\n\t\t\t\t} else {\n\t\t\t\t\t// views and data are objects\n\t\t\t\t\tfor (view in views) {\n\t\t\t\t\t\t// Remove by key\n\t\t\t\t\t\tremoveView(view);\n\t\t\t\t\t}\n\t\t\t\t\tself.views = {};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (itemsCount === undefined) {\n\t\t\t\t\tif (isArray) {\n\t\t\t\t\t\t// The parentView is data array view.\n\t\t\t\t\t\t// Set itemsCount to 1, to remove this item\n\t\t\t\t\t\titemsCount = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Remove child view with key 'index'\n\t\t\t\t\t\tremoveView(index);\n\t\t\t\t\t\tdelete views[index];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isArray && itemsCount\n\t\t\t\t\t&& viewsCount - itemsCount === self.data.length) { // If views not already synced to array (e.g. triggered by array.length propertyChange - jsviews/issues/301)\n\t\t\t\t\tcurrent = index + itemsCount;\n\t\t\t\t\t// Remove indexed items (parentView is data array view);\n\t\t\t\t\twhile (current-- > index) {\n\t\t\t\t\t\tremoveView(current);\n\t\t\t\t\t}\n\t\t\t\t\tviews.splice(index, itemsCount);\n\t\t\t\t\tif (viewsCount = views.length) {\n\t\t\t\t\t\t// Fixup index on following view items...\n\t\t\t\t\t\twhile (index < viewsCount) {\n\t\t\t\t\t\t\t$observable(views[index]).setProperty(\"index\", index++);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\ttagOrView.refresh = function(context) {\n\t\t\tvar self = this,\n\t\t\t\tparent = self.parent;\n\n\t\t\tif (parent) {\n\t\t\t\trenderAndLink(self, self.index, self.tmpl, parent.views, self.data, context, true);\n\t\t\t\tsetArrayChangeLink(self);\n\t\t\t}\n\t\t\treturn self;\n\t\t};\n\n\t\ttagOrView.link = viewLink;\n\t}\n}\n\n//========================\n// JsViews-specific converters\n//========================\n\n$converters.merge = function(val) {\n\t// Special converter used in data-linking to space-separated lists, such as className:\n\t// Currently only supports toggle semantics - and has no effect if toggle string is not specified\n\t// data-link=\"class{merge:boolExpr toggle=className}\"\n\tvar regularExpression,\n\t\tcurrentValue = this.linkCtx._val || \"\",\n\t\ttoggle = this.tagCtx.props.toggle;\n\n\tif (toggle) {\n\t\t// We are toggling the class specified by the toggle property,\n\t\t// and the boolean val binding is driving the insert/remove toggle\n\n\t\tregularExpression = toggle.replace(/[\\\\^$.|?*+()[{]/g, \"\\\\$&\");\n\t\t// Escape any regular expression special characters (metacharacters) within the toggle string\n\t\tregularExpression = \"(\\\\s(?=\" + regularExpression + \"$)|(\\\\s)|^)(\" + regularExpression + \"(\\\\s|$))\";\n\t\t// Example: /(\\s(?=myclass$)|(\\s)|^)?(myclass(\\s|$))/ - so matches (\" myclass\" or \" \" or ^ ) followed by (\"myclass \" or \"myclass$\") where ^/$ are beginning/end of string\n\t\tcurrentValue = currentValue.replace(new RegExp(regularExpression), \"$2\");\n\t\tval = currentValue + (val ? (currentValue && \" \") + toggle : \"\");\n\t}\n\treturn val;\n};\n\n//========================\n// JsViews-specific tags\n//========================\n\n$tags(\"on\", {\n\tattr: NONE,\n\tinit: function(tagCtx) {\n\t\tvar tag = this,\n\t\t\tprops = tagCtx.props,\n\t\t\tcontent = tagCtx.content,\n\t\t\telemType = props.elem;\n\n\t\tif (tag._.inline) {\n\t\t\ttag.attr = HTML;\n\t\t\telemType = (elemType || \"span\") + \">\";\n\t\t\ttag.template = \"<\" + elemType + (props.label || content.markup || tagCtx.params.args[0]) + \" 1) {\n\t\t\t// Perf optimization for common cases\n\n\t\t\tnode = \"\" + node === node\n\t\t\t\t? $(node)[0]\n\t\t\t\t: node.jquery\n\t\t\t\t\t? node[0]\n\t\t\t\t\t: node;\n\n\t\t\tif (node) {\n\t\t\t\tif (inner) {\n\t\t\t\t\tgetInnerView(node._df, true);\n\t\t\t\t\tif (!view) {\n\t\t\t\t\t\t// Treat supplied node as a container element and return the first view encountered.\n\t\t\t\t\t\telems = qsa ? node.querySelectorAll(bindElsSel) : $(bindElsSel, node).get();\n\t\t\t\t\t\tl = elems.length;\n\t\t\t\t\t\tfor (i = 0; !view && i < l; i++) {\n\t\t\t\t\t\t\tgetInnerView(elems[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn view;\n\t\t\t\t}\n\t\t\t\twhile (node) {\n\t\t\t\t\t// Move back through siblings and up through parents to find preceding node which is a _prv (prevNode)\n\t\t\t\t\t// script marker node for a non-element-content view, or a _prv (first node) for an elCnt view\n\t\t\t\t\tif (vwInfos = viewInfos(node, undefined, rViewMarkers)) {\n\t\t\t\t\t\tl = vwInfos.length;\n\t\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\t\tview = vwInfos[l];\n\t\t\t\t\t\t\tif (view.open) {\n\t\t\t\t\t\t\t\tif (level < 1) {\n\t\t\t\t\t\t\t\t\tview = viewStore[view.id];\n\t\t\t\t\t\t\t\t\treturn view && type ? view.get(type) : view || topView;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlevel--;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// level starts at zero. If we hit a view.close, then we move level to 1, and we don't return a view until\n\t\t\t\t\t\t\t\t// we are back at level zero (or a parent view with level < 0)\n\t\t\t\t\t\t\t\tlevel++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.previousSibling || node.parentNode;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn topView;\n\t},\n\n\tlink: $views.link = $link,\n\tunlink: $views.unlink = $unlink,\n\n\t//=====================\n\t// override $.cleanData\n\t//=====================\n\tcleanData: function(elems) {\n\t\tif (elems.length && isCleanCall) {\n\t\t\t// Remove JsViews bindings. Also, remove from the DOM any corresponding script marker nodes\n\t\t\tclean(elems);\n\t\t}\n\t\toldCleanData.apply($, arguments);\n\t}\n});\n\n// Possible future addition - e.g. for ckeditor tag control\n//$views.utility = {\n//\tvalidate: function(html) {\n//\t\ttry {\n//\t\t\ttopView.link(undefined, document.createElement(\"div\"), undefined, undefined, html, undefined, undefined, 1);\n//\t\t}\n//\t\tcatch (e) {\n//\t\t\treturn e.message;\n//\t\t}\n//\t}\n//};\n\n//===============================\n// Extend jQuery instance plugins\n//===============================\n\n$extend($.fn, {\n\tlink: function(expr, from, context, noIteration, parentView, prevNode, nextNode) {\n\t\treturn $link(expr, this, from, context, noIteration, parentView, prevNode, nextNode);\n\t},\n\tunlink: function() {\n\t\treturn $unlink(this);\n\t},\n\tview: function(inner, type) {\n\t\treturn $view(this[0], inner, type);\n\t}\n});\n\n//==============================================================================\n// Override jQuery methods that call our overridden cleanData, for disposal etc.\n//==============================================================================\n\n$.each([HTML, \"replaceWith\", \"empty\", \"remove\"], function(i, name) {\n\tvar oldFn = $.fn[name];\n\t$.fn[name] = function() {\n\t\tvar result;\n\t\tisCleanCall = 1; // Make sure cleanData does disposal only when coming from these calls.\n\t\ttry {\n\t\t\tresult = oldFn.apply(this, arguments);\n\t\t}\n\t\tfinally {\n\t\t\tisCleanCall = 0;\n\t\t}\n\t\treturn result;\n\t};\n});\n\n//===============\n// Extend topView\n//===============\n\naddLinkMethods($extend(topView = $sub.topView, {tmpl: {links: {}}}));\n\nviewStore = { 0: topView }; // Top-level view\n\n//=========================\n// Extend $.views.settings\n//=========================\n\n$viewsSettings({\n\twrapMap: wrapMap = {\n\t\toption: [1, \"\"],\n\t\tlegend: [1, \"
\", \"
\"],\n\t\tarea: [1, \"\", \"\"],\n\t\tparam: [1, \"\", \"\"],\n\t\tthead: [1, \"
\", \"
\"],\n\t\ttr: [2, \"\", \"
\"],\n\t\ttd: [3, \"\", \"
\"],\n\t\tcol: [2, \"\", \"
\"],\n\t\tsvg_ns: [1, \"\", \"\"],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\tdiv: $.support.htmlSerialize ? [0, \"\", \"\"] : [1, \"X
\", \"
\"]\n\t},\n\tlinkAttr: $viewsLinkAttr = \"data-link\",\n\tmerge: {\n\t\tinput: {\n\t\t\tfrom: inputAttrib, to: \"value\"\n\t\t},\n\t\ttextarea: valueBinding,\n\t\tselect: valueBinding,\n\t\toptgroup: {\n\t\t\tto: \"label\"\n\t\t}\n\t},\n\tjsrDbgMode: $viewsSettings.debugMode, // debugMode for JsRender\n\tdebugMode: function(debugMode) { // debugMode for JsViews\n\t\t$viewsSettings._dbgMode = debugMode !== false;\n\t\tif ($viewsSettings._dbgMode) {\n\t\t\tglobal._jsv = { // In debug mode create global _jsv, for accessing views, etc\n\t\t\t\tviews: viewStore,\n\t\t\t\tbindings: bindingStore\n\t\t\t};\n\t\t} else if (global._jsv) {\n\t\t\tglobal._jsv = undefined; // In IE8 cannot do delete global._jsv\n\t\t}\n\t},\n\tjsv: function() {\n\t\t$viewsSettings.debugMode($viewsSettings._dbgMode);\n\t\t$viewsLinkAttr = $viewsSettings.linkAttr;\n\t\terror = $views._err;\n\t\tlinkViewsSel = bindElsSel + \",[\" + $viewsLinkAttr + \"]\";\n\t\tnoDomLevel0 = $viewsSettings.noDomLevel0;\n\t\twrapMap.optgroup = wrapMap.option;\n\t\twrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n\t\twrapMap.th = wrapMap.td;\n\t}\n});\n\nreturn $;\n}));\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/package.json b/package.json index 9b8d4a7..da38e9c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsviews", - "version": "v0.9.71", + "version": "v0.9.72", "description": "Next-generation MVVM and MVP framework - built on top of JsRender templates. Bringing templates to life...", "main": "./jsviews.js", "author": { @@ -33,8 +33,8 @@ "glob-stream": "^5.0.0", "gulp": "^3.9.0", "jquery": "^2.1.4", - "jsrender": "^0.9.71", + "jsrender": "^0.9.72", "qunit": "^0.7.6" }, - "dependencies": { } + "dependencies": {} } diff --git a/test/unit-tests/requirejs-config.js b/test/unit-tests/requirejs-config.js index 6033ffc..b211c7b 100644 --- a/test/unit-tests/requirejs-config.js +++ b/test/unit-tests/requirejs-config.js @@ -6,6 +6,6 @@ requirejs.config({ "jsrender": "./jsrender", "jquery.observable": "./jquery.observable", "jquery.views": "./jquery.views", - "jsviews": "./jsviews", + "jsviews": "./jsviews" } }); diff --git a/test/unit-tests/tests-jsobservable.js b/test/unit-tests/tests-jsobservable.js index df2e2ad..164fa6e 100644 --- a/test/unit-tests/tests-jsobservable.js +++ b/test/unit-tests/tests-jsobservable.js @@ -581,7 +581,7 @@ test("observeAll", function() { person: { name: "Pete", address: { - street: "1st Ave", + street: "1st Ave" }, phones: [{number: "111 111 1111"}, {number:"222 222 2222"}] } @@ -592,7 +592,7 @@ test("observeAll", function() { // ................................ Act .................................. $.observable(data.person).setProperty({ name: "Hermione", - "address.street": "Main St", + "address.street": "Main St" }); $.observable(data.person).setProperty({ @@ -721,7 +721,14 @@ test("observeAll", function() { $.observable(model.things[2]).setProperty("thing", model.things[2].thing + "+"); // ............................... Assert ................................. - equal(result, 'ObserveAll Path: root.person1.home eventArgs: change: "set"|path: "address"|value: {"street":"1st","ZIP":"00000"}|oldValue: {"street":"StreetOne","ZIP":"111"}|remove: false|ObserveAll Path: root.person1.home.address eventArgs: change: "set"|path: "street"|value: "upper St"|oldValue: "1st"|remove: false|ObserveAll Path: root.person1.home.address eventArgs: change: "set"|path: "ZIP"|value: "33333"|oldValue: "00000"|remove: false|ObserveAll Path: root eventArgs: change: "set"|path: "things"|value: [{"thing":"tree"}]|oldValue: []|remove: false|ObserveAll Path: root.things eventArgs: change: "insert"|index: 1|items: [{"thing":"bush"}]|ObserveAll Path: root.things eventArgs: change: "refresh"|oldItems: [{"thing":"tree"},{"thing":"bush"}]|ObserveAll Path: root.things[0] eventArgs: change: "set"|path: "thing"|value: "bush+"|oldValue: "bush"|remove: false|', + equal(result, +'ObserveAll Path: root.person1.home eventArgs: change: "set"|path: "address"|value: {"street":"1st","ZIP":"00000"}|oldValue: {"street":"StreetOne","ZIP":"111"}|remove: false|' ++ 'ObserveAll Path: root.person1.home.address eventArgs: change: "set"|path: "street"|value: "upper St"|oldValue: "1st"|remove: false|' ++ 'ObserveAll Path: root.person1.home.address eventArgs: change: "set"|path: "ZIP"|value: "33333"|oldValue: "00000"|remove: false|' ++ 'ObserveAll Path: root eventArgs: change: "set"|path: "things"|value: [{"thing":"tree"}]|oldValue: []|remove: false|' ++ 'ObserveAll Path: root.things eventArgs: change: "insert"|index: 1|items: [{"thing":"bush"}]|' ++ 'ObserveAll Path: root.things eventArgs: change: "refresh"|oldItems: [{"thing":"tree"},{"thing":"bush"}]|' ++ 'ObserveAll Path: root.things[0] eventArgs: change: "set"|path: "thing"|value: "bush+"|oldValue: "bush"|remove: false|', "observeAll raises correct change events"); // ............................... Assert ................................. @@ -817,8 +824,33 @@ test("observeAll", function() { equal(listeners, "1 1 1", '$.observable(someArray).observeAll(observeAllCb2) works correctly'); + // ................................ Act .................................. + reset(); + $.observable(model.things).insert({ thing: "bush" }); + $.observable(model.things).refresh([model.things[1], model.things[0], model.things[1]]); + $.observable(model.things[2]).setProperty("thing", model.things[2].thing + "+"); + $.observable(model.things[1]).setProperty("thing", model.things[1].thing + "+"); + $.observable(model.things).remove(2); + + // ............................... Assert ................................. + equal(result, +'ObserveAll Path: root eventArgs: change: insert|index: 3|items: [object Object]|' ++ 'ObserveAll Path: root eventArgs: change: refresh|oldItems: [object Object],[object Object],[object Object],[object Object]|' ++ 'ObserveAll Path: root[0] eventArgs: change: set|path: thing|value: tree+|oldValue: tree|remove: false|' ++ 'ObserveAll Path: root[1] eventArgs: change: set|path: thing|value: bush++|oldValue: bush+|remove: false|' ++ 'ObserveAll Path: root eventArgs: change: remove|index: 2|items: [object Object]|', + + '$.observable(someArray).observeAll(observeAllCb2) raises the correct array change events'); + $.observable(model.things).unobserveAll(observeAllCb2); + // ............................... Assert ................................. + listeners = "" + !!$._data(model.things).events + " " + + !!$._data(model.things[0]).events + " " + + !!$._data(model.things[1]).events; + + equal(listeners, "false false false", '$.unobserve(data, "arrayProp.**", observeAllCb2) removes listeners correctly'); + // ................................ Reset .................................. model = { person1: person1, @@ -829,6 +861,462 @@ test("observeAll", function() { person1.home.address.ZIP = "111"; }); +test('observe(... "**" ...)', function() { + reset(); + + // =============================== Arrange =============================== + var inc = 0, + data = { + person: { + name: "Pete", + address: { + street: "1st Ave" + }, + phones: [{number: "111 111 1111"}, {number:"222 222 2222"}] + } + }; + + $.observe(data, "**", observeAllCb1); + + // ................................ Act .................................. + $.observable(data.person).setProperty({ + name: "Hermione", + "address.street": "Main St" + }); + + $.observable(data.person).setProperty({ + address: {street: "New Street"}, + phones: [{number:"123 123 1234"}] + }); + + $.observable(data.person.phones[0]).setProperty("foo", 34); + + $.observable(data.person.phones).insert({ + number:"456 456 AAAA" + }); + + $.observable(data.person.phones[1]).setProperty("number", data.person.phones[1].number + inc++); + + $.observable(data.person.phones).remove(0); + + $.observable(data.person.phones[0]).setProperty("number", data.person.phones[0].number + inc++); + + $.observable(data.person.phones).insert({ + number:"456 456 BBBB" + }); + + $.observable(data.person.phones[1]).setProperty("subnum", {a: 11, b: 22}); + + $.observable(data.person.phones[1]).setProperty("subnum.a", "a" + inc++); + + $.observable(data.person.phones[1]).removeProperty("subnum.b"); + + $.observable(data.person.phones).insert(1, [{number:"456 456 CCCC"}, {number:"456 456 DDDD"}]); + + $.observable(data.person.phones[2]).setProperty("number", data.person.phones[2].number + inc++); + + $.observable(data.person.phones).refresh([{number:"456 456 EEEE"}, {number:"456 456 FFFF"}]); + + $.observable(data.person.phones[1]).setProperty("number", data.person.phones[1].number + inc++); + + $.observable(data.person.phones).remove(0); + + $.observable(data.person.phones[0]).setProperty("number", data.person.phones[0].number + inc++); + +// ............................... Assert ................................. + result += "DATA: " + JSON.stringify(data); + + equal(result, +'ObserveAll Path: root.person' ++ ' eventArgs: change: "set"|path: "name"|value: "Hermione"|oldValue: "Pete"|remove: false' + ++ '|ObserveAll Path: root.person.address' ++ ' eventArgs: change: "set"|path: "street"|value: "Main St"|oldValue: "1st Ave"|remove: false' + ++ '|ObserveAll Path: root.person' ++ ' eventArgs: change: "set"|path: "address"|value: {"street":"New Street"}|oldValue: {"street":"Main St"}|remove: false' + ++ '|ObserveAll Path: root.person' ++ ' eventArgs: change: "set"|path: "phones"|value: [{"number":"123 123 1234"}]|oldValue: [{"number":"111 111 1111"},{"number":"222 222 2222"}]|remove: false' + ++ '|ObserveAll Path: root.person.phones[0]' ++ ' eventArgs: change: "set"|path: "foo"|value: 34|oldValue: undefined|remove: false' + ++ '|ObserveAll Path: root.person.phones' ++ ' eventArgs: change: "insert"|index: 1|items: [{"number":"456 456 AAAA"}]' + ++ '|ObserveAll Path: root.person.phones[1]' ++ ' eventArgs: change: "set"|path: "number"|value: "456 456 AAAA0"|oldValue: "456 456 AAAA"|remove: false' + ++ '|ObserveAll Path: root.person.phones' ++ ' eventArgs: change: "remove"|index: 0|items: [{"number":"123 123 1234","foo":34}]' + ++ '|ObserveAll Path: root.person.phones[0]' ++ ' eventArgs: change: "set"|path: "number"|value: "456 456 AAAA01"|oldValue: "456 456 AAAA0"|remove: false' + ++ '|ObserveAll Path: root.person.phones' ++ ' eventArgs: change: "insert"|index: 1|items: [{"number":"456 456 BBBB"}]' + ++ '|ObserveAll Path: root.person.phones[1]' ++ ' eventArgs: change: "set"|path: "subnum"|value: {"a":11,"b":22}|oldValue: undefined|remove: false' + ++ '|ObserveAll Path: root.person.phones[1].subnum' ++ ' eventArgs: change: "set"|path: "a"|value: "a2"|oldValue: 11|remove: false' + ++ '|ObserveAll Path: root.person.phones[1].subnum' ++ ' eventArgs: change: "set"|path: "b"|value: undefined|oldValue: 22|remove: true' + ++ '|ObserveAll Path: root.person.phones' ++ ' eventArgs: change: "insert"|index: 1|items: [{"number":"456 456 CCCC"},{"number":"456 456 DDDD"}]' + ++ '|ObserveAll Path: root.person.phones[2]' ++ ' eventArgs: change: "set"|path: "number"|value: "456 456 DDDD3"|oldValue: "456 456 DDDD"|remove: false' + ++ '|ObserveAll Path: root.person.phones' ++ ' eventArgs: change: "refresh"|oldItems: [{"number":"456 456 AAAA01"},{"number":"456 456 CCCC"},{"number":"456 456 DDDD3"},{"number":"456 456 BBBB","subnum":{"a":"a2"}}]' + ++ '|ObserveAll Path: root.person.phones[1]' ++ ' eventArgs: change: "set"|path: "number"|value: "456 456 FFFF4"|oldValue: "456 456 FFFF"|remove: false' + ++ '|ObserveAll Path: root.person.phones' ++ ' eventArgs: change: "remove"|index: 0|items: [{"number":"456 456 EEEE"}]' + ++ '|ObserveAll Path: root.person.phones[0]' ++ ' eventArgs: change: "set"|path: "number"|value: "456 456 FFFF45"|oldValue: "456 456 FFFF4"|remove: false' + ++ '|DATA: {"person":{"name":"Hermione","address":{"street":"New Street"},"phones":[{"number":"456 456 FFFF45"}]}}', + + 'observeAll scenarios using "**", with observeAll.path() etc.'); + + $.unobserve(data, "**"); + + reset(); + + // =============================== Arrange =============================== + $.observe(model, "**", observeAllCb1); + + // ................................ Act .................................. + $.observable(model).setProperty({ + "person1.home.address": { + street: "1st", + ZIP: "00000" + }, + "person1.home.address.street": "upper St", + "person1.home.address.ZIP": "33333", + things: [{ thing: "tree" }] + }); + $.observable(model.things).insert({ thing: "bush" }); + $.observable(model.things).refresh([model.things[1], model.things[0], model.things[1]]); + $.observable(model.things[2]).setProperty("thing", model.things[2].thing + "+"); + + // ............................... Assert ................................. + equal(result, +'ObserveAll Path: root.person1.home eventArgs: change: "set"|path: "address"|value: {"street":"1st","ZIP":"00000"}|oldValue: {"street":"StreetOne","ZIP":"111"}|remove: false|' ++ 'ObserveAll Path: root.person1.home.address eventArgs: change: "set"|path: "street"|value: "upper St"|oldValue: "1st"|remove: false|' ++ 'ObserveAll Path: root.person1.home.address eventArgs: change: "set"|path: "ZIP"|value: "33333"|oldValue: "00000"|remove: false|' ++ 'ObserveAll Path: root eventArgs: change: "set"|path: "things"|value: [{"thing":"tree"}]|oldValue: []|remove: false|' ++ 'ObserveAll Path: root.things eventArgs: change: "insert"|index: 1|items: [{"thing":"bush"}]|' ++ 'ObserveAll Path: root.things eventArgs: change: "refresh"|oldItems: [{"thing":"tree"},{"thing":"bush"}]|' ++ 'ObserveAll Path: root.things[0] eventArgs: change: "set"|path: "thing"|value: "bush+"|oldValue: "bush"|remove: false|', + '$.observe(data, "**", ...) works as observeAll and raises correct change events'); + + // ............................... Assert ................................. + listeners = $._data(model).events.propertyChange.length + " " + + $._data(model.person1).events.propertyChange.length + " " + + $._data(model.person1.home).events.propertyChange.length + " " + + $._data(model.person1.home.address).events.propertyChange.length + " " + + $._data(model.things).events.arrayChange.length + " " + + $._data(model.things[0]).events.propertyChange.length + " " + + $._data(model.things[1]).events.propertyChange.length; + + equal(listeners, "1 1 1 1 1 1 1", '$.observe(data, "**", ...) works as observeAll and maintains a single event handler binding on every object in the graph, regardless of structural observable changes made'); + + // ................................ Act .................................. + $.observe(model, "**", observeAllCb1); + + // ............................... Assert ................................. + listeners = $._data(model).events.propertyChange.length + " " + + $._data(model.person1).events.propertyChange.length + " " + + $._data(model.person1.home).events.propertyChange.length + " " + + $._data(model.person1.home.address).events.propertyChange.length + " " + + $._data(model.things).events.arrayChange.length + " " + + $._data(model.things[0]).events.propertyChange.length + " " + + $._data(model.things[1]).events.propertyChange.length; + + equal(listeners, "1 1 1 1 1 1 1", 'Calling $.observe(data, "**", ...) more than once does not add extra event bindings'); + + // ................................ Act .................................. + $.observe(model, "**", observeAllCb3); + + // ............................... Assert ................................. + listeners = $._data(model).events.propertyChange.length + " " + + $._data(model.person1).events.propertyChange.length + " " + + $._data(model.person1.home).events.propertyChange.length + " " + + $._data(model.person1.home.address).events.propertyChange.length + " " + + $._data(model.things).events.arrayChange.length + " " + + $._data(model.things[0]).events.propertyChange.length + " " + + $._data(model.things[1]).events.propertyChange.length; + + equal(listeners, "2 2 2 2 2 2 2", 'Calling $.observe(data, "**", ...) with a different callback adds one binding for the new callback on each object or array'); + + // ................................ Act .................................. + $.unobserve(model, "**", observeAllCb1); + + // ............................... Assert ................................. + listeners = $._data(model).events.propertyChange.length + " " + + $._data(model.person1).events.propertyChange.length + " " + + $._data(model.person1.home).events.propertyChange.length + " " + + $._data(model.person1.home.address).events.propertyChange.length + " " + + $._data(model.things).events.arrayChange.length + " " + + $._data(model.things[0]).events.propertyChange.length + " " + + $._data(model.things[1]).events.propertyChange.length; + + equal(listeners, "1 1 1 1 1 1 1", 'Calling $.unobserve(data, "**", myCallback) removes just my callback bindings'); + + // ................................ Act .................................. + $.observe(model, "**", observeAllCb1); + + $.unobserve(model.things, "**", observeAllCb1); + + // ............................... Assert ................................. + listeners = $._data(model).events.propertyChange.length + " " + + $._data(model.person1).events.propertyChange.length + " " + + $._data(model.person1.home).events.propertyChange.length + " " + + $._data(model.person1.home.address).events.propertyChange.length + " " + + $._data(model.things).events.arrayChange.length + " " + + $._data(model.things[0]).events.propertyChange.length + " " + + $._data(model.things[1]).events.propertyChange.length; + + equal(listeners, "2 2 2 2 1 1 1", 'Calling $.unobserve(objectOrArrayInTree, "**", myCallback) removes just my callback bindings in the subtree only'); + + // ................................ Act .................................. + $.unobserve(model, "**"); + + // ............................... Assert ................................. + equal(!$._data(model).events + " " + + !$._data(model.person1).events + " " + + !$._data(model.person1.home).events + " " + + !$._data(model.person1.home.address).events + " " + + !$._data(model.things).events + " " + + !$._data(model.things[0]).events + " " + + !$._data(model.things[1]).events, + "true true true true true true true", + 'unobserveAll() with no callback removes all bindings from the tree'); + + // ................................ Act .................................. + $.observe(model.things, "**", observeAllCb2); + + // ............................... Assert ................................. + listeners = $._data(model.things).events.arrayChange.length + " " + + $._data(model.things[0]).events.propertyChange.length + " " + + $._data(model.things[1]).events.propertyChange.length; + + equal(listeners, "1 1 1", '$.observe(someArray, "**", observeAllCb2) works correctly'); + + $.unobserve(model.things, "**", observeAllCb2); + + listeners = "" + !!$._data(model.things).events + " " + + !!$._data(model.things[0]).events + " " + + !!$._data(model.things[1]).events; + + equal(listeners, "false false false", '$.unobserve(someArray, "**", observeAllCb2) removes listeners correctly'); + + // ................................ Act .................................. + $.observe(model, "things.**", observeAllCb2); + + // ............................... Assert ................................. + listeners = $._data(model.things).events.arrayChange.length + " " + + $._data(model.things[0]).events.propertyChange.length + " " + + $._data(model.things[1]).events.propertyChange.length; + + equal(listeners, "1 1 1", '$.observe(data, "arrayProp.**", observeAllCb2) works correctly'); + + // ................................ Act .................................. + reset(); + $.observable(model.things).insert({ thing: "bush" }); + $.observable(model.things).refresh([model.things[1], model.things[0], model.things[1]]); + $.observable(model.things[2]).setProperty("thing", model.things[2].thing + "+"); + $.observable(model.things[1]).setProperty("thing", model.things[1].thing + "+"); + $.observable(model.things).remove(2); + + // ............................... Assert ................................. + equal(result, +'ObserveAll Path: root eventArgs: change: insert|index: 3|items: [object Object]|' ++ 'ObserveAll Path: root eventArgs: change: refresh|oldItems: [object Object],[object Object],[object Object],[object Object]|' ++ 'ObserveAll Path: root[0] eventArgs: change: set|path: thing|value: tree+|oldValue: tree|remove: false|' ++ 'ObserveAll Path: root[1] eventArgs: change: set|path: thing|value: bush++|oldValue: bush+|remove: false|' ++ 'ObserveAll Path: root eventArgs: change: remove|index: 2|items: [object Object]|', + '$.observe(data, "arrayProp.**", ...) works as observeAll and raises correct change events'); + + // ................................ Act .................................. + $.unobserve(model, "things.**", observeAllCb2); + + // ............................... Assert ................................. + listeners = "" + !!$._data(model.things).events + " " + + !!$._data(model.things[0]).events + " " + + !!$._data(model.things[1]).events; + + equal(listeners, "false false false", '$.unobserve(data, "arrayProp.**", observeAllCb2) removes listeners correctly'); + + reset(); + + // ................................ Reset .................................. + inc = 0; + data = {}; + + // =============================== Arrange =============================== + + model = {}; + + function observeAllCb4(ev, eventArgs) { + result += "ObserveAll Path: " + (ev.data.observeAll && ev.data.observeAll.path()) + " eventArgs: "; + for (var key in eventArgs) { + result += key + ": " + JSON.stringify(eventArgs[key]) + "|"; + } + } + + $.observe(model, "owner", "person^address.street", "person.**", "person^**", "person^name", observeAllCb4); + + $.observable(model).setProperty({ + owner: "Jeff", + person: { + name: "Pete", + address: { + street: "1st Ave" + }, + phones: [{number: "111 111 1111"}, {number:"222 222 2222"}] + } + }); + + // ................................ Act .................................. + $.observable(model.person).setProperty({ + name: "Hermione", + "address.street": "Main St" + }); + + $.observable(model.person).setProperty({ + address: {street: "New Street"}, + phones: [{number:"123 123 1234"}] + }); + + $.observable(model).setProperty({ + "person.name": "John", + "person.address.street": "Last St" + }); + + $.observable(model.person.phones[0]).setProperty("foo", 34); + + $.observable(model.person.phones).insert({ + number:"456 456 AAAA" + }); + + $.observable(model.person.phones[1]).setProperty("number", model.person.phones[1].number + inc++); + + $.observable(model.person.phones).remove(0); + + $.observable(model.person.phones[0]).setProperty("number", model.person.phones[0].number + inc++); + + $.observable(model.person.phones).insert({ + number:"456 456 BBBB" + }); + + $.observable(model.person.phones[1]).setProperty("subnum", {a: 11, b: 22}); + + $.observable(model.person.phones[1]).setProperty("subnum.a", "a" + inc++); + + $.observable(model.person.phones[1]).removeProperty("subnum.b"); + + $.observable(model.person.phones).insert(1, [{number:"456 456 CCCC"}, {number:"456 456 DDDD"}]); + + $.observable(model.person.phones[2]).setProperty("number", model.person.phones[2].number + inc++); + + $.observable(model.person.phones).refresh([{number:"456 456 EEEE"}, {number:"456 456 FFFF"}]); + + $.observable(model.person.phones[1]).setProperty("number", model.person.phones[1].number + inc++); + + $.observable(model.person.phones).remove(0); + + $.observable(model.person.phones[0]).setProperty("number", model.person.phones[0].number + inc++); + + // ............................... Assert ................................. + + result += "DATA: " + JSON.stringify(model); + + equal(result, +'ObserveAll Path: undefined eventArgs: change: "set"|path: "owner"|value: "Jeff"|oldValue: undefined|remove: false' + ++ '|ObserveAll Path: undefined eventArgs: change: "set"|path: "person"|value: {"name":"Pete","address":{"street":"1st Ave"},"phones":[{"number":"111 111 1111"},{"number":"222 222 2222"}]}|oldValue: undefined|remove: false' + ++ '|ObserveAll Path: root eventArgs: change: "set"|path: "name"|value: "Hermione"|oldValue: "Pete"|remove: false' + ++ '|ObserveAll Path: root.address eventArgs: change: "set"|path: "street"|value: "Main St"|oldValue: "1st Ave"|remove: false' + ++ '|ObserveAll Path: root eventArgs: change: "set"|path: "address"|value: {"street":"New Street"}|oldValue: {"street":"Main St"}|remove: false' + ++ '|ObserveAll Path: root eventArgs: change: "set"|path: "phones"|value: [{"number":"123 123 1234"}]|oldValue: [{"number":"111 111 1111"},{"number":"222 222 2222"}]|remove: false' + ++ '|ObserveAll Path: root eventArgs: change: "set"|path: "name"|value: "John"|oldValue: "Hermione"|remove: false' + ++ '|ObserveAll Path: root.address eventArgs: change: "set"|path: "street"|value: "Last St"|oldValue: "New Street"|remove: false' + ++ '|ObserveAll Path: root.phones[0] eventArgs: change: "set"|path: "foo"|value: 34|oldValue: undefined|remove: false' + ++ '|ObserveAll Path: root.phones eventArgs: change: "insert"|index: 1|items: [{"number":"456 456 AAAA"}]' + ++ '|ObserveAll Path: root.phones[1] eventArgs: change: "set"|path: "number"|value: "456 456 AAAA0"|oldValue: "456 456 AAAA"|remove: false' + ++ '|ObserveAll Path: root.phones eventArgs: change: "remove"|index: 0|items: [{"number":"123 123 1234","foo":34}]' + ++ '|ObserveAll Path: root.phones[0] eventArgs: change: "set"|path: "number"|value: "456 456 AAAA01"|oldValue: "456 456 AAAA0"|remove: false' + ++ '|ObserveAll Path: root.phones eventArgs: change: "insert"|index: 1|items: [{"number":"456 456 BBBB"}]' + ++ '|ObserveAll Path: root.phones[1] eventArgs: change: "set"|path: "subnum"|value: {"a":11,"b":22}|oldValue: undefined|remove: false' + ++ '|ObserveAll Path: root.phones[1].subnum eventArgs: change: "set"|path: "a"|value: "a2"|oldValue: 11|remove: false' + ++ '|ObserveAll Path: root.phones[1].subnum eventArgs: change: "set"|path: "b"|value: undefined|oldValue: 22|remove: true' + ++ '|ObserveAll Path: root.phones eventArgs: change: "insert"|index: 1|items: [{"number":"456 456 CCCC"},{"number":"456 456 DDDD"}]' + ++ '|ObserveAll Path: root.phones[2] eventArgs: change: "set"|path: "number"|value: "456 456 DDDD3"|oldValue: "456 456 DDDD"|remove: false' + ++ '|ObserveAll Path: root.phones eventArgs: change: "refresh"|oldItems: [{"number":"456 456 AAAA01"},{"number":"456 456 CCCC"},{"number":"456 456 DDDD3"},{"number":"456 456 BBBB","subnum":{"a":"a2"}}]' + ++ '|ObserveAll Path: root.phones[1] eventArgs: change: "set"|path: "number"|value: "456 456 FFFF4"|oldValue: "456 456 FFFF"|remove: false' + ++ '|ObserveAll Path: root.phones eventArgs: change: "remove"|index: 0|items: [{"number":"456 456 EEEE"}]' + ++ '|ObserveAll Path: root.phones[0] eventArgs: change: "set"|path: "number"|value: "456 456 FFFF45"|oldValue: "456 456 FFFF4"|remove: false' + ++ '|DATA: {"owner":"Jeff","person":{"name":"John","address":{"street":"Last St"},"phones":[{"number":"456 456 FFFF45"}]}}', + + 'observeAll scenarios using multiple paths, with or without "**", raise correct events, with observeAll.path() etc.'); + + // ............................... Assert ................................. + listeners = $._data(model).events.propertyChange.length + " " + + $._data(model.person).events.propertyChange.length + " " + + $._data(model.person.address).events.propertyChange.length + " " + + $._data(model.person.phones).events.arrayChange.length + " " + + $._data(model.person.phones[0]).events.propertyChange.length; + + equal(listeners, "2 1 1 1 1", 'observeAll scenarios using multiple paths, with or without "**", duplicate listeners are avoided'); + + // ................................ Reset .................................. + $.unobserve(model, "**"); + + reset(); + + model = { + person1: person1, + person2: person2, + things: [] + }; + person1.home.address.street = "StreetOne", + person1.home.address.ZIP = "111"; + +}); + test("observeAll - cyclic graphs", function() { reset(); diff --git a/test/unit-tests/tests-jsrender-amd-scriptloader.js b/test/unit-tests/tests-jsrender-amd-scriptloader.js index eb350c6..1624bdb 100644 --- a/test/unit-tests/tests-jsrender-amd-scriptloader.js +++ b/test/unit-tests/tests-jsrender-amd-scriptloader.js @@ -35,8 +35,6 @@ test("Loading JsRender and jQuery, without forcing load order, using RequireJS", console.log("2"); // Note JsRender does not require jQuery - so its AMD definition does not specify jQuery dependency. -// So we will force loading order here by nesting require call for JsRender inside require call for jQuery. -// This is not optimized for loading speed. require(["./unit-tests/requirejs-config"], function() { require(["jquery", "jsrender"], function($jq, $) { diff --git a/test/unit-tests/tests-jsrender-no-jquery.js b/test/unit-tests/tests-jsrender-no-jquery.js index bc0072f..1e09c2e 100644 --- a/test/unit-tests/tests-jsrender-no-jquery.js +++ b/test/unit-tests/tests-jsrender-no-jquery.js @@ -57,11 +57,14 @@ test("{{if}} {{else}}", 4, function() { equal($.templates(" a'b\"c\\").render(), " a\'b\"c\\", "Correct escaping of quotes and backslash"); }); -test("syntax errors", 4, function() { +test("syntax errors", 7, function() { equal(compileTmpl("{^{*:foo}}"), "Syntax error\n{^{*:foo}}", "Syntax error for {^{* ...}}"); equal(compileTmpl("{{:foo/}}"), "Syntax error\n{{:foo/}}", "Syntax error for {{: ... /}}"); - equal(compileTmpl("{{if foo:}}"), "Syntax error\n{{if foo:}}", "Syntax error for {{tag ... :}}"); - equal(compileTmpl("{{if foo:cvt}}"), "Syntax error\n{{if foo:cvt}}", "Syntax error for {{tag ... :cvt}}"); + equal(compileTmpl("{{:foo:}}"), "Syntax error\n{{:foo:}}", "Syntax error for {{: ... :}}"); + equal(compileTmpl("{^{:foo:}}"), "Syntax error\n{^{:foo:}}", "Syntax error for {^{: ... :}}"); + equal(compileTmpl("{{mytag foo :}}"), "Syntax error\n{{mytag foo :}}", "Syntax error for {{mytag ... :}}"); + equal(compileTmpl("{^{mytag foo :}}"), "Syntax error\n{^{mytag foo :}}", "Syntax error for {^{mytag ... :}}"); + equal(compileTmpl("{{if foo?bar:baz}}{{/if}}"), "compiled", "No syntax error for {{tag foo?bar:baz}}"); }); QUnit.module("{{if}}"); @@ -590,7 +593,7 @@ test("{{*}}", function() { // ................................ Act .................................. tmpl = $.templates({ - markup: "_{{*:glob.a}}_", + markup: "_{{*:glob.a}}_" }); result = "" + !!tmpl.allowCode + ":" + tmpl(); @@ -605,7 +608,7 @@ test("{{*}}", function() { // ................................ Act .................................. $.templates("myTmpl", { - markup: "_{{*:glob.a}}_", + markup: "_{{*:glob.a}}_" }); tmpl = $.templates.myTmpl; @@ -1741,7 +1744,7 @@ test('{{include}} and wrapping content', function() { {number: "Ph0", alt: "Alt0"}, {number: "Ph1", alt: "Alt1"}, {number: "Ph2", alt: "Alt2"} - ], + ] }]; result = $.templates({ diff --git a/test/unit-tests/tests-jsviews.js b/test/unit-tests/tests-jsviews.js index 510d709..83e6120 100644 --- a/test/unit-tests/tests-jsviews.js +++ b/test/unit-tests/tests-jsviews.js @@ -3048,341 +3048,309 @@ test('data-link="{cvt:expression:cvtBack}"', function() { person1.lastName = "One"; // reset Prop }); -test('data-link="{for...}"', function() { +test('2-way binding', function() { // =============================== Arrange =============================== + var tmpl = $.templates(''); - model.things = [{ thing: "box" }]; // reset Prop - - var tmpl = $.templates(''); - $.templates("inner", "{^{:thing}}", tmpl); + var model = { + selected: "Jim", + people: [ + { name: "Bob" }, + { name: "Jim" } + ] + }, + newName = "new"; + // ............................... Act ................................. tmpl.link("#result", model); - // ................................ Act .................................. - before = $("#result").text(); - $.observable(model.things).insert(0, { thing: "tree" }); - after = $("#result").text(); + result = $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - // ............................... Assert ................................. - equal(before + "|" + after, 'box|treebox', - 'data-link="{for things}" binds to array changes on leaf array.'); + + $.observable(model.people).insert({ + name: newName + }); - // ................................ Act .................................. - $.observable(model).setProperty({ things: [{ thing: "triangle" }, { thing: "circle" }] }); - after = $("#result").text(); + $.observable(model).setProperty("selected", newName); - // ............................... Assert ................................. - equal(after, 'trianglecircle', - 'data-link="{for things}" binds to property change on path'); + result += $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - // ................................ Act .................................. - $.observable(model).setProperty({ things: { thing: "square" } }); - after = $("#result").text(); + $.observable(model.people).remove(2); - // ............................... Assert ................................. - equal(after, 'square', - 'data-link="{for things}" binds to property change on path - swapping from array to singleton object'); + result += $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - // ................................ Act .................................. - $.observable(model.things).setProperty("thing", "square2"); - after = $("#result").text(); + $("#result select").val('Jim').change(); + + result += model.selected + $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; // ............................... Assert ................................. - equal(after, 'square2', - 'data-link="{for things tmpl=...}" supports live binding within the template content'); + equal(result, "Jim-1|new-2|Bob-0|JimJim-1|", + '{^{for people}}{{/for}}'); - tmpl = $.templates(''); - $.templates({ - inner: "{^{:thing}}", - empty: "{^{:emptyText}}" - }, tmpl); + model = { + selected: "Jim", + people: [ + { name: "Bob" }, + { name: "Jim" } + ] + }; + // ............................... Act ................................. tmpl.link("#result", model); - // ................................ Act .................................. - before = $("#result").text(); - $.observable(model.things).insert(0, { thing: "tree" }); - after = $("#result").text(); + result = $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - // ............................... Assert ................................. - equal(before + "|" + after, 'box|treebox', - 'data-link="{for things}{else ...}" binds to array changes on leaf array.'); + $.observable(model.people).insert({ + name: newName + }); - // ................................ Act .................................. - before = $("#result").text(); - $.observable(model.things).remove(0, 2); - after = $("#result").text(); + $.observable(model).setProperty("selected", newName); - // ............................... Assert ................................. - equal(before + "|" + after, 'treebox|None', - 'data-link="{for things}{else ...}" renders {{else}} block when array is emptied'); + result += $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - // ................................ Act .................................. - $.observable(model).setProperty({ things: [{ thing: "triangle" }, { thing: "circle" }] }); - after = $("#result").text(); + $.observable(model.people).remove(2); - // ............................... Assert ................................. - equal(after, 'trianglecircle', - 'data-link="{for things}{else ...}" binds to property change on path'); + result += $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - // ................................ Act .................................. - $.observable(model).setProperty({ things: { thing: "square" } }); - after = $("#result").text(); + $("#result select").val('Jim').change(); + + result += model.selected + $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; // ............................... Assert ................................. - equal(after, 'square', - 'data-link="{for things}{else ...}" binds to property change on path - swapping from array to singleton object'); + equal(result, "JIM-1|NEW-2|BOB-0|JimJIM-1|", + '{^{for people}}{{/for}}'); - // ................................ Act .................................. - $.observable(model).removeProperty("things"); - after = $("#result").text(); + model = { + selected: "Jim", + people: [ + { name: "Bob" }, + { name: "Jim" } + ] + }; - // ............................... Assert ................................. - equal(after, 'None', - 'data-link="{for things tmpl=...}{else tmpl=...}" binds to removeProperty change on path - and renders {{else}} block'); + // ............................... Act ................................. + tmpl.link("#result", model); - // ................................ Act .................................. - $.observable(model).setProperty("emptyText", "No things"); - after = $("#result").text(); + result = $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - // ............................... Assert ................................. - equal(after, 'No things', - 'data-link="{for things tmpl=...}{else tmpl=...}" supports live binding within the {else} template content'); + $.observable(model.people).insert({ + name: newName + }); - // =============================== Arrange =============================== + $.observable(model).setProperty("selected", newName); - model.things = [{ thing: "box" }]; // reset Prop + result += $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - tmpl = $.templates(''); - $.templates("inner", "{{:thing}}", tmpl); + $.observable(model.people).remove(2); - tmpl.link("#result", model); + result += $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - // ................................ Act .................................. - var elem = $("#result span")[0]; - before = elem.title; - $.observable(model.things).insert(0, { thing: "tree" }); - after = elem.title; + $("#result select").val('Jim').change(); + + result += model.selected + $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; // ............................... Assert ................................. - equal(before + "|" + after, 'box|treebox', - 'data-link="title{for things}{else ...}" binds to array changes on leaf array.'); + equal(result, "Jim-1|new-2|Bob-0|JimJim-1|", + '{^{for people}}{{/for}}'); - // ................................ Act .................................. - $.observable(model).setProperty({ things: [{ thing: "triangle" }, { thing: "circle" }] }); - after = elem.title; + model = { + selected: "Jim", + people: [ + { name: "Bob" }, + { name: "Jim" } + ] + }; - // ............................... Assert ................................. - equal(after, 'trianglecircle', - 'data-link="title{for things}{else ...} binds to property change on path'); + // ............................... Act ................................. + tmpl.link("#result", model); - // ................................ Act .................................. - $.observable(model).setProperty({ things: { thing: "square" } }); - after = elem.title; + result = $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - // ............................... Assert ................................. - equal(after, 'square', - 'data-link="title{for things}{else ...} binds to property change on path - swapping from array to singleton object'); + $.observable(model.people).insert({ + name: newName + }); - // ................................ Act .................................. - $.observable(model.things).setProperty("thing", "square2"); - after = elem.title; + $.observable(model).setProperty("selected", newName); - // ............................... Assert ................................. - equal(after, 'square', - 'data-link="title{for things tmpl=...}{else ...}" Non html targets (e.g. title) do not support live binding within the {for} template content'); + result += $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - // ................................ Act .................................. - $.observable(model).removeProperty("things"); - after = elem.title; + $.observable(model.people).remove(2); - // ............................... Assert ................................. - equal(after, 'None', - 'data-link="title{for things}{else ...}" binds to removeProperty change on path - and renders {{else}} block'); + result += $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - // ................................ Act .................................. - $.observable(model.things).setProperty("emptyText", "No things"); - after = elem.title; + $("#result select").val('Jim').change(); - // ............................... Assert ................................. - equal(after, 'None', - 'data-link="title{for things tmpl=...}{else tmpl=...}" Non html targets (e.g. title) do not support live binding within the {else} template content'); + result += model.selected + $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - // =============================== Arrange =============================== + // ............................... Assert ................................. + equal(result, "JIM-1|NEW-2|BOB-0|JimJIM-1|", + '{^{for people}}{{/for}}'); - $.templates("inner", "{{test:thing}}", tmpl); - $.views.converters("test", function(val) { - return val + countItems++; - }, tmpl); + model = { + selected: "Jim", + people: [ + { name: "Bob" }, + { name: "Jim" } + ] + }; + // ............................... Act ................................. tmpl.link("#result", model); - // ................................ Act .................................. - before = $("#result").text(); - $.observable(model.things).insert([{ thing: "addedA" }, { thing: "addedB" }]); - after = $("#result").text(); + result = $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - // ............................... Assert ................................. - equal(before + "|" + after, 'box0|box0addedA1addedB2', - 'data-link="{for things}" binds to array changes and the changes are rendered incrementally'); + $.observable(model.people).insert({ + name: newName + }); - // =============================== Arrange =============================== + $.observable(model).setProperty("selected", newName); - model.things = [{ thing: "box" }]; // reset Prop - countItems = 0; + result += $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - tmpl = $.templates('
    '); + $.observable(model.people).remove(2); - $.templates("inner", "
  • {{test:thing}}
  • ", tmpl); - $.views.converters("test", function(val) { - return val + countItems++; - }, tmpl); + result += $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - tmpl.link("#result", model); + $("#result select").val('Jim').change(); - // ................................ Act .................................. - before = $("#result").text(); - $.observable(model.things).insert([{ thing: "addedA" }, { thing: "addedB" }]); - after = $("#result").text(); + result += model.selected + $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; // ............................... Assert ................................. - equal(before + "|" + after, 'box0|box0addedA1addedB2', - 'data-link="{for things}" in elCnt binds to array changes and the changes are rendered incrementally'); + equal(result, "JIM-1|NEW-2|BOB-0|JimJIM-1|", + '{^{for people}}{{/for}}'); - var data = { - format: 1, - first: "Jo", - last: "Sanders" + model = { + selected: ["Jim","Bob"], + people: [ + { name: "Bob" }, + { name: "Jim" } + ] }; - var tmpl = $.templates( - '' - + '{^{if format===1 tmpl=\'format1\'}}{{else format===2 tmpl=\'format2\'}}{{else tmpl=\'format3\'}}{{/if}}'); + // ............................... Act ................................. + tmpl.link("#result", model); - $.templates({ - format1: "{^{:first}} {^{:last}}", - format2: "{^{:last}} {^{:first}}", - format3: "{^{:last}} ({^{:first}})" - }, tmpl); + result = $("#result select")[0].multiple + $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - tmpl.link("#result", data); + $.observable(model.people).insert({ + name: newName + }); - var element1 = $($("#result span")[0]); - var element2 = $($("#result span")[1]); + $.observable(model).setProperty("selected", [newName, "Bob"]); - // ................................ Act .................................. - var res = element1.text() + "/" + element2.text(); + result += $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - $.observable(data).setProperty("format", 2); - res += "|" + element1.text() + "/" + element2.text(); + $.observable(model.people).remove(2); - $.observable(data).setProperty("format", 3); - res += "|" + element1.text() + "/" + element2.text(); + result += $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; + + $.observable(model.people).insert([ + { + name: "Pete" + }, + { + name: "Jo" + } + ]); - $.observable(data).setProperty("format", 1); - res += "|" + element1.text() + "/" + element2.text(); + $("#result select").val(['Jo']).change(); - $.observable(data).setProperty("first", "Jo2"); - res += "|" + element1.text() + "/" + element2.text(); + result += model.selected + $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; - $.observable(data).setProperty("last", "Sanders2"); - res += "|" + element1.text() + "/" + element2.text(); + $("#result select").val([]).change(); + + result += model.selected + $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; + + $("#result select").val(["Bob", "Pete", "Jim"]).change(); + + result += model.selected + $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; + + $.observable(model).setProperty("selected", "Bob"); + + result += $("#result select")[0].multiple + $("#result select option:selected").text() + "-" + $("#result select")[0].selectedIndex + "|"; // ............................... Assert ................................. - equal(res, isIE8 - ? "Jo Sanders/Jo Sanders|Sanders Jo/Sanders Jo|Sanders (Jo)/Sanders (Jo)|Jo Sanders/Jo Sanders|Jo2 Sanders/Jo2 Sanders|Jo2Sanders2/Jo2Sanders2" - : "Jo Sanders/Jo Sanders|Sanders Jo/Sanders Jo|Sanders (Jo)/Sanders (Jo)|Jo Sanders/Jo Sanders|Jo2 Sanders/Jo2 Sanders|Jo2 Sanders2/Jo2 Sanders2", - ' is equivalent to {^{if expr ...}}{{else expr2...}}{{else ...}}{{/if}}'); + equal(result, "trueBOBJIM-0|BOBNEW-0|BOB-0|JoJO-3|--1|Bob,Jim,PeteBOBJIMPETE-0|trueBOB-0|", + 'Multiselect with {^{for people}}{{/for}}'); + + model = { + selected: "J", + people: [ + { name: "Bob", id: "B" }, + { name: "Noone", id: "" }, + { name: "Jim", id: "J" } + ] }; - tmpl = $.templates( - ''); + // ............................... Act ................................. + tmpl.link("#result", model); - $.templates({ - format1: "{^{:first}} {^{:last}}", - format2: "{^{:last}} {^{:first}}", - format3: "{^{:last}} ({^{:first}})" - }, tmpl); + result = $("#result select")[0].multiple + $("#result select option:selected").text() + ":" + $("#result select")[0].selectedIndex + "|"; - tmpl.link("#result", data); + $.observable(model).setProperty("selected", ["", "J"]); - element1 = $("#result span")[0]; + result += $("#result select option:selected").text() + ":" + $("#result select")[0].selectedIndex + "|"; - // ................................ Act .................................. - res = element1.title; + $.observable(model).setProperty("selected", "B"); - $.observable(data).setProperty("format", 2); - res += "|" + element1.title; + result += $("#result select option:selected").text() + ":" + $("#result select")[0].selectedIndex + "|"; - $.observable(data).setProperty("format", 3); - res += "|" + element1.title; + $.observable(model).setProperty("selected", []); - $.observable(data).setProperty("format", 1); - res += "|" + element1.title; + result += $("#result select option:selected").text() + ":" + $("#result select")[0].selectedIndex + "|"; - // ............................... Assert ................................. - equal(res, "Jo Sanders|Sanders Jo|Sanders (Jo)|Jo Sanders", - ' binds and updates correctly when expr and expr2 change'); + $.observable(model).setProperty("selected", ""); - // ................................ Act .................................. - res = element1.title; + result += $("#result select option:selected").text() + ":" + $("#result select")[0].selectedIndex + "|"; - $.observable(data).setProperty("first", "Jo2"); - res += "|" + element1.title; + $.observable(model).setProperty("selected", ["J"]); - $.observable(data).setProperty("last", "Sanders2"); - res += "|" + element1.title; + result += $("#result select option:selected").text() + ":" + $("#result select")[0].selectedIndex + "|"; + + $.observable(model).setProperty("selected", null); + + result += $("#result select")[0].multiple + $("#result select option:selected").text() + ":" + $("#result select")[0].selectedIndex + "|"; // ............................... Assert ................................. - equal(res, "Jo Sanders|Jo Sanders|Jo Sanders", - 'data-link="title{if expr tmpl=...}{else expr2 tmpl=...}...": Non html targets (e.g. title) do not support live binding within the {if} and {else} template content'); + equal(result, "trueJim:2|NooneJim:1|Bob:0|:-1|Noone:1|Jim:2|trueNoone:1|", + 'Multiselect with