/*!***************************************************
 * datatables.mark.js v3.0.0
 * https://github.com/julmot/datatables.mark.js
 * Copyright (c) 2016–2020, Julian Kühnel, SpryMedia Ltd
 * Released under the MIT license https://git.io/voRZ7
 *****************************************************/

(function( factory ){
	if ( typeof define === 'function' && define.amd ) {
		// AMD
		define( ['jquery', 'datatables.net'], function ( $ ) {
			return factory( $, window, document );
		} );
	}
	else if ( typeof exports === 'object' ) {
		// CommonJS
		var jq = require('jquery');
		var cjsRequires = function (root, $) {
			if ( ! $.fn.dataTable ) {
				require('datatables.net')(root, $);
			}
		};

		if (typeof window === 'undefined') {
			module.exports = function (root, $) {
				if ( ! root ) {
					// CommonJS environments without a window global must pass a
					// root. This will give an error otherwise
					root = window;
				}

				if ( ! $ ) {
					$ = jq( root );
				}

				cjsRequires( root, $ );
				return factory( $, root, root.document );
			};
		}
		else {
			cjsRequires( window, jq );
			module.exports = factory( jq, window, window.document );
		}
	}
	else {
		// Browser
		factory( jQuery, window, document );
	}
}(function( $, window, document, undefined ) {
'use strict';
var DataTable = $.fn.dataTable;


class MarkDataTables {
    instance;
    options;
    intervalThreshold;
    intervalMs;
    constructor(dtInstance, options) {
        if (!$.fn.mark || !$.fn.unmark) {
            throw new Error('jquery.mark.js is necessary for datatables.mark.js');
        }
        this.instance = dtInstance;
        this.options = typeof options === 'object' ? options : {};
        this.intervalThreshold = 49;
        this.intervalMs = 300;
        this.initMarkListener();
    }
    initMarkListener() {
        let ev = 'draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth';
        ev += ' responsive-display.dt.dth';
        let intvl = null;
        this.instance.on(ev, () => {
            const rows = this.instance
                .rows({
                filter: 'applied',
                page: 'current',
            })
                .nodes().length;
            if (rows > this.intervalThreshold) {
                clearTimeout(intvl);
                intvl = setTimeout(() => {
                    this.mark();
                }, this.intervalMs);
            }
            else {
                this.mark();
            }
        });
        this.instance.on('destroy', () => {
            this.instance.off(ev);
        });
        this.mark();
    }
    mark() {
        const globalSearch = this.instance.search();
        const $tableBody = $(this.instance.table().body());
        $tableBody.unmark(this.options);
        if (this.instance.table().rows({ search: 'applied' }).data().length) {
            $tableBody.mark(globalSearch, this.options);
        }
        this.instance
            .columns({
            search: 'applied',
            page: 'current',
        })
            .nodes()
            .each((nodes, colIndex) => {
            const columnSearch = this.instance.column(colIndex).search(), searchVal = columnSearch || globalSearch;
            if (searchVal) {
                nodes.forEach(node => {
                    $(node).unmark(this.options).mark(searchVal, this.options);
                });
            }
        });
    }
}
$(document).on('init.dt.dth', (event, settings) => {
    if (event.namespace !== 'dt') {
        return;
    }
    const dtInstance = new DataTable.Api(settings);
    let options = false;
    if (dtInstance.init().mark) {
        options = dtInstance.init().mark;
    }
    else if (DataTable.defaults.mark) {
        options = DataTable.defaults.mark;
    }
    if (!options) {
        return;
    }
    new MarkDataTables(dtInstance, options);
});


return DataTable;
}));
