jQuery(function ($){
function refreshAfterChange(){
if(typeof wc_cart_fragments_params!=='undefined'){
$(document.body).trigger('wc_fragment_refresh');
}
if($('.woocommerce-cart-form').length){
setTimeout(()=> window.location.reload(), 250);
return;
}
if($('form.woocommerce-checkout').length){
$(document.body).trigger('update_checkout');
return;
}}
function lockButton($btn, label){
$btn.prop('disabled', true)
.addClass('is-loading')
.data('orig', $btn.text())
.text(label);
}
function unlockButton($btn, label){
const orig=$btn.data('orig');
$btn.prop('disabled', false)
.removeClass('is-loading')
.text(label||orig||$btn.text());
}
function hideGiftSubscriptionOptions(context){
var $context=context ? $(context):$(document);
var $giftRows=$context.filter('.mhfgfwc-gift-row')
.add($context.find('.mhfgfwc-gift-row'));
if(!$giftRows.length){
$giftRows=$context.find('.mhfgfwc-cart-badge, .mhfgfwc-badge').closest('tr, li, .wc-block-cart-item, .shop_table tr');
}
$giftRows.each(function (){
var $row=$(this);
var $candidates=$row.find('fieldset, form, div, p, ul, ol').filter(function (){
var $candidate=$(this);
if(!$candidate.find('input[type="radio"], select').length){
return false;
}
var text=($candidate.text()||'').toLowerCase();
return text.indexOf('one time')!==-1
|| text.indexOf('every ')!==-1
|| text.indexOf('subscription')!==-1;
});
$candidates.each(function (){
var $candidate=$(this);
$candidate.addClass('mhfgfwc-subscription-options-hidden');
$candidate.find('input, select, textarea, button').prop('disabled', true);
});
});
}
function ensureToggleIcon($toggle){
var $icon=$toggle.find('.mhfgfwc-toggle-icon');
if(!$icon.length){
$icon=$('<span class="mhfgfwc-toggle-icon dashicons dashicons-arrow-down-alt2"></span>');
$toggle.append($icon);
}
return $icon;
}
function applyToggleState($wrap, isOpen){
var $toggle=$wrap.find('.mhfgfwc-show-gifts-toggle');
var $panel=$wrap.next('.mhfgfwc-gift-section');
var $icon=ensureToggleIcon($toggle);
if(!$panel.length){
return;
}
if(isOpen){
$panel.show().removeClass('mhfgfwc-hidden');
$wrap.addClass('open');
$toggle.addClass('opened');
$icon.removeClass('dashicons-arrow-down-alt2')
.addClass('dashicons-arrow-up-alt2');
return;
}
$panel.hide().addClass('mhfgfwc-hidden');
$wrap.removeClass('open');
$toggle.removeClass('opened');
$icon.removeClass('dashicons-arrow-up-alt2')
.addClass('dashicons-arrow-down-alt2');
}
function initToggleBehaviour(context){
const $context=context ? $(context):$(document);
const $wraps=$context.filter('.woocommerce-form-coupon-toggle')
.add($context.find('.woocommerce-form-coupon-toggle'));
$wraps.each(function (){
var $wrap=$(this);
var $toggle=$wrap.find('.mhfgfwc-show-gifts-toggle');
var $panel=$wrap.next('.mhfgfwc-gift-section');
ensureToggleIcon($toggle);
if($panel.length){
applyToggleState($wrap, false);
}
if(!$wrap.hasClass('mhfgfwc-init')){
$wrap.addClass('mhfgfwc-init');
}});
}
initToggleBehaviour();
hideGiftSubscriptionOptions();
$(document).on('click', '.mhfgfwc-show-gifts-toggle', function (e){
e.preventDefault();
var $link=$(this);
var $wrap=$link.closest('.woocommerce-form-coupon-toggle');
var $panel=$wrap.next('.mhfgfwc-gift-section');
var willOpen = !$link.hasClass('opened');
if(!$panel.length) return;
if(willOpen){
$panel.stop(true, true)
.removeClass('mhfgfwc-hidden')
.slideDown(200);
applyToggleState($wrap, true);
}else{
$panel.stop(true, true).slideUp(200, function (){
$panel.addClass('mhfgfwc-hidden');
});
$wrap.removeClass('open');
$link.removeClass('opened');
ensureToggleIcon($link)
.removeClass('dashicons-arrow-up-alt2')
.addClass('dashicons-arrow-down-alt2');
}});
$(document).on('click', '.mhfgfwc-add-gift', function (e){
e.preventDefault();
var $btn=$(this);
if($btn.is(':disabled')) return;
var pid=parseInt($btn.data('product'), 10)||0;
var rid=parseInt($btn.data('rule'), 10)||0;
lockButton($btn, mhfgfwcFrontend.i18n.adding);
$.post(mhfgfwcFrontend.ajax_url_add, {
nonce: mhfgfwcFrontend.nonce,
product: pid,
rule: rid
})
.done(function (response){
if(response&&response.success){
if($('form.woocommerce-checkout').length){
$(document.body).trigger('update_checkout');
}else{
refreshAfterChange();
}}else{
alert(response?.data?.message||mhfgfwcFrontend.i18n.ajax_error);
unlockButton($btn, mhfgfwcFrontend.i18n.add);
}})
.fail(function (){
alert(mhfgfwcFrontend.i18n.ajax_error);
unlockButton($btn, mhfgfwcFrontend.i18n.add);
});
});
$(document).on('click', '.mhfgfwc-remove-gift', function (e){
e.preventDefault();
var $btn=$(this);
if($btn.is(':disabled')) return;
var itemKey=$btn.data('item-key');
lockButton($btn, mhfgfwcFrontend.i18n.removing);
$.post(mhfgfwcFrontend.ajax_url_remove, {
nonce: mhfgfwcFrontend.nonce,
item_key: itemKey
})
.done(function (response){
if(response&&response.success){
if($('form.woocommerce-checkout').length){
$(document.body).trigger('update_checkout');
}else{
refreshAfterChange();
}}else{
alert(response?.data?.message||mhfgfwcFrontend.i18n.ajax_error);
unlockButton($btn, mhfgfwcFrontend.i18n.remove);
}})
.fail(function (){
alert(mhfgfwcFrontend.i18n.ajax_error);
unlockButton($btn, mhfgfwcFrontend.i18n.remove);
});
});
$(document.body).on('updated_checkout', function (){
var $section=$('.mhfgfwc-gift-section');
if(!$section.length) return;
$.ajax({
type: 'POST',
url: mhfgfwcFrontend.ajax_url_refresh,
data: {
nonce: mhfgfwcFrontend.nonce,
context: $('form.woocommerce-checkout').length ? 'checkout':'cart'
},
success: function (res){
if(res&&res.success&&res.data&&typeof res.data.html!=='undefined'){
var html=$.trim(res.data.html);
var $toggleWrap=$section.prev('.woocommerce-form-coupon-toggle');
var wasOpen=$toggleWrap.hasClass('open') ||
$toggleWrap.find('.mhfgfwc-show-gifts-toggle').hasClass('opened') ||
$section.is(':visible');
if(!html){
$section.empty().hide();
$section.addClass('mhfgfwc-hidden');
applyToggleState($toggleWrap, false);
$toggleWrap.hide();
return;
}
$toggleWrap.show();
function refreshGiftSection(){
$section.html(html);
$section.removeClass('mhfgfwc-disabled-rule').css('opacity', 1);
initToggleBehaviour($toggleWrap);
applyToggleState($toggleWrap, wasOpen);
hideGiftSubscriptionOptions($section);
if(typeof window.mhfgfwcBindGiftEvents==='function'){
window.mhfgfwcBindGiftEvents($section[0]);
}}
if(wasOpen){
$section.stop(true, true).fadeTo(120, 0.3, function (){
refreshGiftSection();
$section.fadeTo(120, 1);
});
return;
}
refreshGiftSection();
}}
});
});
$(document.body).on('updated_cart_totals updated_checkout wc_fragments_refreshed', function (){
hideGiftSubscriptionOptions();
});
});