﻿//#require JSON.parse
//#require AjaxRequestJson
//JSON responses must return:
    //sucess: true or false,
    //rows: an array of objects,
    //count: the filtered collection count (not paged);

(function($) {
// plugin definition
    $.fn.JTable = function(pageName, webMethodName, options) {
        $.fn.JTable.defaults = {
          baseCellTemplate: '${0}',
          showAllData: true,
          pageLength: 10,
          additionalColumns:[],
          pagingContainer:"#pag",
          tableNamespace: "pag",
          mode: "autoTable",//or tag name for each object
          tableLoad: function(){},
          filterFunction: function(){return new Object();}
        };
        var opts = $.extend({}, $.fn.JTable.defaults, options);
                    
        function UpdatePagingValues(target, newIndex, count, pageLength){
            if(newIndex<1)
                newIndex =1;
            var maxIndex = Math.ceil(count/pageLength);
            if(newIndex> maxIndex)  
                newIndex = maxIndex;
            $(target).data("currentPage",newIndex);
            $(target).data("pageCount",maxIndex);
            return newIndex;
        }
        
        function SetSafeCurrentPage(target,newIndex){
            if(newIndex<1)
                newIndex =1;
            var maxIndex = $(target).data("pageCount");
            if(newIndex> maxIndex)  
                newIndex = maxIndex;
            $(target).data("currentPage",newIndex);
            return newIndex;
        }
        
        function BuildPaging(target, currentPage, count, options, idSelect, container, func){
            var pageLength = $(target).data("pageLength");
            UpdatePagingValues(target, currentPage, count, pageLength);
            var pageCount = $(target).data("pageCount");
            function createBtn (value,btnId){
                return (" <input type='button' id='"+btnId+"' class='button' value='"+value+"'/> ");
            }
            buildHtml();
            function buildHtml(){
                var div = document.createElement("div");
                var select = "<select id='sel"+idSelect+"' style='width:65px'>";
                for(var i=1;i<=pageCount;i++){
                    select+="<option value='"+i+"'>"+i+"</option>";
                }
                select+="</select> de "+pageCount;
                var btnsF = createBtn("<|","btnFirst_"+idSelect)+ createBtn("<", "btnPrev_"+idSelect);
                var btnsB = createBtn(">", "btnNext_"+idSelect)+ createBtn("|>","btnLast_"+idSelect);
                var update = createBtn("Update", "btnUpd_"+idSelect);
                $(div).html(btnsF+select+btnsB+update);
                var s = "#sel"+idSelect;
                $(div).find(s).val(currentPage);
                $(container).html(div);
            }
            $("#sel"+idSelect).unbind().bind("change",function(){var i = $(this).val(); func.call(this.constructor, target, SetSafeCurrentPage(target,i) ,options);});
            $("#btnFirst_"+idSelect).unbind().bind("click",function(){func.call(this.constructor, target, SetSafeCurrentPage(target,1), options);});
            $("#btnLast_"+idSelect).unbind().bind("click",function(){func.call(this.constructor, target, SetSafeCurrentPage(target,pageCount), options);;});
            $("#btnPrev_"+idSelect).unbind().bind("click",function(){var i = $(target).data("currentPage")-1;func.call(this.constructor, target, SetSafeCurrentPage(target,i),options);});
            $("#btnNext_"+idSelect).unbind().bind("click",function(){var i = $(target).data("currentPage")+1;func.call(this.constructor, target, SetSafeCurrentPage(target,i),options);});
            $("#btnUpd_"+idSelect).unbind().bind("click",function(){var i = $(target).data("currentPage");func.call(this.constructor, target, SetSafeCurrentPage(target,i),options);});
        }

        var targetTable = $(this);
        targetTable.data("currentPage",1);
        targetTable.data("pageLength",opts.pageLength);
        
        var filter = opts.filterFunction.call(this.constructor);
        LoadData(targetTable ,1, filter);
        
        function LoadData(target, index, filter){
            if(filter===undefined){
                filter = opts.filterFunction.call(this.constructor);
            }
            $(target).data("currentPage", index);
            filter.index = index;
            filter.pageLength = opts.pageLength;
            ajaxRequestJson(JSON.stringify(filter), pageName, webMethodName, function(data){
                if(data.sucess){
                    BuildDynamicTable(target, data.rows, null);
                    $(target).data("itemCount", data.count);
                    if(data.count!==undefined){
                        BuildPaging(target, index, data.count, filter, opts.tableNamespace, opts.pagingContainer, LoadData);
                    }
                    var obj = new Object();
                    obj.filter = filter;
                    obj = jQuery.extend(obj, data);
                    opts.tableLoad.call(this.constructor,obj);
                }
            });
        }
        
        
        function BuildDynamicTable(targetTable, tableRows, headerLabels){
            var objN;var objStart;var objEnd;var attStart;var attEnd;
            if(opts.mode!="autoTable"){
                
                switch (opts.mode){
                    case "div|":
                    objStart = "<div>"; objEnd="</div>";attStart="";attEnd="";objN ="div";
                    brak;
                    case "tr|td":
                    objStart = "<tr>"; objEnd="</tr>";attStart="<td>";attEnd="</td>";objN ="tr";
                    break;
                    case "tr|":
                    objStart = "<tr>"; objEnd="</tr>";attStart="";attEnd="";objN ="tr";
                    break;
                }
            }
            else{
                objStart = "<tr>"; objEnd="</tr>";attStart="<td>";attEnd="</td>";objN="tr";
            }
            var strHead = objStart;
            var headerBase = new Array();
            if(opts.showAllData){
                if(headerLabels===null){
                    for(var key in tableRows[0])
                    {
                        headerBase.push(key);
                    }
                }
                else{
                    headerBase=headerLabels;
                }
            }
            else{
                headerBase==[];
            }
            for(var i=0; i<headerBase.length; i++)
            {
                strHead+=(opts.mode=="autoTable"?"<th id='"+opts.tableNamespace+"Th"+i+"'>":attStart)+ headerBase[i] +(opts.mode=="autoTable"?"</th>":attEnd);
            }
            jQuery.each(opts.additionalColumns, function(i){
                strHead+=(opts.mode=="autoTable"?"<th id='"+opts.tableNamespace+"AddTh"+i+"'>":attStart)+this.label+(opts.mode=="autoTable"?"</th>":attEnd);
            });
            var strBody ="";
            var l = -1;
            jQuery.each(tableRows, function(){
                var row = this;
                l++;
                strBody+="<"+objN+" class='linha"+l%2+"'>";
                if(opts.showAllData){
                    jQuery.each(this, function(){
                        strBody+=attStart+opts.baseCellTemplate.replace("${0}",this.toString())+attEnd;    
                    });
                }
                jQuery.each(opts.additionalColumns, function(){
                    var template = this.template;
                    jQuery.each(this.keys, function(j){
                       var isFilter = new RegExp("@filter");
                       var value;
                       if(isFilter.test(this)){value = filter[this.replace(isFilter,"")];}
                       else{value = row[this];}
                       var regTemplate = new RegExp("[$][{]"+j+"[}]","g")
                       template = template.replace(regTemplate, value);
                    });
                    var regCode = new RegExp("[$]<=[^$]*>[$]","g");
                    var match = template.match(regCode);
                    if(match!=null){
                        jQuery.each(match, function(i){
                            var result = eval(match[i].substr(3, match[i].length-5));
                            template = template.replace(match[i], result)
                        });
                    }
                    strBody+=attStart+template+attEnd;
                });
                strBody+=objEnd;
            });
            strHead+=objEnd;
            if(opts.mode=="autoTable"){
                $(targetTable).find("thead").html(strHead)
                    .end().find("tbody").html(strBody);
                }
            else{
                $(targetTable).html(strHead+strBody);
            }
        }
    };
})(jQuery);

(function($) {
    jQuery.fn.buildTable = function(dataRows, jsonTemplate, tableNamespace){
        var thead="<tr>";
        var tbody="";
        jQuery.each(jsonTemplate, function(i){
            thead+="<th id='"+tableNamespace+"AddTh"+i+"'>"+this.label+"</th>";
        });
        thead+"</tr>";
        jQuery.each(dataRows, function(){
            var row = this;
            tbody+="<tr>";
            jQuery.each(jsonTemplate, function(i){
                var template = this.template;
                jQuery.each(this.keys, function(j){
                   var isFilter = new RegExp("@dataObject");
                   var value;
                   if(isFilter.test(this)){value = dataRows[this.replace(isFilter,"")];}
                   else{value = row[this];}
                   var regTemplate = new RegExp("[$][{]"+j+"[}]","g")
                   template = template.replace(regTemplate, value);
                });
                var regCode = new RegExp("[$]<=[^$]*>[$]","g");
                var match = template.match(regCode);
                if(match!=null){
                    jQuery.each(match, function(i){
                        var result = eval(match[i].substr(3, match[i].length-5));
                        template = template.replace(match[i], result)
                    });
                }
                tbody+="<td>"+template+"</td>";
            });
            tbody+="</tr>";
        });
        $(this).find("thead").html(thead);
        $(this).find("tbody").html(tbody);
        return $(this);
    }
})(jQuery);


(function($) {
    jQuery.fn.serializeForm = function(removeSufix, addPrefix){
        if(addPrefix===undefined){
            addPrefix="";
        }
        var obj = new Object();
        var json = $(this).find("select, :input").each(function(){
            if($(this).attr("name")==""){
                $(this).attr("name",this.id);
            }
        });
        var targets = $(this).find("select, input").not(":button");
        var jsonArray = targets.serializeArray();
        alert(JSON.stringify(jsonArray));
        targets.each(function(i){
            jsonArray[i].type = $(this).attr('type');
        });
        jQuery.each(jsonArray, function(){
            alert($(this).attr('type'));
            var value;
            switch($(this).attr('type')){
                case 'checkbox':
                    value = this.value=='on'?true:false;break;
                default:
                    value = this.value;break;
            }
            obj[addPrefix+this.name.replace(new RegExp("^"+removeSufix),"")] = value;
        });
        alert(obj);
        return obj;
    }
})(jQuery);

(function($) {//{label, content}
    jQuery.fn.buildFormTable= function(format){
        var html="";
        jQuery.each(format, function(){
            html+="<tr><td class='formLabel'><label>"+this.label+(this.label!=""?":":"")+"</label></td><td class='formContent'>"+this.content+"</td></tr>";
        });
        if(!$(this).is(".formTable")){
            $(this).addClass("formTable");
        }
        $(this).attr("cellpadding","0").attr("cellspacing","0").html(html);
        return $(this);
    }
})(jQuery);
