PageSourceSearch

https://www.iq-spacecom.com/media/j2store/js/j2store.js?0d94ae

js iq-spacecom.com collected 2026-10-06 04:54:55 UTC 24,125 bytes, 792 lines download raw bytes

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">&nbsp;<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.