function($ = recurpayScript) { if ((window.location.href.indexOf("/products/") > -1) && (window.location.href.indexOf("recurpay_preview=true") > -1)) { recurpay.pdpAPI = recurpay.generalURL + '/storefront/api/2024-07/widgets/products/plans?shop=' + recurpay.shopDomainURL + '&fetch=force'; } var accountTemplate = '', accountSelector = "#recurpay-account-widget", pdpSelector = ".recurpay-pdp-widget", subscriptionSelector = "#recurpay-manage-subscriptions", checkoutSelector = '[href="/checkout"], form[action="/cart"] button[type="submit"][name="checkout"], form[action="/cart"] input[type="submit"][name="checkout"], form[action="/checkout"] input[type="submit"][name="checkout"], form[action="/checkout"] button[type="submit"][name="checkout"], button[type="submit"][name="checkout"],button[name="checkout"], button[name="checkout"].cart__checkout, button.ucd-checkout-btn, #checkout2.flo-checkout-btn', atcFormSelector = 'form[action*="/cart/add"], form[action*="/cart/add.js"], form[id^="product_form_"], form[data-productid], form[action*="/cart/add"][data-js-product-form], form#AddToCartForm, #addToCartFormId1, form.product-form, #AddToCartForm_id, form[data-cart-submit="data-cart-submit"][data-productid], form.lh-product-form, form.shg-product-atc-btn-wrapper, form.shopify-product-form, product-form.product-form', atcSelector = '.buy-buttons [type="submit"], [name="add"], [type=\"submit\"],button#AddToCart, button.gf_add-to-cart, button.gp-button-atc, #button-cart,.new-form-atc[data-add-to-cart], button[data-type="addToCart"], .product-buy-buttons--primary[data-text="Add to cart"], product-variant-render button[type="submit"],.x-buy-now-button', buynowSelector = '.shopify-payment-button,.shopify-payment-button__button', priceQuantitySelector = '[name=quantity]', footerManageSubcriptionSelector = ".recurpay-manage-subscription-link-footer", footerLinkSelector = 'footer, .footer', appBlockSelector = '[id*="recurpay_app_block_widget"], .shopify-app-block[data-block-handle="recurpay-app-block-widget"]', appBlockParentSelector = ".product-info, .shop-product-info, .product-single__meta [data-product-blocks], .shopify-block, .product__info-container"; recurpay.pdpAPI = recurpay.generalURL + '/storefront/api/2024-07/widgets/products/plans?shop=' + recurpay.shopDomainURL; // ACCOUNT PAGE if(recurpay.pageTemplate == "customers/account" && $(accountSelector).length <= 0) { if($('.card__linklist').length >0) { $('.card__linklist').before('
'); } else if($('.flits-account-page-title').length >0) { $('.flits-account-page-title').append(''); } else if($('a[href*="/account/addresses"]').length >0) { $('a[href*="/account/addresses"]').before(''); } else if ($('.order-history').length >0) { $('.order-history').before(''); } else if ($('a[href*="/account/logout"]').length >0) { $('a[href*="/account/logout"]').before(''); } else { recurpay.logEvent("account_widget","Failed to show account snippet", "critical"); } } //LOGIN PAGE function loginPageSubscriptionLink() { var accountLoginHTML = "", footerLinkHTML = "", managesubscriptionSelector = ".recurpay-manage-subscription-link", signUpFormSelector = 'form[action*="/account"]'; if ($(managesubscriptionSelector).length <= 0 && $(signUpFormSelector).length > 0) { $(signUpFormSelector).append(""); } if ($(footerManageSubcriptionSelector).length <= 0 && $(footerLinkSelector).length > 0) { $(footerLinkSelector).find('.footer__content-bottom .footer__content-bottom-wrapper .footer__copyright').append(''); } var account_url = ""; account_url = recurpay.customer ? recurpay.accountAPI + "&settings=true" : recurpay.generalURL + "/api/storefront/v3/customers/subscriptions/count?" + recurpay.urlParam + "&settings=true"; $.ajax( { url: account_url, type: 'POST', data: { customer_id: recurpay.customer || '', customer_hash: recurpay.secret_potion || '' }, async: true, success: function (response) { if (response != "ERROR") { if (response.settings !== null && !$.isEmptyObject(response.settings) && response.translations.breadcrumb_manage_subscription_link != undefined) { if ($(managesubscriptionSelector).length >= 0) { accountLoginHTML += "" + response.translations.breadcrumb_manage_subscription_link + ""; } if ($(footerManageSubcriptionSelector).length >= 0) { footerLinkHTML += "" + response.translations.breadcrumb_manage_subscription_link + ""; } } } $(managesubscriptionSelector).html(accountLoginHTML); $(footerManageSubcriptionSelector).html(footerLinkHTML); } }); } loginPageSubscriptionLink(); if($(accountSelector).length && recurpay.customer !== "guest") { function recurAccount(count) { accountTemplate += '0&&d.css("display","flex"))} function replaceTranslationPlaceholders(n,c){return n=n||"",Object.keys(c||{}).forEach(function(e){const l=null!=c[e]?c[e]:"";n=n.split(`[[${e}]]`).join(l)}),n} function getCurrencySymbolFromMoney(e){return e?e.replace(/[0-9.,\s]/g,""):""} function getDiscountDisplayValue(e,a){return"percentage"===e?parseFloat(a).toFixed(2).replace(/\.0+$/,"").replace(/\.00$/,""):formatPriceMoney(a)} function getOneTimeDiscountLabel(e,r,t){const i=recurpay?.settings?.translations||{},n=parseFloat(r)||0,o=parseFloat(t)||0,a=formatPriceMoney(n),_=formatPriceMoney(o),c=n.toFixed(2).replace(/\.0+$/,"").replace(/\.00$/,""),l=getCurrencySymbolFromMoney(formatPriceMoney(n));let m="";return m="percentage"===e?i.premium_one_time_percentage_discount_label||i.premium_one_time_discount_label||"[[DISCOUNT]]% ↓":"fixed"===e?i.premium_one_time_fixed_discount_label||"Save [[SAVING_AMOUNT]]":"price"===e?i.premium_one_time_price_discount_label||"Save [[SAVING_AMOUNT]]":i.premium_one_time_discount_label||"[[DISCOUNT]]% ↓",replaceTranslationPlaceholders(m,{DISCOUNT:"percentage"===e?c:a,DISCOUNT_PERCENTAGE:c,SAVING_AMOUNT:_,CURRENCY:l})} function getSubscriptionDiscountLabel(e,t,n){const r=recurpay?.settings?.translations||{},o=getDiscountDisplayValue(e,t),i=formatPriceMoney(n||0),s=getCurrencySymbolFromMoney(formatPriceMoney(t));let a=r.premium_subscription_discount_label||"[[SAVING_AMOUNT]]";return replaceTranslationPlaceholders(a,{DISCOUNT:o,DISCOUNT_PERCENTAGE:o,SAVING_AMOUNT:i,CURRENCY:s})} function normalizeProductPlans(product) { const topLevelPlans = Array.isArray(product?.plans) ? product.plans : []; const normalizedPlans = []; const seenKeys = new Set(); topLevelPlans.forEach(function(plan) { if (!plan) return; const groupProducts = Array.isArray(plan.products) ? plan.products : []; const groupShippingPolicy = plan.shipping_policy || {}; const groupId = plan.selling_plan_group_id || ""; const sellingPlans = Array.isArray(plan.selling_plans) && plan.selling_plans.length ? plan.selling_plans : [plan]; sellingPlans.forEach(function(sellingPlan, sellingPlanIndex) { if (!sellingPlan) return; const sellingPlanNumericId = sellingPlan.id != null ? String(sellingPlan.id) : ""; const sellingPlanGid = sellingPlan.selling_plan_id ? String(sellingPlan.selling_plan_id) : ""; const dedupeKey = sellingPlanGid || sellingPlanNumericId || `${groupId}::${sellingPlan.name || ""}::${sellingPlanIndex}`; if (seenKeys.has(dedupeKey)) return; seenKeys.add(dedupeKey); normalizedPlans.push({ id: sellingPlan.id != null ? sellingPlan.id : plan.id, parent_plan_id: plan.id, selling_plan_group_id: groupId, selling_plan_id: sellingPlan.selling_plan_id || "", name: sellingPlan.name || plan.name || "", description: sellingPlan.description || plan.description || "", delivery_policy: sellingPlan.delivery_policy || {}, billing_policy: sellingPlan.billing_policy || {}, pricing_polices: Array.isArray(sellingPlan.pricing_polices) ? sellingPlan.pricing_polices : [], position: sellingPlan.position != null ? sellingPlan.position : plan.position, recommended: sellingPlan.recommended != null ? !!sellingPlan.recommended : !!plan.recommended, type: plan.type || "regular", products: groupProducts, shipping_policy: groupShippingPolicy }); }); }); normalizedPlans.sort(function(a, b) { return (parseInt(a.position, 10) || 0) - (parseInt(b.position, 10) || 0); }); return normalizedPlans; } function getPlanShipmentCount(deliveryPolicy, billingPolicy) { var deliveryFrequency = parseInt(deliveryPolicy?.frequency, 10) || 0; var billingFrequency = parseInt(billingPolicy?.frequency, 10) || 0; var deliveryInterval = (deliveryPolicy?.interval || "").toLowerCase(); var billingInterval = (billingPolicy?.interval || "").toLowerCase(); if (!deliveryFrequency || !billingFrequency) return 1; if ( deliveryInterval && billingInterval && deliveryInterval === billingInterval && billingFrequency >= deliveryFrequency && billingFrequency % deliveryFrequency === 0 ) { return billingFrequency / deliveryFrequency; } return 1; } function recurPDP(data) { var prepaidCount = 0, regularCount = 0, prepaidDiscount = [], maxPrepaidDiscount = "", getPlanDesc = "", pdpTemplate = "", GetPlans = "", plans = Array.isArray(data?.plans) ? data.plans : []; const GetPlansLength = plans.length; $.each(plans, function(key, plan) { if (!plan) return; var DiscountPercentageHtml = "", DescriptionHtml = "", PlanHtml = "", PlanDiscount = 0, PlanDiscountType = "percentage", PlanType = "regular"; var pricingPolicy = ( Array.isArray(plan.pricing_polices) && plan.pricing_polices.length) ? plan.pricing_polices[0] : null; var deliveryPolicy = plan.delivery_policy || {}; var billingPolicy = plan.billing_policy || {}; var rawSellingPlanId = plan.selling_plan_id || ""; var sellingPlanId = rawSellingPlanId ? String(rawSellingPlanId).split("/").pop() : ""; var deliveryFrequency = parseInt(deliveryPolicy.frequency, 10) || ""; var deliveryInterval = deliveryPolicy.interval || ""; var billingFrequency = parseInt(billingPolicy.frequency, 10) || ""; var billingInterval = billingPolicy.interval || ""; var shipmentCount = getPlanShipmentCount(deliveryPolicy, billingPolicy); PlanType = plan.type || "regular"; if (shipmentCount > 1) { PlanType = "prepaid"; } if (PlanType === "prepaid") { prepaidCount += 1; if (pricingPolicy && pricingPolicy.discount) { prepaidDiscount.push(pricingPolicy.discount.value); } } else { regularCount += 1; } if (pricingPolicy && pricingPolicy.discount) { PlanDiscountType = pricingPolicy.discount.type || "percentage"; PlanDiscount = parseFloat(pricingPolicy.discount.value) || 0; if (PlanDiscount !== 0) { if (PlanDiscountType === "percentage") { DiscountPercentageHtml = '(' + PlanDiscount + '% Off)'; } else if (PlanDiscountType === "fixed") { DiscountPercentageHtml = '(Save ' + formatPriceMoney(PlanDiscount) + ')'; } else if (PlanDiscountType === "price") { DiscountPercentageHtml = '(Price ' + formatPriceMoney(PlanDiscount) + ')'; } } } if (plan.description) { DescriptionHtml = '
"; } var optionAttrs = ' data-plan="' + (plan.id || "") + '"' + ' data-selling-plan="' + sellingPlanId + '"' + ' data-plan-name="' + (plan.name || "") + '"' + ' data-plan-shipment="' + shipmentCount + '"' + ' data-plan-discount="' + PlanDiscount + '"' + ' data-plan-discount-type="' + PlanDiscountType + '"' + ' data-delivery-frequency="' + deliveryFrequency + '"' + ' data-delivery-interval="' + deliveryInterval + '"' + ' data-billing-frequency="' + billingFrequency + '"' + ' data-billing-interval="' + billingInterval + '"' + ' data-plan-type="' + PlanType + '"' + ' data-recommended-frequency="' + (!!plan.recommended) + '"'; var optionAttrsWithoutSellingPlan = ' data-plan="' + (plan.id || "") + '"' + ' data-plan-name="' + (plan.name || "") + '"' + ' data-plan-shipment="' + shipmentCount + '"' + ' data-plan-discount="' + PlanDiscount + '"' + ' data-plan-discount-type="' + PlanDiscountType + '"' + ' data-delivery-frequency="' + deliveryFrequency + '"' + ' data-delivery-interval="' + deliveryInterval + '"' + ' data-billing-frequency="' + billingFrequency + '"' + ' data-billing-interval="' + billingInterval + '"' + ' data-plan-type="' + PlanType + '"' + ' data-recommended-frequency="' + (!!plan.recommended) + '"'; if (recurpay.checkout == "shopify") { if (plan.recommended === true) { PlanHtml += '"; } else { PlanHtml += '"; } } else { if (plan.recommended === true) { PlanHtml += '"; } else { PlanHtml += '"; } } GetPlans += PlanHtml; getPlanDesc += DescriptionHtml; }); if (regularCount > 0 && prepaidCount > 0 && prepaidDiscount.length) { maxPrepaidDiscount = Math.max.apply(Math, prepaidDiscount); } if (recurpay.subscriptionFirst == true) { pdpTemplate += '")}),a.html(e),t.show()}else t.hide(),a.html(""),o.fadeOut()},error:function(){t.hide(),a.html(""),o.fadeOut()}})):(t.hide(),a.html(""),void o.fadeOut())):(t.hide(),a.html(""),void o.fadeOut())} function recurProperties(e){var a=$(e).parents(pdpSelector);if($(a).find("[name='recurpay__group_main'][value='subscription']").is(":checked")){var r=$(a).find('[name="recurpay-input"] option:selected').attr("data-plan-name"),t=$(a).find('[name="recurpay-input"] option:selected').attr("data-plan");if(e.closest(appBlockSelector).length>0?(e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).find(".recurpay_plan_name").length<=0?e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).append(``):e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).find(".recurpay_plan_name").attr("name","properties[_Plan]").val(r),e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).find(".recurpay_plan_id").length<=0?e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).append(``):e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).find(".recurpay_plan_id").attr("name","properties[_PlanId]").val(t)):($(a).find(".recurpay_plan_name").attr("name","properties[_Plan]").val(r),$(a).find(".recurpay_plan_id").attr("name","properties[_PlanId]").val(t)),parseInt(recurpay.subscriptionInfluence&&recurpay.subscriptionInfluenceCount)>=1&&(e.closest(appBlockSelector).length>0?e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).find(".recurpay_purchase_data").length<=0?e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).append(``):e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).find(".recurpay_purchase_data").attr("name","properties[_PurchaseData]").val(recurpay.subscriptionInfluenceCount):$(a).find(".recurpay_purchase_data").attr("name","properties[_PurchaseData]").val(recurpay.subscriptionInfluenceCount)),$(a).find(".recurpay__description[data-description-id]").hide(),$(a).find('.recurpay__description[data-description-id="'+t+'"]').show(),"shopify"==recurpay.checkout){var n=$(a).find('[name="recurpay-input"] option:selected').attr("data-selling-plan");e.closest(appBlockSelector).length>0?e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).find(".recurpay_selling_plan_id").length<=0?e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).append(''):e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).find(".recurpay_selling_plan_id").attr("name","selling_plan").val(n):$(a).find(".recurpay_selling_plan_id").attr("name","selling_plan").val(n),window._RestockRocket&&"function"==typeof window._RestockRocket.getSellingPlan&&($('.restock-rocket-form-input[name="selling_plan"]').attr("name",""),$(".restock-rocket-preorder-description").hide())}}else if(e.closest(appBlockSelector).length>0?(e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).find(".recurpay_plan_name").attr("name",""),e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).find(".recurpay_plan_id").attr("name",""),e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).find(".recurpay_purchase_data").attr("name","")):($(a).find(".recurpay_plan_name").attr("name",""),$(a).find(".recurpay_plan_id").attr("name",""),$(a).find(".recurpay_purchase_data").attr("name","")),"shopify"==recurpay.checkout&&(e.closest(appBlockSelector).length>0?e.closest(appBlockSelector).parents(appBlockParentSelector).find(atcFormSelector).find(".recurpay_selling_plan_id").attr("name",""):$(a).find(".recurpay_selling_plan_id").attr("name",""),window._RestockRocket&&"function"==typeof window._RestockRocket.getSellingPlan)){var p=window._RestockRocket.getSellingPlan();$(".restock-rocket-form-input").attr("name","selling_plan"),$(".restock-rocket-form-input").val(p.shopify_selling_plan_id),$(".restock-rocket-preorder-description").show()}offerSavings(a),recurpay.hasOffers&&promotionalOffer(a)} function addSubscription(btn) { let $appBlock = $(btn).closest(appBlockSelector); let isInsideAppBlock = $appBlock.length > 0 && $(pdpSelector).closest(appBlockSelector).length > 0; let $form = null; if ($appBlock.parents(appBlockParentSelector).length && $appBlock.parents(appBlockParentSelector).find(atcSelector).length) { $form = isInsideAppBlock ? $appBlock.parents(appBlockParentSelector).find(atcSelector).parents(atcFormSelector) : $(btn).parents(atcFormSelector); } else if ($appBlock.closest(".product-grid__item").length && $appBlock.closest(".product-grid__item").find(atcSelector).length) { $form = isInsideAppBlock ? $appBlock.closest(".product-grid__item").find(atcSelector).parents(atcFormSelector) : $(btn).parents(atcFormSelector); } else { $form = isInsideAppBlock ? $(atcSelector).parents(atcFormSelector) : $(btn).parents(atcFormSelector); } let $variantSelector = $form.find('[name="id"]'); let $quantitySelector = $form.find('[name="quantity"]'); let $inputSelect = isInsideAppBlock ? $appBlock.find(pdpSelector).find('[name="recurpay-input"] option:selected') : $form.find(pdpSelector).find('[name="recurpay-input"] option:selected'); let subscriptionPlanId = $inputSelect.attr('data-plan') || ''; let subscriptionPlanName = $inputSelect.attr('data-plan-name') || ''; let subscriptionPlanType = $inputSelect.attr('data-plan-type') || ''; let planVariant = $variantSelector.length > 0 ? parseInt($variantSelector.val()) : parseInt(recurpay.product.availableVariant); let planQuantity = $quantitySelector.length > 0 ? parseInt($quantitySelector.val()) : 1; recurProperties($(btn).closest(pdpSelector).find('[name="recurpay__group_main"]')); let planParams = {}; if (recurpay.checkout == "shopify") { let sellingPlanId = isInsideAppBlock ? $appBlock.find(pdpSelector).find('[name="recurpay-input"] option:selected').attr('data-selling-plan') : $form.find(pdpSelector).find('[name="recurpay-input"] option:selected').attr('data-selling-plan'); if (!sellingPlanId || sellingPlanId === 'undefined' || sellingPlanId === 'null') { console.warn('[Recurpay] selling_plan ID is missing — cannot add subscription to cart.'); return; } planParams = { id: planVariant, quantity: planQuantity, selling_plan: sellingPlanId, properties: { '_Plan': subscriptionPlanName, '_PlanId': subscriptionPlanId } }; } else { planParams = { id: planVariant, quantity: planQuantity, properties: { '_Plan': subscriptionPlanName, '_PlanId': subscriptionPlanId } }; } if (recurpay.checkout == "recurpay" && !recurpay.prepaidMixedCart && subscriptionPlanType == "prepaid") { $.getJSON('/cart', function(response) { response.items = []; response.items.push(planParams); recurpay.recurCart(response); }); } else { if (recurpay.action == "default" && $(atcFormSelector).find(atcSelector).length) { $form.find(atcSelector).click(); } else { $.ajax({ type: 'POST', url: '/cart/add.js', dataType: 'json', data: planParams, success: function() { if (recurpay.checkout == "recurpay" && recurpay.action == "checkout") { $.getJSON('/cart', function(response) { recurpay.recurCart(response); }); } else if (recurpay.action == "cart") { document.location.href = '/cart'; } else { document.location.href = '/checkout'; } }, error: function(xhr) { var err = eval("(" + xhr.responseText + ")"); $('[data-recurpay-error]').html(err.description).show().delay(3000).fadeOut(); } }); } } } function loadRecurpayScripts() { $.ajax( { url:recurpay.scriptsAPI,type:'GET',async:true,success:function(htmlContent) { if(!$.trim(htmlContent))return; var $tempDiv=$('