﻿(function($) {
    $.fn.parseTemplate = function(data) {
        var str = (this).html();
        var _tmplCache = {}
        var rows = [];
        var err = "";
        //try {
        var func;
        for (var i = 0; i < data.length; i++) {
            data[i]["index"] = i;
            func = _tmplCache[str];
            if (!func) {
                var strFunc =
                    "var p=[],print=function(){p.push.apply(p,arguments);};" +
                                "with(data){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('');";
                      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('');";

                //alert(strFunc);
                func = new Function("data", strFunc);
                _tmplCache[str] = func;
            }
            rows.push(func(data[i]));
        }
        //} catch (e) {
        //    err = e.message;
        //}
        if (err != "") {
            return "< # ERROR: " + err.toString() + " # >";
        } else {
            return rows.join("");
        }
    }
})(jQuery);
