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 if (!!$(this).val()) { 251 $(this).closest(miniShop2.form).submit(); 252 } 253 }); 254 }, 255 add: function () { 256 var callbacks = miniShop2.Cart.callbacks; 257 callbacks.add.response.success = function (response) { 258 this.Cart.status(response.data); 259 }; 260 miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.add, miniShop2.Callbacks.Cart.add); 261 }, 262 remove: function () { 263 var callbacks = miniShop2.Cart.callbacks; 264 callbacks.remove.response.success = function (response) { 265 this.Cart.remove_position(miniShop2.Utils.getValueFromSerializedArray('key')); 266 this.Cart.status(response.data); 267 }; 268 miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.remove, miniShop2.Callbacks.Cart.remove); 269 }, 270 change: function () { 271 var callbacks = miniShop2.Cart.callbacks; 272 callbacks.change.response.success = function (response) { 273 if (typeof(response.data.key) == 'undefined') { 274 this.Cart.remove_position(miniShop2.Utils.getValueFromSerializedArray('key')); 275 } 276 else { 277 $('#' + miniShop2.Utils.getValueFromSerializedArray('key')).find(''); 278 } 279 this.Cart.status(response.data); 280 }; 281 miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.change, miniShop2.Callbacks.Cart.change); 282 }, 283 status: function (status) { 284 if (status['total_count'] < 1) { 285 location.reload(); 286 } 287 else { 288 //var $cart = $(miniShop2.Cart.cart); 289 var $miniCart = $(miniShop2.Cart.miniCart); 290 if (status['total_count'] > 0 && !$miniCart.hasClass(miniShop2.Cart.miniCartNotEmptyClass)) { 291 $miniCart.addClass(miniShop2.Cart.miniCartNotEmptyClass); 292 } 293 $(miniShop2.Cart.totalWeight).text(miniShop2.Utils.formatWeight(status['total_weight'])); 294 $(miniShop2.Cart.totalCount).text(status['total_count']); 295 $(miniShop2.Cart.totalCost).text(miniShop2.Utils.formatPrice(status['total_cost'])); 296 if ($(miniShop2.Order.orderCost, miniShop2.Order.order).length) { 297 miniShop2.Order.getcost(); 298 } 299 } 300 }, 301 clean: function () { 302 var callbacks = miniShop2.Cart.callbacks; 303 callbacks.clean.response.success = function (response) { 304 this.Cart.status(response.data); 305 }; 306 307 miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.clean, miniShop2.Callbacks.Cart.clean); 308 }, 309 remove_position: function (key) { 310 $('#' + key).remove(); 311 } 312 }; 313 314 miniShop2.Gallery = { 315 setup: function () { 316 miniShop2.Gallery.gallery = $('#msGallery'); 317 miniShop2.Gallery.files = miniShop2.Gallery.gallery.find('.fotorama'); 318 }, 319 initialize: function () { 320 miniShop2.Gallery.setup(); 321 if (miniShop2.Gallery.files.length) { 322 $('<link/>', { 323 rel: 'stylesheet', 324 type: 'text/css', 325 href: miniShop2Config.cssUrl + 'lib/fotorama.min.css', 326 }).appendTo('head'); 327 $('<script/>', { 328 type: 'text/javascript', 329 src: miniShop2Config.jsUrl + 'lib/fotorama.min.js', 330 }).appendTo('head'); 331 } 332 333 // fix size gallery 334 miniShop2.$doc.on('fotorama:ready', miniShop2.Gallery.files, function (e, Fotorama, extra) { 335 if ((src = Fotorama.activeFrame.src)) { 336 measure = $.Fotorama.measures[src]; 337 if (measure === undefined) { 338 for (i in $.Fotorama.measures) { 339 measure = $.Fotorama.measures[i]; 340 break; 341 } 342 Fotorama.resize(measure); 343 } 344 } 345 }); 346 347 } 348 }; 349 350 miniShop2.Order = { 351 callbacks: { 352 add: miniShop2Config.callbacksObjectTemplate(), 353 getcost: miniShop2Config.callbacksObjectTemplate(), 354 clean: miniShop2Config.callbacksObjectTemplate(), 355 submit: miniShop2Config.callbacksObjectTemplate(), 356 getrequired: miniShop2Config.callbacksObjectTemplate() 357 }, 358 setup: function () { 359 miniShop2.Order.order = '#msOrder'; 360 miniShop2.Order.deliveries = '#deliveries'; 361 miniShop2.Order.payments = '#payments'; 362 miniShop2.Order.deliveryInput = 'input[name="delivery"]'; 363 miniShop2.Order.inputParent = '.input-parent'; 364 miniShop2.Order.paymentInput = 'input[name="payment"]'; 365 miniShop2.Order.paymentInputUniquePrefix = 'input#payment_'; 366 miniShop2.Order.deliveryInputUniquePrefix = 'input#delivery_'; 367 miniShop2.Order.orderCost = '#ms2_order_cost' 368 }, 369 initialize: function () { 370 miniShop2.Order.setup(); 371 if ($(miniShop2.Order.order).length) { 372 miniShop2.$doc 373 .on('click', miniShop2.Order.order + ' [name="' + miniShop2.actionName + '"][value="order/clean"]', function (e) { 374 miniShop2.Order.clean(); 375 e.preventDefault(); 376 }) 377 .on('change', miniShop2.Order.order + ' input,' + miniShop2.Order.order + ' textarea', function () { 378 var $this = $(this); 379 var key = $this.attr('name'); 380 var value = $this.val(); 381 miniShop2.Order.add(key, value); 382 }); 383 var $deliveryInputChecked = $(miniShop2.Order.deliveryInput + ':checked', miniShop2.Order.order); 384 $deliveryInputChecked.trigger('change'); 385 } 386 }, 387 updatePayments: function (payments) { 388 var $paymentInputs = $(miniShop2.Order.paymentInput, miniShop2.Order.order); 389 $paymentInputs.attr('disabled', true).prop('disabled', true).closest(miniShop2.Order.inputParent).hide(); 390 if (payments.length > 0) { 391 for (var i in payments) { 392 if (payments.hasOwnProperty(i)) { 393 $paymentInputs.filter(miniShop2.Order.paymentInputUniquePrefix + payments[i]).attr('disabled', false).prop('disabled', false).closest(miniShop2.Order.inputParent).show(); 394 } 395 } 396 } 397 if ($paymentInputs.filter(':visible:checked').length == 0) { 398 $paymentInputs.filter(':visible:first').trigger('click'); 399 } 400 }, 401 add: function (key, value) { 402 var callbacks = miniShop2.Order.callbacks; 403 var old_value = value; 404 callbacks.add.response.success = function (response) { 405 (function (key, value, old_value) { 406 var $field = $('[name="' + key + '"]', miniShop2.Order.order); 407 switch (key) { 408 case 'delivery': 409 $field = $(miniShop2.Order.deliveryInputUniquePrefix + response.data[key]); 410 if (response.data[key] != old_value) { 411 $field.trigger('click'); 412 } 413 else { 414 miniShop2.Order.getrequired(value); 415 miniShop2.Order.updatePayments($field.data('payments')); 416 miniShop2.Order.getcost(); 417 } 418 break; 419 case 'payment': 420 $field = $(miniShop2.Order.paymentInputUniquePrefix + response.data[key]); 421 if (response.data[key] != old_value) { 422 $field.trigger('click'); 423 } 424 else { 425 miniShop2.Order.getcost(); 426 } 427 break; 428 //default: 429 } 430 $field.val(response.data[key]).removeClass('error').closest(miniShop2.Order.inputParent).removeClass('error'); 431 })(key, value, old_value); 432 }; 433 callbacks.add.response.error = function () { 434 (function (key) { 435 var $field = $('[name="' + key + '"]', miniShop2.Order.order); 436 if ($field.attr('type') == 'checkbox' || $field.attr('type') == 'radio') { 437 $field.closest(miniShop2.Order.inputParent).addClass('error'); 438 } 439 else { 440 $field.addClass('error'); 441 } 442 })(key); 443 }; 444 445 var data = { 446 key: key, 447 value: value 448 }; 449 data[miniShop2.actionName] = 'order/add'; 450 miniShop2.send(data, miniShop2.Order.callbacks.add, miniShop2.Callbacks.Order.add); 451 }, 452 getcost: function () { 453 var callbacks = miniShop2.Order.callbacks; 454 callbacks.getcost.response.success = function (response) { 455 $(miniShop2.Order.orderCost, miniShop2.Order.order).text(miniShop2.Utils.formatPrice(response.data['cost'])); 456 }; 457 var data = {}; 458 data[miniShop2.actionName] = 'order/getcost'; 459 miniShop2.send(data, miniShop2.Order.callbacks.getcost, miniShop2.Callbacks.Order.getcost); 460 }, 461 clean: function () { 462 var callbacks = miniShop2.Order.callbacks; 463 callbacks.clean.response.success = function () { 464 location.reload(); 465 }; 466 467 var data = {}; 468 data[miniShop2.actionName] = 'order/clean'; 469 miniShop2.send(data, miniShop2.Order.callbacks.clean, miniShop2.Callbacks.Order.clean); 470 }, 471 submit: function () { 472 miniShop2.Message.close(); 473 474 // Checking for active ajax request 475 if (miniShop2.ajaxProgress) { 476 //noinspection JSUnresolvedFunction 477 miniShop2.$doc.ajaxComplete(function () { 478 miniShop2.ajaxProgress = false; 479 miniShop2.$doc.unbind('ajaxComplete'); 480 miniShop2.Order.submit(); 481 }); 482 return false; 483 } 484 485 var callbacks = miniShop2.Order.callbacks; 486 callbacks.submit.before = function () { 487 $(':button, a', miniShop2.Order.order).attr('disabled', true).prop('disabled', true); 488 }; 489 callbacks.submit.response.success = function (response) { 490 if (response.data['redirect']) { 491 document.location.href = response.data['redirect']; 492 } 493 else if (response.data['msorder']) { 494 document.location.href = document.location.origin + document.location.pathname 495 + (document.location.search ? document.location.search + '&' : '?') 496 + 'msorder=' + response.data['msorder']; 497 } 498 else { 499 location.reload(); 500 } 501 }; 502 callbacks.submit.response.error = function (response) { 503 setTimeout((function () { 504 $(':button, a', miniShop2.Order.order).attr('disabled', false).prop('disabled', false); 505 }.bind(this)),3 * miniShop2.timeout); 506 $('[name]', miniShop2.Order.order).remov
506eClass('error').closest(miniShop2.Order.inputParent).removeClass('error'); 507 for (var i in response.data) { 508 if (response.data.hasOwnProperty(i)) { 509 var key = response.data[i]; 510 //var $field = $('[name="' + response.data[i] + '"]', miniShop2.Order.order); 511 //$field.addClass('error').closest(miniShop2.Order.inputParent).addClass('error'); 512 var $field = $('[name="' + key + '"]', miniShop2.Order.order); 513 if ($field.attr('type') == 'checkbox' || $field.attr('type') == 'radio') { 514 $field.closest(miniShop2.Order.inputParent).addClass('error'); 515 } 516 else { 517 $field.addClass('error'); 518 } 519 } 520 } 521 }; 522 return miniShop2.send(miniShop2.sendData.formData, miniShop2.Order.callbacks.submit, miniShop2.Callbacks.Order.submit); 523 }, 524 getrequired: function (value) { 525 var callbacks = miniShop2.Order.callbacks; 526 callbacks.getrequired.response.success = function (response) { 527 $('[name]', miniShop2.Order.order).removeClass('required').closest(miniShop2.Order.inputParent).removeClass('required'); 528 var requires = response.data['requires']; 529 for (var i = 0, length = requires.length; i < length; i++) { 530 $('[name=' + requires[i] + ']', miniShop2.Order.order).addClass('required').closest(miniShop2.Order.inputParent).addClass('required'); 531 } 532 }; 533 callbacks.getrequired.response.error = function () { 534 $('[name]', miniShop2.Order.order).removeClass('required').closest(miniShop2.Order.inputParent).removeClass('required'); 535 }; 536 537 var data = { 538 id: value 539 }; 540 data[miniShop2.actionName] = 'order/getrequired'; 541 miniShop2.send(data, miniShop2.Order.callbacks.getrequired, miniShop2.Callbacks.Order.getrequired); 542 } 543 }; 544 545 miniShop2.Message = { 546 initialize: function () { 547 miniShop2.Message.close = function () { 548 }; 549 miniShop2.Message.show = function (message) { 550 if (message != '') { 551 alert(message); 552 } 553 }; 554 555 if (typeof($.fn.jGrowl) != 'function') { 556 $.getScript(miniShop2Config.jsUrl + 'lib/jquery.jgrowl.min.js', function () { 557 miniShop2.Message.initialize(); 558 }); 559 } 560 else { 561 $.jGrowl.defaults.closerTemplate = '<div>[ ' + miniShop2Config.close_all_message + ' ]</div>'; 562 miniShop2.Message.close = function () { 563 $.jGrowl('close'); 564 }; 565 miniShop2.Message.show = function (message, options) { 566 if (message != '') { 567 $.jGrowl(message, options); 568 } 569 } 570 } 571 }, 572 success: function (message) { 573 miniShop2.Message.show(message, { 574 theme: 'ms2-message-success', 575 sticky: false 576 }); 577 }, 578 error: function (message) { 579 miniShop2.Message.show(message, { 580 theme: 'ms2-message-error', 581 sticky: false 582 }); 583 }, 584 info: function (message) { 585 miniShop2.Message.show(message, { 586 theme: 'ms2-message-info', 587 sticky: false 588 }); 589 } 590 }; 591 592 miniShop2.Utils = { 593 empty: function (val) { 594 return (typeof(val) == 'undefined' || val == 0 || val === null || val === false || (typeof(val) == 'string' && val.replace(/\s+/g, '') == '') || (typeof(val) == 'object' && val.length == 0)); 595 }, 596 formatPrice: function (price) { 597 var pf = miniShop2Config.price_format; 598 price = this.number_format(price, pf[0], pf[1], pf[2]); 599 600 if (miniShop2Config.price_format_no_zeros && pf[0] > 0) { 601 price = price.replace(/(0+)$/, ''); 602 price = price.replace(/[^0-9]$/, ''); 603 } 604 605 return price; 606 }, 607 formatWeight: function (weight) { 608 var wf = miniShop2Config.weight_format; 609 weight = this.number_format(weight, wf[0], wf[1], wf[2]); 610 611 if (miniShop2Config.weight_format_no_zeros && wf[0] > 0) { 612 weight = weight.replace(/(0+)$/, ''); 613 weight = weight.replace(/[^0-9]$/, ''); 614 } 615 616 return weight; 617 }, 618 // Format a number with grouped thousands, 619 number_format: function (number, decimals, dec_point, thousands_sep) { 620 // original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com) 621 // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) 622 // bugfix by: Michael White (http://crestidg.com) 623 var i, j, kw, kd, km; 624 625 // input sanitation & defaults 626 if (isNaN(decimals = Math.abs(decimals))) { 627 decimals = 2; 628 } 629 if (dec_point == undefined) { 630 dec_point = ','; 631 } 632 if (thousands_sep == undefined) { 633 thousands_sep = '.'; 634 } 635 636 i = parseInt(number = (+number || 0).toFixed(decimals)) + ''; 637 638 if ((j = i.length) > 3) { 639 j = j % 3; 640 } 641 else { 642 j = 0; 643 } 644 645 km = j 646 ? i.substr(0, j) + thousands_sep 647 : ''; 648 kw = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep); 649 kd = (decimals 650 ? dec_point + Math.abs(number - i).toFixed(decimals).replace(/-/, '0').slice(2) 651 : ''); 652 653 return km + kw + kd; 654 }, 655 getValueFromSerializedArray: function (name, arr) { 656 if (!$.isArray(arr)) { 657 arr = miniShop2.sendData.formData; 658 } 659 for (var i = 0, length = arr.length; i < length; i++) { 660 if (arr[i].name == name) { 661 return arr[i].value; 662 } 663 } 664 return null; 665 } 666 }; 667 668 $(document).ready(function ($) { 669 miniShop2.initialize(); 670 var html = $('html'); 671 html.removeClass('no-js'); 672 if (!html.hasClass('js')) { 673 html.addClass('js'); 674 } 675 });
676 677 window.miniShop2 = miniShop2; 678})(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.