1/****************************************** 2 Name: TabStrip Module 3 Author: Zerry Hogan 4 Version: 1.0.0 5 Last Updated: 2/1/2018 6*******************************************/ 7; 8 9(function(window, document, i, undefined) { 10 "use strict"; 11 12 (function() { 13 /*Polyfill for Custom Event API in Internet Explorer 9+*/ 14 if (typeof window.CustomEvent === "function") return false; 15 16 function CustomEvent(event, params) { 17 params = params || { 18 bubbles: false, 19 cancelable: false, 20 detail: undefined 21 }; 22 var evt = document.createEvent('CustomEvent'); 23 evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); 24 return evt; 25 } 26 27 CustomEvent.prototype = window.Event.prototype; 28 29 window.CustomEvent = CustomEvent; 30 })(); 31 32 function Observer(sender) { 33 if (!(this instanceof Observer)) { 34 return new Observer(sender); 35 } 36 this._sender = sender; 37 this._listeners = []; 38 } 39 40 Observer.prototype = { 41 attach: function(listener) { 42 this._listeners.push(listener) 43 }, 44 notify: function(args) { 45 var index; 46 47 for (index = 0; index < this._listeners.length; index++) { 48 this._listeners[index](this._sender, args) 49 } 50 } 51 } 52 53 // Create the defaults once 54 var defaults = { 55 mobileBreakPoint: 700, 56 tabNamespace: "eztabs", 57 panelNamespace: "eztabs__panel", 58 accordionNamespace: "eztabs__accordion", 59 activeTabClass: "eztabs__tab--active", 60 activePanelClass: "eztabs__panels--visible", 61 activeAccordionClass: "eztabs__accordion--active", 62 mobileClass: "eztabs--mobile" 63 }, 64 editTabsWrapper = '<ul class="eztabs__tabs__editors"></ul>', 65 newTabHTML = '<li class="eztabs__tab" tabindex="0" role="tab"><span class="eztabs__tab__deleteBtn ion-trash-a" title="Delete this tab?"></span><span>Enter Text Here</span></li>', 66 newPanelHTML = '<div class="eztabs__panels" role="tabpanel"><div class="eztabs__panels__inner clearfix"> NEW TAB </div></div>', 67 newAccordionHTML = "<div class='eztabs__accordion' data-index=''><div class='eztabs__accordion__inner'>Enter Text Here</div></div>", 68 tabToolTip = "", 69 urlParameters = ezUtilities.getURLParameters(); 70 71 var ezTabs = function(element) { 72 if (!(this instanceof ezTabs)) { 73 return new ezTabs(element); 74 } 75 var tabstrips = $(element); 76 if (!tabstrips.length) return; 77 if (tabstrips.length > 1) { 78 tabstrips.each(function() { 79 new ezTabs(this); 80 i++; 81 }); 82 return; 83 } 84 85 var _ = this; 86 87 //Cached Dom Elements 88 _.element = $(element)[0]; 89 _.$element = $(element); 90 _.$nav = _.$element.children(".eztabs__tabs__wrapper").children(".eztabs__tabs"); 91 _.$navPanels = _.$element.children(".eztabs__panels__wrapper"); 92 _.$tabs = _.$nav.children(".eztabs__tab"); 93 _.$panels = _.$navPanels.children(".eztabs__panels"); 94 _.$accordions = null; 95 _.$editTab = _.$nav.children(".eztabs__tabs__editors").find(".eztabs__tab--create"); 96 _.$deleteTab = _.$nav.children(".eztabs__tabs__editors").find(".eztabs__tab--delete"); 97 98 //Data Variables 99 _.options = { 100 "mode": _.$element.attr("data-mode"), 101 "startTab": _.$element.attr("data-start") 102 }; 103 _.id = _.$element.attr("id"); 104 _.index = i; 105 _.numberOfTabs = _.$tabs.length; 106 _.settings = $.extend({}, defaults, _.options); 107 _._activeTab = _.options.startTab || 0; 108 _._windowWidth = window.innerWidth; 109 _._name = "TabStrip" + (i + 1); 110 _._tabNames = []; 111 112 //Events 113 _._tabWasCreatedEvent = new Observer(_); 114 _._tabOrderChangedEvent = new Observer(_); 115 _._tabWasClickedEvent = new Observer(_); 116 _._tabNameChangedEvent = new Observer(_); 117 _._tabWillDeleteEvent = new Observer(_); 118 _._tabWasDeletedEvent = new Observer(_); 119 _._tabWillBeCreatedEvent = new Observer(_); 120 _._tabWasOpened = new Observer(_); 121 122 //Private Methods 123 _._accordionActivated = function(e) { 124 e.preventDefault(); 125 126 var index = $(this).attr("data-index"); 127 var tab = _.$tabs.eq(index); 128 var panel = $(tab[0].panel); 129 var accordion = $(tab[0].accordion); 130 if (index == _._activeTab) { 131 _._closeAll(); 132 } else { 133 _._activeTab = index; 134 _._showTab(index); 135 _._showPanel(panel); 136 _._showAccordion(accordion); 137 138 _._tabWasClickedEvent.notify(); //Let listeners know tab was clicked 139 } 140 } 141 142 _._addTooltip = function(tab) { 143 var tooltip = $("<div class='eztooltip__icon'></div>") 144 $(tab).addClass("eztooltip__content").children().wrap(tooltip); 145 $(tab).append("<div class='eztooltip__message'>Double click to rename</div>") 146 } 147 148 _._addTooltipsToTabs = function() { 149 _.$tabs.each(function(i) { 150 _._addTooltip(this) 151 }); 152 } 153 154 _._attachPanelsToTab = function() { 155 //stores a reference to each tabs panel and accordion 156 //Makes it easy to keep track of them when deleting and reordering 157 _.$tabs.each(function(i) { 158 _._makePanelReference(this, i) 159 }); 160 } 161 162 _._buildAccordions = function() { 163 _.$panels.each(function(i) { 164 _._makeTabAccordion(this, i); 165 }); 166 } 167 168 _._prepareTabCreation = function(e) { 169 _._triggerSaving(); 170 var order = _._getTabsOrder(); 171 order.push("Enter Text Here"); 172 _._tabWillBeCreatedEvent.notify({ 173 order: order 174 }); 175 } 176 177 _._requestTabDeletion = function(e) { 178 var tab = _.$nav.find(".eztabs__tab--active"); 179 var name = tab.find(".eztabs__tab__name").text(); 180 var order = _._getTabsOrder(); 181 _._triggerSaving(); 182 _._tabWillDeleteEvent.notify({ 183 tab: tab, 184 order: order, 185 tabIndex: tab.index(), 186 tabName: name 187 }); 188 } 189 190 _._closeAll = function(e) { 191 _.$tabs 192 .removeClass(defaults.activeTabClass) 193 .attr({ 194 "aria-selected": "false", 195 "tabindex": "0" //kevin was -1 196 }); 197 _.$panels.removeClass(defaults.activePanelClass).attr("aria-hidden", "true"); 198 _.$accordions.removeClass(defaults.activeAccordionClass); 199 _._activeTab = null; 200 } 201 202 _._createNewTab = function(e) { 203 var newTab = $(newTabHTML); 204 var newPanel = $(newPanelHTML); 205 var newAccordion = $(newAccordionHTML); 206 _.$nav.append(newTab); 207 var i = newTab.index(); 208 _.$navPanels.append(newPanel); 209 _.$tabs = _.$nav.children(".eztabs__tab"); 210 _._makeTabAccordion(newPanel, i); 211 _.$accordions = _.$navPanels.children(".eztabs__accordion"); 212 _.$panels = _.$navPanels.children(".eztabs__panels"); 213 _._makeTabCompliant(newTab, i); 214 _._makeTabEditable(newTab); 215 _._makePanelReference(newTab, i); 216 _._addTooltip(newTab); 217 _._collectTabInfo(); 218 newTab.on("click", _._tabActivated); 219 newTab.on("keyup", _._tabKeyup); 220 newTab.click(); 221 newTab.dblclick(); 222 _._tabWasCreatedEvent.notify({ 223 order: _._getTabsOrder(), 224 tab: newTab, 225 panel: newPanel 226 }); 227 _._triggerFinish(); 228 return newTab 229 } 230 231 232 _._deleteTab = function(tab) { 233 var index = tab.index(); 234 tab.remove(); 235 $(tab[0].panel).remove(); 236 $(tab[0].accordion).remove(); 237 _.$tabs = _.$nav.children(".eztabs__tab"); 238 _.$panels = _.$navPanels.children(".eztabs__panels"); 239 _.$accordions = _.$navPanels.children(".eztabs__accordion"); 240 var newIndex = index; 241 if (index == 0) newIndex = 0; 242 else if (index == _.$tabs.length) newIndex = index - 1; 243 _.$tabs.eq(newIndex).click(); 244 var order = _._getTabsOrder(); 245 _._tabWasDeletedEvent.notify({ 246 order: order 247 }); 248 _._triggerFinish(); 249 if (_.$tabs.length == 0) _._prepareTabCreation(); 250 } 251 252 253 _._enableADACompliance = function() { 254 _.$tabs.each(function(i) { 255 _._makeTabCompliant(this, i); 256 }); 257 } 258 259 260 261 _._enableDrag = function() { 262 _.$nav.sortable({ 263 tolerance: "pointer", 264 items: "> li", 265 update: function(e, ui) { 266 _.$tabs = _.$nav.children(".eztabs__tab"); 267 var $tab = $(ui.item); 268 var oldPosition = Number($tab.attr("data-position")); 269 $tab.click(); //Makes dropped tab the active tab 270 _._collectTabInfo(); 271 _._tabOrderChangedEvent.notify({ 272 order: _._getTabsOrder(), 273 oldPosition: oldPosition, 274 newPosition: $tab.index(), 275 name: $tab.find(".eztabs__tab__name").text(), 276 id: $tab.attr("id"), 277 dataId: $tab.attr("data-id"), 278 tab: $tab 279 }); 280 _._tabWasOpened.notify(); 281 }, 282 start: function(e, ui) { 283 var $placeholder = $(ui.placeholder); 284 var $tab = $(ui.item); 285 var width = parseFloat($tab.attr("data-width")) || $tab.
285width(); 286 var height = parseFloat($tab.attr("data-height")) || $tab.height(); 287 $tab.css({ 288 width: (width + 1) + "px", 289 height: (height) + "px" 290 }); 291 $placeholder.css({ 292 width: (width + 1) + "px", 293 height: (height) + "px" 294 }); 295 $tab[0].dragged = true; 296 } 297 }); 298 } 299 300 301 _._enableTextEdit = function() { 302 _.$tabs.each(function(i) { 303 _._makeTabEditable(this); 304 }); 305 } 306 307 _._getTabsOrder = function() { 308 var order = []; 309 _.$tabs.each(function() { 310 var name = $(this).find(".eztabs__tab__name").text(); 311 order.push(name); 312 }); 313 return order 314 } 315 316 _._makeTabAccordion = function(panel, i) { 317 var panel = $(panel); 318 var accordion = $("<div class='eztabs__accordion' tabindex='0' role='tab' data-index='" + i + "'><div class='eztabs__accordion__inner'><span class='eztabs__accordion__name'>" + $(_.$tabs[i]).text() + "</span><span class='eztabs__accordion__icon ion-arrow-down-b'></span></div></div>"); 319 accordion.insertBefore(panel); 320 _.$accordions = _.$navPanels.children(".eztabs__accordion"); 321 } 322 323 _._makeTabCompliant = function(tab, i) { 324 var tab = $(tab); 325 if (!tab.attr("id")) { 326 tab.attr({ 327 "id": defaults.tabNamespace + _.index + "-" + i, 328 "aria-controls": defaults.panelNamespace + _.index + "-" + i 329 }); 330 } 331 _.$panels.eq(i).attr({ 332 "id": defaults.panelNamespace + _.index + "-" + i, 333 "aria-labelledby": tab.attr("id") 334 }); 335 336 _.$panels.eq(i).on('keydown', function(e){ 337 var keyCode = e.keyCode || e.which; 338 if (keyCode == 9) { 339 var focusable = $(this).find('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'); 340 var lastFocusable = focusable[focusable.length - 1]; 341 342 if ( $(lastFocusable).is(":focus") ){ 343 if ( i < _.$tabs.length - 1 ) { 344 _.$tabs.eq(i).focus(); 345 _._tabActivated; 346 } 347 if ( i == _.$tabs.length - 1) { 348 _._closeAll(); 349 } 350 } 351 } 352 }); 353 } 354 355 _._makeTabEditable = function(tab) { 356 var tab = $(tab); 357 var name = tab.text(); 358 var span = $("<span class='eztabs__tab__name'>" + name + "</span>"); 359 var editableDiv = $("<span contenteditable class='eztabs__eztab__input'>" + name + "</span>"); 360 tab.children().eq(0).empty().append(span).append(editableDiv); 361 tab.on("dblclick", _._tabDoubleClick); 362 editableDiv.on("dblclick", function(e) { 363 e.stopPropagation(); 364 e.preventDefault(); 365 }); 366 editableDiv.on("mousedown", function(e) { 367 e.stopPropagation(); 368 }); 369 editableDiv.on("keypress", _._tabEditingNameKeypress); 370 editableDiv.on("keyup", _._tabEditingNameKeyup); 371 editableDiv.on("blur", _._tabFinishEditingName); 372 } 373 374 _._makePanelReference = function(tab, i) { 375 var tab = $(tab)[0]; 376 tab.panel = _.$panels.eq(i); 377 tab.accordion = _.$accordions.eq(i); 378 } 379 380 _._tabFinishEditingName = function(e) { 381 var tab = $(this).closest(".eztabs__tab"); 382 var editableDiv = tab.find(".eztabs__eztab__input"); 383 var name = tab.find(".eztabs__tab__name"); 384 var oldName = editableDiv.text(); 385 var accordion = tab[0].accordion.find(".eztabs__accordion__inner"); 386 var index = tab.index(); 387 editableDiv.removeClass("eztabs__eztab__input--editing") 388 name.removeClass("eztabs__tab__name--editing"); 389 if (editableDiv.text() == "") editableDiv.text(name.text()); 390 if (name.text() !== editableDiv.text()) { 391 var newName = editableDiv.text().trim(); 392 var oldName = name.text(); 393 name.text(editableDiv.text()); 394 accordion.text(editableDiv.text()); 395 _._storeDimensions(tab); 396 _._collectTabInfo(); 397 _._tabNameChangedEvent.notify({ 398 item: tab, 399 order: _._getTabsOrder(), 400 oldName: oldName, 401 newName: newName, 402 position: index, 403 id: tab.attr("id"), 404 dataId: tab.attr("data-id") 405 }); 406 } 407 } 408 409 410 _._tabDoubleClick = function(e) { 411 var tab = $(this); 412 var editableDiv = tab.find(".eztabs__eztab__input"); 413 var name = tab.find(".eztabs__tab__name"); 414 name.addClass("eztabs__tab__name--editing"); 415 editableDiv.addClass("eztabs__eztab__input--editing").focus(); 416 } 417 418 _._triggerSaving = function() { 419 _.$element.addClass("eztabs--saving"); 420 } 421 422 _._triggerFinish = function() { 423 _.$element.removeClass("eztabs--saving"); 424 } 425 426 _._showPanel = function(panel) { 427 _.$panels.removeClass(defaults.activePanelClass).attr("aria-hidden", "true"); 428 panel.addClass(defaults.activePanelClass).attr("aria-hidden", "false"); 429 } 430 431 _._showTab = function(index) { 432 _.$tabs 433 .removeClass(defaults.activeTabClass) 434 .attr({ 435 "aria-selected": "false", 436 "tabindex": "0" //kevin was -1 437 }) 438 .eq(index) 439 .addClass(defaults.activeTabClass) 440 .attr({ 441 "aria-selected": "true", 442 "tabindex": "0" 443 }) 444 .focus(); 445 } 446 447 _._showAccordion = function(accordion) { 448 _.$accordions.removeClass(defaults.activeAccordionClass); 449 accordion.addClass(defaults.activeAccordionClass); 450 } 451 452 _._collectTabInfo = function() { 453 var _ = this; 454 _._tabNames = []; 455 _.$tabs.each(function(position) { 456 var name; 457 $(this).attr("data-position", position); 458 if ($(this).children().eq(0).children().length) { 459 name = $(this).children().children().eq(0).children(".eztabs__tab__name").text() 460 } else name = $(this).children().text() 461 _._tabNames.push(name) 462 }); 463 } 464 465 _._storeDimensions = function(tab, index) { 466 var $tab = $(tab); 467 var width = $tab.width(); 468 var height = $tab.height(); 469 $tab.attr({ 470 "data-width": width, 471 "data-height": height 472 }); 473 } 474 475 _._tabActivated = function(e, tab) { 476 var keyCode = e.keyCode || e.which; 477 if (keyCode == 1 || keyCode == 39 || keyCode == 37 || keyCode == 9) { //kevin add 9 478 if (this.lastClick == undefined) this.lastClick = 0; 479 var timestamp = new Date().getTime(); 480 var index = $(this).index(); 481 var panel = $(this.panel); 482 var accordion = $(this.accordion); 483 var name = $(this).find(".eztabs__tab__name").text(); 484 var dataId = $(this).attr("data-id"); 485 486 _._showTab(index); 487 _._showPanel(panel); 488 _._showAccordion(accordion); 489 if (!this.dragged && timestamp > (this.lastClick + 300) && index != _._activeTab) { 490 _._activeTab = index; 491 this.lastClick = timestamp; 492 _._tabWasClickedEvent.notify({ 493 newPosition: index, 494 name: name, 495 dataId: dataId 496 }); 497 } else { 498 this.dragged = false; 499 } 500 _._tabWasOpened.notify(); 501 } 502 } 503 504 _._tabEditingNameEscape = function(editableDiv, tab) { 505 var originalName = tab.find(".eztabs__tab__name").text(); 506 $(editableDiv).text(originalName); 507 $(editableDiv).blur(); 508 } 509 510 _._tabEditingNameKeyup = function(e) { 511 var keyCode = e.keyCode || e.which; 512 if (keyCode == 39 || keyCode == 37) { 513 e.stopPropagation(); 514 } 515 if (keyCode == 27) { 516 e.stopPropagation(); 517 var tab = $(this).closest(".eztabs__tab"); 518 _._tabEditingNameEscape(this, tab); 519 } 520 } 521 522 523 _._tabEditingNameKeypress = function(e) { 524 var keyCode = e.keyCode || e.which; 525 if (keyCode == 13) { 526 e.preventDefault(); 527 $(this).blur(); //trigger finish editing name 528 } 529 if (keyCode == 39 || keyCode == 37) { 530 e.stopPropagation(); 531 } 532 } 533 534 _._tabKeyup = function(e) { 535 var thisTab = $(this); 536 var keyCode = e.keyCode || e.which; 537 if (keyCode == 9) { 538 //_._tabActivated.call(this, e); kevin 539 thisTab.focus(); 540 _._tabActivated.call(thisTab[0], e); 541 thisTab.attr('aria-describedby','tab-instructions'); 542 } 543 if (keyCode == 13) { 544 var panel = $(thisTab[0].panel); 545 if (panel.length) { 546 panel.attr("tabindex", "0"); 547 panel.focus(); 548 } 549 } 550 if (keyCode == 39) { 551 //Right key 552 var next = $(this).next(".eztabs__tab"); 553 if (!next.length) next = _.$tabs.eq(0); 554 next.focus(); 555 _._tabActivated.call(next[0], e); 556 } 557 if (keyCode == 37) { 558 //Left Key 559 var prev = $(this).prev(".eztabs__tab"); 560 if (!prev.length) prev = _.$tabs.eq(_.$tabs.length - 1); 561 prev.focus(); 562 _._tabActivated.call(prev[0], e); 563 } 564 } 565 566 _._accordionKeyup = function(e) { 567 568 var currentIndex; 569 var keyCode = e.keyCode || e.which; 570 if (keyCode == 9) { 571 currentIndex = parseInt($(this).attr('data-index')); 572 _.$accordions[currentIndex].click(); 573 } 574 if (keyCode == 40) { 575 currentIndex = parseInt($(this).attr('data-index')); 576 577 if(currentIndex == _.$accordions.length - 1) { 578 currentIndex = 0; 579 580 } else { 581 currentIndex++; 582 } 583 584 _.$accordions[currentIndex].focus(); 585 _.$accordions[currentIndex].click(); 586 587 } 588 589 if (keyCode == 38) { 590 591 currentIndex = parseInt($(this).attr('data-index')); 592 593 if(currentIndex == 0) { 594 currentIndex = _.$accordions.length - 1; 595 596 } else { 597 currentIndex--; 598 } 599 600 _.$accordions[currentIndex].focus(); 601 _.$accordions[currentIndex].click(); 602 603 } 604 } 605 606 //Setup 607 _._enableADACompliance(); 608 _._buildAccordions(); 609 _._attachPanelsToTab(); 610 if (_.settings.mode == "edit") { 611 _.$element.addClass("eztabs--editing"); 612 _.$editTab.on("click", _._prepareTabCreation); 613 _.$deleteTab.on("click", _._requestTabDeletion); 614 _._enableDrag(); 615 _._enableTextEdit(); 616 _._addTooltipsToTabs(); 617 _.$tabs.each(function(index) { 618 _._storeDimensions(this, index); 619 }); 620 } 621 622 //Event Binding 623 _.$tabs.on("mousedown", _._tabActivated); 624 _.$tabs.on("keyup", _._tabKeyup); 625 _.$accordions.on("click", _._accordionActivated); 626 _.$accordions.on("keyup", _._accordionKeyup); 627 628 //Intialization 629 _._collectTabInfo(); 630 if (urlParameters.tab) { 631 var startTab = _._tabNames.indexOf(urlParameters.tab); 632 if (startTab > -1) { 633 _.settings.startTab = startTab; 634 var tabOffsetTop = _.$tabs.eq(_.settings.startTab).offset().top; 635 $("html").animate({ 636 scrollTop: tabOffsetTop 637 }); 638 } 639 } 640 _.$tabs.removeClass(defaults.activeTabClass).eq(_.settings.startTab != undefined ? _.settings.startTab : 0).addClass(defaults.activeTabClass); 641 _._showPanel(_.$panels.eq(_.settings.startTab != undefined ? _.settings.startTab : 0)); 642 _._showAccordion(_.$accordions.eq(_.settings.startTab != undefined ? _.settings.startTab : 0)); 643 $.data(_.element, "ezTabs", _); 644 $.fn.ezTabs = function() { 645 return jQuery.data(this[0]).ezTabs 646 } 647 648 var ezTabsReady = new CustomEvent("ezTabs:ready"); 649 _.element.dispatchEvent(ezTabsReady); 650 if (_._windowWidth <= _.settings.mobileBreakPoint) { 651 _.$element.addClass(defaults.mobileClass); 652 _._closeAll(); 653 } 654 }; 655 656 ezTabs.prototype.createNewTab = function() { 657 return this._createNewTab(); 658 } 659 660 ezTabs.prototype.deleteTab = function(tab) { 661 this._deleteTab(tab); 662 } 663 664 ezTabs.prototype.onTabCreated = function(func) { 665 this._tabWasCreatedEvent.attach(function(sender, args) { 666 func(sender, args); 667 }); 668 } 669 670 ezTabs.prototype.onTabClick = function(func) { 671 this._tabWasClickedEvent.attach(function(sender, args) { 672 func(sender, args); 673 }); 674 } 675 676 677 ezTabs.prototype.onTabDeleted = function(func) { 678 this._tabWasDeletedEvent.attach(function(sender, args) { 679 func(sender, args); 680 }); 681 } 682 683 684 ezTabs.prototype.onTabOrderChanged = function(func) { 685 this._tabOrderChangedEvent.attach(function(sender, args) { 686 func(sender, args); 687 }); 688 } 689 690 ezTabs.prototype.onTabOpened = function(func) { 691 this._tabWasOpened.attach(function(sender, args) { 692 func(sender, args); 693 }); 694 } 695 696 ezTabs.prototype.onTabWillBeCreated = function(func) { 697 this._tabWillBeCreatedEvent.attach(function(sender, args) { 698 func(sender, args); 699 }); 700 } 701 702 ezTabs.prototype.onTabWillDelete = function(func) { 703 this._tabWillDeleteEvent.attach(function(sender, args) { 704 func(sender, args); 705 }); 706 } 707 708 709 ezTabs.prototype.onTabNameChange = function(func) { 710 this._tabNameChangedEvent.attach(function(sender, args) { 711 func(sender, args); 712 }); 713 } 714 715 window.ezTabs = ezTabs; 716 717 $(function() { 718 var tabstrips = new ezTabs($(".eztabs")); 719 });
720 721})(window, document, 0)
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.