var TemplateKubbe = {
    templates: {},
    load: null
}
TemplateKubbe.PATTERN_VAR = "<\\$[!\\w.\\[\\]]+\\$>";
TemplateKubbe.PATTERN_FOR = "<%f\\d+\\[\\w+;\\w+\\]%>";
TemplateKubbe.PATTERN_IF = "<%if\\d+\\[[\\w.]+\\]%>";
TemplateKubbe.PATTERN_INCLUDE = "<%include\\[[\\w\\W]+\\]%>";
TemplateKubbe.PATTERN_ASSIGN = "<%\\w+=[\\w.]+%>";
TemplateKubbe.PATTERN_I18N = "$i18n{[\\.]+}";

TemplateKubbe.RE_PATTERN_VAR = new RegExp(TemplateKubbe.PATTERN_VAR, "g");
TemplateKubbe.RE_PATTERN_FOR = new RegExp(TemplateKubbe.PATTERN_FOR, "g");
TemplateKubbe.RE_PATTERN_IF = new RegExp(TemplateKubbe.PATTERN_IF, "g");
TemplateKubbe.RE_PATTERN_INCLUDE = new RegExp(TemplateKubbe.PATTERN_INCLUDE, "g");
TemplateKubbe.RE_PATTERN_ASSIGN =  new RegExp(TemplateKubbe.PATTERN_ASSIGN, "g");
TemplateKubbe.RE_PATTERN_I18N = new RegExp(TemplateKubbe.PATTERN_I18N, "g");

TemplateKubbe.load = function(url) {   
    var templates = this.templates;    

/*    $.get(URL_APL+url, null, function(html, status) {   
        templates[url] = html;           
        return TemplateKubbe.process(url, data);
    });            */
     $.ajax(
         { 
           async: false,
           type: "GET",
           cache: false,
           contentType: "application/x-www-form-urlencoded; charset=utf-8", 
           dataType: "text",
           success: function(html, textStatus) {
               templates[url]=html;
           },
           url: URL_APL+url
         }
     )
}

TemplateKubbe.importCompleted = function(urls) {
    var completed = false;
    for (var i=0;i<urls.length;i++) {
        completed = urls[i]==null;
        if (!completed) break;
    }
    return completed;   
}

TemplateKubbe.process = function(url, data) {       

      if (typeof this.templates[url] == "undefined") {
          this.load(url);     
      }     
      var html = this.templates[url];  
  //   var html =  this.processVars(this.templates[url], data);    
  //    if (noImport)  {              
        if (html!=null) {
            html = this.processInclude(html, data);     
            html = this.processF(html, data); 
            html = this.processIf(html,data);
            html = this.processAssign(html, data);
            html = this.processVars(html, data);                 
        };
        
        return html;
//      } else this.preloadImports(html,url, data);
}

TemplateKubbe.proccessI18N = function (html, data) {

}

TemplateKubbe.processInclude = function(html, data) {    
    var vars = html.match(this.RE_PATTERN_INCLUDE);    
    if (vars==null) return html;    
    for (var i=0; i<vars.length; i++) {
            var index = vars[i].indexOf("[");
            var include = vars[i].substring(index+1, vars[i].length-3);  
            if (typeof this.templates[include]=="undefined") this.load(include);
           
            html = html.replace(vars[i], this.templates[include]);
    }    
    if (vars.length>0) html = this.processInclude(html, data);
    return html;
}

TemplateKubbe.preloadImports = function(html, url, data, flag) {       
    if (typeof flag=="undefined") flag = {count:0}
    var vars = html.match(this.RE_PATTERN_INCLUDE);    
    var templates = this.templates;
    
    if (vars!=null) {        
        flag.count+=vars.length;
        var includes = [];
        for (var i=0; i<vars.length;i++) {
            var index = vars[i].indexOf("[");
            var include = vars[i].substring(index+1, vars[i].length-3);            
            if (typeof this.templates[include]=="undefined") {       
                $.get(URL_APL+include, null, function(html, status) {   
                    templates[include] = html; 
                    TemplateKubbe.preloadImports(html, url, data, flag);
                    flag.count--;
                    if (flag.count==0)TemplateKubbe.process(url, data, true);
                });                  
            }
        }
        return false;
    } else return true;
    
        
}

TemplateKubbe.processAssign = function (html, data) {    
    var vars = html.match(this.RE_PATTERN_ASSIGN);    

    if (vars!=null) {  
        for (var i=0; i<vars.length; i++) {
            var content = vars[i].substring(2,vars[i].length-2);            
            content = content.split("=");            
            data[content[0]]=this.obtainData(content[1], data);
            html = html.replace(vars[i], "");
        }
    }
    return html;
}

TemplateKubbe.obtainData= function(name, data) {
    var names = name.split(".");
    var value = data;    
    for (var i=0;i<names.length;i++) {        
        if (typeof value=="undefined" || value==null) return "";
        value=value[names[i]];
    }
    if (typeof value=="undefined" || value==null) return "";
    return value;
}

TemplateKubbe.processVars = function(html, data) {  
    var vars = html.match(this.RE_PATTERN_VAR);
    var re  = null;
    var name = null;    

    if (vars!=null) {                
        for (var i=0; i<vars.length;i++) {
    
            var ii=vars[i].indexOf("[");
            var ie=vars[i].indexOf("]");
 
            if (ii!=-1 && ie!=-1) {                
                var inot = vars[i].indexOf("!");                
                var cond = vars[i].substring(ii+(inot!=-1?2:1),ie);                                
                name = vars[i].substring(ie+1,vars[i].length-2);                                
                re = new RegExp("<\\$\\["+(inot!=-1?"!":"")+cond+"\\]"+name+"\\$>", "g");                       
                
                var evalCond = this.obtainData(cond, data);
                if (inot!=-1) evalCond=!evalCond;
                
                if (evalCond) html = html.replace(re, this.obtainData(name,data));
                else html = html.replace(re, "");
            } else {
                name = vars[i].substring(2,vars[i].length-2);
                re = new RegExp("<\\$"+name+"\\$>", "g");            
                html = html.replace(re, this.obtainData(name,data));
            }
        }    
    }
    return html;
}

TemplateKubbe.processIf = function(html, data) {
    var vars = html.match(this.RE_PATTERN_IF); 
    
    if (vars==null) return html;  
    for (var i=0; i<vars.length;i++) {        
        var sizeId = vars[i].length;
        var index = vars[i].indexOf("[");
        var id = vars[i].substring(4, index);
        var condIf= vars[i].substring(index+1, vars[i].length-3);
        var re = new RegExp("<%if"+id+"\\[[\\w.]+\\]%>[\\w\\W]+</%if"+id+"%>");    
        var ifHtml = html.match(re);     

        if (ifHtml!=null) {
            ifHtml = ifHtml[0];  
            ifHtml = ifHtml.substring(sizeId,ifHtml.length-(7+(id.length)));              
            if (this.obtainData(condIf, data)) html = html.replace(re, ifHtml); 
            else html = html.replace(re, ""); 
        }
      
    }

    return html;    
}

TemplateKubbe.processF = function(html, data) {
    var vars = html.match(this.RE_PATTERN_FOR);    

    if (vars==null) return html;       
    for (var i=0; i<vars.length;i++) {     
        var sizeId = vars[i].length;
        var index = vars[i].indexOf("[");
        var id = vars[i].substring(3, index);
        var condBucle = vars[i].substring(index+1, vars[i].length-3);
        var conds = condBucle.split(";");
        var varIt = conds[0]; //Variable sobre la que se almacena el iterador
        var varLoop = conds[1]; //Varible que recorre el bucle
      
        var re = new RegExp("<%f"+id+"\\[\\w+;\\w+\\]%>[\\w\\W]+</%f"+id+"%>");       
        var bucle = html.match(re);           
        if (bucle!=null) {
            bucle = bucle[0];                        
            var htmlBucle = bucle.substring(sizeId,bucle.length-(6+(id.length)));            
            var resultBucle = "";
            var loop = data[varLoop];
          
            if (typeof loop=="undefined" && loop==null && typeof loop.length=="undefined") {
                resultBucle="Variable bucle no definida: "+varLoop;
            } else {
                for (var j=0; j<loop.length; j++) {
                    data[varIt]=loop[j];
                    var htmlBucleTemp = this.processF(htmlBucle, data);   
                    htmlBucleTemp = this.processIf(htmlBucleTemp, data);
                    htmlBucleTemp = this.processAssign(htmlBucleTemp, data);
                    resultBucle += this.processVars(htmlBucleTemp, data);                    
                }
            }
            html = html.replace(re, resultBucle);            
            
        }
        
    }
    return html;
}




function Demo() {
    var data = {
        style: "Default",
        daysWeek: ["Lun", "Mar", "Mie", "Jue", "Vie", "Sab", "Dom"],
        daysMonth: [["&nbsp;","&nbsp;","&nbsp;","1", "2", "3", "4"],
                    ["5", "6", "7", "8", "9", "10", "11"],
                    ["12", "13", "14", "15", "16", "17", "18"],
                    ["19", "20", "21", "22", "23", "24", "25"],
                    ["26", "27", "28", "29", "30", "&nbsp;", "&nbsp;"]],
        admin: false,
        component: this
    }
    TemplateKubbe.process("demo/js/template/demo.tk",data);
    this.onprocess = function(html) {
        $(document.body).append(html);
    }
}

function Blog(API) {
    this.API;
    this.view = new BlogView();
    
    function BlogView() {
        this.create = create;

        this.create();
        
        function create() {
            var data =  {                 
                style: "Default",
                titleBlog: "Este es mi blog",
                subtitle: "A que mola!!!",             
                posts: [{
                    month: "Ene",
                    day: 22,
                    title:"Esto es un post de prueba",
                    description: "Esto es una prueba de <b style='color:red'>post</b> muy divertido que he hecho, por no saber que hacer con el post de antes. Busco simplicar la vida a diseñadores, maquetadores y programadores, pero el camino hacia la simplicdad es una gran complejidad, como todo lo bueno, no deja de ser una paradoja constante.",
                    permEdit:true,
                    permRemove: true                
                },
                {
                    month: "Ene",
                    day: 2,
                    title:"Esto es otro post de prueba",
                    description: "Uno es casualidad, 2 es aproximación, 3 confirmación .",
                    permEdit:true,
                    permRemove: false               
                },     
                {
                    month: "Dic",
                    day: 25,
                    title:"y otro post de prueba!!!",
                    description: "No hay 2 sin tres",
                    permEdit:false,
                    permRemove: true
                }                 
                ]
            }
            
            $(document.body).append(TemplateKubbe.process("demo/template/blog.tk",data));
        }
        
    }
    
    function BlogModel() {
        
    }
    
    function BlogController() {
    
    }
    
    
}


