PageSourceSearch

https://riffathassan.info/wp-content/plugins/data-tables-generator…/Core/assets/js/core.js?ver=1.10.30

js riffathassan.info collected 2026-10-03 17:38:18 UTC 114,501 bytes, 2,437 lines download raw bytes

1if (typeof(SDT_DATA) == 'undefined') {
2    var SDT_DATA = {};
3}
4var g_stbServerSideProcessing = false;
5var g_stbServerSideProcessingIsActive = false;
6
7(function(vendor, $, window) {
8
9    var appName = 'Tables';
10    var dataTableInstances = [];
11    var ruleJSInstances = [];
12    var extraConfig = {};
13
14    if (!(appName in vendor)) {
15        vendor[appName] = {};
16
17        vendor[appName].getAppName = (function() {
18            return appName;
19        });
20
21        vendor[appName].setExtraConfig = (function(param, value) {
22            extraConfig[param] = value;
23        });
24
25        vendor[appName].getParameterByName = (function(name) {
26            name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
27
28            var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
29                results = regex.exec(location.search);
30
31            return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
32        });
33
34        vendor[appName].replaceParameterByName = (function(url, paramName, paramValue) {
35            var pattern = new RegExp('\\b(' + paramName + '=).*?(&|$)');
36            if (url.search(pattern) >= 0) {
37                return url.replace(pattern, '$1' + paramValue + '$2');
38            }
39            return url + (url.indexOf('?') > 0 ? '&' : '?') + paramName + '=' + paramValue;
40        });
41
42        vendor[appName].getAllTableInstances = (function() {
43            return dataTableInstances;
44        });
45
46        vendor[appName].removeAllTableInstances = (function() {
47            dataTableInstances = [];
48        });
49
50        vendor[appName].setTableInstance = (function(instance) {
51            dataTableInstances.push(instance);
52        });
53
54        vendor[appName].getTableInstanceById = (function(id) {
55            var allTables = this.getAllTableInstances();
56
57            for (var i = 0; i < allTables.length; i++) {
58                if (allTables[i].table_id == id) {
59                    return allTables[i];
60                }
61            }
62            return false;
63        });
64
65        vendor[appName].getTableInstanceByViewId = (function(viewId) {
66            var allTables = this.getAllTableInstances();
67
68            for (var i = 0; i < allTables.length; i++) {
69                if (allTables[i].table_view_id == viewId) {
70                    return allTables[i];
71                }
72            }
73            return false;
74        });
75
76        vendor[appName].removeTableInstanceByViewId = (function(viewId) {
77            var allTables = this.getAllTableInstances();
78
79            for (var i = 0; i < allTables.length; i++) {
80                if (allTables[i].table_view_id == viewId) {
81                    allTables.splice(i, 1);
82                    return true;
83                }
84            }
85            return false;
86        });
87
88        vendor[appName].getAllRuleJSInstances = (function() {
89            return ruleJSInstances;
90        });
91
92        vendor[appName].setRuleJSInstance = (function(table) {
93            var rootElem = table.closest('.supsystic-tables-wrap'),
94                viewId = table.data('view-id');
95
96            ruleJSInstances[viewId] = new ruleJS(rootElem.attr('id'));
97            ruleJSInstances[viewId].instanceTable = table;
98            return ruleJSInstances[viewId];
99        });
100
101        vendor[appName].getRuleJSInstance = (function(table) {
102            var allRuleJS = this.getAllRuleJSInstances(),
103                viewId = table.data('view-id');
104
105            if (!allRuleJS[viewId]) {
106                this.setRuleJSInstance(table);
107            }
108            return allRuleJS[viewId];
109        });
110
111        vendor[appName].request = (function(route, data) {
112            if (!jQuery.isPlainObject(route) || !('module' in route) || !('action' in route)) {
113                throw new Error('Request route is not specified.');
114            }
115            if (!jQuery.isPlainObject(data)) {
116                data = {};
117            }
118            if ('action' in data) {
119                throw new Error('Reserved field "action" used.');
120            }
121            data.action = 'supsystic-tables';
122
123            var url = window.ajaxurl ? window.ajaxurl : ajax_obj.ajaxurl,
124                deferred = jQuery.Deferred();
125
126            jQuery.post(url, jQuery.extend({}, {
127                    route: route
128                }, data))
129                .done(function(response, textStatus, jqXHR) {
130                    if (response.success) {
131                        deferred.resolve(response, textStatus, jqXHR);
132                    } else {
133                        if (data._maxIter) {
134                            retryAjax(deferred, url, route, data, 1, data._maxIter);
135                        } else {
136                            var message = typeof response.message !== 'undefined' ? response.message : 'There are errors during the request.';
137
138                            deferred.reject(message, textStatus, jqXHR);
139                        }
140                    }
141                }).fail(function(jqXHR, textStatus, errorThrown) {
142                    if (data._maxIter) {
143                        retryAjax(deferred, url, route, data, 1, data._maxIter);
144                    } else {
145                        deferred.reject(errorThrown, textStatus, jqXHR);
146                    }
147                });
148
149            function retryAjax(def, url, route, data, curIter, maxIter) {
150                jQuery.post(url, jQuery.extend({}, {
151                        route: route
152                    }, data))
153                    .done(function(response, textStatus, jqXHR) {
154                        if (response.success) {
155                            def.resolve(response, textStatus, jqXHR);
156                        } else {
157                            var message = typeof response.message !== 'undefined' ? response.message : 'There are errors during the request.';
158
159                            retryErrorHandler(def, url, route, data, curIter, maxIter, message, textStatus, jqXHR);
160                        }
161                    }).fail(function(jqXHR, textStatus, errorThrown) {
162                        retryErrorHandler(def, url, route, data, curIter, maxIter, errorThrown, textStatus, jqXHR);
163                    });
164            }
165
166            function retryErrorHandler(def, url, route, data, curIter, maxIter, errorThrown, textStatus, jqXHR) {
167                curIter++;
168                if (curIter < maxIter) {
169                    retryAjax(def, url, route, data, curIter, maxIter);
170                } else {
171                    def.reject(errorThrown, textStatus, jqXHR);
172                }
173            }
174
175            return deferred.promise();
176        });
177
178        vendor[appName].setTableMobileWidth = (function(isMobile) {
179            jQuery('div .supsystic-tables-wrap').each(function() {
180                isMobile = (typeof(isMobile) == 'undefined' ? true : isMobile);
181                var ssDiv = jQuery(this),
182                    widthAttr = ssDiv.data('table-width-' + (isMobile ? 'mobile' : 'fixed'));
183                if (typeof(widthAttr) != 'undefined') {
184                    ssDiv.css('display', (widthAttr == 'auto' ? 'inline-block' : '')).css('width', widthAttr);
185                }
186            });
187        });
188
189        vendor[appName].initTablesOnPage = (function(id) {
190            this._initTablesOnPage(id);
191        });
192
193        vendor[appName]._initTablesOnPage = (function(id) {
194            var tables = jQuery(typeof id != 'undefined' ? '#supsystic-table-' + id + ':not(.dataTable)' : '.supsystic-table');
195            if (tables.length == 0) return;
196            if (typeof this._initTablesOnPageWoo === 'function') this._initTablesOnPageWoo(id);
197
198            var self = this,
199                firstTableId = '',
200                firstTableViewId = '',
201                firstTable = '',
202                firstTableWrapper = '',
203                firstTableFirstRow = '';
204
205            if (jQuery(window).width() <= 991) {
206                self.setTableMobileWidth();
207            }
208
209            tables.each(function() {
210                self.initializeTable(this, self.showTable, function(table) {
211                    // This is used when table is hidden in tabs and can't calculate itself width to adjust on small screens
212                    if (table.is(':visible')) {
213                        // Fix bug in FF and IE which not supporting max-width 100% for images in td
214                        self._calculateImages(table);
215                    } else {
216                        table.data('isVisible', setInterval(function() {
217                            if (table.is(':visible')) {
218                                clearInterval(table.data('isVisible'));
219                                self._calculateImages(table);
220                            }
221                        }, 250));
222                    }
223                    // Align all tables on page by the columns width depending on the columns width of first table on page
224                    if (table.data('align-by-first-table')) {
225                        firstTableId = firstTableId || jQuery('.supsystic-table:first').data('id');
226                        firstTable = firstTable || jQuery('#supsystic-table-' + firstTableId);
227                        firstTableViewId = firstTable.data('view-id');
228                        firstTableWrapper = firstTableWrapper || firstTable.parents('#supsystic-table-' + firstTableViewId);
229                        firstTableFirstRow = firstTable.data('head') ? firstTable.find('thead tr:first-child th') : firstTable.find('tbody tr:first-child td');
230
231                        if (firstTableViewId != table.data('view-id')) {
232                            var currentTableWrapper = table.parents('#supsystic-table-' + table.data('view-id'));
233
234                            currentTableWrapper.css({
235                                width: firstTableWrapper.get(0).style.width
236                            });
237                            table.css({
238                                width: firstTable.get(0).style.width
239                            });
240                            currentTableWrapper.find('.supsystic-table').each(function() {
241                                var curTable = jQuery(this),
242                                    curTableFirstRow = curTable.data('head') ? curTable.find('thead tr:first-child th') : curTable.find('tbody tr:first-child td');
243
244                                jQuery.each(curTableFirstRow, function(index, element) {
245                                    if (firstTableFirstRow[index]) {
246                                        jQuery(this).width(jQuery(firstTableFirstRow[index]).get(0).style.width);
247                                    }
248                                });
249                            });
250                        }
251                    }
252                    //if row has merged cells no need place header there
253                    if (table.data('merged') && table.hasClass('ColWithMergeCellsAlign')) {
254                        var mergedData = table.data('merged');
255                        jQuery.each(mergedData, function(index, value) {
256                            var rowNumWithMergeCell = value.row;
257                            var numForEq = Number(rowNumWithMergeCell) - 1;
258                            table.find('tbody tr:eq(' + numForEq + ')').closest('tr').addClass('haveMergedCell');
259                        });
260                        self.setCellAttributes(table.parents('.supsystic-tables-wrap:first').find('.DTFC_LeftWrapper, DTFC_RightWrapper, .dataTables_scrollHead, .dataTables_scrollFoot').find('th, td'));
261                    }
262                    if (typeof self.getTableInstanceById(table.data('id')).fnAdjustColumnSizing == 'function') {
263                        table.trigger('responsive-resize.dt');
264                        setTimeout(function() {
265                            table.trigger('responsive-resize.dt');
266                            self.getTableInstanceById(table.data('id')).fnAdjustColumnSizing(false);
267                        }, 500);
268                    }
269                    self.initShortcodesInTable(table);
270                });
271                //self.initShortcodesInTable(jQuery(this));
272            });
273        });
274
275        vendor[appName].initShortcodesInTable = (function(table) {
276            var tableViewId = table.data('view-id');
277            //google-maps-easy
278            if (typeof(gmpAllMapsInfo) !== 'undefined' && gmpAllMapsInfo && gmpAllMapsInfo.length) {
279                for (var i = 0; i < gmpAllMapsInfo.length; i++) {
280                    var mapData = gmpAllMapsInfo[i],
281                        map = jQuery('#' + mapData.view_html_id);
282                    if (map.length && map.closest('#supsystic-table-' + tableViewId).length) {
283                        var mapViewId = mapData.view_id;
284                        setTimeout(function(mapData, mapViewId) {
285                            g_gmpAllMaps = jQuery.grep(g_gmpAllMaps, function(value) {
286                                if (value.getViewId() == mapViewId) {
287                                    if (mapData.heatmap && mapData.heatmap.coords) {
288                                        var coord = [],
289                                            oldCoord = mapData.heatmap.coords;
290                                        for (var c = 0; c < oldCoord.length; c++) {
291                                            var data = oldCoord[c];
292                                            coord.push(typeof data == 'object' ? data.join(',') : data);
293                                        }
294                                        mapData.heatmap.coords = coord;
295                                    }
296                                    if (value._mapParams.simple_slider_id) {
297                                        jQuery('#' + value._mapParams.simple_slider_id).html(value._mapParams.original_slider_html);
298                                    }
299                                }
300                                return value.getViewId() != mapViewId;
301                            });
302                            gmpInitMapOnPage(mapData);
303                        }, 50, mapData, mapViewId);
304                    }
305                }
306                jQuery(document).trigger('gmpAmiVarInited');
307            }
308            //ultimate-maps
309            if (typeof(umsAllMapsInfo) !== 'undefined' && umsAllMapsInfo && umsAllMapsInfo.length) {
310                for (var i = 0; i < umsAllMapsInfo.length; i++) {
311                    var mapData = umsAllMapsInfo[i],
312                        map = jQuery('#' + mapData.view_html_id);
313                    if (map.length && map.closest('#supsystic-table-' + tableViewId).length) {
314                        var mapViewId = mapData.view_id;
315                        setTimeout(function(mapData, mapViewId) {
316                            g_umsAllMaps = jQuery.grep(g_umsAllMaps, function(value) {
317                                if (value.getViewId() == mapViewId) {
318                                    value._mapObj.remove();
319                                }
320                                return value.getViewId() != mapViewId;
321                            });
322                            umsInitMapOnPage(mapData);
323                        }, 600, mapData, mapViewId);
324                    }
325                }
326                jQuery(document).trigger('umsAmiVarInited');
327            }
328        });
329
330        vendor[appName]._getOriginalImageSizes = (function(img) {
331            var tempImage = new Image(),
332                width,
333                height;
334            if ('naturalWidth' in tempImage && 'naturalHeight' in tempImage) {
335                width = img.naturalWidth;
336                height = img.naturalHeight;
337            } else {
338                tempImage.src = img.src;
339                width = tempImage.width;
340                height = tempImage.height;
341            }
342            return {
343                width: width,
344                height: height
345            };
346        });
347
348        vendor[appName]._calculateImages = (function($table) {
349            var self = this,
350                $images = $table.find('img');
351            if ($images.length > 0 && /firefox|trident|msie/i.test(navigator.userAgent)) {
352                $images.hide();
353                jQuery.each($images, function(index, el) {
354                    var $img = jQuery(this),
355                        originalSizes = self._getOriginalImageSizes(this);
356                    if ($img.closest('td, th').width() < originalSizes.width) {
357                        $img.css('width', '100%');
358                    }
359                });
360                $images.show();
361
362            }
363        });
364
365        vendor[appName].createSpinner = (function(elem) {
366            elem = typeof(elem) != 'undefined' ? elem : false;
367
368            if (elem) {
369                var icon = elem.attr('disabled', true).find('.fa');
370
371                if (icon) {
372                    icon.data('icon', icon.attr('class'));
373                    icon.attr('class', 'fa fa-spinner fa-spin');
374                }
375            } else {
376                return jQuery('<i/>', {
377                    class: 'fa fa-spinner fa-spin'
378                });
379            }
380        });
381
382        vendor[appName].deleteSpinner = (function(elem) {
383            var icon = elem.attr('disabled', false).find('.fa');
384
385            if (icon) {
386                icon.attr('class', icon.data('icon'));
387                icon.data('icon', '');
388            }
389        });
390
391        vendor[appName].initializeTable = (function(table, callback, finalCallback, reinit, addInstance) {
392
393            if (typeof jQuery.fn.dataTable.moment == "undefined" && typeof moment !== "undefined") {
394                jQuery.fn.dataTable.moment = function ( format, locale, reverseEmpties ) {
395                    var types = jQuery.fn.dataTable.ext.type;
396                    // Add type detection
397                    types.detect.unshift( function ( d ) {
398                        if ( d ) {
399                            // Strip HTML tags and newline characters if possible
400                            if ( d.replace ) {
401                                d = d.replace(/(<.*?>)|(\r?\n|\r)/g, '');
402                            }
403                
404                            // Strip out surrounding white space
405                            d = jQuery.trim( d );
406                        }
407                        // Null and empty values are acceptable
408                        if ( d === '' || d === null ) {
409                            return 'moment-'+format;
410                        }
411                        return moment( d, format, locale, true ).isValid() ?
412                            'moment-'+format :
413                            null;
414                    } );
415                    // Add sorting method - use an integer for the sorting
416                    types.order[ 'moment-'+format+'-pre' ] = function ( d ) {
417                        if ( d ) {
418                            // Strip HTML tags and newline characters if possible
419                            if ( d.replace ) {
420                                d = d.replace(/(<.*?>)|(\r?\n|\r)/g, '');
421                            }
422                
423                            // Strip out surrounding white space
424                            d = jQuery.trim( d );
425                        }
426                
427                        return !moment(d, format, locale, true).isValid() ?
428                            (reverseEmpties ? -Infinity : Infinity) :
429                            parseInt( moment( d, format, locale, true ).format( 'x' ), 10 );
430                    };
431                };
432            }
433
434            if (typeof jQuery.fn.dataTable.ext.order.intl == "undefined" && typeof window.Intl !== "undefined") {
435                jQuery.fn.dataTable.ext.order.intl = function ( locales, options ) {
436                    if ( window.Intl ) {
437                        var collator = new Intl.Collator( locales, options );
438                        var types = jQuery.fn.dataTable.ext.type;
439                
440                        delete types.order['string-pre'];
441                        types.order['string-asc'] = collator.compare;
442                        types.order['string-desc'] = function ( a, b ) {
443                            return collator.compare( a, b ) * -1;
444                        };
445                    }
446                };
447            }
448
449            if (typeof naturalSort == "undefined") {
450                function naturalSort (a, b, html) {
451                    var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?%?$|^0x[0-9a-f]+$|[0-9]+)/gi,
452                        sre = /(^[ ]*|[ ]*$)/g,
453                        dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
454                        hre = /^0x[0-9a-f]+$/i,
455                        ore = /^0/,
456                        htmre = /(<([^>]+)>)/ig,
457                    // convert all to strings and trim()
458                        x = a.toString().replace(sre, '') || '',
459                        y = b.toString().replace(sre, '') || '';
460                    // remove html from strings if desired
461                    if (!html) {
462                        x = x.replace(htmre, '');
463                        y = y.replace(htmre, '');
464                    }
465                    // chunk/tokenize
466                    var	xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
467                        yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
468                    // numeric, hex or date detection
469                        xD = parseInt(x.match(hre), 10) || (xN.length !== 1 && x.match(dre) && Date.parse(x)),
470                        yD = parseInt(y.match(hre), 10) || xD && y.match(dre) && Date.parse(y) || null;
471            
472                    // first try and sort Hex codes or Dates
473                    if (yD) {
474                        if ( xD < yD ) {
475                            return -1;
476                        }
477                        else if ( xD > yD )	{
478                            return 1;
479                        }
480                    }
481            
482                    // natural sorting through split numeric strings and default strings
483                    for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
484                        // find floats not starting with '0', string or 0 if not defined (Clint Priest)
485            
486                        /*supsystic*/
487                        //var oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc], 10) || xN[cLoc] || 0;
488                        //var oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc], 10) || yN[cLoc] || 0;
489                        var oFxNcL = parseFloat(xN[cLoc], 10) || xN[cLoc] || undefined;
490                        var oFyNcL = parseFloat(yN[cLoc], 10) || yN[cLoc] || undefined;
491                        /*****/
492            
493                        // handle numeric vs string comparison - number < string - (Kyle Adams)
494                        if (isNaN(oFxNcL) !== isNaN(oFyNcL)) {
495                            return (isNaN(oFxNcL)) ? 1 : -1;
496                        }
497                        // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
498                        else if (typeof oFxNcL !== typeof oFyNcL) {
499                            oFxNcL += '';
500                            oFyNcL += '';
501                        }
502                        if (oFxNcL < oFyNcL) {
503                            return -1;
504                        }
505                        if (oFxNcL > oFyNcL) {
506                            return 1;
507                        }
508                    }
509                    return 0;
510                }
511            }
512        
513            if (typeof jQuery.fn.dataTableExt.oApi.fnFakeRowspan == "undefined") {
514                jQuery.fn.dataTableExt.oApi.fnFakeRowspan = function (oSettings) {
515                    if(oSettings) {
516                        var cells;
517                        jQuery.each(oSettings.aoData, function(index, rowData) {
518                            vendor[appName].setCellAttributes(rowData.anCells);
519                        });
520                        if (oSettings.aoHeader.length) {
521                            cells = [];
522                            jQuery.each(oSettings.aoHeader, function(index, rowData) {
523                                jQuery.each(rowData, function(index, cellData) {
524                                    cells.push(cellData.cell);
525                                });
526                            });
527                            vendor[appName].setCellAttributes(cells);
528                        }
529                        if (oSettings.aoFooter.length) {
530                            cells = [];
531                            jQuery.each(oSettings.aoFooter, function(index, rowData) {
532                                jQuery.each(rowData, function(index, cellData) {
533                                    cells.push(cellData.cell);
534                                });
535                            });
536                            vendor[appName].setCellAttributes(cells);
537                        }
538                    }
539                    return this;
540                };
541            }
542
543            if (typeof jQuery.fn.dataTableExt.oApi.fnResetFakeRowspan == "undefined") {
544                jQuery.fn.dataTableExt.oApi.fnResetFakeRowspan = function (oSettings) {
545                    if(oSettings) {
546                        var displayRows = oSettings.aiDisplay,
547                            mergedData = jQuery(oSettings.nTable).data('merged');
548                        if(!mergedData || mergedData.length == 0 || displayRows.length == 0) return this;
549            
550                        var rows = oSettings.aoData,
551                            table = jQuery(oSettings.nTable),
552                            autoHiding = table.attr('data-auto-hiding'),
553                            rowNums = {},
554                            first = table.attr('data-auto-index') == 'new' ? 1 : 0;
555                        autoHiding = (typeof(autoHiding) != 'undefined' && autoHiding.length > 0) ? autoHiding.split(',').map(Number) : [];
556            
557                        jQuery.each(displayRows, function(index, rowNum) {
558                            var cells = rows[rowNum].anCells;
559                            rowNums[cells[first].getAttribute('data-y')] = rowNum;
560                            for(var i = 0; i < cells.length; i++) {
561                                if(cells[i].getAttribute('data-hide') == "true" && (autoHiding.length <= i || autoHiding[i] == 1)) {
562                                    jQuery(cells[i]).css('display', '');
563                                }
564                                cells[i].setAttribute('rowspan', 1);
565                                cells[i].setAttribute('colspan', 1);
566                            }
567                        });
568                        jQuery.each(mergedData, function(index, value) {
569                            var firstRow = Number(value.row) + 1,
570                                lastRow = firstRow + Number(value.rowspan) - 1,
571                                colspan = Number(value.colspan),
572                                firstCol = Number(value.col) + first,
573                                lastCol = firstCol + colspan - 1,
574                                rowspan = 0;
575                            for(var r = firstRow; r <= lastRow; r++) {
576                                if(r in rowNums) {
577                                    if(rowspan == 0) {
578                                        firstRow = r;
579                                    }
580                                    for(var c = firstCol + (firstRow == r ? 1 : 0); c <= lastCol; c++) {
581                                        var cell = rows[rowNums[r]].anCells[c];
582                                        if (typeof cell !== "undefined" && typeof cell.style !== "undefined" && typeof cell.style.display !== "undefined") {
583                                            cell.style.display = 'none';
584                                        }
585                                        if(autoHiding[c] === 0) {
586                                            colspan--;
587                                        }
588                                    }
589                                    rowspan++;
590                                }
591                            }
592                            if(rowspan > 0) {
593                                var mergedCell = rows[rowNums[firstRow]].anCells[firstCol];
594                                if(rowspan > 1) {
595                                    mergedCell.setAttribute('rowspan', rowspan);
596                                }
597                                if(colspan > 1) {
598                                    mergedCell.setAttribute('colspan', colspan);
599                                }
600                            }
601                        });
602                    }
603                    return this;
604                };
605            }
606
607            if (typeof jQuery.fn.dataTableExt.oSort !== "undefined") {
608        
609                jQuery.extend( jQuery.fn.dataTableExt.oSort, {
610                    "natural-asc": function ( a, b ) {
611                        return naturalSort(a,b,true);
612                    },
613                    "natural-desc": function ( a, b ) {
614                        return naturalSort(a,b,true) * -1;
615                    },
616                    "natural-nohtml-asc": function( a, b ) {
617                        return naturalSort(a,b,false);
618                    },
619                    "natural-nohtml-desc": function( a, b ) {
620                        return naturalSort(a,b,false) * -1;
621                    },
622                    "natural-ci-asc": function( a, b ) {
623                        a = a.toString().toLowerCase();
624                        b = b.toString().toLowerCase();
625            
626                        return naturalSort(a,b,true);
627                    },
628                    "natural-ci-desc": function( a, b ) {
629                        a = a.toString().toLowerCase();
630                        b = b.toString().toLowerCase();
631            
632                        return naturalSort(a,b,true) * -1;
633                    },
634                    "natural-nohtml-ci-asc": function( a, b ) {
635                        a = a.toString().toLowerCase();
636                        b = b.toString().toLowerCase();
637            
638                        return naturalSort(a,b,false);
639                    },
640                    "natural-nohtml-ci-desc": function( a, b ) {
641                        a = a.toString().toLowerCase();
642                        b = b.toString().toLowerCase();
643            
644                        return naturalSort(a,b,false) * -1;
645                    }
646                } );
647
648            }
649
650            reinit = typeof reinit != 'undefined' ? reinit : {};
651            addInstance = typeof addInstance != 'undefined' ? addInstance : true;
652
653            var self = this,
654                $table = (table instanceof $ ? table : jQuery(table)),
655                features = $table.data('features'),
656                config = {},
657                responsiveMode = $table.data('responsive-mode'),
658                searchingSettings = $table.data('searching-settings'),
659                tableInstance = {},
660                defaultFeatures = {
661                    autoWidth: false,
662                    info: false,
663                    ordering: false,
664                    paging: false,
665                    responsive: false,
666                    searching: false,
667                    stateSave: false,
668                    bJQueryUI: true,
669                    api: true,
670                    retrieve: true,
671                    processing: true,
672                    initComplete: callback,
673                    headerCallback: function(thead, data, start, end, display) {
674                        jQuery(thead).closest('thead').find('th').each(function() {
675                            self.setStylesToCell(this);
676                        });
677                    },
678                    footerCallback: function(tfoot, data, start, end, display) {
679                        jQuery(tfoot).closest('tfoot').find('th').each(function() {
680                            self.setStylesToCell(this);
681                        });
682                    },
683                    // order param disable the default table sorting.
684                    // it should be here because of Woocommerce addon:
685                    // it has no hidden header for tables without header
686                    // and in triggers an error during initializing.
687                    // order param should be disabled later during sorting activation
688                    order: []
689                };
690
691            g_stbServerSideProcessing = $table.data('server-side-processing') && $table.data('server-side-processing') == 'on';
692
693            // Fix for searching by merged cells
694            $table.find('tbody td[data-colspan], tbody td[data-rowspan]').each(function(index, item) {
695                var cell = jQuery(item),
696                    cellData = cell.html();
697
698                // prevent of copy cell data if it contains tags with id attribute - it must be unique on page
699                if (!cellData.toString().match(/<.*?id=['|"].*?['|"].*?>/g)) {
700                    var cellOrValue = cell.data('original-value'),
701                        cellFormula = cell.data('formula'),
702                        cellOrder = cell.data('order'),
703                        table = cell.parents('table:first'),
704                        colIndex = cell.index(),
705                        rowIndex = cell.parents('tr:first').index(),
706                        colspan = cell.data('colspan'),
707                        rowspan = cell.data('rowspan');
708
709                    for (var i = rowIndex + 1; i <= rowIndex + rowspan; i++) {
710                        for (var j = colIndex + 1; j <= colIndex + colspan; j++) {
711                            var hiddenCell = table.find('tbody tr:nth-child(' + i + ') td:nth-child(' + j + ')');
712
713                            if (hiddenCell.data('hide') && !$table.data('merged')) {
714                                hiddenCell.html(cellData);
715                                hiddenCell.data('original-value', cellOrValue);
716                                hiddenCell.attr('data-original-value', cellOrValue);
717                                hiddenCell.data('order', cellOrder);
718                                hiddenCell.attr('data-order', cellOrder);
719                                if (cellFormula) {
720                                    hiddenCell.data('formula', cellFormula);
721                                    hiddenCell.attr('data-formula', cellFormula);
722                                }
723                            }
724                        }
725                    }
726                }
727            });
728
729            // Set features
730            jQuery.each(features, function() {
731                var featureName = this.replace(/[-_]([a-z])/g, function(g) {
732                    return g[1].toUpperCase();
733                });
734                config[featureName] = true;
735            });
736            if ($table.data('search-value') && !config['searching']) {
737                config['searching'] = true;
738            }
739            if (!config['searching'] && (typeof this.setTableAddSearching === 'function')) {
740                config['searching'] = this.setTableAddSearching($table);
741            }
742            if (toeInArray('searching', features) != -1 && searchingSettings) {
743                if (searchingSettings.minChars > 0 ||
744                    searchingSettings.resultOnly ||
745                    searchingSettings.strictMatching
746                ) {
747                    jQuery.fn.dataTable.ext.search.push(function(settings, data) {
748                        var $searchInput = jQuery(settings.nTableWrapper).find('.dataTables_filter input'),
749                            searchValue = $searchInput.val();
750
751                        if (searchingSettings.resultOnly && searchValue.length === 0) {
752                            if (searchingSettings.showTable) {
753                                return false;
754                            }
755                            return false;
756                        }
757                        if (searchingSettings.strictMatching) {
758                            searchValue = jQuery.fn.dataTable.util.escapeRegex(searchValue);
759                            var regExp = new RegExp('^' + searchValue, 'i');
760
761                            for (var i = 0; i < data.length; i++) {
762                                var words = data[i].replace(/\s\s+/g, ' ').split(' ');
763
764                                for (var j = 0; j < words.length; j++) {
765                                    if (words[j].match(regExp)) {
766                                        return true;
767                                    }
768                                }
769                            }
770                            return false;
771                        } else {
772                            return data.join(' ').toLowerCase().indexOf(searchValue.toLowerCase()) !== -1
773                        }
774                    });
775                    $table.on('init.dt', function(event, settings) {
776                        if (!settings) {
777                            return;
778                        }
779
780                        var $tableWrapper = jQuery(settings.nTableWrapper),
781                            $tableSearchInput = $tableWrapper.find('.dataTables_filter input'),
782                            $customInput = $tableSearchInput.clone();
783
784                        $tableSearchInput.replaceWith($customInput);
785
786                        $customInput.on('input change', function() {
787                            if (!searchingSettings.showTable) {
788                                if (searchingSettings.resultOnly && searchingSettings.minChars && (this.value.length < searchingSettings.minChars || !this.value.length)) {
789                                    $table.hide();
790                                    $table.parent().find('.dataTables_paginate').hide();
791                                } else {
792                                    $table.show();
793                                    $table.parent().find('.dataTables_paginate').show();
794                                }
795                            }
796                            if (searchingSettings.minChars && (this.value.length < searchingSettings.minChars && this.value.length !== 0)) {
797                                event.preventDefault();
798                                return false;
799                            }
800                            $table.api().draw();
801                        });
802
803                        if (searchingSettings.resultOnly && !searchingSettings.showTable) {
804                            $table.hide();
805                            $table.parent().find('.dataTables_paginate').hide();
806                        }
807                    });
808                }
809                if (searchingSettings.columnSearch) {
810                    var inputTop = (searchingSettings.columnSearchPosition && searchingSettings.columnSearchPosition == 'top'),
811                        tPosition = inputTop ? 'thead' : 'tfoot';
812                    if (!$table.find('.stbColumnsSearchWrapper').length) {
813                        var headerRow = $table.find('thead tr:first').find('th');
814                        if (headerRow.length) {
815                            var searchRow = '<tr class="stbColumnsSearchWrapper">',
816                                func = inputTop ? 'prepend' : 'append';
817                            for (var i = 0; i < headerRow.length; i++) {
818                                var cellItem = jQuery(headerRow[i]),
819                                    cellClass = '',
820                                    cellStyle = '';
821                                if (!g_stbServerSideProcessing) {
822                                    cellStyle = cellItem.is(':visible') ? '' : 'style="display: none;"';
823                                }
824                                if (cellItem.hasClass('invisibleCell')) {
825                                    cellClass = ' class="invisibleCell"'
826                                }
827                                searchRow += '<th ' + cellClass + cellStyle + '><input class="search-column" type="text" data-column-num="' + i + '"/></th>';
828                            }
829                            searchRow += '</tr>';
830                            if ($table.find(tPosition).length == 0) {
831                                $table.append(jQuery('<' + tPosition + '>'));
832                            }
833                            $table.find(tPosition)[func](searchRow);
834                        }
835                    }
836                    if ($table.data('auto-index') !== 'off') {
837                        jQuery('.stbColumnsSearchWrapper th:first-child input').css({
838                            'visibility': 'hidden'
839                        });
840                    }
841                }
842            }
843            if (toeInArray('ordering', features) != -1) {
844                var sortingEnable = ['_all'],
845                    sortingDisable = [],
846                    aaSorting = [],
847                    multipleSorting = $table.data('multiple-sorting'),
848                    disableSorting = $table.data('disable-sorting');
849
850                if (!$table.data('head')) {
851                    sortingDisable = ['_all'];
852                }
853                if (disableSorting && disableSorting.length) {
854                    sortingDisable = disableSorting;
855                }
856                if (multipleSorting && multipleSorting.length) {
857                    aaSorting = multipleSorting;
858                } else {
859                    var columnsCount = $table.find('tr:first th').length,
860                        sortColumn = $table.data('sort-column') || 0,
861                        sortOrder = $table.data('sort-order') || 'asc',
862                        columnNumber = sortColumn - 1;
863
864                    if (columnNumber >= 0 && columnNumber < columnsCount) {
865                        aaSorting.push([columnNumber, sortOrder]);
866                    }
867                }
868                // config.aoColumnDefs = [
869                //     { type: 'natural-nohtml-ci', targets: '_all' },
870                //     { "sortable": false, "targets": sortingDisable },
871                //     { "sortable": true, "targets": sortingEnable }
872                // ];
873                config.aoColumnDefs = {};
874                config.aaSorting = aaSorting;
875                delete defaultFeatures.order;
876            }
877            if ($table.data('pagination-length')) {
878                var paginationLength = String($table.data('pagination-length'));
879
880                config.aLengthMenu = [];
881                config.aLengthMenu.push(paginationLength.replace('All', -1).split(',').map(Number));
882                config.aLengthMenu.push(paginationLength.split(','));
883            }
884            if ($table.data('auto-index') && $table.data('auto-index') !== 'off') {
885                $table.on('draw.dt', function() {
886                    var isFirst = true,
887                        index = 1;
888                    $table.api().column(0).nodes().each(function(cell, i) {
889                        var style = window.getComputedStyle(cell);
890                        if (isFirst) {
891                            index = i + 1;
892                            isFirst = false;
893                        }
894                        if (style.display !== 'none' && !cell.classList.contains('invisibleCell')) {
895                            cell.innerHTML = index;
896                            index++;
897                        }
898                    });
899                });
900            }
901
902            // Set responsive mode
903            if (responsiveMode == 0) {
904                // Responsive Mode: Standart Responsive Mode
905                var labelStyles = '<style>',
906                    id = '#' + $table.attr('id');
907
908                // Add header data to each response row
909                $table.find('thead th').each(function(index, el) {
910                    labelStyles += id + '.oneColumnWithLabels td:nth-of-type(' + (index + 1) + '):before { content: "' + jQuery(this).text() + '"; }';
911                });
912                labelStyles += '</style>';
913                $table.append(labelStyles);
914
915                jQuery(window).on('load resize orientationchange', $table, function(event) {
916                    event.preventDefault();
917                    clearTimeout($table.data('resizeTimer'));
918
919                    $table.data('resizeTimer', setTimeout(function() {
920                        $table.removeClass('oneColumn oneColumnWithLabels');
921                        $table.css('width', '100%');
922                        var tableWidth = $table.width(),
923                            wrapperWidth = $table.closest('.supsystic-tables-wrap').width();
924                        if (tableWidth >
924 wrapperWidth || jQuery(window).width() <= 475) {
925                            $table.addClass('oneColumn');
926
927                            if ($table.data('head') == 'on') {
928                                $table.addClass('oneColumnWithLabels');
929                            }
930                        }
931                    }, 150));
932                    if (g_stbServerSideProcessing) {
933                        $table.find('td').each(function() {
934                            jQuery(this).css({
935                                'width': '',
936                                'min-width': ''
937                            });
938                        });
939                    }
940                });
941            } else if (responsiveMode === 1) {
942                // Responsive Mode: Automatic Column Hiding
943                config.responsive = {
944                    details: {
945                        renderer: function(api, rowIdx, columns) {
946                            var $table = jQuery(api.table().node()),
947                                $subTable = jQuery('<table/>');
948
949                            jQuery.each(columns, function(i, col) {
950                                if (col.hidden) {
951                                    var $cell = jQuery(api.cell(col.rowIndex, col.columnIndex).node()).clone(),
952                                        markup = '<tr data-dt-row="' + col.rowIndex + '" data-dt-column="' + col.columnIndex + '">';
953                                    if ($table.data('head') == 'on') {
954                                        var tableHeadTr = jQuery(api.table().header()).find('tr:not(.stbColumnsSearchWra
954pper)').eq(0);
955                                        var $headerContent = tableHeadTr.find('th').eq(col.columnIndex).html();
956                                        markup += '<td>';
957                                        if ($headerContent) {
958                                            markup += $headerContent;
959                                        }
960                                        markup += '</td>';
961                                    }
962                                    markup += '</tr>';
963                                    $cell.after(
964                                        jQuery('<td>')
965                                        .addClass('collapsed-cell-holder')
966                                        .attr('data-cell-row', col.rowIndex)
967                                        .attr('data-cell-column', col.columnIndex)
968                                        .hide()
969                                    );
970                                    $subTable.append(jQuery(markup).append($cell.addClass('collapsed').show()));
971                                }
972                            });
973                            return $subTable.is(':empty') ? false : $subTable;
974                        }
975                    }
976                };
977                $table.on('responsive-resize.dt', function(event, api, columns) {
978                    if (typeof api == 'undefined' || typeof columns == 'undefined') {
979                        var tbl = jQuery(this),
980                            instance = vendor[appName].getTableInstanceById(tbl.data('id'));
981
982                        if (instance) {
983                            api = typeof api != 'undefined' ? api : instance.api();
984                            columns = typeof columns != 'undefined' ? columns : instance.api().columns();
985                        }
986                    }
987                    var autoHiding = [],
988                        searchColumn = $table.find('.stbColumnsSearchWra
988pper input.search-column');
989                    for (var i = 0, len = columns.length; i < len; i++) {
990                        autoHiding[i] = columns[i] ? 1 : 0;
991                    }
992                    $table.find('th input.search-column').each(function() {
993                        var th = jQuery(this).parents('th:first'),
994                            i = th.index();
995                        if (columns.length > i) {
996                            th.css('display', columns[i] ? '' : 'none');
997                        }
998                    });
999                    if (typeof columns[0] == 'boolean') {
1000                        $table.attr('data-auto-hiding', autoHiding.join());
1001                    }
1002                    if ($table.width() > $table.parent().width()) {
1003                        $table.css('width', '100%');
1004                        $table.css('max-width', '100%');
1005                        api.responsive.recalc();
1006                        return;
1007                    }
1008                    for (var i = 0, len = columns.length; i < len; i++) {
1009                        if (columns[i]) {
1010                            $table.find('tr > td.collapsed-cell-holder[data-cell-column="' + i + '"]').each(function(index, el) {
1011                                var $this = jQuery(this);
1012                                var $cell = jQuery(api.cell(
1013                                    $this.data('cell-row'),
1014                                    $this.data('cell-column')
1015                                ).node());
1016
1017                                if ($cell.hasClass('collapsed')) {
1018                                    $cell.removeClass('collapsed');
1019                                    $this.replaceWith($cell);
1020                                }
1021                            });
1022                        }
1023                    }
1024                    if ($table.data('merged')) {
1025                        // if has merged cells remove them, with autohidding they not working
1026                        $table.find('td[data-hide]').show();
1027                        $table.find('td[data-rowspan]').attr({
1028                            'data-rowspan': 1,
1029                            rowspan: 1,
1030                            'data-colspan': 1,
1031                            colspan: 1
1032                        });
1033                    }
1034                });
1035            } else if (responsiveMode === 2) {
1036                // Responsive Mode: Horizontal Scroll
1037                config.scrollX = true;
1038                config.bAutoWidth = false;
1039                var firstRow = $table.find('tbody tr:first-child td');
1040                if (firstRow.length) {
1041                    var cntCols = firstRow.length;
1042                    $table.find('thead tr:first-child th').each(function(i, th) {
1043                        if (cntCols > i && jQuery(th).css('width')) {
1044                            firstRow.eq(i).css('width', jQuery(th).css('width'));
1045                        }
1046                    });
1047                }
1048            }
1049            if (responsiveMode === 2 || responsiveMode === 3) {
1050                // Responsive Mode: 2 - Horizontal Scroll, 3 - Disable Responsivity
1051                var fixedHead = $table.data('head') && $table.data('fixed-head'),
1052                    fixedFoot = $table.data('foot') && $table.data('fixed-foot'),
1053                    fixedLeft = $table.data('fixed-left'),
1054                    fixedRight = $table.data('fixed-right');
1055
1056                // TODO: correct the code to set fixed header and fixed footer in the standard way
1057                // TODO: https://datatables.net/extensions/fixedheader/#Features
1058                //config.fixedHeader = {
1059                //	header: false,
1060                //	footer: false
1061                //};
1062                //if (fixedHead) {
1063                //	config.fixedHeader.header = true;
1064                //}
1065                //if (fixedFoot) {
1066                //	config.fixedHeader.footer = true;
1067                //}
1068                if (fixedHead || fixedFoot) {
1069                    config.scrollY = $table.data('fixed-height');
1070                    config.scrollCollapse = true;
1071                }
1072                if ($table.data('fixed-cols')) {
1073                    config.fixedColumns = {
1074                        leftColumns: fixedLeft ? parseInt(fixedLeft) : 0,
1075                        rightColumns: fixedRight ? parseInt(fixedRight) : 0
1076                    };
1077                    config.scrollX = true;
1078                }
1079            }
1080
1081            //$table.find('.invisibleCell').siblings('td').addClass('invisibleCell');
1082
1083            // Add translation
1084            var langData = typeof g_stbTblLangData != 'undefined' ? JSON.parse(g_stbTblLangData) : $table.data('translation'),
1085                translation = langData || {},
1086                override = $table.data('override');
1087
1088            if (typeof translation != 'object') {
1089                translation = {}; // for just to be sure that it is object
1090            }
1091            jQuery.each(override, function(key, value) {
1092                if (value.length) {
1093                    translation[key] = value;
1094                    // We need to support old DT format, cuz some languages use it
1095                    translation['s' + key.charAt(0).toUpperCase() + key.substr(1)] = value;
1096                }
1097            });
1098            config.language = translation;
1099
1100            var ajaxSource = {};
1101
1102            if (g_stbServerSideProcessing) {
1103                var nonce = (typeof DTGS_NONCE !== "undefined") ? DTGS_NONCE : DTGS_NONCE_FRONTEND;
1104                var route = {
1105                        "action": "getPageRows",
1106                        "module": "tables",
1107                        "nonce": nonce
1108                    },
1109                    loadedRows = [],
1110                    loadedCells = [],
1111                    headerRowsCount = ($table.data('head') == 'on' ? $table.data('head-rows-count') : 0),
1112                    footerRowsCount = ($table.data('foot') == 'on' ? $table.data('foot-custom-rows-count') : 0);
1113                ajaxSource = {
1114                    processing: true,
1115                    serverSide: true,
1116                    ajax: {
1117                        url: window.ajaxurl ? window.ajaxurl : ajax_obj.ajaxurl,
1118                        type: 'POST',
1119                        data: {
1120                            action: "supsystic-tables",
1121                            route: route,
1122                            id: $table.data('id'),
1123                            searchParams: searchingSettings,
1124                            searchValue: function() {
1125                                var input = jQuery('#' + $table.attr('id') + '_filter.dataTables_filter').find('input');
1126                                return (input.length ? input.val() : '');
1127                            },
1128                            header: headerRowsCount,
1129                            footer: footerRowsCount,
1130                            beforeSend: function() {
1131                                g_stbServerSideProcessingIsActive = true;
1132                            }
1133                        },
1134                        dataFilter: function(data) {
1135                            var json = jQuery.parseJSON(data),
1136                                rows = jQuery(json.rows).find('tr'),
1137                                aData = [];
1138
1139                            loadedRows = [];
1140                            loadedCells = [];
1141                            for (var i = 0; i < rows.length; i++) {
1142                                var row = rows[i];
1143                                loadedRows.push(row.attributes);
1144                                var cells = jQuery(row).find('td'),
1145                                    attrs = [],
1146                                    vals = [];
1147                                for (var j = 0; j < cells.length; j++) {
1148                                    var cell = cells[j];
1149                                    attrs.push(cell.attributes);
1150                                    vals.push(cell.innerHTML);
1151                                }
1152                                loadedCells.push(attrs);
1153                                aData.push(vals);
1154                            }
1155                            json.rows = '';
1156                            json.data = aData;
1157                            g_stbServerSideProcessingIsActive = false;
1158                            return JSON.stringify(json);
1159                        }
1160                    },
1161                    createdRow: function(row, data, dataIndex) {
1162                        if (typeof(loadedRows[dataIndex]) != 'undefined') {
1163                            jQuery(loadedRows[dataIndex]).each(function() {
1164                                jQuery(row).attr(this.name, this.value);
1165                            });
1166                        }
1167                    }
1168                };
1169                if (typeof(config.aoColumnDefs) == 'undefined' || jQuery.isEmptyObject(config.aoColumnDefs)) {
1170                    config.aoColumnDefs = [];
1171                }
1172                config.aoColumnDefs.push({
1173                    targets: '_all',
1174                    cellType: 'td',
1175                    createdCell: function(td, cellData, rowData, row, col) {
1176                        if (typeof(loadedCells[row][col]) != 'undefined') {
1177                            var rowspan = 1,
1178                                colspan = 1;
1179                            jQuery(loadedCells[row][col]).each(function() {
1180                                if (this.name == 'data-rowspan' && this.value > 1) {
1181                                    rowspan = this.value;
1182                                }
1183                                if (this.name == 'data-colspan' && this.value > 1) {
1184                                    colspan = this.value;
1185                                }
1186                            });
1187                            if (rowspan > 1 || colspan > 1) {
1188                                var stopRow = row + parseInt(rowspan),
1189                                    stopCol = col + parseInt(colspan),
1190                                    startRow = colspan > 1 ? row : row + 1,
1191                                    hide;
1192                                if (stopRow >= loadedCells.length) {
1193                                    stopRow = loadedCells.length;
1194                                }
1195                                if (stopCol >= loadedCells[row].length) {
1196                                    stopCol = loadedCells[row].length;
1197                                }
1198
1199                                for (i = startRow; i < stopRow; i++) {
1200                                    if (i > row) {
1201                                        hide = document.createAttribute('data-hide');
1202                                        hide.value = 'true';
1203                                        loadedCells[i][col].setNamedItem(hide);
1204                                    }
1205                                    for (j = col + 1; j < stopCol; j++) {
1206                                        hide = document.createAttribute('data-hide');
1207                                        hide.value = 'true';
1208                                        loadedCells[i][j].setNamedItem(hide);
1209                                    }
1210                                }
1211                            }
1212                            jQuery(loadedCells[row][col]).each(function() {
1213                                //if(this.name != 'data-formula') {
1214                                jQuery(td).attr(this.name, this.value);
1215                                //}
1216                            });
1217                        }
1218                    }
1219                });
1220            }
1221            window.table = $table;
1222            $table.trigger('beforeInitializeTable', $table);
1223            var dateFormat = $table.data('date-format');
1224            // if (typeof $table.dataTable.moment !== "undefined") { 
1225				$table.dataTable.moment(dateFormat);
1226			// }
1227			// if (typeof jQuery.fn.dataTable.ext.order.intl !== "undefined") { 
1228				jQuery.fn.dataTable.ext.order.intl();
1229			// }
1230            tableInstance = $table.dataTable(jQuery.extend({}
1230, defaultFeatures, config, extraConfig, ajaxSource, reinit));
1231            tableInstance.table_id = $table.data('id');
1232            tableInstance.table_view_id = $table.data('view-id');
1233            if (typeof tableInstance.fnFakeRowspan !== "undefined") { 
1234				tableInstance.fnFakeRowspan();
1235			}
1236            self._checkOnClickPopups($table);
1237            window.table = $table;
1238            if ($table.data('remove-rows')) {
1239
1240                jQuery(function() {
1241
1242                    jQuery.contextMenu({
1243                        selector: '.dataTable td',
1244                        animation: {
1245                            duration: 250,
1246                            show: 'fadeIn',
1247                            hide: 'fadeOut'
1248                        },
1249                        callback: function(key, options) {
1250                            var m = "clicked: " + key;
1251                        },
1252                        items: {
1253                            "remove_row": {
1254                                name: "Remove row",
1255                                callback: function(itemKey, opt, e) {
1256                                    contextMenuAction(this, 'remove_row');
1257                                }
1258                            },
1259                            "add_row_before": {
1260                                name: "Add row before",
1261                                callback: function(itemKey, opt, e) {
1262                                    contextMenuAction(this, 'add_row', 'before');
1263                                }
1264                            },
1265                            "add_row_after": {
1266                                name: "Add row after",
1267                                callback: function(itemKey, opt, e) {
1268                                    contextMenuAction(this, 'add_row', 'after');
1269                                }
1270                            },
1271                            "sep1": "---------",
1272                            "quit": {
1273                                name: "Quit"
1274                            }
1275                        }
1276                    });
1277
1278                    function contextMenuAction(e, action, second) {
1279                        var coltext = e.text();
1280                        var colvindex = e.parent().children().index(e);
1281                        var colindex = jQuery('table.dataTable thead tr th:eq(' + colvindex + ')').data('column-index');
1282
1283                        /* Global var for counter */
1284                        var giCount = 1;
1285                        switch (action) {
1286                            case "remove_row":
1287                                $table.fnDeleteRow(e.parent('tr'));
1288                                $table.fnUpdate();
1289                                break;
1290                            case "add_row":
1291                                var tr = e.parent('tr').clone(true, true);
1292                                tr.find('td').html('').addClass('menu-injected').addClass('editable').addClass('justCloned');
1293                                tr.find('td').data('original-value', '').attr('data-original-value', '');
1294                                var order = tr.find('td').data('order');
1295                                if (second == 'before') {
1296                                    order = order - 1;
1297                                    tr.find('td').data('order', order).attr('data-order', order);
1298                                } else {
1299                                    order = order + 1;
1300                                    tr.find('td').data('order', order).attr('data-order', order);
1301                                }
1302                                tr.find('td').data('cell-type', 'text').attr('data-cell-type', 'text');
1303                                tr.find('td').data('cell-format-type', '').attr('data-cell-format-type', '');
1304                                $table.append(tr);
1305                                $table.fnAddData(tr, true);
1306                                tr.find('td.justCloned').data('y', '9999').attr('data-y', '9999').removeClass('justCloned');
1307                                // $table.fnUpdate();
1308                                // $table.trigger('draw.dt');
1309                                break;
1310                        }
1311                    }
1312
1313                });
1314
1315            }
1316
1317            if (g_stbServerSideProcessing) {
1318                jQuery('.dataTables_processing').css('z-index', '10');
1319            } else {
1320                self.setColumnSearch($table);
1321            }
1322            $table.on('draw.dt', function() {
1323                var searching = $table.data('searching-settings');
1324                if (searching && ('columnSearch' in searching) && searching.columnSearch == 'on') {
1325                    self.setColumnSearch($table);
1326                }
1327                if (!g_stbServerSideProcessing && $table.data('merged')) {
1328                    tableInstance.fnResetFakeRowspan();
1329                }
1330                self.initShortcodesInTable($table);
1331            });
1332            if (responsiveMode === 1) {
1333                $table.on('responsive-resize.dt', function(event, api, columns) {
1334                    if (!g_stbServerSideProcessing && $table.data('merged')) {
1335                        tableInstance.fnResetFakeRowspan();
1336                    }
1337                });
1338            }
1339            if (typeof $table.data('fixed-cols') !== 'undefined') {
1340                tableInstance.api().fixedColumns().update();
1341            }
1342            if (addInstance) {
1343                this.setTableInstance(tableInstance);
1344            }
1345            return typeof finalCallback == "function" ? finalCallback(tableInstance) : tableInstance;
1346        });
1347
1348        /** Callback for displaying table after initializing
1349         * @param {object} settings - DataTables settings object
1350         * @param {object} json - JSON data retrieved from the server if the ajax option was set. Otherwise undefined.
1351         */
1352        vendor[appName].showTable = (function(settings, json) {
1353            var self = vendor[appName], // it is callback so "this" does not equal vendor[appName] object
1354                $table = this instanceof $ ? this : settings, // for compatibility with old pro versions
1355                $tableWrap = $table.closest('.supsystic-tables-wrap'),
1356                tableSelector = '#supsystic-table-' + $table.data('view-id') + ' #supsystic-table-' + $table.data('id'),
1357                afterTableLoadedScriptString = $table.attr('data-after-table-loaded-script'),
1358                _ruleJS = self.setRuleJSInstance($table),
1359                responsiveMode = $table.data('responsive-mode'),
1360                fixedHeader = $table.data('fixed-head') == 'on',
1361                fixedFooter = $table.data('fixed-foot') == 'on',
1362                fixedColumns = $table.data('fixed-right') > 0 || $table.data('fixed-left') > 0,
1363                viewId = $table.data('view-id');
1364
1365            // Apply custom CSS styles, which have been set through the table editor
1366            $table.find('th, td').each(function() {
1367                self.setStylesToCell(this);
1368            });
1369            $table.bind('column-visibility.dt draw.dt', function(e) {
1370                jQuery(this).find('th, td').each(function() {
1371                    self.setStylesToCell(this);
1372                });
1373            });
1374
1375            // Remove sorting visual elements from the tags if there is no header on table
1376            if (!$table.data('head')) {
1377                $table.find('th').removeClass('sorting sorting_asc sorting_desc sorting_disabled');
1378            }
1379
1380            // Calculate formulas
1381            _ruleJS.init();
1382
1383            // Set formats
1384            self.formatDataAtTable($table, true);
1385
1386
1387            // Apply shortcode param "search"
1388            if ($table.data('search-value')) {
1389                $table.api().search($table.data('search-value')).draw();
1390            }
1391
1392            // Show comments on tap
1393            if ('ontouchstart' in window || navigator.msMaxTouchPoints) {
1394                $table.parents('.supsystic-tables-wrap:first').find('td, th').on('click', self.applyMobileTableComments);
1395            }
1396
1397            // Prepare Contact Form by Supsystic buttons
1398            $table.parents('.supsystic-tables-wrap:first').find('th, td').each(self._contactFormBtnCellClb);
1399
1400            // Page change callback
1401            $table.on('page.dt', function() {
1402                if (g_stbServerSideProcessing) {
1403                    g_stbServerSideProcessingIsActive = true;
1404                }
1405                var table = jQuery(this),
1406                    tableSelector = '#supsystic-table-' + table.data('view-id') + ' #supsystic-table-' + table.data('id');
1407                self.applyTableEventClb(self.pageEvent, 50, tableSelector);
1408                if ($table.data('pagination-scroll') == 'on') {
1409                    jQuery('html, body').animate({
1410                        scrollTop: table.closest('.dataTables_wrapper').offset().top
1411                    }, 100);
1412                }
1413                if (typeof(self.setImgLightbox) == 'function') {
1414                    self.setImgLightbox($table);
1415                }
1416            });
1417
1418            // Frontend fields
1419            if (typeof(self.createEditableFields) == 'function') { // for compatibility with old pro versions
1420                var $editableFields = $tableWrap.find('.editable'),
1421                    $editfileFields = $tableWrap.find('.editfile'),
1422                    $selectableFields = $tableWrap.find('.selectable'),
1423                    $tableId = $table.data('id'),
1424                    useEditableFields = typeof(useEdit) != 'undefined' && typeof(useEdit[$tableId]) != 'undefined' ?
1425                    useEdit[$tableId] :
1426                    false;
1427
1428                if (useEditableFields || (SDT_DATA.isAdmin && SDT_DATA.isPro)) {
1429                    if (typeof(self.setFrontendFields) == 'function') {
1430                        self.setFrontendFields($table);
1431                    } else if (typeof(self.setAllFields) == 'function') {
1432                        self.setAllFields($table, $editableFields, $selectableFields);
1433                    } else {
1434                        self.createEditableFields($table, $editableFields);
1435                        self.createEditableFileFields($table, $editfileFields);
1436                    }
1437                    $table.on('init.dt', function() {
1438                        $table.on('responsive-resize.dt responsive-display.dt draw.dt', function() {
1439                            $editableFields.off('click.sup'); // for compatibility with old pro versions
1440                            $editfileFields.off('click.sup');
1441                            self.updateAfterRedraw($table);
1442                        });
1443                    });
1444                }
1445            }
1446            if (typeof(self.setImgLightbox) == 'function') {
1447                self.setImgLightbox($table);
1448            }
1449
1450            // apply page.dt event by change table pagination via select
1451            var paginationSelect = $tableWrap.find('.dataTables_length select');
1452            if (paginationSelect.length) {
1453                paginationSelect.on('change', function() {
1454                    $table.trigger('page.dt');
1455                });
1456            }
1457
1458            self.applyTableEventClb(self.fixHeaderOfHiddenColumns, 50, tableSelector);
1459
1460            $table.trigger('beforeShowTable', $table);
1461
1462            // Show table
1463            $tableWrap.prev('.supsystic-table-loader').hide();
1464            $tableWrap.css('visibility', 'visible');
1465
1466            self.fixSortingForMultipleHeader($table);
1467
1468            if (responsiveMode === 2 || fixedHeader || fixedFooter) {
1469                // Responsive Mode: Horizontal Scroll
1470                jQuery(window).on('load resize orientationchange', $table, function(event) {
1471                    var tBody = $tableWrap.find('.dataTables_scrollBody'),
1472                        tBodyTable = tBody.find('.supsystic-table');
1473
1474                    if (tBody.width() > tBodyTable.width() || $tableWrap.width() > tBodyTable.width()) {
1475                        tBody.width(tBodyTable.width());
1476                        $tableWrap.find('.dataTables_scrollHead, .dataTables_scrollFoot, .dataTables_scrollBody').width(tBodyTable.width() + 1);
1477                        /*
1478                        var scrollTables = $tableWrap.find('.dataTables_scrollHead, .dataTables_scrollFoot');
1479                        scrollTables.width(tBodyTable.width() + 1);
1480                        scrollTables.find('table').width(tBodyTable.width() + 1);*/
1481                    }
1482                    if (tBody.isHorizontallyScrollable()) {
1483                        tBody.css({
1484                            'border-bottom': 'none'
1485                        });
1486                    } else {
1487                        tBody.removeStyle('border-bottom');
1488                    }
1489                    var table = self.getTableInstanceById($table.data('id'));
1490                    if (typeof table.fnAdjustColumnSizing == 'function') {
1491                        setTimeout(function() {
1492                            table.fnAdjustColumnSizing(false);
1493                        }, 350);
1494                    }
1495                });
1496
1497                // need resize twice to get better frontend view
1498                var tBody = $tableWrap.find('.dataTables_scrollBody'),
1499                    tBodyTable = tBody.find('.supsystic-table');
1500
1501                if (tBodyTable.is(":visible")) {
1502                    setTimeout(function() {
1503                        jQuery(window).trigger('load');
1504                    }, 200);
1505                }
1506                var $tHeadTable = $tableWrap.find('.dataTables_scrollHead .supsystic-table');
1507                if ($tHeadTable.length) {
1508                    self.formatDataAtTable($tHeadTable, true);
1509                }
1510                var $tFootTable = $tableWrap.find('.dataTables_scrollFoot .supsystic-table');
1511                if ($tFootTable.length) {
1512                    self.formatDataAtTable($tFootTable, true);
1513                }
1514            }
1515            // Correct width of fixed header / footer
1516            if (fixedHeader || fixedFooter) {
1517                $table.api().fixedHeader.adjust();
1518
1519                var i = 1;
1520                setTimeout(function() {
1521                    var flag = fixedHeader,
1522                        el = fixedHeader ?
1523                        $tableWrap.find('.dataTables_scrollHead table thead tr:first-child th') :
1524                        $tableWrap.find('.dataTables_scrollFoot table tfoot tr:first-child th');
1525
1526                    el.each(function() {
1527                        var thWidth = $tableWrap.find('.dataTables_scrollBody table tbody tr:first-child td:nth-child(' + i + ')');
1528
1529                        jQuery(this).css({
1530                            'width': thWidth.outerWidth(),
1531                            'min-width': thWidth.outerWidth(),
1532                            'box-sizing': 'border-box'
1533                        });
1534                        if (fixedFooter && flag) {
1535                            var footerEl = $tableWrap.find('.dataTables_scrollFoot table tfoot tr:first-child th:nth-child(' + i + ')');
1536                            footerEl.css({
1537                                'width': thWidth.outerWidth(),
1538                                'min-width': thWidth.outerWidth(),
1539                                'box-sizing': 'border-box'
1540                            });
1541                        }
1542                        i++;
1543                    });
1544                }, 200);
1545            }
1546
1547            // Correct width of fixed columns
1548            if (fixedColumns) {
1549                $table.api().fixedColumns().relayout();
1550
1551                //var tableCaption = jQuery('.dataTables_scrollHead caption');
1552                //
1553                //if(tableCaption.length) {
1554                //self._fixTableCaption(tableCaption.height(), viewId, 10);
1555                //}
1556            }
1557            /* Fix for Horizontal scroll responsive mode if table has different width for one column in header and body */
1558            if (!fixedHeader && !fixedFooter && responsiveMode === 2 && toeInArray('auto_width', $table.data('features')) == -1) {
1559                $tableWrap.find('.dataTables_scrollBody table thead tr:first-child th').each(function() {
1560                    var tableWidth = $table.width(),
1561                        tableWrapWidth = $tableWrap.width();
1562
1563                    if (tableWrapWidth > tableWidth) {
1564                        $tableWrap
1565                            .find('.dataTables_scrollHeadInner, .dataTables_scrollBody, .dataTables_scrollFootInner')
1566                            .addClass('fit-content');
1567                    }
1568                });
1569            }
1570
1571            // Load user custom scripts
1572            if (afterTableLoadedScriptString !== undefined) {
1573                afterTableLoadedScriptString = afterTableLoadedScriptString.substring(1, afterTableLoadedScriptString.length - 1);
1574
1575                var afterTableLoadedScript = b64DecodeUnicode(afterTableLoadedScriptString).replace(/"/g, "'"),
1576                    executeScript = new Function(afterTableLoadedScript);
1577
1578                if (typeof executeScript === "function") {
1579                    setTimeout(function() {
1580                        executeScript();
1581                    }, 1000);
1582                }
1583            }
1584
1585            if (g_stbServerSideProcessing) {
1586                $table.on('draw.dt', function(e) {
1587                    var searching = $table.data('searching-settings');
1588                    if (searching && ('columnSearch' in searching) && searching.columnSearch == 'on') {
1589                        self.setColumnSearch($table);
1590                    }
1591                    self.getTableInstanceByViewId(viewId).fnFakeRowspan();
1592                    if (responsiveMode === 0 || responsiveMode === 2) {
1593                        jQuery(window).trigger('load');
1594                    }
1595                }).trigger('draw.dt');
1596            }
1597
1598            var tblEditLink = 'g_stbTblEditLink_' + $table.data('id'),
1599                showTblEditLink = eval("typeof " + tblEditLink) !== 'undefined' ? jQuery(window.atob(eval(tblEditLink))) : false;
1600
1601            if (showTblEditLink && jQuery(tableSelector).closest('.supsystic-tables-wrap').find('.tblEditLink').length === 0) {
1602                jQuery(tableSelector).closest('.supsystic-tables-wrap').append(showTblEditLink);
1603            }
1604
1605            function b64DecodeUnicode(str) {
1606                return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) {
1607                    return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
1608                }).join(''));
1609            }
1610        });
1611
1612        vendor[appName].applyTableEventClb = (function(clb, timeout) {
1613            // Callback for applying events' actions and other functions to tables with server side processing (SSP)
1614            timeout = timeout ? timeout : 0;
1615            var self = this,
1616                args = Array.from(arguments);
1617
1618            if (g_stbServerSideProcessing && g_stbServerSideProcessingIsActive) {
1619                setTimeout(function() {
1620                    self.applyTableEventClb.apply(self, args);
1621                }, 50);
1622            } else {
1623                if (typeof clb == 'function') {
1624                    args = args.slice(2);
1625                    setTimeout(function() {
1626                        clb.apply(self, args);
1627                    }, timeout);
1628                }
1629            }
1630        });
1631
1632        vendor[appName].pageEvent = (function(tableSelector) {
1633            var table = jQuery(tableSelector),
1634                tableWrapper = table.parents('.supsystic-tables-wrap:first');
1635
1636            this.getRuleJSInstance(table).init();
1637            this.formatDataAtTable(table, true);
1638            this.fixHeaderOfHiddenColumns(table);
1639            if ('ontouchstart' in window || navigator.msMaxTouchPoints) {
1640                tableWrapper.find('td, th').on('click', this.applyMobileTableComments);
1641            }
1642            tableWrapper.find('td, th').each(this._contactFormBtnCellClb);
1643            this.initShortcodesInTable(table);
1644        });
1645
1646        vendor[appName].fixHeaderOfHiddenColumns = (function($table) {
1647            $table = $table instanceof $ ? $table : jQuery($table);
1648
1649            var tableWrapper = $table.parents('.supsystic-tables-wrap:first');
1650
1651            if (!$table.data('head')) {
1652                tableWrapper.find('thead').each(function() {
1653                    var thead = jQuery(this);
1654                    thead.find('th').each(function(iter, item) {
1655                        var th = jQuery(this),
1656                            itemIndex = iter + 1,
1657                            columnAllTd = thead.parents('table:first').find('tbody td:nth-child(' + itemIndex + ')'),
1658                            columnInvTd = columnAllTd.filter('.invisibleCell'),
1659                            hidden = columnAllTd.length > 0 && columnAllTd.length == columnInvTd.length;
1660                        if (hidden) {
1661                            // Fix of correct displaying of tables with hidden rows / columns for tables without headers
1662                            th.addClass('invisibleCell');
1663                        }
1664                    });
1665                });
1666            }
1667        });
1668
1669        vendor[appName].applyMobileTableComments = (function(e) {
1670            var $elem = jQuery(this),
1671                title = $elem.attr('title');
1672
1673            if (title) {
1674                var tableViewId = $elem.parents('table.supsystic-table:first').data('view-id'),
1675                    cellId = $elem.data('cell-id'),
1676                    comment = jQuery('.stbMobileComment[data-table="' + tableViewId + '"][data-cell="' + cellId + '"]');
1677
1678                if (!comment.length) {
1679                    comment = jQuery('<div class="stbMobileComment" style="display:none;"/>');
1680                    comment.text(title)
1681                        .data('table', tableViewId)
1682                        .attr('data-table', tableViewId)
1683                        .data('cell', cellId)
1684                        .attr('data-cell', cellId)
1685                        .appendTo('body');
1686                }
1687                comment.css({
1688                    top: (e.pageY - 70) + 'px',
1689                    left: (e.pageX + 20) + 'px'
1690                }).fadeIn('slow');
1691
1692                setTimeout(function() {
1693                    comment.fadeOut('slow');
1694                }, 2500);
1695            }
1696        });
1697
1698        vendor[appName]._contactFormBtnCellClb = (function(e) {
1699            var cell = jQuery(this),
1700                y = cell.data('y'),
1701                pair,
1702                valueCell;
1703            if (cell.html().indexOf('cfsPreFill') != -1) {
1704                var cellHtml = cell.html().replace(/href=["|']([^"]*?)["|']/g, function(a, b) {
1705                    if (b.indexOf('cfsPreFill') != -1) {
1706                        var newB = b.split('&amp;');
1707                        if (newB.length) {
1708                            for (var i = 0; i < newB.length; i++) {
1709                                pair = newB[i].split('=');
1710                                if (pair.length && pair[1].match(/[A-Za-z]/)) {
1711                                    valueCell = cell.parents('tr:first').find('[data-cell-id="' + pair[1] + y + '"]');
1712                                    if (valueCell.length) {
1713                                        pair[1] = jQuery.trim(valueCell.html());
1714                                    }
1715                                }
1716                                newB[i] = pair.join('=');
1717                            }
1718                            newB = newB.join('&amp;');
1719                            a = a.replace(b, newB);
1720                        }
1721                        return a;
1722                    }
1723                });
1724                cell.html(cellHtml);
1725            }
1726        });
1727
1728        vendor[appName].setColumnSearch = (function(table) {
1729            if (typeof this.setTableAddFilters === 'function') this.setTableAddFilters(table);
1730
1731            var self = this,
1732                searchingSettings = table.data('searching-settings'),
1733                inputs = table.parents('.dataTables_wrapper:first').find('.stbColumnsSearchWrapper .search-column');
1734            if (inputs.length == 0) {
1735                return;
1736            }
1737            //jQuery(document).off('keyup change', ".dataTables_wrapper:first .stbColumnsSearchWra
1737pper .search-column")
1738            //			.on('keyup change', ".dataTables_wrapper:first .stbColumnsSearchWrapper .search-column",function () {
1739            inputs.off('keyup.dtg change.dtg').on('keyup.dtg change.dtg', function() {
1740                var input = jQuery(this),
1741                    position = input.parents('th:first').index(),
1742                    value = this.value,
1743                    column = table.api().column(position);
1744                if (typeof self.resetTableAddFilters === 'function') self.resetTableAddFilters(table);
1745                if (column.search() !== value) {
1746                    column.search(value.replace(/;/g, "|"), true, false).draw();
1747                    setTimeout(function() {
1748                        column.draw();
1749                    }, 50);
1750                }
1751            });
1752        });
1753
1754        vendor[appName].setCopyEvents = (function(obj, events) {
1755            jQuery.each(events, function(event, handlers) {
1756                jQuery.each(handlers, function(j, handler) {
1757                    jQuery(obj).unbind(event).bind(event, handler);
1758                });
1759            });
1760        });
1761
1762        // Callback for executing script after table is initialized
1763        vendor[appName].executeScript = (function(table) {
1764            var $table = (table instanceof $ ? table : jQuery(table)),
1765                $tableWrap = $table.closest('.supsystic-tables-wrap');
1766
1767            this.getRuleJSInstance($table).init();
1768            $tableWrap.prev('.supsystic-table-loader').hide();
1769            $tableWrap.css('visibility', 'visible');
1770        });
1771
1772        vendor[appName].fixSortingForMultipleHeader = (function(table) {
1773            if (table.data('head-rows-count') > 1 && table.data('sort-order')) {
1774                var thead = table.find('thead tr').get().reverse();
1775
1776                // Fix of sorting for table with multiple header (when header has more than 1 row)
1777                if (table.data('head')) {
1778                    jQuery.each(table.find('thead tr:last-child th'), function(index, element) {
1779                        var th = jQuery(element),
1780                            nthChild = index + 1;
1781
1782                        if (th.data('hide')) {
1783                            jQuery(thead).each(function() {
1784                                var item = jQuery(this).find('th:nth-child(' + nthChild + ')');
1785
1786                                if (!item.data('hide')) {
1787                                    item.addClass('sorting');
1788                                    item.click(function() {
1789                                        th.trigger('click');
1790                                        if (th.hasClass('sorting')) {
1791                                            item.removeClass('sorting_asc');
1792                                            item.removeClass('sorting_desc');
1793                                            item.addClass('sorting');
1794                                        } else if (th.hasClass('sorting_asc')) {
1795                                            item.removeClass('sorting');
1796                                            item.removeClass('sorting_desc');
1797                                            item.addClass('sorting_asc');
1798                                        } else if (th.hasClass('sorting_desc')) {
1799                                            item.removeClass('sorting');
1800                                            item.removeClass('sorting_asc');
1801                                            item.addClass('sorting_desc');
1802                                        }
1803                                    });
1804                                    return false; // stop .each() function
1805                                }
1806                            });
1807                        }
1808                    });
1809                }
1810            }
1811        });
1812
1813        vendor[appName].formatDataAtTable = (function(table, correctSorting) {
1814            correctSorting = correctSorting ? correctSorting : false;
1815
1816            var self = this,
1817                numberFormat = table.data('number-format'),
1818                generalCurrencyFormat = table.data('currency-format'),
1819                generalPercentFormat = table.data('percent-format'),
1820                generalDateFormat = table.data('date-format'),
1821                generalTimeFormat = table.data('time-format');
1822
1823            table.find('th, td').each(function(index, el) {
1824                var $this = jQuery(this);
1825
1826                if ((table.data('auto-index') != 'off' && $this.is(':first-child')) ||
1827                    (table.data('responsive-mode') == 1 && table.hasClass('collapsed') && $this.hasClass('child')) ||
1828                    $this.find('.search-column').length ||
1829                    $this.hasClass('tooltipCell') ||
1830                    $this.data('hide')
1831                ) {
1832                    // Break current .each iteration
1833                    return;
1834                }
1835
1836                var languageData = numeral.languageData(),
1837                    format = $this.data('cell-format'),
1838                    formatType = $this.data('cell-format-type'),
1839                    preparedFormat,
1840                    delimiters,
1841                    value = jQuery.trim($this.html()),
1842                    noFormat = false;
1843
1844                // function checkIfDate(parts) {
1845                //   var newDate = new Date(parts[0], parts[1]-1, parts[2]);
1846                //   if (newDate.getTime() === newDate.getTime()) {
1847                //     $this.attr('data-cell-format-type', 'date');
1848                //     $this.data('cell-format-type', 'date');
1849                //     formatType = $this.data('cell-format-type');
1850                //     console.log(parts);
1851                //   }
1852                // }
1853                // var parts = value.split('.');
1854                // if (parts.length > 0) {
1855                //   checkIfDate(parts);
1856                // }
1857                // var parts = value.split('-');
1858                // if (parts.length > 0) {
1859                //   checkIfDate(parts);
1860                // }
1861                // var parts = value.split('/');
1862                // if (parts.length > 0) {
1863                //   checkIfDate(parts);
1864                // }
1865
1866
1867                // Fix data params for cells which use formulas, which depended on cells with shortcodes inside
1868                if (correctSorting && toeInArray(formatType, ['date', 'time_duration']) == -1) {
1869                    var dataTableInstance = typeof table.api == 'function' ? table : self.getTableInstanceById(table.data('id'));
1870
1871                    if ($this.data('original-value') != value) {
1872                        $this.data('original-value', value);
1873                        $this.attr('data-original-value', value);
1874                    }
1875                    if ($this.data('data-order') != value) {
1876                        $this.data('order');
1877                        $this.attr('data-order', value);
1878                        if (dataTableInstance) {
1879                            dataTableInstance.api().cell($this).invalidate();
1880                        }
1881                    }
1882                }
1883                if (value) {
1884                    if ($this.data('cell-reformat')) {
1885                        switch (formatType) {
1886                            case 'date':
1887                                var newDate = moment(value, format);
1888                                if (newDate.isValid()) {
1889                                    value = newDate.format(generalDateFormat);
1890
1891                                    $this.data('cell-format', generalDateFormat);
1892                                    $this.attr('data-cell-format', generalDateFormat);
1893
1894                                    $this.data('original-value', value);
1895                                    $this.attr('data-original-value', value);
1896
1897                                    $this.data('order', value);
1898                                    $this.attr('data-order', value);
1899
1900                                    if (!g_stbServerSideProcessing) {
1901                                        $this.data('cell-reformat', false);
1902                                        $this.attr('data-cell-reformat', 0);
1903                                    }
1904                                }
1905                                break;
1906                            case 'time_duration':
1907                                var newTime = moment(value, format),
1908                                    isValid = false;
1909                                // console.log(newTime);
1910
1911                                if (newTime.isValid()) {
1912                                    value = newTime.format(generalTimeFormat);
1913                                    isValid = true;
1914                                } else {
1915                                    newTime = moment.duration(value);
1916                                    if (newTime._milliseconds || value == 0) {
1917                                        value = newTime.format(generalTimeFormat);
1918                                        isValid = true;
1919                                    }
1920                                }
1921                                if (isValid) {
1922                                    $this.data('cell-format', generalTimeFormat);
1923                                    $this.attr('data-cell-format', generalTimeFormat);
1924
1925                                    $this.data('original-value', value);
1926                                    $this.attr('data-original-value', value);
1927
1928                                    $this.data('order', value);
1929                                    $this.attr('data-order', value);
1930
1931                                    if (!g_stbServerSideProcessing) {
1932                                        $this.data('cell-reformat', false);
1933                                        $this.attr('data-cell-reformat', 0);
1934                                    }
1935                                }
1936                                break;
1937                            default:
1938                                break;
1939                        }
1940                    } else if (self.isNumber(value) && !isNaN(value)) {
1941                        numberFormat = numberFormat ? numberFormat.toString() : '';
1942
1943                        switch (formatType) {
1944                            case 'percent':
1945                                format = format ? format : generalPercentFormat;
1946
1947                                if (format) {
1948                                    format = format.toString();
1949
1950                                    var clearFormat = format.indexOf('%') >
1950 -1 ? format.replace('%', '') : format;
1951
1952                                    value = value.indexOf('%') > -1 ? $this.data('original-value') : value;
1953                                    delimiters = (clearFormat.match(/[^\d]/g) || [',', '.']).reverse();
1954                                    languageData.delimiters = {
1955                                        decimal: delimiters[0],
1956                                        thousands: delimiters[1]
1957                                    };
1958
1959                                    // We need to use dafault delimiters for format string
1960                                    preparedFormat = format.replace(clearFormat, clearFormat.replace(delimiters[0], '.').replace(delimiters[1], ','));
1961                                } else {
1962                                    noFormat = true;
1963                                }
1964                                break;
1965                            case 'currency':
1966                                format = format ? format : generalCurrencyFormat;
1967
1968                                if (format) {
1969                                    format = format.toString();
1970
1971                                    var formatWithoutCurrency = format.match(/\d.?\d*.?\d*/)[0],
1972                                        currencySymbol = format.replace(formatWithoutCurrency, '') || '$'; // We need to set currency symbol in any case for normal work of numeraljs
1973
1974                                    delimiters = (formatWithoutCurrency.match(/[^\d]/g) || [',', '.']).reverse();
1975
1976                                    languageData.delimiters = {
1977                                        decimal: delimiters[0],
1978                                        thousands: delimiters[1]
1979                                    };
1980                                    languageData.currency.symbol = currencySymbol;
1981                                    // We need to use dafault delimiters for format string
1982                                    preparedFormat = format
1983                                        .replace(formatWithoutCurrency, formatWithoutCurrency
1984                                            .replace(delimiters[0], '.')
1985                                            .replace(delimiters[1], ','))
1986                                        .replace(currencySymbol, '$');
1987                                } else {
1988                                    noFormat = true;
1989                                }
1990                                break;
1991                            case 'date':
1992                            case 'time_duration':
1993                                noFormat = true;
1994                                break;
1995                            default:
1996                                if (numberFormat) {
1997                                    format = numberFormat;
1998                                    delimiters = (format.match(/[^\d]/g) || [',', '.']).reverse();
1999                                    languageData.delimiters = {
2000                                        decimal: delimiters[0],
2001                                        thousands: delimiters[1]
2002                                    };
2003
2004                                    // We need to use dafault delimiters for format string
2005                                    preparedFormat = format.replace(format, format.replace(delimiters[0], '.').replace(delimiters[1], ','));
2006                                    break;
2007                                } else {
2008                                    noFormat = true;
2009                                }
2010                                break;
2011                        }
2012                        if (noFormat) {
2013                            noFormat = false;
2014                        } else {
2015                            numeral.language('en', languageData);
2016                            value = numeral(value).format(preparedFormat);
2017                        }
2018                    }
2019                }
2020                $this.html(value);
2021            });
2022        });
2023
2024        vendor[appName].isNumber = (function(value) {
2025            if (value) {
2026                if (value.toString().match(/^-{0,1}\d+\.{0,1}\d*$/)) {
2027                    return true;
2028                }
2029            }
2030            return false;
2031        });
2032
2033        vendor[appName].prepareFormulaToParse = (function(value) {
2034            var stringsInFormula = value.match(/".+?"|'.+?'/g);
2035
2036            if (stringsInFormula && stringsInFormula.length) {
2037                var clearValue = value.replace(/".+?"|'.+?'/g, '%STR%'),
2038                    index = 0;
2039
2040                clearValue = clearValue.toUpperCase();
2041                value = clearValue.replace(/%STR%/g, function(match) {
2042                    var val = match;
2043
2044                    if (index < stringsInFormula.length) {
2045                        val = stringsInFormula[index];
2046                        index++;
2047                    }
2048                    return val;
2049                });
2050            } else {
2051                value = value.toUpperCase();
2052            }
2053            return value;
2054        });
2055
2056        vendor[appName].Base64 = {
2057            _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
2058            encode: function(input) {
2059                var self = vendor[appName].Base64,
2060                    output = "",
2061                    i = 0,
2062                    chr1, chr2, chr3, enc1, enc2, enc3, enc4;
2063
2064                input = self._utf8_encode(input);
2065
2066                while (i < input.length) {
2067                    chr1 = input.charCodeAt(i++);
2068                    chr2 = input.charCodeAt(i++);
2069                    chr3 = input.charCodeAt(i++);
2070
2071                    enc1 = chr1 >> 2;
2072                    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
2073                    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
2074                    enc4 = chr3 & 63;
2075
2076                    if (isNaN(chr2)) {
2077                        enc3 = enc4 = 64;
2078                    } else if (isNaN(chr3)) {
2079                        enc4 = 64;
2080                    }
2081                    output = output +
2082                        self._keyStr.charAt(enc1) + self._keyStr.charAt(enc2) +
2083                        self._keyStr.charAt(enc3) + self._keyStr.charAt(enc4);
2084                }
2085
2086                return output;
2087            },
2088            // private method for UTF-8 encoding
2089            _utf8_encode: function(string) {
2090                string = string.replace(/\r\n/g, "\n");
2091                var utftext = "";
2092
2093                for (var n = 0; n < string.length; n++) {
2094
2095                    var c = string.charCodeAt(n);
2096
2097                    if (c < 128) {
2098                        utftext += String.fromCharCode(c);
2099                    } else if ((c > 127) && (c < 2048)) {
2100                        utftext += String.fromCharCode((c >> 6) | 192);
2101                        utftext += String.fromCharCode((c & 63) | 128);
2102                    } else {
2103                        utftext += String.fromCharCode((c >> 12) | 224);
2104                        utftext += String.fromCharCode(((c >> 6) & 63) | 128);
2105                        utftext += String.fromCharCode((c & 63) | 128);
2106                    }
2107
2108                }
2109
2110                return utftext;
2111            }
2112        };
2113
2114        vendor[appName].getClassesRegexp = (function() {
2115            return {
2116                color: /color\-([0-9a-f]{6})/,
2117                background: /bg\-([0-9a-f]{6})/,
2118                fontFamily: /ffamily\-([a-z_]+)/i,
2119                fontSize: /fsize\-([0-9]+)/
2120            }
2121        });
2122
2123        vendor[appName].setStylesToCell = (function(cell) {
2124            var $cell = cell instanceof jQuery ? cell : jQuery(cell),
2125                viewId = $cell.parents('.supsystic-table:first').data('view-id'),
2126                classes = this.getClassesRegexp(),
2127                cellClassNames = $cell.get(0).className,
2128                color = classes.color.exec(cellClassNames),
2129                background = classes.background.exec(cellClassNames),
2130                fontFamily = classes.fontFamily.exec(cellClassNames),
2131                fontSize = classes.fontSize.exec(cellClassNames);
2132
2133            if (null !== color) {
2134                $cell.css({
2135                    color: '#' + color[1]
2136                });
2137            }
2138            if (null !== background) {
2139                $cell.css({
2140                    backgroundColor: '#' + background[1]
2141                });
2142            }
2143            if (null !== fontFamily) {
2144                var family = fontFamily[1].replace(/_/g, ' '),
2145                    familyName = fontFamily[1].replace(/_/g, '+'),
2146                    familyString = '@import url("//fonts.googleapis.com/css?family=' 
2146+ familyName + '");';
2147
2148                if (g_stbStandartFontsList &&
2149                    toeInArray(family, g_stbStandartFontsList) == -1 &&
2150                    g_stbAllFontsList &&
2151                    toeInArray(family, g_stbAllFontsList) != -1
2152                ) {
2153                    var style = this.getFrontendCellStylesElem(viewId);
2154
2155                    if (style.text().indexOf(familyString) == -1) {
2156                        style.text(familyString + '\n' + style.text());
2157                    }
2158                }
2159                $cell.css({
2160                    fontFamily: family
2161                });
2162            }
2163            if (null !== fontSize) {
2164                var lineHeight = +fontSize[1] + 6;
2165                $cell.css({
2166                    fontSize: fontSize[1] + 'px',
2167                    lineHeight: lineHeight + 'px'
2168                });
2169            }
2170        });
2171
2172        vendor[appName].getAdminCellStylesElem = (function() {
2173            var $style = jQuery('#supsystic-tables-style');
2174
2175            if (!$style.length) {
2176                $style = jQuery('<style/>', {
2177                    id: 'supsystic-tables-style'
2178                });
2179                jQuery('head').append($style);
2180            }
2181            return $style;
2182        });
2183
2184        vendor[appName].getFrontendCellStylesElem = (function(viewId) {
2185            var $style = jQuery('#supsystic-table-' + viewId + '-css');
2186
2187            if (!$style.length) {
2188                $style = jQuery('<style/>', {
2189                    id: 'supsystic-table-' + viewId + '-css'
2190                });
2191                jQuery('head').append($style);
2192            }
2193            return $style;
2194        });
2195
2196        vendor[appName]._fixTableCaption = (function(captionHeight, viewId, counter) {
2197            if (counter < 0) return false;
2198
2199            // Fix for displaying of caption for tables with fixed columns
2200            var self = this,
2201                tableViewHtmlId = '#supsystic-table-' + viewId,
2202                fixedColumnsWrapper = jQuery(tableViewHtmlId + ' .DTFC_LeftWrapper, ' + tableViewHtmlId + ' .DTFC_RightWrapper');
2203
2204            if (fixedColumnsWrapper.length) {
2205                fixedColumnsWrapper.find('caption').css({
2206                    display: 'none'
2207                });
2208                fixedColumnsWrapper.css({
2209                    top: captionHeight + 'px'
2210                });
2211            } else {
2212                counter--;
2213                setTimeout(function() {
2214                    self._fixTableCaption(captionHeight, viewId, counter);
2215                }, 50);
2216            }
2217        });
2218
2219        vendor[appName]._getChunksArray = (function(arr, len) {
2220            var chunks = [],
2221                i = 0,
2222                n = arr.length;
2223
2224            while (i < n) {
2225                chunks.push(arr.slice(i, i += len));
2226            }
2227
2228            return chunks;
2229        });
2230
2231        vendor[appName]._checkOnClickPopups = (function($table) {
2232            // Integration with our PopUp plugin
2233            // Only after table was inited - we can do this, and only in that way it will work
2234            if (typeof(_ppsBindOnElementClickPopups) !== 'undefined' && $table && $table.size()) {
2235                var $bindedLinks = $table.find('[href*="#ppsShowPopUp_"].ppsClickBinded');
2236                if ($bindedLinks && $bindedLinks.size()) {
2237                    $bindedLinks.removeClass('ppsClickBinded').unbind('click');
2238                }
2239                _ppsBindOnElementClickPopups();
2240            }
2241        });
2242
2243        vendor[appName].setCellAttributes = function(cells) {
2244            var colspan, rowspan;
2245            for (var i = 0; i < cells.length; i++) {
2246                if (cells[i].getAttribute('data-hide')) {
2247                    cells[i].style.display = 'none';
2248                }
2249                if (colspan = cells[i].getAttribute('data-colspan')) {
2250                    if (colspan > 1) {
2251                        cells[i].setAttribute('colspan', colspan);
2252                        jQuery(cells[i]).attr('colspan', colspan);
2253                    }
2254                }
2255                if (rowspan = cells[i].getAttribute('data-rowspan')) {
2256                    if (rowspan > 1) {
2257                        cells[i].setAttribute('rowspan', rowspan);
2258                    }
2259                }
2260            }
2261        };
2262    }
2263
2264}(window.supsystic = window.supsystic || {}, window.jQuery, window));
2265
2266// For compatibility to old PRO versions
2267function classesRegexp() {
2268    return window.supsystic.Tables.getClassesRegexp();
2269}
2270
2271function getAdminCellStylesElem() {
2272    return window.supsystic.Tables.getAdminCellStylesElem();
2273}
2274
2275/**
2276 * We will not use just jQUery.inArray because it is work incorrect for objects
2277 * @return mixed - key that was found element or -1 if not
2278 */
2279function toeInArray(needle, haystack) {
2280    if (typeof(haystack) == 'object') {
2281        for (var k in haystack) {
2282            if (haystack[k] == needle)
2283                return k;
2284        }
2285    } else if (typeof(haystack) == 'array') {
2286        return jQuery.inArray(needle, haystack);
2287    }
2288    return -1;
2289}
2290
2291(function($) {
2292    /**
2293     * Detects whether element can be scrolled vertically.
2294     * @this jQuery
2295     * @return {boolean}
2296     */
2297    jQuery.fn.isVerticallyScrollable = function() {
2298        if (this.scrollTop()) {
2299            // Element is already scrolled, so it is scrollable
2300            return true;
2301        } else {
2302            // Test by actually scrolling
2303            this.scrollTop(1);
2304
2305            if (this.scrollTop()) {
2306                // Scroll back
2307                this.scrollTop(0);
2308                return true;
2309            }
2310        }
2311        return false;
2312    };
2313
2314    /**
2315     * Detects whether element can be scrolled horizontally.
2316     * @this jQuery
2317     * @return {boolean}
2318     */
2319    jQuery.fn.isHorizontallyScrollable = function() {
2320        if (this.scrollLeft()) {
2321            // Element is already scrolled, so it is scrollable
2322            return true;
2323        } else {
2324            // Test by actually scrolling
2325            this.scrollLeft(1);
2326
2327            if (this.scrollLeft()) {
2328                // Scroll back
2329                this.scrollLeft(0);
2330                return true;
2331            }
2332        }
2333        return false;
2334    };
2335
2336    jQuery.extend(jQuery.expr.pseudos || jQuery.expr[":"], {
2337        "vertically-scrollable": function(a, i, m) {
2338            return jQuery(a).isVerticallyScrollable();
2339        },
2340        "horizontally-scrollable": function(a, i, m) {
2341            return jQuery(a).isHorizontallyScrollable();
2342        }
2343    });
2344
2345    jQuery.fn.removeStyle = function(style) {
2346        var search = new RegExp(style + '[^;]+;?', 'g');
2347
2348        return this.each(function() {
2349            jQuery(this).attr('style', function(i, style) {
2350                return style && style.replace(search, '');
2351            });
2352        });
2353    };
2354
2355    if (!Array.from) {
2356        // Fix of compatibility with IE browser to use ES6 feature
2357        Array.from = (function() {
2358            var toStr = Object.prototype.toString;
2359            var isCallable = function(fn) {
2360                return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
2361            };
2362            var toInteger = function(value) {
2363                var number = Number(value);
2364                if (isNaN(number)) {
2365                    return 0;
2366                }
2367                if (number === 0 || !isFinite(number)) {
2368                    return number;
2369                }
2370                return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
2371            };
2372            var maxSafeInteger = Math.pow(2, 53) - 1;
2373            var toLength = function(value) {
2374                var len = toInteger(value);
2375                return Math.min(Math.max(len, 0), maxSafeInteger);
2376            };
2377
2378            // The length property of the from method is 1.
2379            return function from(arrayLike /*, mapFn, thisArg */ ) {
2380                // 1. Let C be the this value.
2381                var C = this;
2382
2383                // 2. Let items be ToObject(arrayLike).
2384                var items = Object(arrayLike);
2385
2386                // 3. ReturnIfAbrupt(items).
2387                if (arrayLike == null) {
2388                    throw new TypeError('Array.from requires an array-like object - not null or undefined');
2389                }
2390
2391                // 4. If mapfn is undefined, then let mapping be false.
2392                var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
2393                var T;
2394                if (typeof mapFn !== 'undefined') {
2395                    // 5. else
2396                    // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
2397                    if (!isCallable(mapFn)) {
2398                        throw new TypeError('Array.from: when provided, the second argument must be a function');
2399                    }
2400
2401                    // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
2402                    if (arguments.length > 2) {
2403                        T = arguments[2];
2404                    }
2405                }
2406
2407                // 10. Let lenValue be Get(items, "length").
2408                // 11. Let len be ToLength(lenValue).
2409                var len = toLength(items.length);
2410
2411                // 13. If IsConstructor(C) is true, then
2412                // 13. a. Let A be the result of calling the [[Construct]] internal method
2413                // of C with an argument list containing the single item len.
2414                // 14. a. Else, Let A be ArrayCreate(len).
2415                var A = isCallable(C) ? Object(new C(len)) : new Array(len);
2416
2417                // 16. Let k be 0.
2418                var k = 0;
2419                // 17. Repeat, while k < len… (also steps a - h)
2420                var kValue;
2421                while (k < len) {
2422                    kValue = items[k];
2423                    if (mapFn) {
2424                        A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
2425                    } else {
2426                        A[k] = kValue;
2427                    }
2428                    k += 1;
2429                }
2430                // 18. Let putStatus be Put(A, "length", len, true).
2431                A.length = len;
2432                // 20. Return A.
2433                return A;
2434            };
2435        }());
2436    }
2437}(jQuery));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.