text: /**
   * @author: Dennis Hernández
   * @webSite: http://djhvscf.github.io/Blog
   * @version: v1.2.0
   *
   * @update zhixin wen <wenzhixin2010@gmail.com>
   */
  
  (function ($) {
      'use strict';
  
      var cookieIds = {
          sortOrder: 'bs.table.sortOrder',
          sortName: 'bs.table.sortName',
          pageNumber: 'bs.table.pageNumber',
          pageList: 'bs.table.pageList',
          columns: 'bs.table.columns',
          searchText: 'bs.table.searchText',
          filterControl: 'bs.table.filterControl'
      };
  
      var getCurrentHeader = function (that) {
          var header = that.$header;
          if (that.options.height) {
              header = that.$tableHeader;
          }
  
          return header;
      };
  
      var getCurrentSearchControls = function (that) {
          var searchControls = 'select, input';
          if (that.options.height) {
              searchControls = 'table select, table input';
          }
  
          return searchControls;
      };
  
      var cookieEnabled = function () {
          return !!(navigator.cookieEnabled);
      };
  
      var inArrayCookiesEnabled = function (cookieName, cookiesEnabled) {
          var index = -1;
  
          for (var i = 0; i < cookiesEnabled.length; i++) {
              if (cookieName.toLowerCase() === cookiesEnabled[i].toLowerCase()) {
                  index = i;
                  break;
              }
          }
  
          return index;
      };
  
      var setCookie = function (that, cookieName, cookieValue) {
          if ((!that.options.cookie) || (!cookieEnabled()) || (that.options.cookieIdTable === '')) {
              return;
          }
  
          if (inArrayCookiesEnabled(cookieName, that.options.cookiesEnabled) === -1) {
              return;
          }
  
          cookieName = that.options.cookieIdTable + '.' + cookieName;
          if (!cookieName || /^(?:expires|max\-age|path|domain|secure)$/i.test(cookieName)) {
              return false;
          }
  
          document.cookie = encodeURIComponent(cookieName) + '=' + encodeURIComponent(cookieValue) + calculateExpiration(that.options.cookieExpire) + (that.options.cookieDomain ? '; domain=' + that.options.cookieDomain : '') + (that.options.cookiePath ? '; path=' + that.options.cookiePath : '') + (that.cookieSecure ? '; secure' : '');
          return true;
      };
  
      var getCookie = function (that, tableName, cookieName) {
          if (!cookieName) {
              return null;
          }
  
          if (inArrayCookiesEnabled(cookieName, that.options.cookiesEnabled) === -1) {
              return null;
          }
  
          cookieName = tableName + '.' + cookieName;
  
          return decodeURIComponent(document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + encodeURIComponent(cookieName).replace(/[\-\.\+\*]/g, '\\$&') + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1')) || null;
      };
  
      var hasCookie = function (cookieName) {
          if (!cookieName) {
              return false;
          }
          return (new RegExp('(?:^|;\\s*)' + encodeURIComponent(cookieName).replace(/[\-\.\+\*]/g, '\\$&') + '\\s*\\=')).test(document.cookie);
      };
  
      var deleteCookie = function (tableName, cookieName, sPath, sDomain) {
          cookieName = tableName + '.' + cookieName;
          if (!hasCookie(cookieName)) {
              return false;
          }
          document.cookie = encodeURIComponent(cookieName) + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT' + (sDomain ? '; domain=' + sDomain : '') + (sPath ? '; path=' + sPath : '');
          return true;
      };
  
      var calculateExpiration = function(cookieExpire) {
          var time = cookieExpire.replace(/[0-9]*/, ''); //s,mi,h,d,m,y
          cookieExpire = cookieExpire.replace(/[A-Za-z]/, ''); //number
  
          switch (time.toLowerCase()) {
              case 's':
                  cookieExpire = +cookieExpire;
                  break;
              case 'mi':
                  cookieExpire = cookieExpire * 60;
                  break;
              case 'h':
                  cookieExpire = cookieExpire * 60 * 60;
                  break;
              case 'd':
                  cookieExpire = cookieExpire * 24 * 60 * 60;
                  break;
              case 'm':
                  cookieExpire = cookieExpire * 30 * 24 * 60 * 60;
                  break;
              case 'y':
                  cookieExpire = cookieExpire * 365 * 24 * 60 * 60;
                  break;
              default:
                  cookieExpire = undefined;
                  break;
          }
  
          return cookieExpire === undefined ? '' : '; max-age=' + cookieExpire;
      };
  
      $.extend($.fn.bootstrapTable.defaults, {
          cookie: false,
          cookieExpire: '2h',
          cookiePath: null,
          cookieDomain: null,
          cookieSecure: null,
          cookieIdTable: '',
          cookiesEnabled: ['bs.table.sortOrder', 'bs.table.sortName', 'bs.table.pageNumber', 'bs.table.pageList', 'bs.table.columns', 'bs.table.searchText', 'bs.table.filterControl'],
          //internal variable
          filterControls: [],
          filterControlValuesLoaded: false
      });
  
      $.fn.bootstrapTable.methods.push('deleteCookie');
  
      var BootstrapTable = $.fn.bootstrapTable.Constructor,
          _init = BootstrapTable.prototype.init,
          _initTable = BootstrapTable.prototype.initTable,
          _onSort = BootstrapTable.prototype.onSort,
          _onPageNumber = BootstrapTable.prototype.onPageNumber,
          _onPageListChange = BootstrapTable.prototype.onPageListChange,
          _onPageFirst = BootstrapTable.prototype.onPageFirst,
          _onPagePre = BootstrapTable.prototype.onPagePre,
          _onPageNext = BootstrapTable.prototype.onPageNext,
          _onPageLast = BootstrapTable.prototype.onPageLast,
          _toggleColumn = BootstrapTable.prototype.toggleColumn,
          _selectPage = BootstrapTable.prototype.selectPage,
          _onSearch = BootstrapTable.prototype.onSearch;
  
      BootstrapTable.prototype.init = function () {
          var timeoutId = 0;
          this.options.filterControls = [];
          this.options.filterControlValuesLoaded = false;
  
  
          this.options.cookiesEnabled = typeof this.options.cookiesEnabled === 'string' ?
              this.options.cookiesEnabled.replace('[', '').replace(']', '').replace(/ /g, '').toLowerCase().split(',') : this.options.cookiesEnabled;
  
          if (this.options.filterControl) {
              var that = this;
              this.$el.on('column-search.bs.table', function (e, field, text) {
                  var isNewField = true;
  
                  for (var i = 0; i < that.options.filterControls.length; i++) {
                      if (that.options.filterControls[i].field === field) {
                          that.options.filterControls[i].text = text;
                          isNewField = false;
                          break;
                      }
                  }
                  if (isNewField) {
                      that.options.filterControls.push({
                          field: field,
                          text: text
                      });
                  }
  
                  setCookie(that, cookieIds.filterControl, JSON.stringify(that.options.filterControls));
              }).on('post-body.bs.table', function () {
                  setTimeout(function () {
                      if (!that.options.filterControlValuesLoaded) {
                          that.options.filterControlValuesLoaded = true;
                          var filterControl = JSON.parse(getCookie(that, that.options.cookieIdTable, cookieIds.filterControl));
                          if (filterControl) {
                              var field = null,
                                  result = [],
                                  header = getCurrentHeader(that),
                                  searchControls = getCurrentSearchControls(that);
  
                              header.find(searchControls).each(function (index, ele) {
                                  field = $(this).closest('[data-field]').data('field');
                                  result = $.grep(filterControl, function (valueObj) {
                                      return valueObj.field === field;
                                  });
  
                                  if (result.length > 0) {
                                      $(this).val(result[0].text);
                                      that.onColumnSearch({currentTarget: $(this)});
                                  }
                              });
                          }
                      }
                  }, 250);
              });
          }
          _init.apply(this, Array.prototype.slice.apply(arguments));
      };
  
      BootstrapTable.prototype.initTable = function () {
          _initTable.apply(this, Array.prototype.slice.apply(arguments));
          this.initCookie();
      };
  
      BootstrapTable.prototype.initCookie = function () {
          if (!this.options.cookie) {
              return;
          }
  
          if ((this.options.cookieIdTable === '') || (this.options.cookieExpire === '') || (!cookieEnabled())) {
              throw new Error("Configuration error. Please review the cookieIdTable, cookieExpire properties, if those properties are ok, then this browser does not support the cookies");
              return;
          }
  
          var sortOrderCookie = getCookie(this, this.options.cookieIdTable, cookieIds.sortOrder),
              sortOrderNameCookie = getCookie(this, this.options.cookieIdTable, cookieIds.sortName),
              pageNumberCookie = getCookie(this, this.options.cookieIdTable, cookieIds.pageNumber),
              pageListCookie = getCookie(this, this.options.cookieIdTable, cookieIds.pageList),
              columnsCookie = JSON.parse(getCookie(this, this.options.cookieIdTable, cookieIds.columns)),
              searchTextCookie = getCookie(this, this.options.cookieIdTable, cookieIds.searchText);
  
          //sortOrder
          this.options.sortOrder = sortOrderCookie ? sortOrderCookie : this.options.sortOrder;
          //sortName
          this.options.sortName = sortOrderNameCookie ? sortOrderNameCookie : this.options.sortName;
          //pageNumber
          this.options.pageNumber = pageNumberCookie ? +pageNumberCookie : this.options.pageNumber;
          //pageSize
          this.options.pageSize = pageListCookie ? pageListCookie === this.options.formatAllRows() ? pageListCookie : +pageListCookie : this.options.pageSize;
          //searchText
          this.options.searchText = searchTextCookie ? searchTextCookie : '';
  
          if (columnsCookie) {
              $.each(this.columns, function (i, column) {
                  column.visible = $.inArray(column.field, columnsCookie) !== -1;
              });
          }
      };
  
      BootstrapTable.prototype.onSort = function () {
          _onSort.apply(this, Array.prototype.slice.apply(arguments));
          setCookie(this, cookieIds.sortOrder, this.options.sortOrder);
          setCookie(this, cookieIds.sortName, this.options.sortName);
      };
  
      BootstrapTable.prototype.onPageNumber = function () {
          _onPageNumber.apply(this, Array.prototype.slice.apply(arguments));
          setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
      };
  
      BootstrapTable.prototype.onPageListChange = function () {
          _onPageListChange.apply(this, Array.prototype.slice.apply(arguments));
          setCookie(this, cookieIds.pageList, this.options.pageSize);
      };
  
      BootstrapTable.prototype.onPageFirst = function () {
          _onPageFirst.apply(this, Array.prototype.slice.apply(arguments));
          setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
      };
  
      BootstrapTable.prototype.onPagePre = function () {
          _onPagePre.apply(this, Array.prototype.slice.apply(arguments));
          setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
      };
  
      BootstrapTable.prototype.onPageNext = function () {
          _onPageNext.apply(this, Array.prototype.slice.apply(arguments));
          setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
      };
  
      BootstrapTable.prototype.onPageLast = function () {
          _onPageLast.apply(this, Array.prototype.slice.apply(arguments));
          setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
      };
  
      BootstrapTable.prototype.toggleColumn = function () {
          _toggleColumn.apply(this, Array.prototype.slice.apply(arguments));
  
          var visibleColumns = [];
  
          $.each(this.columns, function (i, column) {
              if (column.visible) {
                  visibleColumns.push(column.field);
              }
          });
  
          setCookie(this, cookieIds.columns, JSON.stringify(visibleColumns));
      };
      
      BootstrapTable.prototype.selectPage = function (page) {
          _selectPage.apply(this, Array.prototype.slice.apply(arguments));
          setCookie(this, cookieIds.pageNumber, page);
      };
  
      BootstrapTable.prototype.onSearch = function () {
          var target = Array.prototype.slice.apply(arguments);
          _onSearch.apply(this, target);
  
          if ($(target[0].currentTarget).parent().hasClass('search')) {
            setCookie(this, cookieIds.searchText, this.searchText);
          }
      };
  
      BootstrapTable.prototype.deleteCookie = function (cookieName) {
          if ((cookieName === '') || (!cookieEnabled())) {
              return;
          }
  
          deleteCookie(this.options.cookieIdTable, cookieIds[cookieName], this.options.cookiePath, this.options.cookieDomain);
      };
  })(jQuery);
  