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.