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('&'); 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('&'); 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.