//
// tmpl.js
//
// micro-templating - http://ejohn.org/blog/javascript-micro-templating/
//
// Simple JavaScript Templating
// John Resig - http://ejohn.org/ - MIT Licensed
//
// Syntax:
// <%= expression %>
// <% codeblock %>
// var cached_template = tmpl("template_id");
//
// Changes:
// - Fixed single quote escaping issue
// - Added htmlEncode to prevent cross site scripting death
//

function htmlEncode(value){
  if (!value) { return ""; }
  return $('<div/>').text(value).html(); 
} 

function htmlDecode(value){ 
  return $('<div/>').html(value).text(); 
}

(function(){
    var cache = {};
    
    this.tmpl = 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) ?
	cache[str] = cache[str] ||
        tmpl(document.getElementById(str).innerHTML) :
	
        // 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, "',htmlEncode($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;
    };
})();

