1'use strict'; 2var JwTplJsLibNoli = (function(){ 3 var 4 appName = 'JwTplJsLibNoli', 5 appId = 'noli-2', 6 appVersion = 1, 7 firstCall = false, 8 migration = true, 9 emptyValue = 'noAds', 10 noliItemClass = 'jwtpl-gc-noliitem', 11 markedClass = 'jwtpl-gc-nolimarked', 12 idRegex = new RegExp("([0-9]+)\.html"), 13 blockRegex = new RegExp("jwtpl-([a-z0-9]+)-block"), 14 itemRegex = new RegExp("jwtpl-gc-noliitem([0-9]+)"), 15 emptyList = new RegExp(/{"(.*?)":{"order":\[\]}}/), 16 maxEntries = 50, 17 defaultMsg = '<p class="jwtpl-sysNoli-noItem">Mit Klick auf einen Stern in der Trefferliste können Sie sich die Anzeige merken</p>', 18 _api = false; 19 20 if (typeof JwTplJsLib == "object") { 21 _api = JwTplJsLib; 22 } 23 24 if(_api !== false) { 25 function touch() { 26 if(firstCall === false){ 27 firstCall = true; 28 if(_api.getLcItem(appId) === false) { 29 _api.setLcItem(appId, emptyValue); 30 } 31 } 32 } 33 34 function getId(url) { 35 var match = idRegex.exec(url); 36 if(_api.type(match) === 'Array' && match.length > 1){ 37 return match[1]; 38 } else { 39 return false; 40 } 41 } 42 43 function checkData(url, title, date, adv, loc) { 44 var 45 datum = 'Keine Angabe', 46 advetiser = 'Keine Angabe', 47 location = 'Keine Angabe', 48 json = {}; 49 50 51 if(_api.isString(url) === false){ 52 JwTplJsLibNoli.printErrorMsg(".checkData(url, title, date, adv, loc) - url must be a string type, [" + _api.type(url) + "] given instead"); 53 return false; 54 } else { 55 json['url'] = url; 56 } 57 58 if(_api.isString(title) === false){ 59 JwTplJsLibNoli.printErrorMsg(".checkData(url, title, date, adv, loc) - title must be a string type, [" + _api.type(title) + "] given instead"); 60 return false; 61 } else { 62 json['title'] = title; 63 } 64 65 if(_api.type(date) === 'String' && date.length > 0){ 66 json['date'] = date; 67 } else { 68 json['date'] = datum; 69 } 70 71 if(_api.type(adv) === 'String' && adv.length > 0){ 72 json['adv'] = adv; 73 } else { 74 json['adv'] = advetiser; 75 } 76 77 if(_api.type(loc) === 'String' && loc.length > 0){ 78 json['loc'] = loc; 79 } else { 80 json['loc'] = location; 81 } 82 83 json['addon'] = ''; 84 json['advUrl'] = ''; 85 json['br'] = ''; 86 json['company-profile-url'] = ''; 87 json['companyTitleText'] = ''; 88 json['logo'] = ''; 89 json['param'] = ''; 90 json['pt'] = ''; 91 92 return json; 93 } 94 95 function migrate(){ 96 var storage = _api.getLcItem(appId); 97 if(storage !== false){ 98 var 99 lcItem, 100 json = _api.jsonParse(storage), 101 reverse = Object.keys(json).reverse(); 102 103 for(var i = reverse.length - 1; i > 0; i--){ 104 delete json[reverse[i]]; 105 } 106 107 lcItem = _api.jsonStringify(json); 108 109 if(lcItem !== false) { 110 _api.setLcItem(appId, lcItem); 111 return true; 112 } else { 113 JwTplJsLibNoli.printErrorMsg(".migrate() - cannot stringify object. migration fails"); 114 return false; 115 } 116 } 117 } 118 119 function getModData(eventData) { 120 if(_api.isString(eventData.modName) !== false) { 121 var 122 data, 123 func = eventData.modName + '_getNoliData'; 124 125 try { 126 data = window[_api.getBaseName()][func](eventData); 127 return data; 128 } catch(e){ 129 return ".getModData (eventData) - can not call function [" + func + "] from namespace [" + _api.getBaseName() + "] err: " + e; 130 } 131 } else { 132 return ".getModData (eventData) - eventData.modName must be a string type, [" + _api.type(modName) + "] given instead"; 133 } 134 } 135 136 function entryExists(id){ 137 if(_api.isString(id) === false){ 138 JwTplJsLibNoli.printErrorMsg('.doNoli(eventData) - id must be a string type, [' + _api.type(id) + '] given instead'); 139 return ''; 140 } 141 var 142 match = false, 143 noli = JwTplJsLibNoli.getNoli(); 144 145 for (var index in noli) { 146 if(index === id) { 147 match = true; 148 break; 149 } 150 } 151 152 return match; 153 } 154 155 function doNoli (eventData) { 156 if(_api.type(eventData) === 'Object'){ 157 if(_api.type(eventData.id) !== undefined && _api.type(eventData.cssClass) !== undefined && _api.type(eventData.modName) !== undefined){ 158 touch(); 159 var lcItem = _api.getLcItem(appId); 160 161 if(lcItem === emptyValue) { 162 var result = getModData(eventData); 163 164 if(_api.isArray(result) === true && result.length == 5){ 165 var added = JwTplJsLibNoli.addNoli(result[0], result[1], result[2], result[3], result[4]); 166 if(added === true){ 167 JwTplJsLibNoli.markNoli(eventData.cssClass); 168 } 169 170 } else { 171 JwTplJsLibNoli.printErrorMsg('.doNoli(eventData) - getModData must return an array with 5 entries'); 172 return false; 173 } 174 } else { 175 var json = _api.jsonParse(lcItem); 176 if(json !== false){ 177 if(_api.type(json[appVersion]) !== undefined){ 178 var match = entryExists(eventData.id); 179 180 if(match === true) { 181 var removed = JwTplJsLibNoli.removeNoli(eventData.id); 182 if(removed === true){ 183 JwTplJsLibNoli.unmarkNoli(eventData.cssClass); 184 } 185 } else { 186 var result = getModData(eventData); 187 if(_api.isArray(result) === true && result.length == 5){ 188 var added = JwTplJsLibNoli.addNoli(result[0], result[1], result[2], result[3], result[4]); 189 190 if(added === true){ 191 JwTplJsLibNoli.markNoli(eventData.cssClass); 192 } 193 194 } else { 195 JwTplJsLibNoli.printErrorMsg('.doNoli(eventData) - getModData must return an array with 5 entries') 196 return false; 197 } 198 } 199 } else { 200 var result = getModData(eventData); 201 if(_api.isArray(result) === true && result.length == 5){ 202 var added = JwTplJsLibNoli.addNoli(result[0], result[1], result[2], result[3], result[4]); 203 204 if(added === true){ 205 JwTplJsLibNoli.markNoli(eventData.cssClass); 206 } 207 208 } else { 209 JwTplJsLibNoli.printErrorMsg('.doNoli(eventData) - getModData must return an array with 5 entries') 210 return false; 211 } 212 } 213 214 } else { 215 JwTplJsLibNoli.printErrorMsg(".doNoli() - cannot parse string to json"); 216 return false; 217 } 218 } 219 } else { 220 JwTplJsLibNoli.printErrorMsg(".doNoli(eventData) - must contain proprties: id, ccsClass, modName") 221 return false; 222 } 223 } else { 224 JwTplJsLibNoli.printErrorMsg(".doNoli(eventData) - must be a object type, [" + _api.type(eventData) + "] given instead") 225 return false; 226 } 227 } 228 229 return { 230 getNoli: function(){ 231 if(_api.getLcItem(appId) === false){ 232 this.printErrorMsg(".getNoli() - localStorage entry for [" + appId + "] doesnt exists, try to add items"); 233 return false; 234 } 235 236 var 237 json, 238 noli = _api.getLcItem(appId); 239 240 if(noli !== false) { 241 if(noli === 'noAds'){ 242 return false; 243 } else { 244 json = _api.jsonParse(noli); 245 if(json !== false){ 246 if(_api.type(json[appVersion]) !== undefined){ 247 if(Object.entries(json[appVersion]).length == 0){ 248 return false; 249 } else { 250 return json[appVersion]; 251 } 252 } else { 253 this.printErrorMsg(".getNoli() - no entries found for version = [" + appVersion +"], try to add items"); 254 return false; 255 } 256 257 } else { 258 this.printErrorMsg(".getNoli() - cannot parse string to json"); 259 return false; 260 } 261 } 262 } else { 263 return false; 264 } 265 }, 266 267 addNoli: function(url, title, date, adv, loc) { 268 var job = checkData(url, title, date, adv, loc); 269 270 if(_api.type(job) === false){ 271 JwTplJsLibNoli.printErrorMsg(".addNoli(url, title, date, adv, loc) - " + job); 272 return false; 273 } 274 275 var id = getId(job.url); 276 277 if(id === false) { 278 JwTplJsLibNoli.printErrorMsg(".addNoli(url, title, date, adv, loc) - url must contain [0-9]+\.html$ pattern"); 279 return false; 280 } 281 282 var storage = _api.getLcItem(appId); 283 284 if(storage === emptyValue) { 285 var 286 ts, 287 lcItem, 288 order = [], 289 entry = {}, 290 vc = {}; 291 292 ts = new Date().getTime(); 293 job['ts'] = ts; 294 entry[id] = job; 295 vc[appVersion] = entry; 296 order.push(id); 297 Object.defineProperty(vc[appVersion], "order", {value : order, writable : true, enumerable : true, configurable : true}); 298 lcItem = _api.jsonStringify(vc); 299 300 if(lcItem !== false) { 301 _api.setLcItem(appId, lcItem); 302 return true; 303 } else { 304 JwTplJsLibNoli.printErrorMsg(".addNoli(url, title, date, adv, loc) - cannot stringify object"); 305 return false; 306 } 307 } else { 308 var entry = _api.jsonParse(storage); 309 if(entry !== false){ 310 if(_api.type(entry[appVersion]) !== undefined){ 311 if(_api.len(entry[appVersion]) > maxEntries) { 312 JwTplJsLibNoli.printErrorMsg('.addNoli(url, title, date, adv, loc) - maximum of [' + maxEntries + '] entries reached'); 313 return false; 314 } 315 316 var match = entryExists(id); 317 if(match === false){ 318 var 319 ts, 320 lcItem, 321 order = {}; 322 323 ts = new Date().getTime(); 324 job['ts'] = ts; 325 entry[appVersion]['order'].push(id); 326 entry[appVersion][id] = job; 327 lcItem = _api.jsonStringify(entry); 328 329 if(lcItem !== false) { 330 _api.setLcItem(appId, lcItem); 331 } else { 332 JwTplJsLibNoli.printErrorMsg(".addNoli(url, title, date, adv, loc) - cannot stringify object"); 333 return false; 334 } 335 336 } else { 337 JwTplJsLibNoli.printErrorMsg(".addNoli(url, title, date, adv, loc) - item with id=[" + id + "] is already stored"); 338 return false; 339 } 340 } else { 341 var 342 ncMerge, 343 vc = {}, 344 newEntry = {}; 345 346 entry = _api.jsonParse(storage); 347 job['ts'] = new Date().getTime(); 348 newEntry[id] = job; 349 vc[appVersion] = newEntry; 350 ncMerge = Object.assign(entry, vc); 351 352 item = _api.jsonStringify(ncMerge); 353 354 if(item !== false) { 355 _api.setLcItem(appId, item); 356 if(migration === true) { 357 migrate(); 358 } 359 return true; 360 } else { 361 JwTplJsLibNoli.printErrorMsg(".addNoli(url, title, date, adv, loc) - cannot stringify object"); 362 return false; 363 } 364 } 365 366 } else { 367 JwTplJsLibNoli.printErrorMsg(".addNoli(url, title, date, adv, loc) - cannot parse string to json"); 368 return false; 369 } 370 return true; 371 } 372 373 }, 374 375 removeNoli: function (id){ 376 if(_api.isString(id) == false){ 377 JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - url must be a string type, [" + _api.type(id) + "] given instead"); 378 return false; 379 } 380 381 if(_api.getLcItem(appId) === false){ 382 JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - localStorage entry for [" + appId + "] doesnt exists, try to add items"); 383 return false; 384 } 385 386 var 387 json, 388 noli = _api.getLcItem(appId); 389 390 if(noli !== false) { 391 if(noli === 'noAds'){ 392 JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - no noli items to remove, is empty"); 393 return false; 394 } 395 } 396 397 var 398 json, 399 orderEntry, 400 entry = _api.getLcItem(appId); 401 402 json = _api.jsonParse(entry); 403 404 if(json !== false){ 405 if(_api.type(json[appVersion]) !== undefined){ 406 if(_api.type(json[appVersion][id]) === undefined){ 407 JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - item with id=[" + id + "] doesnt exist or already deleted"); 408 return false; 409 } 410 411 if(_api.isArray(json[appVersion]['order']) === false){ 412 JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - there is no array for the sequence"); 413 return false; 414 } else if(_api.isArray(json[appVersion]['order']) === true && json[appVersion]['order'].length == 0) { 415 JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - there is no order sequence for that list"); 416 return false; 417 } 418 419 var 420 order = [], 421 delEntry = delete json[appVersion][id]; 422 423 if(delEntry === true){ 424 for(var i=0; i<json[appVersion]['order'].length; i++){ 425 if(json[appVersion]['order'][i] !== id){ 426 order.push(json[appVersion]['order'][i]); 427 } 428 } 429 json[appVersion]['order'] = order; 430 var lcItem = _api.jsonStringify(json); 431 432 if(lcItem !== false) { 433 var match = emptyList.exec(lcItem); 434 if(match !== null){ 435 _api.setLcItem(appId, emptyValue); 436 } else { 437 _api.setLcItem(appId, lcItem); 438 } 439 return true; 440 } else { 441 JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - cannot stringify object"); 442 return false; 443 } 444 } else { 445 JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - cannot be deleted for id=[" + id + "]"); 446 return false; 447 } 448 } else { 449 JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - no entries found for version =[" + appVersion + "], try to add items"); 450 return false; 451 } 452 453 } else { 454 JwTplJsLibNoli.printErrorMsg(".removeNoli(id) - cannot parse string to json"); 455 return false; 456 }; 457 }, 458 459 clearNoli :function(){ 460 if(_api.getLcItem(appId) === false){ 461 this.printErrorMsg(".removeNoliJob(job) - localStorage entry for [" + appId + "] doesnt exists, try to add items"); 462 return false; 463 } else { 464 _api.setLcItem(appId, emptyValue); 465 return true; 466 } 467 }, 468 469 refreshNoli: function(reverse){ 470 var refreshItems = this.getNoli(); 471 if(_api.isObject(refreshItems) === true){ 472 var 473 markedItems = [], 474 keys = Object.keys(refreshItems); 475 476 _api.each(keys, function(item){ 477 markedItems.push(' .' + noliItemClass + item ); 478 });
479 480 markedItems = markedItems.join(); 481 482 if(_api.isString(markedItems) === true){ 483 if(_api.isString(reverse) === true && reverse === 'reverse'){ 484 var toUnMark = _api.get(markedItems); 485 if(toUnMark.length > 0){ 486 _api.each(toUnMark, function(item){ 487 _api.removeClass(item, markedClass); 488 }); 489 } 490 } else { 491 var toMark = _api.get(markedItems); 492 if(toMark.length > 0){ 493 _api.each(toMark, function(item){ 494 _api.addClass(item, markedClass); 495 }); 496 } 497 } 498 } else { 499 this.printErrorMsg('.refreshNoli() - markedItems must be a not empty string'); 500 } 501 } else { 502 this.printErrorMsg('.refreshNoli() - no items to refresh'); 503 } 504 }, 505 506 renderNoli: function(){ 507 var noli = this.getNoli(); 508 this.noliMetrics(); 509 if(noli !== false) { 510 if(_api.type(noli['order']) === 'Array') { 511 var 512 orderReverse = noli['order'], 513 noliRender = ''; 514 515 _api.each(orderReverse.reverse(), function(orderEntry){ 516 if(_api.isNull(noli[orderEntry]) === false && _api.isObject(noli[orderEntry])=== true){ 517 var 518 entry, deleteIcon, link, title, date, company, location; 519 520 title = _api.assignTpl({ 521 'tag': 'div', 522 'tagData': noli[orderEntry]['title'], 523 'tagAttr': { 524 'class': 'jwtpl-sysNoli-title' 525 } 526 });
527 528 link = _api.assignTpl({ 529 'tag': 'a', 530 'tagData': title, 531 'tagAttr': { 532 'class': 'jwtpl-sysNoli-url', 533 'href': noli[orderEntry]['url'], 534 'target': _api.getAppGenAsInt() >= 2 ? '_self' : '_blank' 535 } 536 }); 537 538 date = _api.assignTpl({ 539 'tag': 'div', 540 'tagData': noli[orderEntry]['date'], 541 'tagAttr': { 542 'class': 'jwtpl-sysNoli-date' 543 } 544 }); 545 546 company = _api.assignTpl({ 547 'tag': 'div', 548 'tagData': noli[orderEntry]['adv'], 549 'tagAttr': { 550 'class': 'jwtpl-sysNoli-company' 551 } 552 }); 553 554 location = _api.assignTpl({ 555 'tag': 'div', 556 'tagData': noli[orderEntry]['loc'], 557 'tagAttr': { 558 'class': 'jwtpl-sysNoli-location' 559 } 560 }); 561 562 deleteIcon = _api.assignTpl({ 563 'tag': 'span', 564 'tagData': "", 565 'tagAttr': { 566 'class': 'jwtpl-sysNoli-delete', 567 'data-jwtpl-sys-noliid': orderEntry 568 } 569 });
570 571 entry = _api.assignTpl({ 572 'tag': 'div', 573 'tagData': deleteIcon + link + date + company + location, 574 'tagAttr': { 575 'class': 'jwtpl-sysNoli-item' 576 } 577 }); 578 noliRender += entry; 579 } 580 }); 581 582 noliRender = _api.parseHTML(noliRender); 583 if(_api.type(noliRender) === 'HTMLCollection') { 584 var body = _api.get('body'); 585 if(body.length > 0){ 586 _api.event(body[0], 'click', function(e){ 587 if(_api.hasClass(e.target, 'jwtpl-sysNoli-delete') === true) { 588 var delTarget = e.target; 589 if(delTarget.hasAttribute('data-jwtpl-sys-noliid') === true){ 590 var advId = delTarget.getAttribute('data-jwtpl-sys-noliid'); 591 if(_api.isString(advId) !== false){ 592 var delItem = delTarget.parentElement; 593 if(_api.isNull(delItem) === false){ 594 var itemList = delItem.parentElement; 595 if(_api.isNull(itemList) === false){ 596 itemList.removeChild(delItem); 597 JwTplJsLibNoli.removeNoli(advId); 598 JwTplJsLibNoli.unmarkNoli(noliItemClass + advId); 599 JwTplJsLibNoli.noliMetrics(); 600 if(itemList.children.length == 0) { 601 itemList.innerHTML = JwTplJsLibNoli.getDefaultMsg(); 602 } 603 } else { 604 JwTplJsLibNoli.printErrorMsg('.renderNoli() - no jwtpl-sysNoli-itemList found. error'); 605 return false; 606 } 607 } else { 608 JwTplJsLibNoli.printErrorMsg('.renderNoli() - no jwtpl-sysNoli-item found. error'); 609 return false; 610 } 611 } else { 612 JwTplJsLibNoli.printErrorMsg('.renderNoli() - [data-jwtpl-sys-noliid] attribute must be a string type on [jwtpl-sysNoli-delete] Element'); 613 return false; 614 } 615 } else { 616 JwTplJsLibNoli.printErrorMsg('.renderNoli() - no [data-jwtpl-sys-noliid] attribute found on [jwtpl-sysNoli-delete] Element'); 617 return false; 618 } 619 } 620 });
621 return noliRender; 622 } else { 623 this.printErrorMsg('.renderNoli() - no body tag found. error'); 624 return false; 625 } 626 } else { 627 this.printErrorMsg('.renderNoli() - cannot parse given html. error'); 628 return false; 629 } 630 } else { 631 this.printErrorMsg('.renderNoli() - order prop must be an array type, [' + _api.type(noli['order']) + '] given instead'); 632 return false; 633 } 634 } else { 635 return false; 636 } 637 }, 638 639 markNoli: function(cssClass) { 640 var toMark = _api.get('.' + cssClass); 641 if(toMark.length > 0){ 642 _api.each(toMark, function(item){ 643 _api.addClass(item, markedClass); 644 }); 645 } 646 }, 647 648 unmarkNoli: function(cssClass) { 649 var toUnmark = _api.get('.' + cssClass); 650 if(toUnmark.length > 0){ 651 _api.each(toUnmark, function(item){ 652 _api.removeClass(item, markedClass); 653 }); 654 } 655 }, 656 657 noliMetrics: function(){ 658 var metrics = _api.get('[data-jwtpl-sys-nolisize], [data-jwtpl-sys-nolisizemax]'); 659 if(metrics.length > 0){ 660 _api.each(metrics, function(ele){ 661 if(ele.hasAttribute('data-jwtpl-sys-nolisize') === true && ele.hasAttribute('data-jwtpl-sys-nolisizemax') === true){ 662 var 663 min = ele.getAttribute('data-jwtpl-sys-nolisize'), 664 max = ele.getAttribute('data-jwtpl-sys-nolisizemax'); 665 666 ele.setAttribute('data-jwtpl-sys-nolisize', JwTplJsLibNoli.getNoliSize()); 667 ele.setAttribute('data-jwtpl-sys-nolisizemax', JwTplJsLibNoli.getNoliSizeMax()); 668 } 669 }); 670 } 671 }, 672 673 initNoli: function() { 674 var 675 refresh, 676 noliMods = document.querySelectorAll('.jwtpl-gc-noli'); 677 678 if(noliMods.length > 0){ 679 _api.each(noliMods, function(item){ 680 if(_api.type(item.classList.value) !== undefined){ 681 var modName = blockRegex.exec(item.classList.value); 682 if(modName.length == 2){ 683 modName = modName[1]; 684 var noliItems = item.querySelectorAll("[class*='jwtpl-gc-noliitem']"); 685 if(noliItems.length > 0){ 686 _api.each(noliItems, function(item){ 687 if(_api.type(item.classList.value) !== undefined){ 688 var match = itemRegex.exec(item.classList.value); 689 if(_api.type(match) !== undefined && match.length == 2){ 690 _api.event(item, 'click', function(e){ 691 692 var 693 noliBox = _api.get('.jwtpl-sysNoli-block'); 694 695 if(noliBox.length > 0) { 696 _api.each(noliBox, function(item){ 697 if(_api.hasClass(item, 'open') === true) { 698 _api.removeClass(item, 'open'); 699 _api.hide(item); 700 } 701 702 if(_api.hasClass(item, 'fadeIn') === true) { 703 _api.removeClass(item, 'fadeIn'); 704 _api.addClass(item, 'jwtpl-gc-hidden1'); 705 } 706 }); 707 } 708 709 e.preventDefault(); 710 e.stopPropagation(); 711 var data = {}; 712 data["cssClass"] = match[0], 713 data["id"] = match[1], 714 data["trigger"] = this; 715 data["modName"] = modName; 716 doNoli(data); 717 }); 718 } 719 } 720 }); 721 } 722 } 723 } 724 }); 725 } 726 }, 727 728 getDefaultMsg: function(){ 729 return defaultMsg; 730 }, 731 732 getNoliSize: function(){ 733 return this.getNoli() !== false ? _api.len(this.getNoli()) - 1 : 0; 734 }, 735 736 getNoliSizeMax: function(){ 737 return maxEntries; 738 }, 739 740 printErrorMsg :function(msg){ 741 if (_api.isLocalHost() === true) { 742 if(_api.type(msg) === 'String' && msg.length > 0){ 743 console.log("%c" + appName + msg, "color: #ce0000;"); 744 } 745 } 746 } 747 } 748 } else { 749 return { 750 getNoli: function() { return false; }, 751 addNoli: function() { return false; }, 752 removeNoli: function() { return false; }, 753 clearNoli: function() { return false; }, 754 refreshNoli: function() { return false; }, 755 markNoli: function() { return false; }, 756 unmarkNoli: function() { return false; }, 757 renderNoli: function() {return false;}, 758 initNoli: function() { return false; }, 759 getDefaultMsg: function() {return defaultMsg;}, 760 getNoliSize: function(){return 0}, 761 getNoliSizeMax: function(){return maxEntries;}, 762 printErrorMsg: function(){ return false; } 763 } 764 } 765})();
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.