
var consts=['TERM','FOLL','EVAL','FOR','FOR_ITEM','FOR_ISET','FOR_IB','CONDITIONAL','BODY','VAR','NEWL','COMMAND','CONSUME','COMMAND_ELSE','COMMAND_END'];for(var i=0;i<consts.length;i++){eval('T2'+consts[i]+' = "T2'+consts[i]+'";');}
String=Class.do_extend(String,{render:function(vars){return((new Template3(this)).str(vars))}});function render(template,vars){return(new Template3(template)).str(vars);}
var Template3_StackCache={};var Template3_DataCache={};var Template3=Class.create({initialize:function(data,vars){this.cache_name=data;if(Template3_DataCache[this.cache_name]){data=Template3_DataCache[this.cache_name];}else{if($(data)){if($(data).text)
data=$(data).text;else
data=$(data).innerHTML;}
if(!data){console.error("You need to have data!");console.trace();return;}
data=data.replace(/  /g,'');data=data.replace(/\n\n/g,"\n");this.data=" "+data;}
this.state=T2BODY;this.buffer="";this.index=0;this._elsestack=[];this._stack=[];this._openstack=[];},putc:function(idx_no){if(this.buffer!="")
this.buffer=this.buffer.substring(0,this.buffer.length-1);if(!idx_no)
this.index--;},getc:function(TYPE){var args=[];for(var i=1;i<arguments.length;i++){args.push(arguments[i]);}
var c="";switch(TYPE){case T2TERM:c=this.bload(args);this.index++;break;case T2FOLL:break;default:c=this.data.charAt(this.index);this.buffer+=c;this.index++;break;}
if(this.index>=this.data.length||this.index<1){this._stop=true;return null;}
return c;},stack:function(){while(true){var c;var old_state=this.state;this.__starter=false;this.__ender=false;switch(this.state){case T2CONSUME:while(this.data.charAt(this.index)==" "||this.data.charAt(this.index)=="\n"){this.index++;}
this.state=T2NEWL;break;case T2NEWL:var c=this.getc();switch(c){case'>':this.state=T2COMMAND;break;case'@':this.state=T2EVAL;break;case'*':this.state=T2COMMAND_ELSE;break;case'%':this.state=T2COMMAND_END;break;case' ':break;default:this.putc();this.state=T2BODY;break;}
break;case T2BODY:c=this.getc(T2TERM,'[%','\n')
if(c=='[%'){this.index++;this.buffer+=this.data.charAt(this.index);this.buffer+=this.data.charAt(this.index+1);this.state=T2VAR;this.putc(true);this.putc(true);}else if(c=='\n'){this.state=T2CONSUME;}
break;case T2COMMAND:this.state=(this.look(" in ")!=-1)?T2FOR:T2CONDITIONAL;break;case T2COMMAND_ELSE:this.state=T2CONSUME;break;case T2COMMAND_END:this.__ender=true;this.state=T2CONSUME;break;case T2EVAL:this.bload('@');this.state=T2NEWL;break;case T2FOR:this.__starter=true;var in_pos=this.data.indexOf('in ',this.index);this.buffer+=this.data.substring(this.index,in_pos);this.state=T2FOR_ITEM;break;case T2FOR_ITEM:this.index=this.data.indexOf('in ',this.index)+3;while(this.data.charAt(this.index)!='\n'&&this.index<this.data.length){this.buffer+=this.data.charAt(this.index);this.index++;}
this.index++;this.state=T2NEWL;break;case T2FOR_IB:this.bload(' ');this.state=T2FOR_ISET;break;case T2FOR_ISET:this.bload('\n');this.state=T2CONSUME;break;case T2CONDITIONAL:this.__starter=true;this.bload('\n');this.state=T2NEWL;break;case T2VAR:while(this.data.charAt(this.index)!=']'&&this.index<this.data.length){this.buffer+=this.data.charAt(this.index);this.index++;}
this.index++;this.state=T2BODY;break;default:this._stop=true;console.error("Parse Error! %s",this.state);break;}
if(this._stop){this.trans(this.state);return;}else{if(old_state!=this.state)
this.trans(old_state);}}},trans:function(old){var set={};set.repr=this.buffer;set.type=old;set.index=this.index;set.index2=this._stack.length;if(this.__ender||old==T2COMMAND_END){var starter=this._openstack.pop();this._stack[starter].ends_at=this._stack.length;set.ender=true;}
if(old==T2CONDITIONAL){this._elsestack.push(this._stack.length);}
if(old==T2COMMAND_ELSE){this._stack[this._elsestack.pop()].else_at=this._stack.length;}
if(this.__starter){set.starter=true;this._openstack.push(this._stack.length);}
if(old!=T2CONSUME&&old!=T2NEWL)
this._stack.push(set);this.buffer="";},look:function(f){return(this.data.substring(this.index,this.data.indexOf("\n",this.index+1)).indexOf(f));},str:function(vars){if(Template3_StackCache[this.cache_name]){this._stack=Template3_StackCache[this.cache_name].clone();}else{this.stack();Template3_StackCache[this.cache_name]=this._stack.clone();}
this._stack.end=this._stack.length-1;return this.render(vars,this._stack);},render:function(vars,stack,cut){if(vars){for(k in vars)
if(k-k!=0)eval('var '+k+' = vars[k];');}
cut=cut||0;rendered="";if(!stack)stack=this._stack;stack=stack.clone();var stack_copy=stack.clone();var focus,iter_set;for(var _idx=0;_idx<stack.length;_idx++){var focus=stack[_idx];if(focus==null)
continue;if(focus.ends_at){ends_at=focus.ends_at-cut;var in_block=stack.clone().splice(_idx+1,stack.length-(_idx+1));do{if(in_block.length==0)
console.error("Stack problem!");var tes=in_block.pop();}while(tes.index2!=this._stack[focus.ends_at].index2);for(var jdx=_idx+1;jdx<ends_at;jdx++)
stack[jdx]=null;if(focus.type==T2CONDITIONAL){var elsed=false;if(focus.else_at){var es=focus.repr;elsed=stack_copy[focus.else_at-cut];var ef=elsed.repr;var es_block=in_block.splice(0,focus.else_at-cut-(_idx+1));var ef_block=in_block;}else{var es_block=in_block;}
if(eval(focus.repr)){rendered+=this.render(vars,es_block,es_block[0].index2);}else if(elsed){rendered+=this.render(vars,ef_block,ef_block[0].index2);}}else if(focus.type==T2FOR){var iter_set=stack_copy[_idx+1].repr;var is_low=null,is_top;if(iter_set.indexOf(" to ")!=-1){var is_sp=iter_set.split(" to ");is_low=is_sp[0]*1;is_top=is_sp[1]*1;}else if((iter_set-iter_set==0)){is_low=0;is_top=eval(iter_set);}
if(is_low!=null){var _a=[];for(var kdx=is_low;kdx<=is_top;kdx++)
_a.push(kdx);iter_set=_a;}else{iter_set=eval(iter_set);}
for(var kdx=0;kdx<iter_set.length;kdx++){vars[focus.repr]=iter_set[kdx];rendered+=this.render(vars,in_block,in_block[0].index2);}}}else if(focus.type==T2EVAL){eval(focus.repr);}else if(focus.type==T2BODY){rendered+=focus.repr;}else if(focus.type==T2VAR){rendered+=eval(focus.repr);}}
return rendered;},bload:function(args){if(typeof(args)=='string')
args=[args];var i;var that=this;var arg;var found_at;var indexed=this.index;var last_find=this.data.length;var last_succ=false;for(i=0;i<args.length;i++){arg=args[i];found_at=that.data.indexOf(arg,indexed);if(found_at>=0&&found_at<last_find){last_find=found_at;last_succ=arg;}}
if(last_find==this.data.length)return null;this.buffer+=this.data.substring(indexed,last_find);this.index=last_find;return last_succ;}});