/** 
 | 
 * @author: Dennis Hernández 
 | 
 * @webSite: http://djhvscf.github.io/Blog 
 | 
 * @version: v1.1.0 
 | 
 */ 
 | 
  
 | 
!function ($) { 
 | 
  
 | 
    'use strict'; 
 | 
  
 | 
    var originalRowAttr, 
 | 
        dataTTId = 'data-tt-id', 
 | 
        dataTTParentId = 'data-tt-parent-id', 
 | 
        obj = {}, 
 | 
        parentId = undefined; 
 | 
  
 | 
    var getParentRowId = function (that, id) { 
 | 
        var parentRows = that.$body.find('tr').not('[' + 'data-tt-parent-id]'); 
 | 
  
 | 
        for (var i = 0; i < parentRows.length; i++) { 
 | 
            if (i === id) { 
 | 
                return $(parentRows[i]).attr('data-tt-id'); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        return undefined; 
 | 
    }; 
 | 
  
 | 
    var sumData = function (that, data) { 
 | 
        var sumRow = {}; 
 | 
        $.each(data, function (i, row) { 
 | 
            if (!row.IsParent) { 
 | 
                for (var prop in row) { 
 | 
                    if (!isNaN(parseFloat(row[prop]))) { 
 | 
                        if (that.columns[$.fn.bootstrapTable.utils.getFieldIndex(that.columns, prop)].groupBySumGroup) { 
 | 
                            if (sumRow[prop] === undefined) { 
 | 
                                sumRow[prop] = 0; 
 | 
                            } 
 | 
                            sumRow[prop] += +row[prop]; 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        }); 
 | 
        return sumRow; 
 | 
    }; 
 | 
  
 | 
    var rowAttr = function (row, index) { 
 | 
        //Call the User Defined Function 
 | 
        originalRowAttr.apply([row, index]); 
 | 
  
 | 
        obj[dataTTId.toString()] = index; 
 | 
  
 | 
        if (!row.IsParent) { 
 | 
            obj[dataTTParentId.toString()] = parentId === undefined ? index : parentId; 
 | 
        } else { 
 | 
            parentId = index; 
 | 
            delete obj[dataTTParentId.toString()]; 
 | 
        } 
 | 
  
 | 
        return obj; 
 | 
    }; 
 | 
  
 | 
    var setObjectKeys = function () { 
 | 
        // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys 
 | 
        Object.keys = function (o) { 
 | 
            if (o !== Object(o)) { 
 | 
                throw new TypeError('Object.keys called on a non-object'); 
 | 
            } 
 | 
            var k = [], 
 | 
                p; 
 | 
            for (p in o) { 
 | 
                if (Object.prototype.hasOwnProperty.call(o, p)) { 
 | 
                    k.push(p); 
 | 
                } 
 | 
            } 
 | 
            return k; 
 | 
        } 
 | 
    }; 
 | 
  
 | 
    var getDataArrayFromItem = function (that, item) { 
 | 
        var itemDataArray = []; 
 | 
        for (var i = 0; i < that.options.groupByField.length; i++) { 
 | 
            itemDataArray.push(item[that.options.groupByField[i]]); 
 | 
        } 
 | 
  
 | 
        return itemDataArray; 
 | 
    }; 
 | 
  
 | 
    var getNewRow = function (that, result, index) { 
 | 
        var newRow = {}; 
 | 
        for (var i = 0; i < that.options.groupByField.length; i++) { 
 | 
            newRow[that.options.groupByField[i].toString()] = result[index][0][that.options.groupByField[i]]; 
 | 
        } 
 | 
  
 | 
        newRow.IsParent = true; 
 | 
  
 | 
        return newRow; 
 | 
    }; 
 | 
  
 | 
    var groupBy = function (array, f) { 
 | 
        var groups = {}; 
 | 
        $.each(array, function (i, o) { 
 | 
            var group = JSON.stringify(f(o)); 
 | 
            groups[group] = groups[group] || []; 
 | 
            groups[group].push(o); 
 | 
        }); 
 | 
        return Object.keys(groups).map(function (group) { 
 | 
            return groups[group]; 
 | 
        }); 
 | 
    }; 
 | 
  
 | 
    var makeGrouped = function (that, data) { 
 | 
        var newData = [], 
 | 
            sumRow = {}; 
 | 
  
 | 
        var result = groupBy(data, function (item) { 
 | 
            return getDataArrayFromItem(that, item); 
 | 
        }); 
 | 
  
 | 
        for (var i = 0; i < result.length; i++) { 
 | 
            result[i].unshift(getNewRow(that, result, i)); 
 | 
            if (that.options.groupBySumGroup) { 
 | 
                sumRow = sumData(that, result[i]); 
 | 
                if (!$.isEmptyObject(sumRow)) { 
 | 
                    result[i].push(sumRow); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        newData = newData.concat.apply(newData, result); 
 | 
  
 | 
        if (!that.options.loaded && newData.length > 0) { 
 | 
            that.options.loaded = true; 
 | 
            that.options.originalData = that.options.data; 
 | 
            that.options.data = newData; 
 | 
        } 
 | 
  
 | 
        return newData; 
 | 
    }; 
 | 
  
 | 
    $.extend($.fn.bootstrapTable.defaults, { 
 | 
        groupBy: false, 
 | 
        groupByField: [], 
 | 
        groupBySumGroup: false, 
 | 
        groupByInitExpanded: undefined, //node, 'all' 
 | 
        //internal variables 
 | 
        loaded: false, 
 | 
        originalData: undefined 
 | 
    }); 
 | 
  
 | 
    $.fn.bootstrapTable.methods.push('collapseAll', 'expandAll', 'refreshGroupByField'); 
 | 
  
 | 
    $.extend($.fn.bootstrapTable.COLUMN_DEFAULTS, { 
 | 
        groupBySumGroup: false 
 | 
    }); 
 | 
  
 | 
    var BootstrapTable = $.fn.bootstrapTable.Constructor, 
 | 
        _init = BootstrapTable.prototype.init, 
 | 
        _initData = BootstrapTable.prototype.initData; 
 | 
  
 | 
    BootstrapTable.prototype.init = function () { 
 | 
        //Temporal validation 
 | 
        if (!this.options.sortName) { 
 | 
            if ((this.options.groupBy) && (this.options.groupByField.length > 0)) { 
 | 
                var that = this; 
 | 
  
 | 
                // Compatibility: IE < 9 and old browsers 
 | 
                if (!Object.keys) { 
 | 
                    setObjectKeys(); 
 | 
                } 
 | 
  
 | 
                //Make sure that the internal variables are set correctly 
 | 
                this.options.loaded = false; 
 | 
                this.options.originalData = undefined; 
 | 
  
 | 
                originalRowAttr = this.options.rowAttributes; 
 | 
                this.options.rowAttributes = rowAttr; 
 | 
                this.$el.on('post-body.bs.table', function () { 
 | 
                    that.$el.treetable({ 
 | 
                        expandable: true, 
 | 
                        onNodeExpand: function () { 
 | 
                            if (that.options.height) { 
 | 
                                that.resetHeader(); 
 | 
                            } 
 | 
                        }, 
 | 
                        onNodeCollapse: function () { 
 | 
                            if (that.options.height) { 
 | 
                                that.resetHeader(); 
 | 
                            } 
 | 
                        } 
 | 
                    }, true); 
 | 
  
 | 
                    if (that.options.groupByInitExpanded !== undefined) { 
 | 
                        if (typeof that.options.groupByInitExpanded === 'number') { 
 | 
                            that.expandNode(that.options.groupByInitExpanded); 
 | 
                        } else if (that.options.groupByInitExpanded.toLowerCase() === 'all') { 
 | 
                            that.expandAll(); 
 | 
                        } 
 | 
                    } 
 | 
                }); 
 | 
            } 
 | 
        } 
 | 
        _init.apply(this, Array.prototype.slice.apply(arguments)); 
 | 
    }; 
 | 
  
 | 
    BootstrapTable.prototype.initData = function (data, type) { 
 | 
        //Temporal validation 
 | 
        if (!this.options.sortName) { 
 | 
            if ((this.options.groupBy) && (this.options.groupByField.length > 0)) { 
 | 
  
 | 
                this.options.groupByField = typeof this.options.groupByField === 'string' ? 
 | 
                    this.options.groupByField.replace('[', '').replace(']', '') 
 | 
                        .replace(/ /g, '').toLowerCase().split(',') : this.options.groupByField; 
 | 
  
 | 
                data = makeGrouped(this, data ? data : this.options.data); 
 | 
            } 
 | 
        } 
 | 
        _initData.apply(this, [data, type]); 
 | 
    }; 
 | 
  
 | 
    BootstrapTable.prototype.expandAll = function () { 
 | 
        this.$el.treetable('expandAll'); 
 | 
    }; 
 | 
  
 | 
    BootstrapTable.prototype.collapseAll = function () { 
 | 
        this.$el.treetable('collapseAll'); 
 | 
    }; 
 | 
  
 | 
    BootstrapTable.prototype.expandNode = function (id) { 
 | 
        id = getParentRowId(this, id); 
 | 
        if (id !== undefined) { 
 | 
            this.$el.treetable('expandNode', id); 
 | 
        } 
 | 
    }; 
 | 
  
 | 
    BootstrapTable.prototype.refreshGroupByField = function (groupByFields) { 
 | 
        if (!$.fn.bootstrapTable.utils.compareObjects(this.options.groupByField, groupByFields)) { 
 | 
            this.options.groupByField = groupByFields; 
 | 
            this.load(this.options.originalData); 
 | 
        } 
 | 
    }; 
 | 
}(jQuery); 
 |