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.