'use strict'; (function($) { $(document).ready(function() { if (!$('.woosb-wrap').length) { return; } $('.woosb-wrap').each(function() { woosb_init($(this)); }); }); $(document).on('woosq_loaded', function() { // product bundles in quick view popup woosb_init($('#woosq-popup .woosb-wrap')); }); $(document). on('click touch', '.woosb-qty-input-plus, .woosb-qty-input-minus', function() { // get values var $qty = $(this).closest('.woosb-qty-input').find('.qty'), val = parseFloat($qty.val()), max = parseFloat($qty.attr('max')), min = parseFloat($qty.attr('min')), step = $qty.attr('step'); // format values if (!val || val === '' || val === 'NaN') { val = 0; } if (max === '' || max === 'NaN') { max = ''; } if (min === '' || min === 'NaN') { min = 0; } if (step === 'any' || step === '' || step === undefined || parseFloat(step) === 'NaN') { step = 1; } else { step = parseFloat(step); } // change the value if ($(this).is('.woosb-qty-input-plus')) { if (max && ( max == val || val > max )) { $qty.val(max); } else { $qty.val((val + step).toFixed(woosb_decimal_places(step))); } } else { if (min && ( min == val || val < min )) { $qty.val(min); } else if (val > 0) { $qty.val((val - step).toFixed(woosb_decimal_places(step))); } } // trigger change event $qty.trigger('change'); }); $(document).on('click touch', '.single_add_to_cart_button', function(e) { var $this = $(this); if ($this.hasClass('woosb-disabled')) { e.preventDefault(); } }); $(document).on('change', '.woosb-qty .qty', function() { var $this = $(this); woosb_check_qty($this); }); var woosb_timeout = null; $(document).on('keyup', '.woosb-qty .qty', function() { var $this = $(this); if (woosb_timeout != null) clearTimeout(woosb_timeout); woosb_timeout = setTimeout(woosb_check_qty, 1000, $this); }); })(jQuery); function woosb_init($wrap) { var wrap_id = $wrap.attr('data-id'); var container = woosb_container(wrap_id); var $container = $wrap.closest(container); woosb_check_ready($container); woosb_calc_price($container); woosb_save_ids($container); jQuery(document).trigger('woosb_init', [$wrap, $container]); } function woosb_check_ready($container) { var total = 0; var selection_name = ''; var is_selection = false; var is_empty = true; var is_min = false; var is_max = false; var $products = $container.find('.woosb-products'); var $alert = $container.find('.woosb-alert'); var $btn = $container.find('.single_add_to_cart_button'); // remove ajax add to cart $btn.removeClass('ajax_add_to_cart'); if (!$products.length || (($products.attr('data-variables') === 'no') && ($products.attr('data-optional') === 'no'))) { // don't need to do anything return; } $products.find('.woosb-product').each(function() { var $this = jQuery(this); if (( parseFloat($this.attr('data-qty')) > 0 ) && ( parseInt($this.attr('data-id')) === 0 )) { is_selection = true; if (selection_name === '') { selection_name = $this.attr('data-name'); } } if (parseFloat($this.attr('data-qty')) > 0) { is_empty = false; total += parseFloat($this.attr('data-qty')); } }); // check min if (( $products.attr('data-optional') === 'yes' ) && $products.attr('data-min') && ( total < parseFloat($products.attr('data-min')) )) { is_min = true; } // check max if (( $products.attr('data-optional') === 'yes' ) && $products.attr('data-max') && ( total > parseFloat($products.attr('data-max')) )) { is_max = true; } if (is_selection || is_empty || is_min || is_max) { $btn.addClass('woosb-disabled disabled'); if (is_selection) { $alert. html(woosb_vars.alert_selection.replace('[name]', '' + selection_name + '')). slideDown(); return; } if (is_empty) { $alert.html(woosb_vars.alert_empty).slideDown(); return; } if (is_min) { $alert.html(woosb_vars.alert_min.replace('[min]', $products.attr('data-min'))).slideDown(); return; } if (is_max) { $alert.html(woosb_vars.alert_max.replace('[max]', $products.attr('data-max'))).slideDown(); } } else { $alert.html('').slideUp(); $btn.removeClass('woosb-disabled disabled'); } } function woosb_calc_price($container) { var total = 0; var total_sale = 0; var $products = $container.find('.woosb-products'); var $total = $container.find('.woosb-total'); var $wrap_woobt = $container.find('.woobt-wrap'); var total_woobt = parseFloat( $wrap_woobt.length ? $wrap_woobt.attr('data-total') : 0); var _discount = parseFloat($products.attr('data-discount')); var _discount_amount = parseFloat( $products.attr('data-discount-amount')); var _fixed_price = $products.attr('data-fixed-price'); var _saved = ''; var _fix = Math.pow(10, Number(woosb_vars.price_decimals) + 1); var is_discount = _discount > 0 && _discount < 100; var is_discount_amount = _discount_amount > 0; $products.find('.woosb-product').each(function() { var $this = jQuery(this); if (parseFloat($this.attr('data-price')) > 0) { var this_price = parseFloat($this.attr('data-price')) * parseFloat($this.attr('data-qty')); total += this_price; if (!is_discount_amount && is_discount) { this_price *= (100 - _discount) / 100; this_price = Math.round(this_price * _fix) / _fix; } total_sale += this_price; } }); // fix js number https://www.w3schools.com/js/js_numbers.asp total = woosb_round(total, woosb_vars.price_decimals); if (is_discount_amount && _discount_amount < total) { total_sale = total - _discount_amount; _saved = woosb_format_price(_discount_amount); } else if (is_discount) { _saved = woosb_round(_discount, 2) + '%'; } else { total_sale = total; } if (_fixed_price == 'yes') { total_sale = parseFloat($products.attr('data-price')); } var total_html = woosb_price_html(total, total_sale); var total_all_html = woosb_price_html(total + total_woobt, total_sale + total_woobt); if (_saved !== '') { total_html += ' ' + woosb_vars.saved_text.replace('[d]', _saved) + ''; } var price_selector = '.summary > .price'; if ((woosb_vars.change_price === 'yes_custom') && (woosb_vars.price_selector != null) && (woosb_vars.price_selector !== '')) { price_selector = woosb_vars.price_selector; } // change the bundle total $total.html(woosb_vars.price_text + ' ' + total_html).slideDown(); if (( woosb_vars.change_price !== 'no' ) && ( $products.attr('data-fixed-price') === 'no' ) && ( ( $products.attr('data-variables') === 'yes' ) || ( $products.attr('data-optional') === 'yes' ) )) { // change the main price if ($wrap_woobt.length) { // check if has woobt $container.find(price_selector).html(total_all_html); } else { $container.find(price_selector).html(total_html); } } if ($wrap_woobt.length) { // check if has woobt $wrap_woobt.find('.woobt-products').attr('data-product-price', total_sale); } jQuery(document).trigger('woosb_calc_price', [total_sale, total, total_html]); } function woosb_save_ids($wrap) { var ids = Array(); var $ids = $wrap.find('.woosb-ids'); var $products = $wrap.find('.woosb-products'); $products.find('.woosb-product').each(function() { var $this = jQuery(this); if (( parseInt($this.attr('data-id')) > 0 ) && ( parseFloat($this.attr('data-qty')) > 0 )) { ids.push($this.attr('data-id') + '/' + $this.attr('data-qty')); } }); $ids.val(ids.join(',')); jQuery(document).trigger('woosb_save_ids', [ids]); } function woosb_check_qty($qty) { var $wrap = $qty.closest('.woosb-wrap'); var qty = parseFloat($qty.val()); var min = parseFloat($qty.attr('min')); var max = parseFloat($qty.attr('max')); if ((qty === '') || isNaN(qty)) { qty = 0; } if (!isNaN(min) && ( qty < min )) { qty = min; } if (!isNaN(max) && ( qty > max )) { qty = max; } $qty.val(qty); $qty.closest('.woosb-product').attr('data-qty', qty); // change subtotal if (woosb_vars.bundled_price === 'subtotal') { var $products = $wrap.find('.woosb-products'); var $product = $qty.closest('.woosb-product'); var ori_price = parseFloat($product.attr('data-price')) * parseFloat($product.attr('data-qty')); $product.find('.woosb-price-ori').hide(); if (parseFloat($products.attr('data-discount')) > 0 && $products.attr('data-fixed-price') === 'no') { var new_price = ori_price * (100 - parseFloat($products.attr('data-discount'))) / 100; $product.find('.woosb-price-new'). html(woosb_price_html(ori_price, new_price)).show(); } else { $product.find('.woosb-price-new'). html(woosb_price_html(ori_price)). show(); } } jQuery(document).trigger('woosb_check_qty', [qty, $qty]); woosb_init($wrap); } function woosb_round(value, decimals) { return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals); } function woosb_format_money(number, places, symbol, thousand, decimal) { number = number || 0; places = !isNaN(places = Math.abs(places)) ? places : 2; symbol = symbol !== undefined ? symbol : '$'; thousand = thousand || ','; decimal = decimal || '.'; var negative = number < 0 ? '-' : '', i = parseInt( number = woosb_round(Math.abs(+number || 0), places).toFixed(places), 10) + '', j = 0; if (i.length > 3) { j = i.length % 3; } return symbol + negative + ( j ? i.substr(0, j) + thousand : '' ) + i.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + thousand) + ( places ? decimal + woosb_round(Math.abs(number - i), places).toFixed(places).slice(2) : '' ); } function woosb_format_price(price) { var price_html = ''; var price_formatted = woosb_format_money(price, woosb_vars.price_decimals, '', woosb_vars.price_thousand_separator, woosb_vars.price_decimal_separator); switch (woosb_vars.price_format) { case '%1$s%2$s': //left price_html += '' + woosb_vars.currency_symbol + '' + price_formatted; break; case '%1$s %2$s': //left with space price_html += '' + woosb_vars.currency_symbol + ' ' + price_formatted; break; case '%2$s%1$s': //right price_html += price_formatted + '' + woosb_vars.currency_symbol + ''; break; case '%2$s %1$s': //right with space price_html += price_formatted + ' ' + woosb_vars.currency_symbol + ''; break; default: //default price_html += '' + woosb_vars.currency_symbol + ' ' + price_formatted; } price_html += ''; return price_html; } function woosb_price_html(regular_price, sale_price) { var price_html = ''; if (sale_price < regular_price) { price_html = '' + woosb_format_price(regular_price) + ' ' + woosb_format_price(sale_price) + ''; } else { price_html = woosb_format_price(regular_price); } return price_html; } function woosb_decimal_places(num) { var match = ('' + num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); if (!match) { return 0; } return Math.max( 0, // Number of digits right of decimal point. (match[1] ? match[1].length : 0) // Adjust for scientific notation. - (match[2] ? +match[2] : 0)); } function woosb_container(id) { if ((woosb_vars.container_selector != '') && jQuery(woosb_vars.container_selector).length) { return woosb_vars.container_selector; } if (jQuery('.woosb-wrap-' + id).closest('#product-' + id).length) { return '#product-' + id; } if (jQuery('.woosb-wrap-' + id).closest('.product.post-' + id).length) { return '.product.post-' + id; } if (jQuery('.woosb-wrap-' + id).closest('div.product-type-woosb').length) { return 'div.product-type-woosb'; } if (jQuery('.woosb-wrap-' + id).closest('.elementor-product-woosb').length) { return '.elementor-product-woosb'; } return 'body.single-product'; }