/*!***************************************************
 * datatables.mark.js v2.0.1
 * https://github.com/julmot/datatables.mark.js
 * Copyright (c) 2016–2017, Julian Motz
 * Released under the MIT license https://git.io/voRZ7
 *****************************************************/

'use strict';

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

(function (factory, window, document) {
  if ((typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object') {
    var jquery = require('jquery');
    require('datatables.net');
    require('mark.js/dist/jquery.mark.js');
    module.exports = factory(window, document, jquery);
  } else if (typeof define === 'function' && define.amd) {
    define(['jquery', 'datatables.net', 'markjs'], function (jQuery) {
      return factory(window, document, jQuery);
    });
  } else {
    factory(window, document, jQuery);
  }
})(function (window, document, $) {
  var MarkDataTables = function () {
    function MarkDataTables(dtInstance, options) {
      _classCallCheck(this, MarkDataTables);

      if (!$.fn.mark || !$.fn.unmark) {
        throw new Error('jquery.mark.js is necessary for datatables.mark.js');
      }
      this.instance = dtInstance;
      this.options = (typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object' ? options : {};
      this.intervalThreshold = 49;
      this.intervalMs = 300;
      this.initMarkListener();
    }

    _createClass(MarkDataTables, [{
      key: 'initMarkListener',
      value: function initMarkListener() {
        var _this = this;

        var ev = 'draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth';
        var intvl = null;
        this.instance.on(ev, function () {
          var rows = _this.instance.rows({
            filter: 'applied',
            page: 'current'
          }).nodes().length;
          if (rows > _this.intervalThreshold) {
            clearTimeout(intvl);
            intvl = setTimeout(function () {
              _this.mark();
            }, _this.intervalMs);
          } else {
            _this.mark();
          }
        });
        this.instance.on('destroy', function () {
          _this.instance.off(ev);
        });
        this.mark();
      }
    }, {
      key: 'mark',
      value: function mark() {
        var _this2 = this;

        var globalSearch = this.instance.search();
        $(this.instance.table().body()).unmark(this.options);
        this.instance.columns({
          search: 'applied',
          page: 'current'
        }).nodes().each(function (nodes, colIndex) {
          var columnSearch = _this2.instance.column(colIndex).search(),
              searchVal = columnSearch || globalSearch;
          if (searchVal) {
            nodes.forEach(function (node) {
              $(node).mark(searchVal, _this2.options);
            });
          }
        });
      }
    }]);

    return MarkDataTables;
  }();

  $(document).on('init.dt.dth', function (event, settings) {
    if (event.namespace !== 'dt') {
      return;
    }

    var dtInstance = $.fn.dataTable.Api(settings);

    var options = null;
    if (dtInstance.init().mark) {
      options = dtInstance.init().mark;
    } else if ($.fn.dataTable.defaults.mark) {
      options = $.fn.dataTable.defaults.mark;
    }
    if (options === null) {
      return;
    }

    new MarkDataTables(dtInstance, options);
  });
}, window, document);
