//> YAJET -- Yet Another JavaScript Emplate Tengine
//> Author: Mihai Bazon <mihai.bazon@gmail.com>
//> Distributed under the BSD license.  Visit www.yajet.net for details.
//> (c) Mihai Bazon 2010
function YAJET(m){m=n(m||{},{reader_char:"$",filters:{},directives:{},with_scope:false});var j=this.TEMPLATES={};var s=0;function r(){return"__GSY"+(++s)}function l(y){return y[y.length-1]}function x(z,B,C){var A=0,D=z.length,y=new Array(D);while(--D>=0){y[A]=B.call(C,z[A++])}return y}var w={"(":")","{":"}","[":"]"};var f=m.reader_char;var g=i(f);this.X_CONT={};this.X_BREK={};this.X_IMPORT={};var o="var __EXPORTS = {};";var v="return (this === YAJET.X_IMPORT) ? __EXPORTS : __BUF;";var d=("var __BUF = '', VUT = OUT;function OUT(str) { if (str != null) __BUF += str };");var t="return __BUF";var c=("} catch(ex) { if (ex === YAJET.X_CONT) continue;if (ex === YAJET.X_BREK) break;throw ex;}");function e(y){y=q(y);return"function "+y+"(){return YAJET.process("+i(y)+", this, arguments)}"}function k(ab){var z=[],L=[],N=0,ad=ab.length,P="",S=this,E=[];var I={"if":function(){K("if ("+Q()+") {")},aif:function(){var af=Q(true);var ae=af.length>1?af[1]:"it";var ag=af.length>2?af[2]:(ae+" != null && "+ae+" !== false && !("+ae+" instanceof Array && "+ae+".length == 0) && !("+ae+" === '')");K("(function("+ae+") { if ("+ag+") {","}}).call(this, "+af[0]+");")},unless:function(){K("if (!("+Q()+")) {")},"else":function(){aa("} else {");X(")")},elsif:function(){aa("} else if ("+Q()+") {");X(")")},maphash:function(){var af=Q(true);var ag=af[0],ai=af[1],ah=af[2],ae=r();K("(function("+ae+") {for (var "+ag+" in "+ae+") {if ("+ae+".hasOwnProperty("+ag+")) try {var "+ai+" = "+ae+"["+ag+"];",c+"}}).call(this, "+ah+");")},map:function(){var ai=Q(true),ag,aj,af,ah=r(),ae=r();if(ai.length==3){ag=ai[0],aj=ai[1],af=ai[2]}else{ag=r();if(ai.length==2){aj=ai[0],af=ai[1]}else{if(ai.length==1){af=ai[0]}}}K("(function("+ah+") {for (var "+(ai.length==1?"$_,":"")+ae+" = "+ah+".length,"+ag+" = 0; "+ag+" < "+ae+"; ++"+ag+") try {"+(ai.length==1?"with ($_ = "+ah+"["+ag+"]) {":"var "+aj+" = "+ah+"["+ag+"];"),(ai.length==1?"}":"")+c+"}).call(this, "+af+");")},repeat:function(){var ag=Q(true),ah,ai=1,ae,af=r();if(ag.length==3){ai=ag.shift()}ah=ag.shift();ae=ag.shift()||r();K("(function("+af+") {for (var "+ae+" = "+ai+"; "+ae+" <= "+af+"; ++"+ae+") try {",c+"}).call(this, "+ah+");")},"continue":function(){aa("throw YAJET.X_CONT;");X(")")},"break":function(){aa("throw YAJET.X_BREK;");X(")")},let:function(){K("(function(){","}).call(this);");J()},"var":function(){J();X(")")},"with":function(){K("with ("+Q()+") {")},block:function(){G();var af=D();var ae=q(Q());K("function "+af+"("+ae+") {"+d,t+"}")},"export":function(){G();var af=D();var ae=q(Q());K(af+" = __EXPORTS["+i(af)+"] = function("+ae+") {"+d,t+"}; ");E.push(af)},"import":function(){var ae=Q(true);X(")");aa(x(ae,e).join(";\n")+";")},process:function(){G();var af=D();var ae=Q();X(")");aa("VUT(YAJET.process("+i(af)+", this, ["+ae+"]));")},wrap:function(){G();var af=D();var ae=q(Q());if(ae){ae+=", "}af="(typeof "+af+" == 'function' ? "+af+" : YAJET.TEMPLATES."+af+")";K("VUT("+af+".call(this, "+ae+"function(OUT, VUT){","}));")},content:function(){aa("if (arguments[arguments.length - 1] instanceof Function) arguments[arguments.length - 1].call(this, OUT, VUT);");X(")")},literal:function(){var ae,ag,af;G();ae=C()+")";W(/^[ \t\xA0]*\n/);ag=ab.indexOf(ae,N);if(ag<0){b("Unfinished LITERAL (was looking for "+ae)}af=ab.substring(N,ag);N=ag+ae.length;aa("OUT("+i(af)+")")},syntax:function(){var ae=f;G();f=T();K("",function(){f=ae})}};I.when=I["if"];I.awhen=I.aif;I.foreach=I.map;var B={peek:U,next:T,rest:O,out:aa,skip_ws:G,assert:A,assert_skip:X,skip:W,looking_at:Y,block_open:K,block_close:V,read_balanced:Q,read_string:C,read_simple_token:D,read_valist:J,to_js_string:i,trim:q,map:x,set_output:H,directives:m.directives,EX_PARSE:b};R();if(m.with_scope){z.unshift("with (this) {");z.push("}")}if(E.length>0){z.unshift("var "+E.join(", ")+";")}var F=u.call(this,z.join("\n"));if(E.length>0){var ac=F(this.X_IMPORT);for(var Z in ac){if(ac.hasOwnProperty(Z)){j[Z]=ac[Z]}}}return F;function U(){return ab.charAt(N)}function T(){return ab.charAt(N++)}function O(ae){return ab.substr(N,ae!=null?ae:ad)}function aa(ae){z.push(ae)}function y(){if(P.length>0){aa("OUT("+i(P)+");")}P=""}function G(af){var ae=false;while(W(" ")||W("\t")||W("\n")||W("\xa0")||(!af&&(W("//","\n")||W("/*","*/")||W("<!--","-->")))){ae=true}return ae}function A(af){var ae=Y(af);if(!ae){b("Expecting "+af+" at "+N)}return ae}function X(ae){G();N+=A(ae).length}function W(ag,ae){var af=Y(ag);if(af){N+=af.length;if(ae){var ah=ab.indexOf(ae,N);if(ah==-1){throw b('Unterminated "'+ag+'" at '+O())}N=ah+ae.length}}return af}function Y(ae){if(ae instanceof RegExp){return(ae=ae.exec(O()))&&{match:ae[0],length:ae[0].length,groups:ae}}return O(ae.length)==ae?{match:ae,length:ae.length}:null}function K(af,ae){if(!ae){ae="}"}aa(af);L.push(ae)}function V(){var ae=L.pop();if(ae instanceof Function){ae()}else{aa(ae)}}function H(af){var ae=z;z=af;return ae}function Q(ak){G();var ae=U();var ai=w[ae];if(ai){var ag=[ai];var aj="";var af=[];++N;while(N<ad){var ah=U();if(ah==l(ag)){ag.pop();++N;if(ag.length==0){if(ak){aj=q(aj);if(aj){af.push(aj)}return af}return aj}aj+=ah}else{if(ah in w){ag.push(w[ah]);++N;aj+=ah}else{if(ah=='"'||ah=="'"){aj+=i(C())}else{if(ak&&ag.length==1&&(W(",")||W(";")||W("=>")||W(".."))){af.push(aj);G();aj=""}else{if(G()){aj+=" "}else{++N;aj+=ah}}}}}}}}function R(){while(N<ad){var ae=T();if(ae==f){if(W(ae)){P+=ae}else{if(W("#")){var af=ab.indexOf("\n",N);if(af==-1){af=ad}N=af}else{y();M()}}}else{P+=ae}}y()}function C(){var af=U();if(af=="'"||af=='"'){var ai=N;var ae=false,ah="";do{++N;var ag=U();if(!ae){if(ag=="\\"){ae=true;continue}if(ag==af){++N;return ah}}else{switch(ag){case"b":ag="\b";break;case"f":ag="\f";break;case"n":ag="\n";break;case"t":ag="\t";break;case"r":continue;case"u":++N;ag=parseInt(O(4),16);if(isNaN(ag)){b("Expecting an Unicode character code at: "+N)}ag=String.fromCharCode(ag);N+=4;break}}ae=false;ah+=ag}while(N<ad);b("Unterminated string at: "+ab.substr(ai))}}function D(ai){var af="",ae=0,ag,ah;for(;;){ag=U();ah=ag.charCodeAt(0);if((ah>=65&&ah<=90)||(ah>=97&&ah<=122)||(ah>=48&&ah<=57)||ah==95||(ah==36&&!ai)||ah==124||ah==46){af+=ag;(ah==36||ah==124||ah==46)?++ae:(ae=0);++N}else{break}}if(ae>0){N-=ae;af=af.substr(0,af.length-ae)}return af}function J(){var ae=[];X("(");while(N<ad){G();if(Y("(")){ae.push(Q(true))}else{if(W(")")){break}else{ae.push(D())}}}aa("var "+x(ae,function(af){return af instanceof Array?af[0]+" = "+af[1]:af}).join(", ")+";")}function M(){if(W("_")){aa("VUT($_);")}else{if(W("-")){G(true)}else{if(W("(")){var ae=D();if(ae){ae=ae.toLowerCase();var aj=m.directives[ae]||I[ae];if(!aj){b("Unknown directive: "+ae.toUpperCase())}aj.call(S,B)}else{--N;aa(Q()+";")}}else{if(W(")")){V()}else{if(W("(")){b("Unrecognized construct at "+O())}else{if(Y("{")){var af=Q(true);if(af.length>0&&/\S/.test(af[0])){var ak=af.shift();while(af.length>0){var ai=q(af.shift());var ah=ai.indexOf("(");var ag=null;if(ah>=0){ag=q(ai.substring(ah+1,ai.length-1));ai=ai.substring(0,ah)}if(!ag){ag=ak}else{ag=ak+", "+ag}ak="YAJET.filter("+i(ai)+", "+ag+")"}aa("VUT("+ak+");")}}else{G();var af=D(true).split(/\s*\|\s*/);var ak=af.shift();while(af.length>0){ak="YAJET.filter("+i(af.shift())+", "+ak+")"}aa("VUT("+ak+");")}}}}}}}}function i(y){return'"'+y.replace(/\x5c/g,"\\\\").replace(/\r?\n/g,"\\n").replace(/\t/g,"\\t").replace(/\x22/g,'\\"')+'"'}function b(y){throw new Error(y)}function h(y){throw new Error(y)}function u(B){try{B=(o+d+B+v);var y=this,C=new Function("YAJET",B);function z(D){return C.call(D,y)}z.orig=C;z.code=B;return z}catch(A){window.console&&console.log("%s",B);A.yajetCode=B;throw A}}function q(y){return y.replace(/^\s+|\s+$/g,"")}var a=YAJET.FILTERS={html:function(y){return String(y).replace(/&/g,"&amp;").replace(/\x22/g,"&quot;").replace(/\x27/g,"&#x27;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\u00A0/g,"&#xa0;")},upcase:function(y){return String(y).toUpperCase()},downcase:function(y){return String(y).toLowerCase()},plural:function(z,y){if(!(y instanceof Array)){if(arguments.length>2){y=Array.$(arguments,1)}else{y=y.split("|")}}y=z<y.length?y[z]:y[y.length-1];return y.replace(/##?/g,function(A){return A.length==2?"#":z})},trim:q};this.compile=k;this.filter=function(A){var y=p(arguments,1);var z=m.filters[A]||a[A];if(z){return z.apply(this,y)}h("No filter "+A)};this.process=function(y,B,z){if(z==null){z=[]}var A=j[y];if(!A){h("No exported function: "+y)}return A.apply(B,z)};this.reader_char=function(){return f};function n(y,B,z,A){A={};for(z in B){if(B.hasOwnProperty(z)){A[z]=B[z]}}for(z in y){if(y.hasOwnProperty(z)){A[z]=y[z]}}return A}function p(C,D){if(D==null){D=0}var y,B,z;try{y=Array.prototype.slice.call(C,D)}catch(A){y=new Array(C.length-D);for(B=D,z=0;B<C.length;++B,++z){y[z]=C[B]}}return y}};
