1import{buildExternalId,utmParams,getLocaleCountry as __bonusCards_localeCountry}from"globals";import{bonusPurchaseConfirmPopup}from"bonusPurchaseConfirmPopup";import{bonusPurchaseSuccessPopup}from"bonusPurchaseSuccessPopup";import{__translate as __bonusCards_translate}from"translate";const PAGE_GROUPS=["p_bonus_spin_n","p_bonus_amount","p_bonus_casino","p_bonus_category","p_bonus_country","p_bonus_percent","p_casino_category","p_casino_city","p_casino_country","p_casino_state_usa","p_casino_currency","p_casino_deposit_low","p_casino_payment","p_casino","p_casino_slot_soft","p_game_category","p_slot_category","p_slot","p_slot_payline","p_blog_category","p_blog_article","p_website_category","p_similar_casinos","p_software_bonuses","p_website_page","p_home","p_profile_rewards","p_profile_shop","p_promo_codes_category","p_other"],PURCHASE_POPUP_CATEGORY="p_shop_popup";class GamificationBonusCards{reviewLinks=new WeakSet;purchaseButtons=new WeakSet;ownedBonusCards=new WeakSet;promoCodeButtons=new WeakSet;inFlightPurchases=new Set;translate(t,e=!1){return __bonusCards_translate(t,__bonusCards_localeCountry()||"en",e)||t}buildAnalyticsPayload(t){return{bonus_id:JSON.stringify(t.dataset.id),bonus_title:JSON.stringify(this.getElementText(t,'[data-element="bonus_title"]')),casino_domain:JSON.stringify(t.dataset.domain),casino_name:JSON.stringify(this.getElementText(t,'[data-element="bonus_review"]')),bonus_cost:JSON.stringify(t.dataset.bonusCost)}}trackEvent(t,e,o,s={}){try{const a=document.body.dataset.routeBonus,n=PAGE_GROUPS.includes(a)?a:PAGE_GROUPS[PAGE_GROUPS.length-1],i={page_url:JSON.stringify(document.location.origin+document.location.pathname),page_current_path:JSON.stringify(document.location.pathname),page_group:JSON.stringify(n),website_domain:JSON.stringify(document.location.hostname),website_country:JSON.stringify(document.body.dataset.geo)};window.dataLayer=window.dataLayer||[],window.dataLayer.push(Object.assign({event:`addEvents_${t}`,event_id:"d-v1-e1",event_cat:e,event_name:o},i,utmParams(),s))}catch(t){}}bindReviewLinks(t){this.toArray(t).forEach(t=>{const e=t.querySelector('[data-element="bonus_review"]');if(!e||this.reviewLinks.has(e))return;const o=e.dataset.reviewHref;o&&(this.reviewLinks.add(e),e.addEventListener("click",t=>{t.stopPropagation(),window.open(o,"_blank")}))})}bindPurchaseFlow(t,{purchaseBtnSelector:e,trackCategory:o,purchaseBonus:s}){this.toArray(t).forEach(t=>{const a=t.querySelector(`[data-element="${e}"]`);a&&!this.purchaseButtons.has(a)&&(this.purchaseButtons.add(a),a.addEventListener("click",e=>{if(e.stopPropagation(),this.inFlightPurchases.has(t.dataset.id))return;const a=this.buildAnalyticsPayload(t);this.trackEvent("click",o,"buyNow",a),this.showPurchaseConfirmation(t,a,{purchaseBonus:s})}))})}bindOwnedBonusRedirects(t,e){this.toArray(t).forEach((t,o)=>{this.ownedBonusCards.has(t)||(this.ownedBonusCards.add(t),t.addEventListener("click",s=>this.handleOwnedBonusClick(s,t,o,e)))})}bindPromoCodeCopy(){document.querySelectorAll('[data-element="copy-promo-code"]').forEach(t=>{this.promoCodeButtons.has(t)||(this.promoCodeButtons.add(t),t.addEventListener("click",e=>this.handlePromoCodeCopy(e,t)))})}bindBalanceUpdates(t,{purchaseBtnSelector:e}){const o=this.toArray(t);
1document.addEventListener("balanceChanged",({detail:t})=>{const s=t.newBalance;o.forEach(t=>{const o=parseInt(t.dataset.bonusCost,10);if(!o)return;const a=s>=o;t.dataset.bonusAvailable=a?"true":"false",t.querySelector(`[data-element="${e}"]`)?.classList.toggle("gray",!a)})})}showPurchaseConfirmation(t,e,{purchaseBonus:o}){bonusPurchaseConfirmPopup.show({bonus:t,onCancel:()=>this.trackEvent("click","p_shop_popup","cancelPurchase",e),onEarnMoreCoins:()=>setTimeout(()=>window.questPopup?.showPopup(),100),onConfirm:async(t,s,a)=>{const n=t.dataset.id;this.trackEvent("click","p_shop_popup","confirmPurchase",e),this.inFlightPurchases.add(n);try{const t=await o(n);return t.success?(s(),bonusPurchaseSuccessPopup.show(t.userBonus),!0):(a(t.message||this.translate("Purchase failed. Please try again.")),!1)}catch(t){return a(this.translate("Something went wrong. Please try again.")),!1}finally{this.inFlightPurchases.delete(n)}}})}async handleOwnedBonusClick(t,e,o,{trackCategory:s}){if(t.target.closest(".promo-code__wrapper"))return;const a=t.target.closest('[data-element="bonus_btn"], .bonus__card-link');if(!a)return;if(a.matches("button[disabled]"))return;t.stopPropagation();const n=this.buildAnalyticsPayload(e),i=await buildExternalId(e.dataset.bonus);this.trackEvent("clickAffLink",s,"getBonus",{...n,...i?{external_id:JSON.stringify(i)}:{}}),this.emitBonusClickedEvent(e,o,a)}emitBonusClickedEvent(t,e,o){window.dispatchEvent(new CustomEvent("bonusClicked",{detail:{bonusData:{bonus:t.dataset.bonus,affiliate:t.dataset.affiliate,restricted:!1,url:`${t.dataset.domain}?bonus=${t.dataset.bonus}`,domain:t.dataset.domain,name:t.dataset.name,offer_type:t.dataset.offerType},bonusButton:o,rowIndex:e+1}}))}handlePromoCodeCopy(t,e){t.stopPropagation();const o=e.closest(".promo-code"),s=o?.querySelector('[data-element="promo-code"]')?.dataset.promoCode;s&&navigator.clipboard.writeText(s).then(()=>{this.showCopyTooltip(e)})}showCopyTooltip(t,e="Copied!"){const o=document.createElement("div");o.textContent=this.translate(e),o.className="copy-tooltip",document.body.appendChild(o);const s=t.getBoundingClientRect();o.style.position="absolute",o.style.top=s.top+window.scrollY-30+"px",o.style.left=`${s.left+window.scrollX}px`,setTimeout(()=>o.remove(),2e3)}getElementText(t,e){return t.querySelector(e)?.textContent?.trim()||""}toArray(t){return Array.from(t||[])}}const gamificationBonusCards=new GamificationBonusCards;export{gamificationBonusCards};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.