Вход Регистрация
Файл: assets/plugins/bootstrap-table/bootstrap-table.js
Строк: 2767
<?php
/**
 * @author zhixin wen <wenzhixin2010@gmail.com>
 * version: 1.8.1
 * https://github.com/wenzhixin/bootstrap-table/
 */

! function ($) {
    
'use strict';

    
// TOOLS DEFINITION
    // ======================

    
var cachedWidth null;

    
// it only does '%s', and return '' when arguments are undefined
    
var sprintf = function (str) {
        var 
args arguments,
            
flag true,
            
1;

        
str str.replace(/%s/g, function () {
            var 
arg args[i++];

            if (
typeof arg === 'undefined') {
                
flag false;
                return 
'';
            }
            return 
arg;
        });
        return 
flag str '';
    };

    var 
getPropertyFromOther = function (list, fromtovalue) {
        var 
result '';
        $.
each(list, function (iitem) {
            if (
item[from] === value) {
                
result item[to];
                return 
false;
            }
            return 
true;
        });
        return 
result;
    };

    var 
getFieldIndex = function (columnsfield) {
        var 
index = -1;

        $.
each(columns, function (icolumn) {
            if (
column.field === field) {
                
index i;
                return 
false;
            }
            return 
true;
        });
        return 
index;
    };

    
// http://jsfiddle.net/wenyi/47nz7ez9/3/
    
var setFieldIndex = function (columns) {
        var 
ijk,
            
totalCol 0,
            
flag = [];

        for (
0columns[0].lengthi++) {
            
totalCol += columns[0][i].colspan || 1;
        }

        for (
0columns.lengthi++) {
            
flag[i] = [];
            for (
0totalColj++) {
                
flag[i][j] = false;
            }
        }

        for (
0columns.lengthi++) {
            for (
0columns[i].lengthj++) {
                var 
columns[i][j],
                    
rowspan r.rowspan || 1,
                    
colspan r.colspan || 1,
                    
index = $.inArray(falseflag[i]);

                if (
colspan === 1) {
                    
r.fieldIndex index;
                    
// when field is undefined, use index instead
                    
if (typeof r.field === 'undefined') {
                        
r.field index;
                    }
                }

                for (
0rowspank++) {
                    
flag[k][index] = true;
                }
                for (
0colspank++) {
                    
flag[i][index k] = true;
                }
            }
        }
    }

    var 
getScrollBarWidth = function () {
        if (
cachedWidth === null) {
            var 
inner = $('<p/>').addClass('fixed-table-scroll-inner'),
                
outer = $('<div/>').addClass('fixed-table-scroll-outer'),
                
w1w2;

            
outer.append(inner);
            $(
'body').append(outer);

            
w1 inner[0].offsetWidth;
            
outer.css('overflow''scroll');
            
w2 inner[0].offsetWidth;

            if (
w1 === w2) {
                
w2 outer[0].clientWidth;
            }

            
outer.remove();
            
cachedWidth w1 w2;
        }
        return 
cachedWidth;
    };

    var 
calculateObjectValue = function (selfnameargsdefaultValue) {
        var 
func name;

        if (
typeof name === 'string') {
            
// support obj.func1.func2
            
var names name.split('.');

            if (
names.length 1) {
                
func window;
                $.
each(names, function (if) {
                    
func func[f];
                });
            } else {
                
func window[name];
            }
        }
        if (
typeof func === 'object') {
            return 
func;
        }
        if (
typeof func === 'function') {
            return 
func.apply(selfargs);
        }
        if (!
func && typeof name === 'string' && sprintf.apply(this, [name].concat(args))) {
            return 
sprintf.apply(this, [name].concat(args));
        }
        return 
defaultValue;
    };

    var 
compareObjects = function (objectAobjectBcompareLength) {
        
// Create arrays of property names
        
var objectAProperties Object.getOwnPropertyNames(objectA),
            
objectBProperties Object.getOwnPropertyNames(objectB),
            
propName '';

        if (
compareLength) {
            
// If number of properties is different, objects are not equivalent
            
if (objectAProperties.length != objectBProperties.length) {
                return 
false;
            }
        }

        for (var 
0objectAProperties.lengthi++) {
            
propName objectAProperties[i];

            
// If the property is not in the object B properties, continue with the next property
            
if ($.inArray(propNameobjectBProperties) > -1) {
                
// If values of same property are not equal, objects are not equivalent
                
if (objectA[propName] !== objectB[propName]) {
                    return 
false;
                }
            }
        }

        
// If we made it this far, objects are considered equivalent
        
return true;
    };

    var 
escapeHTML = function (text) {
        if (
typeof text === 'string') {
            return 
text
                
.replace(/&/g"&amp;")
                .
replace(/</g"&lt;")
                .
replace(/>/g"&gt;")
                .
replace(/"/g, "&quot;")
                .replace(/'/g, "
&#039;");
        
}
        return 
text;
    };

    var 
getRealHeight = function ($el) {
        var 
height 0;
        
$el.children().each(function () {
            if (
height < $(this).outerHeight(true)) {
                
height = $(this).outerHeight(true);
            }
        });
        return 
height;
    };

    var 
getRealDataAttr = function (dataAttr) {
        for (var 
attr in dataAttr) {
            var 
auxAttr attr.split(/(?=[A-Z])/).join('-').toLowerCase();
            if (
auxAttr !== attr) {
                
dataAttr[auxAttr] = dataAttr[attr];
                
delete dataAttr[attr];
            }
        }

        return 
dataAttr;
    };

    
// BOOTSTRAP TABLE CLASS DEFINITION
    // ======================

    
var BootstrapTable = function (eloptions) {
        
this.options options;
        
this.$el = $(el);
        
this.$el_ this.$el.clone();
        
this.timeoutId_ 0;
        
this.timeoutFooter_ 0;

        
this.init();
    };

    
BootstrapTable.DEFAULTS = {
        
classes'table table-hover',
        
localeundefined,
        
heightundefined,
        
undefinedText'-',
        
sortNameundefined,
        
sortOrder'asc',
        
stripedfalse,
        
columns: [[]],
        
data: [],
        
method'get',
        
urlundefined,
        
ajaxundefined,
        
cachetrue,
        
contentType'application/json',
        
dataType'json',
        
ajaxOptions: {},
        
queryParams: function (params) {
            return 
params;
        },
        
queryParamsType'limit'// undefined
        
responseHandler: function (res) {
            return 
res;
        },
        
paginationfalse,
        
sidePagination'client'// client or server
        
totalRows0// server side need to set
        
pageNumber1,
        
pageSize10,
        
pageList: [102550100],
        
paginationHAlign'right'//right, left
        
paginationVAlign'bottom'//bottom, top, both
        
paginationDetailHAlign'left'//right, left
        
paginationFirstText'&laquo;',
        
paginationPreText'&lsaquo;',
        
paginationNextText'&rsaquo;',
        
paginationLastText'&raquo;',
        
searchfalse,
        
strictSearchfalse,
        
searchAlign'right',
        
selectItemName'btSelectItem',
        
showHeadertrue,
        
showFooterfalse,
        
showColumnsfalse,
        
showPaginationSwitchfalse,
        
showRefreshfalse,
        
showTogglefalse,
        
buttonsAlign'right',
        
smartDisplaytrue,
        
minimumCountColumns1,
        
idFieldundefined,
        
uniqueIdundefined,
        
cardViewfalse,
        
detailViewfalse,
        
detailFormatter: function (indexrow) {
            return 
'';
        },
        
trimOnSearchtrue,
        
clickToSelectfalse,
        
singleSelectfalse,
        
toolbarundefined,
        
toolbarAlign'left',
        
checkboxHeadertrue,
        
sortabletrue,
        
silentSorttrue,
        
maintainSelectedfalse,
        
searchTimeOut500,
        
searchText'',
        
iconSizeundefined,
        
iconsPrefix'glyphicon'// glyphicon of fa (font awesome)
        
icons: {
            
paginationSwitchDown'glyphicon-collapse-down icon-chevron-down',
            
paginationSwitchUp'glyphicon-collapse-up icon-chevron-up',
            
refresh'glyphicon-refresh icon-refresh',
            
toggle'glyphicon-list-alt icon-list-alt',
            
columns'glyphicon-th icon-th',
            
detailOpen'glyphicon-plus icon-plus',
            
detailClose'glyphicon-minus icon-minus'
        
},

        
rowStyle: function (rowindex) {
            return {};
        },

        
rowAttributes: function (rowindex) {
            return {};
        },

        
onAll: function (nameargs) {
            return 
false;
        },
        
onClickCell: function (fieldvaluerow$element) {
            return 
false;
        },
        
onDblClickCell: function (fieldvaluerow$element) {
            return 
false;
        },
        
onClickRow: function (item$element) {
            return 
false;
        },
        
onDblClickRow: function (item$element) {
            return 
false;
        },
        
onSort: function (nameorder) {
            return 
false;
        },
        
onCheck: function (row) {
            return 
false;
        },
        
onUncheck: function (row) {
            return 
false;
        },
        
onCheckAll: function (rows) {
            return 
false;
        },
        
onUncheckAll: function (rows) {
            return 
false;
        },
        
onCheckSome: function (rows) {
            return 
false;
        },
        
onUncheckSome: function (rows) {
            return 
false;
        },
        
onLoadSuccess: function (data) {
            return 
false;
        },
        
onLoadError: function (status) {
            return 
false;
        },
        
onColumnSwitch: function (fieldchecked) {
            return 
false;
        },
        
onPageChange: function (numbersize) {
            return 
false;
        },
        
onSearch: function (text) {
            return 
false;
        },
        
onToggle: function (cardView) {
            return 
false;
        },
        
onPreBody: function (data) {
            return 
false;
        },
        
onPostBody: function () {
            return 
false;
        },
        
onPostHeader: function () {
            return 
false;
        },
        
onExpandRow: function (indexrow$detail) {
            return 
false;
        },
        
onCollapseRow: function (indexrow) {
            return 
false;
        },
        
onRefreshOptions: function (options) {
            return 
false;
        },
        
onResetView: function () {
            return 
false;
        }
    };

    
BootstrapTable.LOCALES = [];

    
BootstrapTable.LOCALES['en-US'] = BootstrapTable.LOCALES['en'] = {
        
formatLoadingMessage: function () {
            return 
'Loading, please wait...';
        },
        
formatRecordsPerPage: function (pageNumber) {
            return 
sprintf('%s records per page'pageNumber);
        },
        
formatShowingRows: function (pageFrompageTototalRows) {
            return 
sprintf('Showing %s to %s of %s rows'pageFrompageTototalRows);
        },
        
formatSearch: function () {
            return 
'Search';
        },
        
formatNoMatches: function () {
            return 
'No matching records found';
        },
        
formatPaginationSwitch: function () {
            return 
'Hide/Show pagination';
        },
        
formatRefresh: function () {
            return 
'Refresh';
        },
        
formatToggle: function () {
            return 
'Toggle';
        },
        
formatColumns: function () {
            return 
'Columns';
        },
        
formatAllRows: function () {
            return 
'All';
        }
    };

    $.
extend(BootstrapTable.DEFAULTSBootstrapTable.LOCALES['en-US']);

    
BootstrapTable.COLUMN_DEFAULTS = {
        
radiofalse,
        
checkboxfalse,
        
checkboxEnabledtrue,
        
fieldundefined,
        
titleundefined,
        
titleTooltipundefined,
        
'class'undefined,
        
alignundefined// left, right, center
        
halignundefined// left, right, center
        
falignundefined// left, right, center
        
valignundefined// top, middle, bottom
        
widthundefined,
        
sortablefalse,
        
order'asc'// asc, desc
        
visibletrue,
        
switchabletrue,
        
clickToSelecttrue,
        
formatterundefined,
        
footerFormatterundefined,
        
eventsundefined,
        
sorterundefined,
        
sortNameundefined,
        
cellStyleundefined,
        
searchabletrue,
        
searchFormattertrue,
        
cardVisibletrue
    
};

    
BootstrapTable.EVENTS = {
        
'all.bs.table''onAll',
        
'click-cell.bs.table''onClickCell',
        
'dbl-click-cell.bs.table''onDblClickCell',
        
'click-row.bs.table''onClickRow',
        
'dbl-click-row.bs.table''onDblClickRow',
        
'sort.bs.table''onSort',
        
'check.bs.table''onCheck',
        
'uncheck.bs.table''onUncheck',
        
'check-all.bs.table''onCheckAll',
        
'uncheck-all.bs.table''onUncheckAll',
        
'check-some.bs.table''onCheckSome',
        
'uncheck-some.bs.table''onUncheckSome',
        
'load-success.bs.table''onLoadSuccess',
        
'load-error.bs.table''onLoadError',
        
'column-switch.bs.table''onColumnSwitch',
        
'page-change.bs.table''onPageChange',
        
'search.bs.table''onSearch',
        
'toggle.bs.table''onToggle',
        
'pre-body.bs.table''onPreBody',
        
'post-body.bs.table''onPostBody',
        
'post-header.bs.table''onPostHeader',
        
'expand-row.bs.table''onExpandRow',
        
'collapse-row.bs.table''onCollapseRow',
        
'refresh-options.bs.table''onRefreshOptions',
        
'reset-view.bs.table''onResetView'
    
};

    
BootstrapTable.prototype.init = function () {
        
this.initLocale();
        
this.initContainer();
        
this.initTable();
        
this.initHeader();
        
this.initData();
        
this.initFooter();
        
this.initToolbar();
        
this.initPagination();
        
this.initBody();
        
this.initServer();
    };

    
BootstrapTable.prototype.initLocale = function () {
        if (
this.options.locale) {
            var 
parts this.options.locale.split(/-|_/);
            
parts[0].toLowerCase();
            
parts[1] && parts[1].toUpperCase();
            if ($.
fn.bootstrapTable.locales[this.options.locale]) {
                
// locale as requested
                
$.extend(this.options, $.fn.bootstrapTable.locales[this.options.locale]);
            } else if ($.
fn.bootstrapTable.locales[parts.join('-')]) {
                
// locale with sep set to - (in case original was specified with _)
                
$.extend(this.options, $.fn.bootstrapTable.locales[parts.join('-')]);
            } else if ($.
fn.bootstrapTable.locales[parts[0]]) {
                
// short locale language code (i.e. 'en')
                
$.extend(this.options, $.fn.bootstrapTable.locales[parts[0]]);
            }
        }
    };
    
    
BootstrapTable.prototype.initContainer = function () {
        
this.$container = $([
            
'<div class="bootstrap-table">',
                
'<div class="fixed-table-toolbar"></div>',
                    
this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?
                    
'<div class="fixed-table-pagination" style="clear: both;"></div>' :
                    
'',
                
'<div class="fixed-table-container">',
                
'<div class="fixed-table-header"><table></table></div>',
                
'<div class="fixed-table-body">',
                    
'<div class="fixed-table-loading">',
                        
this.options.formatLoadingMessage(),
                    
'</div>',
                
'</div>',
                
'<div class="fixed-table-footer"><table><tr></tr></table></div>',
                
this.options.paginationVAlign === 'bottom' || this.options.paginationVAlign === 'both' ?
                
'<div class="fixed-table-pagination"></div>' :
                
'',
                
'</div>',
            
'</div>'
        
].join(''));

        
this.$container.insertAfter(this.$el);
        
this.$tableContainer this.$container.find('.fixed-table-container');
        
this.$tableHeader this.$container.find('.fixed-table-header');
        
this.$tableBody this.$container.find('.fixed-table-body');
        
this.$tableLoading this.$container.find('.fixed-table-loading');
        
this.$tableFooter this.$container.find('.fixed-table-footer');
        
this.$toolbar this.$container.find('.fixed-table-toolbar');
        
this.$pagination this.$container.find('.fixed-table-pagination');

        
this.$tableBody.append(this.$el);
        
this.$container.after('<div class="clearfix"></div>');

        
this.$el.addClass(this.options.classes);
        if (
this.options.striped) {
            
this.$el.addClass('table-striped');
        }
        if ($.
inArray('table-no-bordered'this.options.classes.split(' ')) !== -1) {
            
this.$tableContainer.addClass('table-no-bordered');
        }
    };

    
BootstrapTable.prototype.initTable = function () {
        var 
that this,
            
columns = [],
            
data = [];

        
this.$header this.$el.find('thead');
        if (!
this.$header.length) {
            
this.$header = $('<thead></thead>').appendTo(this.$el);
        }
        
this.$header.find('tr').each(function () {
            var 
column = [];

            $(
this).find('th').each(function () {
                
column.push($.extend({}, {
                    
title: $(this).html(),
                    
'class': $(this).attr('class'),
                    
titleTooltip: $(this).attr('title'),
                    
rowspan: $(this).attr('rowspan') ? +$(this).attr('rowspan') : undefined,
                    
colspan: $(this).attr('colspan') ? +$(this).attr('colspan') : undefined
                
}, $(this).data()));
            });
            
columns.push(column);
        });
        if (!$.
isArray(this.options.columns[0])) {
            
this.options.columns = [this.options.columns];
        }
        
this.options.columns = $.extend(true, [], columnsthis.options.columns);
        
this.columns = [];

        
setFieldIndex(this.options.columns);
        $.
each(this.options.columns, function (icolumns) {
            $.
each(columns, function (jcolumn) {
                
column = $.extend({}, BootstrapTable.COLUMN_DEFAULTScolumn);

                if (
typeof column.fieldIndex !== 'undefined') {
                    
that.columns[column.fieldIndex] = column;
                }

                
that.options.columns[i][j] = column;
            });
        });

        
// if options.data is setting, do not process tbody data
        
if (this.options.data.length) {
            return;
        }

        
this.$el.find('tbody tr').each(function () {
            var 
row = {};

            
// save tr's id, class and data-* attributes
            
row._id = $(this).attr('id');
            
row._class = $(this).attr('class');
            
row._data getRealDataAttr($(this).data());

            $(
this).find('td').each(function (i) {
                var 
field that.columns[i].field;

                
row[field] = $(this).html();
                
// save td's id, class and data-* attributes
                
row['_' field '_id'] = $(this).attr('id');
                
row['_' field '_class'] = $(this).attr('class');
                
row['_' field '_rowspan'] = $(this).attr('rowspan');
                
row['_' field '_title'] = $(this).attr('title');
                
row['_' field '_data'] = getRealDataAttr($(this).data());
            });
            
data.push(row);
        });
        
this.options.data data;
    };

    
BootstrapTable.prototype.initHeader = function () {
        var 
that this,
            
visibleColumns = {},
            
html = [];

        
this.header = {
            
fields: [],
            
styles: [],
            
classes: [],
            
formatters: [],
            
events: [],
            
sorters: [],
            
sortNames: [],
            
cellStyles: [],
            
searchables: []
        };

        $.
each(this.options.columns, function (icolumns) {
            
html.push('<tr>');

            if (
== && !that.options.cardView && that.options.detailView) {
                
html.push(sprintf('<th class="detail" rowspan="%s"><div class="fht-cell"></div></th>',
                    
that.options.columns.length));
            }

            $.
each(columns, function (jcolumn) {
                var 
text '',
                    
halign ''// header align style
                    
align ''// body align style
                    
style '',
                    
class_ sprintf(' class="%s"'column['class']),
                    
order that.options.sortOrder || column.order,
                    
unitWidth 'px',
                    
width column.width;

                if (
column.width !== undefined && (!that.options.cardView)) {
                    if (
typeof column.width === 'string') {
                        if (
column.width.indexOf('%') !== -1) {
                            
unitWidth '%';
                        }
                    }
                }
                if (
column.width && typeof column.width === 'string') {
                    
width column.width.replace('%''').replace('px''');
                }

                
halign sprintf('text-align: %s; 'column.halign column.halign column.align);
                
align sprintf('text-align: %s; 'column.align);
                
style sprintf('vertical-align: %s; 'column.valign);
                
style += sprintf('width: %s%s; 'column.checkbox || column.radio 36 widthunitWidth);

                if (
typeof column.fieldIndex !== 'undefined') {
                    
that.header.fields[column.fieldIndex] = column.field;
                    
that.header.styles[column.fieldIndex] = align style;
                    
that.header.classes[column.fieldIndex] = class_;
                    
that.header.formatters[column.fieldIndex] = column.formatter;
                    
that.header.events[column.fieldIndex] = column.events;
                    
that.header.sorters[column.fieldIndex] = column.sorter;
                    
that.header.sortNames[column.fieldIndex] = column.sortName;
                    
that.header.cellStyles[column.fieldIndex] = column.cellStyle;
                    
that.header.searchables[column.fieldIndex] = column.searchable;

                    if (!
column.visible) {
                        return;
                    }

                    if (
that.options.cardView && (!column.cardVisible)) {
                        return;
                    }

                    
visibleColumns[column.field] = column;
                }

                
html.push('<th' sprintf(' title="%s"'column.titleTooltip),
                    
column.checkbox || column.radio ?
                    
sprintf(' class="bs-checkbox %s"'column['class'] || '') :
                    
class_,
                    
sprintf(' style="%s"'halign style),
                    
sprintf(' rowspan="%s"'column.rowspan),
                    
sprintf(' colspan="%s"'column.colspan),
                    
sprintf(' data-field="%s"'column.field),
                    
'>');

                
html.push(sprintf('<div class="th-inner %s">'that.options.sortable && column.sortable ?
                    
'sortable both' ''));

                
text column.title;

                if (
column.checkbox) {
                    if (!
that.options.singleSelect && that.options.checkboxHeader) {
                        
text '<input name="btSelectAll" type="checkbox" />';
                    }
                    
that.header.stateField column.field;
                }
                if (
column.radio) {
                    
text '';
                    
that.header.stateField column.field;
                    
that.options.singleSelect true;
                }

                
html.push(text);
                
html.push('</div>');
                
html.push('<div class="fht-cell"></div>');
                
html.push('</div>');
                
html.push('</th>');
            });
            
html.push('</tr>');
        });

        
this.$header.html(html.join(''));
        
this.$header.find('th[data-field]').each(function (i) {
            $(
this).data(visibleColumns[$(this).data('field')]);
        });
        
this.$container.off('click''.th-inner').on('click''.th-inner', function (event) {
            if (
that.options.sortable && $(this).parent().data().sortable) {
                
that.onSort(event);
            }
        });

        if (!
this.options.showHeader || this.options.cardView) {
            
this.$header.hide();
            
this.$tableHeader.hide();
            
this.$tableLoading.css('top'0);
        } else {
            
this.$header.show();
            
this.$tableHeader.show();
            
this.$tableLoading.css('top'this.$header.outerHeight() + 1);
            
// Assign the correct sortable arrow
            
this.getCaret();
        }

        
this.$selectAll this.$header.find('[name="btSelectAll"]');
        
this.$container.off('click''[name="btSelectAll"]')
            .
on('click''[name="btSelectAll"]', function () {
                var 
checked = $(this).prop('checked');
                
that[checked 'checkAll' 'uncheckAll']();
            });
    };

    
BootstrapTable.prototype.initFooter = function () {
        if (!
this.options.showFooter || this.options.cardView) {
            
this.$tableFooter.hide();
        } else {
            
this.$tableFooter.show();
        }
    };

    
/**
     * @param data
     * @param type: append / prepend
     */
    
BootstrapTable.prototype.initData = function (datatype) {
        if (
type === 'append') {
            
this.data this.data.concat(data);
        } else if (
type === 'prepend') {
            
this.data = [].concat(data).concat(this.data);
        } else {
            
this.data data || this.options.data;
        }

        
// Fix #839 Records deleted when adding new row on filtered table
        
if (type === 'append') {
            
this.options.data this.options.data.concat(data);
        } else if (
type === 'prepend') {
            
this.options.data = [].concat(data).concat(this.options.data);
        } else {
            
this.options.data this.data;
        }

        if (
this.options.sidePagination === 'server') {
            return;
        }
        
this.initSort();
    };

    
BootstrapTable.prototype.initSort = function () {
        var 
that this,
            
name this.options.sortName,
            
order this.options.sortOrder === 'desc' ? -1,
            
index = $.inArray(this.options.sortNamethis.header.fields);

        if (
index !== -1) {
            
this.data.sort(function (ab) {
                if (
that.header.sortNames[index]) {
                    
name that.header.sortNames[index];
                }
                var 
aa a[name],
                    
bb b[name],
                    
value calculateObjectValue(that.headerthat.header.sorters[index], [aabb]);

                if (
value !== undefined) {
                    return 
order value;
                }

                
// Fix #161: undefined or null string sort bug.
                
if (aa === undefined || aa === null) {
                    
aa '';
                }
                if (
bb === undefined || bb === null) {
                    
bb '';
                }

                
// IF both values are numeric, do a numeric comparison
                
if ($.isNumeric(aa) && $.isNumeric(bb)) {
                    
// Convert numerical values form string to float.
                    
aa parseFloat(aa);
                    
bb parseFloat(bb);
                    if (
aa bb) {
                        return 
order * -1;
                    }
                    return 
order;
                }

                if (
aa === bb) {
                    return 
0;
                }

                
// If value is not a string, convert to string
                
if (typeof aa !== 'string') {
                    
aa aa.toString();
                }

                if (
aa.localeCompare(bb) === -1) {
                    return 
order * -1;
                }

                return 
order;
            });
        }
    };

    
BootstrapTable.prototype.onSort = function (event) {
        var 
$this = $(event.currentTarget).parent(),
            
$this_ this.$header.find('th').eq($this.index());

        
this.$header.add(this.$header_).find('span.order').remove();

        if (
this.options.sortName === $this.data('field')) {
            
this.options.sortOrder this.options.sortOrder === 'asc' 'desc' 'asc';
        } else {
            
this.options.sortName $this.data('field');
            
this.options.sortOrder $this.data('order') === 'asc' 'desc' 'asc';
        }
        
this.trigger('sort'this.options.sortNamethis.options.sortOrder);

        
$this.add($this_).data('order'this.options.sortOrder);

        
// Assign the correct sortable arrow
        
this.getCaret();

        if (
this.options.sidePagination === 'server') {
            
this.initServer(this.options.silentSort);
            return;
        }

        
this.initSort();
        
this.initBody();
    };

    
BootstrapTable.prototype.initToolbar = function () {
        var 
that this,
            
html = [],
            
timeoutId 0,
            
$keepOpen,
            
$search,
            
switchableCount 0;

        
this.$toolbar.html('');

        if (
typeof this.options.toolbar === 'string' || typeof this.options.toolbar === 'object') {
            $(
sprintf('<div class="bars pull-%s"></div>'this.options.toolbarAlign))
                .
appendTo(this.$toolbar)
                .
append($(this.options.toolbar));
        }

        
// showColumns, showToggle, showRefresh
        
html = [sprintf('<div class="columns columns-%s btn-group pull-%s">',
            
this.options.buttonsAlignthis.options.buttonsAlign)];

        if (
typeof this.options.icons === 'string') {
            
this.options.icons calculateObjectValue(nullthis.options.icons);
        }

        if (
this.options.showPaginationSwitch) {
            
html.push(sprintf('<button class="btn btn-default" type="button" name="paginationSwitch" title="%s">',
                    
this.options.formatPaginationSwitch()),
                
sprintf('<i class="%s %s"></i>'this.options.iconsPrefixthis.options.icons.paginationSwitchDown),
                
'</button>');
        }

        if (
this.options.showRefresh) {
            
html.push(sprintf('<button class="btn btn-default' + (this.options.iconSize === undefined '' ' btn-' this.options.iconSize) + '" type="button" name="refresh" title="%s">',
                    
this.options.formatRefresh()),
                
sprintf('<i class="%s %s"></i>'this.options.iconsPrefixthis.options.icons.refresh),
                
'</button>');
        }

        if (
this.options.showToggle) {
            
html.push(sprintf('<button class="btn btn-default' + (this.options.iconSize === undefined '' ' btn-' this.options.iconSize) + '" type="button" name="toggle" title="%s">',
                    
this.options.formatToggle()),
                
sprintf('<i class="%s %s"></i>'this.options.iconsPrefixthis.options.icons.toggle),
                
'</button>');
        }

        if (
this.options.showColumns) {
            
html.push(sprintf('<div class="keep-open btn-group" title="%s">',
                    
this.options.formatColumns()),
                
'<button type="button" class="btn btn-default' + (this.options.iconSize == undefined '' ' btn-' this.options.iconSize) + ' dropdown-toggle" data-toggle="dropdown">',
                
sprintf('<i class="%s %s"></i>'this.options.iconsPrefixthis.options.icons.columns),
                
' <span class="caret"></span>',
                
'</button>',
                
'<ul class="dropdown-menu" role="menu">');

            $.
each(this.columns, function (icolumn) {
                if (
column.radio || column.checkbox) {
                    return;
                }

                if (
that.options.cardView && (!column.cardVisible)) {
                    return;
                }

                var 
checked column.visible ' checked="checked"' '';

                if (
column.switchable) {
                    
html.push(sprintf('<li>' +
                        
'<label><input type="checkbox" data-field="%s" value="%s"%s> %s</label>' +
                        
'</li>'column.fieldicheckedcolumn.title));
                    
switchableCount++;
                }
            });
            
html.push('</ul>',
                
'</div>');
        }

        
html.push('</div>');

        
// Fix #188: this.showToolbar is for extentions
        
if (this.showToolbar || html.length 2) {
            
this.$toolbar.append(html.join(''));
        }

        if (
this.options.showPaginationSwitch) {
            
this.$toolbar.find('button[name="paginationSwitch"]')
                .
off('click').on('click', $.proxy(this.togglePaginationthis));
        }

        if (
this.options.showRefresh) {
            
this.$toolbar.find('button[name="refresh"]')
                .
off('click').on('click', $.proxy(this.refreshthis));
        }

        if (
this.options.showToggle) {
            
this.$toolbar.find('button[name="toggle"]')
                .
off('click').on('click', function () {
                    
that.toggleView();
                });
        }

        if (
this.options.showColumns) {
            
$keepOpen this.$toolbar.find('.keep-open');

            if (
switchableCount <= this.options.minimumCountColumns) {
                
$keepOpen.find('input').prop('disabled'true);
            }

            
$keepOpen.find('li').off('click').on('click', function (event) {
                
event.stopImmediatePropagation();
            });
            
$keepOpen.find('input').off('click').on('click', function () {
                var 
$this = $(this);

                
that.toggleColumn(getFieldIndex(that.columns,
                    $(
this).data('field')), $this.prop('checked'), false);
                
that.trigger('column-switch', $(this).data('field'), $this.prop('checked'));
            });
        }

        if (
this.options.search) {
            
html = [];
            
html.push(
                
'<div class="pull-' this.options.searchAlign ' search">',
                
sprintf('<input class="form-control' + (this.options.iconSize === undefined '' ' input-' this.options.iconSize) + '" type="text" placeholder="%s">',
                    
this.options.formatSearch()),
                
'</div>');

            
this.$toolbar.append(html.join(''));
            
$search this.$toolbar.find('.search input');
            
$search.off('keyup drop').on('keyup drop', function (event) {
                
clearTimeout(timeoutId); // doesn't matter if it's 0
                
timeoutId setTimeout(function () {
                    
that.onSearch(event);
                }, 
that.options.searchTimeOut);
            });

            if (
this.options.searchText !== '') {
                
$search.val(this.options.searchText);
                
that.onSearch({currentTarget$search});
            }
        }
    };

    
BootstrapTable.prototype.onSearch = function (event) {
        var 
text = $.trim($(event.currentTarget).val());

        
// trim search input
        
if (this.options.trimOnSearch && $(event.currentTarget).val() !== text) {
            $(
event.currentTarget).val(text);
        }

        if (
text === this.searchText) {
            return;
        }
        
this.searchText text;

        
this.options.pageNumber 1;
        
this.initSearch();
        
this.updatePagination();
        
this.trigger('search'text);
    };

    
BootstrapTable.prototype.initSearch = function () {
        var 
that this;

        if (
this.options.sidePagination !== 'server') {
            var 
this.searchText && this.searchText.toLowerCase();
            var 
= $.isEmptyObject(this.filterColumns) ? null this.filterColumns;

            
// Check filter
            
this.data ? $.grep(this.options.data, function (itemi) {
                for (var 
key in f) {
                    if (
item[key] !== f[key]) {
                        return 
false;
                    }
                }
                return 
true;
            }) : 
this.options.data;

            
this.data ? $.grep(this.data, function (itemi) {
                for (var 
key in item) {
                    
key = $.isNumeric(key) ? parseInt(key10) : key;
                    var 
value item[key],
                        
column that.columns[getFieldIndex(that.columnskey)],
                        
= $.inArray(keythat.header.fields);

                    
// Fix #142: search use formated data
                    
if (column && column.searchFormatter) {
                        
value calculateObjectValue(column,
                            
that.header.formatters[j], [valueitemi], value);
                    }

                    var 
index = $.inArray(keythat.header.fields);
                    if (
index !== -&& that.header.searchables[index] && (typeof value === 'string' || typeof value === 'number')) {
                        if (
that.options.strictSearch) {
                            if ((
value '').toLowerCase() === s) {
                                return 
true;
                            }
                        } else {
                            if ((
value '').toLowerCase().indexOf(s) !== -1) {
                               return 
true;
                            }
                        }
                    }
                }
                return 
false;
            }) : 
this.data;
        }
    };

    
BootstrapTable.prototype.initPagination = function () {
        if (!
this.options.pagination) {
            
this.$pagination.hide();
            return;
        } else {
            
this.$pagination.show();
        }

        var 
that this,
            
html = [],
            
$allSelected false,
            
ifromto,
            
$pageList,
            
$first$pre,
            
$next$last,
            
$number,
            
data this.getData();

        if (
this.options.sidePagination !== 'server') {
            
this.options.totalRows data.length;
        }

        
this.totalPages 0;
        if (
this.options.totalRows) {
            if (
this.options.pageSize === this.options.formatAllRows()) {
                
this.options.pageSize this.options.totalRows;
                
$allSelected true;
            } else if (
this.options.pageSize === this.options.totalRows) {
                
// Fix #667 Table with pagination,
                // multiple pages and a search that matches to one page throws exception
                
var pageLst typeof this.options.pageList === 'string' ?
                    
this.options.pageList.replace('[''').replace(']''')
                        .
replace(/ /g'').toLowerCase().split(',') : this.options.pageList;
                if (
pageLst.indexOf(this.options.formatAllRows().toLowerCase()) > -1) {
                    
$allSelected true;
                }
            }

            
this.totalPages = ~~((this.options.totalRows 1) / this.options.pageSize) + 1;

            
this.options.totalPages this.totalPages;
        }
        if (
this.totalPages && this.options.pageNumber this.totalPages) {
            
this.options.pageNumber this.totalPages;
        }

        
this.pageFrom = (this.options.pageNumber 1) * this.options.pageSize 1;
        
this.pageTo this.options.pageNumber this.options.pageSize;
        if (
this.pageTo this.options.totalRows) {
            
this.pageTo this.options.totalRows;
        }

        
html.push(
            
'<div class="pull-' this.options.paginationDetailHAlign ' pagination-detail">',
            
'<span class="pagination-info">',
            
this.options.formatShowingRows(this.pageFromthis.pageTothis.options.totalRows),
            
'</span>');

        
html.push('<span class="page-list">');

        var 
pageNumber = [
                
sprintf('<span class="btn-group %s">',
                    
this.options.paginationVAlign === 'top' || this.options.paginationVAlign === 'both' ?
                    
'dropdown' 'dropup'),
                
'<button type="button" class="btn btn-default ' +
                    (
this.options.iconSize === undefined '' ' btn-' this.options.iconSize) +
                    
' dropdown-toggle" data-toggle="dropdown">',
                
'<span class="page-size">',
                
$allSelected this.options.formatAllRows() : this.options.pageSize,
                
'</span>',
                
' <span class="caret"></span>',
                
'</button>',
                
'<ul class="dropdown-menu" role="menu">'
            
],
            
pageList this.options.pageList;

        if (
typeof this.options.pageList === 'string') {
            var list = 
this.options.pageList.replace('[''').replace(']''')
                .
replace(/ /g'').split(',');

            
pageList = [];
            $.
each(list, function (ivalue) {
                
pageList.push(value.toUpperCase() === that.options.formatAllRows().toUpperCase() ?
                    
that.options.formatAllRows() : +value);
            });
        }

        $.
each(pageList, function (ipage) {
            if (!
that.options.smartDisplay || === || pageList[1] <= that.options.totalRows) {
                var 
active;
                if (
$allSelected) {
                    
active page === that.options.formatAllRows() ? ' class="active"' '';
                } else {
                    
active page === that.options.pageSize ' class="active"' '';
                }
                
pageNumber.push(sprintf('<li%s><a href="javascript:void(0)">%s</a></li>'activepage));
            }
        });
        
pageNumber.push('</ul></span>');

        
html.push(this.options.formatRecordsPerPage(pageNumber.join('')));
        
html.push('</span>');

        
html.push('</div>',
            
'<div class="pull-' this.options.paginationHAlign ' pagination">',
            
'<ul class="pagination' + (this.options.iconSize === undefined '' ' pagination-' this.options.iconSize) + '">',
            
'<li class="page-first"><a href="javascript:void(0)">' this.options.paginationFirstText '</a></li>',
            
'<li class="page-pre"><a href="javascript:void(0)">' this.options.paginationPreText '</a></li>');

        if (
this.totalPages 5) {
            
from 1;
            
to this.totalPages;
        } else {
            
from this.options.pageNumber 2;
            
to from 4;
            if (
from 1) {
                
from 1;
                
to 5;
            }
            if (
to this.totalPages) {
                
to this.totalPages;
                
from to 4;
            }
        }
        for (
from<= toi++) {
            
html.push('<li class="page-number' + (=== this.options.pageNumber ' active' '') + '">',
                
'<a href="javascript:void(0)">'i'</a>',
                
'</li>');
        }

        
html.push(
            
'<li class="page-next"><a href="javascript:void(0)">' this.options.paginationNextText '</a></li>',
            
'<li class="page-last"><a href="javascript:void(0)">' this.options.paginationLastText '</a></li>',
            
'</ul>',
            
'</div>');

        
this.$pagination.html(html.join(''));

        
$pageList this.$pagination.find('.page-list a');
        
$first this.$pagination.find('.page-first');
        
$pre this.$pagination.find('.page-pre');
        
$next this.$pagination.find('.page-next');
        
$last this.$pagination.find('.page-last');
        
$number this.$pagination.find('.page-number');

        if (
this.options.pageNumber <= 1) {
            
$first.addClass('disabled');
            
$pre.addClass('disabled');
        }
        if (
this.options.pageNumber >= this.totalPages) {
            
$next.addClass('disabled');
            
$last.addClass('disabled');
        }
        if (
this.options.smartDisplay) {
            if (
this.totalPages <= 1) {
                
this.$pagination.find('div.pagination').hide();
            }
            if (
pageList.length || this.options.totalRows <= pageList[0]) {
                
this.$pagination.find('span.page-list').hide();
            }

            
// when data is empty, hide the pagination
            
this.$pagination[this.getData().length 'show' 'hide']();
        }
        if (
$allSelected) {
            
this.options.pageSize this.options.formatAllRows();
        }
        
$pageList.off('click').on('click', $.proxy(this.onPageListChangethis));
        
$first.off('click').on('click', $.proxy(this.onPageFirstthis));
        
$pre.off('click').on('click', $.proxy(this.onPagePrethis));
        
$next.off('click').on('click', $.proxy(this.onPageNextthis));
        
$last.off('click').on('click', $.proxy(this.onPageLastthis));
        
$number.off('click').on('click', $.proxy(this.onPageNumberthis));
    };

    
BootstrapTable.prototype.updatePagination = function (event) {
        
// Fix #171: IE disabled button can be clicked bug.
        
if (event && $(event.currentTarget).hasClass('disabled')) {
            return;
        }

        if (!
this.options.maintainSelected) {
            
this.resetRows();
        }

        
this.initPagination();
        if (
this.options.sidePagination === 'server') {
            
this.initServer();
        } else {
            
this.initBody();
        }

        
this.trigger('page-change'this.options.pageNumberthis.options.pageSize);
    };

    
BootstrapTable.prototype.onPageListChange = function (event) {
        var 
$this = $(event.currentTarget);

        
$this.parent().addClass('active').siblings().removeClass('active');
        
this.options.pageSize $this.text().toUpperCase() === this.options.formatAllRows().toUpperCase() ?
            
this.options.formatAllRows() : +$this.text();
        
this.$toolbar.find('.page-size').text(this.options.pageSize);

        
this.updatePagination(event);
    };

    
BootstrapTable.prototype.onPageFirst = function (event) {
        
this.options.pageNumber 1;
        
this.updatePagination(event);
    };

    
BootstrapTable.prototype.onPagePre = function (event) {
        
this.options.pageNumber--;
        
this.updatePagination(event);
    };

    
BootstrapTable.prototype.onPageNext = function (event) {
        
this.options.pageNumber++;
        
this.updatePagination(event);
    };

    
BootstrapTable.prototype.onPageLast = function (event) {
        
this.options.pageNumber this.totalPages;
        
this.updatePagination(event);
    };

    
BootstrapTable.prototype.onPageNumber = function (event) {
        if (
this.options.pageNumber === +$(event.currentTarget).text()) {
            return;
        }
        
this.options.pageNumber = +$(event.currentTarget).text();
        
this.updatePagination(event);
    };

    
BootstrapTable.prototype.initBody = function (fixedScroll) {
        var 
that this,
            
html = [],
            
data this.getData();

        
this.trigger('pre-body'data);

        
this.$body this.$el.find('tbody');
        if (!
this.$body.length) {
            
this.$body = $('<tbody></tbody>').appendTo(this.$el);
        }

        
//Fix #389 Bootstrap-table-flatJSON is not working

        
if (!this.options.pagination || this.options.sidePagination === 'server') {
            
this.pageFrom 1;
            
this.pageTo data.length;
        }

        for (var 
this.pageFrom 1this.pageToi++) {
            var 
key,
                
item data[i],
                
style = {},
                
csses = [],
                
data_ '',
                
attributes = {},
                
htmlAttributes = [];

            
style calculateObjectValue(this.optionsthis.options.rowStyle, [itemi], style);

            if (
style && style.css) {
                for (
key in style.css) {
                    
csses.push(key ': ' style.css[key]);
                }
            }

            
attributes calculateObjectValue(this.options,
                
this.options.rowAttributes, [itemi], attributes);

            if (
attributes) {
                for (
key in attributes) {
                    
htmlAttributes.push(sprintf('%s="%s"'keyescapeHTML(attributes[key])));
                }
            }

            if (
item._data && !$.isEmptyObject(item._data)) {
                $.
each(item._data, function (kv) {
                    
// ignore data-index
                    
if (=== 'index') {
                        return;
                    }
                    
data_ += sprintf(' data-%s="%s"'kv);
                });
            }

            
html.push('<tr',
                
sprintf(' %s'htmlAttributes.join(' ')),
                
sprintf(' id="%s"', $.isArray(item) ? undefined item._id),
                
sprintf(' class="%s"'style.classes || ($.isArray(item) ? undefined item._class)),
                
sprintf(' data-index="%s"'i),
                
sprintf(' data-uniqueid="%s"'item[this.options.uniqueId]),
                
sprintf('%s'data_),
                
'>'
            
);

            if (
this.options.cardView) {
                
html.push(sprintf('<td colspan="%s">'this.header.fields.length));
            }

            if (!
this.options.cardView && this.options.detailView) {
                
html.push('<td>',
                    
'<a class="detail-icon" href="javascript:">',
                    
sprintf('<i class="%s %s"></i>'this.options.iconsPrefixthis.options.icons.detailOpen),
                    
'</a>',
                    
'</td>');
            }

            $.
each(this.header.fields, function (jfield) {
                var 
text '',
                    
value item[field],
                    
type '',
                    
cellStyle = {},
                    
id_ '',
                    
class_ that.header.classes[j],
                    
data_ '',
                    
rowspan_ '',
                    
title_ '',
                    
column that.columns[getFieldIndex(that.columnsfield)];

                if (!
column.visible) {
                    return;
                }

                
style sprintf('style="%s"'csses.concat(that.header.styles[j]).join('; '));

                
value calculateObjectValue(column,
                    
that.header.formatters[j], [valueitemi], value);

                
// handle td's id and class
                
if (item['_' field '_id']) {
                    
id_ sprintf(' id="%s"'item['_' field '_id']);
                }
                if (
item['_' field '_class']) {
                    
class_ sprintf(' class="%s"'item['_' field '_class']);
                }
                if (
item['_' field '_rowspan']) {
                    
rowspan_ sprintf(' rowspan="%s"'item['_' field '_rowspan']);
                }
                if (
item['_' field '_title']) {
                    
title_ sprintf(' title="%s"'item['_' field '_title']);
                }
                
cellStyle calculateObjectValue(that.header,
                    
that.header.cellStyles[j], [valueitemi], cellStyle);
                if (
cellStyle.classes) {
                    
class_ sprintf(' class="%s"'cellStyle.classes);
                }
                if (
cellStyle.css) {
                    var 
csses_ = [];
                    for (var 
key in cellStyle.css) {
                        
csses_.push(key ': ' cellStyle.css[key]);
                    }
                    
style sprintf('style="%s"'csses_.concat(that.header.styles[j]).join('; '));
                }

                if (
item['_' field '_data'] && !$.isEmptyObject(item['_' field '_data'])) {
                    $.
each(item['_' field '_data'], function (kv) {
                        
// ignore data-index
                        
if (=== 'index') {
                            return;
                        }
                        
data_ += sprintf(' data-%s="%s"'kv);
                    });
                }

                if (
column.checkbox || column.radio) {
                    
type column.checkbox 'checkbox' type;
                    
type column.radio 'radio' type;

                    
text = [that.options.cardView ?
                        
'<div class="card-view">' '<td class="bs-checkbox">',
                        
'<input' +
                        
sprintf(' data-index="%s"'i) +
                        
sprintf(' name="%s"'that.options.selectItemName) +
                        
sprintf(' type="%s"'type) +
                        
sprintf(' value="%s"'item[that.options.idField]) +
                        
sprintf(' checked="%s"'value === true ||
                            (
value && value.checked) ? 'checked' undefined) +
                        
sprintf(' disabled="%s"', !column.checkboxEnabled ||
                            (
value && value.disabled) ? 'disabled' undefined) +
                        
' />',
                        
that.options.cardView '</div>' '</td>'
                    
].join('');

                    
item[that.header.stateField] = value === true || (value && value.checked);
                } else {
                    
value typeof value === 'undefined' || value === null ?
                        
that.options.undefinedText value;

                    
text that.options.cardView ? ['<div class="card-view">',
                        
that.options.showHeader sprintf('<span class="title" %s>%s</span>'style,
                            
getPropertyFromOther(that.columns'field''title'field)) : '',
                        
sprintf('<span class="value">%s</span>'value),
                        
'</div>'
                    
].join('') : [sprintf('<td%s %s %s %s %s %s>'id_class_styledata_rowspan_title_),
                        
value,
                        
'</td>'
                    
].join('');

                    
// Hide empty data on Card view when smartDisplay is set to true.
                    
if (that.options.cardView && that.options.smartDisplay && value === '') {
                        
text '';
                    }
                }

                
html.push(text);
            });

            if (
this.options.cardView) {
                
html.push('</td>');
            }

            
html.push('</tr>');
        }

        
// show no records
        
if (!html.length) {
            
html.push('<tr class="no-records-found">',
                
sprintf('<td colspan="%s">%s</td>',
                    
this.$header.find('th').lengththis.options.formatNoMatches()),
                
'</tr>');
        }

        
this.$body.html(html.join(''));

        if (!
fixedScroll) {
            
this.scrollTo(0);
        }

        
// click to select by column
        
this.$body.find('> tr[data-index] > td').off('click dblclick').on('click dblclick', function (e) {
            var 
$td = $(this),
                
$tr $td.parent(),
                
item that.data[$tr.data('index')],
                
index $td[0].cellIndex,
                
field that.header.fields[that.options.detailView && !that.options.cardView index index],
                
colomn that.columns[getFieldIndex(that.columnsfield)],
                
value item[field];

            if (
$td.find('.detail-icon').length) {
                return;
            }

            
that.trigger(e.type === 'click' 'click-cell' 'dbl-click-cell'fieldvalueitem$td);
            
that.trigger(e.type === 'click' 'click-row' 'dbl-click-row'item$tr);

            
// if click to select - then trigger the checkbox/radio click
            
if (e.type === 'click' && that.options.clickToSelect && colomn.clickToSelect) {
                var 
$selectItem $tr.find(sprintf('[name="%s"]'that.options.selectItemName));
                if (
$selectItem.length) {
                    
$selectItem[0].click(); // #144: .trigger('click') bug
                
}
            }
        });

        
this.$body.find('> tr[data-index] > td > .detail-icon').off('click').on('click', function () {
            var 
$this = $(this),
                
$tr $this.parent().parent(),
                
index $tr.data('index'),
                
row data[index]; // Fix #980 Detail view, when searching, returns wrong row

            // remove and update
            
if ($tr.next().is('tr.detail-view')) {
                
$this.find('i').attr('class'sprintf('%s %s'that.options.iconsPrefixthat.options.icons.detailOpen));
                
$tr.next().remove();
                
that.trigger('collapse-row'indexrow);
            } else {
                
$this.find('i').attr('class'sprintf('%s %s'that.options.iconsPrefixthat.options.icons.detailClose));
                
$tr.after(sprintf('<tr class="detail-view"><td colspan="%s">%s</td></tr>',
                    
$tr.find('td').lengthcalculateObjectValue(that.options,
                        
that.options.detailFormatter, [indexrow], '')));
                
that.trigger('expand-row'indexrow$tr.next().find('td'));
            }
            
that.resetView();
        });

        
this.$selectItem this.$body.find(sprintf('[name="%s"]'this.options.selectItemName));
        
this.$selectItem.off('click').on('click', function (event) {
            
event.stopImmediatePropagation();

            var 
checked = $(this).prop('checked'),
                
row that.data[$(this).data('index')];

            
row[that.header.stateField] = checked;

            if (
that.options.singleSelect) {
                
that.$selectItem.not(this).each(function () {
                    
that.data[$(this).data('index')][that.header.stateField] = false;
                });
                
that.$selectItem.filter(':checked').not(this).prop('checked'false);
            }

            
that.updateSelected();
            
that.trigger(checked 'check' 'uncheck'row);
        });

        $.
each(this.header.events, function (ievents) {
            if (!
events) {
                return;
            }
            
// fix bug, if events is defined with namespace
            
if (typeof events === 'string') {
                
events calculateObjectValue(nullevents);
            }

            var 
field that.header.fields[i],
                
fieldIndex = $.inArray(fieldthat.getVisibleFields());

            if (
that.options.detailView && !that.options.cardView) {
                
fieldIndex += 1;
            }

            for (var 
key in events) {
                
that.$body.find('tr').each(function () {
                    var 
$tr = $(this),
                        
$td $tr.find(that.options.cardView '.card-view' 'td').eq(fieldIndex),
                        
index key.indexOf(' '),
                        
name key.substring(0index),
                        
el key.substring(index 1),
                        
func events[key];

                    
$td.find(el).off(name).on(name, function (e) {
                        var 
index $tr.data('index'),
                            
row that.data[index],
                            
value row[field];

                        
func.apply(this, [evaluerowindex]);
                    });
                });
            }
        });

        
this.updateSelected();
        
this.resetView();

        
this.trigger('post-body');
    };

    
BootstrapTable.prototype.initServer = function (silentquery) {
        var 
that this,
            
data = {},
            
params = {
                
pageSizethis.options.pageSize === this.options.formatAllRows() ?
                    
this.options.totalRows this.options.pageSize,
                
pageNumberthis.options.pageNumber,
                
searchTextthis.searchText,
                
sortNamethis.options.sortName,
                
sortOrderthis.options.sortOrder
            
},
            
request;

        if (!
this.options.url && !this.options.ajax) {
            return;
        }

        if (
this.options.queryParamsType === 'limit') {
            
params = {
                
searchparams.searchText,
                
sortparams.sortName,
                
orderparams.sortOrder
            
};
            if (
this.options.pagination) {
                
params.limit this.options.pageSize === this.options.formatAllRows() ?
                    
this.options.totalRows this.options.pageSize;
                
params.offset this.options.pageSize === this.options.formatAllRows() ?
                    
this.options.pageSize * (this.options.pageNumber 1);
            }
        }

        if (!($.
isEmptyObject(this.filterColumnsPartial))) {
            
params['filter'] = JSON.stringify(this.filterColumnsPartialnull);
        }

        
data calculateObjectValue(this.optionsthis.options.queryParams, [params], data);

        $.
extend(dataquery || {});

        
// false to stop request
        
if (data === false) {
            return;
        }

        if (!
silent) {
            
this.$tableLoading.show();
        }
        
request = $.extend({}, calculateObjectValue(nullthis.options.ajaxOptions), {
            
typethis.options.method,
            
urlthis.options.url,
            
datathis.options.contentType === 'application/json' && this.options.method === 'post' ?
                
JSON.stringify(data) : data,
            
cachethis.options.cache,
            
contentTypethis.options.contentType,
            
dataTypethis.options.dataType,
            
success: function (res) {
                
res calculateObjectValue(that.optionsthat.options.responseHandler, [res], res);

                
that.load(res);
                
that.trigger('load-success'res);
            },
            
error: function (res) {
                
that.trigger('load-error'res.status);
            },
            
complete: function () {
                if (!
silent) {
                    
that.$tableLoading.hide();
                }
            }
        });

        if (
this.options.ajax) {
            
calculateObjectValue(thisthis.options.ajax, [request], null);
        } else {
            $.
ajax(request);
        }
    };

    
BootstrapTable.prototype.getCaret = function () {
        var 
that this;

        $.
each(this.$header.find('th'), function (ith) {
            $(
th).find('.sortable').removeClass('desc asc').addClass($(th).data('field') === that.options.sortName that.options.sortOrder 'both');
        });
    };

    
BootstrapTable.prototype.updateSelected = function () {
        var 
checkAll this.$selectItem.filter(':enabled').length ===
            
this.$selectItem.filter(':enabled').filter(':checked').length;

        
this.$selectAll.add(this.$selectAll_).prop('checked'checkAll);

        
this.$selectItem.each(function () {
            $(
this).closest('tr')[$(this).prop('checked') ? 'addClass' 'removeClass']('selected');
        });
    };

    
BootstrapTable.prototype.updateRows = function () {
        var 
that this;

        
this.$selectItem.each(function () {
            
that.data[$(this).data('index')][that.header.stateField] = $(this).prop('checked');
        });
    };

    
BootstrapTable.prototype.resetRows = function () {
        var 
that this;

        $.
each(this.data, function (irow) {
            
that.$selectAll.prop('checked'false);
            
that.$selectItem.prop('checked'false);
            if (
that.header.stateField) {
                
row[that.header.stateField] = false;
            }
        });
    };

    
BootstrapTable.prototype.trigger = function (name) {
        var 
args = Array.prototype.slice.call(arguments1);

        
name += '.bs.table';
        
this.options[BootstrapTable.EVENTS[name]].apply(this.optionsargs);
        
this.$el.trigger($.Event(name), args);

        
this.options.onAll(nameargs);
        
this.$el.trigger($.Event('all.bs.table'), [nameargs]);
    };

    
BootstrapTable.prototype.resetHeader = function () {
        
// fix #61: the hidden table reset header bug.
        // fix bug: get $el.css('width') error sometime (height = 500)
        
clearTimeout(this.timeoutId_);
        
this.timeoutId_ setTimeout($.proxy(this.fitHeaderthis), this.$el.is(':hidden') ? 100 0);
    };

    
BootstrapTable.prototype.fitHeader = function () {
        var 
that this,
            
fixedBody,
            
scrollWidth;

        if (
that.$el.is(':hidden')) {
            
that.timeoutId_ setTimeout($.proxy(that.fitHeaderthat), 100);
            return;
        }
        
fixedBody this.$tableBody.get(0);

        
scrollWidth fixedBody.scrollWidth fixedBody.clientWidth &&
            
fixedBody.scrollHeight fixedBody.clientHeight this.$header.outerHeight() ?
            
getScrollBarWidth() : 0;

        
this.$el.css('margin-top', -this.$header.outerHeight());
        
this.$header_ this.$header.clone(truetrue);
        
this.$selectAll_ this.$header_.find('[name="btSelectAll"]');
        
this.$tableHeader.css({
            
'margin-right'scrollWidth
        
}).find('table').css('width'this.$el.outerWidth())
            .
html('').attr('class'this.$el.attr('class'))
            .
append(this.$header_);

        
// fix bug: $.data() is not working as expected after $.append()
        
this.$header.find('th[data-field]').each(function (i) {
            
that.$header_.find(sprintf('th[data-field="%s"]', $(this).data('field'))).data($(this).data());
        });

        var 
visibleFields this.getVisibleFields();

        
this.$body.find('tr:first-child:not(.no-records-found) > *').each(function (i) {
            var 
$this = $(this),
                
index i;

            if (
that.options.detailView && !that.options.cardView) {
                if (
=== 0) {
                    
that.$header_.find('th.detail').find('.fht-cell').width($this.innerWidth());
                }
                
index 1;
            }

            
that.$header_.find(sprintf('th[data-field="%s"]'visibleFields[index]))
                .
find('.fht-cell').width($this.innerWidth());
        });
        
// horizontal scroll event
        // TODO: it's probably better improving the layout than binding to scroll event
        
this.$tableBody.off('scroll').on('scroll', function () {
            
that.$tableHeader.scrollLeft($(this).scrollLeft());

            if (
that.options.showFooter && !that.options.cardView) {
                
that.$tableFooter.scrollLeft($(this).scrollLeft());
            }
        });
        
that.trigger('post-header');
    };

    
BootstrapTable.prototype.resetFooter = function () {
        var 
that this,
            
data that.getData(),
            
html = [];

        if (!
this.options.showFooter || this.options.cardView) { //do nothing
            
return;
        }

        if (!
this.options.cardView && this.options.detailView) {
            
html.push('<td><div class="th-inner">&nbsp;</div><div class="fht-cell"></div></td>');
        }

        $.
each(this.columns, function (icolumn) {
            var 
falign ''// footer align style
                
style '',
                
class_ sprintf(' class="%s"'column['class']);

            if (!
column.visible) {
                return;
            }

            if (
that.options.cardView && (!column.cardVisible)) {
                return;
            }

            
falign sprintf('text-align: %s; 'column.falign column.falign column.align);
            
style sprintf('vertical-align: %s; 'column.valign);

            
html.push('<td'class_sprintf(' style="%s"'falign style), '>');
            
html.push('<div class="th-inner">');

            
html.push(calculateObjectValue(columncolumn.footerFormatter, [data], '&nbsp;') || '&nbsp;');

            
html.push('</div>');
            
html.push('<div class="fht-cell"></div>');
            
html.push('</div>');
            
html.push('</td>');
        });

        
this.$tableFooter.find('tr').html(html.join(''));
        
clearTimeout(this.timeoutFooter_);
        
this.timeoutFooter_ setTimeout($.proxy(this.fitFooterthis),
            
this.$el.is(':hidden') ? 100 0);
    };

    
BootstrapTable.prototype.fitFooter = function () {
        var 
that this,
            
$footerTd,
            
elWidth,
            
scrollWidth;

        
clearTimeout(this.timeoutFooter_);
        if (
this.$el.is(':hidden')) {
            
this.timeoutFooter_ setTimeout($.proxy(this.fitFooterthis), 100);
            return;
        }

        
elWidth this.$el.css('width');
        
scrollWidth elWidth this.$tableBody.width() ? getScrollBarWidth() : 0;

        
this.$tableFooter.css({
                
'margin-right'scrollWidth
            
}).find('table').css('width'elWidth)
            .
attr('class'this.$el.attr('class'));

        
$footerTd this.$tableFooter.find('td');

        
this.$body.find('tr:first-child:not(.no-records-found) > *').each(function (i) {
            var 
$this = $(this);

            
$footerTd.eq(i).find('.fht-cell').width($this.innerWidth());
        });
    };

    
BootstrapTable.prototype.toggleColumn = function (indexcheckedneedUpdate) {
        if (
index === -1) {
            return;
        }
        
this.columns[index].visible checked;
        
this.initHeader();
        
this.initSearch();
        
this.initPagination();
        
this.initBody();

        if (
this.options.showColumns) {
            var 
$items this.$toolbar.find('.keep-open input').prop('disabled'false);

            if (
needUpdate) {
                
$items.filter(sprintf('[value="%s"]'index)).prop('checked'checked);
            }

            if (
$items.filter(':checked').length <= this.options.minimumCountColumns) {
                
$items.filter(':checked').prop('disabled'true);
            }
        }
    };

    
BootstrapTable.prototype.toggleRow = function (indexisIdFieldvisible) {
        if (
index === -1) {
            return;
        }

        $(
this.$body[0]).children().filter(sprintf(isIdField '[data-uniqueid="%s"]' '[data-index="%s"]'index))[visible 'show' 'hide']();
    };

    
BootstrapTable.prototype.getVisibleFields = function () {
        var 
that this,
            
visibleFields = [];

        $.
each(this.header.fields, function (jfield) {
            var 
column that.columns[getFieldIndex(that.columnsfield)];

            if (!
column.visible) {
                return;
            }
            
visibleFields.push(field);
        });
        return 
visibleFields;
    };

    
// PUBLIC FUNCTION DEFINITION
    // =======================

    
BootstrapTable.prototype.resetView = function (params) {
        var 
padding 0;

        if (
params && params.height) {
            
this.options.height params.height;
        }

        
this.$selectAll.prop('checked'this.$selectItem.length &&
            
this.$selectItem.length === this.$selectItem.filter(':checked').length);

        if (
this.options.height) {
            var 
toolbarHeight getRealHeight(this.$toolbar),
                
paginationHeight getRealHeight(this.$pagination),
                
height this.options.height toolbarHeight paginationHeight;

            
this.$tableContainer.css('height'height 'px');
        }

        if (
this.options.cardView) {
            
// remove the element css
            
this.$el.css('margin-top''0');
            
this.$tableContainer.css('padding-bottom''0');
            return;
        }

        if (
this.options.showHeader && this.options.height) {
            
this.$tableHeader.show();
            
this.resetHeader();
            
padding += this.$header.outerHeight();
        } else {
            
this.$tableHeader.hide();
            
this.trigger('post-header');
        }

        if (
this.options.showFooter) {
            
this.resetFooter();
            if (
this.options.height) {
                
padding += this.$tableFooter.outerHeight() + 1;
            }
        }

        
// Assign the correct sortable arrow
        
this.getCaret();
        
this.$tableContainer.css('padding-bottom'padding 'px');
        
this.trigger('reset-view');
    };

    
BootstrapTable.prototype.getData = function (useCurrentPage) {
        return (
this.searchText || !$.isEmptyObject(this.filterColumns) || !$.isEmptyObject(this.filterColumnsPartial)) ?
            (
useCurrentPage this.data.slice(this.pageFrom 1this.pageTo) : this.data) :
            (
useCurrentPage this.options.data.slice(this.pageFrom 1this.pageTo) : this.options.data);
    };

    
BootstrapTable.prototype.load = function (data) {
        var 
fixedScroll false;

        
// #431: support pagination
        
if (this.options.sidePagination === 'server') {
            
this.options.totalRows data.total;
            
fixedScroll data.fixedScroll;
            
data data.rows;
        } else if (!$.
isArray(data)) { // support fixedScroll
            
fixedScroll data.fixedScroll;
            
data data.data;
        }

        
this.initData(data);
        
this.initSearch();
        
this.initPagination();
        
this.initBody(fixedScroll);
    };

    
BootstrapTable.prototype.append = function (data) {
        
this.initData(data'append');
        
this.initSearch();
        
this.initPagination();
        
this.initBody(true);
    };

    
BootstrapTable.prototype.prepend = function (data) {
        
this.initData(data'prepend');
        
this.initSearch();
        
this.initPagination();
        
this.initBody(true);
    };

    
BootstrapTable.prototype.remove = function (params) {
        var 
len this.options.data.length,
            
irow;

        if (!
params.hasOwnProperty('field') || !params.hasOwnProperty('values')) {
            return;
        }

        for (
len 1>= 0i--) {
            
row this.options.data[i];

            if (!
row.hasOwnProperty(params.field)) {
                continue;
            }
            if ($.
inArray(row[params.field], params.values) !== -1) {
                
this.options.data.splice(i1);
            }
        }

        if (
len === this.options.data.length) {
            return;
        }

        
this.initSearch();
        
this.initPagination();
        
this.initBody(true);
    };

    
BootstrapTable.prototype.removeAll = function () {
        if (
this.options.data.length 0) {
            
this.options.data.splice(0this.options.data.length);
            
this.initSearch();
            
this.initPagination();
            
this.initBody(true);
        }
    };

    
BootstrapTable.prototype.getRowByUniqueId = function (id) {
        var 
uniqueId this.options.uniqueId,
            
len this.options.data.length,
            
dataRow null,
            
irow;

        for (
len 1>= 0i--) {
            
row this.options.data[i];

            if (!
row.hasOwnProperty(uniqueId)) {
                continue;
            }

            if (
typeof row[uniqueId] === 'string') {
                
id id.toString();
            } else if (
typeof row[uniqueId] === 'number') {
                if ((
Number(row[uniqueId]) === row[uniqueId]) && (row[uniqueId] % === 0)) {
                    
id parseInt(id);
                } else if ((
row[uniqueId] === Number(row[uniqueId])) && (row[uniqueId] !== 0)) {
                    
id parseFloat(id);
                }
            }

            if (
row[uniqueId] === id) {
                
dataRow row;
                break;
            }
        }

        return 
dataRow;
    };

    
BootstrapTable.prototype.removeByUniqueId = function (id) {
        var 
len this.options.data.length,
            
row this.getRowByUniqueId(id);

        if (
row) {
            
this.options.data.splice(this.options.data.indexOf(row), 1);
        }

        if (
len === this.options.data.length) {
            return;
        }

        
this.initSearch();
        
this.initPagination();
        
this.initBody(true);
    };

    
BootstrapTable.prototype.insertRow = function (params) {
        if (!
params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {
            return;
        }
        
this.data.splice(params.index0params.row);
        
this.initSearch();
        
this.initPagination();
        
this.initSort();
        
this.initBody(true);
    };

    
BootstrapTable.prototype.updateRow = function (params) {
        if (!
params.hasOwnProperty('index') || !params.hasOwnProperty('row')) {
            return;
        }
        $.
extend(this.data[params.index], params.row);
        
this.initSort();
        
this.initBody(true);
    };

    
BootstrapTable.prototype.showRow = function (params) {
        if (!
params.hasOwnProperty('index')) {
            return;
        }

        
this.toggleRow(params.indexparams.isIdField === undefined false truetrue);
    };

    
BootstrapTable.prototype.hideRow = function (params) {
        if (!
params.hasOwnProperty('index')) {
            return;
        }

        
this.toggleRow(params.indexparams.isIdField === undefined false truefalse);
    };

    
BootstrapTable.prototype.getRowsHidden = function (show) {
        var 
rows = $(this.$body[0]).children().filter(':hidden'),
            
0;
        if (
show) {
            for (; 
rows.lengthi++) {
                $(
rows[i]).show();
            }
        }
        return 
rows;
    };

    
BootstrapTable.prototype.mergeCells = function (options) {
        var 
row options.index,
            
col = $.inArray(options.fieldthis.getVisibleFields()),
            
rowspan options.rowspan || 1,
            
colspan options.colspan || 1,
            
ij,
            
$tr this.$body.find('tr'),
            
$td;

        if (
this.options.detailView && !this.options.cardView) {
            
col += 1;
        }

        
$td $tr.eq(row).find('td').eq(col);

        if (
row || col || row >= this.data.length) {
            return;
        }

        for (
rowrow rowspani++) {
            for (
colcol colspanj++) {
                
$tr.eq(i).find('td').eq(j).hide();
            }
        }

        
$td.attr('rowspan'rowspan).attr('colspan'colspan).show();
    };

    
BootstrapTable.prototype.updateCell = function (params) {
        if (!
params.hasOwnProperty('rowIndex') || !params.hasOwnProperty('fieldName') || !params.hasOwnProperty('fieldValue')) {
            return;
        }
        
this.data[params.rowIndex][params.fieldName] = params.fieldValue;
        
this.initSort();
        
this.initBody(true);
    };

    
BootstrapTable.prototype.getOptions = function () {
        return 
this.options;
    };

    
BootstrapTable.prototype.getSelections = function () {
        var 
that this;

        return $.
grep(this.data, function (row) {
            return 
row[that.header.stateField];
        });
    };

    
BootstrapTable.prototype.getAllSelections = function () {
        var 
that this;

        return $.
grep(this.options.data, function (row) {
            return 
row[that.header.stateField];
        });
    };

    
BootstrapTable.prototype.checkAll = function () {
        
this.checkAll_(true);
    };

    
BootstrapTable.prototype.uncheckAll = function () {
        
this.checkAll_(false);
    };

    
BootstrapTable.prototype.checkAll_ = function (checked) {
        var 
rows;
        if (!
checked) {
            
rows this.getSelections();
        }
        
this.$selectItem.filter(':enabled').prop('checked'checked);
        
this.updateRows();
        
this.updateSelected();
        if (
checked) {
            
rows this.getSelections();
        }
        
this.trigger(checked 'check-all' 'uncheck-all'rows);
    };

    
BootstrapTable.prototype.check = function (index) {
        
this.check_(trueindex);
    };

    
BootstrapTable.prototype.uncheck = function (index) {
        
this.check_(falseindex);
    };

    
BootstrapTable.prototype.check_ = function (checkedindex) {
        
this.$selectItem.filter(sprintf('[data-index="%s"]'index)).prop('checked'checked);
        
this.data[index][this.header.stateField] = checked;
        
this.updateSelected();
        
this.trigger(checked 'check' 'uncheck'this.data[index]);
    };

    
BootstrapTable.prototype.checkBy = function (obj) {
        
this.checkBy_(trueobj);
    };

    
BootstrapTable.prototype.uncheckBy = function (obj) {
        
this.checkBy_(falseobj);
    };

    
BootstrapTable.prototype.checkBy_ = function (checkedobj) {
        if (!
obj.hasOwnProperty('field') || !obj.hasOwnProperty('values')) {
            return;
        }

        var 
that this,
            
rows = [];
        $.
each(this.options.data, function (indexrow) {
            if (!
row.hasOwnProperty(obj.field)) {
                return 
false;
            }
            if ($.
inArray(row[obj.field], obj.values) !== -1) {
                
that.$selectItem.filter(sprintf('[data-index="%s"]'index)).prop('checked'checked);
                
row[that.header.stateField] = checked;
                
rows.push(row);
                
that.trigger(checked 'check' 'uncheck'row);
            }
        });
        
this.updateSelected();
        
this.trigger(checked 'check-some' 'uncheck-some'rows);
    };

    
BootstrapTable.prototype.destroy = function () {
        
this.$el.insertBefore(this.$container);
        $(
this.options.toolbar).insertBefore(this.$el);
        
this.$container.next().remove();
        
this.$container.remove();
        
this.$el.html(this.$el_.html())
            .
css('margin-top''0')
            .
attr('class'this.$el_.attr('class') || ''); // reset the class
    
};

    
BootstrapTable.prototype.showLoading = function () {
        
this.$tableLoading.show();
    };

    
BootstrapTable.prototype.hideLoading = function () {
        
this.$tableLoading.hide();
    };

    
BootstrapTable.prototype.togglePagination = function () {
        
this.options.pagination = !this.options.pagination;
        var 
button this.$toolbar.find('button[name="paginationSwitch"] i');
        if (
this.options.pagination) {
            
button.attr("class"this.options.iconsPrefix " " this.options.icons.paginationSwitchDown);
        } else {
            
button.attr("class"this.options.iconsPrefix " " this.options.icons.paginationSwitchUp);
        }
        
this.updatePagination();
    };

    
BootstrapTable.prototype.refresh = function (params) {
        if (
params && params.url) {
            
this.options.url params.url;
            
this.options.pageNumber 1;
        }
        
this.initServer(params && params.silentparams && params.query);
    };

    
BootstrapTable.prototype.resetWidth = function () {
        if (
this.options.showHeader && this.options.height) {
            
this.fitHeader();
        }
        if (
this.options.showFooter) {
            
this.fitFooter();
        }
    };

    
BootstrapTable.prototype.showColumn = function (field) {
        
this.toggleColumn(getFieldIndex(this.columnsfield), truetrue);
    };

    
BootstrapTable.prototype.hideColumn = function (field) {
        
this.toggleColumn(getFieldIndex(this.columnsfield), falsetrue);
    };

    
BootstrapTable.prototype.getHiddenColumns = function () {
        return $.
grep(this.columns, function( column ) {
            return !
column.visible;
        });
    };

    
BootstrapTable.prototype.filterBy = function (columns) {
        
this.filterColumns = $.isEmptyObject(columns) ? {} : columns;
        
this.options.pageNumber 1;
        
this.initSearch();
        
this.updatePagination();
    };

    
BootstrapTable.prototype.scrollTo = function (value) {
        if (
typeof value === 'string') {
            
value value === 'bottom' this.$tableBody[0].scrollHeight 0;
        }
        if (
typeof value === 'number') {
            
this.$tableBody.scrollTop(value);
        }
        if (
typeof value === 'undefined') {
            return 
this.$tableBody.scrollTop();
        }
    };

    
BootstrapTable.prototype.getScrollPosition = function () {
        return 
this.scrollTo();
    };

    
BootstrapTable.prototype.selectPage = function (page) {
        if (
page && page <= this.options.totalPages) {
            
this.options.pageNumber page;
            
this.updatePagination();
        }
    };

    
BootstrapTable.prototype.prevPage = function () {
        if (
this.options.pageNumber 1) {
            
this.options.pageNumber--;
            
this.updatePagination();
        }
    };

    
BootstrapTable.prototype.nextPage = function () {
        if (
this.options.pageNumber this.options.totalPages) {
            
this.options.pageNumber++;
            
this.updatePagination();
        }
    };

    
BootstrapTable.prototype.toggleView = function () {
        
this.options.cardView = !this.options.cardView;
        
this.initHeader();
        
// Fixed remove toolbar when click cardView button.
        //that.initToolbar();
        
this.initBody();
        
this.trigger('toggle'this.options.cardView);
    };

    
BootstrapTable.prototype.refreshOptions = function (options) {
        
//If the objects are equivalent then avoid the call of destroy / init methods
        
if (compareObjects(this.optionsoptionsfalse)) {
            return;
        }
        
this.options = $.extend(this.optionsoptions);
        
this.trigger('refresh-options'this.options);
        
this.destroy();
        
this.init();
    };

    
BootstrapTable.prototype.resetSearch = function (text) {
        var 
$search this.$toolbar.find('.search input');
        
$search.val(text || '');
        
this.onSearch({currentTarget$search});
    };

    
// BOOTSTRAP TABLE PLUGIN DEFINITION
    // =======================

    
var allowedMethods = [
        
'getOptions',
        
'getSelections''getAllSelections''getData',
        
'load''append''prepend''remove''removeAll',
        
'insertRow''updateRow''updateCell''removeByUniqueId',
        
'getRowByUniqueId''showRow''hideRow''getRowsHidden',
        
'mergeCells',
        
'checkAll''uncheckAll',
        
'check''uncheck',
        
'checkBy''uncheckBy',
        
'refresh',
        
'resetView',
        
'resetWidth',
        
'destroy',
        
'showLoading''hideLoading',
        
'showColumn''hideColumn''getHiddenColumns',
        
'filterBy',
        
'scrollTo',
        
'getScrollPosition',
        
'selectPage''prevPage''nextPage',
        
'togglePagination',
        
'toggleView',
        
'refreshOptions',
        
'resetSearch'
    
];

    $.
fn.bootstrapTable = function (option) {
        var 
value,
            
args = Array.prototype.slice.call(arguments1);

        
this.each(function () {
            var 
$this = $(this),
                
data $this.data('bootstrap.table'),
                
options = $.extend({}, BootstrapTable.DEFAULTS$this.data(),
                    
typeof option === 'object' && option);

            if (
typeof option === 'string') {
                if ($.
inArray(optionallowedMethods) < 0) {
                    throw new 
Error("Unknown method: " option);
                }

                if (!
data) {
                    return;
                }

                
value data[option].apply(dataargs);

                if (
option === 'destroy') {
                    
$this.removeData('bootstrap.table');
                }
            }

            if (!
data) {
                
$this.data('bootstrap.table', (data = new BootstrapTable(thisoptions)));
            }
        });

        return 
typeof value === 'undefined' this value;
    };

    $.
fn.bootstrapTable.Constructor BootstrapTable;
    $.
fn.bootstrapTable.defaults BootstrapTable.DEFAULTS;
    $.
fn.bootstrapTable.columnDefaults BootstrapTable.COLUMN_DEFAULTS;
    $.
fn.bootstrapTable.locales BootstrapTable.LOCALES;
    $.
fn.bootstrapTable.methods allowedMethods;

    
// BOOTSTRAP TABLE INIT
    // =======================

    
$(function () {
        $(
'[data-toggle="table"]').bootstrapTable();
    });

}(
jQuery);
?>
Онлайн: 0
Реклама