1/** 2 * Setup (required for Joomla! 3) 3 */ 4if(typeof jQuery === 'undefined' || (parseInt(jQuery.fn.jquery) === 1 && parseFloat(jQuery.fn.jquery.replace(/^1\./,'')) < 10)){ 5 var head = document.getElementsByTagName('head')[0]; 6 var script = document.createElement('script'); 7 script.src = '//ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js'; 8 script.type = 'text/javascript'; 9 script.onload = script.onreadystatechange = function() { 10 if (script.readyState) { 11 if (script.readyState === 'complete' || script.readyState === 'loaded') { 12 script.onreadystatechange = null; 13 onload(jQuery.noConflict(true)); 14 } 15 } 16 else { 17 onload(jQuery.noConflict(true)); 18 } 19 }; 20 head.appendChild(script); 21} 22if(typeof(j2store) == 'undefined') { 23 var j2store = {}; 24} 25if(typeof(j2store.jQuery) == 'undefined') { 26 j2store.jQuery = jQuery.noConflict(); 27} 28 29if(typeof(j2storeURL) == 'undefined') { 30 var j2storeURL = ''; 31} 32 33//make sure the ajax requests are not cached 34(function($) { 35 $(document).ready(function() { 36 $.ajaxSetup({ 37 cache: false, 38 headers: { 39 'Cache-Control': 'no-cache, no-store, must-revalidate', 40 'Pragma': 'no-cache', 41 'Expires': '0' 42 } 43 }); 44 }); 45})(j2store.jQuery); 46 47(function($) { 48// Ajax add to cart 49$( document ).on( 'click', '.j2store_add_to_cart_button', function(e) { 50 51 // AJAX add to cart request 52 var $thisbutton = $( this ); 53 54 if ( ! $thisbutton.attr( 'data-product_id' ) ) 55 return true; 56 57 $thisbutton.removeClass( 'added' ); 58 $thisbutton.addClass( 'loading' ); 59 60 var data = { 61 option: 'com_j2store', 62 view: 'carts', 63 task: 'addItem', 64 ajax: '1', 65 }; 66 67 $.each( $thisbutton.data(), function( key, value ) { 68 data[key] = value; 69 }); 70 71 // Trigger event 72 $( 'body' ).trigger( 'adding_to_cart', [ $thisbutton, data ] ); 73 74 var href = $thisbutton.attr('href'); 75 if(typeof href === 'undefined' || href === '') { 76 href = 'index.php'; 77 } 78 79 // Ajax action 80 $.post( href, data, function( response ) { 81 82 if ( ! response ) 83 return; 84 85 var this_page = window.location.toString(); 86 87 this_page = this_page.replace( 'add-to-cart', 'added-to-cart' ); 88 89 if (response['error']) { 90 window.location = response.product_url; 91 return; 92 } 93 94 if (response['redirect']) { 95 window.location.href = response['redirect']; 96 return; 97 } 98 if (response['success']) { 99 $thisbutton.removeClass( 'loading' ); 100 // Changes button classes 101 $thisbutton.addClass( 'added' ); 102 $thisbutton.parent().find('.cart-action-complete').show(); 103 //if module is present, let us update it. 104 $( 'body' ).trigger( 'after_adding_to_cart', [ $thisbutton, response, 'link'] ); 105 //doMiniCart(); 106 } 107 }, 'json'); 108 109 return false; 110 111}); 112})(j2store.jQuery); 113 114 115(function($) { 116 $(document).ready(function(){ 117 $('.j2store-addtocart-form').each(function(){ 118 $(this).submit(function(e) { 119 e.preventDefault(); 120 var form = $(this); 121 122 //this will help detect if the form is submitted via ajax or normal submit. 123 //sometimes people will submit the form before the DOM loads 124 form.find('input[name=\'ajax\']').val(1); 125 /* Get input values from form */ 126 var values = form.find('input[type=\'text\'], input[type=\'number\'], input[type=\'hidden\'], input[type=\'radio\']:checked, input[type=\'checkbox\']:checked, select, textarea'); 127 form.find('input[type=\'submit\']').val(form.find('input[type=\'submit\']').data('cart-action-always')); 128 form.find('input[type=\'submit\']').attr('disabled',true); 129 var href = form.attr('action'); 130 if(typeof href == 'undefined' || href == '') { 131 var href = 'index.php'; 132 } 133 // Trigger event 134 $( 'body' ).trigger( 'adding_to_cart', [ form, values ] ); 135 //var values = form.serializeArray(); 136 var j2Ajax = $.ajax({ 137 url: href, 138 type: 'post', 139 data: values, 140 dataType: 'json' 141 142 }); 143 144 j2Ajax.done(function(json) { 145 form.find('input[type=\'submit\']').attr('disabled',false); 146 form.find('.j2success, .j2warning, .j2attention, .j2information, .j2error').remove(); 147 $('.j2store-notification').hide(); 148 if (json['error']) { 149 150 form.find('input[type=\'submit\']').val(form.find('input[type=\'submit\']').data('cart-action-done')); 151 152 if (json['error']['option']) { 153 for (i in json['error']['option']) { 154 form.find('#option-' + i).after('<span class="j2error">' + json['error']['option'][i] + '</span>'); 155 } 156 } 157 if (json['error']['stock']) { 158 form.find('.j2store-notifications').html('<span class="j2error">' + json['error']['stock'] + '</span>'); 159 } 160 161 if (json['error']['general']) { 162 form.find('.j2store-notifications').html('<span class="j2error">' + json['error']['general'] + '</span>'); 163 } 164 165 if (json['error']['product']) { 166 form.find('.j2store-notifications').after('<span class="j2error">' + json['error']['product'] + '</span>'); 167 } 168 } 169 170 if (json['redirect']) { 171 window.location.href = json['redirect']; 172 return; 173 } 174 175 if (json['success']) { 176 setTimeout(function() { 177 form.find('input[type=\'submit\']').val(form.find('input[type=\'submit\']').data('cart-action-done'));
178 form.find('.cart-action-complete').fadeIn('slow'); 179 }, form.find('input[type=\'submit\']').data('cart-action-timeout')); 180 181 $( 'body' ).trigger( 'after_adding_to_cart', [form, json, 'normal'] ); 182 //if module is present, let us update it. 183 // doMiniCart(); 184 } 185 }) 186 .fail(function( jqXHR, textStatus, errorThrown) { 187 form.find('input[type=\'submit\']').val(form.find('input[type=\'submit\']').data('cart-action-done')); 188 console.log(textStatus + errorThrown); 189 }) 190 .always(function(jqXHR, textStatus, errorThrown) { 191 //form.find('input[type=\'submit\']').val(form.find('input[type=\'submit\']').data('cart-action-always')); 192 }); 193 }); 194 }); //end of ajax call 195 }); //end of document ready 196})(j2store.jQuery); 197 198 199(function($) { 200$(document).ready(function(){ 201 202 if ($('#j2store_shipping_make_same').length > 0) { 203 if ($('#j2store_shipping_make_same').is(':checked')) { 204 $('#j2store_shipping_section').css({'visible' : 'visible', 'display' : 'none'}); 205 206 $('#j2store_shipping_section').children(".input-label").removeClass("required"); 207 208 $('#j2store_shipping_section').children(".input-text").removeClass("required"); 209 } 210 } 211 212}); 213})(j2store.jQuery); 214 215function doMiniCart() { 216(function($) { 217 var murl = j2storeURL 218 + 'index.php?option=com_j2store&view=carts&task=ajaxmini'; 219 220 $.ajax({ 221 url : murl, 222 type : 'get', 223 cache : false, 224 contentType : 'application/json; charset=utf-8', 225 dataType : 'json', 226 success : function(json) { 227 if (json != null && json['response']) { 228 $.each(json['response'], function(key, value) { 229 if ($('.j2store_cart_module_' + key).length) { 230 $('.j2store_cart_module_' + key).each(function() { 231 $(this).html(value); 232 }); 233 } 234 }); 235 } 236 } 237 238 }); 239 240})(j2store.jQuery); 241 242} 243 244function j2storeDoTask(url, container, form, msg, formdata) { 245 246 (function($) { 247 //to make div compatible 248 container = '#'+container; 249 250 // if url is present, do validation 251 if (url && form) { 252 var str = $(form).serialize(); 253 // execute Ajax request to server 254 $.ajax({ 255 url : url, 256 type : 'get', 257 cache: false, 258 contentType: 'application/json; charset=utf-8', 259 data: formdata, 260 dataType: 'json', 261 beforeSend: function() { 262 $(container).before('<span class="wait"><img src="'+j2storeURL+'media/j2store/images/loader.gif" alt="" /></span>'); 263 }, 264 complete: function() { 265 $('.wait').remove(); 266 }, 267 // data:{"elements":Json.toString(str)}, 268 success: function(json) { 269 if ($(container).length > 0) { 270 $(container).html(json.msg); 271 } 272 return true; 273 } 274 }); 275 } else if (url && !form) { 276 // execute Ajax request to server 277 $.ajax({ 278 url : url, 279 type: 'get', 280 cache: false, 281 contentType: 'application/json; charset=utf-8', 282 data: formdata, 283 dataType: 'json', 284 beforeSend: function() { 285 $(container).before('<span class="wait"><img src="'+j2storeURL+'media/j2store/images/loader.gif" alt="" /></span>'); 286 }, 287 complete: function() { 288 $('.wait').remove(); 289 }, 290 success: function(json) { 291 if ($(container).length > 0) { 292 $(container).html(json.msg); 293 } 294 } 295 }); 296 } 297 })(j2store.jQuery); 298} 299 300function j2storeSetShippingRate(name, price, tax, extra, code, combined, ship_element, css_id ) 301{ 302 303(function($) { 304 $("input[type='hidden'][name='shipping_name']").val(name); 305 $("input[type='hidden'][name='shipping_code']").val(code); 306 $("input[type='hidden'][name='shipping_price']").val(price); 307 $("input[type='hidden'][name='shipping_tax']").val(tax); 308 $("input[type='hidden'][name='shipping_extra']").val(extra); 309 var ship_name = name.replace(' ',''); 310 $('#onCheckoutShipping_wrapper .shipping_element').hide(); 311 $('#onCheckoutShipping_wrapper .'+css_id+'_select_text').show(); 312})(j2store.jQuery); 313 314} 315 316 317function doAjaxFilter(pov_id, product_id, po_id, id) { 318 (function($) { 319 320 if (pov_id == '' || $('#ChildOptions' + po_id).length != 0) { 321 $('#ChildOptions' + po_id).html(''); 322 } 323 324 var form = $(id).closest('form'); 325 //sanity check 326 if(form.data('product_id') != product_id) return; 327 328 var values = form.serializeArray(); 329 // pop these params from values-> task : add & view : mycart 330 values.pop({ 331 name : "task", 332 value : 'addItem' 333 }); 334 335 values.pop({ 336 name : "view", 337 value : 'carts' 338 }); 339 340 values.push({ 341 name : "product_id", 342 value :product_id 343 }); 344 345 var arrayClean = function(thisArray) { 346 "use strict"; 347 $.each(thisArray, function(index, item) { 348 if (item.name == 'task' || item.name == 'view') { 349 delete values[index]; 350 } 351 }); 352 } 353 arrayClean(values); 354 355 //variable check 356 if(form.data('product_type') == 'advancedvariable') { 357 358 var csv = []; 359 form.find('input[type=\'radio\']:checked, select').each( function( index, el ) { 360 if(el.value){ 361 if($(el).data('is-variant')){ 362 csv.push(el.value); 363 } 364 } 365 }); 366 367 //need to sort the csv array to make sure correct array orde passing 368 369 var processed_csv =[]; 370 processed_csv = csv.sort(function(a, b){return a-b});
371 372 var $selected_variant = processed_csv.join(); 373 374 //get all variants 375 //var $variants = form.data('product_variants'); 376 377 378 var $variants = form.data('product_variants'); 379 380 381 var $variant_id = get_matching_variant($variants, $selected_variant); 382 383 form.find('input[name=\'variant_id\']').val($variant_id); 384 385 386 values.push({ 387 name : "variant_id", 388 value :$variant_id 389 }); 390 } 391 values = values.filter(function( element ) { 392 return element !== undefined; 393 }); 394 values = jQuery.param(values); 395 $( 'body' ).trigger( 'before_doAjaxFilter', [ form, values ] ); 396 $.ajax({ 397 url : j2storeURL+'index.php?option=com_j2store&view=products&task=update&po_id=' 398 + po_id 399 + '&pov_id=' 400 + pov_id 401 + '&product_id=' 402 + product_id, 403 type : 'get', 404 cache : false, 405 data : values, 406 dataType : 'json', 407 beforeSend: function() { 408 $('#option-' + po_id).append('<span class="wait"> <img src="'+j2storeURL+'media/j2store/images/loader.gif" alt="" /></span>'); 409 }, 410 complete: function() { 411 $('.wait').remove(); 412 }, 413 success : function(response) { 414 415 var $product = $('.product-'+ product_id); 416 417 if ($product.length 418 && typeof response.error == 'undefined') { 419 420 //SKU 421 if (response.sku) { 422 $product.find('.sku').text(response.sku); 423 } 424 //base price 425 if (response.pricing.base_price) { 426 $product.find('.base-price').html(response.pricing.base_price); 427 } 428 //price 429 if (response.pricing.price) { 430 $product.find('.sale-price').html(response.pricing.price); 431 } 432 433 //afterDisplayPrice 434 if (response.afterDisplayPrice) { 435 $product.find('.afterDisplayPrice').html(response.afterDisplayPrice); 436 } 437 438 //qty 439 if (response.quantity) { 440 $product.find('input[name="product_qty"]').val(response.quantity); 441 if(form.data('product_type') == 'variable' || form.data('product_type') == 'advancedvariable') { 442 $product.find('input[name="product_qty"]').attr({ 443 value: response.quantity 444 }); 445 } 446 } 447 448 //dimensions 449 if (response.dimensions) { 450 $product.find('.product-dimensions').text(response.dimensions); 451 } 452 453 //weight 454 if (response.weight) { 455 $product.find('.product-weight').text(response.weight); 456 } 457 // main image change 458 if(response.main_image){ 459 j2store.jQuery('.j2store-product-main-image-'+product_id).attr("src", response.main_image); 460 $product.find('.j2store-mainimage .j2store-img-responsive').attr("src", response.main_image); 461 $product.find('.j2store-product-additional-images .additional-mainimage').attr("src", response.main_image); 462 } 463 464 //discount text 465 if(response.pricing.discount_text){ 466 467 $product.find('.discount-percentage').html(response.pricing.discount_text); 468 }else{ 469 $product.find('.discount-percentage').addClass('no-discount'); 470 } 471 472 //stock status 473 474 if (typeof response.stock_status != 'undefined') { 475 if (response.availability == 1) { 476 $product.find('.product-stock-container').html('<span class="instock">' + response.stock_status + '</span>'); 477 }else { 478 $product.find('.product-stock-container').html('<span class="outofstock">' + response.stock_status + '</span>'); 479 } 480 } 481 482 // option html 483 if (response.optionhtml) { 484 $product.find(' #ChildOptions' + po_id).html(response.optionhtml); 485 } 486 487 } 488 $( 'body' ).trigger( 'after_doAjaxFilter_response', [ $product, response ] ); 489 }, 490 error : function(xhr, ajaxOptions, thrownError) { 491 console.log(thrownError + "\r\n" + xhr.statusText 492 + "\r\n" + xhr.responseText); 493 } 494 }); 495 })(j2store.jQuery); 496} 497 498function get_matching_variant(variants, selected) { 499 for(var i in variants) { 500 if(variants[i] == selected) return i; 501 } 502} 503 504 505function doAjaxPrice(product_id, id) { 506 (function($) { 507 /* Get input values from form */ 508 var form = $(id).closest('form'); 509 //sanity check 510 if(form.data('product_id') != product_id) return; 511 form.find('input[type=\'submit\']').attr('disabled',true); 512 var values = form.serializeArray(); 513 //pop these params from values-> task : add & view : mycart 514 values.pop({ 515 name : "task", 516 value : 'addItem' 517 }); 518 519 values.pop({ 520 name : "view", 521 value : 'carts' 522 }); 523 524 values.push({ 525 name : "product_id", 526 value :product_id 527 }); 528 529 var arrayClean = function(thisArray) { 530 "use strict"; 531 $.each(thisArray, function(index, item) { 532 if (item.name == 'task' || item.name == 'view') { 533 delete values[index]; 534 } 535 }); 536 } 537 arrayClean(values); 538 539 //variable check 540 if(form.data('product_type') == 'variable' || form.data('product_type') == 'advancedvariable' || form.data('product_type') == 'variablesubscriptionproduct') { 541 var csv = []; 542 if(form.data('product_type') == 'advancedvariable') { 543 form.find('input[type=\'radio\']:checked, select').each( function( index, el ) { 544 if(el.value){ 545 if($(el).data('is-variant')){ 546 csv.push(el.value); 547 } 548 } 549 }); 550 }else { 551 form.find('input[type=\'radio\']:checked, select').each( function( index, el ) { 552 csv.push(el.value); 553 }); 554 } 555 var processed_csv =[]; 556 processed_csv = csv.sort(function(a, b){return a-b});
557 558 var $selected_variant = processed_csv.join(); 559 //get all variants 560 var $variants = form.data('product_variants'); 561 562 var $variant_id = get_matching_variant($variants, $selected_variant); 563 form.find('input[name=\'variant_id\']').val($variant_id); 564 565 values.push({ 566 name : "variant_id", 567 value :$variant_id 568 }); 569 } 570 values = values.filter(function( element ) { 571 return element !== undefined; 572 }); 573 $( 'body' ).trigger( 'before_doAjaxPrice', [ form, values ] ); 574 $('.j2store-notifications .j2error').html(''); 575 $.ajax({ 576 url : j2storeURL+ 'index.php?option=com_j2store&view=product&task=update', 577 type : 'get', 578 data : values, 579 dataType : 'json', 580 success : function(response) { 581 582 var $product = $('.product-'+ product_id); 583 form.find('input[type=\'submit\']').attr('disabled',false); 584 if ($product.length 585 && typeof response.error == 'undefined') { 586 //SKU 587 if (response.sku) { 588 $product.find('.sku').text(response.sku); 589 } 590 //base price 591 if (response.pricing.base_price) { 592 $product.find('.base-price').html(response.pricing.base_price); 593 if(response.pricing.class){ 594 if(response.pricing.class == 'show'){ 595 $product.find('.base-price').show() 596 }else{ 597 $product.find('.base-price').hide() 598 } 599 } 600 } 601 //price 602 if (response.pricing.price) { 603 $product.find('.sale-price').html(response.pricing.price); 604 } 605 606 //afterDisplayPrice 607 if (response.afterDisplayPrice) { 608 $product.find('.afterDisplayPrice').html(response.afterDisplayPrice); 609 } 610 //qty 611 if (response.quantity) { 612 $product.find('input[name="product_qty"]').val(response.quantity); 613 if(form.data('product_type') == 'variable' || form.data('product_type') == 'advancedvariable' || form.data('product_type') == 'variablesubscriptionproduct') { 614 $product.find('input[name="product_qty"]').attr({ 615 value: response.quantity 616 }); 617 } 618 } 619 if(response.main_image){ 620 621 j2store.jQuery('.j2store-product-main-image-'+product_id).attr("src", response.main_image); 622 $product.find('.j2store-mainimage .j2store-img-responsive').attr("src", response.main_image); 623 $product.find('.j2store-product-additional-images .additional-mainimage').attr("src", response.main_image); 624 } 625 //stock status 626 627 if (typeof response.stock_status != 'undefined') { 628 if (response.availability == 1) { 629 $product.find('.product-stock-container').html('<span class="instock">' + response.stock_status + '</span>'); 630 }else { 631 $product.find('.product-stock-container').html('<span class="outofstock">' + response.stock_status + '</span>'); 632 } 633 } 634 635 //dimensions 636 if (response.dimensions) { 637 $product.find('.product-dimensions').text(response.dimensions); 638 } 639 640 //weight 641 if (response.weight) { 642 $product.find('.product-weight').text(response.weight); 643 } 644 // discount text 645 $product.find('.discount-percentage').html(response.pricing.discount_text); 646 // Trigger event 647 $( 'body' ).trigger( 'after_doAjaxFilter', [ $product, response ] ); 648 $( 'body' ).trigger( 'after_doAjaxPrice', [ $product, response ] ); 649 } 650 }, 651 error : function(xhr, ajaxOptions, thrownError) { 652 console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" 653 + xhr.responseText); 654 } 655 }); 656 })(j2store.jQuery); 657} 658 659function setMainPreview(addimagId, product_id, imageZoom, zoom_type){ 660 zoom_type = zoom_type || "outer"; 661 var src =""; 662 (function($){ 663 var $elem = $("#"+addimagId); 664 // Check if element exists 665 if(!$elem.length) { 666 return; 667 } 668 // Get src from the element itself if it's an img, or from the img inside it 669 src = $elem.is('img') ? $elem.attr('src') : $elem.find('img').attr('src'); 670 // Only proceed if we have a valid src (not undefined, not empty, not "undefined" str
670ing) 671 if(!src || src === 'undefined' || typeof src === 'undefined' || src === '') { 672 return; 673 } 674 675 var $mainImg = $("#j2store-item-main-image-"+product_id + " img"); 676 // Check if main image element exists 677 if(!$mainImg.length) { 678 return; 679 } 680 $mainImg.attr('src', src); 681 // Also update data-zoom-image to prevent elevateZoom from loading undefined 682 $mainImg.attr('data-zoom-image', src); 683 })(j2store.jQuery); 684} 685 686function removeAdditionalImage(product_id, main_image, imageZoom, zoom_type){ 687 zoom_type = zoom_type || "outer"; 688 (function($){ 689 $("#j2store-item-main-image-"+product_id+ " img").attr('src',main_image); 690 setMainPreview('j2store-item-main-image-'+product_id, product_id, imageZoom, zoom_type); 691 })(j2store.jQuery); 692} 693 694/** 695 * Method to Submit the Form 696 * used product list view filters 697 */ 698function getJ2storeFiltersSubmit(){ 699 //show the loading image 700 jQuery("#j2store-product-loading").show(); 701 //submit the form 702 jQuery("#productsideFilters").submit(); 703} 704 705 706 function resetJ2storeBrandFilter(inputid){ 707 if(inputid){ 708 jQuery("#productsideFilters").find("#"+inputid).prop('checked',false); 709 }else{ 710 jQuery(".j2store-brand-checkboxes").each( function(){ 711 this.checked = false; 712 }); 713 } 714 //getJ2storeFiltersSubmit(); 715} 716 717 718/** 719 * Method to reset the vendor filter 720 */ 721 function resetJ2storeVendorFilter(inputid){ 722 if(inputid){ 723 jQuery("#productsideFilters").find("#"+inputid).prop('checked',false); 724 }else{ 725 jQuery(".j2store-vendor-checkboxes").each( function(){ 726 this.checked = false; 727 }); 728 } 729// getJ2storeFiltersSubmit(); 730} 731 732 733/** 734 * Method to Reset Product Filter Based on the group 735 * @params string productfilter checkboxes class name 736 * @return result 737 */ 738 function resetJ2storeProductFilter(productfilter_class,inputid){ 739 if(productfilter_class){ 740 //loop the class element 741 jQuery("."+productfilter_class).each( function(){ 742 //set the checked to false 743 this.checked = false; 744 }); 745 746 }else if(inputid){ 747 jQuery("#productsideFilters").find("#"+inputid).prop('checked',false); 748 } 749// getJ2storeFiltersSubmit(); 750} 751 752/** Toggle Methods **/ 753function getPriceFilterToggle(){ 754 (function($) { 755 $('#price-filter-icon-plus').toggle(); 756 $('#price-filter-icon-minus').toggle(); 757 $('#j2store-slider-range').toggle(); 758 $('#j2store-slider-range-box').toggle(); 759 })(j2store.jQuery); 760} 761 762function getCategoryFilterToggle(){ 763 (function($) { 764 $('#cat-filter-icon-plus').toggle(); 765 $('#cat-filter-icon-minus').toggle(); 766 $('#j2store_category').toggle(); 767 })(j2store.jQuery); 768} 769 770function getBrandFilterToggle(){ 771 (function($) { 772 $('#brand-filter-icon-plus').toggle(); 773 $('#brand-filter-icon-minus').toggle(); 774 $('#j2store-brand-filter-container').toggle(); 775 })(j2store.jQuery); 776} 777 778function getVendorFilterToggle(){ 779 (function($) { 780 $('#vendor-filter-icon-plus').toggle(); 781 $('#vendor-filter-icon-minus').toggle(); 782 $('#j2store-vendor-filter-container').toggle(); 783 })(j2store.jQuery); 784} 785 786function getPFFilterToggle(id){ 787 (function($) { 788 $('#pf-filter-icon-plus-'+id).toggle(); 789 $('#pf-filter-icon-minus-'+id).toggle(); 790 $('#j2store-pf-filter-'+id).toggle(); 791 })(j2store.jQuery); 792}
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.