/*Templater
 * 
 * requires jquery, core.js
 * */

(function($){$.extend($,{
	templater:function(){				
		return Templater;
		}
	});
})(jQuery);

$.extend($.fn,{
	htmlTemplate:function(t,data){				
		if (this.length){
			var html=$.templater().fetch(t,data);
			for (var i=0;i<this.length;i++){
				$(this[i]).html(html)
				}
			}
		return this;
		}
	});

function Templater(){
	}
$.extend(Templater,{
	templates:{},
	fetch:function(t,data){
		return Templater.parse(Templater.templates[t]||String(t),data||{});
		},
	display:function(el,t,data){
		
		},
	parse:function(tmpl, ns) {
		if (!tmpl){
			return '';
			}										
		var parseProp=function(p){
			if (typeof(p)=='object'){
				$.each(p,function(i){
					p[i]=parseProp(p[i]);
					});
				return p;
				}
			if (p.charAt(0)=='`' && p.charAt(p.length-1)=='`'){
				return _prop(ns,p.slice(1,-1));
				}
			return String(p).replace(/(\`.+\`)/g, function(pw,pg){
				return _prop(ns,pg.slice(1,-1));
				});	
			}					
		var parseTmpl=function(w, g) {
			var 
				pr=g.split(' '),
				props={};
			g=pr.shift();
			if (pr.length){
				(' '+pr.join(' ')).replace(/\s([^=]+?)=\"([^\"]+?)\"/g,function(pw,v1,v2){
					props[v1]=parseProp(v2);
					});							
				}
			g = g.split('|');
			var h=g[0].split(':');
			if (h[1] && Templater.handlers[h[0]]){
				var cnt=Templater.handlers[h[0]](parseProp(h[1].split(',')),$.extend({},ns,props));
				}
			else{
				var cnt = _prop(ns,g[0]);/* ns[g[0]]; */								
				}
			for(var i=1; i < g.length; i++){
				if (is_function(Templater.modifiers[g[i]])){
					cnt=Templater.modifiers[g[i]](cnt);
					}
				else if (is_function(window[g[i]])){
					cnt=window[g[i]](cnt);
					}						
				//cnt = eval(g[i])(cnt);
				}
			return isset(cnt)?cnt:'';
			}					
		return tmpl.replace(/\%\(([A-Za-zА-Яа-яёЁ0-9_|.:,\` \=\"\-\!]+)\)/g, parseTmpl);
		},				
	register:function(t,v){
		if (typeof(t)=='object'){
			$.each(t,function(name){
				Templater.register(String(name),this);
				});
			}
		else{
			Templater.templates[t]=$.isArray(v)?v.join(''):String(v);
			}
		},		
	modifiers:{
		round:function(r){
			return is_numeric(r)?Math.round(r):r;
			},
		wrap:function(r){
			if (BROWSER.isIE){
				/*For IE its better to use white-space:break-word; on parent container */
				return r;
				}
			var step=15;
			r=r?String(r).replace(new RegExp("(.{"+step+"})","ig"),"<span class=\"wrap-quantum\">$1</span>"):'';
			return r;
			},
		clearUrl:function(r){
			r=r?r.replace(/^((?:https?:\/\/)?(?:www\.)?)(.+?)(\/?)$/i,"$2"):'';
			return r;
			},
		escapehtml:function(r){
			if (!r){
				return r;
				}
			return String(r)
				.replace(/«/g,'&laquo;')
				.replace(/»/g,'&raquo;')
				.replace(/\"/g,'&quot;')
				.replace(/\</g,'&lt;')
				.replace(/\>/g,'&gt;');
			}
		},
	appendModifier:function(name,body){
		if (typeof(name)=='object'){
			for (var i in name){
				Templater.appendModifier(i,name[i])
				}
			return;
			}
		if (typeof(body)=='function'){
			Templater.modifiers[name]=body;
			}
		},
	handlers:{
		include:function(a,data){
			return Templater.fetch(a[0],data);
			},
		applyForEach:function(a,data){
			if (!a || !a[0] || !a[1]){
				return '';
				}						
			var obj=_prop(data,a[0]);
			var res='';
			var iter=0;
			typeof(obj)=='object' && $.each(obj,function(key){
				res+=Templater.fetch(a[1],$.extend({},data,{__item:this,__key:key,__isFirst:!(iter++),__isLast:(obj.length && obj.length==key+1)}));
				});
			return res;
			},
		applyIf:function(a,data){
			if (!a || !a[0]){
				return '';
				}
			var t=true;
			
			if (String(a[0]).substr(0,1)=='!'){
				a[0]=String(a[0]).substr(1);
				t=false
				}
			var r=false;
			try{
				r=!!eval(_prop(data,a[0]));
				}
			catch(err){
				r=!!eval("'"+_prop(data,a[0])+"'");
				}
			return ((t && r) || (!t && !r))?Templater.fetch(a[1],data):Templater.fetch(a[2]||'',data);
			}
		}
	});