/**
 * Javascript Templating for Habita
 * Erkki-Ilmari Rajakoski
 * Creanor 2010
 */

JSTemplate = {
	populate : function(template, data){
		return tmpl(template, data);
	},

	get : function(template, callback) {
		if (JSTemplates[template] === undefined) {
			JSTLoader.load(template, function(templateStr) {
				JSTemplates[template] = templateStr;
				Loader.decreaseCallCount();
				callback(templateStr);
			});
		} else {
			callback(JSTemplates[template]);
		}
	}
};


// Simple JavaScript Templating
// John Resig - http://ejohn.org/ - MIT Licensed
tplCache = [];

function tmpl(str, data){

	// Figure out if we're getting a template, or if we need to
	// load the template - and be sure to cache the result.
	var fn = !/\W/.test(str) ?
	  tplCache[str] = tplCache[str] ||
		tmpl(JSTemplates[str]) :

	  // Generate a reusable function that will serve as a template
	  // generator (and which will be cached).
	  new Function("obj",
		"var p=[],print=function(){p.push.apply(p,arguments);};" +

		// Introduce the data as local variables using with(){}
		"with(obj){p.push('" +

		// Convert the template into pure JavaScript
		str
		  .replace(/[\r\t\n]/g, " ")
		  .split("<%").join("\t")
		  .replace(/((^|%>)[^\t]*)'/g, "$1\r")
		  .replace(/\t=(.*?)%>/g, "',$1,'")
		  .split("\t").join("');")
		  .split("%>").join("p.push('")
		  .split("\r").join("\\'") + "');}return p.join('');");

	// Provide some basic currying to the user
	return data ? fn( data ) : fn;
}
