-
Notifications
You must be signed in to change notification settings - Fork 130
/
Copy pathjquery.views.min.js.map
1 lines (1 loc) · 177 KB
/
jquery.views.min.js.map
1
{"version":3,"sources":["jquery.views.js"],"names":["factory","global","$","jQuery","exports","module","define","amd","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","onRenderError","Function","props","args","$sub","getTargetVal","onUpdate","mergeCtxs","NONE","callAfterLink","observeAndBind","onUnbind","tagCtx","ctx","tagName","_cnvt","_tag","tmpl","TRUE","addLinkMethods","updateContent","_noUpd","currentValue","css","$target","error","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","unlinked","_elCnt","_prv","_nxt","currentStyle","getComputedStyle","display","_jsvd","displayStyles","document","createElement","body","appendChild","removeChild","$isArray","HTML","inline","nodes","transferViewTokens","_tgId","indexOf","length","disposeTokens","previousSibling","lastChild","remove","link","lazyLink","empty","children","textContent","innerText","selected","inArray","arrayChangeHandler","self","action","index","items","srt","refresh","addViews","removeViews","oldIndex","fixIndex","setArrayChangeLink","handler","arrayBinding","bound","bnd","useKey","bndArr","off","arrayChangeStr","arrVws","apply","arguments","on","linkGetVal","toLowerCase","$subSettingsAdvanced","_fe","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","flow","setAttribute","jsvAttrStr","getAttribute","_jsvLkEl","tmplLink","noIteration","parentView","$link","tmplOrLinkExpr","jquery","activeBody","elementChangeStr","i","k","vwInfos","placeholderParent","targetEl","topLevelCall","onRender","replaceMode","$view","topView","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","token","nextView","node","depth","fragment","copiedNode","firstTag","wrapper","div","htmlTag","thisId","onAfterCreateStr","Deferred","name","noValidate","markPrevOrNextNode","namespaceURI","rFirstElem","replace","rConvertMarkers","safeFragment","wrapMap","createDocumentFragment","firstChild","insertBefore","setTimeout","linkMarkup","currentView","boundTagId","tagExpr","rTagIndex","hasElse","lastIndex","linkExpressions","bindDataLinkTarget","normalizeLinkTag","rTagDatalink","delimCloseChar1","delimOpenChar0","delimOpenChar1","delimCloseChar0","isLk","links","tmplFn","noArray","View","extendCtx","getContextCb","str","substr","SCRIPT","nodeType","isVal","rBinding","getInfos","close","elPath","infos","rMarkerTokens","removeAttribute","marker","twoway","trim","rEscapeQuotes","$linkedElem","val","linkedTag","linkedElement","contents","first","onBind","onAfterLink","targetTag","noVal","cvtArgs","setSize","height","width","title","hasClass","removeClass","addClass","asyncElemChangeHandler","bindElChange","$elem","trig","onoff","bindto","pathIndex","lastPath","bindtoOb","newTrig","oldTrig","totry","paths","_jsvTr","trigger","$subSettings","_jsvto","split","_cp","newCtxs","newTagCtx","tagCtxs","_ths","clean","elemArray","linkedElemTag","objId","object","obsId","map","cbId","propertyChangeStr","unmap","onDispose","s","$unlink","each","innerView","getElementsByTagName","helper","last","nextPath","splice","rViewPath","inputAttrib","viewOrTagChar","viewOrTag","viewId","precedingLength","emptyView","vwItem","rOpenMarkers","tagOrView","isTag","select","filtered","filter","add","find","withMarkers","prevIsFirstNode","lastSibling","childTags","disposed","update","domChange","hasListener","hasData","_data","events","domChangeNotification","triggerHandler","dataItems","viewsCount","itemsCount","keepNodes","isMove","removeView","viewToRemove","current","isArray","sort","fromIndex","observeProps","tgt","insert","observeMappedProps","item","src","removeProperty","shallowArrayFilter","allPath","setGlobals","jsrender","requiresStr","sub","_jq","$observe","$views","linkChar","$viewsSettings","settings","extend","isFunction","$converters","expando","converters","$tags","advanced","propChng","arrChng","syntaxErr","_err","oldAdvSet","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","ret","delimChars","RegExp","rTag","addSetting","merge","regularExpression","toggle","init","content","_hi","rTmpl","activeElem","contextOb","_sel","_evs","_hlr","concat","dataBoundOnly","arrayView","targetLength","noVws","done","arrHandler","arrBinding","arrayBindings","_ars","tagCt","newTagCtxs","tci","prevArg","different","baseTag","dataMap","getTgt","obsSrc","obsTgt","tgtFlt","inner","getInnerView","nd","isVl","unlink","oldFn","result","0","getCtx","paramVal","linked","_ceo","cloneExprObjects","obs","ob","clones","prm","advSet","linkAttr","_wm","option","caption","th","td","useViews","legend","support","htmlSerialize","textarea","window"],"mappings":"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","file":"jquery.views.min.js","sourcesContent":["/*! jquery.views.js v0.9.81 (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 2016, Boris Moore\n * Released under the MIT License.\n */\n\n//jshint -W018, -W041\n\n(function(factory, global) {\n\t// global var is the this object, which is window when running in the usual browser environment\n\tvar $ = global.jQuery;\n\n\tif (typeof exports === \"object\") { // CommonJS e.g. Browserify\n\t\tmodule.exports = $\n\t\t\t? factory(global, $)\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(global, $);\n\t\t\t};\n\t} else if (typeof define === \"function\" && define.amd) { // AMD script loader, e.g. RequireJS\n\t\tdefine([\"jquery\", \"./jsrender\", \"./jquery.observable\"], function($, jsr, jso) {\n\t\t\treturn factory(global, $, jsr, jso);\n\t\t}); // Require jQuery, JsRender, JsObservable\n\t} else { // Browser using plain <script> tag\n\t\tfactory(global, false);\n\t}\n} (\n\n// factory (for jquery.views.js)\nfunction(global, $, jsr, jso) {\n\"use strict\";\n\n//========================== Top-level vars ==========================\n\n// global var is the this object, which is window when running in the usual browser environment\nvar setGlobals = $ === false; // Only set globals if script block in browser (not AMD and not CommonJS)\n\njsr = jsr || setGlobals && global.jsrender;\n$ = $ || global.jQuery;\n\nvar versionNumber = \"v0.9.81\",\n\trequiresStr = \"JsViews requires \";\n\nif (!$ || !$.fn) {\n\t// jQuery is not loaded.\n\tthrow requiresStr + \"jQuery\"; // We require jQuery\n}\n\nif (jsr && !jsr.fn) {\n\tjsr.views.sub._jq($); // map over from jsrender namespace to jQuery namespace\n}\n\nvar $observe, $observable,\n\t$isArray = $.isArray,\n\t$views = $.views;\n\nif (!$views || !$views.map) {\n\t\t// JsRender is not loaded.\n\tthrow requiresStr + \"JsRender\"; // jsrender.js must be loaded before JsViews and after jQuery\n}\n\nvar document = global.document,\n\t$viewsSettings = $views.settings,\n\t$sub = $views.sub,\n\t$subSettings = $sub.settings,\n\t$extend = $sub.extend,\n\t$isFunction = $.isFunction,\n\t$expando = $.expando,\n\t$converters = $views.converters,\n\t$tags = $views.tags,\n\t$subSettingsAdvanced = $subSettings.advanced,\n\n\t// These two settings can be overridden on settings after loading jsRender, and prior to loading jquery.observable.js and/or JsViews\n\tpropertyChangeStr = $sub.propChng = $sub.propChng || \"propertyChange\",\n\tarrayChangeStr = $sub.arrChng = $sub.arrChng || \"arrayChange\",\n\n\tHTML = \"html\",\n\tsyntaxError = $sub.syntaxErr,\n\trFirstElem = /<(?!script)(\\w+)[>\\s]/,\n\terror = $sub._er,\n\tonRenderError = $sub._err,\n\tdelimOpenChar0, delimOpenChar1, delimCloseChar0, delimCloseChar1, linkChar, topView,\n\trEscapeQuotes = /['\"\\\\]/g; // Escape quotes and \\ character\nif ($.link) { return $; } // JsViews is already loaded\n\n$subSettings.trigger = true;\nvar activeBody, rTagDatalink, $view, $viewsLinkAttr, linkViewsSel, wrapMap, viewStore, oldAdvSet,\n\tjsvAttrStr = \"data-jsv\",\n\telementChangeStr = \"change.jsv\",\n\tonBeforeChangeStr = \"onBeforeChange\",\n\tonAfterChangeStr = \"onAfterChange\",\n\tonAfterCreateStr = \"onAfterCreate\",\n\tCHECKED = \"checked\",\n\tCHECKBOX = \"checkbox\",\n\tRADIO = \"radio\",\n\tRADIOINPUT = \"input[type=radio]\",\n\tNONE = \"none\",\n\tSCRIPT = \"SCRIPT\",\n\tTRUE = \"true\",\n\tcloseScript = '\"></script>',\n\topenScript = '<script type=\"jsv',\n\tdeferAttr = jsvAttrStr + \"-df\",\n\tbindElsSel = \"script,[\" + jsvAttrStr + \"]\",\n\tfnSetters = {\n\t\tvalue: \"val\",\n\t\tinput: \"val\",\n\t\thtml: HTML,\n\t\ttext: \"text\"\n\t},\n\tvalueBinding = {from: \"value\", to: \"value\"},\n\tisCleanCall = 0,\n\toldCleanData = $.cleanData,\n\toldJsvDelimiters = $viewsSettings.delimiters,\n\tsafeFragment = document.createDocumentFragment(),\n\tqsa = document.querySelector,\n\n\t// elContent maps tagNames which have only element content, so may not support script nodes.\n\telContent = {ol: 1, ul: 1, table: 1, tbody: 1, thead: 1, tfoot: 1, tr: 1, colgroup: 1, dl: 1, select: 1, optgroup: 1, svg: 1, svg_ns: 1},\n\tbadParent = {tr: \"table\"},\n\tvoidElems = {br: 1, img: 1, input: 1, hr: 1, area: 1, base: 1, col: 1, link: 1, meta: 1,\n\t\tcommand: 1, embed: 1, keygen: 1, param: 1, source: 1, track: 1, wbr: 1},\n\tdisplayStyles = {},\n\tbindingStore = {},\n\tbindingKey = 1,\n\trViewPath = /^#(view\\.?)?/,\n\trConvertMarkers = /((\\/>)|<\\/(\\w+)>|)(\\s*)([#\\/]\\d+(?:_|(\\^)))`(\\s*)(<\\w+(?=[\\s\\/>]))?|\\s*(?:(<\\w+(?=[\\s\\/>]))|<\\/(\\w+)>(\\s*)|(\\/>)\\s*|(>)|$)/g,\n\trOpenViewMarkers = /(#)()(\\d+)(_)/g,\n\trOpenMarkers = /(#)()(\\d+)([_^])/g,\n\trViewMarkers = /(?:(#)|(\\/))(\\d+)(_)/g,\n\trOpenTagMarkers = /(#)()(\\d+)(\\^)/g,\n\trMarkerTokens = /(?:(#)|(\\/))(\\d+)([_^])([-+@\\d]+)?/g,\n\trSplitBindings = /&(\\d+)\\+?/g,\n\tgetComputedStyle = global.getComputedStyle;\n\n$observable = $.observable;\n\nif (!$observable) {\n\t// JsObservable is not loaded.\n\tthrow requiresStr + \"JsObservable\"; // jquery.observable.js must be loaded before JsViews\n}\n\n$observe = $observable.observe;\n\n//========================== Top-level functions ==========================\n\n//===============\n// Event handlers\n//===============\n\nfunction elemChangeHandler(ev, params, sourceValue) {\n\tvar setter, cancel, fromAttr, linkCtx, cvtBack, cnvtName, target, $source, view, binding, oldLinkCtx, onBeforeChange, onAfterChange, tag, to, eventArgs, exprOb,\n\t\tsource = ev.target,\n\t\tbindings = source._jsvBnd;\n\n\t// _jsvBnd is a string with the syntax: \"&bindingId1&bindingId2\"\n\tif (bindings) {\n\t\twhile (binding = rSplitBindings.exec(bindings)) {\n\t\t\tif (binding = bindingStore[binding[1]]) {\n\t\t\t\tif (to = binding.to) {\n\t\t\t\t\t// The binding has a 'to' field, which is of the form [[targetObject, toPath], cvtBack]\n\t\t\t\t\tlinkCtx = binding.linkCtx;\n\t\t\t\t\tview = linkCtx.view;\n\t\t\t\t\ttag = linkCtx.tag || view.tag;\n\t\t\t\t\t$source = $(source);\n\t\t\t\t\tonBeforeChange = view.hlp(onBeforeChangeStr); // TODO Can we optimize this and other instances of same?\n\t\t\t\t\tonAfterChange = view.hlp(onAfterChangeStr); // TODO Can we optimize this and other instances of same\n\t\t\t\t\tfromAttr = defaultAttr(source);\n\t\t\t\t\tsetter = fnSetters[fromAttr];\n\t\t\t\t\tif (sourceValue === undefined) {\n\t\t\t\t\t\tsourceValue = $isFunction(fromAttr)\n\t\t\t\t\t\t\t? fromAttr(source)\n\t\t\t\t\t\t\t: setter\n\t\t\t\t\t\t\t\t? $source[setter]()\n\t\t\t\t\t\t\t\t: $source.attr(fromAttr);\n\t\t\t\t\t}\n\t\t\t\t\tcnvtName = to[1];\n\t\t\t\t\tto = to[0]; // [object, path]\n\t\t\t\t\tto = to + \"\" === to ? [linkCtx.data, to] : to;\n\t\t\t\t\tif (cnvtName) {\n\t\t\t\t\t\tif ($isFunction(cnvtName)) {\n\t\t\t\t\t\t\tcvtBack = cnvtName;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcvtBack = view.getRsc(\"converters\", cnvtName);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (linkCtx.elem.nodeName === \"SELECT\") {\n\t\t\t\t\t\tlinkCtx.elem._jsvSel = sourceValue = sourceValue || (linkCtx.elem.multiple ? [] : sourceValue);\n\t\t\t\t\t\t// data-link <select> to string or (multiselect) array of strings\n\t\t\t\t\t}\n\t\t\t\t\tif (cvtBack) {\n\t\t\t\t\t\tsourceValue = cvtBack.call(tag, sourceValue);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set linkCtx on view, dynamically, just during this handler call\n\t\t\t\t\toldLinkCtx = view.linkCtx;\n\t\t\t\t\tview.linkCtx = linkCtx;\n\t\t\t\t\teventArgs = {\n\t\t\t\t\t\tchange: \"change\",\n\t\t\t\t\t\toldValue: linkCtx._val,\n\t\t\t\t\t\tvalue: sourceValue\n\t\t\t\t\t};\n\t\t\t\t\tif ((!onBeforeChange || !(cancel = onBeforeChange.call(linkCtx, ev, eventArgs) === false)) &&\n\t\t\t\t\t\t\t(!tag || !tag.onBeforeChange || !(cancel = tag.onBeforeChange(ev, eventArgs) === false)) &&\n\t\t\t\t\t\t\tsourceValue !== undefined) {\n\t\t\t\t\t\ttarget = to[0]; // [object, path]\n\t\t\t\t\t\tif (sourceValue !== undefined && target) {\n\t\t\t\t\t\t\tif (target._jsv) {\n\t\t\t\t\t\t\t\texprOb = target;\n\t\t\t\t\t\t\t\ttarget = linkCtx.data;\n\t\t\t\t\t\t\t\twhile (exprOb && exprOb.sb) {\n\t\t\t\t\t\t\t\t\ttarget = linkCtx._ctxCb(exprOb, target);\n\t\t\t\t\t\t\t\t\texprOb = exprOb.sb;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (tag) {\n\t\t\t\t\t\t\t\ttag._.chging = true; // marker to prevent tag change event triggering its own refresh\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$observable(target).setProperty(to[1], sourceValue); // 2way binding change event - observably updating bound object\n\t\t\t\t\t\t\tif (onAfterChange) {\n\t\t\t\t\t\t\t\tonAfterChange.call(linkCtx, ev, eventArgs);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (tag) {\n\t\t\t\t\t\t\t\tif (tag.onAfterChange) {\n\t\t\t\t\t\t\t\t\ttag.onAfterChange(ev, eventArgs);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttag._.chging = undefined; // clear the marker\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlinkCtx._val = sourceValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tview.linkCtx = oldLinkCtx;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propertyChangeHandler(ev, eventArgs, linkFn) {\n\tvar attr, sourceValue, noUpdate, forceUpdate, hasError, onError,\n\t\tlinkCtx = this,\n\t\ttag = linkCtx.tag,\n\t\tsource = linkCtx.data,\n\t\ttarget = linkCtx.elem,\n\t\tcvt = linkCtx.convert,\n\t\tparentElem = target.parentNode,\n\t\tview = linkCtx.view,\n\t\toldLinkCtx = view.linkCtx,\n\t\tonEvent = view.hlp(onBeforeChangeStr);\n\n\t// Set linkCtx on view, dynamically, just during this handler call\n\tview.linkCtx = linkCtx;\n\n\tif (parentElem && (!onEvent || !(eventArgs && onEvent.call(linkCtx, ev, eventArgs) === false))\n\t\t\t// If data changed, the ev.data is set to be the path. Use that to filter the handler action...\n\t\t\t&& !(eventArgs && ev.data.prop !== \"*\" && ev.data.prop !== eventArgs.path)) {\n\n\t\tif (eventArgs) {\n\t\t\tlinkCtx.eventArgs = eventArgs;\n\t\t}\n\t\tif (eventArgs || linkCtx._toLk) {\n\t\t\t// If eventArgs are defined, this is a data update\n\t\t\t// Otherwise this is the initial data-link rendering call. Bind on this the first time it get called\n\t\t\tlinkCtx._toLk = 0; // Remove flag to skip unneccessary rebinding next time\n\t\t\tif (linkFn._er) {\n\t\t\t\t// data-link=\"exprUsingTagOrCvt with onerror=...\" - e.g. {tag ... {cvt:... {:... convert='cvt'\n\t\t\t\ttry {\n\t\t\t\t\tsourceValue = linkFn(source, view);\n\t\t\t\t} catch (e) {\n\t\t\t\t\thasError = linkFn._er;\n\t\t\t\t\tonError = onRenderError(e,view,(new Function(\"data,view\", \"return \" + hasError + \";\"))(source, view));\n\t\t\t\t\tsourceValue = [{props: {}, args: [onError]}];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsourceValue = linkFn(source, view, $sub);\n\t\t\t}\n\t\t\t// Compiled link expression for linkTag: return value for data-link=\"{:xxx}\" with no cvt or cvtBk, otherwise tagCtx or tagCtxs\n\n\t\t\tattr = getTargetVal(sourceValue, linkCtx, tag = linkCtx.tag,\n\t\t\t\t\tlinkCtx.attr || defaultAttr(target, true, cvt !== undefined)\n\t\t\t\t);\n\n\t\t\tif (tag) {\n\t\t\t\t// Existing tag instance\n\t\t\t\tforceUpdate = hasError || tag._er;\n\t\t\t\t// If the new tagCtxs hasError or the previous tagCtxs had error, then force update\n\t\t\t\tsourceValue = sourceValue[0] ? sourceValue : [sourceValue];\n\t\t\t\tnoUpdate = !forceUpdate && eventArgs && tag.onUpdate && tag.onUpdate(ev, eventArgs, sourceValue) === false;\n\n\t\t\t\tmergeCtxs(tag, sourceValue, forceUpdate);\n\n\t\t\t\tif (noUpdate || attr === NONE) {\n\t\t\t\t\t// onUpdate returned false, or attr === \"none\", or this is an update coming from the tag's own change event\n\t\t\t\t\t// - so don't refresh the tag: we just use the new tagCtxs merged from the sourceValue,\n\t\t\t\t\t// (which may optionally have been modifed in onUpdate()...) and then bind, and we are done\n\t\t\t\t\tcallAfterLink(tag, ev, eventArgs);\n\t\t\t\t\tobserveAndBind(linkCtx, source, target);\n\t\t\t\t\tview.linkCtx = oldLinkCtx;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (tag._.chging) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (tag.onUnbind) {\n\t\t\t\t\ttag.onUnbind(tag.tagCtx, linkCtx, tag.ctx, ev, eventArgs);\n\t\t\t\t}\n\n\t\t\t\tsourceValue = tag.tagName === \":\" // Call convertVal if it is a {{cvt:...}} - otherwise call renderTag\n\t\t\t\t\t? $sub._cnvt(tag.cvt, view, sourceValue[0])\n\t\t\t\t\t: $sub._tag(tag, view, view.tmpl, sourceValue, true, onError);\n\t\t\t} else if (linkFn._tag) {\n\t\t\t\t// For {{: ...}} without a convert or convertBack, we already have the sourceValue, and we are done\n\t\t\t\t// For {{: ...}} with either cvt or cvtBack we call convertVal to get the sourceValue and instantiate the tag\n\t\t\t\t// If cvt is undefined then this is a tag, and we call renderTag to get the rendered content and instantiate the tag\n\t\t\t\tcvt = cvt === \"\" ? TRUE : cvt; // If there is a cvtBack but no cvt, set cvt to \"true\"\n\t\t\t\tsourceValue = cvt // Call convertVal if it is a {{cvt:...}} - otherwise call renderTag\n\t\t\t\t\t? $sub._cnvt(cvt, view, sourceValue[0] || sourceValue) // convertVal\n\t\t\t\t\t: $sub._tag(linkFn._tag, view, view.tmpl, sourceValue, true, onError); // renderTag\n\n\t\t\t\taddLinkMethods(tag = linkCtx.tag, true); // In both convertVal and renderTag we have instantiated a tag\n\t\t\t\tattr = linkCtx.attr || attr; // linkCtx.attr may have been set to tag.attr during tag instantiation in renderTag\n\t\t\t}\n\n\t\t\tif (updateContent(sourceValue, linkCtx, attr, tag)\n\t\t\t\t\t&& eventArgs\n\t\t\t\t\t&& (onEvent = view.hlp(onAfterChangeStr))) {\n\t\t\t\tonEvent.call(linkCtx, ev, eventArgs);\n\t\t\t}\n\t\t\tlinkCtx._noUpd = 0; // For data-link=\"^{...}\" remove _noUpd flag so updates on subsequent calls\n\n\t\t\tif (tag) {\n\t\t\t\ttag._er = hasError;\n\t\t\t\tcallAfterLink(tag, ev, eventArgs);\n\t\t\t}\n\t\t}\n\n\t\tobserveAndBind(linkCtx, source, target);\n\n\t\t// Remove dynamically added linkCtx from view\n\t\tview.linkCtx = oldLinkCtx;\n\t}\n}\n\nfunction getTargetVal(sourceValue, linkCtx, tag, attr) {\n\tvar currentValue, setter, css, $target,\n\t\ttarget = tag && tag.parentElem || linkCtx.elem;\n\n\tif (sourceValue !== undefined) {\n\t\t$target = $(target);\n\t\tattr = tag && tag.attr || attr;\n\t\tif ($isFunction(sourceValue)) {\n\t\t\terror(linkCtx.expr + \": missing parens\");\n\t\t}\n\n\t\tif (css = /^css-/.test(attr) && attr.slice(4)) {\n\t\t\tcurrentValue = $.style(target, css);\n\t\t\tif (+sourceValue === sourceValue) {\n\t\t\t\t// Optimization for perf on integer values - e.g. css-width{:width+'px'}\n\t\t\t\tcurrentValue = parseInt(currentValue);\n\t\t\t}\n\t\t} else if (attr !== \"link\") { // attr === \"link\" is for tag controls which do data binding but have no rendered output or target\n\t\t\tif (attr === \"value\") {\n\t\t\t\tif (target.type === CHECKBOX) {\n\t\t\t\t\tcurrentValue = $target.prop(attr = CHECKED);\n\t\t\t\t}\n\t\t\t} else if (attr === RADIO) {\n\t\t\t\tif (target.value === (\"\" + sourceValue)) {\n\t\t\t\t\tcurrentValue = $target.prop(CHECKED);\n\t\t\t\t} else {\n\t\t\t\t\treturn attr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (currentValue === undefined) {\n\t\t\t\tsetter = fnSetters[attr];\n\t\t\t\tcurrentValue = setter ? $target[setter]() : $target.attr(attr);\n\t\t\t}\n\t\t}\n\t\tlinkCtx._val = currentValue;\n\t}\n\treturn attr;\n}\n\nfunction setDefer(elem, value) {\n\telem._df = value; // Use both an expando and an attribute to track defered tokens. Attribute is needed for querySelectorAll for getViewInfos (childTags)\n\telem[(value ? \"set\" : \"remove\") + \"Attribute\"](deferAttr, \"\");\n}\n\nfunction updateContent(sourceValue, linkCtx, attr, tag) {\n\t// When called for a tag, either in tag.refresh() or propertyChangeHandler(), returns a promise (and supports async)\n\t// When called (in propertyChangeHandler) for target HTML returns true\n\t// When called (in propertyChangeHandler) for other targets returns boolean for \"changed\"\n\tvar setter, prevNode, nextNode, promise, nodesToRemove, useProp, tokens, id, openIndex, closeIndex, testElem, nodeName, cStyle, jsvSel,\n\t\trenders = attr !== NONE && sourceValue !== undefined && !linkCtx._noUpd, // For data-link=\"^{...}\", don't update the first time (no initial render) - e.g. to leave server rendered values.\n\t\tsource = linkCtx.data,\n\t\ttarget = tag && tag.parentElem || linkCtx.elem,\n\t\ttargetParent = target.parentNode,\n\t\t$target = $(target),\n\t\tview = linkCtx.view,\n\t\ttargetVal = linkCtx._val,\n\t\toldLinkCtx = view.linkCtx,\n\t\t// If not a tag we can use the ._val obtained from getTargetVal()\n\t\t// and only update when the new value (sourceValue) has changed from the previous one\n\t\tchange = tag;\n\n\tif (tag) {\n\t\t// Initialize the tag with element references\n\t\ttag._.unlinked = true; // Set to unlinked, so initialization is triggered after re-rendering, e.g. for setting linkedElem, and calling onBind\n\t\ttag.parentElem = tag.parentElem || (linkCtx.expr || tag._elCnt) ? target : targetParent;\n\t\tprevNode = tag._prv;\n\t\tnextNode = tag._nxt;\n\t}\n\tif (!renders) {\n\t\treturn;\n\t}\n\n\tif (attr === \"visible\") {\n\t\tattr = \"css-display\";\n\t}\n\tif (/^css-/.test(attr)) {\n\t\tif (linkCtx.attr === \"visible\") {\n\t\t\t// Get the current display style\n\t\t\tcStyle = (target.currentStyle || getComputedStyle.call(global, target, \"\")).display;\n\n\t\t\tif (sourceValue) {\n\t\t\t\t// We are showing the element.\n\t\t\t\t// Get the cached 'visible' display value from the -jsvd expando\n\t\t\t\tsourceValue = target._jsvd\n\t\t\t\t\t// Or, if not yet cached, get the current display value\n\t\t\t\t\t|| cStyle;\n\t\t\t\tif (sourceValue === NONE && !(sourceValue = displayStyles[nodeName = target.nodeName])) {\n\t\t\t\t\t// Currently display value is 'none', and the 'visible' style has not been cached.\n\t\t\t\t\t// We create an element to find the correct 'visible' display style for this nodeName\n\t\t\t\t\ttestElem = document.createElement(nodeName);\n\t\t\t\t\tdocument.body.appendChild(testElem);\n\n\t\t\t\t\t// Get the default style for this HTML tag to use as 'visible' style\n\t\t\t\t\tsourceValue\n\t\t\t\t\t\t// and cache it as a hash against nodeName\n\t\t\t\t\t\t= displayStyles[nodeName]\n\t\t\t\t\t\t= (testElem.currentStyle || getComputedStyle.call(global, testElem, \"\")).display;\n\t\t\t\t\tdocument.body.removeChild(testElem);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We are hiding the element.\n\t\t\t\t// Cache the current display value as 'visible' style, on _jsvd expando, for when we show the element again\n\t\t\t\ttarget._jsvd = cStyle;\n\t\t\t\tsourceValue = NONE; // Hide the element\n\t\t\t}\n\t\t}\n\t\tif (change = change || targetVal !== sourceValue) {\n\t\t\t$.style(target, attr.slice(4), sourceValue);\n\t\t}\n\t} else if (attr !== \"link\") { // attr === \"link\" is for tag controls which do data binding but have no rendered output or target\n\t\tif (/^data-/.test(attr)) {\n\t\t\t$.data(target, attr.slice(5), sourceValue); // Support for binding to data attributes: data-foo{:expr}: data-foo attribute will be\n\t\t\t// expr.toString(), but $.data(element, \"foo\") and $(element).data(\"foo\") will actually return value of expr, even if of type object\n\t\t}\n\t\tif (attr === CHECKED) {\n\t\t\tuseProp = true;\n\t\t\tsourceValue = sourceValue && sourceValue !== \"false\";\n\t\t\t// The string value \"false\" can occur with data-link=\"checked{attr:expr}\" - as a result of attr, and hence using convertVal()\n\t\t\t// We will set the \"checked\" property\n\t\t\t// We will compare this with the current value\n\t\t} else if (attr === RADIO) {\n\t\t\t// This is a special binding attribute for radio buttons, which corresponds to the default 'to' binding.\n\t\t\t// This allows binding both to value (for each input) and to the default checked radio button (for each input in named group,\n\t\t\t// e.g. binding to parent data).\n\t\t\t// Place value binding first: <input type=\"radio\" data-link=\"value{:name} {:#get('data').data.currency:} \" .../>\n\t\t\t// or (allowing any order for the binding expressions):\n\t\t\t// <input type=\"radio\" value=\"{{:name}}\" data-link=\"{:#get('data').data.currency:} value^{:name}\" .../>\n\n\t\t\tif (target.value === (\"\" + sourceValue)) {\n\t\t\t\t// If the data value corresponds to the value attribute of this radio button input, set the checked property to true\n\t\t\t\tsourceValue = useProp = true;\n\t\t\t\tattr = CHECKED;\n\t\t\t} else {\n\t\t\t\t// Otherwise, go straight to observeAndBind, without updating.\n\t\t\t\t// (The browser will remove the 'checked' attribute, when another radio button in the group is checked).\n\t\t\t\tobserveAndBind(linkCtx, source, target);\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else if (attr === \"selected\" || attr === \"disabled\" || attr === \"multiple\" || attr === \"readonly\") {\n\t\t\tsourceValue = (sourceValue && sourceValue !== \"false\") ? attr : null;\n\t\t\t// Use attr, not prop, so when the options (for example) are changed dynamically, but include the previously selected value,\n\t\t\t// they will still be selected after the change\n\t\t} else if (attr === \"value\" && target.nodeName === \"SELECT\") {\n\t\t\ttarget._jsvSel = $isArray(sourceValue)\n\t\t\t\t? sourceValue\n\t\t\t\t: \"\" + sourceValue; // If not array, coerce to string\n\t\t}\n\n\t\tif (setter = fnSetters[attr]) {\n\t\t\tif (attr === HTML) {\n\t\t\t\t// Set linkCtx on view, dynamically, just during this handler call\n\t\t\t\tview.linkCtx = linkCtx;\n\t\t\t\tif (tag && tag._.inline) {\n\t\t\t\t\tnodesToRemove = tag.nodes(true);\n\t\t\t\t\tif (tag._elCnt) {\n\t\t\t\t\t\tif (prevNode && prevNode !== nextNode) {\n\t\t\t\t\t\t\t// This prevNode will be removed from the DOM, so transfer the view tokens on prevNode to nextNode of this 'viewToRefresh'\n\t\t\t\t\t\t\ttransferViewTokens(prevNode, nextNode, target, tag._tgId, \"^\", true);\n\t\t\t\t\t\t} else if (tokens = target._df) { // This occurs when there is no nextNode, and so the target._df may include tokens referencing\n\t\t\t\t\t\t\t// view and tag bindings contained within the open and close tokens of the updated tag control. They need to be processed (disposed)\n\t\t\t\t\t\t\tid = tag._tgId + \"^\";\n\t\t\t\t\t\t\topenIndex = tokens.indexOf(\"#\" + id) + 1;\n\t\t\t\t\t\t\tcloseIndex = tokens.indexOf(\"/\" + id);\n\n\t\t\t\t\t\t\tif (openIndex && closeIndex > 0) {\n\t\t\t\t\t\t\t\topenIndex += id.length;\n\t\t\t\t\t\t\t\tif (closeIndex > openIndex) {\n\t\t\t\t\t\t\t\t\tsetDefer(target, tokens.slice(0, openIndex) + tokens.slice(closeIndex));\n\t\t\t\t\t\t\t\t\tdisposeTokens(tokens.slice(openIndex, closeIndex));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprevNode = prevNode\n\t\t\t\t\t\t\t? prevNode.previousSibling\n\t\t\t\t\t\t\t: nextNode\n\t\t\t\t\t\t\t\t? nextNode.previousSibling\n\t\t\t\t\t\t\t\t: target.lastChild;\n\t\t\t\t\t}\n\t\t\t\t\t// Remove HTML nodes\n\t\t\t\t\t$(nodesToRemove).remove(); // Note if !tag._elCnt removing the nodesToRemove will process and dispose view and tag bindings contained within the updated tag control\n\n\t\t\t\t\t// Insert and link new content\n\t\t\t\t\tpromise = view.link(view.data, target, prevNode, nextNode, sourceValue, tag && {tag: tag._tgId, lazyLink: tag.tagCtx.props.lazyLink});\n\t\t\t\t} else {\n\t\t\t\t\t// data-linked value targeting innerHTML: data-link=\"html{:expr}\" or contenteditable=\"true\"\n\t\t\t\t\trenders = renders && targetVal !== sourceValue;\n\t\t\t\t\tif (renders) {\n\t\t\t\t\t\t$target.empty();\n\t\t\t\t\t}\n\t\t\t\t\tif (renders) {\n\t\t\t\t\t\tpromise = view.link(source, target, prevNode, nextNode, sourceValue, tag && {tag: tag._tgId});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Remove dynamically added linkCtx and ctx from view\n\t\t\t\tview.linkCtx = oldLinkCtx;\n\t\t\t} else {\n\t\t\t\tif (change = change || targetVal !== sourceValue) {\n\t\t\t\t\tif (attr === \"text\" && target.children && !target.children[0]) {\n\t\t\t\t\t\t// This code is faster then $target.text()\n\t\t\t\t\t\tif (target.textContent !== undefined) {\n\t\t\t\t\t\t\ttarget.textContent = sourceValue;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttarget.innerText = sourceValue === null ? \"\" : sourceValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$target[setter](sourceValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ((jsvSel = targetParent._jsvSel)\n\t\t\t\t\t// Setting value of <option> element\n\t\t\t\t\t&& (attr === \"value\" || !$target.attr(\"value\"))) { // Setting value attribute, or setting textContent if attribute is null\n\t\t\t\t\t// Set/unselect selection based on value set on parent <select>. Works for multiselect too\n\t\t\t\t\ttarget.selected = $.inArray(\"\" + sourceValue, $isArray(jsvSel) ? jsvSel : [jsvSel]) > -1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (change = change || targetVal !== sourceValue) {\n\t\t\t// Setting an attribute to undefined should remove the attribute\n\t\t\t$target[useProp ? \"prop\" : \"attr\"](attr, sourceValue === undefined && !useProp ? null : sourceValue);\n\t\t}\n\t\tlinkCtx._val = sourceValue;\n\t}\n\treturn promise || change;\n}\n\nfunction arrayChangeHandler(ev, eventArgs) {\n\tvar self = this,\n\t\tonBeforeChange = self.hlp(onBeforeChangeStr),\n\t\tonAfterChange = self.hlp(onAfterChangeStr);\n\tif (!onBeforeChange || onBeforeChange.call(this, ev, eventArgs) !== false) {\n\t\tif (eventArgs) {\n\t\t\t// This is an observable action (not a trigger/handler call from pushValues, or similar, for which eventArgs will be null)\n\t\t\tvar action = eventArgs.change,\n\t\t\t\tindex = eventArgs.index,\n\t\t\t\titems = eventArgs.items;\n\t\t\tself._.srt = eventArgs.refresh; // true if part of a 'sort' on refresh\n\t\t\tswitch (action) {\n\t\t\t\tcase \"insert\":\n\t\t\t\t\tself.addViews(index, items);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"remove\":\n\t\t\t\t\tself.removeViews(index, items.length);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"move\":\n\t\t\t\t\tself.removeViews(eventArgs.oldIndex, items.length, undefined, true); // remove\n\t\t\t\t\tself.addViews(index, items); // re-insert\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"refresh\":\n\t\t\t\t\tself._.srt = undefined;\n\t\t\t\t\tself.fixIndex(0);\n\t\t\t\t\t// Other cases: (e.g.undefined, for setProperty on observable object) etc. do nothing\n\t\t\t}\n\t\t}\n\t\tif (onAfterChange) {\n\t\t\tonAfterChange.call(this, ev, eventArgs);\n\t\t}\n\t}\n}\n\n//=============================\n// Utilities for event handlers\n//=============================\n\nfunction setArrayChangeLink(view) {\n\t// Add/remove arrayChange handler on view\n\tvar handler, arrayBinding,\n\t\ttype = view.type, // undefined if view is being removed\n\t\tdata = view.data,\n\t\tbound = view._.bnd; // true for top-level link() or data-link=\"{for}\", or the for tag instance for {^{for}} (or for any custom tag that has an onArrayChange handler)\n\n\tif (!view._.useKey && bound) {\n\t\t// This is an array view. (view._.useKey not defined => data is array), and is data-bound to collection change events\n\n\t\tif (arrayBinding = view._.bndArr) {\n\t\t\t// First remove the current handler if there is one\n\t\t\t$([arrayBinding[1]]).off(arrayChangeStr, arrayBinding[0]);\n\t\t\tview._.bndArr = undefined;\n\t\t}\n\t\tif (bound !== !!bound) {\n\t\t\t// bound is not a boolean, so it is the data-linked tag that 'owns' this array binding - e.g. {^{for...}}\n\t\t\tif (type) {\n\t\t\t\tbound._.arrVws[view._.id] = view;\n\t\t\t} else {\n\t\t\t\tdelete bound._.arrVws[view._.id]; // if view.type is undefined, view is being removed\n\t\t\t}\n\t\t} else if (type && data) {\n\t\t\t// If this view is not being removed, but the data array has been replaced, then bind to the new data array\n\t\t\thandler = function(ev) {\n\t\t\t\tif (!(ev.data && ev.data.off)) {\n\t\t\t\t\t// Skip if !!ev.data.off: - a handler that has already been removed (maybe was on handler collection at call time - then removed by another handler)\n\t\t\t\t\t// If view.type is undefined, do nothing. (Corresponds to case where there is another handler on the same data whose\n\t\t\t\t\t// effect was to remove this view, and which happened to precede this event in the trigger sequence. So although this\n\t\t\t\t\t// event has been removed now, it is still called since already on the trigger sequence)\n\t\t\t\t\tarrayChangeHandler.apply(view, arguments);\n\t\t\t\t}\n\t\t\t};\n\t\t\t$([data]).on(arrayChangeStr, handler);\n\t\t\tview._.bndArr = [handler, data];\n\t\t}\n\t}\n}\n\nfunction defaultAttr(elem, to, linkGetVal) {\n\t// to: true - default attribute for setting data value on HTML element; false: default attribute for getting value from HTML element\n\t// Merge in the default attribute bindings for this target element\n\tvar nodeName = elem.nodeName.toLowerCase(),\n\t\tattr =\n\t\t\t$subSettingsAdvanced._fe[nodeName] // get form element binding settings for input textarea select or optgroup\n\t\t\t|| elem.contentEditable === TRUE && {to: HTML, from: HTML}; // Or if contentEditable set to \"true\" set attr to \"html\"\n\treturn attr\n\t\t? (to\n\t\t\t? ((nodeName === \"input\" && elem.type === RADIO) // For radio buttons, bind from value, but bind to 'radio' - special value.\n\t\t\t\t? RADIO\n\t\t\t\t: attr.to)\n\t\t\t: attr.from)\n\t\t: to\n\t\t\t? linkGetVal ? \"text\" : HTML // Default innerText for data-link=\"a.b.c\" or data-link=\"{:a.b.c}\" (with or without converters)- otherwise innerHTML\n\t\t\t: \"\"; // Default is not to bind from\n}\n\n//==============================\n// Rendering and DOM insertion\n//==============================\n\nfunction renderAndLink(view, index, tmpl, views, data, context, refresh) {\n\tvar html, linkToNode, prevView, nodesToRemove, bindId,\n\t\tparentNode = view.parentElem,\n\t\tprevNode = view._prv,\n\t\tnextNode = view._nxt,\n\t\telCnt = view._elCnt;\n\n\tif (prevNode && prevNode.parentNode !== parentNode) {\n\t\terror(\"Missing parentNode\");\n\t\t// Abandon, since node has already been removed, or wrapper element has been inserted between prevNode and parentNode\n\t}\n\n\tif (refresh) {\n\t\tnodesToRemove = view.nodes();\n\t\tif (elCnt && prevNode && prevNode !== nextNode) {\n\t\t\t// This prevNode will be removed from the DOM, so transfer the view tokens on prevNode to nextNode of this 'viewToRefresh'\n\t\t\ttransferViewTokens(prevNode, nextNode, parentNode, view._.id, \"_\", true);\n\t\t}\n\t\t// Remove child views\n\t\tview.removeViews(undefined, undefined, true);\n\t\tlinkToNode = nextNode;\n\n\t\tif (elCnt) {\n\t\t\tprevNode = prevNode\n\t\t\t\t? prevNode.previousSibling\n\t\t\t\t: nextNode\n\t\t\t\t\t? nextNode.previousSibling\n\t\t\t\t\t: parentNode.lastChild;\n\t\t}\n\n\t\t// Remove HTML nodes\n\t\t$(nodesToRemove).remove();\n\n\t\tfor (bindId in view._.bnds) {\n\t\t\t// The view bindings may have already been removed above in: $(nodesToRemove).remove();\n\t\t\t// If not, remove them here:\n\t\t\tremoveViewBinding(bindId);\n\t\t}\n\t} else {\n\t\t// addViews. Only called if view is of type \"array\"\n\t\tif (index) {\n\t\t\t// index is a number, so indexed view in view array\n\t\t\tprevView = views[index - 1];\n\t\t\tif (!prevView) {\n\t\t\t\treturn false; // If subview for provided index does not exist, do nothing\n\t\t\t}\n\t\t\tprevNode = prevView._nxt;\n\t\t}\n\t\tif (elCnt) {\n\t\t\tlinkToNode = prevNode;\n\t\t\tprevNode = linkToNode\n\t\t\t\t? linkToNode.previousSibling // There is a linkToNode, so insert after previousSibling, or at the beginning\n\t\t\t\t: parentNode.lastChild; // If no prevView and no prevNode, index is 0 and the container is empty,\n\t\t\t\t// so prevNode = linkToNode = null. But if prevView._nxt is null then we set prevNode to parentNode.lastChild\n\t\t\t\t// (which must be before the prevView) so we insert after that node - and only link the inserted nodes\n\t\t} else {\n\t\t\tlinkToNode = prevNode.nextSibling;\n\t\t}\n\t}\n\thtml = tmpl.render(data, context, view._.useKey && refresh, view, refresh || index, true);\n\t// Pass in view._.useKey as test for noIteration (which corresponds to when self._.useKey > 0 and self.data is an array)\n\n\t// Link the new HTML nodes to the data\n\tview.link(data, parentNode, prevNode, linkToNode, html, prevView);\n//}, 0);\n}\n\n//=====================\n// addBindingMarkers\n//=====================\n\nfunction addBindingMarkers(value, view, tag) {\n\t// Insert binding markers into the rendered template output, which will get converted to appropriate\n\t// data-jsv attributes (element-only content) or script marker nodes (phrasing or flow content), in convertMarkers,\n\t// within view.link, prior to inserting into the DOM. Linking will then bind based on these markers in the DOM.\n\t// Added view markers: #m_...VIEW.../m_\n\t// Added tag markers: #m^...TAG..../m^\n\tvar id, end;\n\tif (tag) {\n\t\t// This is a binding marker for a data-linked tag {^{...}}\n\t\tend = \"^`\";\n\t\taddLinkMethods(tag, true); // This is {^{>...}} or {^{tag ...}}, {{cvt:...} or {^{:...}}, and tag was defined in convertVal or renderTag\n\t\tid = tag._tgId;\n\t\tif (!id) {\n\t\t\tbindingStore[id = bindingKey++] = tag; // Store the tag temporarily, ready for databinding.\n\t\t\t// During linking, in addDataBinding, the tag will be attached to the linkCtx,\n\t\t\t// and then in observeAndBind, bindingStore[bindId] will be replaced by binding info.\n\t\t\ttag._tgId = \"\" + id;\n\t\t}\n\t} else {\n\t\t// This is a binding marker for a view\n\t\t// Add the view to the store of current linked views\n\t\tend = \"_`\";\n\t\taddLinkMethods(viewStore[id = view._.id] = view);\n\t}\n\t// Example: \"#23^TheValue/23^\"\n\treturn \"#\" + id + end\n\t\t+ (value != undefined ? value : \"\") // For {^{:name}} this gives the equivalent semantics to compiled\n\t\t\t\t\t\t\t\t\t\t\t// (v=data.name)!=null?v:\"\"; used in {{:name}} or data-link=\"name\"\n\t\t+ \"/\" + id + end;\n}\n\n//==============================\n// Data-linking and data binding\n//==============================\n\n//---------------\n// observeAndBind\n//---------------\n\nfunction observeAndBind(linkCtx, source, target) { //TODO? linkFnArgs) {;\n\tvar binding, l, linkedElem, exprFnDeps, exprOb,\n\t\ttag = linkCtx.tag,\n\t\tcvtBk = linkCtx.convertBack,\n\t\tdepends = [],\n\t\tbindId = linkCtx._bndId || \"\" + bindingKey++,\n\t\thandler = linkCtx._hdl;\n\n\tlinkCtx._bndId = undefined;\n\n\tif (tag) {\n\t\t// Use the 'depends' paths set on linkCtx.tag - which may have been set on declaration\n\t\t// or in events: init, render, onAfterLink etc.\n\t\tdepends = tag.depends || depends;\n\t\tdepends = $isFunction(depends) ? tag.depends(tag) : depends;\n\t\tlinkedElem = tag.linkedElem;\n\t}\n\tif (!linkCtx._depends || (\"\" + linkCtx._depends !== \"\" + depends)) {\n\t\t// Only bind the first time, or if the new depends (toString) has changed from when last bound\n\t\tif (linkCtx._depends) {\n\t\t\t// Unobserve previous binding\n\t\t\t$observable._apply(false, [source], linkCtx._depends, handler, true);\n\t\t}\n\n\t\texprFnDeps = linkCtx.fn.deps.slice(); // Make a copy of the dependency paths for the compiled linkCtx expression - to pass to observe(). In getInnerCb(),\n\t\t// (and whenever the object is updated, in innerCb), we will set exprOb.ob to the current object returned by that computed expression, for this view.\n\t\tl = exprFnDeps.length;\n\t\twhile (l--) {\n\t\t\texprOb = exprFnDeps[l];\n\t\t\tif (exprOb._jsv) {\n\t\t\t\t// This path is an 'exprOb', corresponding to a computed, returning an object. We replace the exprOb by\n\t\t\t\t// a view-binding-specific exprOb instance. The current object will be stored as exprOb.ob.\n\t\t\t\texprFnDeps[l] = $extend({}, exprOb);\n\t\t\t}\n\t\t}\n\n\t\tbinding = $observable._apply(\n\t\t\tfalse,\n\t\t\t[source],\n\t\t\texprFnDeps, // flatten the paths - to gather all the dependencies across args and bound params\n\t\t\tdepends,\n\t\t\thandler,\n\t\t\tlinkCtx._ctxCb);\n\t\t// The binding returned by $observe has a bnd array with the source objects of the individual bindings.\n\n\t\tbinding.elem = target; // The target of all the individual bindings\n\t\tbinding.linkCtx = linkCtx;\n\t\tbinding._tgId = bindId;\n\n\t\t// Add to the _jsvBnd on the target the view id and binding id - for unbinding when the target element is removed\n\t\ttarget._jsvBnd = target._jsvBnd || \"\";\n\t\ttarget._jsvBnd += \"&\" + bindId;\n\t\tlinkCtx._depends = depends;\n\t\t// Store the binding key on the view, for disposal when the view is removed\n\t\tlinkCtx.view._.bnds[bindId] = bindId;\n\t\t// Store the binding.\n\t\tbindingStore[bindId] = binding; // Note: If this corresponds to a data-linked tag, we are replacing the\n\t\t// temporarily stored tag by the stored binding. The tag will now be at binding.linkCtx.tag\n\n\t\tif (linkedElem) {\n\t\t\tbinding.to = [[], cvtBk];\n\t\t}\n\t\tif (linkedElem || cvtBk !== undefined) {\n\t\t\tbindTo(binding, tag, linkedElem && linkedElem[0] || target, cvtBk);\n\t\t}\n\t\tif (tag) {\n\t\t\tif (!tag.flow && !tag._.inline) {\n\t\t\t\ttarget.setAttribute(jsvAttrStr, (target.getAttribute(jsvAttrStr)||\"\") + \"#\" + bindId + \"^/\" + bindId + \"^\");\n\t\t\t\ttag._tgId = \"\" + bindId;\n\t\t\t}\n\t\t}\n\t}\n\tif (linkedElem && linkedElem[0]) {\n\t\tl = linkedElem.length;\n\t\twhile (l--) {\n\t\t\tlinkedElem[l]._jsvBnd = linkedElem[l]._jsvBnd || (target._jsvBnd + \"+\");\n\t\t\t// Add a \"+\" for cloned binding - so removing elems with cloned bindings will not remove the 'parent' binding from the bindingStore.\n\t\t\tlinkedElem[l]._jsvLkEl = tag;\n\t\t}\n\t}\n}\n\n//-------\n// $.link\n//-------\n\nfunction tmplLink(to, from, context, noIteration, parentView, prevNode, nextNode) {\n\treturn $link(this, to, from, context, noIteration, parentView, prevNode, nextNode);\n}\n\nfunction $link(tmplOrLinkExpr, to, from, context, noIteration, parentView, prevNode, nextNode) {\n\t// When linking from a template, prevNode and nextNode parameters are ignored\n\tif (context === true) {\n\t\tnoIteration = context; // passing boolean as third param - noIteration\n\t\tcontext = undefined;\n\t} else if (typeof context !== \"object\") {\n\t\tcontext = undefined; // context must be a boolean (noIteration) or a plain object\n\t} else {\n\t\tcontext = $extend({}, context);\n\t}\n\tif (tmplOrLinkExpr && to) {\n\t\tto = to.jquery ? to : $(to); // to is a jquery object or an element or selector\n\n\t\tif (!activeBody) {\n\t\t\tactiveBody = document.body;\n\t\t\t$(activeBody)\n\t\t\t\t.on(elementChangeStr, elemChangeHandler)\n\t\t\t\t.on('blur', '[contenteditable]', elemChangeHandler);\n\t\t}\n\n\t\tvar i, k, html, vwInfos, view, placeholderParent, targetEl, refresh, topLevelCall,\n\t\t\tonRender = addBindingMarkers,\n\t\t\treplaceMode = context && context.target === \"replace\",\n\t\t\tl = to.length;\n\n\t\twhile (l--) {\n\t\t\ttargetEl = to[l];\n\n\t\t\tparentView = parentView || $view(targetEl);\n\n\t\t\tif (topLevelCall = parentView === topView) {\n\t\t\t\ttopView.data = (topView.ctx = context || {}).root = from;\n\t\t\t}\n\t\t\tif (\"\" + tmplOrLinkExpr === tmplOrLinkExpr) {\n\t\t\t\t// tmplOrLinkExpr is a string: treat as data-link expression.\n\t\t\t\taddDataBinding(tmplOrLinkExpr, targetEl, parentView, undefined, true, from, context);\n\t\t\t} else {\n\t\t\t\tif (tmplOrLinkExpr.markup !== undefined) {\n\t\t\t\t\t// This is a call to template.link()\n\t\t\t\t\tif (replaceMode) {\n\t\t\t\t\t\tplaceholderParent = targetEl.parentNode;\n\t\t\t\t\t}\n\n\t\t\t\t\thtml = tmplOrLinkExpr.render(from, context, noIteration, parentView, undefined, onRender);\n\t\t\t\t\t// TODO Consider finding a way to bind data (link) within template without html being different for each view, the HTML can\n\t\t\t\t\t// be evaluated once outside the while (l--), and pushed into a document fragment, then cloned and inserted at each target.\n\n\t\t\t\t\tif (placeholderParent) {\n\t\t\t\t\t\t// This is target=\"replace\" mode\n\t\t\t\t\t\tprevNode = targetEl.previousSibling;\n\t\t\t\t\t\tnextNode = targetEl.nextSibling;\n\t\t\t\t\t\t$.cleanData([targetEl], true);\n\t\t\t\t\t\tplaceholderParent.removeChild(targetEl);\n\n\t\t\t\t\t\ttargetEl = placeholderParent;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprevNode = nextNode = undefined; // When linking from a template, prevNode and nextNode parameters are ignored\n\t\t\t\t\t\t$(targetEl).empty();\n\t\t\t\t\t}\n\t\t\t\t} else if (tmplOrLinkExpr === true && parentView === topView) {\n\t\t\t\t\t// $.link(true, selector, data, ctx) - where selector points to elem in top-level content. (If not top-level content, no-op)\n\t\t\t\t\trefresh = {lnk: 1};\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n// TODO Consider deferred linking API feature on per-template basis - {@{ instead of {^{ which allows the user to see the rendered content\n// before that content is linked, with better perceived perf. Have view.link return a deferred, and pass that to onAfterLink...\n// or something along those lines.\n// setTimeout(function() {\n\n\t\t\t\tif (targetEl._df && !nextNode) {\n\t\t\t\t\t// We are inserting new content and the target element has some deferred binding annotations,and there is no nextNode.\n\t\t\t\t\t// Those views may be stale views (that will be recreated in this new linking action) so we will first remove them\n\t\t\t\t\t// (if not already removed).\n\t\t\t\t\tvwInfos = viewInfos(targetEl._df, true, rOpenViewMarkers);\n\n\t\t\t\t\tfor (i = 0, k = vwInfos.length; i < k; i++) {\n\t\t\t\t\t\tview = vwInfos[i];\n\t\t\t\t\t\tif ((view = viewStore[view.id]) && view.data !== undefined) {\n\t\t\t\t\t\t\t// If this is the _prv (prevNode) for a view, remove the view\n\t\t\t\t\t\t\t// - unless view.data is undefined, in which case it is already being removed\n\t\t\t\t\t\t\tview.parent.removeViews(view._.key, undefined, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsetDefer(targetEl); // remove defer tokens\n\t\t\t\t}\n\n\t\t\t\t// Link the content of the element, since this is a call to template.link(), or to $(el).link(true, ...),\n\t\t\t\tparentView.link(from, targetEl, prevNode, nextNode, html, refresh, context);\n//}, 0);\n\t\t\t}\n\t\t\tif (topLevelCall) {\n\t\t\t\ttopView.data = topView.ctx = undefined;\n\t\t\t}\n\t\t}\n\t}\n\treturn to; // Allow chaining, to attach event handlers, etc.\n}\n\n//----------\n// view.link\n//----------\n\nfunction viewLink(outerData, parentNode, prevNode, nextNode, html, refresh, context, validateOnly) {\n\t// Optionally insert HTML into DOM using documentFragments (and wrapping HTML appropriately).\n\t// Data-link existing contents of parentNode, or the inserted HTML, if provided\n\n\t// Depending on the content model for the HTML elements, the standard data-linking markers inserted in the HTML by addBindingMarkers during\n\t// template rendering will be converted either to script marker nodes or, for element-only content sections, to data-jsv element annotations.\n\n\t// Data-linking will then add _prv and _nxt to views, where:\n\t// _prv: References the previous node (script element of type \"jsv123\"), or (for elCnt=true), the first element node in the view (or if none, set _prv = _nxt)\n\t// _nxt: References the last node (script element of type \"jsv/123\"), or (for elCnt=true), the next element node after the view.\n\n\t//==== nested functions ====\n\tfunction convertMarkers(all, preceding, selfClose, closeTag, spaceBefore, id, boundId, spaceAfter, tag1, tag2, closeTag2, spaceAfterClose, selfClose2, endOpenTag) {\n\t\t// rConvertMarkers = /(^|(\\/>)|<\\/(\\w+)>|)(\\s*)([#\\/]\\d+(?:_|(\\^)))`(\\s*)(<\\w+(?=[\\s\\/>]))?|\\s*(?:(<\\w+(?=[\\s\\/>]))|<\\/(\\w+)>(\\s*)|(\\/>)\\s*|(>))/g,\n\t\t// prec, slfCl, clsTag, spBefore, id, bndId spAfter,tag1, tag2, clTag2,sac slfCl2, endOpenTag\n\t\t// Convert the markers that were included by addBindingMarkers in template output, to appropriate DOM annotations:\n\t\t// data-jsv attributes (for element-only content) or script marker nodes (within phrasing or flow content).\n\n// TODO consider detecting 'quoted' contexts (attribute strings) so that attribute encoding does not need to encode >\n// Currently rAttrEncode = /[><\"'&]/g includes '>' encoding in order to avoid erroneous parsing of <span title=\"<a/>\"></span>\">\n\t\tvar errorMsg, bndId,\n\t\t\tendOfElCnt = \"\";\n\t\tif (endOpenTag) {\n\t\t\tinTag = 0;\n\t\t\treturn all;\n\t\t}\n\t\ttag = tag1 || tag2 || \"\";\n\t\tcloseTag = closeTag || closeTag2;\n\t\tselfClose = selfClose || selfClose2;\n\t\tif (isVoid && !selfClose && ( !all || closeTag || tag || id && !inTag)) { // !all = end of string\n\t\t\tisVoid = undefined;\n\t\t\tparentTag = tagStack.shift(); // preceding tag was a void element, with no closing slash, such as <br>.\n\t\t}\n\t\tcloseTag = closeTag || selfClose;\n\t\tif (closeTag) {\n\t\t\tinTag = 0;\n\t\t\tisVoid = undefined;\n\t\t\t// TODO: smart insertion of <tbody> - to be completed for robust insertion of deferred bindings etc.\n\t\t\t//if (closeTag === \"table\" && parentTag === \"tbody\") {\n\t\t\t//\tpreceding = \"</tbody>\" + preceding;\n\t\t\t//\tparentTag = \"table\";\n\t\t\t//\ttagStack.shift();\n\t\t\t//}\n\t\t\tif (validate) {\n\t\t\t\tif (selfClose || selfClose2) {\n\t\t\t\t\tif (!voidElems[parentTag] && !/;svg;|;math;/.test(\";\" + tagStack.join(\";\") + \";\")) {\n\t\t\t\t\t\t// Only self-closing elements must be legitimate void elements, such as <br/>, per HTML schema,\n\t\t\t\t\t\t// or under svg or math foreign namespace elements.\n\t\t\t\t\t\terrorMsg = \"'<\" + parentTag + \".../\";\n\t\t\t\t\t}\n\t\t\t\t} else if (voidElems[closeTag]) {\n\t\t\t\t\terrorMsg = \"'</\" + closeTag; // closing tag such as </input>\n\t\t\t\t} else if (!tagStack.length || closeTag !== parentTag) {\n\t\t\t\t\terrorMsg = \"Mismatch: '</\" + closeTag;\n\t\t\t\t}\n\t\t\t\tif (errorMsg) {\n\t\t\t\t\tsyntaxError(errorMsg + \">' in:\\n\" + html);\n\t\t\t\t}\n\t\t\t}\n\t\t\tprevElCnt = elCnt;\n\t\t\tparentTag = tagStack.shift();\n\t\t\telCnt = elContent[parentTag];\n\t\t\tcloseTag2 = closeTag2 ? (\"</\" + closeTag2 + \">\") : \"\";\n\t\t\tif (prevElCnt) {\n\t\t\t\t// If there are ids (markers since the last tag), move them to the defer string\n\t\t\t\tdefer += ids;\n\t\t\t\tids = \"\";\n\t\t\t\tif (!elCnt) {\n\t\t\t\t\tendOfElCnt = closeTag2 + openScript + \"@\" + defer + closeScript + (spaceAfterClose || \"\");\n\t\t\t\t\tdefer = deferStack.shift();\n\t\t\t\t} else {\n\t\t\t\t\tdefer += \"-\"; // Will be used for stepping back through deferred tokens\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (elCnt) {\n\t\t\t// elContent maps tagNames which have only element content, so may not support script nodes.\n\t\t\t// We are in element-only content, can remove white space, and use data-jsv attributes on elements as markers\n\t\t\t// Example: <tr data-jsv=\"/2_#6_\"> - close marker for view 2 and open marker for view 6\n\n\t\t\tif (id) {\n\t\t\t\t// append marker for this id, to ids string\n\t\t\t\tids += id;\n\t\t\t} else {\n\t\t\t\tpreceding = (closeTag2 || selfClose2 || \"\");\n\t\t\t}\n\t\t\tif (tag) {\n\t\t\t\t// TODO: smart insertion of <tbody> - to be completed for robust insertion of deferred bindings etc.\n\t\t\t\t//if (tag === \"<tr\" && parentTag === \"table\") {\n\t\t\t\t//\ttagStack.unshift(parentTag);\n\t\t\t\t//\tparentTag = \"tbody\";\n\t\t\t\t//\tpreceding += \"<\" + parentTag + \">\";\n\t\t\t\t//\tif (defer) {\n\t\t\t\t//\t\tdefer += \"+\"; // Will be used for stepping back through deferred tokens\n\t\t\t\t//\t}\n\t\t\t\t//\t// TODO: move this to design-time validation check\n\t\t\t\t//\t//\terror('\"' + parentTag + '\" has incorrect parent tag');\n\t\t\t\t//}\n\t\t\t\tpreceding += tag;\n\t\t\t\tif (ids) {\n\t\t\t\t\tpreceding += ' ' + jsvAttrStr + '=\"' + ids + '\"';\n\t\t\t\t\tids = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// We are in phrasing or flow content, so use script marker nodes\n\t\t\t// Example: <script type=\"jsv3/\"></script> - 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// \"<table {{if ...}}...{{/if}}... >\" or \"<table {{if ...}}...> ...{{/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 <tbody>\n\t\t\t\t// TODO: replace this by smart insertion of <tbody> tags\n\t\t\t\terror('Parent of <tr> must be <tbody>');\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 <span> as child of <tr>, 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\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 = !$subSettingsAdvanced.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 (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, 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\ttype: \"inline\",\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. <input data-link=\"{:firstName:} title{>~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 += delimCloseChar1 + delimOpenChar0 + 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 += delimCloseChar1 + delimOpenChar0 + delimOpenChar1 + \"/\" + tokens[4] + delimCloseChar0;\n\t\t\t}\n\t\t\tlinkCtx = {\n\t\t\t\ttype: isLink ? \"top\" : \"link\",\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\tconvertBack = undefined;\n\t\t\tif (tokens[6]) {\n\t\t\t\tconvertBack = tokens[10] || undefined;\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}\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\t// handler._ctx = linkCtx; Could pass linkCtx for use in a depends = function() {} call, so depends is different for different linkCtx's\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, ev, eventArgs) {\n\tvar $linkedElem, linkedElem, radioButtons, val, l, linkedTag, oldTrig, newTrig, tagProps, propsExpr, linkedElemView, prop, propDef,\n\t\ttagCtx = tag.tagCtx,\n\t\tview = tagCtx.view,\n\t\tprops = tagCtx.props,\n\t\tlinkCtx = tag.linkCtx;\n\n\tif (tag._.unlinked) { // First call to onAfterLink, or first call after onUpdate: updateContent. Initialize and call onBind and set properties\n\t\tif (tag.linkedElement !== undefined) {\n\t\t\t// linkedElement: - selector for identifying linked element in template/rendered content\n\t\t\ttag.linkedElem = tag._.inline ? tag.contents(true, tag.linkedElement || \"*\").first() : $(linkCtx.elem);\n\t\t}\n\t\tif (tag.onBind) {\n\t\t\ttag.onBind(tagCtx, linkCtx, tag.ctx, ev, eventArgs);\n\t\t}\n\t}\n\n\tif (tag.onAfterLink) {\n\t\ttag.onAfterLink(tagCtx, linkCtx, tag.ctx, ev, eventArgs);\n\t}\n\n\ttag._.unlinked = undefined;\n\t$linkedElem = tag.targetTag ? tag.targetTag.linkedElem : tag.linkedElem;\n\tif (linkedElem = $linkedElem && $linkedElem[0]) {\n\t\tif (!tag.noVal) {\n\t\t\tif (!tag._.chging) {\n\t\t\t\tval = tag.cvtArgs()[0];\n\n\t\t\t\tif (linkedElem !== linkCtx.elem) {\n\t\t\t\t\tl = $linkedElem.length;\n\t\t\t\t\twhile (l--) {\n\t\t\t\t\t\tlinkedElem = $linkedElem[l];\n\t\t\t\t\t\tlinkedTag = linkedElem._jsvLkEl;\n\t\t\t\t\t\tif (tag._.inline && (!linkedTag || linkedTag !== tag && linkedTag.targetTag !== tag)) {\n\t\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\t// (For data-linked elements, if not yet bound, we identify later when the linkCtx.elem is bound)\n\t\t\t\t\t\t\tlinkedElem._jsvLkEl = tag;\n\t\t\t\t\t\t\tbindTo(bindingStore[tag._tgId], tag, linkedElem);\n\t\t\t\t\t\t\tlinkedElem._jsvBnd = \"&\" + tag._tgId + \"+\"; // Add a \"+\" for cloned binding - so removing\n\t\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\t}\n\t\t\t\t\t}\n\t\t\t\t\tlinkCtx._val = val;\n\t\t\t\t}\n\t\t\t\tif (val !== undefined) {\n\t\t\t\t\tif (linkedElem.value !== undefined) {\n\t\t\t\t\t\tif (linkedElem.type === CHECKBOX) {\n\t\t\t\t\t\t\tlinkedElem[CHECKED] = val && val !== \"false\";\n\t\t\t\t\t\t} else if (linkedElem.type === \"text\") {\n\t\t\t\t\t\t\tlinkedElem.value = val;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (linkedElem.contentEditable === TRUE) {\n\t\t\t\t\t\tlinkedElem.innerHTML = val;\n\t\t\t\t\t}\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.title !== undefined) {\n\t\t\t$linkedElem.attr(\"title\", props.title);\n\t\t}\n\t\tif (props[\"class\"]) {\n\t\t\t// This code supports dynamic binding to class - where it adds the class if absent, and removes/adds if a previous value is present\n\t\t\tif (eventArgs && $linkedElem.hasClass(eventArgs.oldValue)) {\n\t\t\t\t$linkedElem.removeClass(eventArgs.oldValue);\n\t\t\t}\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}\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, tag, linkedElem, 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, $linkedElem, newTrig, oldTrig, to, l, totry,\n\t\tlinkCtx = binding.linkCtx,\n\t\tsource = linkCtx.data,\n\t\tpaths = linkCtx.fn.paths;\n\n\ttag = tag || linkedElem._jsvLkEl;\n\n\tif (binding && paths) {\n\t\toldTrig = linkedElem._jsvTr || false;\n\t\tif (tag) {\n\t\t\tcvtBk = tag.convertBack || cvtBk;\n\t\t\tnewTrig = tag.tagCtx.props.trigger;\n\t\t}\n\t\tnewTrig = newTrig === undefined ? $subSettings.trigger : newTrig;\n\t\tif (oldTrig !== newTrig) {\n\t\t\t$linkedElem = $(linkedElem);\n\t\t\tbindElChange($linkedElem, oldTrig, \"off\");\n\t\t\tbindElChange(\n\t\t\t\t$linkedElem,\n\t\t\t\tlinkedElem._jsvTr\n\t\t\t\t\t// Trigger is noop except for text box, textarea, contenteditable...\n\t\t\t\t\t= (linkedElem.tagName === \"INPUT\" && linkedElem.type !== CHECKBOX && linkedElem.type !== RADIO || linkedElem.type === \"textarea\" || linkedElem.contentEditable === TRUE) && newTrig,\n\t\t\t\t\"on\"\n\t\t\t);\n\t\t}\n\n\t\tpaths = (bindto = paths._jsvto) || paths[0];\n\t\tpathIndex = paths && paths.length;\n\t\tif (pathIndex && (!tag || 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\tif (path) {\n\t\t\t\tto = [\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} else {\n\t\t\t\twhile ((totry = linkCtx._ctxCb(path = lastPath.split(\"^\").join(\".\"), source)) && (l = totry.length)) {\n\t\t\t\t\t// Recursively dereference any ~foo or #bar tokens in the path. (Recursive because ~foo may be a contextual param which has\n\t\t\t\t\t// its own dependencies on other ~foo #bar components)\n\t\t\t\t\tto = totry;\n\t\t\t\t\tif (to._cp) { // Two-way binding to a contextual parameter reference, ~foo (declared as ~foo=expr on a parent tag)\n\t\t\t\t\t\tto = [to[l-3], to[l-2]];\n\t\t\t\t\t\tlastPath = to[1];\n\t\t\t\t\t\tif (lastPath._jsv) {\n\t\t\t\t\t\t\tbindtoOb = lastPath;\n\t\t\t\t\t\t\twhile (lastPath.sb && lastPath.sb._jsv) {\n\t\t\t\t\t\t\t\tpath = lastPath = lastPath.sb;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpath = lastPath.sb || path && path.path;\n\t\t\t\t\t\t\tlastPath = path ? path.slice(1) : bindtoOb.path;\n\t\t\t\t\t\t\tto = [\n\t\t\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\t\t\tlastPath\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else { // Two-way binding to a helper - e.g. ~address.street, or computed, e.g. ~fullName(), or view property e.g. #data.foo\n\t\t\t\t\t\tto = l>2\n\t\t\t\t\t\t\t? [to[l-3], to[l-2]] // With path: [object, path]\n\t\t\t\t\t\t\t: [to[l-2]]; // No path, (e.g. [function] for computed with setter)\n\t\t\t\t\t}\n\t\t\t\t\tsource = to[0];\n\t\t\t\t\tlastPath = to[1];\n\t\t\t\t}\n\t\t\t\tto = to || [source, path]; // Two way binding to an object (neither ~foo nor #bar)\n\t\t\t}\n\t\t} else {\n\t\t\tto = [];\n\t\t}\n\t\tbinding.to = [\n\t\t\tto,\n\t\t\tcvtBk\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, $sub);\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\n\t\t\t\tif (tag.onUnbind) {\n\t\t\t\t\ttag.onUnbind(tag.tagCtx, linkCtx, tag.ctx, true);\n\t\t\t\t}\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\tlinkedElem = $linkedElem && $linkedElem[0] || linkCtx.elem;\n\n\t\t\tif (trigger = linkedElem && linkedElem._jsvTr) {\n\t\t\t\tbindElChange($linkedElem || $(linkedElem), trigger, \"off\");\n\t\t\t\tlinkedElem._jsvTr = undefined;\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\tdelete binding.s[binding.cbId];\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) { // Return a callback for accessing the context of a template/data-link expression - and converting ~foo, #foo etc.\n\t// TODO Consider exposing or allowing override, as public API\n\treturn function(path, object, depth) {\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, items, helper, last, nextPath, l;\n\t\tif (view && path) {\n\t\t\tif (path._jsv) {\n\t\t\t\treturn path._jsv.call(view.tmpl, object, view, $sub);\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 (helper = view.hlp(last = path.shift(), true)) {\n\t\t\t\t\tif (helper._cp) { // helper for (contextual parameter ~foo=...) is an array - [data, ctxPrmDependencies ...]\n\t\t\t\t\t\tif (path.length) {\n\t\t\t\t\t\t\tnextPath = \".\" + path.join(\".\");\n\t\t\t\t\t\t\tlast = helper[l = helper.length-1];\n\t\t\t\t\t\t\tif (last._jsv) {\n\t\t\t\t\t\t\t\tlast.sb = nextPath;\n\t\t\t\t\t\t\t\tlast.bnd = !!depth;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\thelper[l] = (last + nextPath).replace(\"#data.\", \"\");\n\t\t\t\t\t\t\t\tif (last.slice(0, 5) === \"#view\") {\n\t\t\t\t\t\t\t\t\thelper[l] = helper[l].slice(6);\n\t\t\t\t\t\t\t\t\thelper.splice(l, 0, view);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\thelper.push(object);\n\t\t\t\t\t\titems = helper;\n\t\t\t\t\t} else if (path.length || $isFunction(helper)) {\n\t\t\t\t\t\titems = [helper, path.join(\".\"), object]; // 2way bindng on ~foo.helperLeafProperty or ~computed() or ~contextualParam\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn 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// Define JsViews version of delimiters(), and initialize\n($viewsSettings.delimiters = function() {\n\t// Run delimiters initialization in context of jsrender.js\n\tvar ret = oldJsvDelimiters.apply(0, arguments),\n\t\t// Now set also delimOpenChar0 etc. in context of jquery.views.js...\n\t\tdelimChars = $subSettings.delimiters;\n\n\tdelimOpenChar0 = delimChars[0].charAt(0);\n\tdelimOpenChar1 = delimChars[0].charAt(1);\n\tdelimCloseChar0 = delimChars[1].charAt(0);\n\tdelimCloseChar1 = delimChars[1].charAt(1);\n\tlinkChar = delimChars[2];\n\n\t// Data-linking must use new delimiters\n\trTagDatalink = new RegExp(\"(?:^|\\\\s*)([\\\\w-]*)(\\\\\" + linkChar + \")?(\\\\\" + delimOpenChar1 + $sub.rTag + \"(:\\\\w*)?\\\\\" + delimCloseChar0 + \")\", \"g\");\n\treturn ret;\n})(); // jshint ignore:line\n\n$sub.addSetting(\"trigger\");\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 contents(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 = $sub._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\t// This is a TAG\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// This is a VIEW\n\t\t// Note: a linked view will also, after linking have nodes[], _prv (prevNode), _nxt (nextNode) ...\n\t\ttagOrView.addViews = function(index, dataItems) {\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) {\n\t\t\t\t// view is of type \"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, self.tmpl, views, dataItems, self.ctx) !== false) {\n\t\t\t\t\tif (!self._.srt) { // Not part of a 'sort' on refresh\n\t\t\t\t\t\tself.fixIndex(index + itemsCount);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.removeViews = function(index, itemsCount, keepNodes, isMove) {\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&& (isMove || 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 (!self._.sort) {\n\t\t\t\t\t\tself.fixIndex(index);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.refresh = function() {\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, undefined, true);\n\t\t\t\tsetArrayChangeLink(self);\n\t\t\t}\n\t\t};\n\n\t\ttagOrView.fixIndex = function(fromIndex) {\n\t\t\t// Fixup index on following view items...\n\t\t\tvar views = this.views,\n\t\t\t\tindex = views.length;\n\t\t\twhile (fromIndex < index--) {\n\t\t\t\tif (views[index].index !== index) {\n\t\t\t\t\t$observable(views[index]).setProperty(\"index\", index);\n\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}\n\t\t\t}\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\tnoVal: true, // This tag control does not bind to arg[0] - no default binding to current #data context\n\tinit: function(tagCtx) {\n\t\tvar content,\n\t\t\ttag = this,\n\t\t\ti = 0,\n\t\t\targs = tagCtx.args, // [events,] [selector,] handler\n\t\t\tl = args.length;\n\n\t\tfor (; i<l && !$isFunction(args[i]); i++); // Handler is first arg of type function\n\t\ttag._hi = l>i && i+1; // handler index\n\t\tif (tag._.inline) {\n\t\t\tif (!$sub.rTmpl.exec(content = tagCtx.tmpl.markup)) {\n\t\t\t\t// Inline {^{on}} tag with no content (or external template content) or with content containing\n\t\t\t\t// no HTML or JsRender tags: We will wrap the (text) content, or the operation name in a <button> element\n\t\t\t\t// (Otherwise we will attach the handler to the element content after data-linking)\n\t\t\t\ttag.template = \"<button>\" + ($.trim(content) || tagCtx.params.args[i] || \"noop\") + \"</button>\";\n\t\t\t}\n\t\t\ttag.attr = HTML;\n\t\t}\n\t},\n\trender: function() {\n\t\tvar tagCtx = this.tagCtx;\n\t\treturn this._.inline && tagCtx.render(tagCtx.view, true); // no arg, so renders against parentView.data\n\t},\n\tonAfterLink: function(tagCtx, linkCtx) {\n\t\tvar handler, params, find, activeElem,\n\t\t\ttag = this,\n\t\t\ti = tag._hi,\n\t\t\targs = tagCtx.args, // [events,] [selector,] handler\n\t\t\tl = args.length,\n\t\t\tprops = tagCtx.props,\n\t\t\tdata = props.data,\n\t\t\tview = tagCtx.view,\n\t\t\tcontextOb = props.context; // Context ('this' pointer) for attached handler\n\n\t\tif (i) { // There is a handler\n\t\t\thandler = args[i-1];\n\t\t\tparams = args.slice(i); // Subsequent args are params\n\t\t\targs = args.slice(0, i-1); // Preceding args (if any) are events and selector\n\t\t\ttag._sel = args[1]; // Selector for descendant elements - for delegated events on those elements, delegating to the activeElem\n\n\t\t\tactiveElem = tag.activeElem = tag.activeElem || $(tag._.inline\n\t\t\t\t? (tag._sel = args[1] || \"*\", tag.parentElem)\n\t\t\t\t// If inline, attach to child elements of tag parent element (filtered by selector argument if provided.\n\t\t\t\t// (In handler we'll filter out events from sibling elements preceding or following tag.)\n\t\t\t\t// This allows us to use the delegated pattern where the attached event works even for added elements satisfying the selector\n\t\t\t\t: linkCtx.elem);\n\n\t\t\tif (!contextOb) {\n\t\t\t\t// Get the path for the preceding object (context object) of handler (which is the last arg), compile function\n\t\t\t\t// to return that context object, and run compiled function against data\n\t\t\t\tcontextOb = /^(.*)[\\.^][\\w$]+$/.exec(tagCtx.params.args.slice(-params.length - 1)[0]);\n\t\t\t\tcontextOb = contextOb && $sub.tmplFn(delimOpenChar1 + \":\" + contextOb[1] + delimCloseChar0, view.tmpl, true)(linkCtx.data, view);\n\t\t\t}\n\n\t\t\tif (tag._evs) {\n\t\t\t\ttag.onUnbind();\n\t\t\t}\n\n\t\t\tactiveElem.on(\n\t\t\t\ttag._evs = args[0] || \"click\", // events defaults to \"click\"\n\t\t\t\ttag._sel,\n\t\t\t\tdata == undefined ? null : data,\n\t\t\t\ttag._hlr = function hndlr(ev) {\n\t\t\t\t\tvar nodes, length,\n\t\t\t\t\t\tfound = !tag._.inline;\n\n\t\t\t\t\tif (!found) { // If inline, filter out events from sibling elements preceding or following tag.\n\t\t\t\t\t\tnodes = tag.contents(\"*\");\n\t\t\t\t\t\tl = nodes.length;\n\t\t\t\t\t\twhile (!found && l--) {\n\t\t\t\t\t\t\tif (nodes[l].contains(ev.target)) {\n\t\t\t\t\t\t\t\tfound = true;\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\tif (found) { // target elem is indeed within the tag, so call the {on} handler\n\t\t\t\t\t\treturn handler.apply(contextOb || linkCtx.data, [].concat(\n\t\t\t\t\t\t\tparams, // e.g. par1, par2\n\t\t\t\t\t\t\tev,\n\t\t\t\t\t\t\t{change: ev.type, view: view, linkCtx: linkCtx},\n\t\t\t\t\t\t\tparams.slice.call(arguments, 1) // If triggering event (e.g. jsv-domchange) has additional arguments after ev, pass them too\n\t\t\t\t\t\t));\n\t\t\t\t\t\t// for {on 'click' handler par1 par2} use handler(par1, par2, ev, domchangeEventArgs)\n\t\t\t\t\t\t// for {on 'jsv-domchange' handler par1 par2} use handler(par1, par2, ev, domchangeEventArgs, tagCtx, linkCtx, observableEventArgs)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t},\n\tonUpdate: function() {\n\t\treturn false;\n\t},\n\tonUnbind: function() {\n\t\tvar self = this;\n\t\tif (self.activeElem) {\n\t\t\tself.activeElem.off(self._evs, self._sel, self._hlr);\n\t\t}\n\t},\n\tflow: true,\n\tdataBoundOnly: true\n});\n\n$extend($tags[\"for\"], {\n\t//onUpdate: function(ev, eventArgs, newTagCtxs) {\n\t\t//Consider adding filtering for perf optimization. However the below prevents update on some scenarios which _should_ update - namely when there is another array on which for also depends.\n\t\t//var i, l, tci, prevArg;\n\t\t//for (tci = 0; (prevArg = this.tagCtxs[tci]) && prevArg.args.length; tci++) {\n\t\t//\tif (prevArg.args[0] !== newTagCtxs[tci].args[0]) {\n\t\t//\t\treturn true;\n\t\t//\t}\n\t\t//}\n\t\t//return false;\n\t//},\n\tonArrayChange: function(ev, eventArgs, tagCtx, linkCtx) {\n\t\tvar arrayView,\n\t\t\ttarget = ev.target,\n\t\t\ttargetLength = target.length,\n\t\t\ttag = this,\n\t\t\tchange = eventArgs.change;\n\t\tif (tag._.noVws // Child views not supported because target is not html - e.g. data-link=\"title{for ...}\"\n\t\t\t|| tag.tagCtxs[1] && ( // There is an {{else}}\n\t\t\t\tchange === \"insert\" && targetLength === eventArgs.items.length // inserting, and new length is same as inserted length, so going from 0 to n\n\t\t\t\t|| change === \"remove\" && !targetLength // removing , and new length 0, so going from n to 0\n\t\t\t)) {\n\t\t\ttag.refresh();\n\t\t} else {\n\t\t\tfor (arrayView in tag._.arrVws) {\n\t\t\t\tarrayView = tag._.arrVws[arrayView];\n\t\t\t\tif (arrayView.data === target) {\n\t\t\t\t\tarrayView._.onArrayChange.apply(arrayView, arguments);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttag.domChange(tagCtx, linkCtx, eventArgs);\n\t\tev.done = true;\n\t},\n\tonAfterLink: function(tagCtx, linkCtx) {\n\t\tvar i, arrHandler, arrBinding, data,\n\t\t\ttag = this,\n\t\t\tarrayBindings = tag._ars || {},\n\t\t\ttagCtxs = tag.tagCtxs,\n\t\t\tl = tagCtxs.length,\n\t\t\tselected = tag.selected || 0;\n\n\t\tfor (i = 0; i <= selected; i++) {\n\t\t\ttagCtx = tagCtxs[i]; // loop through tagCtxs up to selected\n\t\t\tdata = tagCtx.map\n\t\t\t\t? tagCtx.map.tgt // 'data' is mapped data\n\t\t\t\t: tagCtx.args.length\n\t\t\t\t\t? tagCtx.args[0] // or args[0]\n\t\t\t\t\t: tagCtx.view.data; // or defaults to current data.\n\n\t\t\tif ((arrBinding = arrayBindings[i]) && data !== arrBinding[0]) { // Is there previous array data on this tagCtx, different from new data\n\t\t\t\t$observe(arrBinding[0], arrBinding[1], true); //unobserve previous array\n\t\t\t\tdelete arrayBindings[i];\n\t\t\t}\n\t\t\tif (!arrayBindings[i] && $isArray(data)) {\n\t\t\t\t$observe(data, arrHandler = function(ev, eventArgs) {\n\t\t\t\t\tvar tagCt = tagCtx;\n\t\t\t\t\ttag.onArrayChange(ev, eventArgs, tagCt, linkCtx);\n\t\t\t\t});\n\t\t\t\tarrayBindings[i] = [data, arrHandler]; // Store array data and arrayChangeHandler on tag._ars[i]\n\t\t\t}\n\t\t}\n\t\tfor (i = selected + 1; i < l; i++) { // If there were previous bindings on later tagCtxs, remove them\n\t\t\tif (arrBinding = arrayBindings[i]) {\n\t\t\t\t$observe(arrBinding[0], arrBinding[1], true); //unobserve previous binding\n\t\t\t\tdelete arrayBindings[i];\n\t\t\t}\n\t\t}\n\t\ttag._ars = arrayBindings;\n\t},\n\tonDispose: function() {\n\t\tvar l, tag = this;\n\t\tfor (l in tag._ars) {\n\t\t\t$observe(tag._ars[l][0], tag._ars[l][1], true); //unobserve\n\t\t}\n\t}\n});\n\n$extend($tags[\"if\"], {\n\tonUpdate: function(ev, eventArgs, newTagCtxs) {\n\t\tvar tci, prevArg, different;\n\t\tfor (tci = 0; (prevArg = this.tagCtxs[tci]); tci++) {\n\t\t\tdifferent = prevArg.props.tmpl !== newTagCtxs[tci].props.tmpl || prevArg.args.length && !(prevArg = prevArg.args[0]) !== !newTagCtxs[tci].args[0];\n\t\t\tif ((!this.convert && !!prevArg) || different) {\n\t\t\t\treturn different;\n\t\t\t\t// If there is not a change of template, and there is no converter, and newArg and prevArg are both truthy, return false to cancel update.\n\t\t\t\t// (Even if values on later elses are different, we still don't want to update, since rendered output would be unchanged)\n\t\t\t\t// If newArg and prevArg are different, return true, to update\n\t\t\t\t// If newArg and prevArg are both falsey, move to the next {{else ...}}\n\t\t\t}\n\t\t}\n\t\t// Boolean value of all args are unchanged (falsey), so return false to cancel update\n\t\treturn false;\n\t},\n\tonAfterLink: function(tagCtx, linkCtx, ctx, ev, eventArgs) {\n\t\tif (eventArgs) {\n\t\t\tthis.domChange(tagCtx, linkCtx, eventArgs);\n\t\t}\n\t}\n});\n\nfunction observeProps(map, ev, eventArgs) {\n\tif (eventArgs.change === \"set\") {\n\t\tvar target = map.tgt,\n\t\t\tl = target.length;\n\t\twhile (l--) {\n\t\t\tif (target[l].key === eventArgs.path) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (l === -1) {\n\t\t\tif (eventArgs.path && !eventArgs.remove) {\n\t\t\t\t$observable(target).insert({key: eventArgs.path, prop: eventArgs.value});\n\t\t\t}\n\t\t} else if (eventArgs.remove) {\n\t\t\t$observable(target).remove(l);\n\t\t} else {\n\t\t\t$observable(target[l]).setProperty(\"prop\", eventArgs.value);\n\t\t}\n\t}\n}\n\nfunction observeMappedProps(map, ev, eventArgs) {\n\tvar item,\n\t\tsource = map.src,\n\t\tchange = eventArgs.change;\n\n\tif (change === \"set\") {\n\t\tif (eventArgs.path === \"prop\") {\n\t\t\t$observable(source).setProperty(ev.target.key, eventArgs.value);\n\t\t} else { // path === \"key\"\n\t\t\t$observable(source).removeProperty(eventArgs.oldValue); // When key is modified observably, remove old one and set new one\n\t\t\t$observable(source).setProperty(eventArgs.value, ev.target.prop);\n\t\t}\n\t} else if (change === \"remove\") {\n\t\titem = eventArgs.items[0];\n\t\t$observable(source).removeProperty(item.key);\n\t\tdelete source[item.key];\n\t} else if (change === \"insert\") {\n\t\titem = eventArgs.items[0];\n\t\tif (item.key) {\n\t\t\t$observable(source).setProperty(item.key, item.prop);\n\t\t}\n\t}\n}\n\nfunction shallowArrayFilter(allPath /*, object, parentObs*/) { // Filter used by {{props}} for the mappedProps target array\n\treturn allPath.indexOf(\".\") < 0;\n}\n\n$tags(\"props\", {\n\tbaseTag: \"for\",\n\tdataMap: $views.map({\n\t\tgetTgt: $tags.props.dataMap.getTgt,\n\t\tobsSrc: observeProps,\n\t\tobsTgt: observeMappedProps,\n\t\ttgtFlt: shallowArrayFilter\n\t}),\n\tflow: true\n});\n\n//========================\n// Extend jQuery namespace\n//========================\n\n$extend($, {\n\n\t//=======================\n\t// jQuery $.view() plugin\n\t//=======================\n\n\tview: $view = function(node, inner, type) {\n\t\t// $.view() returns top view\n\t\t// $.view(node) returns view that contains node\n\t\t// $.view(selector) returns view that contains first selected element\n\t\t// $.view(nodeOrSelector, type) returns nearest containing view of given type\n\t\t// $.view(nodeOrSelector, \"root\") returns root containing view (child of top view)\n\t\t// $.view(nodeOrSelector, true, type) returns nearest inner (contained) view of given type\n\n\t\tfunction getInnerView(nd, isVl) {\n\t\t\tif (nd) {\n\t\t\t\tvwInfos = viewInfos(nd, isVl, rOpenViewMarkers);\n\t\t\t\tfor (j = 0, k = vwInfos.length; j < k; j++) {\n\t\t\t\t\tif ((view = viewStore[vwInfos[j].id]) && (view = view && type ? view.get(true, type) : view)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (inner !== !!inner) {\n\t\t\t// inner not boolean, so this is view(nodeOrSelector, type)\n\t\t\ttype = inner;\n\t\t\tinner = undefined;\n\t\t}\n\t\tvar view, vwInfos, i, j, k, l, elems,\n\t\t\tlevel = 0,\n\t\t\tbody = document.body;\n\n\t\tif (node && node !== body && topView._.useKey > 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: $link,\n\tunlink: $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// Extend $.views\n//===============\n\n$views.getCtx = function(param) { // Return value of ctx.foo, including for compiled contextual parameters, ~foo=expr\n\tif (param && param._cp) { // If this helper resource is a contextual parameter, ~foo=expr\n\t\tparam = param[1](param[0].data, param[0], $sub);\n\t}\n\treturn param;\n};\n\n//===================\n// Extend $.views.sub\n//===================\n\n$sub._cp = function(paramVal, params, view) { // Get compiled contextual parameters (or properties) ~foo=expr.\n\tif (view.linked) { // In JsViews, returns [view, linkFn] where linkFn is compiled function for expression\n\t\tparams = delimOpenChar1 + \":\" + params + delimCloseChar0;\n\t\tvar tmpl = view.tmpl,\n\t\t\tlinks = topView.tmpl.links, // Use topView links, as for compiled top-level linking expressions. To do - should this ever get disposed?\n\t\t\tlinkFn = links[params];\n\t\tif (!linkFn) {\n\t\t\tlinks[params] = linkFn = $sub.tmplFn(params, tmpl, true);\n\t\t}\n\t\tparamVal = [view, linkFn];\n\t\tparamVal._cp = true; // Flag that this is a contextual parameter\n\t}\n\treturn paramVal; // In JsRender returns evaluated expression\n};\n\n$sub._ceo = function cloneExprObjects(obs) { // Clone exprObs so that each referenced contextual parameter ~foo uses its own exprOb instances\n\tvar ob,\n\t\tclones = obs,\n\t\tl = obs.length;\n\tif (l) {\n\t\tclones = [];\n\t\twhile (l--) {\n\t\t\tob = obs[l];\n\t\t\tif (ob._jsv) {\n\t\t\t\tob = $extend({}, ob); // If an exprOb, clone it. If a string, keep as is\n\t\t\t\tob.prm = cloneExprObjects(ob.prm); // Recursively clone exprObs in parameters, too\n\t\t\t}\n\t\t\tclones.unshift(ob);\n\t\t}\n\t}\n\treturn clones;\n};\n\n//=========================\n// Extend $.views.settings\n//=========================\n\noldAdvSet = $sub.advSet;\n\n$sub.advSet = function() { // refresh advanced settings\n\toldAdvSet();\n\tglobal._jsv = $subSettingsAdvanced._jsv\n\t\t? $extend(global._jsv || {}, { // 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: undefined; // In IE8 cannot do delete global._jsv\n\t$viewsLinkAttr = $subSettingsAdvanced.linkAttr;\n\tlinkViewsSel = bindElsSel + \",[\" + $viewsLinkAttr + \"]\";\n\twrapMap = $subSettingsAdvanced._wm;\n\twrapMap.optgroup = wrapMap.option;\n\twrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n\twrapMap.th = wrapMap.td;\n};\n\n$viewsSettings.advanced({\n\tlinkAttr: \"data-link\",\n\tuseViews: false,\n\tnoValidate: false,\n\t// wrapMap provide appropriate wrappers for inserting innerHTML, used in insertBefore\n\t// We have to close these tags to support XHTML (#13200)\n\t// TODO investigate whether more recent jQuery implementation using wrapMap in domManip/$().html() etc. is better optimized now...\n\t_wm: {\n\t\toption: [1, \"<select multiple='multiple'>\", \"</select>\"],\n\t\tlegend: [1, \"<fieldset>\", \"</fieldset>\"],\n\t\tarea: [1, \"<map>\", \"</map>\"],\n\t\tparam: [1, \"<object>\", \"</object>\"],\n\t\tthead: [1, \"<table>\", \"</table>\"],\n\t\ttr: [2, \"<table><tbody>\", \"</tbody></table>\"],\n\t\ttd: [3, \"<table><tbody><tr>\", \"</tr></tbody></table>\"],\n\t\tcol: [2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\"],\n\t\tsvg_ns: [1, \"<svg>\", \"</svg>\"],\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<div>\", \"</div>\"]\n\t},\n\t_fe: {\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});\n\n\treturn $;\n}, window));\n"],"sourceRoot":"/source/"}