PageSourceSearch

https://dehaakfabriekwebshop.nl/wp-content/themes/uncode/library/js/woocommerce-variations.js?ver=1216623653

js dehaakfabriekwebshop.nl collected 2026-09-27 02:05:20 UTC 39,405 bytes, 1,076 lines download raw bytes

1(function($) {
2	"use strict";
3
4	var Utils = {
5		/**
6		 * Get first avaialble variation from an attribute
7		 */
8		get_single_variation_from_attribute: function(variation, attribute, attribute_value) {
9			if (variation) {
10				for (var attr_name in variation) {
11					if (attr_name === 'attributes' && variation.hasOwnProperty(attr_name)) {
12						var variation_attr = variation[attr_name];
13						var attribute_name = 'attribute_' + attribute;
14
15						if (variation_attr.hasOwnProperty(attribute_name) && variation_attr[attribute_name] === attribute_value) {
16							return variation;
17						}
18					}
19				}
20			}
21
22			return false;
23		},
24
25		/**
26		 * Find an URL parameter and get its value
27		 */
28		get_url_parameter: function(key) {
29			var url = window.location.search.substring(1);
30			var url_variables = url.split('&');
31			var param_key;
32			var i;
33
34			for (i = 0; i < url_variables.length; i++) {
35				param_key = url_variables[i].split('=');
36
37				if (param_key[0] === key) {
38					return param_key[1] === undefined ? true : decodeURIComponent(param_key[1]);
39				}
40			}
41			return false;
42		}
43	}
44
45	var Single_Product = {
46		has_variation_changed: false,
47		doing_clear: false,
48		first_load: true,
49
50		/**
51		 * Add variable products to the cart via AJAX
52		 */
53		variable_add_to_cart: function() {
54			if (window.wc_add_to_cart_params != undefined && window.UncodeWCParameters != undefined && UncodeWCParameters.variations_ajax_add_to_cart === '1') {
55				$('form.variations_form').on('submit', function(e) {
56					var form = $(this);
57					var product_wrapper = form.closest('.tmb-woocommerce')
58					var is_loop = false;
59
60					if (product_wrapper.length === 0) {
61						product_wrapper = form.closest('.product-type-variable');
62
63						if (product_wrapper.length === 0) {
64							return;
65						}
66					} else {
67						is_loop = true;
68					}
69
70					e.preventDefault();
71
72					var form_button = form.find('.single_add_to_cart_button');
73					var form_data = form.serialize();
74
75					form_data += '&action=uncode_ajax_add_to_cart';
76
77					if (form_button.val()) {
78						form_data += '&add-to-cart=' + form_button.val();
79					}
80
81					form_button.removeClass( 'added', 'added-error' );
82					form_button.addClass( 'loading' );
83
84					if (is_loop) {
85						var loop_button = product_wrapper.find('.add_to_cart_button').not(':button');
86
87						loop_button.removeClass( 'added', 'added-error' );
88						loop_button.addClass( 'loading' );
89					}
90
91					$.ajax({
92						url     : wc_add_to_cart_params.ajax_url,
93						data    : form_data,
94						method  : 'POST',
95						success : function(response) {
96							if (!response) {
97								return;
98							}
99
100							if (UncodeWCParameters.redirect_after_add === '1') {
101								window.location = UncodeWCParameters.cart_url;
102							} else {
103								form_button.removeClass( 'loading' );
104								if (is_loop) {
105									loop_button.removeClass( 'loading' );
106								}
107
108								if (fragments) {
109									$.each(fragments, function(key) {
110										$(key).addClass('updating');
111									});
112								}
113
114								if (fragments) {
115									$.each(fragments, function(key, value) {
116										$(key).replaceWith(value);
117									});
118								}
119
120								var fragments = response.fragments;
121								var cart_hash = response.cart_hash;
122
123								var notices_wrapper = $('.woocommerce-notices-wrapper');
124
125								if (notices_wrapper.length > 0) {
126									notices_wrapper.empty();
127								}
128
129								if (response.notices.indexOf('error') > 0) {
130									if (notices_wrapper.length > 0) {
131										notices_wrapper.append(response.notices);
132									}
133									form_button.addClass('added-error');
134									if (is_loop) {
135										loop_button.addClass('added-error');
136									}
137								} else {
138									form_button.addClass('added');
139									if (is_loop) {
140										loop_button.addClass('added');
141									}
142									$(document.body).trigger('added_to_cart', [
143										fragments,
144										cart_hash,
145										form_button
146									]);
147								}
148							}
149						},
150						error: function() {
151							if (SiteParameters.enable_debug == true) {
152								// This console log is disabled by default
153								// So nothing is printed in a typical installation
154								//
155								// It can be enabled for debugging purposes setting
156								// the 'uncode_enable_debug_on_js_scripts' filter to true
157								console.log('There was an error when adding the product to the cart');
158							}
159						}
160					});
161				});
162			}
163		},
164
165		/**
166		 * Update the product gallery replacing its content
167		 * with the new one (when changing variations)
168		 */
169		update_variation_gallery: function(event, variation, form, gallery_params, clear) {
170			if (clear && !Single_Product.has_variation_changed) {
171				var form = $(event.target);
172				$('.product-gallery-placeholder').removeClass('product-gallery-placeholder');
173				$(window).trigger('uncode_wc_variation_gallery_loaded');
174				form.removeClass('is-updating-gallery');
175				return;
176			}
177
178			if (clear && Single_Product.doing_clear) {
179				form.removeClass('is-updating-gallery');
180				return;
181			}
182
183			if (clear) {
184				Single_Product.doing_clear = true;
185			}
186
187			if (!clear) {
188				Single_Product.doing_clear = false;
189			}
190
191			var quick_view_container = form.closest('.quick-view-container');
192			var old_gallery = quick_view_container.length > 0 ? quick_view_container.find('.uncode-single-product-gallery') : $('.uncode-single-product-gallery');
193
194			old_gallery.addClass('product-gallery-placeholder');
195
196			var product_id = form.attr('data-product_id');
197			var parent_gallery = old_gallery.parent();
198
199			$.ajax({
200				url: UncodeWCParameters.ajax_url,
201				data: {
202					action: 'uncode_get_variation_gallery',
203					variation: typeof variation !== 'undefined' ? variation : 0,
204					product_id: product_id,
205					clear: clear,
206					gallery_params: gallery_params,
207					is_quick_view: quick_view_container.length > 0 ? true : false,
208				},
209				type: 'post',
210				success: function(response) {
211					if (!response) {
212						form.removeClass('is-updating-gallery');
213						return;
214					}
215
216					if (response.data && response.data.html) {
217						var new_gallery = $(response.data.html);
218
219						if (new_gallery.length > 0) {
220							new_gallery.addClass('hidden');
221							if (UncodeWCParameters.variation_gallery_prepend === '1') {
222								parent_gallery.prepend(new_gallery);
223							} else {
224								parent_gallery.append(new_gallery);
225							}
226
227							var appended_gallery = parent_gallery.find('.uncode-single-product-gallery');
228
229							appended_gallery.imagesLoaded().done(function(instance) {
230								var main_gallery = appended_gallery.find('.woocommerce-product-gallery');
231								appended_gallery.removeClass('hidden');
232								$('.product-gallery-placeholder').removeClass('product-gallery-placeholder');
233								$(window).trigger('uncode_wc_variation_gallery_loaded');
234
235								old_gallery.remove();
236
237								if (typeof UNCODE_WC.product_gallery !== 'undefined') {
238									UNCODE_WC.product_gallery(main_gallery);
239									main_gallery.css('opacity', '1');
240								}
241								if (typeof UNCODE.adaptive !== 'undefined') {
242									UNCODE.adaptive();
243								}
244
245								if (typeof UNCODE.lightbox !== 'undefined' && !SiteParameters.lbox_enhanced) {
246									UNCODE.lightbox();
247								} else if (typeof UNCODE.lightgallery !== 'undefined' && SiteParameters.lbox_enhanced) {
248									UNCODE.lightgallery();
249								}
250								form.removeClass('is-updating-gallery');
251							});
252						} else {
253							form.removeClass('is-updating-gallery');
254						}
255
256						Single_Product.has_variation_changed = true;
257						UNCODE.stickyElements();
258					}
259				},
260				error: function() {
261					form.removeClass('is-updating-gallery');
262
263					if (SiteParameters.enable_debug == true) {
264						// This console log is disabled by default
265						// So nothing is printed in a typical installation
266						//
267						// It can be enabled for debugging purposes setting
268						// the 'uncode_enable_debug_on_js_scripts' filter to true
269						console.log('There was an error retrieving the variation gallery');
270					}
271				}
272			});
273		},
274
275		/**
276		 * Init galleries for variations
277		 */
278		variation_gallery: function() {
279			if (!$('body').hasClass('uncode-default-product-gallery')) {
280				$('form.variations_form').each(function() {
281					var form = $(this);
282					var product_div = form.closest('div.woocommerce-product-gallery--with-variation-gallery');
283
284					if (product_div.length > 0) {
285						var original_values = form.find('select').serialize();
286						var gallery_params = product_div.find('.woocommerce-product-gallery.images').data('gallery-options');
287						var default_images = gallery_params.default_images;
288						var original_images = default_images;
289
290						form
291						.on('found_variation.wc-variation-form', function(event, variation) {
292							if (!form.hasClass('is-updating-gallery')) {
293								form.addClass('is-updating-gallery');
294								var new_values = form.find('select').serialize();
295								var new_images = [];
296
297								if (variation.image_id) {
298									new_images.push(variation.image_id);
299								}
300
301								if (variation.variation_gallery) {
302									for (var variation_gallery_id in variation.variation_gallery) {
303										new_images.push(variation.variation_gallery[variation_gallery_id]);
304									}
305								}
306
307								var has_new_images = Single_Product.has_new_images(original_images, new_images);
308
309								if (new_values != original_values || Single_Product.first_load) {
310									original_values = new_values;
311									Single_Product.first_load = false;
312									if (has_new_images) {
313										Single_Product.update_variation_gallery(event, variation, form, gallery_params, false);
314										original_images = new_images;
315									} else {
316										$('.product-gallery-placeholder').removeClass('product-gallery-placeholder');
317										$(window).trigger('uncode_wc_variation_gallery_loaded');
318										form.removeClass('is-updating-gallery');
319									}
320								} else {
321									form.removeClass('is-updating-gallery');
322								}
323							}
324						})
325						.on('reset_image', function(event, variation) {
326							Single_Product.update_variation_gallery(event, variation, form, gallery_params, true);
327							original_images = default_images;
328						});
329					}
330				});
331			}
332		},
333
334		/**
335		 * Compare two set of images
336		 */
337		has_new_images: function(original_images, new_images) {
338			if (!original_images instanceof Array) {
339				return true;
340			}
341
342			if (!new_images instanceof Array) {
343				return true;
344			}
345
346			if (original_images.length !== new_images.length) {
347				return true;
348			}
349
350			for (var i = 0; i < original_images.length; i++) {
351				if (new_images.indexOf(original_images[i]) < 0) {
352					return true;
353				}
354			}
355
356			return false;
357		}
358	}
359
360	var Loop_Variations = {
361		/**
362		 * Init default variations on loops, ie. when we are not using
363		 * a single attribute visible and we have the complete form
364		 */
365		init_forms: function() {
366			$('form.variations_form').each(function() {
367				var form = $(this);
368				var tmb_wrapper = form.closest('.tmb-woocommerce');
369
370				if (tmb_wrapper.length === 0) {
371					return;
372				}
373
374				// Button
375				var form_button = form.find('.single_add_to_cart_button');
376				var button_to_connect = tmb_wrapper.find('.add_to_cart_button').not(':button');
377
378				button_to_connect.on('click', function(e) {
379					e.preventDefault();
380					form_button.trigger('click');
381				});
382
383				// Images
384				var product_img = tmb_wrapper.find('img[class*=wp-image], .uncode-picture-image').last();
385				var picture_el = product_img.closest('picture');
386				var source_el = picture_el.find('source');
387				var bg_el = tmb_wrapper.find('div.t-background-cover').last();
388
389				// Price
390				var prices = tmb_wrapper.find('span.price');
391
392				prices = prices.filter(function() {
393					if ($(this).closest('.t-entry-variations').length > 0) {
394						return false;
395					}
396					return true;
397				});
398
399				var original_price = prices.last().clone();
400				var original_price_value = original_price.children();
401
402				// Stock
403				var stock = tmb_wrapper.find('.t-entry-stock');
404				var original_stock = stock.clone();
405				var original_stock_value = original_stock.children();
406
407				// Title
408				var title = tmb_wrapper.find('.t-entry-title');
409				var original_title = title.clone();
410				var original_title_value = original_title.html();
411
412				// URL
413				var url = tmb_wrapper.find('.t-entry-visual-cont > a').attr('href');
414
415				form
416				.on('hide_variation', function() {
417					button_to_connect.find('.add_to_cart_text').html(UncodeWCParameters.i18n_variation_add_to_cart_text);
418					Loop_Variations.reset_variation_price(prices, original_price_value);
419					Loop_Variations.reset_variation_stock(stock, original_stock_value);
420					Loop_Variations.reset_variation_title(title, original_title_value);
421					Loop_Variations.reset_product_urls(tmb_wrapper, url);
422				})
423				.on('show_variation', function(event, variation, purchasable) {
424					if ( purchasable ) {
425						button_to_connect.find('.add_to_cart_text').html(UncodeWCParameters.i18n_add_to_cart_text);
426					} else {
427						button_to_connect.find('.add_to_cart_text').html(UncodeWCParameters.i18n_variation_add_to_cart_text);
428					}
429					Loop_Variations.update_variation_price(prices, original_price_value, variation);
430					Loop_Variations.update_variation_stock(stock, original_stock_value, variation);
431					Loop_Variations.update_variation_title(title, original_title_value, variation);
432					Loop_Variations.update_product_urls(tmb_wrapper, variation);
433				})
434				.on('found_variation', function (event, variation) {
435					Loop_Variations.update_variation_image(product_img, bg_el, picture_el, source_el, variation);
436				})
437				.on('reset_image', function(event, variation) {
438					Loop_Variations.update_variation_image(product_img, bg_el, picture_el, source_el, false);
439				});
440			});
441		},
442
443		/**
444		 * Init single variations on loops
445		 * (when we don't have the complete form)
446		 */
447		init_single_attributes: function() {
448			$('.single-attribute-selector').each(function() {
449				var selector = $(this);
450				var tmb_wrapper = selector.closest('.tmb-woocommerce');
451				var selector_type = '';
452
453				if (tmb_wrapper.length === 0) {
454					return;
455				}
456
457				var select_attr = selector.find('select');
458
459				if (select_attr.length > 0) {
460					var selected_attr = select_attr.val();
461					selector_type = 'select';
462				} else {
463					var swatches = selector.find('.swatch');
464					var active_swatch = selector.find('.swatch--active');
465					if (swatches.length > 0) {
466						selector_type = 'swatch';
467					}
468				}
469
470				// Images
471				var product_img = tmb_wrapper.find('img[class*=wp-image], .uncode-picture-image').last();
472				var picture_el = product_img.closest('picture');
473				var source_el = picture_el.find('source');
474				var bg_el = tmb_wrapper.find('div.t-background-cover').last();
475
476				// Price
477				var prices = tmb_wrapper.find('span.price');
478
479				prices = prices.filter(function() {
480					if ($(this).closest('.t-entry-variations').length > 0) {
481						return false;
482					}
483					return true;
484				});
485
486				var original_price = prices.last().clone();
487				var original_price_value = original_price.children();
488
489				// Stock
490				var stock = tmb_wrapper.find('.t-entry-stock');
491				var original_stock = stock.clone();
492				var original_stock_value = original_stock.children();
493
494				// Title
495				var title = tmb_wrapper.find('.t-entry-title');
496				var original_title = title.clone();
497				var original_title_value = original_title.html();
498
499				// URL
500				var url = tmb_wrapper.find('.t-entry-visual-cont > a').attr('href');
501
502				// Auto-select variation on load
503				if (!(window.UncodeWCParameters != undefined && window.UncodeWCParameters.single_variations_no_autoselect_on_load === '1')) {
504					if (SiteParameters.dynamic_srcset_active === '1') {
505						if (picture_el.length > 0) {
506							picture_el.on('srcset-done', function() {
507								if (!picture_el.hasClass('adaptive-fixed')) {
508									if (selector_type === 'select' && selected_attr) {
509										Loop_Variations.init_single_select_variation(tmb_wrapper, select_attr, selected_attr, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, url);
510									} else if (selector_type === 'swatch' && active_swatch.length > 0) {
511										Loop_Variations.init_single_swatch_variation(tmb_wrapper, selector, active_swatch, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, url);
512									}
513									picture_el.addClass('adaptive-fixed');
514								}
515							});
516						} else {
517							product_img.on('srcset-done', function() {
518								if (!product_img.hasClass('adaptive-fixed')) {
519									if (selector_type === 'select' && selected_attr) {
520										Loop_Variations.init_single_select_variation(tmb_wrapper, select_attr, selected_attr, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, url);
521									} else if (selector_type === 'swatch' && active_swatch.length > 0) {
522										Loop_Variations.init_single_swatch_variation(tmb_wrapper, selector, active_swatch, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, url);
523									}
524									product_img.addClass('adaptive-fixed');
525								}
526							});
527						}
528					} else if (SiteParameters.uncode_adaptive_async === '1') {
529						if (bg_el.length > 0) {
530							bg_el.on('async-done', function() {
531								if (!bg_el.hasClass('adaptive-fixed')) {
532									if (selector_type === 'select' && selected_attr) {
533										Loop_Variations.init_single_select_variation(tmb_wrapper, select_attr, selected_attr, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, url);
534									} else if (selector_type === 'swatch' && active_swatch.length > 0) {
535										Loop_Variations.init_single_swatch_variation(tmb_wrapper, selector, active_swatch, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, url);
536									}
537									bg_el.addClass('adaptive-fixed');
538								}
539							});
540						} else if (product_img.length > 0) {
541							product_img.on('async-done', function() {
542								if (!product_img.hasClass('adaptive-fixed')) {
543									if (selector_type === 'select' && selected_attr) {
544										Loop_Variations.init_single_select_variation(tmb_wrapper, select_attr, selected_attr, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, url);
545									} else if (selector_type === 'swatch' && active_swatch.length > 0) {
546										Loop_Variations.init_single_swatch_variation(tmb_wrapper, selector, active_swatch, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, url);
547									}
548									product_img.addClass('adaptive-fixed');
549								}
550							});
551						}
552					} else {
553						if (selector_type === 'select' && selected_attr) {
554							Loop_Variations.init_single_select_variation(tmb_wrapper, select_attr, selected_attr, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, url);
555						} else if (selector_type === 'swatch' && active_swatch.length > 0) {
556							Loop_Variations.init_single_swatch_variation(tmb_wrapper, selector, active_swatch, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, url);
557						}
558					}
559				}
560
561				// Selects
562				if (selector_type === 'select') {
563					select_attr.on('change', function() {
564						var selected_attr = $(this).val();
565						Loop_Variations.init_single_select_variation(tmb_wrapper, select_attr, selected_attr, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, url);
566					});
567				}
568
569				// Swatches
570				if (selector_type === 'swatch') {
571					if (selector.hasClass('single-attribute-selector--hover') && !('ontouchstart' in window)) {
572						swatches.on('mouseenter', function() {
573							var active_swatch = $(this);
574							Loop_Variations.set_single_swatch_variation(tmb_wrapper, swatches, selector, active_swatch, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, url);
575						}).on('click', function(e, from) {
576							if (!(undefined !== from && from === 'select_active_attributes')) {
577								window.location = $(this).attr('data-variation-link');
578							}
579						});
580					} else {
581						swatches.on('click', function() {
582							var active_swatch = $(this);
583							Loop_Variations.set_single_swatch_variation(tmb_wrapper, swatches, selector, active_swatch, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, url);
584						});
585					}
586
587				}
588			});
589		},
590
591		/**
592		 * Init single variation (select)
593		 */
594		init_single_select_variation: function(wrapper, select, selected_attr, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, original_url) {
595			var option = select.find("option[value='" + selected_attr + "']");
596			var variation = option.data('variation');
597			var attribute = select.attr('id');
598
599			// Check variation data
600			var found_variation = Utils.get_single_variation_from_attribute(variation, attribute, selected_attr);
601
602			// Set active variation
603			if (found_variation) {
604				Loop_Variations.update_variation_image(product_img, bg_el, picture_el, source_el, found_variation);
605				Loop_Variations.update_variation_price(prices, original_price_value, found_variation);
606				Loop_Variations.update_variation_stock(stock, original_stock_value, found_variation);
607				Loop_Variations.update_variation_title(title, original_title_value, found_variation);
608				Loop_Variations.update_product_urls(wrapper, found_variation);
609			} else {
610				Loop_Variations.update_variation_image(product_img, bg_el, picture_el, source_el, false);
611				Loop_Variations.reset_variation_price(prices, original_price_value);
612				Loop_Variations.reset_variation_stock(stock, original_stock_value);
613				Loop_Variations.reset_variation_title(title, original_title_value);
614				Loop_Variations.reset_product_urls(wrapper, original_url);
615			}
616		},
617
618		/**
619		 * Init single variation (swatch)
620		 */
621		init_single_swatch_variation: function(wrapper, selector, active_swatch, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, original_url) {
622			var variation = active_swatch.data('variation');
623			var attribute = selector.find('.swatches-select').data('swatch-id');
624			var attribute_value = active_swatch.data('swatch-value');
625
626			// Check variation data
627			var found_variation = Utils.get_single_variation_from_attribute(variation, attribute, attribute_value);
628
629			// Set active variation
630			if (found_variation) {
631				Loop_Variations.update_variation_image(product_img, bg_el, picture_el, source_el, found_variation);
632				Loop_Variations.update_variation_price(prices, original_price_value, found_variation);
633				Loop_Variations.update_variation_stock(stock, original_stock_value, found_variation);
634				Loop_Variations.update_variation_title(title, original_title_value, found_variation);
635				Loop_Variations.update_product_urls(wrapper, found_variation);
636			} else {
637				Loop_Variations.update_variation_image(product_img, bg_el, picture_el, source_el, false);
638				Loop_Variations.reset_variation_price(prices, original_price_value);
639				Loop_Variations.reset_variation_stock(stock, original_stock_value);
640				Loop_Variations.reset_variation_title(title, original_title_value);
641				Loop_Variations.reset_product_urls(wrapper, original_url);
642			}
643		},
644
645		/**
646		 * Set single variation on clicks (swatch)
647		 */
648		set_single_swatch_variation: function(wrapper, swatches, selector, active_swatch, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, original_url) {
649			swatches.removeClass('swatch--active');
650			active_swatch.addClass('swatch--active');
651			Loop_Variations.init_single_swatch_variation(wrapper, selector, active_swatch, product_img, bg_el, picture_el, source_el, prices, original_price_value, stock, original_stock_value, title, original_title_value, original_url);
652		},
653
654		/**
655		 * Update product price
656		 */
657		update_variation_price: function(prices, original_price, variation) {
658			var new_price = variation && variation.price_html && prices.length > 0 ? $(variation.price_html).children() : original_price;
659
660			prices.html(new_price);
661		},
662
663		/**
664		 * Reset product price
665		 */
666		reset_variation_price: function(prices, original_price) {
667			prices.html(original_price);
668		},
669
670		/**
671		 * Update product stock
672		 */
673		update_variation_stock: function(stock, original_stock, variation) {
674			var new_stock = variation && variation.availability_html && stock.length > 0 ? $(variation.availability_html) : original_stock;
675
676			if (new_stock.hasClass('in-stock')) {
677				stock.addClass('t-entry-stock--in-stock');
678			} else {
679				stock.removeClass('t-entry-stock--in-stock');
680			}
681
682			stock.html(new_stock);
683		},
684
685		/**
686		 * Reset product stock
687		 */
688		reset_variation_stock: function(stock, original_stock) {
689			if (original_stock.hasClass('in-stock')) {
690				stock.addClass('t-entry-stock--in-stock');
691			} else {
692				stock.removeClass('t-entry-stock--in-stock');
693			}
694
695			stock.html(original_stock);
696		},
697
698		/**
699		 * Update product title
700		 */
701		update_variation_title: function(title, original_title, variation) {
702			if (title.length > 0) {
703				if (title.closest('.tmb').find('.t-entry-variations').hasClass('single-attribute-selector--dynamic-title')) {
704					var new_title = variation && variation.variation_name && title.length > 0 ? variation.variation_name : original_title;
705					var price = title.find('.price');
706
707					title.text(new_title);
708
709					if (price.length > 0) {
710						title.append(price);
711					}
712				}
713			}
714		},
715
716		/**
717		 * Reset product title
718		 */
719		reset_variation_title: function(title, original_title) {
720			if (title.length > 0) {
721				if (title.closest('.tmb').find('.t-entry-variations').hasClass('single-attribute-selector--dynamic-title')) {
722					title.html(original_title);
723				}
724			}
725		},
726
727		/**
728		 * Update product URLs
729		 */
730		update_product_urls: function(wrapper, variation) {
731			if (variation.variation_selected_url) {
732				var links = wrapper.find('a').not('.t-entry-category a').not('.t-entry-attribute-image__link');
733				var quick_view_button = wrapper.find('.quick-view-button');
734
735				links.attr('href', variation.variation_selected_url);
736				quick_view_button.attr('data-post-url', variation.variation_selected_url);
737			}
738		},
739
740		/**
741		 * Reset product URLs
742		 */
743		reset_product_urls: function(wrapper, original_url) {
744			var links = wrapper.find('a').not('.t-entry-category a').not('.t-entry-attribute-image__link');
745			var quick_view_button = wrapper.find('.quick-view-button');
746
747			links.attr('href', original_url);
748			quick_view_button.attr('data-post-url', original_url);
749		},
750
751		/**
752		 * Inspired by $.wc_variations_image_update()
753		 */
754		update_variation_image: function(img, bg, picture, source, variation) {
755			var is_bg = bg.length > 0 ? true : false;
756			var is_picture = picture.length > 0 ? true : false;
757			var variations_imgs = '';
758
759			if (is_bg) {
760				variations_imgs = bg.data('product_variations');
761			} else if (is_picture) {
762				variations_imgs = picture.data('product_variations');
763			} else {
764				variations_imgs = img.data('product_variations');
765			}
766
767			if (variations_imgs && variation && variation.image_id && variation.image) {
768				for (var variations_img_key in variations_imgs) {
769					var variations_img = variations_imgs[variations_img_key];
770
771					if (parseInt(variations_img_key, 10) === variation.image_id) {
772						if (is_bg) {
773							Loop_Variations.update_bg_attributes(bg, variations_img, variation);
774						} else if (is_picture) {
775							Loop_Variations.update_picture_attributes(img, picture, source, variations_img, variation)
776						} else {
777							Loop_Variations.update_img_attributes(img, variations_img, variation);
778						}
779					}
780				}
781			} else {
782				if (is_bg) {
783					Loop_Variations.reset_variation_bg(bg);
784				} else if (is_picture) {
785					Loop_Variations.reset_variation_picture(img, picture, source);
786				} else {
787					Loop_Variations.reset_variation_img(img);
788				}
789			}
790		},
791
792		/**
793		 * Inspired by $.wc_set_variation_attr()
794		 */
795		set_variation_attr: function(el, attr, value) {
796			if (undefined === el.attr('data-o_' + attr)) {
797				el.attr('data-o_' + attr, (!el.attr(attr)) ? '' : el.attr(attr));
798			}
799			if (false === value) {
800				el.removeAttr(attr);
801			} else {
802				el.attr(attr, value);
803			}
804		},
805
806		/**
807		 * Inspired by $.wc_reset_variation_attr()
808		 */
809		reset_variation_attr: function(el, attr, value) {
810			if (undefined !== el.attr('data-o_' + attr)) {
811				el.attr(attr, el.attr('data-o_' + attr));
812			}
813		},
814
815		/**
816		 * Update attributes of the IMG tag
817		 */
818		update_img_attributes: function(img, variations_img, variation) {
819			if (SiteParameters.dynamic_srcset_active === '1') {
820				img.removeClass('srcset-sizes-done');
821				img.addClass('srcset-async');
822			} else if (SiteParameters.uncode_adaptive_async === '1') {
823				img.removeClass('async-done');
824				img.removeClass('adaptive-fetching');
825				img.addClass('adaptive-async');
826			}
827
828			Loop_Variations.set_variation_attr(img, 'src', variations_img.src);
829			Loop_Variations.set_variation_attr(img, 'alt', variation.image.alt);
830			Loop_Variations.set_variation_attr(img, 'width', variations_img.width);
831			Loop_Variations.set_variation_attr(img, 'height', variations_img.height);
832			Loop_Variations.set_variation_attr(img, 'srcset', variations_img.srcset);
833			Loop_Variations.set_variation_attr(img, 'data-uniqueid', variations_img.uniqueid);
834			Loop_Variations.set_variation_attr(img, 'data-guid', variations_img.guid);
835			Loop_Variations.set_variation_attr(img, 'data-path', variations_img.path);
836			Loop_Variations.set_variation_attr(img, 'data-no-bp', variations_img.no_bp);
837			Loop_Variations.set_variation_attr(img, 'data-bp', variations_img.bp);
838			Loop_Variations.set_variation_attr(img, 'data-width', variations_img.orig_w);
839			Loop_Variations.set_variation_attr(img, 'data-height', variations_img.orig_h);
840			Loop_Variations.set_variation_attr(img, 'data-singlew', variations_img.singlew);
841			Loop_Variations.set_variation_attr(img, 'data-singleh', variations_img.singleh);
842
843			if (SiteParameters.dynamic_srcset_active === '1') {
844				UNCODE.adaptive_srcset(img.closest('.tmb'));
845			} else if (SiteParameters.uncode_adaptive_async === '1') {
846				UNCODE.adaptive();
847			}
848		},
849
850		/**
851		 * Reset attributes of the IMG tag
852		 */
853		reset_variation_img: function(img) {
854			Loop_Variations.reset_variation_attr(img, 'src');
855			Loop_Variations.reset_variation_attr(img, 'srcset');
856			Loop_Variations.reset_variation_attr(img, 'alt');
857			Loop_Variations.reset_variation_attr(img, 'width');
858			Loop_Variations.reset_variation_attr(img, 'height');
859			Loop_Variations.reset_variation_attr(img, 'data-uniqueid');
860			Loop_Variations.reset_variation_attr(img, 'data-guid');
861			Loop_Variations.reset_variation_attr(img, 'data-path');
862			Loop_Variations.reset_variation_attr(img, 'data-no-bp');
863			Loop_Variations.reset_variation_attr(img, 'data-bp');
864			Loop_Variations.reset_variation_attr(img, 'data-width');
865			Loop_Variations.reset_variation_attr(img, 'data-height');
866			Loop_Variations.reset_variation_attr(img, 'data-singlew');
867			Loop_Variations.reset_variation_attr(img, 'data-singleh');
868		},
869
870		/**
871		 * Update attributes of the PICTURE tag (and descendants)
872		 */
873		update_picture_attributes: function(img, picture, source, variations_img, variation) {
874			if (SiteParameters.dynamic_srcset_active === '1') {
875				picture.addClass('srcset-async');
876				source.removeClass('srcset-sizes-done');
877			}
878
879			Loop_Variations.set_variation_attr(img, 'src', variations_img.src);
880			Loop_Variations.set_variation_attr(source, 'srcset', variations_img.srcset);
881			Loop_Variations.set_variation_attr(img, 'alt', variation.image.alt);
882			Loop_Variations.set_variation_attr(img, 'width', variations_img.width);
883			Loop_Variations.set_variation_attr(img, 'height', variations_img.height);
884			Loop_Variations.set_variation_attr(picture, 'data-uniqueid', variations_img.uniqueid);
885			Loop_Variations.set_variation_attr(picture, 'data-guid', variations_img.guid);
886			Loop_Variations.set_variation_attr(picture, 'data-path', variations_img.path);
887			Loop_Variations.set_variation_attr(picture, 'data-no-bp', variations_img.no_bp);
888			Loop_Variations.set_variation_attr(picture, 'data-bp', variations_img.bp);
889			Loop_Variations.set_variation_attr(picture, 'data-width', variations_img.orig_w);
890			Loop_Variations.set_variation_attr(picture, 'data-height', variations_img.orig_h);
891
892			if (SiteParameters.dynamic_srcset_active === '1') {
893				UNCODE.adaptive_srcset(img.closest('.tmb'));
894			}
895		},
896
897		/**
898		 * Reset attributes of the PICTURE tag (and descendants)
899		 */
900		reset_variation_picture: function(img, picture, source) {
901			Loop_Variations.reset_variation_attr(img, 'src');
902			Loop_Variations.reset_variation_attr(source, 'srcset');
903			Loop_Variations.reset_variation_attr(img, 'alt');
904			Loop_Variations.reset_variation_attr(img, 'width');
905			Loop_Variations.reset_variation_attr(img, 'height');
906			Loop_Variations.reset_variation_attr(picture, 'data-uniqueid');
907			Loop_Variations.reset_variation_attr(picture, 'data-guid');
908			Loop_Variations.reset_variation_attr(picture, 'data-path');
909			Loop_Variations.reset_variation_attr(picture, 'data-no-bp');
910			Loop_Variations.reset_variation_attr(picture, 'data-bp');
911			Loop_Variations.reset_variation_attr(picture, 'data-width');
912			Loop_Variations.reset_variation_attr(picture, 'data-height');
913		},
914
915		/**
916		 * Update attributes of the div tag (background image)
917		 */
918		update_bg_attributes: function(bg, variations_img, variation) {
919			if (SiteParameters.uncode_adaptive_async === '1') {
920				bg.removeClass('async-done');
921				bg.addClass('adaptive-async');
922			}
923
924			var new_style = "background-image:url('" + variations_img.src + "')";
925
926			Loop_Variations.set_variation_attr(bg, 'style', new_style);
927			Loop_Variations.set_variation_attr(bg, 'data-uniqueid', variations_img.uniqueid);
928			Loop_Variations.set_variation_attr(bg, 'data-guid', variations_img.guid);
929			Loop_Variations.set_variation_attr(bg, 'data-path', variations_img.path);
930			Loop_Variations.set_variation_attr(bg, 'data-width', variations_img['data-width']);
931			Loop_Variations.set_variation_attr(bg, 'data-height', variations_img['data-height']);
932			Loop_Variations.set_variation_attr(bg, 'data-singlew', variations_img.singlew);
933			Loop_Variations.set_variation_attr(bg, 'data-singleh', variations_img.singleh);
934
935			if (SiteParameters.uncode_adaptive_async === '1') {
936				UNCODE.adaptive();
937			}
938		},
939
940		/**
941		 * Reset attributes of the div tag (background image)
942		 */
943		reset_variation_bg: function(bg) {
944			Loop_Variations.reset_variation_attr(bg, 'style');
945			Loop_Variations.reset_variation_attr(bg, 'data-uniqueid');
946			Loop_Variations.reset_variation_attr(bg, 'data-guid');
947			Loop_Variations.reset_variation_attr(bg, 'data-path');
948			Loop_Variations.reset_variation_attr(bg, 'data-width');
949			Loop_Variations.reset_variation_attr(bg, 'data-height');
950			Loop_Variations.reset_variation_attr(bg, 'data-singlew');
951			Loop_Variations.reset_variation_attr(bg, 'data-singleh');
952		},
953
954		/**
955		 * Select active attribute after filtering
956		 */
957		select_active_attributes: function() {
958			$('.single-attribute-selector').each(function() {
959				var selector = $(this);
960				var tmb_wrapper = selector.closest('.tmb-woocommerce');
961				var selector_type = '';
962
963				if (tmb_wrapper.length === 0) {
964					return;
965				}
966
967				var select_attr = selector.find('select');
968
969				if (select_attr.length > 0) {
970					var selected_attr = select_attr.val();
971					selector_type = 'select';
972				} else {
973					var swatches = selector.find('.swatch');
974					var active_swatch = selector.find('.swatch--active');
975					if (swatches.length > 0) {
976						selector_type = 'swatch';
977					}
978				}
979
980				// Selects
981				if (selector_type === 'select') {
982					var attribute = select_attr.attr('data-attribute_name');
983					var filter_attribute_key = UncodeWCParameters.pa_filter_prefix + attribute.replace('attribute_pa_', '');
984					var selected_atts = Utils.get_url_parameter(filter_attribute_key);
985
986					if (typeof selected_atts === 'string') {
987						var selected_atts_arr = selected_atts.split(',');
988						var selected_att = false;
989
990						if (selected_atts_arr) {
991							selected_att = selected_atts_arr[selected_atts_arr.length - 1];
992						}
993
994						if (selected_att) {
995							select_attr.find('option').each(function() {
996								var _this = $(this);
997								var _val = _this.val();
998								if (_val === selected_att) {
999									select_attr.val(_val).trigger('change');
1000									return false;
1001								}
1002							})
1003						}
1004					}
1005				}
1006
1007				// Swatches
1008				if (selector_type === 'swatch') {
1009					var attribute = selector.find('.swatches-select').attr('data-swatch-id');
1010					var filter_attribute_key = UncodeWCParameters.pa_filter_prefix + attribute.replace('pa_', '');
1011					var selected_atts = Utils.get_url_parameter(filter_attribute_key);
1012
1013					if (typeof selected_atts === 'string') {
1014						var selected_atts_arr = selected_atts.split(',');
1015						var selected_att = false;
1016
1017						if (selected_atts_arr) {
1018							selected_att = selected_atts_arr[selected_atts_arr.length - 1];
1019						}
1020
1021						if (selected_att) {
1022							swatches.each(function() {
1023								var _this = $(this);
1024								if (_this.attr('data-swatch-value') === selected_att) {
1025									if (selector.hasClass('single-attribute-selector--hover') && !('ontouchstart' in window)) {
1026										_this.trigger('mouseenter', 'select_active_attributes');
1027									} else {
1028										_this.trigger('click', 'select_active_attributes');
1029									}
1030
1031									return false;
1032								}
1033							})
1034						}
1035					}
1036				}
1037			});
1038		}
1039	}
1040
1041	$(document).ready(function() {
1042		Single_Product.variable_add_to_cart();
1043		Single_Product.variation_gallery();
1044		Loop_Variations.init_forms();
1045		Loop_Variations.init_single_attributes();
1046		Loop_Variations.select_active_attributes();
1047	});
1048
1049	$(document).on('uncode-quick-view-loaded', function() {
1050		Single_Product.has_variation_changed = false;
1051		Single_Product.doing_clear = false;
1052		Single_Product.first_load = true;
1053		Single_Product.variable_add_to_cart();
1054		Single_Product.variation_gallery();
1055		Loop_Variations.init_forms();
1056		Loop_Variations.init_single_attributes();
1057	});
1058
1059	$(document).on('uncode-ajax-filtered more-items-loaded', function() {
1060		Loop_Variations.init_forms();
1061		Loop_Variations.init_single_attributes();
1062		Loop_Variations.select_active_attributes();
1063
1064		var product_wrapper = $('.single-product');
1065		var qw_wrapper = $('.quick-view-container');
1066
1067		// Run on loops only
1068		if (product_wrapper.length === 0 && qw_wrapper.length === 0) {
1069			Single_Product.variable_add_to_cart();
1070
1071			$('.variations_form').each(function () {
1072				$(this).wc_variation_form();
1073			});
1074		}
1075	});
1076})(jQuery);

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.