/*
 *
 * Copyright (c) 2004-2008 by Zapatec, Inc.
 * http://www.zapatec.com
 * 1700 MLK Way, Berkeley, California,
 * 94709, U.S.A.
 * All rights reserved.
 *
 *
 */


if(typeof zapatecTemplate!='function'){zapatecTemplate=Zapatec.Template=function(oArg){Zapatec.Template.SUPERconstructor.call(this,oArg);};Zapatec.Template.id='Zapatec.Template';Zapatec.inherit(zapatecTemplate,zapatecWidget);Zapatec.Template.prototype.init=function(oArg){Zapatec.Template.SUPERclass.init.call(this,oArg);this.loadData();};Zapatec.Template.prototype.configure=function(oArg){var oTemplate=Zapatec.Template;this.defineConfigOption('theme','');this.defineConfigOption('tagLeftDelimiter','#{');this.defineConfigOption('tagRightDelimiter','}');this.defineConfigOption('varLeftDelimiter','@');this.defineConfigOption('varRightDelimiter','');this.defineConfigOption('loopIndex','@@');this.defineConfigOption('syntax',{'':{parser:oTemplate.parseExprOut},'expr':{parser:oTemplate.parseExpr},'expression':{parser:oTemplate.parseExpr},'if':{parser:oTemplate.parseCond},'for':{parser:oTemplate.parseLoop},'rem':{parser:oTemplate.parseComment},'tr':{parser:oTemplate.parseExprTranslate},'translate':{parser:oTemplate.parseExprTranslate},'htmlEscape':{parser:oTemplate.parseExprHtmlEscape}});Zapatec.Template.SUPERclass.configure.call(this,oArg);this.tagRegexp=/^\s*([a-zA-Z]*)\s*(.*)\s*$/;var fEsc=zapatecUtils.escapeRegExp;var oConf=this.config;this.varRegexp=new RegExp([fEsc(oConf.varLeftDelimiter),'(\\w+)',fEsc(oConf.varRightDelimiter)].join(''),'g');this.loopIndexRegexp=new RegExp(fEsc(oConf.loopIndex),'g');this.vars={};this.templates=[];this.tags=[];};Zapatec.Template.prototype.loadDataHtml=function(oSource){if(oSource){if(oSource.tagName.toLowerCase()=='textarea'){this.loadDataHtmlText(oSource.value);}else{this.loadDataHtmlText(oSource.innerHTML);}}else{if(Zapatec.Debug){Zapatec.Debug.log.error('Missing template source: '+this.config.source+'.');}}};Zapatec.Template.prototype.loadDataHtmlText=function(sSrc){Zapatec.Template.parse.call(this,sSrc);};Zapatec.Template.parse=function(sTxt){var oConf=this.config;var sLeftDelim=oConf.tagLeftDelimiter;var iLeftDelimLen=sLeftDelim.length;var sRightDelim=oConf.tagRightDelimiter;var iRightDelimLen=sRightDelim.length;var oTagRegexp=this.tagRegexp;var oVarRegexp=this.varRegexp;var oLoopIndexRegexp=this.loopIndexRegexp;var oSyntax=oConf.syntax;var aTokens=[];var fParseTag=Zapatec.Template.parseTag;var sTail,iPos1,iPos2;while(sTxt){iPos1=sTxt.indexOf(sLeftDelim);if(iPos1!=-1){sTail=sTxt.substring(iPos1+iLeftDelimLen);iPos2=sTail.indexOf(sRightDelim);if(iPos2!=-1){aTokens.push(sTxt.substring(0,iPos1));aTokens.push(fParseTag(sTail.substring(0,iPos2),oTagRegexp,oVarRegexp,oLoopIndexRegexp));sTxt=sTail.substring(iPos2+iRightDelimLen);}else{aTokens.push(sTxt);break;}}else{aTokens.push(sTxt);break;}}
var aTemplates=this.templates=[];var aTags=this.tags=[];var aNewTemplate=[];var aNewTag=[];aTemplates.push(aNewTemplate);aTags.push(aNewTag);var iTokens=aTokens.length;var oToken,oRule;for(var iToken=0;iToken<iTokens;iToken++){oToken=aTokens[iToken];if(typeof oToken=='object'){oRule=oSyntax[oToken.tag];if(oRule){iToken=oRule.parser.call(this,aNewTemplate,aNewTag,aTokens,iToken);}}else{aNewTemplate.push(oToken);aNewTag.push(null);}}};Zapatec.Template.parseTag=function(sTag,oTagRegexp,oVarRegexp,oLoopIndexRegexp){sTag=sTag.replace(zapatecUtilsRegexpSpacePlus,' ');var aM=sTag.match(oTagRegexp);if(aM){return{tag:aM[1],args:aM[2].replace(oVarRegexp,'zpTemplateVars.$1').replace(oLoopIndexRegexp,'zpTemplateIndex')};}
return{tag:'',args:''};};Zapatec.Template.parseExprOut=function(aOutTpl,aOutTags,aTokens,iToken){aOutTags.push(new Function('zpTemplateIndex','var zpTemplateVars=this.vars;return '+aTokens[iToken].args));aOutTpl.push('');return iToken;};Zapatec.Template.parseExprTranslate=function(aOutTpl,aOutTags,aTokens,iToken){aOutTags.push(new Function('zpTemplateIndex','var zpTemplateVars=this.vars;return zapatecTranslate('+
aTokens[iToken].args+')'));aOutTpl.push('');return iToken;};Zapatec.Template.parseExprHtmlEscape=function(aOutTpl,aOutTags,aTokens,iToken){aOutTags.push(new Function('zpTemplateIndex','var zpTemplateVars=this.vars;return zapatecUtils.htmlEncode('+
aTokens[iToken].args+').replace(/\\n/g, "<br />")'));aOutTpl.push('');return iToken;};Zapatec.Template.parseExpr=function(aOutTpl,aOutTags,aTokens,iToken){aOutTags.push(new Function('zpTemplateIndex','var zpTemplateVars=this.vars;'+aTokens[iToken].args+';return ""'));aOutTpl.push('');return iToken;};Zapatec.Template.parseCond=function(aOutTpl,aOutTags,aTokens,iToken){var aTemplates=this.templates;var aTags=this.tags;var aNewTemplate=[];var aNewTag=[];aTemplates.push(aNewTemplate);aTags.push(aNewTag);var iTemplate=aTemplates.length-1;var oSyntax=this.config.syntax;var aFunc=['var zpTemplateVars=this.vars;if(',aTokens[iToken].args,'){return this.compileTemplate(',iTemplate.toString(),',zpTemplateIndex)'];var iTokens=aTokens.length;var oToken,sTag,oRule;for(iToken++;iToken<iTokens;iToken++){oToken=aTokens[iToken];if(typeof oToken=='object'){sTag=oToken.tag;if(sTag=='else'){aNewTemplate=[];aNewTag=[];aTemplates.push(aNewTemplate);aTags.push(aNewTag);iTemplate=aTemplates.length-1;aFunc.push('}else{return this.compileTemplate(');aFunc.push(iTemplate.toString());aFunc.push(',zpTemplateIndex)');}else if(sTag=='elseif'){aNewTemplate=[];aNewTag=[];aTemplates.push(aNewTemplate);aTags.push(aNewTag);iTemplate=aTemplates.length-1;aFunc.push('}else if(');aFunc.push(oToken.args);aFunc.push('){return this.compileTemplate(');aFunc.push(iTemplate.toString());aFunc.push(',zpTemplateIndex)');}else if(sTag=='endif'){break;}else{oRule=oSyntax[sTag];if(oRule){iToken=oRule.parser.call(this,aNewTemplate,aNewTag,aTokens,iToken);}}}else{aNewTemplate.push(oToken);aNewTag.push(null);}}
aFunc.push('}');aOutTags.push(new Function('zpTemplateIndex',aFunc.join('')));aOutTpl.push('');return iToken;};Zapatec.Template.parseLoop=function(aOutTpl,aOutTags,aTokens,iToken){var aTemplates=this.templates;var aTags=this.tags;var aNewTemplate=[];var aNewTag=[];aTemplates.push(aNewTemplate);aTags.push(aNewTag);var iTemplate=aTemplates.length-1;var oSyntax=this.config.syntax;var aFunc=['var zpTemplateVars=this.vars;var zpTemplateIndex=0;var zpTemplateArray=(',aTokens[iToken].args,');if(!(zpTemplateArray instanceof Array)){return ""};var zpTemplateArrayLen=zpTemplateArray.length;var zpTemplateTpl=[];for(;zpTemplateIndex<zpTemplateArrayLen;zpTemplateIndex++){zpTemplateTpl.push(this.compileTemplate(',iTemplate.toString(),',zpTemplateIndex))};return zpTemplateTpl.join("")'];var iTokens=aTokens.length;var oToken,sTag,oRule;for(iToken++;iToken<iTokens;iToken++){oToken=aTokens[iToken];if(typeof oToken=='object'){sTag=oToken.tag;if(sTag=='endfor'){break;}else{oRule=oSyntax[sTag];if(oRule){iToken=oRule.parser.call(this,aNewTemplate,aNewTag,aTokens,iToken);}}}else{aNewTemplate.push(oToken);aNewTag.push(null);}}
aOutTags.push(new Function(aFunc.join('')));aOutTpl.push('');return iToken;};Zapatec.Template.parseComment=function(aOutTpl,aOutTags,aTokens,iToken){var iTokens=aTokens.length;var oToken;for(iToken++;iToken<iTokens;iToken++){oToken=aTokens[iToken];if(typeof oToken=='object'){if(oToken.tag=='endrem'){break;}}}
return iToken;};Zapatec.Template.prototype.assign=function(sVar,sVal){this.vars[sVar]=sVal;};Zapatec.Template.prototype.assignVars=function(oArg){if(oArg){var oVars=this.vars;var sVar;for(sVar in oArg){oVars[sVar]=oArg[sVar];}}};Zapatec.Template.prototype.reassignVars=function(oArg){this.vars={};this.assignVars(oArg);};Zapatec.Template.prototype.compileTemplate=function(iTpl,iLoopIndex){var aTpl=this.templates[iTpl];var aTags=this.tags[iTpl];var iTags=aTags.length;var iTag,fTag;try{for(iTag=0;iTag<iTags;iTag++){fTag=aTags[iTag];if(typeof fTag=='function'){aTpl[iTag]=fTag.call(this,iLoopIndex);}}}catch(oExpn){var oConf=this.config;this.debug(oExpn.message.replace(/zpTemplateVars\.(\w+)/g,[oConf.varLeftDelimiter,'$1',oConf.varRightDelimiter].join('')).replace(/zpTemplateIndex/g,oConf.loopIndex));}
return aTpl.join('');};Zapatec.Template.prototype.compile=function(oArg,oContainer){if(oArg){this.reassignVars(oArg);}
var sHtml=this.compileTemplate(0);if(oContainer){zapatecTransport.parseHtml(sHtml,oContainer);}else{return sHtml;}};}