/*! * Variations Plugin Theme */ ; (function ($, window, document, undefined) { $.fn.wc_variation_form = function () { var $form = this; var $product = $form.closest('.product'); var $product_id = parseInt($form.data('product_id'), 10); var $product_variations = $form.data('product_variations'); var $use_ajax = $product_variations === false; var $xhr = false; var $reset_variations = $form.find('.reset_variations'); var $action_button = $form.find('.action-button-list'); // Unbind any existing events $form.unbind('check_variations update_variation_values found_variation'); $form.find('.reset_variations').unbind('click'); $form.find('.variations select').unbind('change focusin'); // Bind new events to form $form // On clicking the reset variation button .on('click', '.reset_variations', function () { $form.find('.variations select').val('').change(); $form.find('.variations select').next('ul.variable-items-wrapper').find('li').removeClass('disabled selected'); $form.trigger('reset_data'); return false; }) // Reload product variations data .on('reload_product_variations', function () { $product_variations = $form.data('product_variations'); $use_ajax = $product_variations === false; }) // Reset product data .on('reset_data', function () { var to_reset = { '.sku': 'o_sku', '.product_weight': 'o_weight', '.product_dimensions': 'o_dimensions' }; $.each(to_reset, function (selector, data_attribute) { var $el = $product.find(selector); if ($el.attr('data-' + data_attribute)) { $el.text($el.attr('data-' + data_attribute)); } }); $form.wc_variations_description_update(''); $form.trigger('reset_image'); $form.find('.single_variation_wrap').slideUp(200).trigger('hide_variation'); }) // Reset product image .on('reset_image', function () { var $product_img = $product.find('div.images img:eq(0)'), $product_link = $product.find('div.images a.zoom:eq(0)'), o_src = $product_img.attr('data-o_src'), o_title = $product_img.attr('data-o_title'), o_alt = $product_img.attr('data-o_title'), o_href = $product_link.attr('data-o_href'); if (o_src !== undefined) { $product_img.attr('src', o_src); } if (o_href !== undefined) { $product_link.attr('href', o_href); } if (o_title !== undefined) { $product_img.attr('title', o_title); $product_link.attr('title', o_title); } if (o_alt !== undefined) { $product_img.attr('alt', o_alt); } }) // On changing an attribute .on('change', '.variations select', function () { $form.find('input[name="variation_id"], input.variation_id').val('').change(); $form.find('.wc-no-matching-variations').remove(); if ($use_ajax) { if ($xhr) { $xhr.abort(); } var all_attributes_chosen = true; var some_attributes_chosen = false; var data = {}; $form.find('.variations select').each(function () { var attribute_name = $(this).data('attribute_name') || $(this).attr('name'); if ($(this).val().length === 0) { all_attributes_chosen = false; } else { some_attributes_chosen = true; } data[attribute_name] = $(this).val(); }); if (all_attributes_chosen) { // Get a matchihng variation via ajax data.product_id = $product_id; $xhr = $.ajax({ url: wc_cart_fragments_params.wc_ajax_url.toString().replace('%%endpoint%%', 'get_variation'), type: 'POST', data: data, success: function (variation) { if (variation) { $form.find('input[name="variation_id"], input.variation_id') .val(variation.variation_id) .change(); $form.trigger('found_variation', [variation]); } else { $form.trigger('reset_data'); $form.find('.single_variation_wrap').after('

' + wc_add_to_cart_variation_params.i18n_no_matching_variations_text + '

'); $form.find('.wc-no-matching-variations').slideDown(200); } } }); } else { $form.trigger('reset_data'); } if (some_attributes_chosen) { if ($reset_variations.css('visibility') === 'hidden') { //$reset_variations.css('visibility', 'visible').hide().fadeIn(); } var have_reset_button = $action_button.find('.reset_variations').length > 0; if (have_reset_button == false) { $action_button.append("
  • ").hide().fadeIn(); } } else { $reset_variations.remove().hide().fadeOut(); } } else { $form.trigger('woocommerce_variation_select_change', [$(this)]); $form.trigger('check_variations', ['', false]); $(this).blur(); } // Custom event for when variation selection has been changed $form.trigger('woocommerce_variation_has_changed'); }) // Upon gaining focus .on('focusin touchstart', '.variations select', function () { if (!$use_ajax) { $form.trigger('woocommerce_variation_select_focusin', [$(this)]); $form.trigger('check_variations', [$(this).data('attribute_name') || $(this).attr('name'), true]); } }) // Show single variation details (price, stock, image) .on('found_variation', function (event, variation) { var $product_img = $product.find('div.images img:eq(0)'), $product_link = $product.find('div.images a.zoom:eq(0)'), o_src = $product_img.attr('data-o_src'), o_title = $product_img.attr('data-o_title'), o_alt = $product_img.attr('data-o_alt'), o_href = $product_link.attr('data-o_href'), variation_image = variation.image_src, variation_link = variation.image_link, variation_caption = variation.image_caption, variation_title = variation.image_title; $form.find('.single_variation').html(variation.price_html + variation.availability_html); if (o_src === undefined) { o_src = ( !$product_img.attr('src') ) ? '' : $product_img.attr('src'); $product_img.attr('data-o_src', o_src); } if (o_href === undefined) { o_href = ( !$product_link.attr('href') ) ? '' : $product_link.attr('href'); $product_link.attr('data-o_href', o_href); } if (o_title === undefined) { o_title = ( !$product_img.attr('title') ) ? '' : $product_img.attr('title'); $product_img.attr('data-o_title', o_title); } if (o_alt === undefined) { o_alt = ( !$product_img.attr('alt') ) ? '' : $product_img.attr('alt'); $product_img.attr('data-o_alt', o_alt); } if (variation_image && variation_image.length > 1) { $product_img .attr('src', variation_image) .attr('alt', variation_title) .attr('title', variation_title); $product_link .attr('href', variation_link) .attr('title', variation_caption); } else { $product_img .attr('src', o_src) .attr('alt', o_alt) .attr('title', o_title); $product_link .attr('href', o_href) .attr('title', o_title); } var $single_variation_wrap = $form.find('.single_variation_wrap'), $sku = $product.find('.product_meta').find('.sku'), $weight = $product.find('.product_weight'), $dimensions = $product.find('.product_dimensions'); if (!$sku.attr('data-o_sku')) { $sku.attr('data-o_sku', $sku.text()); } if (!$weight.attr('data-o_weight')) { $weight.attr('data-o_weight', $weight.text()); } if (!$dimensions.attr('data-o_dimensions')) { $dimensions.attr('data-o_dimensions', $dimensions.text()); } if (variation.sku) { $sku.text(variation.sku); } else { $sku.text($sku.attr('data-o_sku')); } if (variation.weight) { $weight.text(variation.weight); } else { $weight.text($weight.attr('data-o_weight')); } if (variation.dimensions) { $dimensions.text(variation.dimensions); } else { $dimensions.text($dimensions.attr('data-o_dimensions')); } var hide_qty = false; var hide_qty_button = false; if (!variation.is_purchasable || !variation.is_in_stock || !variation.variation_is_visible) { hide_qty_button = true; } if (!variation.variation_is_visible) { $form.find('.single_variation').html('

    ' + wc_add_to_cart_variation_params.i18n_unavailable_text + '

    '); } if (variation.min_qty !== '') { $single_variation_wrap.find('.quantity input.qty').attr('min', variation.min_qty).val(variation.min_qty); } else { $single_variation_wrap.find('.quantity input.qty').removeAttr('min'); } if (variation.max_qty !== '') { $single_variation_wrap.find('.quantity input.qty').attr('max', variation.max_qty); } else { $single_variation_wrap.find('.quantity input.qty').removeAttr('max'); } if (variation.is_sold_individually === 'yes') { $single_variation_wrap.find('.quantity input.qty').val('1'); hide_qty = true; } // Show/hide qty container if (hide_qty) { $single_variation_wrap.find('.quantity').hide(); } else { // No need to hide it when hiding its container if (!hide_qty_button) { $single_variation_wrap.find('.quantity').show(); } } // Show/hide qty & button container if (hide_qty_button) { if ($single_variation_wrap.is(':visible')) { $form.find('.variations_button').slideUp(200); } else { $form.find('.variations_button').hide(); } } else { if ($single_variation_wrap.is(':visible')) { $form.find('.variations_button').slideDown(200); } else { $form.find('.variations_button').show(); } } // Refresh variation description $form.wc_variations_description_update(variation.variation_description); $single_variation_wrap.slideDown(200).trigger('show_variation', [variation]); }) // Check variations .on('check_variations', function (event, exclude, focus) { if ($use_ajax) { return; } var all_attributes_chosen = true, some_attributes_chosen = false, current_settings = {}, $form = $(this), $reset_variations = $form.find('.reset_variations'); $form.find('.variations select').each(function () { var attribute_name = $(this).data('attribute_name') || $(this).attr('name'); if ($(this).val().length === 0) { all_attributes_chosen = false; } else { some_attributes_chosen = true; } if (exclude && attribute_name === exclude) { all_attributes_chosen = false; current_settings[attribute_name] = ''; } else { // Add to settings array current_settings[attribute_name] = $(this).val(); } }); var matching_variations = wc_variation_form_matcher.find_matching_variations($product_variations, current_settings); if (all_attributes_chosen) { var variation = matching_variations.shift(); if (variation) { $form.find('input[name="variation_id"], input.variation_id') .val(variation.variation_id) .change(); $form.trigger('found_variation', [variation]); } else { // Nothing found - reset fields $form.find('.variations select').val(''); $form.find('.variations select').next('ul.variable-items-wrapper').find('li').removeClass('disabled selected'); if (!focus) { $form.trigger('reset_data'); } window.alert(wc_add_to_cart_variation_params.i18n_no_matching_variations_text); } } else { $form.trigger('update_variation_values', [matching_variations]); if (!focus) { $form.trigger('reset_data'); } if (!exclude) { $form.find('.single_variation_wrap').slideUp(200).trigger('hide_variation'); } } if (some_attributes_chosen) { if ($reset_variations.css('visibility') === 'hidden') { //$reset_variations.css('visibility', 'visible').hide().fadeIn(); } var have_reset_button = $action_button.find('.reset_variations').length > 0; if (have_reset_button == false) { $action_button.append("
  • ").hide().fadeIn(); } } else { $reset_variations.remove().hide().fadeOut(); } }) // Disable option fields that are unavaiable for current set of attributes .on('update_variation_values', function (event, variations) { if ($use_ajax) { return; } // Loop through selects and disable/enable options based on selections $form.find('.variations select').each(function (index, el) { var current_attr_name, current_attr_select = $(el); // Reset options if (!current_attr_select.data('attribute_options')) { current_attr_select.data('attribute_options', current_attr_select.find('option:gt(0)').get()); } current_attr_select.find('option:gt(0)').remove(); current_attr_select.append(current_attr_select.data('attribute_options')); current_attr_select.find('option:gt(0)').removeClass('attached'); current_attr_select.find('option:gt(0)').removeClass('enabled'); current_attr_select.find('option:gt(0)').removeAttr('disabled'); // Get name from data-attribute_name, or from input name if it doesn't exist if (typeof( current_attr_select.data('attribute_name') ) !== 'undefined') { current_attr_name = current_attr_select.data('attribute_name'); } else { current_attr_name = current_attr_select.attr('name'); } // Loop through variations for (var num in variations) { if (typeof( variations[num] ) !== 'undefined') { var attributes = variations[num].attributes; for (var attr_name in attributes) { if (attributes.hasOwnProperty(attr_name)) { var attr_val = attributes[attr_name]; if (attr_name === current_attr_name) { var variation_active = ''; if (variations[num].variation_is_active) { variation_active = 'enabled'; } if (attr_val) { // Decode entities attr_val = $('
    ').html(attr_val).text(); // Add slashes attr_val = attr_val.replace(/'/g, '\\\''); attr_val = attr_val.replace(/"/g, '\\\"'); // Compare the meerkat current_attr_select.find('option[value="' + attr_val + '"]').addClass('attached ' + variation_active); //current_attr_select.next('ul.variable-items-wrapper').find('li').addClass('hide'); //current_attr_select.next('ul.variable-items-wrapper').find('li').removeClass('selected'); current_attr_select.next('ul.variable-items-wrapper').find('li[data-value="' + attr_val + '"]').removeClass('disabled'); } else { current_attr_select.find('option:gt(0)').addClass('attached ' + variation_active); current_attr_select.next('ul.variable-items-wrapper').find('li').removeClass('disabled'); } } } } } } // Detach unattached current_attr_select.find('option:gt(0):not(.attached)').each(function (i, e) { var value = $(this).val(); $(this).parent().next('ul.variable-items-wrapper').find('li[data-value="' + value + '"]').removeClass('disabled selected').addClass('disabled'); }); current_attr_select.find('option:gt(0):not(.attached)').remove(); // // Grey out disabled current_attr_select.find('option:gt(0):not(.enabled)').each(function (i, e) { var value = $(this).val(); $(this).parent().next('ul.variable-items-wrapper').find('li[data-value="' + value + '"]').removeClass('disabled selected').addClass('disabled'); }); current_attr_select.find('option:gt(0):not(.enabled)').attr('disabled', 'disabled'); }); // Custom event for when variations have been updated $form.trigger('woocommerce_update_variation_values'); }); $form.trigger('wc_variation_form'); return $form; }; /** * Matches inline variation objects to chosen attributes * @type {Object} */ var wc_variation_form_matcher = { find_matching_variations: function (product_variations, settings) { var matching = []; for (var i = 0; i < product_variations.length; i++) { var variation = product_variations[i]; if (wc_variation_form_matcher.variations_match(variation.attributes, settings)) { matching.push(variation); } } return matching; }, variations_match: function (attrs1, attrs2) { var match = true; for (var attr_name in attrs1) { if (attrs1.hasOwnProperty(attr_name)) { var val1 = attrs1[attr_name]; var val2 = attrs2[attr_name]; if (val1 !== undefined && val2 !== undefined && val1.length !== 0 && val2.length !== 0 && val1 !== val2) { match = false; } } } return match; } }; /** * Performs animated variation description refreshes */ $.fn.wc_variations_description_update = function (variation_description) { var $form = this; var $variations_description = $form.find('.woocommerce-variation-description'); if ($variations_description.length === 0) { if (variation_description) { // add transparent border to allow correct height measurement when children have top/bottom margins $form.find('.single_variation_wrap').prepend($('
    ' + variation_description + '
    ').hide()); $form.find('.woocommerce-variation-description').slideDown(200); } } else { var load_height = $variations_description.outerHeight(true); var new_height = 0; var animate_height = false; // lock height $variations_description.css('height', load_height); // replace html $variations_description.html(variation_description); // measure height $variations_description.css('height', 'auto'); new_height = $variations_description.outerHeight(true); if (Math.abs(new_height - load_height) > 1) { animate_height = true; // lock height $variations_description.css('height', load_height); } // animate height if (animate_height) { $variations_description.animate({'height': new_height}, { duration: 200, queue: false, always: function () { $variations_description.css({'height': 'auto'}); } }); } } }; $(function () { if (typeof wc_add_to_cart_variation_params !== 'undefined') { $('.variations_form').each(function () { $(this).wc_variation_form().find('.variations select:eq(0)').change(); }); } }); })(jQuery, window, document);