﻿// v

// vRender : global function that renders a template 

// template - the html template to render
// dataset - the whole dataset we're working from
// data - the particular data object we're referencing


var _tmplCache = {} //global object for storing compiled templates

this.vRender = function(templatename, str, data, dataset) {

    if (str == null) vLog("vRender", "No renderer given");
    //vLog('vrenderstart', templatename + ":" + str); 

    var err = "";
    try {


        var func = _tmplCache[templatename];
        if (!func) {

            /***** START RENDER CODE ******/


            var strfunct = str.replace('{{', '&#123;'); //replace curly braces
            strfunct = strfunct.replace('}}', '&#125;');
            strfunct = strfunct.replace(/[\r\t\n]/g, " "); //turn special characters into spaces...

            strfunct = strfunct.replace(/[\{]/g, '}*');

            var ca = strfunct.split("}"); //split on { and } but the script starts now have an asterisk
            var started = false;
            var newstring = ""

            var mode = 0; 	//0 beginning
            //1 Literal
            //2 Javascript

            //iterate through the chunks, anything with a * is a command
            //


            for (var i = 0; i < ca.length; i++) {
                //if(i) newstring += ',';


                if (ca[i].substr(0, 1) == "*") {				//this is a command

                    if (ca[i].substr(1, 1) == "=") {

                        if (mode != 1) newstring += ";p.push("; 	//if the last wasn't a literal then we're starting a push again...
                        else newstring += ","; 				//or we're just continuing it

                        newstring += ca[i].substr(2, 999); 	//this is a direct request for data
                        mode = 1;
                    }
                    else {
                        //this could be a meta command (or straight javascript)
                        if (mode == 1) newstring += ");";
                        else newstring += ";";
                        mode = 2;
                        var cmd = ca[i].substr(1, 999); 		//get the command
                        var cmdsplt = cmd.split("|");
                        switch (cmdsplt[0]) {
                            case "hello":
                                newstring += "alert('helloworld');";
                                break;
                            case "datetime":
                                if (cmdsplt.length == 2) {
                                    var format = cmdsplt[1];
                                    newstring += "p.push(new Date().asString('"+format+"'));";
                                }
                                else {
                                    var field = cmdsplt[1];
                                    var format = cmdsplt[2];
                                    newstring += "p.push(new Date(d[" + field + "]).asString('" + format + "'));";
                                }
                                break;
                            case "loop":
                                var whichdata = cmdsplt[1];
                                newstring += "for(var i=0;i<d." + whichdata + ".length;i++) { var id = d." + whichdata + "[i];";
                                break;
                            case "/loop":
                                newstring += "}";
                                break;
                            default:
                                //plain ol javascript
                                newstring += cmd;
                                break;
                        }
                    }

                }
                else {
                    if (mode != 1) newstring += ";p.push(";
                    else newstring += ",";
                    newstring += "'" + ca[i] + "'"; //literal
                    mode = 1;
                }
            }

            var strFunc = "var p=[];" + newstring + ");return p.join('');";

            /***** END RENDER CODE ******/

            vLog('vRender', "compiled:" + templatename + ":" + strFunc);

            func = new Function("d", "ds", strFunc);
            _tmplCache[templatename] = func;
        }
        return func(data, dataset);
    }
    catch (e) {
        err = e.message;
    }


    return "[ERROR: " + err + "]";
}





