1(function (window, document, $, miniShop2Config) { 2 var miniShop2 = miniShop2 || {}; 3 miniShop2Config.callbacksObjectTemplate = function () { 4 return { 5 // return false to prevent send data 6 before: [], 7 response: { 8 success: [], 9 error: [] 10 }, 11 ajax: { 12 done: [], 13 fail: [], 14 always: [] 15 } 16 } 17 }; 18 miniShop2.Callbacks = miniShop2Config.Callbacks = { 19 Cart: { 20 add: miniShop2Config.callbacksObjectTemplate(), 21 remove: miniShop2Config.callbacksObjectTemplate(), 22 change: miniShop2Config.callbacksObjectTemplate(), 23 clean: miniShop2Config.callbacksObjectTemplate() 24 }, 25 Order: { 26 add: miniShop2Config.callbacksObjectTemplate(), 27 getcost: miniShop2Config.callbacksObjectTemplate(), 28 clean: miniShop2Config.callbacksObjectTemplate(), 29 submit: miniShop2Config.callbacksObjectTemplate(), 30 getrequired: miniShop2Config.callbacksObjectTemplate() 31 }, 32 }; 33 miniShop2.Callbacks.add = function (path, name, func) { 34 if (typeof func != 'function') { 35 return false; 36 } 37 path = path.split('.'); 38 var obj = miniShop2.Callbacks; 39 for (var i = 0; i < path.length; i++) { 40 if (obj[path[i]] == undefined) { 41 return false; 42 } 43 obj = obj[path[i]]; 44 } 45 if (typeof obj != 'object') { 46 obj = [obj]; 47 } 48 if (name != undefined) { 49 obj[name] = func; 50 } 51 else { 52 obj.push(func); 53 } 54 return true; 55 }; 56 miniShop2.Callbacks.remove = function (path, name) { 57 path = path.split('.'); 58 var obj = miniShop2.Callbacks; 59 for (var i = 0; i < path.length; i++) { 60 if (obj[path[i]] == undefined) { 61 return false; 62 } 63 obj = obj[path[i]]; 64 } 65 if (obj[name] != undefined) { 66 delete obj[name]; 67 return true; 68 } 69 return false; 70 }; 71 miniShop2.ajaxProgress = false; 72 miniShop2.setup = function () { 73 // selectors & $objects 74 this.actionName = 'ms2_action'; 75 this.action = ':submit[name=' + this.actionName + ']'; 76 this.form = '.ms2_form'; 77 this.$doc = $(document); 78 79 this.sendData = { 80 $form: null, 81 action: null, 82 formData: null 83 }; 84 85 this.timeout = 300; 86 }; 87 miniShop2.initialize = function () { 88 miniShop2.setup(); 89 // Indicator of active ajax request 90 91 //noinspection JSUnresolvedFunction 92 miniShop2.$doc 93 .ajaxStart(function () { 94 miniShop2.ajaxProgress = true; 95 }) 96 .ajaxStop(function () { 97 miniShop2.ajaxProgress = false; 98 }) 99 .on('submit', miniShop2.form, function (e) { 100 e.preventDefault(); 101 var $form = $(this); 102 var action = $form.find(miniShop2.action).val(); 103 104 if (action) { 105 var formData = $form.serializeArray(); 106 formData.push({ 107 name: miniShop2.actionName, 108 value: action 109 }); 110 miniShop2.sendData = { 111 $form: $form, 112 action: action, 113 formData: formData 114 }; 115 miniShop2.controller(); 116 } 117 }); 118 miniShop2.Cart.initialize(); 119 miniShop2.Message.initialize(); 120 miniShop2.Order.initialize(); 121 miniShop2.Gallery.initialize(); 122 }; 123 miniShop2.controller = function () { 124 var self = this; 125 switch (self.sendData.action) { 126 case 'cart/add': 127 miniShop2.Cart.add(); 128 break; 129 case 'cart/remove': 130 miniShop2.Cart.remove(); 131 break; 132 case 'cart/change': 133 miniShop2.Cart.change(); 134 break; 135 case 'cart/clean': 136 miniShop2.Cart.clean(); 137 break; 138 case 'order/submit': 139 miniShop2.Order.submit(); 140 break; 141 case 'order/clean': 142 miniShop2.Order.clean(); 143 break; 144 default: 145 return; 146 } 147 }; 148 miniShop2.send = function (data, callbacks, userCallbacks) { 149 var runCallback = function (callback, bind) { 150 if (typeof callback == 'function') { 151 return callback.apply(bind, Array.prototype.slice.call(arguments, 2)); 152 } 153 else if (typeof callback == 'object') { 154 for (var i in callback) { 155 if (callback.hasOwnProperty(i)) { 156 var response = callback[i].apply(bind, Array.prototype.slice.call(arguments, 2)); 157 if (response === false) { 158 return false;
159 } 160 } 161 } 162 } 163 return true; 164 }; 165 // set context 166 if ($.isArray(data)) { 167 data.push({ 168 name: 'ctx', 169 value: miniShop2Config.ctx 170 }); 171 } 172 else if ($.isPlainObject(data)) { 173 data.ctx = miniShop2Config.ctx; 174 } 175 else if (typeof data == 'string') { 176 data += '&ctx=' + miniShop2Config.ctx; 177 } 178 179 // set action url 180 var formActionUrl = (miniShop2.sendData.$form) 181 ? miniShop2.sendData.$form.attr('action') 182 : false; 183 var url = (formActionUrl) 184 ? formActionUrl 185 : (miniShop2Config.actionUrl) 186 ? miniShop2Config.actionUrl 187 : document.location.href; 188 // set request method 189 var formMethod = (miniShop2.sendData.$form) 190 ? miniShop2.sendData.$form.attr('method') 191 : false; 192 var method = (formMethod) 193 ? formMethod 194 : 'post'; 195 196 // callback before 197 if (runCallback(callbacks.before) === false || runCallback(userCallbacks.before) === false) { 198 return; 199 } 200 // send 201 var xhr = function (callbacks, userCallbacks) { 202 return $[method](url, data, function (response) { 203 if (response.success) { 204 if (response.message) { 205 miniShop2.Message.success(response.message); 206 } 207 runCallback(callbacks.response.success, miniShop2, response); 208 runCallback(userCallbacks.response.success, miniShop2, response); 209 } 210 else { 211 miniShop2.Message.error(response.message); 212 runCallback(callbacks.response.error, miniShop2, response); 213 runCallback(userCallbacks.response.error, miniShop2, response); 214 } 215 }, 'json').done(function () { 216 runCallback(callbacks.ajax.done, miniShop2, xhr); 217 runCallback(userCallbacks.ajax.done, miniShop2, xhr); 218 }).fail(function () { 219 runCallback(callbacks.ajax.fail, miniShop2, xhr); 220 runCallback(userCallbacks.ajax.fail, miniShop2, xhr); 221 }).always(function () { 222 runCallback(callbacks.ajax.always, miniShop2, xhr); 223 runCallback(userCallbacks.ajax.always, miniShop2, xhr); 224 }); 225 }(callbacks, userCallbacks); 226 }; 227 228 miniShop2.Cart = { 229 callbacks: { 230 add: miniShop2Config.callbacksObjectTemplate(), 231 remove: miniShop2Config.callbacksObjectTemplate(), 232 change: miniShop2Config.callbacksObjectTemplate(), 233 clean: miniShop2Config.callbacksObjectTemplate() 234 }, 235 setup: function () { 236 miniShop2.Cart.cart = '#msCart'; 237 miniShop2.Cart.miniCart = '#msMiniCart'; 238 miniShop2.Cart.miniCartNotEmptyClass = 'full'; 239 miniShop2.Cart.countInput = 'input[name=count]'; 240 miniShop2.Cart.totalWeight = '.ms2_total_weight'; 241 miniShop2.Cart.totalCount = '.ms2_total_count'; 242 miniShop2.Cart.totalCost = '.ms2_total_cost'; 243 }, 244 initialize: function () { 245 miniShop2.Cart.setup(); 246 if (!$(miniShop2.Cart.cart).length) { 247 return; 248 } 249 miniShop2.$doc.on('change', miniShop2.Cart.cart + ' ' + miniShop2.Cart.countInput, function () { 250 $(this).closest(miniShop2.form).submit(); 251 }); 252 }, 253 add: function () { 254 var callbacks = miniShop2.Cart.callbacks; 255 callbacks.add.response.success = function (response) { 256 this.Cart.status(response.data); 257 }; 258 miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.add, miniShop2.Callbacks.Cart.add); 259 }, 260 remove: function () { 261 var callbacks = miniShop2.Cart.callbacks; 262 callbacks.remove.response.success = function (response) { 263 this.Cart.remove_position(miniShop2.Utils.getValueFromSerializedArray('key')); 264 this.Cart.status(response.data); 265 }; 266 miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.remove, miniShop2.Callbacks.Cart.remove); 267 }, 268 change: function () { 269 var callbacks = miniShop2.Cart.callbacks; 270 callbacks.change.response.success = function (response) { 271 if (typeof(response.data.key) == 'undefined') { 272 this.Cart.remove_position(miniShop2.Utils.getValueFromSerializedArray('key')); 273 } 274 else { 275 $('#' + miniShop2.Utils.getValueFromSerializedArray('key')).find(''); 276 } 277 this.Cart.status(response.data); 278 }; 279 miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.change, miniShop2.Callbacks.Cart.change); 280 }, 281 status: function (status) { 282 if (status['total_count'] < 1) { 283 location.reload(); 284 } 285 else { 286 //var $cart = $(miniShop2.Cart.cart); 287 var $miniCart = $(miniShop2.Cart.miniCart); 288 if (status['total_count'] > 0 && !$miniCart.hasClass(miniShop2.Cart.miniCartNotEmptyClass)) { 289 $miniCart.addClass(miniShop2.Cart.miniCartNotEmptyClass); 290 } 291 $(miniShop2.Cart.totalWeight).text(miniShop2.Utils.formatWeight(status['total_weight'])); 292 $(miniShop2.Cart.totalCount).text(status['total_count']); 293 $(miniShop2.Cart.totalCost).text(miniShop2.Utils.formatPrice(status['total_cost'])); 294 if ($(miniShop2.Order.orderCost, miniShop2.Order.order).length) { 295 miniShop2.Order.getcost(); 296 } 297 } 298 }, 299 clean: function () { 300 var callbacks = miniShop2.Cart.callbacks; 301 callbacks.clean.response.success = function (response) { 302 this.Cart.status(response.data); 303 }; 304 305 miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.clean, miniShop2.Callbacks.Cart.clean); 306 }, 307 remove_position: function (key) { 308 $('#' + key).remove(); 309 } 310 }; 311 312 miniShop2.Gallery = { 313 setup: function () { 314 miniShop2.Gallery.gallery = $('#msGallery'); 315 miniShop2.Gallery.files = miniShop2.Gallery.gallery.find('.fotorama'); 316 }, 317 initialize: function () { 318 miniShop2.Gallery.setup(); 319 if (miniShop2.Gallery.files.length) { 320 $('<link/>', { 321 rel: 'stylesheet', 322 type: 'text/css', 323 href: miniShop2Config.cssUrl + 'lib/fotorama.min.css', 324 }).appendTo('head'); 325 $('<script/>', { 326 type: 'text/javascript', 327 src: miniShop2Config.jsUrl + 'lib/fotorama.min.js', 328 }).appendTo('head'); 329 } 330 331 // fix size gallery 332 miniShop2.$doc.on('fotorama:ready', miniShop2.Gallery.files, function (e, Fotorama, extra) { 333 if ((src = Fotorama.activeFrame.src)) { 334 measure = $.Fotorama.measures[src]; 335 if (measure === undefined) { 336 for (i in $.Fotorama.measures) { 337 measure = $.Fotorama.measures[i]; 338 break; 339 } 340 Fotorama.resize(measure); 341 } 342 } 343 }); 344 345 } 346 }; 347 348 miniShop2.Order = { 349 callbacks: { 350 add: miniShop2Config.callbacksObjectTemplate(), 351 getcost: miniShop2Config.callbacksObjectTemplate(), 352 clean: miniShop2Config.callbacksObjectTemplate(), 353 submit: miniShop2Config.callbacksObjectTemplate(), 354 getrequired: miniShop2Config.callbacksObjectTemplate() 355 }, 356 setup: function () { 357 miniShop2.Order.order = '#msOrder'; 358 miniShop2.Order.deliveries = '#deliveries'; 359 miniShop2.Order.payments = '#payments'; 360 miniShop2.Order.deliveryInput = 'input[name="delivery"]'; 361 miniShop2.Order.inputParent = '.input-parent'; 362 miniShop2.Order.paymentInput = 'input[name="payment"]'; 363 miniShop2.Order.paymentInputUniquePrefix = 'input#payment_'; 364 miniShop2.Order.deliveryInputUniquePrefix = 'input#delivery_'; 365 miniShop2.Order.orderCost = '#ms2_order_cost' 366 }, 367 initialize: function () { 368 miniShop2.Order.setup(); 369 if ($(miniShop2.Order.order).length) { 370 miniShop2.$doc 371 .on('click', miniShop2.Order.order + ' [name="' + miniShop2.actionName + '"][value="order/clean"]', function (e) { 372 miniShop2.Order.clean(); 373 e.preventDefault(); 374 }) 375 .on('change', miniShop2.Order.order + ' input,' + miniShop2.Order.order + ' textarea', function () { 376 var $this = $(this); 377 var key = $this.attr('name'); 378 var value = $this.val(); 379 miniShop2.Order.add(key, value); 380 }); 381 var $deliveryInputChecked = $(miniShop2.Order.deliveryInput + ':checked', miniShop2.Order.order); 382 $deliveryInputChecked.trigger('change'); 383 miniShop2.Order.updatePayments($deliveryInputChecked.data('payments')); 384 } 385 }, 386 updatePayments: function (payments) { 387 var $paymentInputs = $(miniShop2.Order.paymentInput, miniShop2.Order.order); 388 $paymentInputs.attr('disabled', true).prop('disabled', true).closest(miniShop2.Order.inputParent).hide(); 389 if (payments.length > 0) { 390 for (var i in payments) { 391 if (payments.hasOwnProperty(i)) { 392 $paymentInputs.filter(miniShop2.Order.paymentInputUniquePrefix + payments[i]).attr('disabled', false).prop('disabled', false).closest(miniShop2.Order.inputParent).show(); 393 } 394 } 395 } 396 if ($paymentInputs.filter(':visible:checked').length == 0) { 397 $paymentInputs.filter(':visible:first').trigger('click'); 398 } 399 }, 400 add: function (key, value) { 401 var callbacks = miniShop2.Order.callbacks; 402 var old_value = value; 403 callbacks.add.response.success = function (response) { 404 (function (key, value, old_value) { 405 var $field = $('[name="' + key + '"]', miniShop2.Order.order); 406 switch (key) { 407 case 'delivery': 408 $field = $(miniShop2.Order.deliveryInputUniquePrefix + response.data[key]); 409 if (response.data[key] != old_value) { 410 $field.trigger('click'); 411 } 412 else { 413 miniShop2.Order.getrequired(value); 414 miniShop2.Order.updatePayments($field.data('payments')); 415 miniShop2.Order.getcost(); 416 } 417 break; 418 case 'payment': 419 $field = $(miniShop2.Order.paymentInputUniquePrefix + response.data[key]); 420 if (response.data[key] != old_value) { 421 $field.trigger('click'); 422 } 423 else { 424 miniShop2.Order.getcost(); 425 } 426 break; 427 //default: 428 } 429 $field.val(response.data[key]).removeClass('error').closest(miniShop2.Order.inputParent).removeClass('error'); 430 })(key, value, old_value); 431 }; 432 callbacks.add.response.error = function () { 433 (function (key) { 434 var $field = $('[name="' + key + '"]', miniShop2.Order.order); 435 if ($field.attr('type') == 'checkbox' || $field.attr('type') == 'radio') { 436 $field.closest(miniShop2.Order.inputParent).addClass('error'); 437 } 438 else { 439 $field.addClass('error'); 440 } 441 })(key); 442 }; 443 444 var data = { 445 key: key, 446 value: value 447 }; 448 data[miniShop2.actionName] = 'order/add'; 449 miniShop2.send(data, miniShop2.Order.callbacks.add, miniShop2.Callbacks.Order.add); 450 }, 451 getcost: function () { 452 var callbacks = miniShop2.Order.callbacks; 453 callbacks.getcost.response.success = function (response) { 454 $(miniShop2.Order.orderCost, miniShop2.Order.order).text(miniShop2.Utils.formatPrice(response.data['cost'])); 455 }; 456 var data = {}; 457 data[miniShop2.actionName] = 'order/getcost'; 458 miniShop2.send(data, miniShop2.Order.callbacks.getcost, miniShop2.Callbacks.Order.getcost); 459 }, 460 clean: function () { 461 var callbacks = miniShop2.Order.callbacks; 462 callbacks.clean.response.success = function () { 463 location.reload(); 464 }; 465 466 var data = {}; 467 data[miniShop2.actionName] = 'order/clean'; 468 miniShop2.send(data, miniShop2.Order.callbacks.clean, miniShop2.Callbacks.Order.clean); 469 }, 470 submit: function () { 471 miniShop2.Message.close(); 472 473 // Checking for active ajax request 474 if (miniShop2.ajaxProgress) { 475 //noinspection JSUnresolvedFunction 476 miniShop2.$doc.ajaxComplete(function () { 477 miniShop2.ajaxProgress = false;
478 miniShop2.$doc.unbind('ajaxComplete'); 479 miniShop2.Order.submit(); 480 }); 481 return false; 482 } 483 484 var callbacks = miniShop2.Order.callbacks; 485 callbacks.submit.before = function () { 486 $(':button, a', miniShop2.Order.order).attr('disabled', true).prop('disabled', true); 487 }; 488 callbacks.submit.response.success = function (response) { 489 if (response.data['redirect']) { 490 document.location.href = response.data['redirect']; 491 } 492 else if (response.data['msorder']) { 493 document.location.href = document.location.origin + document.location.pathname 494 + (document.location.search ? document.location.search + '&' : '?') 495 + 'msorder=' + response.data['msorder']; 496 } 497 else { 498 location.reload(); 499 } 500 }; 501 callbacks.submit.response.error = function (response) { 502 setTimeout((function () { 503 $(':button, a', miniShop2.Order.order).attr('disabled', false).prop('disabled', false); 504 }.bind(this)),3 * miniShop2.timeout); 505 $('[name]', miniShop2.Order.order).removeClass('error').closest(miniShop2.Order.inputParent).removeClass('error'); 506 for (var i in response.data) { 507 if (response.data.hasOwnProperty(i)) { 508 var key = response.data[i]; 509 //var $field = $('[name="' + response.data[i] + '"]', miniShop2.Order.order); 510 //$field.addClass('error').closest(miniShop2.Order.inputParent).addClass('error'); 511 var $field = $('[name="' + key + '"]', miniShop2.Order.order); 512 if ($field.attr('type') == 'checkbox' || $field.attr('type') == 'radio') { 513 $field.closest(miniShop2.Order.inputParent).addClass('error'); 514 } 515 else { 516 $field.addClass('error'); 517 } 518 } 519 } 520 }; 521 return miniShop2.send(miniShop2.sendData.formData, miniShop2.Order.callbacks.submit, miniShop2.Callbacks.Order.submit); 522 }, 523 getrequired: function (value) { 524 var callbacks = miniShop2.Order.callbacks; 525 callbacks.getrequired.response.success = function (response) { 526 $('[name]', miniShop2.Order.order).removeClass('required').closest(miniShop2.Order.inputParent).removeClass('required'); 527 var requires = response.data['requires']; 528 for (var i = 0, length = requires.length; i < length; i++) { 529 $('[name=' + requires[i] + ']', miniShop2.Order.order).addClass('required').closest(miniShop2.Order.inputParent).addClass('required'); 530 } 531 }; 532 callbacks.getrequired.response.error = function () { 533 $('[name]', miniShop2.Order.order).removeClass('required').closest(miniShop2.Order.inputParent).removeClass('required'); 534 }; 535 536 var data = { 537 id: value 538 }; 539 data[miniShop2.actionName] = 'order/getrequired'; 540 miniShop2.send(data, miniShop2.Order.callbacks.getrequired, miniShop2.Callbacks.Order.getrequired); 541 } 542 }; 543 544 miniShop2.Message = { 545 initialize: function () { 546 miniShop2.Message.close = function () { 547 }; 548 miniShop2.Message.show = function (message) { 549 if (message != '') { 550 alert(message); 551 } 552 }; 553 554 if (typeof($.fn.jGrowl) != 'function') { 555 $.getScript(miniShop2Config.jsUrl + 'lib/jquery.jgrowl.min.js', function () { 556 miniShop2.Message.initialize(); 557 }); 558 } 559 else { 560 $.jGrowl.defaults.closerTemplate = '<div>[ ' + miniShop2Config.close_all_message + ' ]</div>'; 561 miniShop2.Message.close = function () { 562 $.jGrowl('close'); 563 }; 564 miniShop2.Message.show = function (message, options) { 565 if (message != '') { 566 $.jGrowl(message, options); 567 } 568 } 569 } 570 }, 571 success: function (message) { 572 miniShop2.Message.show(message, { 573 theme: 'ms2-message-success',
574 sticky: false 575 }); 576 }, 577 error: function (message) { 578 miniShop2.Message.show(message, { 579 theme: 'ms2-message-error', 580 sticky: false 581 }); 582 }, 583 info: function (message) { 584 miniShop2.Message.show(message, { 585 theme: 'ms2-message-info', 586 sticky: false 587 }); 588 } 589 }; 590 591 miniShop2.Utils = { 592 empty: function (val) { 593 return (typeof(val) == 'undefined' || val == 0 || val === null || val === false || (typeof(val) == 'string' && val.replace(/\s+/g, '') == '') || (typeof(val) == 'object' && val.length == 0)); 594 }, 595 formatPrice: function (price) { 596 var pf = miniShop2Config.price_format; 597 price = this.number_format(price, pf[0], pf[1], pf[2]); 598 599 if (miniShop2Config.price_format_no_zeros) { 600 price = price.replace(/(0+)$/, ''); 601 price = price.replace(/[^0-9]$/, ''); 602 } 603 604 return price; 605 }, 606 formatWeight: function (weight) { 607 var wf = miniShop2Config.weight_format; 608 weight = this.number_format(weight, wf[0], wf[1], wf[2]); 609 610 if (miniShop2Config.weight_format_no_zeros) { 611 weight = weight.replace(/(0+)$/, ''); 612 weight = weight.replace(/[^0-9]$/, ''); 613 } 614 615 return weight; 616 }, 617 // Format a number with grouped thousands, 618 number_format: function (number, decimals, dec_point, thousands_sep) { 619 // original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com) 620 // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) 621 // bugfix by: Michael White (http://crestidg.com) 622 var i, j, kw, kd, km; 623 624 // input sanitation & defaults 625 if (isNaN(decimals = Math.abs(decimals))) { 626 decimals = 2; 627 } 628 if (dec_point == undefined) { 629 dec_point = ','; 630 } 631 if (thousands_sep == undefined) { 632 thousands_sep = '.'; 633 } 634 635 i = parseInt(number = (+number || 0).toFixed(decimals)) + ''; 636 637 if ((j = i.length) > 3) { 638 j = j % 3; 639 } 640 else { 641 j = 0; 642 } 643 644 km = j 645 ? i.substr(0, j) + thousands_sep 646 : ''; 647 kw = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep); 648 kd = (decimals 649 ? dec_point + Math.abs(number - i).toFixed(decimals).replace(/-/, '0').slice(2) 650 : ''); 651 652 return km + kw + kd; 653 }, 654 getValueFromSerializedArray: function (name, arr) { 655 if (!$.isArray(arr)) { 656 arr = miniShop2.sendData.formData; 657 } 658 for (var i = 0, length = arr.length; i < length; i++) { 659 if (arr[i].name == name) { 660 return arr[i].value; 661 } 662 } 663 return null; 664 } 665 }; 666 667 $(document).ready(function ($) { 668 miniShop2.initialize(); 669 var html = $('html'); 670 html.removeClass('no-js'); 671 if (!html.hasClass('js')) { 672 html.addClass('js'); 673 } 674 }); 675 676 window.miniShop2 = miniShop2; 677})(window, document, jQuery, miniShop2Config);
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.