this.jsviews||this.jQuery&&jQuery.views||(function(global,undefined){var versionNumber="v1.0pre",$,rTag,rTmplString,$extend,delimOpenChar0="{",delimOpenChar1="{",delimCloseChar0="}",delimCloseChar1="}",$viewsSub={},FALSE=!1,TRUE=!0,jQuery=global.jQuery,rPath=/^(?:null|true|false|\d[\d.]*|([\w$]+|~([\w$]+)|#(view|([\w$]+))?)([\w$.]*?)(?:[.[]([\w$]+)\]?)?|(['"]).*\8)$/g,rParams=/(\()(?=|\s*\()|(?:([([])\s*)?(?:([#~]?[\w$.]+)?\s*((\+\+|--)|\+|-|&&|\|\||===|!==|==|!=|<=|>=|[<>%*!:?\/]|(=))\s*|([#~]?[\w$.]+)([([])?)|(,\s*)|(\(?)\\?(?:(')|("))|(?:\s*([)\]])([([]?))|(\s+)/g,rNewLine=/\r?\n/g,rUnescapeQuotes=/\\(['"])/g,rEscapeQuotes=/\\?(['"])/g,rBuildHash=/\x08(~)?([^\x08]+)\x08/g,autoTmplName=0,escapeMapForHtml={"&":"&amp;","<":"&lt;",">":"&gt;"},tmplAttr="data-jsv-tmpl",fnDeclStr="var j=j||"+(jQuery?"jQuery.":"js")+"views,",htmlSpecialChar=/[\x00"&'<>]/g,slice=Array.prototype.slice,$render={},$views={jsviews:versionNumber,sub:$viewsSub,debugMode:TRUE,render:$render,templates:$templates,tags:$viewsTags,helpers:$viewsHelpers,converters:$viewsConverters,delimiters:$viewsDelimiters,View:View,_convert:convert,_err:function(e){return $views.debugMode?("Error: "+(e.message||e))+". ":'""'},_tmplFn:tmplFn,_tag:renderTag,error:error,Error:JsViewsError};function JsViewsError(message){this.name="JsRender Error",this.message=message||"JsRender error"}(JsViewsError.prototype=new Error()).constructor=JsViewsError;function $viewsDelimiters(openChars,closeChars){if(!$views.rTag||arguments.length){delimOpenChar0=openChars?"\\"+openChars.charAt(0):delimOpenChar0;delimOpenChar1=openChars?"\\"+openChars.charAt(1):delimOpenChar1;delimCloseChar0=closeChars?"\\"+closeChars.charAt(0):delimCloseChar0;delimCloseChar1=closeChars?"\\"+closeChars.charAt(0):delimCloseChar1;$views.rTag=rTag="(?:(?:(\\w+(?=[\\/\\s"+delimCloseChar0+"]))|(?:(\\w+)?(:)|(>)|(\\*)))"+"\\s*((?:[^"+delimCloseChar0+"]|"+delimCloseChar0+"(?!"+delimCloseChar1+"))*?)";rTag=new RegExp(delimOpenChar0+delimOpenChar1+rTag+"(\\/)?|(?:\\/(\\w+)))"+delimCloseChar0+delimCloseChar1,"g");rTmplString=new RegExp("<.*>|([^\\\\]|^)[{}]|"+delimOpenChar0+delimOpenChar1+".*"+delimCloseChar0+delimCloseChar1)}
return[delimOpenChar0,delimOpenChar1,delimCloseChar0,delimCloseChar1]}
function getHelper(helper){var view=this,tmplHelpers=view.tmpl.helpers||{};helper=(view.ctx[helper]!==undefined?view.ctx:tmplHelpers[helper]!==undefined?tmplHelpers:$viewsHelpers[helper]!==undefined?$viewsHelpers:{})[helper];return typeof helper!=="function"?helper:function(){return helper.apply(view,arguments)}}
function convert(converter,view,tmpl,text){var tmplConverter=tmpl.converters;tmplConverter=tmplConverter&&tmplConverter[converter]||$viewsConverters[converter];return tmplConverter?tmplConverter.call(view,text):(error("Unknown converter: {{"+converter+":"),text)}
function renderTag(tag,parentView,parentTmpl,converter,content,tagInstance){var ret,tmplTags=parentTmpl.tags,nestedTemplates=parentTmpl.templates,props=tagInstance.props=tagInstance.props||{},tmpl=props.tmpl,args=arguments.length>6?slice.call(arguments,6):[],tagFn=tmplTags&&tmplTags[tag]||$viewsTags[tag];if(!tagFn){error("Unknown tag: {{"+tag+"}}");return ""}
if(tmpl){delete props.tmpl}
content=content&&parentTmpl.tmpls[content-1];tmpl=tmpl||content||undefined;tagInstance.tmpl=""+tmpl===tmpl?nestedTemplates&&nestedTemplates[tmpl]||$templates[tmpl]||$templates(tmpl):tmpl;tagInstance.isTag=TRUE;tagInstance.converter=converter;tagInstance.view=parentView;tagInstance.renderContent=renderContent;ret=tagFn.apply(tagInstance,args);return ret||(ret==undefined?"":ret.toString())}
function View(context,path,parentView,data,template,key,onRender,isArray){var views,self={tmpl:template,path:path,parent:parentView,data:data,ctx:context,views:isArray?[]:{},_useKey:isArray?0:1,_hlp:getHelper,_onRender:onRender};if(parentView){views=parentView.views;if(parentView._useKey){views[self.key="_"+parentView._useKey++]=self;self.index=parentView.index}else{views.splice(self.key=self.index=key!==undefined?key:views.length,0,self)}}
return self}
function addToStore(self,store,name,item,process){var key,onStore;if(name&&typeof name==="object"&&!name.nodeType){for(key in name){store(key,name[key])}
return self}
if(!name||item===undefined){if(process){item=process(undefined,item||name)}}else if(""+name===name){if(item===null){delete store[name]}else if(item=process?process(name,item):item){store[name]=item}}
if(onStore=$viewsSub.onStoreItem){onStore(store,name,item,process)}
return item}
function $templates(name,tmpl){return addToStore(this,$templates,name,tmpl,compile)}
function $viewsTags(name,tagFn){return addToStore(this,$viewsTags,name,tagFn)}
function $viewsHelpers(name,helperFn){return addToStore(this,$viewsHelpers,name,helperFn)}
function $viewsConverters(name,converterFn){return addToStore(this,$viewsConverters,name,converterFn)}
function renderContent(data,context,parentView,key,isLayout,path,onRender){var i,l,dataItem,newView,itemResult,parentContext,tmpl,props,swapContent,mergedCtx,self=this,result="";if(key===TRUE){swapContent=TRUE;key=0}
if(self.isTag){tmpl=self.tmpl;if(context||self.ctx){mergedCtx={};if(self.ctx){$extend(mergedCtx,self.ctx)}
if(context){$extend(mergedCtx,context)}}
context=mergedCtx;props=self.props;if(props&&props.link===FALSE){context=context||{};context.link=FALSE}
parentView=parentView||self.view;path=path||self.path;key=key||self.key}else{tmpl=self.jquery&&(self[0]||error('Unknown template: "'+self.selector+'"'))||self}
if(tmpl){if(parentView){parentContext=parentView.ctx;if(data===parentView){data=parentView.data;isLayout=TRUE}
onRender=onRender||parentView._onRender}else{parentContext=$viewsHelpers}
context=(context&&context!==parentContext)?$extend($extend({},parentContext),context):parentContext;if(!tmpl.fn){tmpl=$templates[tmpl]||$templates(tmpl)}
if(tmpl){onRender=context.link!==FALSE&&onRender;if($.isArray(data)&&!isLayout){newView=swapContent?parentView:(key!==undefined&&parentView)||View(context,path,parentView,data,tmpl,key,onRender,TRUE);for(i=0,l=data.length;i<l;i++){dataItem=data[i];itemResult=tmpl.fn(dataItem,View(context,path,newView,dataItem,tmpl,(key||0)+i,onRender),$views);result+=onRender?onRender(itemResult,tmpl,props):itemResult}}else{newView=swapContent?parentView:View(context,path,parentView,data,tmpl,key,onRender);newView._onRender=onRender;result+=tmpl.fn(data,newView,$views)}
return onRender?onRender(result,tmpl,props,newView.key,path):result}}
error("No template found");return ""}
function error(message){if($views.debugMode){throw new $views.Error(message)}}
function syntaxError(message){error("Syntax error\n"+message)}
function tmplFn(markup,tmpl,bind){var newNode,allowCode=tmpl&&tmpl.allowCode,astTop=[],loc=0,stack=[],content=astTop,current=[,,,astTop];function pushPreceedingContent(shift){shift-=loc;if(shift){content.push(markup.substr(loc,shift).replace(rNewLine,"\\n"))}}
function blockTagCheck(tagName){tagName&&syntaxError('Unmatched or missing tag: "{{/'+tagName+'}}" in template:\n'+markup)}
function parseTag(all,tagName,converter,colon,html,code,params,slash,closeBlock,index){if(html){colon=":";converter="html"}
var current0,hash="",passedCtx="",block=!slash&&!colon&&!bind;tagName=tagName||colon;pushPreceedingContent(index);loc=index+all.length;if(code){if(allowCode){content.push(["*",params.replace(rUnescapeQuotes,"$1")])}}else if(tagName){if(tagName==="else"){current[5]=markup.substring(current[5],index);current=stack.pop();content=current[3];block=TRUE}
params=(params?parseParams(params,bind).replace(rBuildHash,function(all,isCtx,keyValue){if(isCtx){passedCtx+=keyValue+","}else{hash+=keyValue+","}
return ""}):"");hash=hash.slice(0,-1);params=params.slice(0,-1);newNode=[tagName,converter||"",params,block&&[],"{"+(hash?("props:{"+hash+"},"):"")+"path:'"+params+"'"+(passedCtx?",ctx:{"+passedCtx.slice(0,-1)+"}":"")+"}"];content.push(newNode);if(block){stack.push(current);current=newNode;current[5]=loc}}else if(closeBlock){current0=current[0];blockTagCheck(closeBlock!==current0&&!(closeBlock==="if"&&current0==="else")&&current0);current[5]=markup.substring(current[5],index);current=stack.pop()}
blockTagCheck(!current&&closeBlock);content=current[3]}
markup=markup.replace(rEscapeQuotes,"\\$1");blockTagCheck(stack[0]&&stack[0][3].pop()[0]);markup.replace(rTag,parseTag);pushPreceedingContent(markup.length);return buildCode(astTop,tmpl)}
function buildCode(ast,tmpl){var node,i,l,code,hasTag,hasEncoder,getsValue,hasConverter,hasViewPath,tag,converter,params,hash,nestedTmpl,allowCode,content,tmplOptions=tmpl?{allowCode:allowCode=tmpl.allowCode,debug:tmpl.debug}:{},nested=tmpl&&tmpl.tmpls,nestedIndex=0;l=ast.length;code=(l?"":'"";');for(i=0;i<l;i++){node=ast[i];if(""+node===node){code+='"'+node+'"+'}else{tag=node[0];if(tag==="*"){code=code.slice(0,i?-1:-3)+";"+node[1]+(i+1<l?"ret+=":"")}else{converter=node[1];params=node[2];content=node[3];hash=node[4];markup=node[5];if(content){nestedTmpl=TmplObject(markup,tmplOptions,tmpl,nestedIndex++);buildCode(node[3],nestedTmpl);nested.push(nestedTmpl)}
hasViewPath=hasViewPath||hash.indexOf("view")>-1;code+=(tag===":"?(converter==="html"?(hasEncoder=TRUE,"e("+params):converter?(hasConverter=TRUE,'c("'+converter+'",view,this,'+params):(getsValue=TRUE,"((v="+params+')!=u?v:""')):(hasTag=TRUE,'t("'+tag+'",view,this,"'+(converter||"")+'",'+(content?nested.length:'""')+","+hash+(params?",":"")+params))+")+"}}}
code=fnDeclStr+(getsValue?"v,":"")+(hasTag?"t=j._tag,":"")+(hasConverter?"c=j._convert,":"")+(hasEncoder?"e=j.converters.html,":"")+"ret; try{\n\n"+(tmplOptions.debug?"debugger;":"")+(allowCode?'ret=':'return ')+code.slice(0,-1)+";\n\n"+(allowCode?"return ret;":"")+"}catch(e){return j._err(e);}";try{code=new Function("data, view, j, b, u",code)}catch(e){syntaxError("Compiled template code:\n\n"+code,e)}
if(tmpl){tmpl.fn=code}
return code}
function parseParams(params,bind){var named,fnCall={},parenDepth=0,quoted=FALSE,aposed=FALSE;function parseTokens(all,lftPrn0,lftPrn,path,operator,err,eq,path2,prn,comma,lftPrn2,apos,quot,rtPrn,prn2,space){operator=operator||"";lftPrn=lftPrn||lftPrn0||lftPrn2;path=path||path2;prn=prn||prn2||"";operator=operator||"";var bindParam=bind&&prn!=="(";function parsePath(all,object,helper,view,viewProperty,pathTokens,leafToken){if(object){var leaf,ret=(helper?'view._hlp("'+helper+'")':view?"view":"data")+(leafToken?(viewProperty?"."+viewProperty:helper?"":(view?"":"."+object))+(pathTokens||""):(leafToken=helper?"":view?viewProperty||"":object,""));leaf=(leafToken?"."+leafToken:"")
if(!bindParam){ret=ret+leaf}
ret=ret.slice(0,9)==="view.data"?ret.slice(5):ret;if(bindParam){ret="b("+ret+',"'+leafToken+'")'+leaf}
return ret}
return all}
if(err){syntaxError(params)}else{return(aposed?(aposed=!apos,(aposed?all:'"')):quoted?(quoted=!quot,(quoted?all:'"')):((lftPrn?(parenDepth++,lftPrn):"")+(space?(parenDepth?"":named?(named=FALSE,"\b"):","):eq?(parenDepth&&syntaxError(params),named=TRUE,'\b'+path+':'):path?(path.replace(rPath,parsePath)+(prn?(fnCall[++parenDepth]=TRUE,prn):operator)):operator?operator:rtPrn?((fnCall[parenDepth--]=FALSE,rtPrn)+(prn?(fnCall[++parenDepth]=TRUE,prn):"")):comma?(fnCall[parenDepth]||syntaxError(params),","):lftPrn0?"":(aposed=apos,quoted=quot,'"'))))}}
params=(params+" ").replace(rParams,parseTokens);return params}
function compile(name,tmpl,parent,options){var tmplOrMarkup,elem,key,nested,nestedItem;function tmplOrMarkupFromStr(value){if((""+value===value)||value.nodeType>0){try{elem=value.nodeType>0?value:!rTmplString.test(value)&&jQuery&&jQuery(value)[0]}catch(e){}
if(elem){if(!elem.type){return}
value=$templates[elem.getAttribute(tmplAttr)];if(!value){name=name||"_"+autoTmplName++;elem.setAttribute(tmplAttr,name);value=compile(name,elem.innerHTML,parent,options);$templates[name]=value}}
return value}}
tmpl=tmpl||"";tmplOrMarkup=tmplOrMarkupFromStr(tmpl);options=options||(tmpl.markup?tmpl:{});options.name=name;nested=options.templates;if(!tmplOrMarkup&&tmpl.markup&&(tmplOrMarkup=tmplOrMarkupFromStr(tmpl.markup))){if(tmplOrMarkup.fn&&(tmplOrMarkup.debug!==tmpl.debug||tmplOrMarkup.allowCode!==tmpl.allowCode)){tmplOrMarkup=tmplOrMarkup.markup}}
if(tmplOrMarkup!==undefined){if(name&&!parent){$render[name]=function(){return tmpl.render.apply(tmpl,arguments)}}
if(tmplOrMarkup.fn||tmpl.fn){if(tmplOrMarkup.fn){if(name&&name!==tmplOrMarkup.name){tmpl=$extend($extend({},tmplOrMarkup),options)}else{tmpl=tmplOrMarkup}}}else{tmpl=TmplObject(tmplOrMarkup,options,parent,0);tmplFn(tmplOrMarkup,tmpl)}
for(key in nested){nestedItem=nested[key];if(nestedItem.name!==key){nested[key]=compile(key,nestedItem,tmpl)}}
return tmpl}}
function TmplObject(markup,options,parent,key){function extendStore(storeName){if(parent[storeName]){tmpl[storeName]=$extend($extend({},parent[storeName]),options[storeName])}}
options=options||{};var tmpl={markup:markup,tmpls:[],links:[],render:renderContent};if(parent){if(parent.templates){tmpl.templates=$extend($extend({},parent.templates),options.templates)}
tmpl.parent=parent;tmpl.name=parent.name+"["+key+"]";tmpl.key=key}
$extend(tmpl,options);if(parent){extendStore("templates");extendStore("tags");extendStore("helpers");extendStore("converters")}
return tmpl}
if(jQuery){$=jQuery;$.templates=$templates;$.render=$render;$.views=$views;$.fn.render=renderContent}else{$=global.jsviews=$views;$.extend=function(target,source){var name;target=target||{};for(name in source){target[name]=source[name]}
return target};$.isArray=Array&&Array.isArray||function(obj){return Object.prototype.toString.call(obj)==="[object Array]"}}
$extend=$.extend;function replacerForHtml(ch){return escapeMapForHtml[ch]||(escapeMapForHtml[ch]="&#"+ch.charCodeAt(0)+";")}
$viewsTags({"if":function(){var ifTag=this,view=ifTag.view;view.onElse=function(tagInstance,args){var i=0,l=args.length;while(l&&!args[i++]){if(i===l){return ""}}
view.onElse=undefined;tagInstance.path="";return tagInstance.renderContent(view)};return view.onElse(this,arguments)},"else":function(){var view=this.view;return view.onElse?view.onElse(this,arguments):""},"for":function(){var i,self=this,result="",args=arguments,l=args.length;if(l===0){l=1}
for(i=0;i<l;i++){result+=self.renderContent(args[i])}
return result},"*":function(value){return value}});$viewsConverters({html:function(text){return text!=undefined?String(text).replace(htmlSpecialChar,replacerForHtml):""}});$viewsDelimiters()})(this)