jQuery(function($){ var getAttribute=function(attr_name){ if(jcaa_attrs===null){ return false; } for(var i=0; i < jcaa_attrs.length; i++){ var attr=jcaa_attrs[i]; if(attr.name===attr_name){ return attr; }} return false; }; var getAttributeOption=function(attr, option){ for(var i=0; i < attr.options.length; i++){ var attr_option=attr.options[i]; if(attr_option.value===option){ return attr_option; }} return false; }; var active_class='jcaa_active_attr'; var disable_class='jcass_attr_disable'; var disable_li_class='jcass_attr_disabled'; var out_of_stock_class='jcaa_no_stock'; var product_variations=$('.variations_form.cart').data('product_variations'); var visible_attrs={}; if(product_variations!=undefined&&product_variations.length > 0){ for(var index in product_variations){ var row=product_variations[index]; if(row['variation_is_visible']==false&&row['variation_is_active']==false&&row['is_purchasable']==false){ continue; } for(var attr_key in row['attributes']){ var attr_val=row['attributes'][attr_key]; if(visible_attrs[attr_key]==undefined){ visible_attrs[attr_key]=[]; } if($.inArray(attr_val, visible_attrs[attr_key])==-1){ visible_attrs[attr_key].push(attr_val); }} }} $('select[name^="attribute_pa_"]').each(function(){ var _select=$(this); var _name=$(this).attr('name').substr(10); var _attr=getAttribute(_name); if(_attr!==false&&_attr.type!=='default'){ if(_attr.label==='hide'){ _select.parents('tr').find('.label').css('visibility', 'hidden'); } var classes='' if(_attr.style==='rounded'&&_attr.type!=='text'){ classes +='jcaa_rounded_corners'; } if(_attr.size==='large'){ classes +=' jcaa_size_large'; }else if(_attr.size==='medium'){ classes +=' jcaa_size_medium'; }else{ classes +=' jcaa_size_small'; } var htmlOutput=''; htmlOutput +=''; var _value_wrapper=_select.parents('.value'); if(_value_wrapper){ _value_wrapper.addClass('jcaa_select_enabled') } _select.after(htmlOutput); _select.hide(); }}); $('.variations_form.cart .jcaa_attr_select').each(function(){ var _attr_list=$(this); _attr_list.find('.jcaa_attr_option').each(function(){ var _attr_option=$(this); _attr_option.click(function(event){ if($(this).hasClass(disable_class)){ return event.preventDefault(); } var _target=_attr_option.data('target'); _target=_target.substr(1); _target='[id="'+_target+'"]'; var _select_target=$(_target); var _select_value=_attr_option.data('value'); if($(_select_target).find('option[value="'+_select_value+'"]').prop("selected")==true){ if(jcaa['enable_attr_toggle']=='yes'){ $(_select_target).find('option').attr("selected", false); $(_select_target).find('option:first').attr("selected", true); }}else{ $(_select_target).find('option').attr("selected", false); $(_select_target).val(_select_value); $(_select_target).find('option[value="'+_select_value+'"]').attr("selected", true); } $(_select_target).trigger('change'); event.preventDefault(); }); }); }); var wc_variation_form_matcher={ find_matching_variations: function(product_variations, settings){ var matching=[]; if(product_variations!=undefined){ 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; }}; $.fn.jcaaCheckAttrValidation=function(){ var product_variations=$('.variations_form.cart').data('product_variations'); var active_attrs=[]; var found=false; var hasEmptyAttr=false; var active_count=0; var attr_count=0; $('.variations select').each(function(){ if($(this).val()!==''){ active_count++; found=$(this).attr('name'); }else{ hasEmptyAttr=true; } active_attrs[$(this).attr('name')]=$(this).val(); attr_count++; }); $('.jcaa_attr_option').removeClass(disable_class); $('.jcaa_attr_variable_select li').removeClass(out_of_stock_class + ' ' + disable_li_class); var matching_vars=[]; var out_of_stock=[]; var stock_levels={}; var set_in_stock=function(attributes){ for(var attr_name in attributes){ if(stock_levels[attr_name]!==undefined&&stock_levels[attr_name]==true){ continue; } var attr_val=attributes[attr_name]; if(attr_val===""){ stock_levels[attr_name]=true; }else{ if(stock_levels[attr_name]===undefined){ stock_levels[attr_name]=[]; } if(stock_levels[attr_name].indexOf(attr_val)===-1){ stock_levels[attr_name].push(attr_val); }} }}; var is_in_stock=function(attribute_name, attribute_val, forced){ if(stock_levels[attribute_name]!==undefined){ if(stock_levels[attribute_name]===true){ return true; } if(stock_levels[attribute_name]!==false){ if(stock_levels[attribute_name].indexOf(attribute_val)!==-1){ return true; }} } return false; }; var count_check=((attr_count - 1) > 1) ? (attr_count - 1):1; var enabled_options={}; if(active_count > 0){ for (var attr_name in active_attrs){ var attr_row=[]; for (var attr_key in active_attrs){ if(attr_name==attr_key){ attr_row[attr_key]=""; }else{ attr_row[attr_key]=active_attrs[attr_key]; }} matching_vars=wc_variation_form_matcher.find_matching_variations(product_variations, attr_row); if(matching_vars.length==0){ continue; } for (var i=0; i < matching_vars.length; i++){ var variation=matching_vars[i]; if(variation.is_in_stock===false){ out_of_stock.push({ attribute: attr_name, value: variation.attributes[attr_name], force: false }); }else{ set_in_stock(variation.attributes); if(enabled_options[attr_name]==undefined){ enabled_options[attr_name]=[]; } if(enabled_options[attr_name]!='*'){ if(variation.attributes[attr_name]==""){ if(enabled_options[attr_name]==undefined){ enabled_options[attr_name]="*"; }else{ enabled_options[attr_name]="*"; }}else if(enabled_options[attr_name].indexOf(variation.attributes[attr_name])===-1){ enabled_options[attr_name].push(variation.attributes[attr_name]); }} }} }} for(var attr_k in enabled_options){ var enabled_attr=enabled_options[attr_k]; var attr_n=attr_k.substr(10); var _jcaa_elem=$('[id="jcaa_attr_'+attr_n+'"]'); if(enabled_attr!='*'){ _jcaa_elem.find('.jcaa_attr_option').addClass(disable_class).parent().addClass(disable_li_class); for(var i=0; i < enabled_attr.length; i++){ var specific_attr=enabled_attr[i]; _jcaa_elem.find('.jcaa_attr_option[data-value="' + specific_attr + '"]').removeClass(disable_class).parent().removeClass(disable_li_class); }} } if(active_count < attr_count){ matching_vars=wc_variation_form_matcher.find_matching_variations(product_variations, active_attrs); var set_force=false; if(active_count==attr_count - 1){ set_force=true; } if(matching_vars.length > 0){ for (var i=0; i < matching_vars.length; i++){ var variation=matching_vars[i]; if(variation.is_in_stock===false){ var attr_name=found; for(var test_a in variation.attributes){ if(variation.attributes[test_a]!==""&&variation.attributes[test_a]!==found){ out_of_stock.push({ attribute: test_a, value: variation.attributes[test_a], force: set_force }); }} }else{ set_in_stock(variation.attributes, true); }} }} var already_checked={}; if(out_of_stock.length > 0){ for(var i=0; i < out_of_stock.length; i++){ var attr_k=out_of_stock[i].attribute; var attr_v=out_of_stock[i].value; if(already_checked[attr_k]===undefined){ already_checked[attr_k]={};} if(is_in_stock(attr_k, attr_v)===true&&out_of_stock[i].force!==true){ if(already_checked[attr_k][attr_v]===undefined){ already_checked[attr_k][attr_v]=true; } continue; } if(out_of_stock[i].force===true&&active_attrs[attr_k]!==""){ if(already_checked[attr_k][attr_v]===undefined){ already_checked[attr_k][attr_v]=true; } continue; } if(already_checked[attr_k][attr_v]!==undefined){ continue; } var attr_n=attr_k.substr(10); var _jcaa_elem=$('[id="jcaa_attr_'+attr_n+'"]'); _jcaa_elem.find('.jcaa_attr_option[data-value="' + attr_v + '"]').addClass(disable_class).parent().addClass(out_of_stock_class + ' ' + disable_li_class); }} }; $('body').on('change', '.variations select', function(){ var _name=$(this).attr('name').substr(10); $('ul[id="jcaa_attr_'+_name+'"] .' + active_class).removeClass(active_class); $('ul[id="jcaa_attr_'+_name+'"] [data-value="' + $(this).val() + '"]').parent().addClass(active_class); if(jcaa['enable_validation']!==undefined&&jcaa['enable_validation']=='yes'){ $.fn.jcaaCheckAttrValidation(); }}); $('.variations select').trigger('change'); });