(function ($) {

    $.fn.parseTemplate = function (data) {
        var self = $(this);
        var str = self.find("script").html();
        var _tmplCache = {}
        var err = "";
        try {
            var func = _tmplCache[str];
            if (!func) {
                var strFunc =
												"var p=[],print=function(){p.push.apply(p,arguments);};" +
															"with(obj){p.push('" +
												str.replace(/[\r\t\n]/g, " ")
												   .replace(/'(?=[^#]*#>)/g, "\t")
												   .split("'").join("\\'")
												   .split("\t").join("'")
												   .replace(/<#=(.+?)#>/g, "',$1,'")
												   .split("<#").join("');")
												   .split("#>").join("p.push('")
												   + "');}return p.join('');";
                //alert(strFunc);
                func = new Function("obj", strFunc);
                _tmplCache[str] = func;
            }
            if ($.type(data) === "array") {
                var raw = "";
                for (var i in data) {
                   if ($.type(data[i]) !== "function")
                        raw += func(data[i]);
                }
                self.html(raw);
                return self;
            }
            else {
                self.html(func(data));
                return self;
            }
        } catch (e) { err = e.message; }
        self.html("< # Ooops: " + err.toString() + " # >");
        return self;
    }

})(jQuery);
