PageSourceSearch

https://www.tibnor.dk/_ui/tibnor/common/js/acc.quote.js

js tibnor.dk collected 2026-09-30 06:05:00 UTC 25,660 bytes, 673 lines download raw bytes

1ACC.quote = {
2    _autoload: [
3        ["bindAddComment", $("#js-quote-comments").length !== 0],
4        ["bindAddEntryComment", $(".js-quote-entry-comments").length !== 0],
5        ["toggleMoreComments", $("#js-quote-comments").length !== 0],
6        ["toggleLessComments", $("#js-quote-comments").length !== 0],
7        ["displayLessComments", $("#js-quote-comments").length !== 0],
8        ["quoteDetailsNavigation", $(".js-quote-actions").length !== 0],
9        ["bindQuoteButtons", $(".js-btn-quote").length !== 0],
10        ["bindEditQuoteButton", $(".js-quote-edit-btn").length !== 0],
11        ["bindSubmitConfirmation", $(".js-quote-submit-btn").length !== 0],
12        ["bindCancelConfirmation", $(".js-quote-cancel-btn").length !== 0],
13        ["bindName", $("#js-quote-name").length !== 0],
14        ["bindDescription", $("#js-quote-description").length !== 0],
15        ["bindExpirationTime", $("#js-quote-expiration-time").length !== 0],
16        ["bindCheckoutConfirmation", $(".js-quote-checkout-btn").length !== 0],
17        ["bindEditConfirmation", $(".js-quote-warning-btn").length !== 0],
18        ["bindQuoteDiscount", $(".js-quote-discount-link").length !== 0],
19        ["bindNewCartClick", $(".new__cart--link").length !== 0]
20    ],
21
22    bindEditQuoteButton: function () {
23        $(".js-quote-edit-btn").on("click", function () {
24            var sUrl = $(this).data("quoteEditUrl");
25            window.location = sUrl;
26        });
27    },
28    bindNewCartClick: function () {
29        $(".new__cart--link").bind("click", function (event) {
30            $(this).unbind(event);
31        });
32    },
33    bindAddComment: function () {
34        $(document).on(
35            "keypress",
36            '#js-quote-comments #comment',
37            function (event) {
38                var key = event.keyCode;
39
40                // If the user has pressed enter
41                if (key === 13) {
42                    if ($('#comment').val().trim() === '') {
43                        return false;
44                    }
45                    event.preventDefault();
46                    ACC.quote.quoteCommentSubmit($('#comment').val());
47                    $('#comment').val("");
48                    return false;
49                } else {
50                    return true;
51                }
52            });
53    },
54
55    bindAddEntryComment: function () {
56        $(document).on(
57            "keypress",
58            ".js-quote-entry-comments",
59            function (event) {
60                var key = event.keyCode;
61
62                if (key === 13) {
63                    event.preventDefault();
64                    ACC.quote.quoteEntryCommentSubmit($(this).val(), $(this).data("entry-number"));
65                    return false;
66                } else {
67                    return true;
68                }
69            }
70        );
71    },
72
73    bindQuoteButtons: function () {
74        $('.js-save-quote-btn').click(function () {
75            var url = $(this).data("saveQuoteUrl");
76            $('#quoteForm').attr('action', url).submit();
77        });
78        $('.js-submit-quote-btn').click(function () {
79            var url = $(this).data("submitQuoteUrl");
80            $('#quoteForm').attr('action', url).submit();
81        });
82        $('.js-accept-quote-btn').click(function () {
83            var url = $(this).data("acceptQuoteUrl");
84            $('#quoteForm').attr('action', url).submit();
85        });
86    },
87
88    quoteCommentSubmit: function (comment) {
89        var quoteComments = $("#js-quote-comments");
90        var addCommentUrl = quoteComments.data("quote-base-link") + "comment";
91        var showAllComments = quoteComments.data("show-all-comments");
92
93        $.ajax({
94            url: addCommentUrl,
95            data: {
96                comment: comment
97            },
98            type: "post",
99            success: function (response) {
100                ACC.quote.onCommentSuccess(showAllComments);
101            }
102        });
103    },
104
105    quoteEntryCommentSubmit: function (comment, entryNumber) {
106        if (!comment || !comment.length) {
107            return;
108        }
109
110        var quoteComments = $("#js-quote-comments");
111        var addEntryCommentUrl = quoteComments.data("quote-base-link") + "entry/comment";
112
113        $.ajax({
114            url: addEntryCommentUrl,
115            data: {
116                comment: comment,
117                entryNumber: entryNumber
118            },
119            type: "post",
120            success: function () {
121                ACC.quote.onEntryCommentSuccess(entryNumber);
122            }
123        });
124    },
125
126    onCommentSuccess: function (showAllComments) {
127        $("#commentListDiv").load(location.href + " #commentListDiv", function () {
128            ACC.quote.displayComments("" + showAllComments);
129        });
130    },
131
132    onEntryCommentSuccess: function (entryNumber) {
133        var entryNumberHtml = ACC.common.encodeHtml(entryNumber);
134        $("#entryCommentListDiv_" + entryNumberHtml).load(location.href + " #entryCommentListDiv_" + entryNumberHtml, function () {
135            ACC.quote.displayEntryComments(entryNumberHtml);
136        });
137
138        $("#entryComment_" + entryNumberHtml).val("");
139    },
140
141    toggleMoreComments: function () {
142        $(document).on('click', '#moreCommentsAnchor', ACC.quote.displayMoreComments);
143        $(document).on('click', '.js-more-entry-comments-anchor', ACC.quote.displayMoreEntryComments);
144    },
145
146    toggleLessComments: function () {
147        $(document).on('click', '#lessCommentsAnchor', ACC.quote.displayLessComments);
148        $(document).on('click', '.js-less-entry-comments-anchor', ACC.quote.displayLessEntryComments);
149    },
150
151    displayMoreComments: function (e) {
152        e.preventDefault();
153        ACC.quote.displayComments("true");
154    },
155
156    displayMoreEntryComments: function (e) {
157        e.preventDefault();
158        ACC.quote.displayEntryComments($(this).data("entry-number"), "true");
159    },
160
161    displayLessComments: function (e) {
162        if (e !== undefined) {
163            e.preventDefault();
164        }
165        ACC.quote.displayComments("false");
166    },
167
168    displayLessEntryComments: function (e) {
169        e.preventDefault();
170        ACC.quote.displayEntryComments($(this).data("entry-number"), "false");
171    },
172
173    displayComments: function (showAll) {
174        var quoteComments = $("#js-quote-comments");
175        var currentCommentsShown = quoteComments.data("current-comments-shown");
176        var comments = $('[id^="comment_"]');
177
178        // iterate over comments. If showAll, just show, otherwise check if max comments is reached then hide
179        for (var i = 0; i < comments.length; i++) {
180            if (showAll === "true") {
181                $(comments[i]).show();
182            } else {
183                if (i < currentCommentsShown) {
184                    $(comments[i]).show();
185                } else {
186                    $(comments[i]).hide();
187                }
188            }
189        }
190
191        // toggle anchors
192        if (showAll === "false") {
193            $('#moreCommentsAnchor').show();
194            $('#lessCommentsAnchor').hide();
195            quoteComments.data("show-all-comments", false);
196        } else {
197            $('#moreCommentsAnchor').hide();
198            $('#lessCommentsAnchor').show();
199            quoteComments.data("show-all-comments", true);
200        }
201
202        return false;
203    },
204
205    displayEntryComments: function (entryNumber, showAll) {
206        var entryNumberHtml = ACC.common.encodeHtml(entryNumber);
207        var quoteEntryComments = $("#entryCommentListDiv_" + entryNumberHtml);
208        var comments = quoteEntryComments.find('[id^="entryComment_' + entryNumberHtml + '"]');
209
210        showAll = showAll || "" + quoteEntryComments.data("show-all-entry-comments");
211
212        // iterate over comments. If showAll, just show, otherwise check if max comments is reached then hide
213        for (var i = 0; i < comments.length; i++) {
214            if (showAll === "true") {
215                $(comments[i]).show();
216            } else {
217                if (i < 4) {
218                    $(comments[i]).show();
219                } else {
220                    $(comments[i]).hide();
221                }
222            }
223        }
224
225        // toggle anchors
226        if (showAll === "false") {
227            quoteEntryComments.find(".js-more-entry-comments-anchor").show();
228            quoteEntryComments.find(".js-less-entry-comments-anchor").hide();
229            quoteEntryComments.data("show-all-entry-comments", false);
230        } else {
231            quoteEntryComments.find(".js-more-entry-comments-anchor").hide();
232            quoteEntryComments.find(".js-less-entry-comments-anchor").show();
233            quoteEntryComments.data("show-all-entry-comments", true);
234        }
235
236        return false;
237    },
238
239    quoteDetailsNavigation: function () {
240        $('.js-quote-actions').on('click', function (e) {
241            $(this).parent().find('nav').toggleClass('display-none');
242        });
243    },
244
245    bindSubmitConfirmation: function (e) {
246        ACC.quote.handleConfirmationModal({
247            actionButtonSelector: ".js-quote-submit-btn",
248            modalWindowSelector: "#js-quote-submit-modal",
249            modalTitleDataAttributeName: "submit-confirmation-modal-title",
250            cancelButtonSelector: "#js-quote-submit-modal #submitNoButton"
251        });
252
253        $("#quoteSubmitForm").submit(function (event) {
254            var quoteForm = $("#quoteForm");
255
256            if (quoteForm.is("form")) {
257                event.preventDefault();
258
259                var submitUrl = $(this).prop("action");
260
261                quoteForm.prop("action", submitUrl);
262                quoteForm.submit();
263            }
264        });
265    },
266
267    bindCheckoutConfirmation: function (e) {
268        ACC.quote.handleConfirmationModal({
269            actionButtonSelector: ".js-quote-checkout-btn",
270            modalWindowSelector: "#js-quote-checkout-modal",
271            modalTitleDataAttributeName: "submit-confirmation-modal-title",
272            cancelButtonSelector: "#js-quote-checkout-modal #submitNoButton"
273        });
274    },
275
276    bindCancelConfirmation: function (e) {
277        ACC.quote.handleConfirmationModal({
278            actionButtonSelector: ".js-quote-cancel-btn",
279            modalWindowSelector: "#js-quote-cancel-modal",
280            modalTitleDataAttributeName: "cancel-confirmation-modal-title",
281            cancelButtonSelector: "#js-quote-cancel-modal #cancelNoButton"
282        });
283    },
284
285    bindEditConfirmation: function (e) {
286        ACC.quote.handleConfirmationModal({
287            actionButtonSelector: ".js-quote-warning-btn",
288            modalWindowSelector: "#js-quote-edit-modal",
289            modalTitleDataAttributeName: "edit-confirmation-modal-title",
290            cancelButtonSelector: "#js-quote-edit-modal #cancelEditNoButton",
291            confirmButtonSelector: "#js-quote-edit-modal #cancelEditYesButton"
292        });
293    },
294
295    handleConfirmationModal: function (options) {
296        var $actionButtonSelector = $(document).find(options.actionButtonSelector);
297        $actionButtonSelector.click(function (e) {
298            e.preventDefault();
299
300            var modalWindow = $(document).find(options.modalWindowSelector);
301            var title = modalWindow.data(options.modalTitleDataAttributeName);
302
303            if (options.initializeCallback) {
304                options.initializeCallback();
305            }
306
307            ACC.colorbox.open(ACC.common.encodeHtml(title), {
308                inline: true,
309                href: modalWindow,
310                width: "480px",
311                escKey: false,
312                overlayClose: false,
313                onComplete: function () {
314                    ACC.colorbox.resize();
315                }
316            });
317        });
318
319        var $cancelButtonSelector = $(document).find(options.cancelButtonSelector);
320        $cancelButtonSelector.click(function (e) {
321            e.preventDefault();
322            ACC.colorbox.close();
323        });
324
325        var $confirmButtonSelector = $(document).find(options.confirmButtonSelector);
326        $confirmButtonSelector.click(function (e) {
327            e.preventDefault();
328            ACC.colorbox.close();
329            var sUrl = $actionButtonSelector.data("quoteEditUrl");
330            window.location = sUrl;
331        });
332    },
333
334    bindQuoteDiscount: function (e) {
335        ACC.quote.handleDiscountModal({
336            actionButtonSelector: ".js-quote-discount-link",
337            modalWindowSelector: "#js-quote-discount-modal",
338            modalTitleDataAttributeName: "quote-modal-title",
339            modalTotalDataAttributeName: "quote-modal-total",
340            modalQuoteDiscountDataAttributeName: "quote-modal-quote-discount",
341            modalCurrencyDataAttributeName: "quote-modal-currency",
342            cancelButtonSelector: "#js-quote-discount-modal #cancelButton"
343        });
344    },
345
346    handleDiscountModal: function (options) {
347        var modalWindow = $(document).find(options.modalWindowSelector);
348        var total = parseFloat(modalWindow.data(options.modalTotalDataAttributeName));
349        var quoteDiscount = parseFloat(modalWindow.data(options.modalQuoteDiscountDataAttributeName));
350        var currency = modalWindow.data(options.modalCurrencyDataAttributeName);
351
352        $(document).find(options.actionButtonSelector).click(function (e) {
353            e.preventDefault();
354
355            var title = modalWindow.data(options.modalTitleDataAttributeName);
356
357            if (options.initializeCallback) {
358                options.initializeCallback();
359            }
360
361            ACC.colorbox.open(ACC.common.encodeHtml(title), {
362                inline: true,
363                href: modalWindow,
364                width: "480px",
365                onComplete: function () {
366                    ACC.colorbox.resize();
367                    var percent = (quoteDiscount / total) * 100;
368                    var adjustTotal = (total - quoteDiscount).toFixed(2);
369                    $("#js-quote-discount-by-percentage").val(percent.toFixed(2));
370                    $("#js-quote-discount-by-amount").val(quoteDiscount.toFixed(2));
371                    $("#js-quote-discount-adjust-total").val(adjustTotal);
372                }
373            });
374        });
375
376        $(document).find(options.cancelButtonSelector).click(function (e) {
377            e.preventDefault();
378            ACC.colorbox.close();
379        });
380
381        function enableSubmit() {
382            $("#js-quote-discount-by-percentage").css('border-color', '#cccccc');
383            $("#js-quote-discount-by-amount").css('border-color', '#cccccc');
384            $("#js-quote-discount-adjust-total").css('border-color', '#cccccc');
385            $("#submitButton").prop("disabled", false);
386        }
387
388        function resetIntial(val) {
389            if (isNaN(parseFloat(val))) {
390                val = 0.00;
391                val = val.toFixed(2);
392            }
393            return val;
394        }
395
396        function updateByPercentage() {
397            var percent = parseFloat($("#js-quote-discount-by-percentage").val());
398            // input validation
399            if (percent > 100 || percent < 0) {
400                $("#js-quote-discount-by-percentage").css('border-color', 'red');
401                $("#submitButton").prop("disabled", true);
402            } else {
403                enableSubmit();
404            }
405            var discountAmount = total * percent / 100;
406            var discountAmount = discountAmount.toFixed(2);
407            $("#js-quote-discount-by-amount").val(resetIntial(discountAmount));
408            var remainTotal = total - discountAmount;
409            var remainTotal = remainTotal.toFixed(2);
410            $("#js-quote-discount-adjust-total").val(resetIntial(remainTotal));
411            $("#js-quote-discount-rate").val(resetIntial(percent));
412            $("#js-quote-discount-type").val("PERCENT");
413
414            updateNewTotal(remainTotal);
415        }
416
417        $('#js-quote-discount-by-percentage').keyup(updateByPercentage);
418        $('#js-quote-discount-by-percentage').change(updateByPercentage);
419        $('#js-quote-discount-by-percentage').blur(reset);
420        $('#js-quote-discount-by-percentage').keypress(holdPreviousValue);
421
422        function reset() {
423            var per = $('#js-quote-discount-by-percentage').val();
424            var amt = $('#js-quote-discount-by-amount').val();
425            var tot = $('#js-quote-discount-adjust-total').val();
426            if (per === '')
427                $('#js-quote-discount-by-percentage').val('0.00');
428            if (amt === '')
429                $('#js-quote-discount-by-amount').val('0.00');
430            if (tot === '' || tot === 0.00)
431                $('#js-quote-discount-adjust-total').val(total);
432        }
433
434        function holdPreviousValue(event) {
435            var $this = $(this);
436            if ((event.which !== 46 || $this.val().indexOf('.') !== -1)) {
437                if (((event.which < 48 || event.which > 57) &&
438                    (event.which !== 0 && event.which !== 8))) {
439                    event.preventDefault();
440                }
441            }
442
443            var text = $(this).val();
444            if ((event.which === 46) && (text.indexOf('.') === -1)) {
445                setTimeout(function () {
446                    if ($this.val().substring($this.val().indexOf('.')).length > 3) {
447                        $this.val($this.val().substring(0, $this.val().indexOf('.') + 3));
448                    }
449                }, 1);
450            }
451
452            if ((text.indexOf('.') !== -1)) {
453                if ((text.substring(text.indexOf('.')).length > 2) &&
454                    (event.which !== 0 && event.which !== 8) &&
455                    ($(this)[0].selectionStart >= text.length - 2)) {
456                    event.preventDefault();
457                }
458            }
459        }
460
461        function updateByAmount() {
462            var discountAmount = parseFloat($("#js-quote-discount-by-amount").val());
463
464            // input validation
465            if (discountAmount > total || discountAmount < 0) {
466                $("#js-quote-discount-by-amount").css('border-color', 'red');
467                $("#submitButton").prop("disabled", true);
468            } else {
469                enableSubmit();
470            }
471
472            var percent = (discountAmount / total) * 100;
473            var percent = percent.toFixed(2);
474            $("#js-quote-discount-by-percentage").val(resetIntial(percent));
475            var remainTotal = total - discountAmount;
476            var remainTotal = remainTotal.toFixed(2);
477            $("#js-quote-discount-adjust-total").val(resetIntial(remainTotal));
478            $("#js-quote-discount-rate").val(resetIntial(discountAmount));
479            $("#js-quote-discount-type").val("ABSOLUTE");
480
481            updateNewTotal(remainTotal);
482        }
483
484        $('#js-quote-discount-by-amount').keyup(updateByAmount);
485        $('#js-quote-discount-by-amount').change(updateByAmount);
486        $('#js-quote-discount-by-amount').keypress(holdPreviousValue);
487        $('#js-quote-discount-by-amount').blur(reset);
488
489        function updateByAdjustTotal() {
490            var adujstTotal = parseFloat($("#js-quote-discount-adjust-total").val());
491
492            // input validation
493            if (adujstTotal > total || adujstTotal < 0) {
494                $("#js-quote-discount-adjust-total").css('border-color', 'red');
495                $("#submitButton").prop("disabled", true);
496            } else {
497                enableSubmit();
498            }
499
500            var discountAmount = total - adujstTotal;
501            var discountAmount = discountAmount.toFixed(2);
502            $("#js-quote-discount-by-amount").val(resetIntial(discountAmount));
503            var percent = (discountAmount / total) * 100;
504            var percent = percent.toFixed(2);
505            $("#js-quote-discount-by-percentage").val(resetIntial(percent));
506            $("#js-quote-discount-rate").val(resetIntial(adujstTotal));
507            $("#js-quote-discount-type").val("TARGET");
508
509            updateNewTotal(adujstTotal);
510        }
511
512        $('#js-quote-discount-adjust-total').keyup(updateByAdjustTotal);
513        $('#js-quote-discount-adjust-total').change(updateByAdjustTotal);
514        $('#js-quote-discount-adjust-total').keypress(holdPreviousValue);
515        $('#js-quote-discount-adjust-total').blur(reset);
516
517        function updateNewTotal(newTotal) {
518            if (isNaN(parseFloat(newTotal))) {
519                newTotal = total;
520            }
521            var newTotal = parseFloat(newTotal).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,'); // format num to money
522            $("#js-quote-discount-new-total").text(currency.concat(newTotal));
523        }
524    },
525
526    bindName: function () {
527        $("#js-quote-name").on("focusout", function () {
528            ACC.quote.updateMetadata();
529        });
530    },
531
532    bindDescription: function () {
533        $("#js-quote-description").on("focusout", function () {
534            ACC.quote.updateMetadata();
535        });
536    },
537
538    updateMetadata: function () {
539        var quoteForm = $("#quoteFormDiv");
540        var updateMetadataUrl = quoteForm.data("metadata-url");
541        var name = $("#js-quote-name").val().trim();
542        var description = $("#js-quote-description").val();
543        var nameWrapperElement = $("#js-quote-name-wrapper"
543)
544
545        if (name && name.length) {
546            nameWrapperElement.removeClass("has-error");
547
548            $.ajax({
549                url: updateMetadataUrl,
550                data: {
551                    name: name,
552                    description: description
553                },
554                type: "POST",
555                success: function () {
556                    $(".js-modal-quote-description").text(description);
557                    $(".js-modal-quote-name").text(name);
558                }
559            });
560        } else {
561            if (!nameWrapperElement.hasClass("has-error")) {
562                nameWrapperElement.addClass("has-error");
563            }
564        }
565    },
566
567    bindExpirationTime: function (e) {
568        var expirationTimeWrapperElement = $("#js-quote-expiration-time");
569        var dateFormatForDatePicker = expirationTimeWrapperElement.data("date-format-for-date-picker");
570        var minOfferValidityPeriodDays = expirationTimeWrapperElement.data("min-offer-validity-period-days");
571
572        var minDate = new Date();
573        minDate.setDate(minDate.getDate() + minOfferValidityPeriodDays);
574
575        $("#expirationTime").datepicker({
576            dateFormat: dateFormatForDatePicker,
577            constrainInput: true,
578            minDate: minDate,
579            onSelect: function () {
580                ACC.quote.handleExpirationTimeUpdate(expirationTimeWrapperElement, dateFormatForDatePicker,
581                    minOfferValidityPeriodDays);
582            }
583        });
584
585        $("#expirationTime").change(function () {
586            ACC.quote.handleExpirationTimeUpdate(expirationTimeWrapperElement, dateFormatForDatePicker,
587                minOfferValidityPeriodDays);
588        });
589
590        $(document).on("click", ".js-open-datepicker-quote-expiration-time", function () {
591            $("#expirationTime").datepicker('show');
592        });
593    },
594
595    handleExpirationTimeUpdate: function (expirationTimeWrapperElement, dateFormat, minOfferValidityPeriodDays) {
596        var expirationTimeElement = $("#expirationTime");
597        var expirationTime = expirationTimeElement.val();
598
599        if (ACC.quote.validateExpirationTime(dateFormat, expirationTime, minOfferValidityPeriodDays)) {
600            ACC.quote.updateExpirationTime(expirationTime.trim());
601            expirationTimeWrapperElement.removeClass("has-error");
602        } else {
603            if (!expirationTimeWrapperElement.hasClass("has-error")) {
604                expirationTimeWrapperElement.addClass("has-error");
605            }
606        }
607    },
608
609    validateExpirationTime: function (dateFormat, value, minOfferValidityPeriodDays) {
610        try {
611            if (value) {
612                var selectedDate = $.datepicker.parseDate(dateFormat, value);
613
614                var validDate = new Date();
615                validDate.setHours(0, 0, 0, 0);
616                validDate.setDate(validDate.getDate() + minOfferValidityPeriodDays);
617
618                if (selectedDate >= validDate) {
619                    return true;
620                } else {
621                    return false;
622                }
623            } else {
624                return true;
625            }
626        } catch (error) {
627            return false;
628        }
629    },
630
631    updateExpirationTime: function (expirationTime) {
632        var url = $("#js-quote-expiration-time").data("expiration-time-url");
633        $.ajax({
634            url: url,
635            type: 'POST',
636            data: {expirationTime: expirationTime},
637            error: function (jqXHR) {
638                var expirationTimeWrapperElement = $("#js-quote-expiration-time");
639                if (!expirationTimeWrapperElement.hasClass("has-error")) {
640                    expirationTimeWrapperElement.addClass("has-error");
641                }
642            }
643        });
644    }
645};
646
647
648$(document).ready(function () {
649
650//toggles the whole quote block
651    $('.js-quote-toggle-btn').click(function () {
652        $(this).toggleClass('open');
653        $("#quote__form--collapse").slideToggle(400);
654        if ($(this).hasClass('open')) {
655            $(this).addClass('collapsed');
656        } else {
657            $(this).removeClass('collapsed');
658        }
659    });
660
661//toggles only the comments
662    $('.js-quote-comments-btn').click(function () {
663        $(this).toggleClass('open');
664        $("#comments__collapse").slideToggle(400);
665        if ($(this).hasClass('open')) {
666            $(this).addClass('collapsed');
667        } else {
668            $(this).removeClass('collapsed');
669        }
670
671    });
672
673});

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.