1 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"> 7 <meta name="theme-color" content="#00070f"> 8 <title>Get Paid for Games, Offers & Surveys | Shark Earnings</title> 9 <meta name="title" content="Get Paid for Games, Offers & Surveys | Shark Earnings"> 10 <meta name="description" content="Get paid for playing games, testing apps, and taking surveys. 5,000+ offers and cash out via PayPal, crypto, or gift cards from just $1."> 11 <meta name="keywords" content="earn money online, make money from home, paid surveys that pay, get paid to play games, how to make money fast, cash rewards app, online tasks for money, referral program passive income, PayPal payouts, cryptocurrency rewards, gift card rewards, earn money without investment"> 12 13 <link rel="canonical" href="https://sharkearnings.com/"> 14 15 <meta property="og:type" content="website"> 16 <meta property="og:url" content="https://sharkearnings.com/"> 17 <meta property="og:title" content="Get Paid for Games, Offers & Surveys | Shark Earnings"> 18 <meta property="og:description" content="Get paid for playing games, testing apps, and taking surveys. 5,000+ offers and cash out via PayPal, crypto, or gift cards from just $1."> 19 <meta property="og:image" content="https://sharkearnings.com/assets/images/sharkearnings_link.webp"> 20 <meta property="og:image:type" content="image/webp"> 21 <meta property="og:image:width" content="1200"> 22 <meta property="og:image:height" content="630"> 23 <meta property="og:image:alt" content="Get Paid for Games, Offers & Surveys | Shark Earnings"> 24 <meta property="og:site_name" content="Shark Earnings"> 25 <meta property="og:locale" content="en_US"> 26 27 <meta name="twitter:card" content="summary_large_image"> 28 <meta name="twitter:url" content="https://sharkearnings.com/"> 29 <meta name="twitter:title" content="Get Paid for Games, Offers & Surveys | Shark Earnings"> 30 <meta name="twitter:description" content="Get paid for playing games, testing apps, and taking surveys. 5,000+ offers and cash out via PayPal, crypto, or gift cards from just $1."> 31 <meta name="twitter:image" content="https://sharkearnings.com/assets/images/sharkearnings_link.webp"> 32 <meta name="twitter:site" content="@ofcsharknetwork"> 33 <meta name="twitter:creator" content="@ofcsharknetwork"> 34 35 <meta name="robots" content="index, follow"> 36 <meta name="googlebot" content="index, follow"> 37 38 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 39 <meta name="referrer" content="strict-origin-when-cross-origin"> 40 41 <meta name="mobile-web-app-capable" content="yes"> 42 <meta name="apple-mobile-web-app-status-bar-style" content="default"> 43 <meta name="apple-mobile-web-app-title" content="Shark Earnings"> 44 45 <link rel="icon" type="image/x-icon" href="/favicon.ico" sizes="16x16 32x32 48x48"> 46 <link rel="icon" type="image/svg+xml" href="/assets/images/logos/sharklogo.svg?v=1777139805"> 47 <link rel="icon" type="image/png" sizes="192x192" href="/favicon-192x192.png"> 48 <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> 49 <link rel="preload" href="/assets/images/logos/sharklogo.webp" as="image" type="image/webp" fetchpriority="high"> 50 <link rel="sitemap" type="application/xml" href="/sitemap.xml"> 51 52 <link rel="preload" href="/assets/images/callofdragons.webp" as="image" type="image/webp" fetchpriority="high"> 53 <link rel="preload" href="/assets/images/landbg.webp" as="image" type="image/webp" fetchpriority="high"> 54 55 56 57 <link rel="dns-prefetch" href="https://www.googletagmanager.com"> 58 <link rel="dns-prefetch" href="https://connect.facebook.net"> 59 60 <style> 61:root{--bg:#00070f;--accent:#00e5ff;--text:#e5e7eb;--sidebar-w:240px;--sidebar-w-collapsed:70px} 62*,::before,::after{box-sizing:border-box} 63html,body{margin:0;padding:0;background:#00070f;color:#e5e7eb;font-family:ui-sans-serif,system-ui,-apple-system,sans-serif;min-height:100vh}
64body{display:flex;flex-direction:column;min-height:100vh} 65body>.container{flex:0 0 auto} 66body>.gf-footer{margin-top:auto} 67body>aside,body>header,body>nav,body>.mobile-header-bar{flex:0 0 auto} 68#sidebar,#sidebar-nav{background:linear-gradient(180deg,#010918 0%,#00070f 100%);border-right:1px solid rgba(0,229,255,.08)} 69#sidebar{position:fixed;top:0;left:0;height:100vh;width:var(--sidebar-w);z-index:100;transition:width .25s} 70body.sidebar-collapsed #sidebar{width:var(--sidebar-w-collapsed)} 71/* A fenti #sidebar / #main-content szabalyok egy regi markup-strukturara keszultek 72 es egyetlen elemre sem illeszkednek. A valodi elemek: .sidebar-menu es .container. 73 Enelkul az elso festeskor az oldalsav normal blokkent folyik be, es az earn.css 74 betoltesekor az egesz elrendezes atugrik (merve: CLS 0.47-0.78 az account tabon). */ 75@media(min-width:769px){ 76 .sidebar-menu{position:fixed;top:0;left:0;height:100vh;width:var(--sidebar-w);z-index:1200} 77 body.sidebar-collapsed .sidebar-menu{width:var(--sidebar-w-collapsed)} 78 .container{margin-left:var(--sidebar-w)} 79 body.sidebar-collapsed .container{margin-left:var(--sidebar-w-collapsed)} 80 /* A fejlec es a ticker fixed poziciojuak, igy a magassaguk nem szamit a 81 folyamban - a tartalom helyet a body felso paddingja tartja fenn. 82 Merve minden desktop szelessegen: ticker top=80px, magassag=48px, body padding=128px. */ 83 .main-header{position:fixed;top:0;right:0;display:flex;align-items:center;justify-content:space-between} 84 #live-earnings-ticker{position:fixed;top:80px;height:48px;overflow:hidden;display:flex;align-items:center} 85} 86@media(min-width:769px){body.has-live-ticker{padding-top:128px}} 87@media(max-width:768px){body.has-live-ticker{padding-top:100px} 88 #live-earnings-ticker{position:fixed;top:60px;height:44px;overflow:hidden;display:flex;align-items:center}} 89/* A skip-link kepernyon kivul all; enelkul az elso festeskor a folyamban van 90 es lejjebb tolja a tartalmat, majd eltunik (merve: 1440x18px eltolas). */ 91.skip-link{position:absolute;left:-9999px;top:0} 92.header-content{display:flex;align-items:center;justify-content:space-between;width:100%} 93@media(max-width:768px){} 94@media(min-width:1200px){ 95 .container,#main-content,#page-content,.main-content-wrap,.shark-footer{padding-left:max(1.5rem,calc((100% - var(--sidebar-w) - 1600px)/2))!important;padding-right:max(1.5rem,calc((100% - var(--sidebar-w) - 1600px)/2))!important} 96 body.sidebar-collapsed .container,body.sidebar-collapsed #main-content,body.sidebar-collapsed #page-content,body.sidebar-collapsed .main-content-wrap,body.sidebar-collapsed .shark-footer{padding-left:max(1.5rem,calc((100% - var(--sidebar-w-collapsed) - 1600px)/2))!important;padding-right:max(1.5rem,calc((100% - var(--sidebar-w-collapsed) - 1600px)/2))!important} 97 .main-header,#live-earnings-ticker,.maintenance-banner{left:calc(var(--sidebar-w) + max(0px,(100% - var(--sidebar-w) - 1600px)/2));right:auto;width:min(1600px,calc(100% - var(--sidebar-w) - 3rem));max-width:none;margin:0} 98 body.sidebar-collapsed .main-header,body.sidebar-collapsed #live-earnings-ticker,body.sidebar-collapsed .maintenance-banner{left:calc(var(--sidebar-w-collapsed) + max(0px,(100% - var(--sidebar-w-collapsed) - 1600px)/2))!important;width:min(1600px,calc(100% - var(--sidebar-w-collapsed) - 3rem))!important} 99 .gf-footer{margin-left:calc(var(--sidebar-w) + max(0px,(100% - var(--sidebar-w) - 1600px)/2));margin-right:0;width:min(1600px,calc(100% - var(--sidebar-w) - 3rem));max-width:none} 100 body.sidebar-collapsed .gf-footer{margin-left:calc(var(--sidebar-w-collapsed) + max(0px,(100% - var(--sidebar-w-collapsed) - 1600px)/2))!important;width:min(1600px,calc(100% - var(--sidebar-w-collapsed) - 3rem))!important} 101 .gf-main,.gf-bottom,.shark-footer-main,.shark-footer-bottom{max-width:1600px;margin-left:auto;margin-right:auto;width:100%} 102 .gf-main,.gf-bottom{padding-left:1.5rem;padding-right:1.5rem} 103 .sidebar-close-btn{display:none!important} 104} 105.sidebar-logo img{height:36px;width:auto} 106body{visibility:visible} 107.hero-left-content h1{margin-bottom:0!important} 108@media(max-width:768px){.hero-left-content h1{font-size:clamp(1.6rem,7vw,2.8rem)!important}} 109</style> 110 111 <link rel="dns-prefetch" href="https://cdn.discordapp.com">
112 <link rel="preconnect" href="https://cdn.gtranslate.net"> 113 <link rel="dns-prefetch" href="https://flagcdn.com"> 114 115 <style>body,html{margin:0;padding:0;background:#00070f;color:#edfcff;font-family:'Poppins','Poppins Fallback',sans-serif}body{min-height:100vh}*{box-sizing:border-box}#pt{position:fixed;inset:0;background:#00070f;z-index:99999;display:flex;align-items:center;justify-content:center}#pt-c{display:flex;align-items:center;justify-content:center;position:relative}#pt-logo{width:68px;height:68px}</style> 116 <link rel="preload" href="/assets/earn.css?v=1790333025" as="style" onload="this.onload=null;this.rel='stylesheet'"> 117 <noscript><link rel="stylesheet" href="/assets/earn.css?v=1790333025"></noscript> 118 119
119<script src="/assets/js/tooltip.js?v=1789110447" defer nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"></script>
119 120 <style>@media (min-width:769px) and (max-width:1024px){.how-it-works-main{grid-template-columns:1fr;gap:1.5rem;text-align:center;padding:0 15px}.hero-auth-side{max-width:480px;margin:0 auto;width:100%}.testimonial-slider{overflow:hidden}}@media (min-width:769px) and (max-width:1024px) and (orientation:portrait){.hero-auth-side{width:100%;max-width:480px;margin:0 auto}.hero-cards-row{max-width:100%;grid-template-columns:repeat(3,1fr)}.how-it-works-main{grid-template-columns:1fr;padding:0 10px}}@media (min-width:769px) and (max-width:1024px) and (orientation:landscape){.hero-main-content{flex-direction:row;align-items:center;gap:2rem}}.hero-main-content{position:relative;z-index:1;flex-direction:column;align-items:center;justify-content:flex-start;gap:.5rem;padding-top:3rem;padding-bottom:1rem;width:100%;min-height:auto;max-width:100%;overflow-x:clip;margin:0 auto}.how-it-works-grid{display:grid;gap:25px;grid-template-columns:1fr}.hero-main-content::after,.hero-main-content::before{display:none;content:none}@media (min-width:1400px){.hero-main-content{gap:.4rem;padding-bottom:.3rem}.hero-trust-section{margin:.1rem auto .6rem}}@media (min-width:1025px){.hero-trust-section{margin:.3rem auto 1rem;padding:18px 25px}}@media (max-width:968px){.hero-main-content{max-width:100vw;overflow-x:clip;padding:0 10px}.hero-cta-group{flex-direction:column;gap:15px}}@media (max-height:700px){.hero-main-content{min-height:auto;padding-top:1rem;padding-bottom:2rem}}.how-it-works-main{display:grid;grid-template-columns:1fr 2fr;gap:3rem;align-items:center;margin-top:2rem}@media (max-width:968px){.how-it-works-main{grid-template-columns:1fr;gap:1.5rem;text-align:center;padding:0 15px}}@media (max-width:768px){.how-it-works-main{padding:0 10px;gap:1rem}.hero-main-content{padding:1rem 10px 3rem;overflow-x:clip;max-width:100%}}@media (max-width:480px){.hero-cta-group{flex-direction:column;width:100%;gap:12px}.hero-trust-section{margin:.1rem auto .8rem}.hero-main-content{padding:1rem 5px 2rem}}@media (max-width:768px){.hero-main-content,.hero-trust-section{width:100%;box-sizing:border-box}.hero-main-content{padding-left:10px;padding-right:10px}.hero-trust-section{padding:15px 10px;margin:0}.hero-cta-group{width:100%;padding:0 10px}.hero-main-content::after,.hero-main-content::before{display:none;content:none}}@media (max-width:480px){.hero-main-content{min-height:auto;padding:1rem 5px 2rem}}@media (min-width:1201px){.hero-main-content{gap:.3rem;padding-top:.5rem;padding-bottom:.5rem;min-height:calc(100vh - var(--desktop-top-nav-height) - 2rem);min-height:calc(100dvh - var(--desktop-top-nav-height) - 2rem)}.hero-trust-section{margin:.1rem auto .8rem;padding:20px 35px}.hero-cta-group{margin-bottom:.3rem}}@media (min-width:769px) and (max-width:1024px) and (orientation:landscape){.hero-main-content{flex-direction:row;align-items:center;gap:2rem}}.testimonials-section{position:relative;padding:8rem 0;background:0 0;width:100%;overflow:hidden;z-index:1}.testimonials-section::after,.testimonials-section::before{content:"";position:absolute;left:-25%;width:150%;height:150px;background:var(--deep-ocean-start);z-index:-1}.testimonials-section::before{top:-75px;border-radius:0 0 50% 50%}.testimonials-section::after{bottom:-75px;border-radius:50% 50% 0 0}.testimonials-slider-wrapper{position:relative;margin-top:3rem;padding:0 60px;width:100%;box-sizing:border-box}.testimonials-slider-container{overflow:hidden;border-radius:var(--radius-md);width:100%;padding-top:8px}.testimonials-slider{display:flex;transition:transform .6s cubic-bezier(.25, 1, .5, 1);gap:20px;align-items:stretch;cursor:grab;will-change:transform}.testimonials-slider:active{cursor:grabbing}.testimonials-slider.dragging{transition:none!important;cursor:grabbing}.testimonial-slide{min-width:260px;max-width:260px;flex-shrink:0;display:flex}.testimonial-card{background:linear-gradient(135deg,rgba(3,12,26,.95),rgba(0,20,40,.88));border:1px solid rgba(0,229,255,.15);border-radius:var(--radius-lg);padding:18px;width:100%;position:relative;overflow:hidden;transition:transform .3s,box-shadow .3s,border-color .3s;display:flex;flex-direction:column}.testimonial-header{display:flex;align-items:flex-start;gap:12px;margin-bottom:12px;padding-right:26px}.testimonial-content{font-style:italic;color:var(--text-secondary);line-height:1.4;margin:0 0 auto;padding:0;border:none;font-size:.85rem;position:relative;flex-grow:1}@media (min-width:1400px){.testimonial-slide{min-width:240px;max-width:240px}.testimonials-slider-wrapper{padding:0 80px}}@media (min-width:1201px) and (max-width:1399px){.testimonial-slide{min-width:220px;max-width:220px}.testimonial-card{padding:16px}.testimonials-slider-wrapper{padding:0 70px}}
120@media (max-width:900px) and (min-width:601px){.testimonial-slide{min-width:180px;max-width:180px}.testimonial-card{padding:12px}.testimonials-slider-wrapper{padding:0 50px}}@media (max-width:768px){.testimonials-section{padding:5rem 0}.testimonial-content{font-size:.8rem;line-height:1.3}.testimonials-slider-wrapper{padding:0 28px}.testimonial-slide{min-width:160px;max-width:160px}.testimonial-card{padding:10px}}@media (max-width:480px){.testimonials-slider-wrapper{padding:0 40px}.testimonial-slide{min-width:calc(100vw - 100px)}.testimonial-card{padding:14px}.testimonial-header{gap:10px;margin-bottom:10px}.testimonial-content{font-size:.8rem;line-height:1.3}}@media (max-width:380px){.testimonials-slider-wrapper{padding:0 30px}.testimonial-slide{min-width:calc(100vw - 80px)}}.hero-split-layout{display:grid;grid-template-columns:1.4fr 1fr;gap:3rem;align-items:start;padding:1rem 0 3rem;width:100%;max-width:1300px;margin:0 auto}.hero-cards-row{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:10px;align-items:end}@media (max-width:968px){.hero-split-layout{grid-template-columns:1fr;gap:1.5rem;padding:1rem 12px;overflow-x:clip}.hero-auth-side{width:100%;display:flex;justify-content:center;padding:0;box-sizing:border-box}.hero-cards-row{max-width:600px;margin:20px auto 0}}@media (max-width:768px){.hero-cards-row{grid-template-columns:repeat(3,1fr);gap:5px}.gtc-img{height:55px}}@media (max-width:600px){.hero-cards-row{grid-template-columns:repeat(3,1fr)}.gtc-img{height:55px}}@media (min-width:769px) and (max-width:1024px){.hero-cta-group{gap:18px}.hero-main-content{padding:2rem 20px}.hero-split-layout{grid-template-columns:1fr;gap:3rem;padding:2rem 20px;text-align:center}.hero-auth-side{margin:0 auto;width:100%;max-width:500px}.hero-cards-row{grid-template-columns:repeat(3,1fr);gap:15px;max-width:100%;margin-top:30px}.gtc-img{height:105px;overflow:hidden;flex-shrink:0}.testimonials-slider-wrapper{padding:0 40px}.testimonial-slide{min-width:calc(50% - 15px)}}@media (min-width:901px) and (max-width:1200px){.testimonial-slide{min-width:200
120px;max-width:200px}.testimonial-card{padding:14px}.testimonials-slider-wrapper{padding:0 60px}}@media (min-width:1920px){.testimonial-slide{min-width:280px;max-width:280px}.testimonial-card{padding:20px}.testimonials-slider-wrapper{padding:0 100px}}.hero-cards-row .glass-task-card:first-child{animation:1.1s cubic-bezier(.22,1,.36,1) .1s both cardDeal}.hero-cards-row .glass-task-card:nth-child(2){animation:1.1s cubic-bezier(.22,1,.36,1) .45s both cardDeal,3.2s ease-in-out 1.7s infinite cardFloat}.hero-cards-row .glass-task-card:nth-child(3){animation:1.1s cubic-bezier(.22,1,.36,1) .8s both cardDeal}@media(max-width:768px){.how-it-works-grid .step-card.animate-on-scroll{opacity:0;transform:translateY(48px) scale(.94);transition:opacity .55s cubic-bezier(.25, 1, .5, 1),transform .55s cubic-bezier(.25, 1, .5, 1)}.how-it-works-grid .step-card.animate-on-scroll.visible{opacity:1;transform:translateY(0) scale(1)}.hero-cards-row .glass-task-card: first-child,.hero-cards-row .glass-task-card:nth-child(2),.hero-cards-row .glass-task-card:nth-child(3){animation:none}}@media(prefers-reduced-motion:reduce){.how-it-works-grid .step-card{transform:none;transition:opacity .3s}.hero-cards-row .glass-task-card:first-child,.hero-cards-row .glass-task-card:nth-child(2),.hero-cards-row .glass-task-card:nth-child(3){animation:none;opacity:1;transform:none}.glass-task-card .gtc-img::before{animation:none}}.testimonial-dots{display:flex;justify-content:center;align-items:center;gap:8px;margin-top:8px;flex-wrap:wrap}.testimonial-card .user-avatar{background:linear-gradient(135deg,#005f8a,var(--accent-secondary))}.testimonial-card blockquote.testimonial-content{quotes:none;font-size:.9rem;line-height:1.55;color:var(--text-primary);opacity:.9}.testimonial-trust-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:10px;margin:0 auto 1.5rem;color:var(--text-secondary);font-size:.95rem}@media(min-width:769px){.testimonial-dots{display:none!important}}.glass-task-card .gtc-img img{width:100%;height:100%;object-fit:cover;display:block;border-radius:0}.glass-task-card .gtc-img{background:rgba(0,229,255,.05);position:relative}.glass-task-card .gtc-img::before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(0,229,255,.1),transparent);pointer-events:none;animation:1.8s ease-in-out infinite shimmer-gtc}.glass-task-card .gtc-img img[src]{animation:none;background:0 0}@media (hover:hover){.testimonial-card:hover .user-avatar{box-shadow:0 6px 16px rgba(0,229,255,.28),inset 0 1px 2px rgba(255,255,255,.1);border-color:rgba(0,229,255,.45)}}@media(max-width:480px){.testimonial-card{padding:16px}.testimonial-trust-bar{font-size:.72rem;flex-direction:column;align-items:center;gap:3px;margin:0 0 .8rem;line-height:1.5}.testimonials-slider-wrapper{padding:0 8px}}.faq-q-heading{margin:0;padding:0;font:inherit;color:inherit}@media (max-width:420px){.hero-cards-row{display:flex;gap:10px;overflow-x:auto;overscroll-behavior-x:contain;scroll-snap-type:x proximity;scrollbar-width:none;-ms-overflow-style:none;padding:0 5px 4px;margin:10px -5px 0}.hero-cards-row::-webkit-scrollbar{display:none}.hero-cards-row .glass-task-card{flex:0 0 44%;scroll-snap-align:start}.hero-cards-row .gtc-img{height:72px}}</style> 121 122 <link rel="preload" href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'"> 123 <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800&display=swap"></noscript> 124 125 <style> 126@font-face{font-family:"Poppins Fallback";font-style:normal;font-weight:400;size-adjust:100%;ascent-override:105%;descent-override:normal;line-gap-override:normal;src:local("Arial")} 127@font-face{font-family:"Poppins Fallback";font-style:normal;font-weight:600;size-adjust:100%;ascent-override:105%;descent-override:normal;line-gap-override:normal;src:local("Arial Bold")} 128@font-face{font-family:"Poppins Fallback";font-style:normal;font-weight:700;size-adjust:100%;ascent-override:105%;descent-override:normal;line-gap-override:normal;src:local("Arial Bold")} 129@font-face{font-family:"Poppins Fallback";font-style:normal;font-weight:800;size-adjust:100%;ascent-override:105%;descent-override:normal;line-gap-override:normal;src:local("Arial Bold")} 130.partner-card{position:relative;} 131.partner-bonus-badge{position:absolute;top:8px;right:8px;background:linear-gradient(135deg,#ffe44d,#ffc107);
131color:#1a0a00;font-size:.78rem;font-weight:800;padding:4px 9px;border-radius:20px;z-index:10;letter-spacing:.5px;box-shadow:0 2px 10px rgba(255,193,7,.6);animation:bonusPulse 2s ease-in-out infinite;} 132@keyframes bonusPulse{0%,100%{box-shadow:0 2px 10px rgba(255,193,7,.6)}50%{box-shadow:0 2px 18px rgba(255,193,7,.9)}} 133.partner-trending-badge{position:absolute;top:8px;left:8px;z-index:12;width:30px;height:30px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:radial-gradient(circle,rgba(0,60,80,.75) 0%,rgba(0,40,60,.4) 70%,transparent 100%);pointer-events:none} 134.partner-trending-badge .ptb-flame{position:relative;width:22px;height:22px;flex:none;display:flex;align-items:center;justify-content:center;filter:drop-shadow(0 0 4px rgba(0,200,255,.85));animation:trendingGlow 2.2s ease-in-out infinite} 135.partner-trending-badge .ptb-flame i{font-size:1.2rem;background:linear-gradient(180deg,#a5f3ff 0%,#22d3ee 45%,#0099cc 100%);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent} 136@keyframes trendingGlow{0%,100%{filter:drop-shadow(0 0 3px rgba(0,190,255,.6))}50%{filter:drop-shadow(0 0 9px rgba(0,210,255,1))}} 137@media(max-width:600px){.partner-trending-badge{width:24px;height:24px;top:6px;left:6px}.partner-trending-badge .ptb-flame{width:17px;height:17px}.partner-trending-badge .ptb-flame i{font-size:.95rem}} 138.popular-offer-card .bonus-pct-badge{position:absolute;top:6px;left:6px;background:linear-gradient(135deg,#ffe44d,#ffc107);color:#1a0a00;font-size:.7rem;font-weight:800;padding:3px 7px;border-radius:10px;z-index:10;letter-spacing:.3px;pointer-events:none;} 139.popular-offer-card .payout-original{text-decoration:line-through;opacity:.5;font-size:.82em;margin-right:4px;color:#aaa;} 140.popular-offer-card .popular-offer-reward{display:flex!important;align-items:center;flex-wrap:nowrap;gap:3px;overflow:hidden;max-width:100%} 141.popular-offer-card .popular-offer-reward .payout-original{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0} 142.step-payout-bonus{display:flex;align-items:center;gap:4px;}.step-payout-orig{text-decoration:line-through;opacity:.5;font-size:.85em;} 143.step-right{display:flex;align-items:center;gap:5px;flex-shrink:0}.req-hold-badge{position:relative;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:6px;cursor:pointer;flex-shrink:0}.req-hold-instant{background:rgba(76,175,80,.12);color:#4caf50;border:1px solid rgba(76,175,80,.25)}.req-hold-lock{background:rgba(255,152,0,.1);color:#ff9800;border:1px solid rgba(255,152,0,.25)}.req-hold-badge .rhb-tip{position:absolute;bottom:calc(100% + 7px);right:0;background:rgba(15,30,55,.97);border:1px solid rgba(255,152,0,.35);border-radius:10px;padding:.55rem .75rem;white-space:normal;width:190px;max-width:min(190px,calc(100vw - 20px));font-size:.76rem;font-weight:600;color:#fff;pointer-events:none;opacity:0;transform:translateY(4px);transition:opacity .18s,transform .18s;z-index:9999;box-shadow:0 8px 24px rgba(0,0,0,.45);text-align:left;line-height:1.4}.req-hold-badge .rhb-tip strong{display:block;color:#ff9800;font-size:.79rem;margin-bottom:.18rem}.req-hold-badge .rhb-tip span{color:rgba(255,255,255,.62);font-size:.71rem;font-weight:400}.req-hold-badge:focus .rhb-tip{opacity:1;transform:translateY(0)}@media (hover:hover){.req-hold-badge:hover .rhb-tip{opacity:1;transform:translateY(0)}}.req-hold-instant .rhb-tip{border-color:rgba(76,175,80,.35)}.req-hold-instant .rhb-tip strong{color:#4caf50}.hold-info-why{background:linear-gradient(135deg,rgba(76,175,147,.07),rgba(76,175,147,.02));border:1px solid rgba(76,175,147,.2)}.hold-info-why>i{color:#4caf93}.hold-ranks-link{color:#29b6f6;text-decoration:none;font-weight:600}@media (hover:hover){.hold-ranks-link:hover{text-decoration:underline}} 144.streak-flame-badge{display:flex;align-items:center;min-height:24px;gap:5px;padding:.5rem .4rem;color:#ffb84d;text-decoration:none;font-weight:800;font-size:.95rem;line-height:1;transition:.2s} 145@media (hover:hover){.streak-flame-badge:hover{opacity:.8}} 146.streak-flame-badge i{font-size:1.1rem;background:linear-gradient(180deg,#ffe082 0%,#ff9800 45%,#ff3d00 100%);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;filter:drop-shadow(0 0 3px rgba(255,120,0,.7));animation:trendingGlow 2.2s ease-in-out infinite}.ticket-badge{color:#f59e0b}.tick-ico-badge{height:1.5rem;width:auto;display:block;object-fit:contain;flex-shrink:0;filter:drop-shadow(0 0 4px rgba(245,158,11,.4))} 147@media(max-width:600px){.tick-ico-badge{height:.95rem}.streak-flame-badge--mobile{padding:.3rem .45rem;gap:3px}} 148@media(max-width:400px){.tick-ico-badge{height:.85rem}.streak-flame-badge--mobile{padding:.28rem .4rem;font-size:.74rem}} 149.streak-flame-badge--mobile{padding:.4rem .6rem;font-size:.85rem;gap:4px} 150.streak-flame-badge--mobile i{font-size:1rem} 151@media(max-width:480px){.streak-flame-badge--mobile{padding:.35rem .5rem;font-size:.8rem}} 152#headerTicketCountMobile.tick-count-lg{font-size:.82em} 153.header-user-avatar-link{display:inline-flex;align-items:center;gap:8px;text-decoration:none;border-radius:20px;color:var(--text-primary);transition:.2s} 154.header-user-avatar-link--mobile{border-radius:50%} 155@media (hover:hover){.header-user-avatar-link:hover{opacity:.85}} 156.sidebar-new-badge{display:inline-flex;align-items:center;justify-content:center;margin-left:6px;padding:2px 7px;border-radius:10px;background:linear-gradient(135deg,#00e5ff,#00b8d4);color:#00171f;font-size:.62rem;font-weight:800;letter-spacing:.4px;line-height:1.4;position:relative}.sidebar-new-badge::after{content:"";position:absolute;inset:0;border-radius:inherit;box-shadow:0 0 6px 2px rgba(0,229,255,.5);opacity:0;pointer-events:none;animation:sidebarNewPulse 2s ease-in-out infinite} 157@keyframes sidebarNewPulse{0%,100%{opacity:0}
15750%{opacity:1}} 158body.sidebar-collapsed .sidebar-new-badge{display:none} 159@media(prefers-reduced-motion:reduce){.sidebar-new-badge{animation:none}} 160 161</style> 162 <link rel="preload" href="/assets/fontawesome/css/all.subset.css?v=4" as="style" onload="this.onload=null;this.rel='stylesheet'"> 163 <noscript><link rel="stylesheet" href="/assets/fontawesome/css/all.subset.css?v=4"></noscript> 164 165 166 167
167<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 168 (function () { 169 var loaded = false; 170 function hasAnalyticsConsent() { 171 try { 172 var p = JSON.parse(localStorage.getItem('shark_cookie_prefs') || 'null'); 173 return !!(p && p.analytics); 174 } catch (e) { 175 return false; 176 } 177 } 178 function loadMetaPixel() { 179 if (loaded || !hasAnalyticsConsent()) return; 180 loaded = true;
vendor: 508 bytes, lines 180-190
180 181 !function(f,b,e,v,n,t,s) 182 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 183 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 184 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 185 n.queue=[];t=b.createElement(e);t.async=!0; 186 t.src=v;s=b.getElementsByTagName(e)[0]; 187 s.parentNode.insertBefore(t,s)}(window, document,'script', 188 'https://connect.facebook.net/en_US/fbevents.js'); 189 190 fbq('init', '
1901515592016142292
vendor: 62 bytes, lines 190-192
190'); 191 fbq('track', 'PageView'); 192
192} 193 window.sharkOnAnalyticsConsent = loadMetaPixel; 194 setTimeout(loadMetaPixel, 5000); 195 })(); 196 </script>
196 197 198
198<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 199 window.formatAmountExact = function (amount) { 200 var n = parseFloat(amount); 201 if (!isFinite(n)) n = 0; 202 var s = n.toFixed(3); 203 var neg = s.charAt(0) === '-'; 204 if (neg) s = s.slice(1); 205 var parts = s.split('.'); 206 var dec = (parts[1] || '').replace(/0+$/, ''); 207 while (dec.length < 2) dec += '0'; 208 var int = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ','); 209 return (neg ? '-' : '') + int + '.' + dec; 210 }; 211 212 window.csrfToken = "998e8f34e9355502848cd48edfcac4aca9c6e20a319f93593cdd2f8f0ad64f93"; 213 window.loginErrorMessage = ""; 214 if (window.loginErrorMessage && window.loginErrorMessage.length > 0) { 215 document.addEventListener('DOMContentLoaded', function() { 216 if (typeof window.openAuthModal === 'function') window.openAuthModal('login'); 217 }); 218 } 219 (function(){if(localStorage.getItem('vote_banner_dismissed')==='1'){var b=document.getElementById('voteBanner');if(b)b.style.display='none';}})(); 220 window.HOLD_INFO = { 221 tier: null, 222 tierName: "No Tier", 223 hasChargeback: false, 224 nextTier: "bronze", 225 nextTierName: "Bronze" }; 226 window.SHARK_HOLD_MATRIX = {"none":[[5,"Instant","Instant"],[10,"1 day","3 days"],[15,"7 days","14 days"],[20,"12 days","20 days"],[30,"20 days","30 days"],[null,"30 days","45 days"]],"bronze":[[5,"Instant","Instant"],[10,"12 hours","2 days"],[15,"5 days","12 days"],[20,"10 days","14 days"],[30,"14 days","20 days"],[null,"20 days","30 days"]],"silver":[[5,"Instant","Instant"],[10,"3 hours","12 hours"],[15,"5 days","10 days"],[20,"10 days","12 days"],[30,"12 days","20 days"],[null,"20 days","30 days"]],"gold":[[5,"Instant","Instant"],[10,"3 hours","12 hours"],[15,"3 days","10 days"],[20,"7 days","12 days"],[30,"10 days","20 days"],[null,"14 days","30 days"]],"diamond":[[5,"Instant","Instant"],[10,"Instant","6 hours"],[15,"2 days","7 days"],[20,"5 days","10 days"],[30,"7 days","14 days"],[null,"12 days","20 days"]],"obsidian":[[10,"Instant","Instant"],[15,"Instant","6 hours"],[20,"1 day","5 days"],[30,"3 days","7 days"],[null,"7 days","12 days"]]}; 227 </script>
227 228
228<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 229 console.log(`%c 230 âââââââââââââââââ âââââââ âââââââ 231 ââââââââââââââââââââââââââââââââââ 232 ââââââââ âââ âââ âââââââââââ 233 ââââââââ âââ âââ ââââââââââ 234 ââââââââ âââ ââââââââââââ 235 ââââââââ âââ âââââââ âââ 236 `, "color: red; font-weight: bold; font-size: 14px;"); 237 238 console.log( 239 "%cHold Up!", 240 "color: #ffcc00; font-size: 48px; font-weight: bold; text-shadow: 2px 2px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000;" 241 ); 242 243 console.log( 244 "%cThis is a browser feature for developers. If someone told you to copy-paste something here, they are trying to scam you and steal your account.", 245 "color: white; font-size: 16px; background-color: #c0392b; padding: 10px; border-radius: 5px; margin-top: 10px;" 246 ); 247 </script>
247 248
248<script type="application/ld+json" nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 249 {"@context":"https://schema.org","@type":"WebSite","name":"Shark Earnings","url":"https://sharkearnings.com","description":"Earn real cash by completing surveys, playing games, and completing offers. Withdraw via PayPal, crypto, or gift cards from $1.","publisher":{"@id":"https://sharkearnings.com/#organization"},"potentialAction":{"@type":"SearchAction","target":"https://sharkearnings.com/offers?q={search_term_string}","query-input":"required name=search_term_string"}} </script>
249 250
250<script type="application/ld+json" nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 251 { 252 "@context": "https://schema.org", 253 "@type": "Organization", 254 "@id": "https://sharkearnings.com/#organization", 255 "name": "Shark Earnings", 256 "url": "https://sharkearnings.com", 257 "description": "Earn real cash by completing surveys, playing games, and completing offers. Withdraw via PayPal, crypto, or gift cards from $1.", 258 "logo": { 259 "@type": "ImageObject", 260 "url": "https://sharkearnings.com/assets/images/logos/sharklogofull.webp", 261 "width": 920, 262 "height": 882 263 }, 264 "sameAs": [ 265 "https://www.facebook.com/officialsharknetwork", 266 "https://x.com/ofcsharknetwork", 267 "https://www.instagram.com/officialsharknetwork/", 268 "https://www.linkedin.com/company/sharknetwork", 269 "https://discord.gg/shark-earnings-earn-cash-rewards-897403167820636190" 270 ], 271 "contactPoint": { 272 "@type": "ContactPoint", 273 "contactType": "customer service", 274 "email": "[email protected]" 275 } 276 } 277 </script>
277 278 279 280
280<script type="application/ld+json" nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 281 { 282 "@context": "https://schema.org", 283 "@type": "FAQPage", 284 "mainEntity": [ 285 { 286 "@type": "Question", 287 "name": "How much can I earn?", 288 "acceptedAnswer": {"@type": "Answer", "text": "There is no fixed or guaranteed amount - it depends on how many offers you complete, which ones are available in your country, and how active your referrals are. Every offer shows its exact reward before you start, and you can cash out from $1.00."} 289 }, 290 { 291 "@type": "Question", 292 "name": "How fast do I get paid?", 293 "acceptedAnswer": {"@type": "Answer", "text": "We process payments daily. Cash out via PayPal (min $1.00), Crypto (min $2.50), or Gift Cards (min $1.00). Most users receive their money within a few hours."} 294 }, 295 { 296 "@type": "Question", 297 "name": "How does the referral program work?", 298 "acceptedAnswer": {"@type": "Answer", "text": "Invite friends and earn up to 30% commission on their earnings for life. It's a great way to build passive income."} 299 }, 300 { 301 "@type": "Question", 302 "name": "Is Shark Earnings free and safe?", 303 "acceptedAnswer": {"@type": "Answer", "text": "Yes! Registration is 100% free. Your data is protected by SSL encryption and we are fully GDPR compliant."} 304 }, 305 { 306 "@type": "Question", 307 "name": "Do I need to invest money to start earning?", 308 "acceptedAnswer": {"@type": "Answer", "text": "No! Shark Earnings is 100% free to join and use. You can start earning immediately after registration without any upfront costs or hidden fees."} 309 }, 310 { 311 "@type": "Question", 312 "name": "What payment methods do you support?", 313 "acceptedAnswer": {"@type": "Answer", "text": "We offer PayPal, Cryptocurrency (Litecoin), and popular Gift Cards (Amazon, Google Play, Steam, etc.). Minimum cashout starts at $1.00."} 314 }, 315 { 316 "@type": "Question", 317 "name": "Can I use Shark Earnings on mobile?", 318 "acceptedAnswer": {"@type": "Answer", "text": "Absolutely! Our platform is fully responsive and works on all devices. Many game offers are specifically designed for mobile devices (Android/iOS)."} 319 }, 320 { 321 "@type": "Question", 322 "name": "Does Shark Earnings work in my country?", 323 "acceptedAnswer": {"@type": "Answer", "text": "Yes! Shark Earnings is available in 160+ countries. Offer availability depends on your region, but every country has access to at least some earning methods."} 324 } 325 ] 326 } 327 </script>
327 328 329
329<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz" src="/assets/js/ayet_surveys.js?v=1787901965" defer></script>
329 330 331
331<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 332 window.currentUser = { 333 id: 0, 334 name: "Guest", 335 isAdmin: false, 336 verificationStatus: "unverified" }; 337 window.isMaintenanceEnabled = false; 338 window.maintenanceStartTime = null; 339 window.isAdmin = false; 340 window.showSidebar = false; 341 342 document.addEventListener('DOMContentLoaded', () => { 343 344 345 if (window.currentUser.verificationStatus === 'verify') { 346 setTimeout(() => { 347 openVerificationModal(); 348 }, 1000); 349 } 350 351 const htmlspecialchars = (str) => { 352 if (typeof str !== 'string') return ''; 353 const map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; 354 return str.replace(/[&<>"']/g, m => map[m]); 355 }; 356 357 const notificationBellDesktop = document.querySelector('.notification-bell-desktop'); 358 const notificationBellMobile = document.querySelector('.notification-bell-mobile'); 359 360 const notificationDropdown = document.getElementById('notificationDropdown'); 361 const notificationList = document.getElementById('notificationList'); 362 const notificationBadgeDesktop = document.getElementById('notificationBadge'); 363 const notificationBadgeMobile = document.getElementById('notificationBadgeMobile'); 364 const tabBadgeGeneral = document.getElementById('tabBadgeGeneral'); 365 const tabBadgeTasks = document.getElementById('tabBadgeTasks'); 366 let activeNotifTab = 'general'; 367 let allNotifications = []; 368 369 document.querySelectorAll('.notif-tab').forEach(btn => { 370 btn.addEventListener('click', (e) => { 371 e.stopPropagation(); 372 activeNotifTab = btn.dataset.tab; 373 document.querySelectorAll('.notif-tab').forEach(b => b.classList.remove('active')); 374 btn.classList.add('active'); 375 renderNotificationList(); 376 }); 377 }); 378 379 const markAllReadBtn = document.getElementById('markAllRead'); 380 if (markAllReadBtn) { 381 markAllReadBtn.addEventListener('click', (e) => { 382 e.stopPropagation(); 383 markAllAsRead(); 384 }); 385 } 386 387 const toggleNotificationDropdown = (e) => { 388 e.stopPropagation(); 389 const isVisible = notificationDropdown.classList.contains('active'); 390 391 if (isVisible) { 392 } else { 393 394 const clickedBell = e.currentTarget; 395 const rect = clickedBell.getBoundingClientRect(); 396 397 const isMobile = window.innerWidth <= 768; 398 399 if (isMobile) { 400 notificationDropdown.style.position = 'fixed'; 401 notificationDropdown.style.top = '65px'; 402 notificationDropdown.style.left = '15px'; 403 notificationDropdown.style.right = '15px'; 404 notificationDropdown.style.width = 'auto'; 405 } else { 406 notificationDropdown.style.position = 'fixed'; 407 notificationDropdown.style.top = (rect.bottom + 10) + 'px'; 408 notificationDropdown.style.left = 'auto'; 409 notificationDropdown.style.right = (window.innerWidth - rect.right) + 'px'; 410 notificationDropdown.style.width = '380px'; 411 } 412 413 loadNotifications(); 414 415 if (notificationBadgeDesktop) { 416 notificationBadgeDesktop.style.opacity = '0'; 417 } 418 if (notificationBadgeMobile) { 419 notificationBadgeMobile.style.opacity = '0'; 420 } 421 } 422 423 notificationDropdown.classList.toggle('active', !isVisible); 424 }; 425 426 if (notificationBellDesktop) { 427 notificationBellDesktop.addEventListener('click', toggleNotificationDropdown); 428 } 429 if (notificationBellMobile) { 430 notificationBellMobile.addEventListener('click', toggleNotificationDropdown); 431 } 432 433 document.addEventListener('click', (e) => { 434 if (notificationDropdown && !notificationDropdown.contains(e.target) && 435 !e.target.closest('.notification-bell')) { 436 437 if (!notificationDropdown.classList.contains('active')) { 438 if (notificationBadgeDesktop) { 439 notificationBadgeDesktop.style.opacity = '1'; 440 } 441 if (notificationBadgeMobile) { 442 notificationBadgeMobile.style.opacity = '1'; 443 } 444 } 445 446 notificationDropdown.classList.remove('active'); 447 } 448 }); 449 450 const throttledNotificationResize = throttle(function() { 451 if (notificationDropdown && notificationDropdown.classList.contains('active')) { 452 notificationDropdown.classList.remove('active'); 453 } 454 }, 150); 455 456 window.addEventListener('resize', throttledNotificationResize); 457 458 function getNotifTypeAndIcon(notif) { 459 const type = (notif.type || '').toLowerCase(); 460 if (/Weekly Lottery #\d+/i.test(notif.message || '')) { 461 const won = /you won/i.test(notif.message); 462 return won 463 ? { notifType: 'giveaway', iconClass: 'fas fa-trophy' } 464 : { notifType: 'system', iconHtml: '<img width="200" height="78" src="/assets/images/rewards/lottery_ticket.svg" alt="" style="width:20px;height:20px;object-fit:contain">' }; 465 } 466 if (type === 'credit') return { notifType: 'credit', iconClass: 'fas fa-coins' }; 467 if (type === 'processing') return { notifType: 'cashout', iconClass: 'fas fa-money-bill-wave' }; 468 if (type === 'chargeback' || 469 type === 'chargeback_pending') return { notifType: 'chargeback', iconClass: 'fas fa-triangle-exclamation' }; 470 if (type === 'warning') return { notifType: 'warning', iconClass: 'fas fa-shield-halved' }; 471 if (type === 'error') return { notifType: 'rejection', iconClass: 'fas fa-ban' }; 472 if (type === 'alert') return { notifType: 'warning', iconClass: 'fas fa-circle-exclamation' }; 473 if (type === 'dispute_staff_approved') return { notifType: 'credit', iconClass: 'fas fa-circle-check' }; 474 if (type === 'dispute_staff_rejected') return { notifType: 'rejection', iconClass: 'fas fa-ban' }; 475 if (type === 'dispute_staff_decision') return { notifType: 'warning', iconClass: 'fas fa-gavel' }; 476 if (type === 'announcement') return { notifType: 'announcement',iconClass: 'fas fa-bullhorn' }; 477 if (type === 'giveaway') return { notifType: 'giveaway', iconClass: 'fas fa-trophy' }; 478 if (type === 'info') return { notifType: 'cashout', iconClass: 'fas fa-money-bill-wave' }; 479 if (type === 'ticket_reply') return { notifType: 'system', iconClass: 'fas fa-headset' };
480 if (type === 'task_approved' || 481 type === 'task_auto_approved') return { notifType: 'credit', iconClass: 'fas fa-circle-check' }; 482 if (type === 'task_rejected') return { notifType: 'rejection', iconClass: 'fas fa-ban' }; 483 if (type === 'task_campaign_review' || 484 type === 'task_dispute') return { notifType: 'warning', iconClass: 'fas fa-flag' }; 485 if (type === 'task_submission') return { notifType: 'system', iconClass: 'fas fa-paper-plane' }; 486 if (type === 'reward') return { notifType: 'giveaway', iconClass: 'fas fa-gift' }; 487 return { notifType: 'system', iconClass: 'fas fa-bell' }; 488 } 489 490 const NOTIF_PAYOUT_RE = /\b(withdrawal|withdraw|payout|cash(?:ed)?[ -]?out)\b/i; 491 const NOTIF_NEGATIVE_RE = /\b(chargeback|charge-back|deduct|deducted|deduction|reversed|reversal|removed|penalt)\b/i; 492 const NOTIF_POSITIVE_RE = /\b(credited|earned|you won|approved|added|bonus|received|reward is being processed|refunded to your balance)\b/i; 493 494 function highlightAmounts(escapedMsg, rawMsg) { 495 let cls, sign; 496 if (NOTIF_NEGATIVE_RE.test(rawMsg)) { cls = 'notif-amt-neg'; sign = '-'; } 497 else if (NOTIF_PAYOUT_RE.test(rawMsg)) { cls = 'notif-amt-out'; sign = ''; } 498 else if (NOTIF_POSITIVE_RE.test(rawMsg)) { cls = 'notif-amt-pos'; sign = '+'; } 499 else return escapedMsg; 500 501 return escapedMsg.replace(/([+-]?)\$(\d[\d,]*(?:\.\d+)?)/g, function (m, pre, num) { 502 const shown = pre ? pre : sign; 503 return '<span class="notif-amt ' + cls + '">' + shown + '$' + num + '</span>'; 504 }); 505 } 506 507 function renderNotificationList() { 508 const filtered = allNotifications.filter(n => n.tab === activeNotifTab); 509 if (filtered.length === 0) { 510 notificationList.innerHTML = '<div class="notification-empty">No notifications</div>'; 511 return; 512 } 513 notificationList.innerHTML = filtered.map(notif => { 514 const { notifType, iconClass, iconHtml } = getNotifTypeAndIcon(notif); 515 const rawMsg = notif.message || notif.title || ''; 516 const msg = highlightAmounts(htmlspecialchars(rawMsg), rawMsg); 517 const rawType = (notif.type || '').toLowerCase(); 518 let ticketLinkHtml = ''; 519 if (rawType === 'ticket_reply' && (notif.ticket_status === 'open' || notif.ticket_status === 'pending')) { 520 const ticketMatch = (notif.message || '').match(/#([A-F0-9]{8})/); 521 if (ticketMatch) { 522 ticketLinkHtml = `<a href="/support/${ticketMatch[1]}" class="notification-action-btn"><i class="fas fa-headset"></i> View Ticket</a>`; 523 } 524 } 525 if (!ticketLinkHtml && notif.action_label && notif.action_url 526 && /^\/(?!\/)/.test(notif.action_url)) { 527 ticketLinkHtml = `<a href="${htmlspecialchars(notif.action_url)}" class="notification-action-btn">` 528 + `<i class="fas fa-arrow-right"></i> ${htmlspecialchars(notif.action_label)}</a>`; 529 } 530 if (!ticketLinkHtml && /Weekly Lottery #\d+/i.test(notif.message || '')) { 531 const won = /you won/i.test(notif.message); 532 ticketLinkHtml = won 533 ? `<a href="/rewards/lottery" class="notification-action-btn"><i class="fas fa-trophy"></i> View your win</a>` 534 : `<a href="/rewards/challenges" class="notification-action-btn"><i class="fas fa-bolt"></i> Collect more tickets</a>`; 535 } 536 return ` 537 <div class="notification-item ${notif.is_read == 0 ? 'unread' : ''}" data-id="${notif.id}" data-type="${notifType}"> 538 <div class="notification-icon-area"> 539 ${iconHtml || `<i class="${iconClass}"></i>`} 540 </div> 541 <div class="notification-content-area"> 542 ${msg ? `<div class="notification-content">${msg}</div>` : ''} 543 <div class="notification-time">${notif.time_ago}</div> 544 ${ticketLinkHtml} 545 </div> 546 </div>`; 547 }).join(''); 548 } 549 550 function loadNotifications() { 551 if (!notificationList || !notificationBadgeDesktop || !notificationBadgeMobile) { return; } 552 if (document.hidden) return; 553 554 const formData = new FormData(); 555 formData.append('action', 'get_notifications'); 556 formData.append('csrf_token', window.csrfToken); 557 558 fetch('/api/secure_handler.php', { 559 method: 'POST', 560 body: formData 561 }) 562 .then(response => { 563 if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); 564 return response.json(); 565 }) 566 .then(data => { 567 if (data.error) { 568 notificationList.innerHTML = '<div class="notification-empty">Could not load notifications.</div>'; 569 return; 570 } 571 const hasUnread = data.unread_count > 0; 572 573 notificationBadgeDesktop.textContent = data.unread_count > 0 ? data.unread_count : ''; 574 notificationBadgeDesktop.classList.toggle('active', hasUnread); 575 notificationBadgeMobile.textContent = data.unread_count > 0 ? data.unread_count : ''; 576 notificationBadgeMobile.classList.toggle('active', hasUnread); 577 578 if (tabBadgeGeneral) { 579 tabBadgeGeneral.textContent = data.unread_general > 0 ? data.unread_general : ''; 580 tabBadgeGeneral.classList.toggle('active', data.unread_general > 0); 581 } 582 if (tabBadgeTasks) { 583 tabBadgeTasks.textContent = data.unread_tasks > 0 ? data.unread_tasks : ''; 584 tabBadgeTasks.classList.toggle('active', data.unread_tasks > 0); 585 } 586 587 allNotifications = data.notifications; 588 updateTabBadgesFromLocal(); 589 renderNotificationList(); 590 }) 591 .catch(error => { 592 notificationList.innerHTML = '<div class="notification-empty">Failed to load. Check connection.</div>'; 593 }); 594 } 595 596 function updateTabBadgesFromLocal() { 597 const unreadGeneral = allNotifications.filter(n => n.tab === 'general' && n.is_read == 0).length; 598 const unreadTasks = allNotifications.filter(n => n.tab === 'tasks' && n.is_read == 0).length; 599 const totalUnread = unreadGeneral + unreadTasks; 600 if (tabBadgeGeneral) { tabBadgeGeneral.textContent = unreadGeneral > 0 ? unreadGeneral : ''; tabBadgeGeneral.classList.toggle('active', unreadGeneral > 0); } 601 if (tabBadgeTasks) { tabBadgeTasks.textContent = unreadTasks > 0 ? unreadTasks : ''; tabBadgeTasks.classList.toggle('active', unreadTasks > 0); } 602 if (notificationBadgeDesktop) { notificationBadgeDesktop.textContent = totalUnread > 0 ? totalUnread : ''; notificationBadgeDesktop.classList.toggle('active', totalUnread > 0); } 603 if (notificationBadgeMobile) { notificationBadgeMobile.textContent = totalUnread > 0 ? totalUnread : ''; notificationBadgeMobile.classList.toggle('active', totalUnread > 0); } 604 const mb = document.getElementById('markAllRead'); 605 if (mb) { mb.disabled = totalUnread === 0; mb.classList.toggle('is-disabled', totalUnread === 0); } 606 } 607 608 function markSingleNotificationAsRead(notificationId) { 609 if (!notificationId) return; 610 611 const formData = new FormData(); 612 formData.append('action', 'mark_notifications_read'); 613 formData.append('notification_id', notificationId); 614 formData.append('csrf_token', window.csrfToken); 615 616 fetch('/api/secure_handler.php', { 617 method: 'POST', 618 body: formData 619 }) 620 .then(response => { 621 if (!response.ok) throw new Error('Network response was not ok'); 622 return response.json(); 623 }) 624 .then(data => { 625 if (data.success) { 626 const notif = allNotifications.find(n => n.id == notificationId); 627 if (notif) notif.is_read = 1; 628 updateTabBadgesFromLocal(); 629 } 630 }) 631 .catch(error => { 632 console.error('Error marking notification as read:', error); 633 }); 634 } 635 if (notificationList) { 636 notificationList.addEventListener('click', (event) => { 637 const notificationItem = event.target.closest('.notification-item.unread'); 638 if (!notificationItem) return; 639 const notificationId = notificationItem.dataset.id; 640 if (notificationId) { 641 notificationItem.classList.remove('unread'); 642 markSingleNotificationAsRead(notificationId); 643 } 644 }); 645 } 646 647 function markAllAsRead() { 648 if (!notificationBadgeDesktop || !notificationBadgeMobile || !notificationDropdown) { return; } 649 const formData = new FormData(); 650 formData.append('action', 'mark_notifications_read'); 651 formData.append('user_id', window.currentUser.id); 652 formData.append('mark_all', 'true'); 653 formData.append('csrf_token', window.csrfToken); 654 655 fetch('/api/secure_handler.php', { 656 method: 'POST', 657 body: formData 658 }) 659 .then(response => { 660 if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); 661 return response.json(); 662 }) 663 .then(data => { 664 if (data.success) { 665 allNotifications.forEach(n => n.is_read = 1); 666 updateTabBadgesFromLocal(); 667 renderNotificationList(); 668 } else { 669 console.error('Failed to mark notifications as read: ' + (data.message || 'Error.')); 670 } 671 }) 672 .catch(error => { 673 console.error('Network error marking notifications as read:', error); 674 }); 675 } 676 677 678 const countdownMessageSpan = document.getElementById('maintenance-countdown-message'); 679 let countdownInterval; 680 const genericScheduledMessage = "Maintenance is scheduled. Please finish your tasks before the specified time."; 681 const genericActiveMessage = "Maintenance is currently active."; 682 683 function updateCountdown() { 684 if (!countdownMessageSpan) { 685 if (countdownInterval) clearInterval(countdownInterval); 686 return; 687 } 688 const maintenanceBanner = document.querySelector('.maintenance-banner'); 689 if (!window.isMaintenanceEnabled || !window.maintenanceStartTime) { 690 if (maintenanceBanner) maintenanceBanner.style.display = 'none'; 691 if (countdownInterval) clearInterval(countdownInterval); 692 return; 693 } 694 if (maintenanceBanner) maintenanceBanner.style.display = 'flex'; 695 const startTime = new Date(window.maintenanceStartTime).getTime(); 696 const now = new Date().getTime(); 697 let timeLeft = startTime - now; 698 699 if (isNaN(startTime)) { 700 countdownMessageSpan.innerHTML = `Error: Invalid maintenance start time. ${genericScheduledMessage}`; 701 if (countdownInterval) clearInterval(countdownInterval); 702 return; 703 } 704 705 if (timeLeft <= 0) { 706 if (countdownInterval) clearInterval(countdownInterval); 707 708 if (!window.isAdmin) { 709 countdownMessageSpan.innerHTML = "Maintenance has started. Redirecting..."; 710 setTimeout(() => { 711 window.location.href = '/maintenance'; 712 }, 2000); 713 return; 714 } 715 716 countdownMessageSpan.innerHTML = genericActiveMessage + " (You have access as admin)."; 717 return; 718 } 719 720 const days = Math.floor(timeLeft / (1000 * 60 * 60 * 24)); 721 const hours = Math.floor((timeLeft % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); 722 const minutes = Math.floor((timeLeft % (1000 * 60 * 60)) / (1000 * 60)); 723 const seconds = Math.floor((timeLeft % (1000 * 60)) / 1000); 724 725 let countdownText = "Maintenance starts in: "; 726 if (days > 0) countdownText += `${days}d `; 727 if (hours > 0 || days > 0) countdownText += `${String(hours).padStart(2, '0')}h `; 728 countdownText += `${String(minutes).padStart(2, '0')}m ${String(seconds).padStart(2, '0')}s`; 729 countdownMessageSpan.innerHTML = `<span class='font-bold'>${countdownText}</span>. ${genericScheduledMessage}`; 730 } 731 732 if (window.isMaintenanceEnabled) { 733 if (window.maintenanceStartTime) { 734 const now = new Date().getTime(); 735 const startTime = new Date(window.maintenanceStartTime).getTime(); 736 if (!isNaN(startTime) && startTime > now) { 737 updateCountdown(); 738 countdownInterval = setInterval(updateCountdown, 1000); 739 } else if (!isNaN(startTime) && startTime <= now) { 740 updateCountdown(); 741 } else { 742 if(countdownMessageSpan) countdownMessageSpan.innerHTML = `Maintenance is scheduled, but the start time is unclear. ${genericScheduledMessage}`; 743 } 744 } else { 745 if(countdownMessageSpan) countdownMessageSpan.innerHTML = genericActiveMessage + (window.isAdmin ? " (You have access as admin)." : ""); 746 if (document.querySelector('.maintenance-banner')) document.querySelector('.maintenance-banner').style.display = 'flex'; 747 } 748 } else { 749 if (document.querySelector('.maintenance-banner')) document.querySelector('.maintenance-banner').style.display = 'none'; 750 } 751 752 const currentUserData = { 753 id: "0", 754 name: "Guest", 755 isAdmin: false }; 756 757 }); 758
759 let currentOfferData = null; 760 window.popularOffersData = []; 761 let originalOffersData = []; 762 let activeDeviceFilters = new Set(); 763 764 document.addEventListener('DOMContentLoaded', () => { 765 const progressBar = document.querySelector('.progress-bar-fill'); 766 if (progressBar) { 767 const targetProgress = progressBar.getAttribute('data-progress'); 768 setTimeout(() => { 769 progressBar.style.setProperty('--progress-width', targetProgress + '%'); 770 progressBar.classList.add('animate'); 771 }, 300); 772 } 773 774 const iframeModal = document.getElementById('iframeModal'); 775 const partnerHeaderName = document.getElementById('partnerHeaderName'); 776 const partnerHeaderLogo = document.getElementById('partnerHeaderLogo'); 777 778 let currentOfferUrl = ''; 779 780 let currentOfferProvider; 781 const openModal = (partnerName, partnerLogo, iframeSrc, provider) => { 782 if (iframeModal) { 783 currentOfferUrl = iframeSrc; 784 currentOfferProvider = provider; 785 786 if (partnerHeaderName && partnerName) { 787 partnerHeaderName.textContent = partnerName; 788 } 789 if (partnerHeaderLogo && partnerLogo) { 790 partnerHeaderLogo.src = partnerLogo; 791 partnerHeaderLogo.alt = partnerName + ' Logo'; 792 } 793 794 const conversionRateElement = document.getElementById('partnerConversionRate'); 795 if (conversionRateElement) { 796 const showCoinRate = provider !== 'hangmyads' && provider !== 'taprain'; 797 conversionRateElement.textContent = showCoinRate ? '$1 = 1,000 Shark Coins' : ''; 798 conversionRateElement.style.display = showCoinRate ? '' : 'none'; 799 } 800 801 const iframeLoader = document.querySelector('.iframe-loader'); 802 const iframeErrorEl = document.querySelector('.iframe-error'); 803 if (iframeErrorEl) iframeErrorEl.style.display = 'none'; 804 if (iframeLoader) iframeLoader.style.display = 'flex'; 805 window._iframeOpenedAt = Date.now(); 806 807 clearTimeout(window._iframeLoadTimeout); 808 window._iframeLoadTimeout = setTimeout(() => { 809 if (iframeLoader) iframeLoader.style.display = 'none'; 810 if (iframeErrorEl) iframeErrorEl.style.display = 'flex'; 811 }, 20000); 812 813 const iframe = document.getElementById('offerwallIframe'); 814 if (iframe && iframeSrc) { 815 iframe.src = 'about:blank'; 816 requestAnimationFrame(() => { 817 setTimeout(() => { 818 iframe.src = iframeSrc; 819 }, 150); 820 }); 821 } 822 823 iframeModal.classList.add('show'); 824 document.body.classList.add('offer-modal-open'); 825 pushModalBack(); 826 } 827 }; 828 829 document.getElementById('iframeRetryBtn')?.addEventListener('click', () => { 830 if (currentOfferUrl) openModal(partnerHeaderName?.textContent, partnerHeaderLogo?.src, currentOfferUrl, currentOfferProvider); 831 }); 832 document.getElementById('iframeOpenExternalBtn')?.addEventListener('click', () => { 833 if (currentOfferUrl) window.open(currentOfferUrl, '_blank', 'noopener,noreferrer'); 834 }); 835 836 document.getElementById('openExternalBtn')?.addEventListener('click', () => { 837 if (currentOfferUrl) { 838 window.open(currentOfferUrl, '_blank', 'noopener,noreferrer'); 839 } 840 }); 841 842 let _modalBackPushed = false; 843 function pushModalBack() { 844 if (!_modalBackPushed) { _modalBackPushed = true; history.pushState({ sharkModal: 1 }, ''); } 845 } 846 function consumeModalBack() { 847 if (_modalBackPushed) { _modalBackPushed = false; history.back(); } 848 } 849 window.pushModalBack = pushModalBack; 850 window.consumeModalBack = consumeModalBack; 851 window.addEventListener('popstate', () => { 852 if (!_modalBackPushed) return; 853 _modalBackPushed = false;
854 const im = document.getElementById('iframeModal'); 855 const pm = document.getElementById('popularOfferModal'); 856 if (im && im.classList.contains('show')) closeModal(); 857 else if (pm && pm.classList.contains('show')) closePopularOfferModal(); 858 }); 859 860 const closeModal = () => { 861 if (iframeModal) { 862 clearTimeout(window._iframeLoadTimeout); 863 iframeModal.classList.remove('show'); 864 document.body.classList.remove('offer-modal-open'); 865 const iframe = iframeModal.querySelector('iframe'); 866 if (iframe) { 867 const currentSrc = iframe.src; 868 iframe.src = 'about:blank'; 869 setTimeout(() => { 870 if (currentSrc.includes('bitlabs')) { 871 const newSrc = currentSrc.replace(/&_t=\d+/, '') + '&_t=' + Date.now(); 872 iframe.src = newSrc; 873 } 874 }, 100); 875 } 876 consumeModalBack(); 877 } 878 }; 879 880 if (iframeModal) { 881 iframeModal.addEventListener('click', e => { if (e.target === iframeModal) closeModal(); }); 882 iframeModal.querySelector('.partner-header-close')?.addEventListener('click', closeModal); 883 } 884 885 document.addEventListener('keydown', e => { if (e.key === 'Escape') { closeModal(); closePopularOfferModal(); } }); 886 document.addEventListener('keydown', e => { if (e.key === 'Escape') { closeModal(); closePopularOfferModal(); } }); 887 888 document.querySelectorAll('.horizontal-scroll-wrapper').forEach(wrapper => { 889 const container = wrapper.querySelector('.card-grid'); 890 const section = wrapper.closest('.earn-section'); 891 892 const headerPrevBtn = section.querySelector('.section-header-modern .scroll-btn.prev'); 893 const headerNextBtn = section.querySelector('.section-header-modern .scroll-btn.next'); 894 const wrapperPrevBtn = wrapper.querySelector('.scroll-btn.prev'); 895 const wrapperNextBtn = wrapper.querySelector('.scroll-btn.next'); 896 897 if (!container) return; 898 899 const getCardWidth = () => { 900 const card = container.querySelector('.offer-card, .partner-card, .popular-offer-card, .survey-card'); 901 if (card) { 902 return card.offsetWidth + 16; 903 } 904 return 200; 905 }; 906 907 const updateButtons = () => { 908 const scrollLeft = container.scrollLeft; 909 const maxScroll = container.scrollWidth - container.clientWidth; 910 const atStart = scrollLeft <= 1; 911 const atEnd = scrollLeft >= maxScroll - 1; 912 913 [headerPrevBtn, wrapperPrevBtn].forEach(btn => { 914 if (btn) { 915 if (atStart) { 916 btn.classList.add('disabled'); 917 } else { 918 btn.classList.remove('disabled'); 919 } 920 } 921 }); 922 [headerNextBtn, wrapperNextBtn].forEach(btn => { 923 if (btn) { 924 if (atEnd) { 925 btn.classList.add('disabled'); 926 } else { 927 btn.classList.remove('disabled'); 928 } 929 } 930 }); 931 }; 932 933 const scrollLeft = () => { 934 const scrollAmount = getCardWidth() * 2; 935 container.scrollBy({ left: -scrollAmount, behavior: 'smooth' }); 936 }; 937 938 const scrollRight = () => { 939 const scrollAmount = getCardWidth() * 2; 940 container.scrollBy({ left: scrollAmount, behavior: 'smooth' }); 941 }; 942 943 [headerPrevBtn, wrapperPrevBtn].forEach(btn => { 944 if (btn) { 945 btn.addEventListener('click', (e) => { 946 if (!btn.classList.contains('disabled')) { 947 scrollLeft(); 948 } 949 }); 950 } 951 });
952 [headerNextBtn, wrapperNextBtn].forEach(btn => { 953 if (btn) { 954 btn.addEventListener('click', (e) => { 955 if (!btn.classList.contains('disabled')) { 956 scrollRight(); 957 } 958 }); 959 } 960 }); 961 962 container.addEventListener('scroll', updateButtons, { passive: true }); 963 964 updateButtons(); 965 requestAnimationFrame(() => { 966 updateButtons(); 967 }); 968 setTimeout(() => { 969 updateButtons(); 970 }, 100); 971 972 const observer = new MutationObserver(() => { 973 updateButtons(); 974 }); 975 observer.observe(container, { childList: true, subtree: true }); 976 }); 977 978 const popularGrid = document.querySelector('#popular-offers .card-grid'); 979 if (window.matchMedia('(min-width: 769px)').matches && popularGrid) { 980 let isDown = false, startX = 0, scrollLeftStart = 0; 981 let dragMoved = false; 982 let dragRafId = null; 983 let targetScrollLeft = 0; 984 985 popularGrid.style.cursor = 'grab'; 986 popularGrid.style.userSelect = 'none'; 987 popularGrid.style.scrollBehavior = 'auto'; 988 popularGrid.style.scrollSnapType = 'none'; 989 990 const setDraggingState = (dragging) => { 991 if (dragging) { 992 popularGrid.classList.add('dragging'); 993 popularGrid.style.cursor = 'grabbing'; 994 document.body.style.userSelect = 'none'; 995 } else { 996 popularGrid.classList.remove('dragging'); 997 popularGrid.style.cursor = 'grab'; 998 document.body.style.userSelect = ''; 999 } 1000 }; 1001 1002 const flushDragScroll = () => { 1003 dragRafId = null; 1004 popularGrid.scrollLeft = targetScrollLeft; 1005 }; 1006 1007 const scheduleDragScroll = () => { 1008 if (dragRafId) return; 1009 dragRafId = requestAnimationFrame(flushDragScroll); 1010 }; 1011 1012 popularGrid.addEventListener('mousedown', e => { 1013 if (e.button !== 0) return; 1014 isDown = true; 1015 dragMoved = false; 1016 setDraggingState(true); 1017 startX = e.clientX; 1018 scrollLeftStart = popularGrid.scrollLeft; 1019 targetScrollLeft = scrollLeftStart; 1020 e.preventDefault(); 1021 }); 1022 1023 document.addEventListener('mousemove', e => { 1024 if (!isDown) return; 1025 e.preventDefault(); 1026 const dx = e.clientX - startX; 1027 if (Math.abs(dx) > 4) dragMoved = true; 1028 targetScrollLeft = scrollLeftStart - dx; 1029 scheduleDragScroll(); 1030 }, { passive: false }); 1031 1032 document.addEventListener('mouseup', () => { 1033 if (!isDown) return; 1034 isDown = false; 1035 if (dragRafId) { 1036 cancelAnimationFrame(dragRafId); 1037 dragRafId = null; 1038 } 1039 popularGrid.scrollLeft = targetScrollLeft; 1040 setDraggingState(false); 1041 }); 1042 1043 document.addEventListener('mouseleave', () => { 1044 if (isDown) { 1045 isDown = false; 1046 if (dragRafId) { 1047 cancelAnimationFrame(dragRafId); 1048 dragRafId = null; 1049 } 1050 popularGrid.scrollLeft = targetScrollLeft; 1051 setDraggingState(false); 1052 } 1053 }); 1054 1055 popularGrid.addEventListener('click', ev => { 1056 if (dragMoved) { 1057 ev.preventDefault(); 1058 ev.stopPropagation(); 1059 dragMoved = false; 1060 } 1061 }, true); 1062 1063 popularGrid.querySelectorAll('img').forEach(img => { 1064 img.addEventListener('dragstart', ev => ev.preventDefault()); 1065 }); 1066 } 1067 1068 const surveysGrid = document.getElementById('featuredSurveysGrid'); 1069 if (window.matchMedia('(min-width: 769px)').matches && surveysGrid) { 1070 let svIsDown = false, svStartX = 0, svScrollStart = 0; 1071 let svDragMoved = false, svRafId = null, svTarget = 0; 1072 1073 surveysGrid.style.cursor = 'grab'; 1074 surveysGrid.style.userSelect = 'none'; 1075 surveysGrid.style.scrollBehavior = 'auto'; 1076 surveysGrid.style.scrollSnapType = 'none'; 1077 1078 const svSetDrag = (on) => { 1079 surveysGrid.classList.toggle('dragging', on); 1080 surveysGrid.style.cursor = on ? 'grabbing' : 'grab'; 1081 document.body.style.userSelect = on ? 'none' : ''; 1082 }; 1083 1084 surveysGrid.addEventListener('mousedown', e => { 1085 if (e.button !== 0) return; 1086 svIsDown = true; svDragMoved = false;
1087 svSetDrag(true); 1088 svStartX = e.clientX; 1089 svScrollStart = surveysGrid.scrollLeft; 1090 svTarget = svScrollStart; 1091 e.preventDefault(); 1092 }); 1093 1094 document.addEventListener('mousemove', e => { 1095 if (!svIsDown) return; 1096 e.preventDefault(); 1097 const dx = e.clientX - svStartX; 1098 if (Math.abs(dx) > 4) svDragMoved = true; 1099 svTarget = svScrollStart - dx; 1100 if (!svRafId) svRafId = requestAnimationFrame(() => { svRafId = null; surveysGrid.scrollLeft = svTarget; }); 1101 }, { passive: false }); 1102 1103 document.addEventListener('mouseup', () => { 1104 if (!svIsDown) return; 1105 svIsDown = false; 1106 if (svRafId) { cancelAnimationFrame(svRafId); svRafId = null; } 1107 surveysGrid.scrollLeft = svTarget; 1108 svSetDrag(false); 1109 }); 1110 1111 surveysGrid.addEventListener('click', ev => { 1112 if (svDragMoved) { ev.preventDefault(); ev.stopPropagation(); svDragMoved = false; } 1113 }, true); 1114 1115 surveysGrid.addEventListener('dragstart', ev => ev.preventDefault()); 1116 } 1117 1118 document.getElementById('offerwallIframe')?.addEventListener('load', () => { 1119 const iframeEl = document.getElementById('offerwallIframe'); 1120 if (iframeEl && iframeEl.src === 'about:blank') return; 1121 1122 clearTimeout(window._iframeLoadTimeout); 1123 const iframeErrorLate = document.querySelector('.iframe-error'); 1124 if (iframeErrorLate) iframeErrorLate.style.display = 'none'; 1125 const iframeLoader = document.querySelector('.iframe-loader'); 1126 if (!iframeLoader) return; 1127 const elapsed = Date.now() - (window._iframeOpenedAt || Date.now()); 1128 const remaining = Math.max(0, 500 - elapsed); 1129 setTimeout(() => { iframeLoader.style.display = 'none'; }, remaining); 1130 }); 1131 1132 document.getElementById('popularOfferModal')?.addEventListener('click', e => { 1133 if (e.target.id === 'popularOfferModal') { 1134 closePopularOfferModal(); 1135 } 1136 }); 1137 1138 initializeDeviceFilter(); 1139 1140 const detectedPlatform = ""; 1141 if (detectedPlatform) { 1142 activeDeviceFilters.add(detectedPlatform); 1143 } 1144 1145 let offersLoaded = false; 1146 const loadOffersOnScroll = () => { 1147 if (offersLoaded) return; 1148 1149 const popularOffersSection = document.querySelector('#popular-offers'); 1150 if (!popularOffersSection) { 1151 offersLoaded = true; 1152 if ('requestIdleCallback' in window) { 1153 requestIdleCallback(() => loadEarnOffers(), { timeout: 500 }); 1154 } else { 1155 setTimeout(() => loadEarnOffers(), 50); 1156 } 1157 return; 1158 } 1159 1160 const rect = popularOffersSection.getBoundingClientRect(); 1161 const isVisible = rect.top < window.innerHeight && rect.bottom > 0; 1162 1163 if (isVisible) { 1164 offersLoaded = true; 1165 if ('requestIdleCallback' in window) { 1166 requestIdleCallback(() => loadEarnOffers(), { timeout: 500 }); 1167 } else { 1168 setTimeout(() => loadEarnOffers(), 50); 1169 } 1170 } else { 1171 const observer = new IntersectionObserver((entries) => { 1172 entries.forEach(entry => { 1173 if (entry.isIntersecting && !offersLoaded) { 1174 offersLoaded = true; 1175 if ('requestIdleCallback' in window) { 1176 requestIdleCallback(() => loadEarnOffers(), { timeout: 500 }); 1177 } else { 1178 setTimeout(() => loadEarnOffers(), 100); 1179 } 1180 observer.disconnect(); 1181 } 1182 }); 1183 }, { rootMargin: '300px' }); 1184 1185 observer.observe(popularOffersSection); 1186 } 1187 }; 1188 1189 if ('requestIdleCallback' in window) { 1190 requestIdleCallback(() => loadOffersOnScroll(), { timeout: 100 }); 1191 } else { 1192 setTimeout(() => loadOffersOnScroll(), 50); 1193 } 1194 1195 document.querySelectorAll('.partner-card').forEach(card => { 1196 card.addEventListener('click', function(e) { 1197 if (this.classList.contains('placeholder')) return; 1198 if (this.classList.contains('partner-card--unavailable')) return; 1199 if (this.classList.contains('mychips-offer')) return; 1200 if (!false) { 1201 openAuthModal('register'); 1202 return; 1203 } 1204 1205 const provider = this.dataset.provider; 1206 const iframeSrc = this.dataset.iframeSrc; 1207 const partnerName = this.dataset.partnerName || this.querySelector('.partner-name')?.textContent || 'Partner'; 1208 const partnerLogo = this.dataset.partnerLogo || this.querySelector('.partner-logo')?.src || ''; 1209 1210 if (provider === 'cpxresearch') { 1211 const cpxUrl = `https://offers.cpx-research.com/index.php?app_id=&ext_user_id=&secure_hash=&email=&username=Guest&subid_1=shark_earnings&subid_2=partner_card`; 1212 1213 openModal('CPX Research Surveys', '/assets/images/partners/cpxresearch.svg',
1213cpxUrl, 'cpxresearch'); 1214 return; 1215 } 1216 1217 if (provider === 'theoremreach' || provider === 'theoremreach-offers') { 1218 trackOfferClick('theoremreach_direct_', 'theoremreach').catch(() => {}); 1219 openModal(partnerName, partnerLogo, iframeSrc, provider); 1220 return; 1221 } 1222 1223 if (provider === 'hangmyads') { 1224 trackOfferClick('hangmyads_', 'hangmyads').then(() => { 1225 if (iframeSrc) { 1226 openModal(partnerName, partnerLogo, iframeSrc, provider); 1227 } 1228 }).catch(() => { 1229 if (iframeSrc) { 1230 openModal(partnerName, partnerLogo, iframeSrc, provider); 1231 } 1232 }); 1233 return; 1234 } 1235 1236 if (provider === 'mmwall') { 1237 trackOfferClick('mmwall_', 'mmwall').then(() => { 1238 if (iframeSrc) { 1239 openModal(partnerName, partnerLogo, iframeSrc, provider); 1240 } 1241 }).catch(() => { 1242 if (iframeSrc) { 1243 openModal(partnerName, partnerLogo, iframeSrc, provider); 1244 } 1245 }); 1246 1247 return; 1248 } 1249 1250 if (provider === 'cheddar') { 1251 if (navigator.userAgent.includes('SharkEarningsApp')) { 1252 window.location.href = iframeSrc; 1253 } else { 1254 window.open(iframeSrc, '_blank', 'noopener,noreferrer'); 1255 } 1256 return; 1257 } 1258 1259 if (iframeSrc) { 1260 openModal(partnerName, partnerLogo, iframeSrc, provider); 1261 } 1262 }); 1263 }); 1264 1265 (function() { 1266 const urlParams = new URLSearchParams(window.location.search); 1267 let wallParam = urlParams.get('wall'); 1268 if (!wallParam) { 1269 const pathMatch = window.location.pathname.match(/^\/wall\/([a-zA-Z0-9_-]+)/); 1270 if (pathMatch) wallParam = pathMatch[1]; 1271 } 1272 if (wallParam) { 1273 setTimeout(() => openWallForProvider(wallParam), 600); 1274 } 1275 })(); 1276 1277 1278 const earningsList = document.getElementById('earnings-list'); 1279 if (earningsList) { 1280 let lastId = 0; 1281 let isFetching = false; 1282 const MAX_ITEMS = 50; 1283 let tickerOffset = 0; 1284 let origWidth = 0; 1285 let rafId = null; 1286 1287 // A kulso avatarok (Discord, Google) idovel 404-re valtanak, amikor a user 1288 // lecsereli a kepet nalunk - a Discord CDN a regi hash-t nem szolgalja ki 1289 // tovabb. Kep helyett ilyenkor ugyanaz a monogramos csempe jon, amit a 1290 // szerver rak ki, ha egyaltalan nincs avatar_url. Az error esemeny nem 1291 // buborekol, ezert capture fazisban figyeljuk: igy a kesobb bepollozott es a 1292 // klonozott sorokra is all, es nem kell inline onerror (script-src-attr). 1293 earningsList.addEventListener('error', (e) => { 1294 const img = e.target; 1295 if (!(img instanceof HTMLImageElement) || !img.classList.contains('earning-avatar')) return; 1296 const item = img.closest('.earning-item'); 1297 const name = (item && (item.dataset.username || item.querySelector('.ei-label-alt')?.textContent)) || '?'; 1298 const fallback = document.createElement('div'); 1299 fallback.className = 'earning-avatar earning-avatar-fallback'; 1300 fallback.style.cssText = 'background:#00a3ff;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:.7em;'; 1301 fallback.textContent = (name.trim().charAt(0) || '?').toUpperCase(); 1302 img.replaceWith(fallback); 1303 }, true); 1304 1305 const userProfileModal = new UserProfileModal(); 1306 earningsList.addEventListener('click', (e) => { 1307 const item = e.target.closest('.earning-item'); 1308 if (item && item.dataset.username && !item.classList.contains('private-item')) { 1309 userProfileModal.openProfile(item.dataset.username); 1310 } 1311 }); 1312 1313 // The label/username swap is pure CSS now (see .ei-top-stack): both texts 1314 // are rendered stacked in one grid cell, hover just flips visibility. No JS 1315 // measuring, and the box cannot resize because neither text ever leaves 1316 // the layout. 1317 1318 function getOriginalItems() { 1319 return Array.from(earningsList.children).filter(i => !i.classList.contains('clone')); 1320 } 1321
1322 function rebuildClones() { 1323 Array.from(earningsList.children).filter(i => i.classList.contains('clone')).forEach(i => i.remove()); 1324 const originals = getOriginalItems(); 1325 originals.forEach(item => { 1326 const clone = item.cloneNode(true); 1327 clone.classList.add('clone'); 1328 earningsList.appendChild(clone); 1329 }); 1330 origWidth = earningsList.scrollWidth / 2; 1331 } 1332 1333 function startTicker() { 1334 if (rafId) cancelAnimationFrame(rafId); 1335 rafId = null; 1336 function frame() { 1337 if (origWidth > 0) { 1338 tickerOffset += 0.5; 1339 if (tickerOffset >= origWidth) tickerOffset -= origWidth; 1340 earningsList.style.transform = `translateX(-${tickerOffset}px)`; 1341 } 1342 rafId = requestAnimationFrame(frame); 1343 } 1344 rafId = requestAnimationFrame(frame); 1345 } 1346 1347 document.addEventListener('visibilitychange', () => { 1348 if (!document.hidden && origWidth > 0) startTicker(); 1349 }); 1350 1351 1352 if (earningsList.children.length > 0) { 1353 const startTickerWhenIdle = () => { rebuildClones(); startTicker(); }; 1354 if ('requestIdleCallback' in window) { 1355 requestIdleCallback(startTickerWhenIdle, { timeout: 1000 }); 1356 } else { 1357 setTimeout(startTickerWhenIdle, 200); 1358 } 1359 } 1360 1361 async function fetchAndRenderEarnings() { 1362 if (isFetching) return; 1363 if (document.hidden) return; 1364 isFetching = true; 1365 const formData = new FormData(); 1366 formData.append('action', 'get_recent_earnings'); 1367 formData.append('last_id', lastId); 1368 formData.append('csrf_token', window.csrfToken); 1369 try { 1370 const response = await fetch('/api/secure_handler.php', { method: 'POST', body: formData }); 1371 if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); 1372 const data = await response.json(); 1373 if (data.success && typeof data.balance === 'number' && window.__animateBalance) { 1374 const nb = Math.round(data.balance * 1000) / 1000; 1375 const cur = window.__sharkBalance; 1376 if (typeof cur !== 'number') { window.__sharkBalance = nb; } 1377 else if (Math.abs(nb - cur) >= 0.005) { 1378 window.__sharkBalance = nb; 1379 window.__animateBalance(cur, nb); 1380 document.dispatchEvent(new CustomEvent('sharkbalance:change', { detail: { balance: nb } })); 1381 } 1382 const holdEl = document.getElementById('walletHoldAmount'); 1383 if (holdEl && typeof data.hold === 'number') holdEl.textContent = '$' + formatAmountExact(data.hold); 1384 } 1385 if (data.success && data.earnings.length > 0) {
1386 data.earnings.forEach(earning => { 1387 const newItem = createEarningElement(earning); 1388 const firstClone = earningsList.querySelector('.clone'); 1389 if (firstClone) earningsList.insertBefore(newItem, firstClone); 1390 else earningsList.appendChild(newItem); 1391 lastId = Math.max(lastId, earning.id); 1392 }); 1393 manageTickerSize(); 1394 rebuildClones(); 1395 startTicker(); 1396 } 1397 } catch (error) { 1398 console.error('Error fetching recent earnings:', error); 1399 } finally { 1400 isFetching = false; 1401 } 1402 } 1403 1404 function createEarningElement(earning) { 1405 const li = document.createElement('li'); 1406 li.className = 'earning-item'; 1407 if (earning.is_cashout) li.classList.add('cashout-item'); 1408 if (earning.is_private) li.classList.add('private-item'); 1409 1410 li.dataset.userId = earning.user_id; 1411 if (!earning.is_private) li.dataset.username = earning.username; 1412 li.dataset.description = earning.description; 1413 1414 const amountClass = earning.is_cashout ? 'ei-amount cashout-amount' : 'ei-amount'; 1415 1416 const nt = earning.is_private ? '' : ' notranslate'; 1417 li.innerHTML = `<div class="ei-avatar-wrap">${earning.avatar_html}</div> 1418 <div class="ei-info"> 1419 <span class="ei-top-stack"> 1420 <span class="ei-label-top${nt}">${earning.label_top}</span> 1421 <span class="ei-label-alt${nt}">${earning.username}</span> 1422 </span> 1423 <span class="ei-label-bot">${earning.label_bottom}</span> 1424 </div> 1425 <span class="${amountClass}">${earning.amount_display}</span>`; 1426 return li; 1427 } 1428 1429 function manageTickerSize() { 1430 // Count the excess ONCE, then drop exactly that many from the front. 1431 // The previous version tested a cached `originals.length` inside the 1432 // loop - Array.from().filter() hands back a static copy, so removing 1433 // nodes never shrank it and the loop ran until every original was 1434 // gone. Past 50 items the ticker emptied itself and stopped (origWidth 1435 // fell to 0) until the next poll refilled it 15s later. 1436 let excess = getOriginalItems().length - MAX_ITEMS; 1437 while (excess-- > 0) { 1438 const firstOriginal = earningsList.querySelector('li:not(.clone)'); 1439 if (!firstOriginal) break; 1440 earningsList.removeChild(firstOriginal); 1441 } 1442 } 1443 } 1444 1445 1446 }); 1447 1448 function initializeDeviceFilter() { 1449 const filterContainer = document.querySelector('.featured-grid-container'); 1450 if (!filterContainer) return; 1451 1452 const hideEarnOnSection = false; 1453 if (hideEarnOnSection) { 1454 return; 1455 } 1456 1457 const filterHTML = ` 1458 <div class="device-filter-buttons sec-device-icons" role="group" aria-label="Filter offers by device"> 1459 <button class="device-filter-btn" data-device="web" onclick="toggleDeviceFilter('web')" title="Desktop" aria-label="Desktop" aria-pressed="false"> 1460 <i class="fas fa-desktop"></i> 1461 </button> 1462 <button class="device-filter-btn" data-device="android" onclick="toggleDeviceFilter('android')" title="Android" aria-label="Android" aria-pressed="false"> 1463 <i class="fab fa-android"></i> 1464 </button> 1465 <button class="device-filter-btn" data-device="ios" onclick="toggleDeviceFilter('ios')" title="iOS" aria-label="iOS" aria-pressed="false"> 1466 <i class="fab fa-apple"></i> 1467 </button> 1468 </div> 1469 `; 1470 1471 const headingLeft = filterContainer.querySelector('#popular-offers .section-left'); 1472 if (headingLeft) { 1473 headingLeft.insertAdjacentHTML('beforeend', filterHTML); 1474 } else { 1475 filterContainer.insertAdjacentHTML('afterbegin', filterHTML); 1476 } 1477 updateFilterCounts(); 1478 } 1479 1480 function debounce(func, wait) { 1481 let timeout;
1482 return function executedFunction(...args) { 1483 const later = () => { 1484 clearTimeout(timeout); 1485 func(...args); 1486 }; 1487 clearTimeout(timeout); 1488 timeout = setTimeout(later, wait); 1489 }; 1490 } 1491 1492 function throttle(func, wait) { 1493 let waiting = false; 1494 return function executedFunction(...args) { 1495 if (!waiting) { 1496 func.apply(this, args); 1497 waiting = true; 1498 setTimeout(() => { waiting = false; }, wait); 1499 } 1500 }; 1501 } 1502 1503 const debouncedApplyFilters = debounce(applyDeviceFilters, 150); 1504 1505 function toggleDeviceFilter(device) { 1506 const btn = document.querySelector(`.featured-grid-container [data-device="${device}"]`); 1507 if (!btn) return; 1508 1509 if (activeDeviceFilters.has(device)) { 1510 activeDeviceFilters.delete(device); 1511 btn.classList.remove('active'); 1512 } else { 1513 activeDeviceFilters.add(device); 1514 btn.classList.add('active'); 1515 } 1516 btn.setAttribute('aria-pressed', activeDeviceFilters.has(device) ? 'true' : 'false'); 1517 1518 debouncedApplyFilters(); 1519 } 1520 1521 function applyDeviceFilters() { 1522 if (!document.getElementById('popular-offers')) return; 1523 1524 if (activeDeviceFilters.size === 0) { 1525 displayPopularOffers(originalOffersData); 1526 return; 1527 } 1528 1529 const filteredPopularOffers = originalOffersData.filter(offer => { 1530 if (offer.devices && Array.isArray(offer.devices)) { 1531 return offer.devices.some(device => activeDeviceFilters.has(device)); 1532 } 1533 else if (offer.categories && Array.isArray(offer.categories)) { 1534 const devices = []; 1535 if (offer.categories.includes('Android')) devices.push('android'); 1536 if (offer.categories.includes('iPhone') || offer.categories.includes('iPad')) devices.push('ios'); 1537 if (devices.length === 0) devices.push('web'); 1538 1539 return devices.some(device => activeDeviceFilters.has(device)); 1540 } 1541 return false; 1542 }); 1543 1544 displayPopularOffers(filteredPopularOffers); 1545 } 1546 1547 function loadEarnOffers() { 1548 const cacheKey = 'earn_offers_cache_v3'; 1549 const cacheTimeKey = 'earn_offers_cache_v3_time'; 1550 const cacheTTL = 55 * 60 * 1000; 1551 1552 let shownFromCache = false; 1553 try { 1554 const cachedData = localStorage.getItem(cacheKey); 1555 const cacheTime = localStorage.getItem(cacheTimeKey); 1556 if (cachedData && cacheTime) { 1557 const data = JSON.parse(cachedData); 1558 const firstOffer = data.popular_offers?.[0]; 1559 if (firstOffer && firstOffer.click_url !== undefined && !firstOffer.click_url) { 1560 localStorage.removeItem(cacheKey); 1561 localStorage.removeItem(cacheTimeKey); 1562 } else if (firstOffer) { 1563 processOffersData(data); 1564 shownFromCache = true; 1565 const age = Date.now() - parseInt(cacheTime); 1566 if (age < cacheTTL) return; 1567 } 1568 } 1569 } catch (e) { 1570 console.warn('Cache read error:', e); 1571 } 1572 1573 fetch('/api/secure_handler.php', { 1574 method: 'POST', 1575 headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 1576 body: new URLSearchParams({ 1577 action: 'get_earn_offers', 1578 csrf_token: window.csrfToken 1579 }) 1580 }) 1581 .then(response => { 1582 if (!response.ok) throw new Error(`HTTP ${response.status}`); 1583 return response.json(); 1584 }) 1585 .then(data => { 1586 try { 1587 localStorage.setItem(cacheKey, JSON.stringify(data)); 1588 localStorage.setItem(cacheTimeKey, Date.now().toString()); 1589 } catch (e) { 1590 console.warn('Cache write error:', e); 1591 } 1592 processOffersData(data); 1593 }) 1594 .catch(error => {
1595 if (!shownFromCache) { 1596 try { 1597 const cachedData = localStorage.getItem('earn_offers_cache_v3'); 1598 if (!cachedData) showPopularComingSoon("Loading Error", "Could not load offers."); 1599 } catch (e) { 1600 showPopularComingSoon("Loading Error", "Could not load offers."); 1601 } 1602 } 1603 }); 1604 } 1605 1606 function processOffersData(data) { 1607 if (!document.getElementById('popular-offers')) return; 1608 1609 if (data.success) { 1610 if (data.popular_offers && data.popular_offers.length > 0) { 1611 originalOffersData = data.popular_offers; 1612 } else { 1613 originalOffersData = []; 1614 } 1615 1616 updateFilterCounts(); 1617 applyDeviceFilters(); 1618 } else { 1619 showPopularComingSoon("Loading Error", "Could not load offers."); 1620 } 1621 } 1622 1623 async function displayPopularOffers(offers) { 1624 const container = document.querySelector('#popular-offers .card-grid'); 1625 if (!container) return; 1626 1627 if (Array.isArray(offers)) { const _seen = {}; offers = offers.filter(function(o){ if (!o || o.id == null) return true; if (_seen[o.id]) return false; _seen[o.id] = 1; return true; }); } 1628 window.popularOffersData = offers; 1629 1630 if (!offers) { 1631 const _sk = '<div class="skeleton-card"><div class="skeleton skeleton-logo"></div><div class="skeleton-lines"><div class="skeleton skeleton-line"></div><div class="skeleton skeleton-line short"></div></div></div>'; 1632 container.innerHTML = _sk.repeat(6); 1633 return; 1634 } 1635 1636 if (offers.length === 0) { 1637 container.innerHTML = ` 1638 <div class="offers-coming-soon" style="width: 100%;"> 1639 <i class="fas fa-search"></i> 1640 <h3>No Offers Found</h3> 1641 <p>No offers available. Try adjusting your device filters.</p> 1642 </div>`; 1643 return; 1644 } 1645 1646 const progressMap = {}; 1647 await Promise.all(offers.map(async (offer) => { 1648 try { 1649 const progress = await checkOfferProgress(offer.id, offer.provider || 'mychips'); 1650 if (progress && Object.keys(progress).length > 0) { 1651 progressMap[offer.id] = progress; 1652 } 1653 } catch (e) {} 1654 })); 1655 1656 container.innerHTML = offers.map((offer, index) => { 1657 const defaultImage = '/assets/images/default-offer.webp'; 1658 1659 if (offer.impression_url) { 1660 setTimeout(() => fireImpressionPixel(offer.impression_url.replace('{index}', index + 1)), 1000); 1661 } 1662 1663 const rewardText = offer.reward_display || (offer.payout ? `$${formatAmountExact(offer.payout)}` : '$0.00'); 1664 const bonusPct = offer.bonus_percent || 0; 1665 const origPayout = offer.original_payout_usd || 0; 1666 1667 const deviceIcons = getDeviceIcons(offer.devices && offer.devices.length ? offer.devices : offer.categories); 1668 1669 const offerProgress = progressMap[offer.id] || {}; 1670 const progressKeys = Object.keys(offerProgress); 1671 const hasProgress = progressKeys.length > 0; 1672 const completedSteps = progressKeys.filter(key => offerProgress[key] === 'completed').length; 1673 const hasCompletedSteps = completedSteps > 0; 1674 1675 const providerKey = (offer.provider || '').toLowerCase(); 1676 const clickAction = 'popular'; 1677 1678 const safeId = escapeHtml(String(offer.id)); 1679 const safeTitle = escapeHtml(offer.title || ''); 1680 const safeIconUrl = escapeHtml(offer.icon_url || defaultImage); 1681 const safeClickUrl = escapeHtml(offer.click_url || ''); 1682 const safeClickAction = clickAction === 'task' ? 'task' : 'popular'; 1683 const safeRewardText = escapeHtml(rewardText); 1684 const displayTitle = safeTitle.length > 60 ? safeTitle.substring(0, 57) + '...' : safeTitle; 1685 1686 const isCoin = offer.is_coin_display || false; 1687 const origDisplay = isCoin
1688 ? Math.round(origPayout).toLocaleString() + ' SC' 1689 : `$${formatAmountExact(origPayout)}`; 1690 const bonusBadgeHtml = bonusPct > 0 ? `<div class="bonus-pct-badge">+${bonusPct}%</div>` : ''; 1691 const rewardHtml = bonusPct > 0 && origPayout > 0 1692 ? `${safeRewardText}<span class="payout-original">${origDisplay}</span>` 1693 : safeRewardText; 1694 1695 return ` 1696 <div role="button" tabindex="0" class="popular-offer-card partner-card mychips-offer ${hasProgress ? 'has-progress' : ''}" data-offer-id="${safeId}" data-click-url="${safeClickUrl}" onclick="openOfferModal('${safeId}', '${safeClickAction}')" style="position:relative;"> 1697 ${bonusBadgeHtml} 1698 <div class="popular-offer-image"> 1699 <img src="${safeIconUrl}" alt="${safeTitle}" class="popular-offer-img" loading="lazy" width="200" height="200" onload="if(this.naturalWidth&&this.naturalWidth<=150)this.classList.add('is-small-icon')" onerror="this.onerror=null;this.src='${defaultImage}';this.classList.add('is-fallback')"> 1700 <div class="device-indicator">${deviceIcons}</div> 1701 </div> 1702 <div class="popular-offer-content card-content"> 1703 <h3 class="popular-offer-title partner-name notranslate" data-title="${safeTitle}">${displayTitle}</h3> 1704 <div class="popular-offer-reward star-rating notranslate">${rewardHtml}</div> 1705 </div> 1706 </div>`; 1707 }).join(''); 1708 1709 requestAnimationFrame(() => { 1710 const cards = container.querySelectorAll('.popular-offer-card'); 1711 const observer = new IntersectionObserver((entries) => { 1712 entries.forEach(entry => { 1713 if (entry.isIntersecting) { 1714 entry.target.classList.add('visible'); 1715 observer.unobserve(entry.target); 1716 } 1717 }); 1718 }, { rootMargin: '50px' }); 1719 1720 cards.forEach(card => observer.observe(card)); 1721 }); 1722 1723 setTimeout(setupViewportTracking, 100); 1724 } 1725 1726 function showPopularComingSoon(title, message) { 1727 const container = document.querySelector('#popular-offers .card-grid'); 1728 if (container) { 1729 container.innerHTML = ` 1730 <div class="offers-coming-soon" style="width: 100%;"> 1731 <i class="fas fa-ghost"></i> 1732 <h3>${title}</h3> 1733 <p>${message}</p> 1734 </div>`; 1735 } 1736 } 1737 1738 function fireImpressionPixel(pixelUrl) { 1739 if (!pixelUrl) { 1740 return; 1741 } 1742 const img = new Image(); 1743 img.src = pixelUrl; 1744 } 1745 1746 1747 function getDeviceIcons(deviceData) { 1748 if (!deviceData || !Array.isArray(deviceData) || deviceData.length === 0) return '<i class="fas fa-desktop"></i>'; 1749 let icons = ''; 1750 if (deviceData.some(d => d.toLowerCase().includes('android'))) icons += '<i class="fab fa-android"></i>'; 1751 if (deviceData.some(d => d.toLowerCase().includes('ios') || d.toLowerCase().includes('iphone') || d.toLowerCase().includes('ipad'))) icons += '<i class="fab fa-apple"></i>'; 1752 if (deviceData.some(d => d.toLowerCase().includes('web'))) icons += '<i class="fas fa-desktop"></i>'; 1753 return icons || '<i class="fas fa-desktop"></i>'; 1754 } 1755 1756 function parseRequirements(requirementsText) { 1757 if (!requirementsText || !requirementsText.trim()) { 1758 return [{ text: 'Complete the offer as instructed', payout: 0 }]; 1759 } 1760 const lines = requirementsText.split('\n').filter(r => r.trim() !== ''); 1761 return lines.map(req => { 1762 let r = req.replace(/^\d+\.\s*/, '').trim(); 1763 1764 const arrowMatch = r.match(/\(\+\$([0-9,]+\.?[0-9]*)\s*â\s*\+\$([0-9,]+\.?[0-9]*)\)/); 1765 if (arrowMatch) { 1766 return { 1767 text: r.replace(/\s*\(\+\$[0-9,]+\.?[0-9]*\s*â\s*\+\$[0-9,]+\.?[0-9]*\)/, '').trim(), 1768 payout: parseFloat(arrowMatch[1].replace(/,/g, '')), 1769 boostedPayout: parseFloat(arrowMatch[2].replace(/,/g, '')) 1770 }; 1771 } 1772 const stdMatch = r.match(/\(\+\$([0-9,]+\.?[0-9]*)\)/); 1773 return { 1774 text: r.replace(/\s*\(\+\$[0-9,]+\.?[0-9]*\)/, '').trim(), 1775 payout: stdMatch ? parseFloat(stdMatch[1].replace(/,/g, '')) : 0 1776 }; 1777 }); 1778 } 1779 async function trackOfferClick(offerId, provider = 'mychips', offerData = null) { 1780 try { 1781 const formData = new FormData(); 1782 formData.append('action', 'track_offer_click'); 1783 formData.append('offer_id', offerId); 1784 formData.append('provider', provider); 1785 formData.append('csrf_token', window.csrfToken); 1786 1787 if (offerData) { 1788 formData.append('offer_title', offerData.title || ''); 1789 formData.append('offer_icon_url', offerData.icon_url || ''); 1790 const _payout = offerData.user_payout_usd || offerData.payout || parseFloat((offerData.reward_display || '').replace(/[^0-9.]/g, '')) || 0; 1791 if (_payout > 0) formData.append('offer_payout_usd', _payout); 1792 formData.append('offer_description', offerData.full_description || offerData.description || ''); 1793 formData.append('offer_requirements', offerData.requirements || ''); 1794 formData.append('offer_devices', Array.isArray(offerData.devices) ? offerData.devices.join(',') : ''); 1795 formData.append('offer_provider_display', offerData.provider || ''); 1796 } 1797 1798 const response = await fetch('/api/secure_handler.php', { 1799 method: 'POST', 1800 body: formData 1801 }); 1802 1803 const data = await response.json(); 1804 return data; 1805 } catch (error) { 1806 console.error('Failed to track offer click:', error); 1807 } 1808 return null; 1809 } 1810 1811 1812 async function checkOfferProgress(offerId, provider) { 1813 try { 1814 const formData = new FormData(); 1815 formData.append('action', 'get_progress'); 1816 formData.append('offer_id', offerId); 1817 formData.append('csrf_token', window.csrfToken); 1818 1819 const response = await fetch('/api/secure_handler.php', { 1820 method: 'POST', 1821 body: formData 1822 }); 1823 1824 if (!response.ok) { 1825 return {}; 1826 } 1827 1828 const data = await response.json(); 1829 1830 if (data.success && data.progress) { 1831 const progressObject = {}; 1832 data.progress.forEach((item, index) => { 1833 progressObject[item.step_index || index] = item.status; 1834 }); 1835 return progressObject; 1836 } else { 1837 return {}; 1838 } 1839 } catch (error) { 1840 return {}; 1841 } 1842 } 1843 1844 function switchModalTab(btn, tabId) { 1845 const modal = btn.closest('.offer-modal-base-content'); 1846 modal.querySelectorAll('.modal-tab').forEach(t => t.classList.remove('active')); 1847 modal.querySelectorAll('.modal-tab-content').forEach(t => t.classList.remove('active')); 1848 btn.classList.add('active'); 1849 document.getElementById(tabId).classList.add('active'); 1850 if (tabId.endsWith('-holds')) { 1851 const bodyId = tabId + '-body'; 1852 const body = document.getElementById(bodyId); 1853 if (body && !body.dataset.built) { 1854 body.innerHTML = buildHoldTabHtml(window.HOLD_INFO || {}, window._currentOfferMaxHold); 1855 body.dataset.built = '1'; 1856 } 1857 } 1858 } 1859 1860 function _offerEstHold(amount) { 1861 const hi = window.HOLD_INFO || {}; 1862 const tier = hi.tier || 'none'; 1863 const cb = hi.hasChargeback || false; 1864
1865 const m = window.SHARK_HOLD_MATRIX; 1866 if (!m) { 1867 console.warn('SHARK_HOLD_MATRIX missing - hold estimate unavailable'); 1868 return ''; 1869 } 1870 1871 const rows = m[tier] || m['none'] || []; 1872 for (const [limit, ok, withCb] of rows) { 1873 if (limit === null || amount < limit) return cb ? withCb : ok; 1874 } 1875 return ''; 1876 } 1877 1878 function _mkEarnHoldBadge(payout) { 1879 if (!payout) return ''; 1880 const h = _offerEstHold(payout); 1881 return h === 'Instant' 1882 ? `<span class="req-hold-badge req-hold-instant"><i class="fas fa-bolt"></i><span class="rhb-tip"><strong>Instant release</strong><span>Credited to your balance immediately after completion.</span></span></span>` 1883 : `<span class="req-hold-badge req-hold-lock"><i class="fas fa-lock"></i><span class="rhb-tip"><strong>~${h} hold</strong><span>Expected hold time - released to your balance automatically.</span></span></span>`; 1884 } 1885 1886 function buildHoldTabHtml(info, offerMaxHold) { 1887 const hasChargeback = info.hasChargeback || false; 1888 const nextTier = info.nextTier || null; 1889 const nextTierName = info.nextTierName || null; 1890 const holdMax = offerMaxHold || null; 1891 const isInstant = !holdMax || holdMax === 'Instant'; 1892 const cbExtra = hasChargeback ? ' Your chargeback history extends lock durations.' : ''; 1893 1894 const lockBox = isInstant 1895 ? `<div class="hold-info-box hold-info-why" style="background:linear-gradient(135deg,rgba(76,175,80,.08),rgba(76,175,80,.02));border-color:rgba(76,175,80,.25)"> 1896 <i class="fas fa-bolt" style="color:#4caf50"></i> 1897 <div> 1898 <strong>All steps release instantly</strong> 1899 <p>Every reward in this offer is credited to your balance immediately after completion - no waiting required.</p> 1900 </div> 1901 </div>` 1902 : `<div class="hold-info-box hold-info-lock"> 1903 <i class="fas fa-lock"></i> 1904 <div> 1905 <strong>Earnings may be locked for up to ${holdMax}</strong> 1906 <p>This is the longest hold for any step in this offer based on your tier.${cbExtra} Smaller steps are released faster. Each step shows its estimated hold time.</p> 1907 </div> 1908 </div>`; 1909 1910 const whyBox = `<div class="hold-info-box hold-info-why"> 1911 <i class="fas fa-question-circle"></i> 1912 <div> 1913 <strong>Why are earnings held?</strong> 1914 <p>Holds protect against fraud and ensure offer completions are genuine. Once the hold period ends, funds are automatically added to your balance - no action needed. <a href="/academy/rewards/held-offers-explanation" class="hold-ranks-link">Learn more â</a></p> 1915 </div> 1916 </div>`; 1917 1918 const upgradeHint = isInstant ? `` : (nextTier 1919 ? `<div class="hold-info-box hold-info-upgrade"> 1920 <i class="fas fa-bolt"></i> 1921 <div> 1922 <strong>Reduce your hold times!</strong> 1923 <p>Leveling up to ${nextTierName} reduces your earning locks. <a href="/rewards" class="hold-ranks-link">View tiers</a></p> 1924 </div> 1925 </div>` 1926 : `<div class="hold-info-box hold-info-upgrade"> 1927 <i class="fas fa-star"></i> 1928 <div> 1929 <strong>Obsidian tier - minimum locks</strong> 1930 <p>You're at the top tier. Your earnings are released as fast as possible.</p> 1931 </div> 1932 </div>`); 1933 1934 const TIER_ORDER = [ 1935 ['none', 'Starter'], ['bronze', 'Bronze'], ['silver', 'Silver'], 1936 ['gold', 'Gold'], ['diamond', 'Diamond'], ['obsidian', 'Obsidian'] 1937 ]; 1938 const myTier = info.tier || 'none'; 1939 const levelChips = TIER_ORDER.map(function (t) { 1940 return '<span class="hold-lvl' + (t[0] === myTier ? ' hold-lvl-mine' : '') + '">' + t[1] + '</span>'; 1941 }).join('<i class="fas fa-chevron-right hold-lvl-sep"></i>'); 1942 1943 const levelsBox = `<div class="hold-info-box hold-info-why"> 1944 <i class="fas fa-layer-group"></i> 1945 <div> 1946 <strong>Your level shortens the wait</strong> 1947 <div class="hold-lvl-row">${levelChips}</div> 1948 <p>Your level rises with your total earnings. The higher it is, the sooner your rewards are released - and more of them arrive instantly.</p> 1949 </div> 1950 </div>`; 1951 1952 return `<div class="hold-tab-wrap">${lockBox}${whyBox}${levelsBox}${upgradeHint}</div>`; 1953 } 1954 1955 function closePopularOfferModal() { 1956 const modal = document.getElementById('popularOfferModal'); 1957 if (modal && modal.classList.contains('show')) { 1958 modal.classList.remove('show'); 1959 1960 const iframeModal = document.getElementById('iframeModal'); 1961 if (!iframeModal || !iframeModal.classList.contains('show')) { 1962 document.body.classList.remove('offer-modal-open'); 1963 } 1964 1965 currentOfferData = null; 1966 1967 const footerInfo = document.querySelector('.offer-footer-info'); 1968 if (footerInfo) footerInfo.remove(); 1969 1970 const existingBadge = document.querySelector('.high-pay-badge-modal'); 1971 if (existingBadge) existingBadge.remove(); 1972 1973 const totalPayoutSection = document.querySelector('.total-payout-section'); 1974 if (totalPayoutSection) totalPayoutSection.remove(); 1975 consumeModalBack(); 1976 } 1977 } 1978 1979 function escapeHtml(str) { 1980 if (typeof str !== 'string') return ''; 1981 return str 1982 .replace(/&/g, '&') 1983 .replace(/</g, '<') 1984 .replace(/>/g, '>') 1985 .replace(/"/g, '"') 1986 .replace(/'/g, '''); 1987 } 1988 1989 function formatOfferDescription(description) { 1990 if (!description || !description.trim()) return ''; 1991 const escaped = escapeHtml(description); 1992 return escaped.replace(/\n/g, '<br>').trim(); 1993 } 1994 function updateFilterCounts() { 1995 const counts = { web: 0, android: 0, ios: 0 }; 1996 1997 if (originalOffersData && Array.isArray(originalOffersData)) { 1998 originalOffersData.forEach(offer => { 1999 if (offer.devices && Array.isArray(offer.devices)) {
2000 offer.devices.forEach(device => { 2001 if (counts.hasOwnProperty(device)) { 2002 counts[device]++; 2003 } 2004 }); 2005 } 2006 else if (offer.categories && Array.isArray(offer.categories)) { 2007 const devices = []; 2008 if (offer.categories.includes('Android')) devices.push('android'); 2009 if (offer.categories.includes('iPhone') || offer.categories.includes('iPad')) devices.push('ios'); 2010 if (devices.length === 0) devices.push('web'); 2011 2012 devices.forEach(device => { 2013 if (counts.hasOwnProperty(device)) { 2014 counts[device]++; 2015 } 2016 }); 2017 } 2018 }); 2019 } 2020 2021 Object.keys(counts).forEach(device => { 2022 const btn = document.querySelector(`.featured-grid-container [data-device="${device}"]`); 2023 if (btn) { 2024 const countElement = btn.querySelector('.filter-count'); 2025 if (countElement) { 2026 countElement.textContent = counts[device]; 2027 } 2028 } 2029 }); 2030 } 2031 2032 2033 2034 function setupViewportTracking() { 2035 const observer = new IntersectionObserver((entries) => { 2036 entries.forEach(entry => { 2037 if (entry.isIntersecting) { 2038 const card = entry.target; 2039 const offerId = card.dataset.offerId; 2040 const offer = window.popularOffersData.find(o => o.id == offerId); 2041 2042 if (offer && offer.impression_url) { 2043 setTimeout(() => { 2044 if (entry.isIntersecting) { 2045 fireImpressionPixel(offer.impression_url); 2046 } 2047 }, 3000); 2048 } 2049 } 2050 }); 2051 }, { 2052 threshold: 0.5, 2053 rootMargin: '0px' 2054 }); 2055 2056 document.querySelectorAll('.popular-offer-card').forEach(card => { 2057 observer.observe(card); 2058 }); 2059 } 2060 function getProviderLogoUrl(providerName) { 2061 const map = { 2062 'mychips': '/assets/images/partners/mychips.svg', 2063 'bitlabs': '/assets/images/partners/bitlabs.svg', 2064 'torox': '/assets/images/partners/torox.svg', 2065 'adscend': '/assets/images/partners/adscendmedia.svg', 2066 'adscendmedia': '/assets/images/partners/adscendmedia.svg', 2067 'hangmyads': '/assets/images/partners/hangmyads.webp', 2068 'mmwall': '/assets/images/partners/mmwall.svg', 2069 'cpx': '/assets/images/partners/cpxresearch.svg', 2070 'cpxresearch': '/assets/images/partners/cpxresearch.svg', 2071 'theoremreach': '/assets/images/partners/theoremreach.webp', 2072 'timewall': '/assets/images/partners/timewall.webp', 2073 'pixylabs': '/assets/images/partners/pixylabs.webp', 2074 'gemiad': '/assets/images/partners/gemi-ad-logo.webp', 2075 'primesurvey': '/assets/images/partners/prime.svg', 2076 'primeinsights': '/assets/images/partners/prime.svg', 2077 'primeearnoffers': '/assets/images/partners/primeearn.svg', 2078 'primeearn': '/assets/images/partners/primeearn.svg', 2079 'lootably': '/assets/images/partners/lootably.webp', 2080 'ayetstudios': '/assets/images/partners/gametastic.webp', 2081 'gametastic': '/assets/images/partners/gametastic.webp', 2082 'adtowall': '/assets/images/partners/adtowall.svg', 2083 'upwall': '/assets/images/partners/upwall.png', 2084 'revtoo': '/assets/images/partners/revtoo.svg', 2085 'taprain': '/assets/images/partners/taplogo.webp', 2086 'sharklio': '/assets/images/partners/sharklio.webp', 2087 }; 2088 const key = (providerName || '').toLowerCase().replace(/[\s_-]+/g, ''); 2089 return map[key] || '/assets/images/default-offer.webp'; 2090 } 2091 2092 function openOfferModal(offerId, type) { 2093 const offer = window.popularOffersData.find(o => o.id == offerId); 2094 if (!offer) return; 2095 window.__ofrCurrentOffer = offerId; 2096 if (window.OfferReviews) OfferReviews.load(offerId, document.querySelector('#popular-reviews .ofr-mount'), document.getElementById('earnOfrStars'), document.getElementById('earnOfrHero')); 2097 window._currentOfferMaxHold = null; 2098 const _hBody = document.getElementById('popular-holds-body'); 2099 if (_hBody) { _hBody.innerHTML = ''; delete _hBody.dataset.built; } 2100 2101 const modalId = 'popularOfferModal'; 2102 const modal = document.getElementById(modalId); 2103 if (!modal) return; 2104 2105 const ids = { 2106 image: 'modalOfferImage', 2107 title: 'modalOfferTitle', 2108 reward: 'modalOfferReward', 2109 devices: 'modalOfferDevices', 2110 status: 'popularStatusBadge', 2111 provider: 'modalProviderImage', 2112 description: 'modalOfferDescription', 2113 requirements: 'modalOfferRequirements', 2114 playBtn: 'modalPlayBtn' 2115 }; 2116 2117 if (type === 'popular' && offer.detail_impression_url) { 2118 fireImpressionPixel(offer.detail_impression_url); 2119 } 2120 2121 (function(){ 2122 var _mi = document.getElementById(ids.image); 2123 _mi.classList.remove('is-small-icon');
2124 _mi.onload = function(){ if (this.naturalWidth && this.naturalWidth <= 150) this.classList.add('is-small-icon'); }; 2125 _mi.src = offer.icon_url || '/assets/images/default-offer.webp'; 2126 })(); 2127 (function(){ var _hu=offer.icon_url||''; var _hdr=document.querySelector('#popularOfferModal .popular-offer-modal-header'); if(_hdr){ if(_hu){ _hdr.style.setProperty('--ofr-hero','url("'+_hu.replace(/["\\]/g,'')+'")'); _hdr.classList.add('ofr-has-hero'); } else { _hdr.classList.remove('ofr-has-hero'); } } })(); 2128 2129 const title = offer.title.length > 60 ? offer.title.substring(0, 57) + '...' : offer.title; 2130 document.getElementById(ids.title).textContent = title; 2131 document.getElementById(ids.title).title = offer.title; 2132 2133 document.getElementById(ids.reward).innerHTML = (type === 'popular') ? offer.reward_display : `$${formatAmountExact(offer.payout)}`; 2134 2135 document.getElementById(ids.status).className = 'modal-status-badge status-loading'; 2136 document.getElementById(ids.status).textContent = '...'; 2137 const providerName = offer.provider || ((type === 'popular') ? 'MyChips' : 'BitLabs'); 2138 const providerImgEl = document.getElementById(ids.provider); 2139 providerImgEl.src = getProviderLogoUrl(providerName); 2140 providerImgEl.alt = providerName; 2141 document.getElementById(ids.description).innerHTML = formatOfferDescription(offer.description || offer.full_description); 2142 2143 const devicesContainer = document.getElementById(ids.devices); 2144 devicesContainer.innerHTML = getDeviceIcons(offer.devices && offer.devices.length ? offer.devices : offer.categories); 2145 2146 const reqContainer = document.getElementById(ids.requirements); 2147 2148 let requirementsList = []; 2149 let conditionsHTML = ''; 2150 2151 const isBitlabsOffer = (offer.provider || '').toLowerCase().includes('bitlabs'); 2152 if (type === 'task' || (isBitlabsOffer && Array.isArray(offer.bitlabs_events) && offer.bitlabs_events.length > 0)) { 2153 if (offer.bitlabs_events && offer.bitlabs_events.length > 0) { 2154 requirementsList = offer.bitlabs_events.map(event => ({ 2155 text: event.name, 2156 payout: event.payout 2157 })); 2158 } 2159 2160 const thingsToKnow = offer.things_to_know || []; 2161 if (thingsToKnow.length > 0) { 2162 const conditionsContainer = document.getElementById('popularModalConditionsSection'); 2163 const conditionsList = document.getElementById('popularModalOfferConditions'); 2164 if (conditionsContainer && conditionsList) { 2165 conditionsHTML = thingsToKnow.map(condition => `<li>${escapeHtml(String(condition))}</li>`).join(''); 2166 conditionsList.innerHTML = conditionsHTML; 2167 conditionsContainer.style.display = 'block'; 2168 } 2169 } else { 2170 const conditionsContainer = document.getElementById('popularModalConditionsSection'); 2171 if (conditionsContainer) conditionsContainer.style.display = 'none'; 2172 } 2173 } else { 2174 requirementsList = parseRequirements(offer.requirements); 2175 } 2176 2177 if (requirementsList.length === 0) { 2178 requirementsList.push({ text: 'Complete the offer as instructed to earn the full reward.', payout: offer.payout || 0 }); 2179 } 2180 2181 reqContainer.innerHTML = '<li style="justify-content: center; padding: 2rem;"><div class="spinner"></div></li>'; 2182 2183 (function() { 2184 const holdOrder = ['Instant','3 hours','6 hours','12 hours','1 day','2 days','3 days','5 days','7 days','10 days','12 days','14 days','20 days','30 days','45 days']; 2185 let maxIdx = 0; 2186 requirementsList.forEach(function(req) { 2187 const payout = req.boostedPayout || req.payout || 0; 2188 if (payout > 0) { 2189 const h = _offerEstHold(payout); 2190 const idx = holdOrder.indexOf(h); 2191 if (idx > maxIdx) maxIdx = idx; 2192 } 2193 }); 2194 window._currentOfferMaxHold = maxIdx === 0 ? 'Instant' : holdOrder[maxIdx]; 2195 const _holdsTabBtn = document.querySelector('#popularOfferModal .modal-tab[onclick*="popular-holds"]'); 2196 if (_holdsTabBtn) _holdsTabBtn.style.display = window._currentOfferMaxHold === 'Instant' ? 'none' : ''; 2197 })(); 2198 2199 checkOfferProgress(offer.id, type).then(progressData => { 2200 const progressKeys = Object.keys(progressData); 2201 const hasProgress = progressKeys.length > 0; 2202 const completedSteps = progressKeys.filter(key => progressData[key] === 'completed').length; 2203 const inProgressSteps = progressKeys.filter(key => progressData[key] === 'in-progress').length; 2204 2205 const statusElement = document.getElementById(ids.status); 2206 if (completedSteps > 0) { 2207 if (completedSteps === requirementsList.length) { 2208 statusElement.textContent = 'â Completed'; 2209 statusElement.className = 'modal-status-badge status-completed'; 2210 } else { 2211 statusElement.textContent = `${completedSteps}/${requirementsList.length} Completed`; 2212 statusElement.className = 'modal-status-badge status-completed'; 2213 } 2214 } else if (inProgressSteps > 0 || hasProgress) { 2215 statusElement.textContent = 'In Progress'; 2216 statusElement.className = 'modal-status-badge status-in-progress'; 2217 } else { 2218 statusElement.textContent = 'Not Started'; 2219 statusElement.className = 'modal-status-badge status-not-started'; 2220 } 2221 2222 reqContainer.innerHTML = requirementsList.map((req, index) => { 2223 const progressStatus = progressData[index] || 'pending'; 2224 let progressIcon = ''; 2225 let progressClass = ''; 2226 2227 if (progressStatus === 'completed') { 2228 progressIcon = '<i class="fas fa-check-circle" style="color: #00ff88; margin-right: 8px;"></i>'; 2229 progressClass = 'step-completed'; 2230 } else if (progressStatus === 'in-progress') { 2231 progressIcon = '<i class="fas fa-clock" style="color: #ffd700; margin-right: 8px;"></i>'; 2232 progressClass = 'step-started'; 2233 } else { 2234 progressIcon = '<i class="far fa-circle" style="color: #666; margin-right: 8px;"></i>'; 2235 } 2236 2237 const offerBonusPct = offer.bonus_percent || 0; 2238 const boosted = req.boostedPayout || (offerBonusPct > 0 && req.payout > 0 ? req.payout * (1 + offerBonusPct/100) : 0); 2239 const displayPayout = boosted || req.payout; 2240 const stepPayoutHtml = req.payout > 0 2241 ? (boosted > 0 2242 ? `<div class="step-payout notranslate step-payout-bonus"><span class="step-payout-orig">
2242$${formatAmountExact(req.payout)}</span><span>$${formatAmountExact(boosted)}</span></div>` 2243 : `<div class="step-payout notranslate">$${formatAmountExact(req.payout)}</div>`) 2244 : ''; 2245 const lockBadge = _mkEarnHoldBadge(displayPayout); 2246 return `<li class="${progressClass}">${progressIcon}<div class="step-text">${escapeHtml(req.text)}</div><div class="step-right">${stepPayoutHtml}${lockBadge}</div></li>`; 2247 }).join(''); 2248 }); 2249 2250 const playBtn = document.getElementById(ids.playBtn); 2251 const offerClickUrl = offer.id ? ('/offer/' + encodeURIComponent(offer.id)) : ''; 2252 2253 const trackingProvider = offer.provider ? offer.provider.toLowerCase().replace(/[\s_-]+/g, '') : 'mychips'; 2254 2255 const freshBtn = playBtn.cloneNode(true); 2256 playBtn.parentNode.replaceChild(freshBtn, playBtn); 2257 freshBtn.href = offerClickUrl || '#'; 2258 freshBtn.target = '_blank'; 2259 freshBtn.rel = 'noopener noreferrer'; 2260 const earnAmount = (type === 'popular') ? offer.reward_display : `$${formatAmountExact(offer.payout)}`; 2261 const _btnBonusPct = offer.bonus_percent || 0; 2262 const _btnOrigPay = offer.original_payout_usd || 0; 2263 const _btnIsCoin = offer.is_coin_display || false; 2264 const _btnOrigDisp = _btnIsCoin 2265 ? Math.round(_btnOrigPay).toLocaleString() + ' SC' 2266 : `$${formatAmountExact(_btnOrigPay)}`; 2267 const earnHtml = (_btnBonusPct > 0 && _btnOrigPay > 0) 2268 ? `${earnAmount}<span style="text-decoration:line-through;opacity:.6;font-size:.88em;margin-left:3px;">${_btnOrigDisp}</span>` 2269 : earnAmount; 2270 freshBtn.innerHTML = `<i class="fas fa-play"></i> Earn ${earnHtml} Now!`; 2271 2272 if (!userId || userId === '0') { 2273 const _qrOvHPg = document.getElementById('earnQROverlayHighPay'); 2274 const _qrOvPopg = document.getElementById('earnQROverlayPopular'); 2275 if (_qrOvHPg) _qrOvHPg.style.display = 'none'; 2276 if (_qrOvPopg) _qrOvPopg.style.display = 'none'; 2277 const _offerBonusG = offer.bonus_percent || 0; 2278 reqContainer.innerHTML = requirementsList.map(req => { 2279 const _boosted = req.boostedPayout || (_offerBonusG > 0 && req.payout > 0 ? req.payout * (1 + _offerBonusG/100) : 0); 2280 const _dispPay = _boosted || req.payout; 2281 const _spHtml = req.payout > 0 2282 ? (_boosted > 0 2283 ? `<div class="step-payout notranslate step-payout-bonus"><span class="step-payout-orig">$${formatAmountExact(req.payout)}</span><span>$${formatAmountExact(_boosted)}</span></div>` 2284 : `<div class="step-payout notranslate">$${formatAmountExact(req.payout)}</div>`) 2285 : ''; 2286 const _gLock = _mkEarnHoldBadge(_dispPay); 2287 return `<li><i class="far fa-circle" style="color:#666;margin-right:8px;"></i><div class="step-text">${escapeHtml(req.text)}</div><div class="step-right">${_spHtml}${_gLock}</div></li>`; 2288 }).join(''); 2289 document.getElementById(ids.status).textContent = 'Sign Up to Earn'; 2290 document.getElementById(ids.status).className = 'modal-status-badge status-not-started'; 2291 freshBtn.removeAttribute('href'); 2292 freshBtn.removeAttribute('target'); 2293 freshBtn.innerHTML = '<i class="fas fa-user-plus"></i> Sign Up!'; 2294 freshBtn.style.background = 'linear-gradient(135deg, #00e5ff, #0ea5e9)'; 2295 freshBtn.addEventListener('click', (e) => { 2296 e.preventDefault(); 2297 modal.classList.remove('show'); 2298 document.body.classList.remove('offer-modal-open'); 2299 if (typeof openAuthModal === 'function') openAuthModal('register'); 2300 }); 2301 modal.classList.add('show'); 2302 document.body.classList.add('offer-modal-open'); 2303 return; 2304 } 2305 const _qrOvHP = document.getElementById('earnQROverlayHighPay'); 2306 const _qrOvPop = document.getElementById('earnQROverlayPopular'); 2307 if (_qrOvHP) _qrOvHP.style.display = 'none'; 2308 if (_qrOvPop) _qrOvPop.style.display = 'none'; 2309 2310 freshBtn.addEventListener('click', (e) => { 2311 e.stopPropagation(); 2312 const _earnDevs = Array.isArray(offer.devices) ? offer.devices : []; 2313 if (!offerAvailableForPlatform(_earnDevs, detectUserPlatform())) { 2314 e.preventDefault(); 2315 earnShowQR(offer, type); 2316 return; 2317 } 2318 if (navigator.sendBeacon) { 2319 const fd = new FormData(); 2320 fd.append('action', 'track_offer_click'); 2321 fd.append('offer_id', offer.id); 2322 fd.append('provider', trackingProvider); 2323 fd.append('csrf_token', window.csrfToken); 2324 fd.append('offer_title', offer.title || ''); 2325 fd.append('offer_icon_url', offer.icon_url || ''); 2326 const _p = offer.user_payout_usd || offer.payout || parseFloat((offer.reward_display || '').replace(/[^0-9.]/g, '')) || 0; 2327 if (_p > 0) fd.append('offer_payout_usd', _p); 2328 fd.append('offer_description', offer.full_description || offer.description || ''); 2329 fd.append('offer_requirements', offer.requirements || ''); 2330 fd.append('offer_devices', Array.isArray(offer.devices) ? offer.devices.join(',') : ''); 2331 fd.append('offer_provider_display', offer.provider || ''); 2332 navigator.sendBeacon('/api/secure_handler.php', fd); 2333 } else { 2334 trackOfferClick(offer.id, trackingProvider, offer).catch(() => {}); 2335 } 2336 const statusEl = document.getElementById(ids.status); 2337 if (statusEl && statusEl.classList.contains('status-not-started')) { 2338 statusEl.textContent = 'In Progress'; 2339 statusEl.className = 'modal-status-badge status-in-progress'; 2340 } 2341 }); 2342 2343 const POPULAR_WALL_MAP = {'mychips':'mychips','bitlabs':'bitlabs-offers','torox':'torox','timewall':'timewall','cpxresearch':'cpxresearch','cpx':'cpxresearch','hangmyads':'hangmyads','mmwall':'mmwall','adscen
2343dmedia':'adscendmedia','adscend':'adscendmedia','ayetstudios':'gametastic','gametastic':'gametastic','polltastic':'polltastic','pixylabs':'pixylabs','gemiad':'gemiad','lootably':'lootably'}; 2344 const activityBtnId = 'popularActivityBtn'; 2345 const activityBtn = document.getElementById(activityBtnId); 2346 if (activityBtn) { 2347 const pKey = (offer.provider || '').toLowerCase().replace(/[\s_-]+/g, ''); 2348 const wallProvider = POPULAR_WALL_MAP[pKey] || null; 2349 activityBtn._wallProvider = wallProvider; 2350 activityBtn.style.display = wallProvider ? 'flex' : 'none'; 2351 } 2352 2353 const _provLower = (offer.provider || '').toLowerCase(); 2354 const _hideCoinRate = _provLower.includes('hangmyads') || _provLower.includes('taprain'); 2355 document.querySelectorAll('.earn-coin-rate-info').forEach(el => { 2356 el.style.display = _hideCoinRate ? 'none' : ''; 2357 }); 2358 2359 // Prime Earn: a lista-vegpontjuk nem kuld leirast es lepeseket, azok csak az ajanlat 2360 // reszletek-vegpontjan erhetok el. Ugyanaz a lekeres, mint az offers oldalon 2361 // (tabs/offers.php) - enelkul itt ures "About" es egyetlen altalanos lepes latszik. 2362 if ((offer.provider || '').toLowerCase().replace(/[\s_-]+/g, '') === 'primeearn' && offer.primeearn_hash) { 2363 const _peFd = new FormData(); 2364 _peFd.append('action', 'primeearn_offer_detail'); 2365 _peFd.append('hash', offer.primeearn_hash); 2366 _peFd.append('csrf_token', window.csrfToken || ''); 2367 fetch('/api/secure_handler.php', { method: 'POST', credentials: 'same-origin', body: _peFd }) 2368 .then(r => r.json()) 2369 .then(data => { 2370 if (!data.success) return; 2371 if (data.description) { 2372 const _dEl = document.getElementById(ids.description); 2373 if (_dEl) _dEl.innerHTML = formatOfferDescription(data.description); 2374 } 2375 if (data.rewards && data.rewards.length > 0) { 2376 reqContainer.innerHTML = data.rewards.map(r => { 2377 const _pay = parseFloat(r.payout) || 0; 2378 const _sp = _pay > 0 2379 ? `<div class="step-payout notranslate">$${formatAmountExact(_pay)}</div>` 2380 : ''; 2381 return `<li><i class="far fa-circle" style="color:#666;margin-right:8px;"></i><div class="step-text">${r.task}</div><div class="step-right">${_sp}${_mkEarnHoldBadge(_pay)}</div></li>`; 2382 }).join(''); 2383 } 2384 }) 2385 .catch(() => {}); 2386 } 2387 modal.classList.add('show'); 2388 document.body.classList.add('offer-modal-open'); 2389 pushModalBack(); 2390 } 2391 2392 function detectUserPlatform() { 2393 const ua = navigator.userAgent; 2394 if (/iPhone|iPad|iPod/i.test(ua)) return 'ios'; 2395 if (/Android/i.test(ua)) return 'android'; 2396 const isTouchCapable = (navigator.maxTouchPoints > 0) || ('ontouchstart' in window); 2397 if (isTouchCapable) { 2398 return /Mac/i.test(ua) ? 'ios' : 'android'; 2399 } 2400 return 'desktop'; 2401 } 2402 function offerAvailableForPlatform(devs, platform) { 2403 if (!devs || !devs.length) return true; 2404 const normalized = devs.map(d => d.toLowerCase() === 'web' ? 'desktop' : d.toLowerCase()); 2405 const deduped = [...new Set(normalized)]; 2406 if (deduped.includes('all')) return true; 2407 return deduped.includes(platform); 2408 } 2409 function earnShowQR(offer, type) { 2410 const overlayId = 'earnQROverlayPopular'; 2411 const imgId = (type === 'popular') ? 'earnQRImgPopular' : 'earnQRImgHighPay'; 2412 const devsId = (type === 'popular') ? 'earnQRDevsPopular' : 'earnQRDevsHighPay'; 2413 const overlay = document.getElementById(overlayId); 2414 const qrImg = document.getElementById(imgId); 2415 const qrDevs = document.getElementById(devsId); 2416 if (!overlay || !qrImg) return; 2417 if (qrDevs) { 2418 const devMap = {android:'fab fa-android', ios:'fab fa-apple'}; 2419 const devs = (Array.isArray(offer.devices) ? offer.devices : []).map(d => d.toLowerCase()).filter(d => devMap[d]); 2420 qrDevs.innerHTML = [...new Set(devs)].map(d => `<i class="${devMap[d]}" style="margin:0 3px" title="${d}"></i>`).join(''); 2421 } 2422 qrImg.style.opacity = '0'; 2423 qrImg.src = ''; 2424 overlay.style.display = 'flex'; 2425 const qrUrl = offer.id ? (window.location.origin + '/offer/' + encodeURIComponent(offer.id)) : window.location.href; 2426 qrImg.onload = () => { qrImg.style.opacity = '1'; }; 2427 qrImg.src = 'https://api.qrserver.com/v1/create-qr-code/?size=240x240&data=' + encodeURIComponent(qrUrl); 2428 } 2429 window.earnCloseQR = function(type) { 2430 const overlayId = 'earnQROverlayPopular';
2431 const overlay = document.getElementById(overlayId); 2432 if (overlay) overlay.style.display = 'none'; 2433 }; 2434 2435 function openWallForProvider(wallProvider) { 2436 const card = document.querySelector(`.partner-card[data-provider="${CSS.escape(wallProvider)}"]`); 2437 if (card && !card.classList.contains('placeholder') && !card.classList.contains('partner-card--unavailable')) { 2438 card.click(); 2439 } 2440 } 2441 2442 document.addEventListener('DOMContentLoaded', function loadFeaturedSurveys() { 2443 const grid = document.getElementById('featuredSurveysGrid'); 2444 if (!grid) return; 2445 2446 const LOGO_MAP = { 2447 cpx: '/assets/images/partners/cpxresearch.svg', 2448 bitlabs: '/assets/images/partners/bitlabs.svg', 2449 ayetstudios: '/assets/images/partners/polltastic.webp', 2450 primesurveys: '/assets/images/partners/prime.svg', 2451 adscendmedia: '/assets/images/partners/adscendmedia.svg', 2452 timewall: '/assets/images/partners/timewall.webp', 2453 cherries: '/assets/images/partners/cherries.webp' 2454 }; 2455 const SURVEY_MAINTENANCE_PROVIDERS = []; // add a provider key (e.g. 'bitlabs') to grey its cards out 2456 let TIMEWALL_PRESCREENER = false; 2457 const LOGO_ALT = { 2458 cpx: 'CPX Research', bitlabs: 'BitLabs', ayetstudios: 'Polltastic', 2459 primesurveys: 'Prime Surveys', adscendmedia: 'AdScend Media', timewall: 'TimeWall', 2460 cherries: 'Cherries' 2461 }; 2462 2463 function buildCard(s) { 2464 const provider = s.provider || 'cpx'; 2465 const payout = parseFloat(s.payout) || 0; 2466 const usd = provider === 'cpx' ? (payout / 1000).toFixed(3) : payout.toFixed(3); 2467 const link = s.href || '#'; 2468 const rating = parseFloat(provider === 'cpx' ? s.statistics_rating_avg : s.rating) || 0; 2469 const loi = s.loi || 0; 2470 const bonusPct = parseFloat(s.bonus_percent) || 0; 2471 const origPayout = parseFloat(s.original_payout) || 0; 2472 const origUsd = provider === 'cpx' ? (origPayout / 1000).toFixed(3) : origPayout.toFixed(3); 2473 const tierClass = parseFloat(usd) < 0.5 ? 'yellow-tier' : parseFloat(usd) < 1.0 ? 'blue-tier' : 'green-tier'; 2474 const logo = LOGO_MAP[provider] || LOGO_MAP.cpx; 2475 const alt = LOGO_ALT[provider] || 'Survey'; 2476 const payoutHtml = bonusPct > 0 && origPayout > 0 2477 ? `<span class="payout-original-survey">$${origUsd}</span>$${usd}` 2478 : `$${usd}`; 2479 const badgeHtml = bonusPct > 0 ? `<div class="survey-bonus-badge">+${bonusPct}%</div>` : ''; 2480 const ratingHtml = rating > 0 2481 ? `<div class="survey-rating"><i class="fas fa-star"></i> ${parseFloat(rating).toFixed(1)}</div>` 2482 : `<div class="survey-rating survey-rating--empty"><i class="fas fa-star"></i></div>`; 2483 const durHtml = loi > 0 ? `<div class="survey-duration"><i class="fas fa-clock"></i> ${loi} min</div>` : ''; 2484 2485 // Same maintenance list as the surveys tab - empty means every 2486 // provider is open. (BitLabs paused 2026-08-26, reopened 2026-09-02.) 2487 const isMaintenance = SURVEY_MAINTENANCE_PROVIDERS.includes(provider); 2488 const card = document.createElement('div'); 2489 card.className = `survey-card ${tierClass}${isMaintenance ? ' maintenance-survey' : ''}`; 2490 if (isMaintenance) card.style.cssText = 'opacity:.45;cursor:not-allowed;filter:grayscale(1);pointer-events:none;'; 2491 const needsProfile = (provider === 'timewall') && TIMEWALL_PRESCREENER; 2492 const overlayHtml = isMaintenance 2493 ? `<div class="survey-overlay" style="opacity:1;font-size:.9rem;line-height:1.4;background:rgba(0,0,0,.85);flex-direction:column;text-align:center;padding:.5rem;"><i class="fas fa-tools" style="font-size:1.5rem;display:block;margin-bottom:.5rem"></i>Under maintenance</div>` 2494 : (needsProfile 2495 ? `<div class="survey-overlay" style="opacity:1;font-size:.88rem;line-height:1.35;background:rgba(0,0,0,.82);flex-direction:column;text-align:center;padding:.5rem;"><i class="fas fa-user-edit" style="font-size:1.4rem;display:block;margin-bottom:.4rem"></i>Quick profile check<br><span style="font-size:.76rem;opacity:.85">one time only, to unlock this survey</span></div>` 2496 : `<div class="survey-overlay">Start Survey</div>`); 2497 card.innerHTML = `<div class="survey-payout notranslate">${payoutHtml}</div>${badgeHtml}<div class="survey-image"><img src="${logo}" alt="${alt}" loading="lazy"></div><div class="survey-title">Premium Survey</div>${durHtml}${overlayHtml}${ratingHtml}`; 2498 card.addEventListener('click', function() { 2499 if (isMaintenance) return; 2500 if (!link || link === '#') { window.location.href = '/surveys'; return; } 2501 if (navigator.userAgent.includes('SharkEarningsApp')) { 2502 window.location.href = link; 2503 } else { 2504 window.open(link, '_blank', 'noopener,noreferrer'); 2505 } 2506 }); 2507 return card; 2508 } 2509
2510 function renderSurveys(surveys) { 2511 const sorted = surveys.slice().sort((a, b) => { 2512 const pa = parseFloat(a.payout) || 0, pb = parseFloat(b.payout) || 0; 2513 const ua = a.provider === 'cpx' ? pa / 1000 : pa; 2514 const ub = b.provider === 'cpx' ? pb / 1000 : pb; 2515 return ub - ua; 2516 }); 2517 const top15 = sorted.slice(0, 15); 2518 grid.innerHTML = ''; 2519 top15.forEach(s => grid.appendChild(buildCard(s))); 2520 2521 const wrapper = grid.closest('.horizontal-scroll-wrapper'); 2522 if (wrapper) { 2523 const prevBtn = wrapper.querySelector('.scroll-btn.prev'); 2524 const nextBtn = wrapper.querySelector('.scroll-btn.next'); 2525 const updateBtns = () => { 2526 const max = grid.scrollWidth - grid.clientWidth; 2527 if (prevBtn) prevBtn.classList.toggle('disabled', grid.scrollLeft <= 1); 2528 if (nextBtn) nextBtn.classList.toggle('disabled', grid.scrollLeft >= max - 1); 2529 }; 2530 grid.addEventListener('scroll', updateBtns, { passive: true }); 2531 updateBtns(); 2532 if (prevBtn) prevBtn.addEventListener('click', () => grid.scrollBy({ left: -(155 + 13) * 2, behavior: 'smooth' })); 2533 if (nextBtn) nextBtn.addEventListener('click', () => grid.scrollBy({ left: (155 + 13) * 2, behavior: 'smooth' })); 2534 } 2535 } 2536 2537 function tryCache() { 2538 try { 2539 const d = localStorage.getItem('surveys_cache_v7'); 2540 const t = localStorage.getItem('surveys_cache_time_v7'); 2541 if (d && t && (Date.now() - parseInt(t)) < 20 * 60 * 1000) { 2542 const parsed = JSON.parse(d); 2543 if (parsed && parsed.surveys && parsed.surveys.length) return parsed.surveys; 2544 } 2545 } catch (e) {} 2546 return null; 2547 } 2548 2549 async function withAyetSurveys(data) { 2550 const base = (data && data.surveys) ? data.surveys : []; 2551 if (!data || !data.ayetstudios_config || data.ayetstudios_config.status !== 'success') return base; 2552 if (typeof fetchAyetStudiosSurveys !== 'function') return base; 2553 try { 2554 let ayet = await fetchAyetStudiosSurveys(data.ayetstudios_config); 2555 if (!ayet || !ayet.length) return base; 2556 const bonuses = data.survey_bonuses || {}; 2557 const slugMap = { ayetstudios: 'polltastic' }; 2558 ayet = ayet.map(s => { 2559 const slug = slugMap[s.provider] || s.provider; 2560 const pct = parseFloat(bonuses[slug] || 0); 2561 if (pct > 0) { 2562 const orig = parseFloat(s.payout) || 0; 2563 s.original_payout = orig; 2564 s.payout = Math.round(orig * (1 + pct / 100) * 100) / 100; 2565 s.bonus_percent = pct; 2566 } 2567 return s; 2568 }); 2569 return base.concat(ayet); 2570 } catch (e) { 2571 return base; 2572 } 2573 } 2574 2575 const cached = tryCache(); 2576 if (cached) { 2577 renderSurveys(cached); 2578 return; 2579 } 2580 2581 fetch('/api/get_surveys.php?sw=' + (window.screen?.width || 0) + '&sh=' + (window.screen?.height || 0)) 2582 .then(r => r.json()) 2583 .then(async data => { 2584 // TimeWall serves profile-completion links until the prescreener is done. 2585 TIMEWALL_PRESCREENER = !!data.timewall_prescreener; 2586 const surveys = await withAyetSurveys(data); 2587 if (surveys && surveys.length) { 2588 try { 2589 // Never cache a prescreener list - it goes stale the moment 2590 // the user completes their TimeWall profile. 2591 if (!data.timewall_prescreener && !data.no_cache) { 2592 localStorage.setItem('surveys_cache_v7', JSON.stringify({ ...data, surveys })); 2593 localStorage.setItem('surveys_cache_time_v7', Date.now().toString()); 2594 } 2595 } catch (e) {} 2596 renderSurveys(surveys); 2597 } else { 2598 const section = document.getElementById('featured-surveys'); 2599 if (section) section.style.display = 'none'; 2600 } 2601 }) 2602 .catch(() => { 2603 const section = document.getElementById('featured-surveys'); 2604 if (section) section.style.display = 'none'; 2605 }); 2606 }); 2607 2608 </script>
2608 2609 2610 2611 </head> <body class="no-sidebar-layout sidebar-collapsed full-width-content has-live-ticker"> 2612 <a class="skip-link" href="#skip-target">Skip to main content</a> 2613
2613<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 2614(function(){try{ 2615 if(sessionStorage.getItem('rwSkipLoader')!=='1')return; 2616 sessionStorage.removeItem('rwSkipLoader'); 2617 var de = document.documentElement; 2618 de.classList.add('pt-skip'); 2619 de.classList.add('pt-soft'); 2620}catch(e){}})(); 2621</script>
2621 2622<div id="pt"><div id="pt-c"><div id="pt-r1"></div><div id="pt-r2"></div><img src="/assets/images/logos/sharklogo.webp" alt="" id="pt-logo" width="120" height="115"></div></div> 2623<style nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">html,body{background:#00070f}html.pt-skip #pt{display:none} 2624html.pt-soft #pt{display:none!important} 2625html.pt-soft main{animation:pt-soft-in .32s ease both} 2626@keyframes pt-soft-in{from{opacity:0}to{opacity:1}} 2627@media (prefers-reduced-motion:reduce){html.pt-soft main{animation:none}} 2628#pt{position:fixed;inset:0;z-index:2147483647;background:#00070f;display:flex;align-items:center;justify-content:center;opacity:1;pointer-events:all}#pt-c{position:relative;width:68px;height:68px;display:flex;align-items:center;justify-content:center}#pt-logo{width:68px;height:68px;object-fit:cover;border-radius:50%;filter:drop-shadow(0 0 12px rgba(0,229,255,.45))} 2629#pt-c::after{content:"";position:absolute;inset:-14px;border-radius:50%;background:radial-gradient(circle,rgba(0,229,255,.30) 0,rgba(0,229,255,0) 70%);pointer-events:none;opacity:0;animation:pt-pulse 2s ease-in-out infinite}#pt-r1{position:absolute;inset:-10px;border-radius:50%;border:2px solid transparent;border-top-color:#00e5ff;border-right-color:rgba(0,229,255,.3);animation:pt-cw .9s linear infinite}#pt-r2{position:absolute;inset:-18px;border-radius:50%;border:1.5px solid transparent;border-bottom-color:rgba(0,229,255,.5);border-left-color:rgba(0,229,255,.15);animation:pt-ccw 1.4s linear infinite}@keyframes pt-cw{to{transform:rotate(360deg)}}@keyframes pt-ccw{to{transform:rotate(-360deg)}}@keyframes pt-pulse{0%,100%{opacity:0}50%{opacity:1}}#pt.pt-out{opacity:0;pointer-events:none;transition:opacity .45s ease}body.loaded{overflow-x:hidden;overflow-y:auto}body.pt-content-in>main{animation:pt-in .55s cubic-bezier(.22,1,.36,1) both}@keyframes pt-in{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}@media (prefers-reduced-motion:reduce){#pt.pt-out{transition:opacity .2s ease}body.pt-content-in>main{animation:none}} 2630img.skl{background:linear-gradient(100deg,rgba(148,190,233,.07) 40%,rgba(148,190,233,.16) 50%,rgba(148,190,233,.07) 60%);background-size:200% 100%;animation:skl-sh 1.1s linear infinite;border-radius:8px;min-width:32px;min-height:32px} 2631@keyframes skl-sh{to{background-position:-200% 0}} 2632@media (prefers-reduced-motion:reduce){img.skl{animation:none}}</style>
2633<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 2634(function(){var pt=document.getElementById('pt'),chat,hidden=false;document.body.classList.add('loaded');window.showSharkLoader=function(){if(!pt)return;hidden=false;pt.style.transition='';pt.classList.remove('pt-out');pt.style.opacity='1';pt.style.pointerEvents='all'};function signalWebReady(){try{if(window.flutter_inappwebview&&window.flutter_inappwebview.callHandler){window.flutter_inappwebview.callHandler('webReady')}}catch(e){}}window.hideSharkLoader=function(){if(!pt||hidden)return;hidden=true;signalWebReady();requestAnimationFrame(function(){document.body.classList.add('pt-content-in');pt.classList.add('pt-out');setTimeout(function(){if(!pt.classList.contains('pt-out'))return;chat=chat||document.getElementById('publicChatTrigger');if(chat)chat.style.cssText='display:flex;opacity:1;transform:scale(1);pointer-events:auto'},350)})}; 2635var reveal=window.revealSharkLoader=function(){var t0=Date.now();(function chk(){var ps=[].filter.call(document.querySelectorAll('link[rel="preload"][as="style"]'),function(l){var h=l.getAttribute('href')||'';return h.charAt(0)==='/'||h.indexOf(location.origin)===0;});if(!ps.length||Date.now()-t0>2500){setTimeout(window.hideSharkLoader,120)}else{setTimeout(chk,50)}})()}; 2636if(document.readyState!=='loading'){reveal()}else{document.addEventListener('DOMContentLoaded',reveal)} 2637window.addEventListener('load',window.hideSharkLoader); 2638setTimeout(window.hideSharkLoader,6000);})(); 2639(function(){ 2640function unskl(img){img.classList.remove('skl')} 2641 2642var sklIO = ('IntersectionObserver' in window) ? new IntersectionObserver(function(es){ 2643 es.forEach(function(e){ 2644 if(!e.isIntersecting)return; 2645 var img=e.target; 2646 sklIO.unobserve(img); 2647 if(!(img.complete&&img.naturalWidth))img.classList.add('skl'); 2648 img.loading='eager'; 2649 if(!img.complete){var ss=img.getAttribute('src');if(ss){img.src=ss;}} 2650 }); 2651},{rootMargin:'300px'}) : null; 2652 2653function mark(img){ 2654 if(img.complete&&img.naturalWidth)return; 2655 var retried=false; 2656 img.addEventListener('load',function(){unskl(img)},{once:true}); 2657 img.addEventListener('error',function(){ 2658 if(!retried&&img.getAttribute('src')){retried=true;var s=img.src;setTimeout(function(){img.src=s.split('#')[0]+'#r'+Date.now()},800);} 2659 else{unskl(img);} 2660 }); 2661 if(img.loading==='lazy'&&sklIO){ 2662 sklIO.observe(img); 2663 }else{ 2664 img.classList.add('skl'); 2665 if(img.loading==='lazy')img.loading='eager'; 2666 } 2667} 2668function scan(root){if(root.querySelectorAll)root.querySelectorAll('img').forEach(mark)} 2669if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',function(){scan(document)})}else{scan(document)} 2670new MutationObserver(function(ms){ms.forEach(function(m){m.addedNodes.forEach(function(n){if(n.tagName==='IMG'){mark(n)}else if(n.querySelectorAll){scan(n)}})})}).observe(document.documentElement,{childList:true,subtree:true}); 2671})(); 2672</script>
2672 2673 2674 2675
2675<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 2676function seEscHtml(s) { return String(s ?? '').replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); } 2677(function() { 2678 'use strict'; 2679 2680 // A DB a magyar (Europe/Budapest) fali orat tarolja, NEM UTC-t. Ha a 2681 // "YYYY-MM-DD HH:MM:SS" stringet a bongeszo a sajat idozonajaban parszolja 2682 // (vagy 'Z'-vel UTC-nek vesszuk), a datum elcsuszik. Komponensre bontjuk es 2683 // UTC-be tesszuk, majd timeZone:'UTC'-vel formazzuk - igy minden bongeszo 2684 // pontosan a magyar ido szerinti datumot latja. 2685 function shkDate(s) { 2686 if (!s) return null; 2687 var m = String(s).match(/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})(?::(\d{2}))?/); 2688 if (!m) { var f = new Date(s); return isNaN(f.getTime()) ? null : f; } 2689 return new Date(Date.UTC(+m[1], +m[2] - 1, +m[3], +m[4], +m[5], +(m[6] || 0))); 2690 } 2691 2692 // Europe/Budapest abbreviation for a given DB timestamp. Derived from the 2693 // timestamp's own date, not from "now", so a January row is labelled CET even 2694 // when it is viewed in July. CEST runs from the last Sunday of March to the 2695 // last Sunday of October (the one-hour changeover window itself is not split 2696 // out - it would only mislabel rows inside those 60 minutes, twice a year). 2697 function shkTzLabel(s) { 2698 var m = String(s || '').match(/^(\d{4})-(\d{2})-(\d{2})/); 2699 if (!m) return 'CET'; 2700 var y = +m[1], mo = +m[2], d = +m[3]; 2701 if (mo > 3 && mo < 10) return 'CEST'; 2702 if (mo < 3 || mo > 10) return 'CET'; 2703 // last Sunday of the month: day 0 of the next month is its last day 2704 var last = new Date(Date.UTC(y, mo, 0)); 2705 var lastSunday = last.getUTCDate() - last.getUTCDay(); 2706 return mo === 3 ? (d >= lastSunday ? 'CEST' : 'CET') 2707 : (d >= lastSunday ? 'CET' : 'CEST'); 2708 } 2709 2710 const injectCSS = () => { 2711 const css = `.user-profile-link{color:inherit;text-decoration:none;cursor:pointer;opacity:.7;transition:opacity .2s}.user-profile-link:hover{opacity:1;text-decoration:underline}#userProfileModal{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,7,15,.85);display:flex;align-items:center;justify-content:center;z-index:30000;opacity:0;padding:15px;box-sizing:border-box;animation:.3s ease-out forwards fadeIn;-webkit-overflow-scrolling:touch}#userProfileModal .modal-content{position:relative;width:100%;max-width:750px;max-height:90vh;background:radial-gradient(circle,#041a3b 0,var(--deep-ocean-start) 80%);border:1px solid var(--panel-border);border-radius:1.5rem;overflow-y:auto;transform:scale(.9);animation:.3s ease-out forwards modalSlideIn;scrollbar-width:thin;scrollbar-color:var(--accent-primary) var(--deep-ocean-start);-webkit-overflow-scrolling:touch;touch-action:pan-y}#userProfileModal .modal-content::-webkit-scrollbar{width:8px}#userProfileModal .modal-content::-webkit-scrollbar-track{background:var(--deep-ocean-start)}#userProfileModal .modal-content::-webkit-scrollbar-thumb{background:var(--accent-primary);border-radius:4px}@keyframes fadeIn{to{opacity:1}}@keyframes modalSlideIn{to{transform:scale(1)}}#userProfileModal .modal-header{display:none}#userProfileModal .modal-title-bar{position:sticky;top:0;z-index:10;display:flex;align-items:center;justify-content:space-between;padding:1.1rem 1.4rem .9rem;border-bottom:1px solid rgba(255,255,255,.08);background:radial-gradient(circle,#041a3b 0,var(--deep-ocean-start) 80%)}#userProfileModal .modal-title{color:var(--accent-primary);margin:0;font-size:1.1rem;font-weight:600}#userProfileModal .modal-wrapper{position:relative;width:100%;max-width:750px;box-sizing:border-box}#userProfileModal .modal-close{flex-shrink:0;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.2);color:var(--text-primary);font-size:1.1rem;cursor:pointer;padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:8px;transition:.2s;z-index:30001;-webkit-tap-highlight-color:transparent}
2711#userProfileModal .modal-close:hover{background:rgba(255,255,255,.22);color:#fff}#userProfileModal .modal-body{padding:1.5rem;position:relative}#userProfileModal .loading-spinner,#userProfileModal .private-profile{text-align:center;padding:3rem;color:var(--text-secondary)}#userProfileModal .loading-spinner{display:flex;flex-direction:column;align-items:center;justify-content:center}#userProfileModal .loading-spinner i{color:var(--accent-primary);margin-bottom:1.2rem}#userProfileModal .loading-spinner p{margin:0}#userProfileModal .profile-header{display:flex;align-items:center;gap:1.5rem;margin-bottom:1.5rem;padding:1.2rem;background:rgba(0,0,0,.2);border-radius:1rem;border:1px solid var(--panel-border)}#userProfileModal .avatar{width:80px;height:80px;border-radius:50%;border:3px solid var(--accent-primary);background:#07244f;display:flex;align-items:center;justify-content:center;font-size:2rem;font-weight:700;overflow:hidden;flex-shrink:0}#userProfileModal .avatar img{width:100%;height:100%;object-fit:cover}#userProfileModal .profile-info{flex:1;min-width:0}#userProfileModal .profile-info h2{font-size:1.8rem;font-weight:700;color:rgba(255,255,255,.95);margin:0;display:flex;align-items:center;gap:6px;flex-wrap:wrap}#userProfileModal .profile-info h2 .username-text{word-break:break-word;min-width:0}.profile-location{display:flex;align-items:center;gap:.3rem;margin-top:.25rem}.country-flag{flex-shrink:0}.country-flag img{width:25px;height:25px;border-radius:50%;object-fit:cover;display:block;border:1px solid rgba(255,255,255,.1)}.country-name{font-size:1.2rem;color:var(--text-secondary);font-weight:500}#userProfileModal .joined-date{color:var(--text-secondary);font-size:.85rem;margin-top:.15rem}#userProfileModal .level-info{display:flex;align-items:center;gap:.8rem;margin-top:.8rem}#userProfileModal .level-badge{background:linear-gradient(90deg,#22d3ee,var(--accent-primary));color:var(--deep-ocean-start);padding:.4rem .8rem;border-radius:1.5rem;font-weight:600;display:flex;align-items:center;gap:.4rem;font-size:.9rem}#userProfileModal .stats-section{margin-bottom:1.5rem}#userProfileModal .stats-title{color:var(--accent-primary);font-size:1.1rem;font-weight:600;margin-bottom:1rem;display:flex;align-items:center;gap:.5rem}#userProfileModal .stats-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:.8rem}#userProfileModal .stat-card{background:rgba(0,0,0,.2);border:1px solid var(--panel-border);border-radius:.8rem;padding:1rem;text-align:center}#userProfileModal .stat-icon{font-size:1.2rem;margin-bottom:.4rem;color:var(--accent-primary)}#userProfileModal .stat-value{font-size:1.3rem;font-weight:700;color:var(--highlight-color);margin-bottom:.3rem}#userProfileModal .stat-label{color:var(--text-secondary);font-size:.8rem}#userProfileModal .activity-section{padding:0}#userProfileModal .activity-list{display:flex;flex-direction:column;gap:.5rem}#userProfileModal .activity-header{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;color:var(--accent-primary);font-size:1.1rem;font-weight:600}#userProfileModal .activity-item{display:grid;grid-template-columns:2.2fr 1fr .8fr;gap:.8rem;align-items:center;padding:.7rem .9rem;background:rgba(0,0,0,.2);border:1px solid var(--panel-border);border-radius:.8rem}#userProfileModal .activity-item.activity-item-header{background:none;border:none;padding:.2rem .9rem;border-bottom:2px solid var(--panel-border);border-radius:0}#userProfileModal .activity-description{color:var(--text-primary);font-size:.85rem;text-align:left;display:flex;align-items:center;gap:.7rem;min-width:0}#userProfileModal .activity-description span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}#userProfileModal .activity-icon,#userProfileModal .activity-icon-default{width:36px;height:36px;border-radius:8px;flex-shrink:0;object-fit:cover;background:#07244f}#userProfileModal .activity-icon-default{display:flex;align-items:center;justify-content:center;color:var(--accent-primary);font-size:1.1rem}#userProfileModal .activity-icon--reward{width:auto;height:34px;max-width:64px;object-fit:contain;padding:0;background:none;border-radius:0}#userProfileModal .activity-date{color:var(--text-secondary);font-size:.8rem;text-align:center}#userProfileModal .activity-amount{color:var(--success-color);font-weight:600;font-size:.9rem;text-align:right}#userProfileModal .private-icon{font-size:3rem;margin-bottom:1rem;color:var(--accent-primary)}#userProfileModal .error-message{text-align:center;padding:2rem;color:var(--error-color)}#userProfileModal .error-message i{font-size:2rem;margin-bottom:1rem}@media (max-width:1024px){#userProfileModal .modal-content{max-height:95vh}#userProfileModal .stats-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width:768px){#userProfileModal{padding:8px;align-items:center}#userProfileModal .modal-content{max-height:calc(100vh - 16px)}#userProfileModal .modal-body{padding:.55rem}#userProfileModal .profile-header{display:flex;flex-direction:row;align-items:center;gap:.7rem;padding:.55rem;position:relative!important;margin-bottom:.6rem}#userProfileModal .profile-info{text-align:left;min-width:0;max-width:100%}#userProfileModal .profile-location,#userProfileModal .level-info{justify-content:flex-start}#userProfileModal .profile-info h2{font-size:1.2rem;justify-content:flex-start;max-width:100%}#userProfileModal .avatar{width:56px;height:56px;font-size:1.4rem}#userProfileModal .joined-date{font-size:.76rem;margin-top:.1rem}#userProfileModal .stats-section{margin-bottom:.65rem}#userProfileModal .stats-title{font-size:.95rem;margin-bottom:.5rem}#userProfileModal .stats-grid{grid-template-columns:repeat(2,1fr);gap:.5rem}#userProfileModal .stat-card{padding:.55rem .3rem;border-radius:.75rem}#userProfileModal .stat-icon{font-size:.95rem;margin-bottom:.2rem}#userProfileModal .stat-value{font-size:1.1rem;margin-bottom:.2rem}#userProfileModal .stat-label{font-size:.7rem}#userProfileModal .modal-title{font-size:1rem;left:.9rem;right:3rem;max-width:calc(100% - 4rem)}#userProfileModal .activity-section{margin-bottom:.6rem;padding:0}#userProfileModal .activity-list{gap:.4rem}#userProfileModal .activity-header{font-size:.9rem;margin-bottom:.5rem}#userProfileModal .activity-item{grid-template-columns:2fr .9fr .7fr;gap:.4rem;padding:.5rem .6rem}#userProfileModal .activity-item.activity-item-header{padding:.2rem .6rem}#userProfileModal .activity-description{font-size:.76rem}#userProfileModal .activity-icon,#userProfileModal .activity-icon-default{width:28px;height:28px}#userProfileModal .activity-icon--reward{width:auto;height:26px;max-width:52px}#userProfileModal .activity-amount{font-size:.76rem}#userProfileModal .activity-date{font-size:.72rem}#userProfileModal .modal-close{width:30px;height:30px;font-size:1rem;-webkit-tap-highlight-color:rgba(0,229,255,.2)}}`; 2712 2713 const style = document.createElement('style'); 2714 style.textContent = css; 2715 document.head.appendChild(style); 2716 const style2 = document.createElement('style'); 2717 style2.textContent = '.ph-country{position:absolute;top:.75rem;right:.75rem;display:flex;align-items:center;gap:.35rem;z-index:2}.ph-country .country-flag img{width:22px;height:22px;border-radius:50%;object-fit:cover;border:1px solid rgba(255,255,255,.1)}.ph-country-name{font-size:.82rem;color:var(--text-secondary);font-weight:500}.ph-xp-bar-wrap{width:100%;flex-basis:100%;margin-top:.15rem;padding-top:.3rem;border-top:1px solid rgba(255,255,255,.07)}.ph-xp-labels{display:flex;justify-content:space-between;align-items:center;font-size:.75rem;color:var(--text-secondary);margin-bottom:.4rem}.ph-xp-mid{flex:1;text-align:center;font-weight:600;color:var(--text-primary);padding:0 .4rem}.ph-xp-cur,.ph-xp-next{font-weight:600;white-space:nowrap}.ph-xp-track{height:8px;background:rgba(255,255,255,.08);border-radius:8px;overflow:hidden}.ph-xp-fill{height:100%;border-radius:8px;transition:width .4s}@media(max-width:768px){.ph-country{position:absolute;top:.55rem;right:.55rem;left:auto;z-index:2}}@media(max-width:640px){#userProfileModal{padding:0!important;align-items:flex-start!important}#userProfileModal .modal-content{max-width:100%!important;width:100%!important;min-height:100vh!important;max-height:100vh!important;border-radius:0!important;margin:0!important}#userProfileModal .loading-spinner,#userProfileModal .private-profile{height:calc(100vh - 60px);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem}#userProfileModal .profile-header{margin-top:0!important}#userProfileModal .stats-grid{grid-template-columns:repeat(2,1fr);gap:.5rem}#userProfileModal .stat-card{padding:.6rem .4rem}#userProfileModal .stat-icon{display:block;font-size:.85rem;margin-bottom:.2rem}#userProfileModal .stat-value{font-size:1.05rem;margin-bottom:.15rem}#userProfileModal .stat-label{font-size:.7rem}#userProfileModal .modal-wrapper{max-width:100%!important}#userProfileModal .modal-close{width:28px;height:28px;font-size:.95rem}}'; 2718 document.head.appendChild(style2); 2719 }; 2720 2721 class UserProfileModal { 2722 constructor() { 2723 // Szingleton: a modalt ket helyrol is peldanyositjak (itt DOMContentLoaded-on 2724 // es az earn.php-ban). Korabban mindegyik peldany beszurt egy sajat masolatot 2725 // a body vegere ugyanazokkal az id-kkel, igy duplikalt id-k, arvan maradt DOM 2726 // es dupla Escape-figyelo keletkezett. 2727 if (window.__userProfileModalInstance) return window.__userProfileModalInstance; 2728 window.__userProfileModalInstance = this; 2729 this.modal = null; 2730 this.isOpen = false;
2731 this._scrollY = 0; 2732 this._returnUrl = null; 2733this.countryCodes={"Afghanistan":"af","Aland Islands":"ax","Albania":"al","Algeria":"dz","American Samoa":"as","Andorra":"ad","Angola":"ao","Anguilla":"ai","Antarctica":"aq","Antigua and Barbuda":"ag","Argentina":"ar","Armenia":"am","Aruba":"aw","Australia":"au","Austria":"at","Azerbaijan":"az","Bahamas":"bs","Bahrain":"bh","Bangladesh":"bd","Barbados":"bb","Belarus":"by","Belgium":"be","Belize":"bz","Benin":"bj","Bermuda":"bm","Bhutan":"bt","Bolivia":"bo","Bolivia, Plurinational State of":"bo","Bonaire, Sint Eustatius and Saba":"bq","Bosnia and Herzegovina":"ba","Botswana":"bw","Bouvet Island":"bv","Brazil":"br","British Indian Ocean Territory":"io","Brunei Darussalam":"bn","Brunei":"bn","Bulgaria":"bg","Burkina Faso":"bf","Burma":"mm","Burundi":"bi","Cabo Verde":"cv","Cambodia":"kh","Cameroon":"cm","Canada":"ca","Cape Verde":"cv","Cayman Islands":"ky","Central African Republic":"cf","Chad":"td","Chile":"cl","China":"cn","Christmas Island":"cx","Cocos (Keeling) Islands":"cc","Colombia":"co","Comoros":"km","Congo":"cg","Congo, Democratic Republic of the":"cd","Congo (Democratic Republic of the)":"cd","Cook Islands":"ck","Costa Rica":"cr","Cote d'Ivoire":"ci","Croatia":"hr","Cuba":"cu","Curacao":"cw","Cyprus":"cy","Czech Republic":"cz","Czechia":"cz","DRC":"cd","Democratic Republic of the Congo":"cd","Denmark":"dk","Djibouti":"dj","Dominica":"dm","Dominican Republic":"do","Ecuador":"ec","Egypt":"eg","El Salvador":"sv","England":"gb","Equatorial Guinea":"gq","Eritrea":"er","Estonia":"ee","Eswatini":"sz","Ethiopia":"et","Falkland Islands":"fk","Falkland Islands (Malvinas)":"fk","Faroe Islands":"fo","Fiji":"fj","Finland":"fi","France":"fr","French Guiana":"gf","French Polynesia":"pf","French Southern Territories":"tf","Gabon":"ga","Gambia":"gm","Georgia":"ge","Germany":"de","Ghana":"gh","Gibraltar":"gi","Great Britain":"gb","Greece":"gr","Greenland":"gl","Grenada":"gd","Guadeloupe":"gp","Guam":"gu","Guatemala":"gt","Guernsey":"gg","Guinea":"gn","Guinea-Bissau":"gw","Guyana":"gy","Haiti":"ht","Heard Island and McDonald Islands":"hm","Holy See":"va","Honduras":"hn","Hong Kong":"hk","Hungary":"hu","Iceland":"is","India":"in","Indonesia":"id","Iran":"ir","Iran, Islam
2733ic Republic of":"ir","Iraq":"iq","Ireland":"ie","Isle of Man":"im","Israel":"il","Italy":"it","Ivory Coast":"ci","Jamaica":"jm","Japan":"jp","Jersey":"je","Jordan":"jo","Kazakhstan":"kz","Kenya":"ke","Kiribati":"ki","Korea, Democratic People's Republic of":"kp","Korea, Republic of":"kr","Kosovo":"xk","Kuwait":"kw","Kyrgyzstan":"kg","Lao People's Democratic Republic":"la","Laos":"la","Latvia":"lv","Lebanon":"lb","Lesotho":"ls","Liberia":"lr","Libya":"ly","Liechtenstein":"li","Lithuania":"lt","Luxembourg":"lu","Macao":"mo","Macau":"mo","Macedonia":"mk","Madagascar":"mg","Malawi":"mw","Malaysia":"my","Maldives":"mv","Mali":"ml","Malta":"mt","Marshall Islands":"mh","Martinique":"mq","Mauritania":"mr","Mauritius":"mu","Mayotte":"yt","Mexico":"mx","Micronesia":"fm","Micronesia, Federated States of":"fm","Moldova":"md","Moldova, Republic of":"md","Monaco":"mc","Mongolia":"mn","Montenegro":"me","Montserrat":"ms","Morocco":"ma","Mozambique":"mz","Myanmar":"mm","Namibia":"na","Nauru":"nr","Nepal":"np","Netherlands":"nl","The Netherlands":"nl","New Caledonia":"nc","New Zealand":"nz","Nicaragua":"ni","Niger":"ne","Nigeria":"ng","Niue":"nu","Norfolk Island":"nf","North Korea":"kp","North Macedonia":"mk","Northern Ireland":"gb","Northern Mariana Islands":"mp","Norway":"no","Oman":"om","Pakistan":"pk","Palau":"pw","Palestine":"ps","Palestine, State of":"ps","Panama":"pa","Papua New Guinea":"pg","Paraguay":"py","Peru":"pe","Philippines":"ph","Pitcairn":"pn","Poland":"pl","Portugal":"pt","Puerto Rico":"pr","Qatar":"qa","Reunion":"re","Romania":"ro","Russia":"ru","Russian Federation":"ru","Rwanda":"rw","Saint Barthelemy":"bl","Saint Helena":"sh","Saint Kitts and Nevis":"kn","Saint Lucia":"lc","Saint Martin":"mf","Saint Pierre and Miquelon":"pm","Saint Vincent and the Grenadines":"vc","Samoa":"ws","San Marino":"sm","Sao Tome and Principe":"st","Saudi Arabia":"sa","Scotland":"gb","Senegal":"sn","Serbia":"rs","Seychelles":"sc","Sierra Leone":"sl","Singapore":"sg","Sint Maarten":"sx","Slovakia":"sk","Slovenia":"si","Solomon Islands":"sb","Somalia":"so","South Africa":"za","South Georgia and the South Sandwich Islands":"gs","South Korea":"kr","South Sudan":"ss","Spain":"es","Sri Lanka":"lk","Sudan":"sd","Suriname":"sr","Svalbard and Jan Mayen":"sj","Swaziland":"sz","Sweden":"se","Switzerland":"ch","Syria":"sy","Syrian Arab Republic":"sy","Taiwan":"tw","Taiwan, Province of China":"tw","Tajikistan":"tj","Tanzania":"tz","Tanzania, United Republic of":"tz","Thailand":"th","Timor-Leste":"tl","Togo":"tg","Tokelau":"tk","Tonga":"to","Trinidad and Tobago":"tt","Tunisia":"tn","Turkey":"tr","Turkmenistan":"tm","Turks and Caicos Islands":"tc","Tuvalu":"tv","Türkiye":"tr","UAE":"ae","UK":"gb","USA":"us","Uganda":"ug","Ukraine":"ua","United Arab Emirates":"ae","United Kingdom":"gb","United States":"us","United States Minor Outlying Islands":"um","United States of America":"us","Uruguay":"uy","Uzbekistan":"uz","Vanuatu":"vu","Vatican":"va","Vatican City":"va","Venezuela":"ve","Venezuela, Bolivarian Republic of":"ve","Viet Nam":"vn","Vietnam":"vn","Virgin Islands, British":"vg","Virgin Islands, U.S.":"vi","Wales":"gb","Wallis and Futuna":"wf","Western Sahara":"eh","Yemen":"ye","Zambia":"zm","Zimbabwe":"zw","Unknown":"xx"}; 2734 this.init(); 2735 } 2736 2737 init() { 2738 injectCSS(); 2739 this.createModal(); 2740 document.addEventListener('click', this.handleProfileClick.bind(this)); 2741 window.addEventListener('popstate', this.handlePopState.bind(this)); 2742 this.checkUrlOnLoad(); 2743 } 2744 2745 createModal() { 2746 const modalHTML = `<div id="userProfileModal" style="display: none;"><div class="modal-wrapper"><div class="modal-content"><div class="modal-title-bar"><h2 class="modal-title">Profile</h2><button class="modal-close" id="closeUserModal">Ã</button></div><div class="modal-body"><div class="loading-spinner"><i class="fas fa-spinner fa-spin fa-2x"></i><p>Loading profile...</p></div><div id="profileContent"></div></div></div></div></div>`; 2747 document.body.insertAdjacentHTML('beforeend', modalHTML); 2748 this.modal = document.getElementById('userProfileModal'); 2749 document.getElementById('closeUserModal').addEventListener('click', () => this.closeModal()); 2750 this.modal.addEventListener('click', (e) => { if (e.target === this.modal) this.closeModal(); }); 2751 document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && this.isOpen) this.closeModal(); }); 2752 } 2753 2754 handleProfileClick(e) { 2755 const userLink = e.target.closest('[data-username]'); 2756 if (userLink) { 2757 e.preventDefault(); 2758 this.openProfile(userLink.dataset.username); 2759 } 2760 } 2761 2762 checkUrlOnLoad() { 2763 const userModal = new URLSearchParams(window.location.search).get('user_modal'); 2764 if (userModal && /^[a-zA-Z0-9_]{1,50}$/.test(userModal)) { 2765 history.replaceState({}, '', window.location.pathname); 2766 setTimeout(() => this.openProfile(userModal), 100); 2767 return; 2768 } 2769 const pathMatch = window.location.pathname.match(/^\/user\/([a-zA-Z0-9_]{1,50})\/?$/); 2770 if (pathMatch) { 2771 setTimeout(() => this.openProfile(pathMatch[1]), 100); 2772 } 2773 } 2774 2775 handlePopState() { if (this.isOpen) this.closeModal(); } 2776 2777 async openProfile(username) { 2778 if (this.isOpen) return; 2779 this.isOpen = true; 2780 this.modal.style.display = 'flex'; 2781 2782 this._scrollY = window.scrollY; 2783 document.documentElement.style.overflow = 'hidden'; 2784 document.body.style.overflow = 'hidden'; 2785 2786 // Jegyezzuk meg, melyik oldalrol nyilt a modal, hogy bezaraskor ODA terjunk vissza. 2787 // Korabban a bezaras fixen '/earn'-t irt az URL-be, igy pl. az Aff
2787iliates oldalon 2788 // egy profil megnyitasa+bezarasa utan a cimsor /earn-t mutatott, a tartalom viszont 2789 // maradt az Affiliates - ettol ugy tunt, mintha az Earn menupont nem mukodne. 2790 this._returnUrl = window.location.pathname + window.location.search; 2791 history.pushState({ userProfile: username }, '', `/user/${encodeURIComponent(username)}`); 2792 const chatTrigger = document.getElementById('publicChatTrigger'); 2793 if (chatTrigger) { 2794 chatTrigger.style.display = 'none'; 2795 } 2796 this.showLoading(); 2797 try { 2798 const response = await fetch(`/user_profile.php?api=get_user_profile&username=${encodeURIComponent(username)}`); 2799 if (!response.ok) throw new Error('Network response was not ok.'); 2800 const data = await response.json(); 2801 if (data.success) { 2802 this.renderProfile(data.user, data.stats, data.activity); 2803 } else { 2804 if (data.is_banned) { 2805 this.renderBannedProfile(); 2806 } else if (data.is_deleted) { 2807 this.renderDeletedProfile(); 2808 } else { 2809 this.renderError(data.error || 'Profile not found'); 2810 } 2811 } 2812 } catch (error) { 2813 this.renderError('Failed to load profile'); 2814 } 2815 } 2816 2817 renderDeletedProfile() { 2818 this.modal.querySelector('.loading-spinner').style.display = 'none'; 2819 const content = document.getElementById('profileContent'); 2820 content.innerHTML = ` 2821 <div class="private-profile"> 2822 <div class="private-icon"><i class="fas fa-user-slash"></i></div> 2823 <h3>This Account Was Deleted</h3> 2824 <p>This user profile is no longer available.</p> 2825 </div> 2826 `; 2827 } 2828 2829 renderBannedProfile() { 2830 this.modal.querySelector('.loading-spinner').style.display = 'none'; 2831 const content = document.getElementById('profileContent'); 2832 content.innerHTML = ` 2833 <div class="private-profile"> 2834 <div class="private-icon"><i class="fas fa-ban" style="color:var(--error-color)"></i></div> 2835 <h3 style="color:var(--error-color)">Account Suspended</h3> 2836 <p>This account has been suspended and is no longer active.</p> 2837 </div> 2838 `; 2839 } 2840 2841 closeModal() { 2842 if (!this.isOpen) return; 2843 this.isOpen = false; 2844 this.modal.style.display = 'none'; 2845 2846 document.documentElement.style.overflow = ''; 2847 document.body.style.overflow = ''; 2848 2849 // Oda vissza, ahonnan nyitottuk. Ha valamiert nincs elmentve (pl. kozvetlenul 2850 // egy /user/xyz linkkel erkezett a latogato), akkor essunk vissza az /earn-re. 2851 const back = this._returnUrl && !/^\/user\//.test(this._returnUrl) ? this._returnUrl : '/earn'; 2852 this._returnUrl = null; 2853 history.pushState({}, '', back); 2854 document.getElementById('profileContent').innerHTML = ''; 2855 const chatTrigger = document.getElementById('publicChatTrigger'); 2856 if (chatTrigger) { 2857 chatTrigger.style.display = 'flex'; 2858 } 2859 } 2860 2861 showLoading() { 2862 document.getElementById('profileContent').innerHTML = ''; 2863 this.modal.querySelector('.loading-spinner').style.display = ''; 2864 } 2865 2866 renderProfile(user, stats, activity) { 2867 this.modal.querySelector('.loading-spinner').style.display = 'none'; 2868 const content = document.getElementById('profileContent'); 2869 2870 if (user && user.role === 'admin') { 2871 content.innerHTML = ` 2872 <div class="private-profile"> 2873 <div class="private-icon"><i class="fas fa-shield-alt"></i></div> 2874 <h3>Administrator Account</h3> 2875 <p>This user is an administrator. Their profile details are not publicly displayed.</p> 2876 </div>`; 2877 return; 2878 } 2879 2880 if (!user || !user.is_public) { 2881 content.innerHTML = `<div class="private-profile"><div class="private-icon"><i class="fas fa-lock"></i></div><h3>This Profile is Private</h3><p>The user has chosen to keep their profile private.</p></div>`; 2882 return; 2883 } 2884 2885 const countryFlagHTML = this.getCountryFlagHTML(user.country, user.username); 2886 const xpProgress = stats.tier_data.progress_percent || 0; 2887 const xpToNext = stats.tier_data.xp_to_next || 0; 2888 const nextTierName = stats.tier_data.next_tier_name; 2889 const currentTierName = stats.tier_data.current_tier_name; 2890 const tierBarColors = { bronze: 'linear-gradient(90deg,#f97316,#fb923c)', silver: 'linear-gradient(90deg,#94a3b8,#cbd5e1)', gold: 'linear-gradient(90deg,#facc15,#fde68a)', diamond: 'linear-gradient(90deg,#22d3ee,#00e5ff)', obsidian: 'linear-gradient(90deg,#8b5cf6,#a78bfa)' }; 2891 const tierBarColor = tierBarColors[stats.tier_data.current_tier] || tierBarColors[stats.tier_data.next_tier] || 'linear-gradient(90deg,#6b7280,#9ca3af)'; 2892 const tierTextColors = { bronze: '#fb923c', silver: '#cbd5e1', gold: '#fde68a', diamond: '#00e5ff', obsidian: '#a78bfa' }; 2893 const nextTierColor = tierTextColors[stats.tier_data.next_tier] || 'var(--text-primary)'; 2894 const avatarInitial = (user.username || '?').charAt(0).toUpperCase(); 2895 const countryHTML = (user.country && user.country !== 'Unknown') ? `<div class="ph-country"><span class="country-flag">${countryFlagHTML}</span><span class="ph-country-name">${user.country}</span></div>` : ''; 2896 2897 content.innerHTML = ` 2898 <div class="profile-header" style="position:relative;flex-wrap:wrap;"> 2899 ${countryHTML} 2900 <div class="avatar" data-initial="${seEscHtml(avatarInitial)}">${user.avatar_url ? `<img src="${seEscHtml(user.avatar_url)}" alt="">` : seEscHtml(avatarInitial)}</div> 2901 <div class="profile-info"> 2902 <h2>
2903 <span class="username-text notranslate">${seEscHtml(user.username)}</span> 2904 </h2> 2905 <div class="joined-date">Joined ${shkDate(user.created_at).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', timeZone: 'UTC' })}</div> 2906 </div> 2907 <div class="ph-xp-bar-wrap"> 2908 <div class="ph-xp-labels"> 2909 <span class="ph-xp-cur">${currentTierName || ''}</span> 2910 <span class="ph-xp-mid">${nextTierName ? xpToNext.toLocaleString() + ' XP to ' + nextTierName : (currentTierName ? 'â Max Tier' : '')}</span> 2911 <span class="ph-xp-next" style="color:${nextTierName ? nextTierColor : 'var(--text-primary)'}">${currentTierName ? (nextTierName || 'â ') : (nextTierName || '')}</span> 2912 </div> 2913 <div class="ph-xp-track"><div class="ph-xp-fill" style="width:${xpProgress.toFixed(1)}%;background:${tierBarColor}"></div></div> 2914 </div> 2915 </div> 2916 <div class="stats-section"> 2917 <div class="stats-title">Statistics</div> 2918 <div class="stats-grid"> 2919 <div class="stat-card"><div class="stat-icon"><i class="fas fa-wallet"></i></div><div class="stat-value notranslate">$${parseFloat(stats.total_earnings).toFixed(3)}</div><div class="stat-label">Total Earnings</div></div> 2920 <div class="stat-card"><div class="stat-icon"><i class="fas fa-check-circle"></i></div><div class="stat-value">${stats.total_tasks}</div><div class="stat-label">Offers Completed</div></div> 2921 <div class="stat-card"><div class="stat-icon"><i class="fas fa-users"></i></div><div class="stat-value">${stats.total_referrals}</div><div class="stat-label">Users Referred</div></div> 2922 <div class="stat-card"><div class="stat-icon"><i class="fas fa-clock"></i></div><div class="stat-value notranslate">$${parseFloat(stats.recent_earnings).toFixed(3)}</div><div class="stat-label">Last 30 Days</div></div> 2923 </div> 2924 </div> 2925 ${activity && activity.length > 0 ? ` 2926 <div class="activity-section"> 2927 <div class="activity-header">Tasks</div> 2928 <div class="activity-list"> 2929 <div class="activity-item activity-item-header" style="font-weight:600;color:var(--accent-primary);"> 2930 <div class="activity-description">Task</div> 2931 <div class="activity-date">Date</div> 2932 <div class="activity-amount">Reward</div> 2933 </div> 2934 ${activity.map(item => { 2935 let desc = item.description || item.type.replace(/_/g, ' '); 2936 desc = desc.replace(/\s*\(\d+%\)/, ''); 2937 let typeIconUrl = null; 2938 if (item.type === 'reward_code_claim' || desc.toLowerCase().includes('reward code')) { 2939 desc = 'Reward Code'; 2940 } else if (item.type === 'admin_credit') { 2941 desc = 'Admin Adjustment'; 2942 } else if (item.type === 'wheel_win') { 2943 desc = 'Lucky Wheel'; 2944 typeIconUrl = '/assets/images/rewards/menu-wheel.svg'; 2945 } else if (item.type === 'daily_streak') { 2946 desc = 'Daily Streak'; 2947 } else if (item.type === 'daily_challenge') { 2948 desc = 'Daily Challenge'; 2949 typeIconUrl = '/assets/images/rewards/menu-challenge.svg'; 2950 } else if (item.type === 'lottery_prize' || desc.toLowerCase().includes('lottery')) { 2951 desc = 'Weekly Lottery'; 2952 typeIconUrl = '/assets/images/rewards/lottery_ticket.svg'; 2953 } else if (item.type === 'mission_milestone') { 2954 desc = 'Mission Milestone'; 2955 typeIconUrl = '/assets/images/rewards/menu-mission.svg'; 2956 } 2957 const taskDate = shkDate(item.created_at).toLocaleString('en-US', { 2958 timeZone: 'UTC', month: 'numeric', day: 'numeric', year: 'numeric', 2959 hour: 'numeric', minute: '2-digit', hour12: true 2960 }) + ' ' + shkTzLabel(item.created_at); 2961 const iconUrl = item.offer_icon_url || typeIconUrl; 2962 // Partner thumbnails are square and look right cropped to fill the tile; our 2963 // own reward icons (ticket, wheel, mission, challenge) are wide, so they get 2964 // contained instead - cover was slicing the ticket down to a fragment. 2965 const iconClass = item.offer_icon_url ? 'activity-icon' : 'activity-icon activity-icon--reward'; 2966 const iconHTML = iconUrl 2967 ? `<img src="${seEscHtml(iconUrl)}" class="${iconClass}" alt="">` 2968 : `<i class="fas fa-clipboard-list activity-icon-default"></i>`; 2969 return `<div class="activity-item"><div class="activity-description">${iconHTML}<span>${seEscHtml(desc)}</span></div><div class="activity-date">${taskDate}</div><div class="activity-amount notranslate">+$${parseFloat(item.amount).toFixed(3)}</div></div>`; 2970}).join('')} 2971 </div> 2972 </div>` : ''} 2973 `; 2974 2975 // A dead avatar URL used to leave the browser rendering the img's alt
2976 // text inside the 80px circle at 2rem/700 - that was the name spilling 2977 // over the border, not a real picture. alt="" stops the text; this puts 2978 // the initial back so the circle still looks intentional. 2979 const avatarImg = content.querySelector('.avatar img'); 2980 if (avatarImg) { 2981 const useInitial = () => { 2982 const box = avatarImg.parentNode; 2983 if (box) box.textContent = box.dataset.initial || '?'; 2984 }; 2985 avatarImg.addEventListener('error', useInitial, { once: true }); 2986 // A cached failure never fires 'error' - catch that case directly. 2987 if (avatarImg.complete && avatarImg.naturalWidth === 0) useInitial(); 2988 } 2989 2990 setTimeout(() => { 2991 if (window.offerModal) { 2992 window.offerModal.reparse(); 2993 } 2994 }, 100); 2995 } 2996 2997 renderError(message) { 2998 this.modal.querySelector('.loading-spinner').style.display = 'none'; 2999 document.getElementById('profileContent').innerHTML = `<div class="error-message"><i class="fas fa-exclamation-triangle"></i><p>${message}</p></div>`; 3000 } 3001 3002 getCountryFlagHTML(country, username = 'user') { 3003 const countryCode = this.countryCodes[country]?.toLowerCase() || 'xx'; 3004 if (countryCode === 'xx') { 3005 return ''; 3006 } 3007 return `<img src="https://flagcdn.com/${countryCode}.svg" alt="">`; 3008 } 3009 } 3010 3011 window.UserProfileModal = UserProfileModal; 3012 window.createUserProfileLink = (userId, username) => `<a href="/user/${encodeURIComponent(username)}" data-username="${seEscHtml(username)}" class="user-profile-link notranslate">${seEscHtml(username)}</a>`; 3013 document.addEventListener('DOMContentLoaded', () => new UserProfileModal()); 3014})(); 3015</script>
3015 3016 3017 3018 3019 <aside class="sidebar-menu sk-loading" id="sidebarMenu"> 3020 <button class="floating-menu-btn" id="floatingMenuBtn" title="Open menu" aria-label="Open menu" aria-expanded="false" aria-controls="sidebarNav"> 3021 <i class="fas fa-bars"></i> 3022 </button> 3023 3024 <div class="sidebar-header-strip"> 3025 <a href="/home" class="sidebar-logo-link"> 3026 <img src="/assets/images/logos/sharklogo_text_540.webp" alt="Shark Earnings" class="sidebar-logo-img" width="156" height="48"> 3027 </a> 3028 <button class="sidebar-collapse-btn" id="sidebarCollapseBtn" title="Close menu" aria-label="Close menu" aria-expanded="true" aria-controls="sidebarNav"><i class="fas fa-times"></i></button> 3029 <button class="sidebar-close-btn" id="sidebarCloseBtn">Ã</button> 3030 </div> 3031 <nav class="sidebar-nav sk-loading" id="sidebarNav"> 3032 <a href="/home" class="sidebar-link active" aria-label="Home"> 3033 <i class="fas fa-home"></i> 3034 <span>Home</span> 3035 </a> 3036 <a href="/earn" class="sidebar-link" aria-label="Earn"> 3037 <i class="fas fa-coins"></i> 3038 <span>Earn</span> 3039 </a> 3040 <a href="/offers" class="sidebar-link" aria-label="Offers"> 3041 <i class="fas fa-tags"></i> 3042 <span>Offers</span> 3043 </a> 3044 <a href="/my-offers" class="sidebar-link" aria-label="My Offers"> 3045 <i class="fas fa-clipboard-check"></i> 3046 <span>My Offers</span> 3047 </a> 3048 <a href="/surveys" class="sidebar-link" aria-label="Surveys"> 3049 <i class="fas fa-clipboard-list"></i> 3050 <span>Surveys</span> 3051 </a> 3052 3053 <a href="/rewards" class="sidebar-link" aria-label="Rewards"> 3054 <i class="fas fa-gift"></i> 3055 <span>Rewards</span> 3056 <span class="sidebar-new-badge">NEW</span> 3057 </a> 3058 3059 <a href="/affiliates" class="sidebar-link" aria-label="Affiliates"> 3060 <i class="fas fa-users"></i> 3061 <span>Affiliates</span> 3062 </a> 3063 3064 <div class="sidebar-divider"></div> 3065 3066 <a href="/race/daily" class="sidebar-link sidebar-link-race" aria-label="Daily Race"> 3067 <i class="fas fa-medal"></i> 3068 <span>Daily Race</span> 3069 </a> 3070 3071 <a href="/race/discord" class="sidebar-link sidebar-link-race" aria-label="Discord Race"> 3072 <i class="fab fa-discord"></i> 3073 <span>Discord Race</span> 3074 <span class="sidebar-new-badge">NEW</span> 3075 </a> 3076 3077 <a href="/race/referral" class="sidebar-link sidebar-link-race" aria-label="Referral Race"> 3078 <i class="fas fa-user-friends"></i> 3079 <span>Referral Race</span> 3080 <span class="sidebar-new-badge">NEW</span> 3081 </a> 3082 3083 <div class="sidebar-divider"></div> 3084 3085 <a href="/account" class="sidebar-link" aria-label="Account"> 3086 <i class="fas fa-user"></i> 3087 <span>Account</span> 3088 </a> 3089 <a href="/cashout" class="sidebar-link" aria-label="Cash out"> 3090 <i class="fas fa-wallet"></i> 3091 <span>Cash out</span> 3092 </a> 3093 <a href="/community-chat" class="sidebar-link" aria-label="Community Chat"> 3094 <i class="fab fa-discord"></i> 3095 <span>Community Chat</span> 3096 </a> 3097 <a href="/academy" class="sidebar-link" aria-label="Academy"> 3098 <i class="fas fa-graduation-cap"></i> 3099 <span>Academy</span> 3100 </a> 3101 <a href="/support" class="sidebar-link" aria-label="Support"> 3102 <i class="fas fa-headset"></i> 3103 <span>Support</span> 3104 </a> 3105 3106 </nav> 3107
3107<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">(function(){var m=document.getElementById('sidebarMenu'),n=document.getElementById('sidebarNav');function r(){if(m)m.classList.remove('sk-loading');if(n)n.classList.remove('sk-loading');}r();if(document.fonts&&document.fonts.ready){document.fonts.ready.then(r);}}());</script>
3107 3108 </aside> 3109 3110 <header class="main-header"> 3111 <div class="header-content"> 3112 <div class="header-left"></div> 3113 3114 <div class="header-actions"> 3115 <a href="#" onclick="openAuthModal('login'); return false;" class="btn btn-secondary btn-small">Sign In</a> 3116 <a href="#" onclick="openAuthModal('register'); return false;" class="btn btn-primary btn-small">Sign Up</a> 3117 </div> 3118 </div> 3119 </header> 3120 3121 <div class="mobile-header-bar"> 3122 <a href="/earn" class="mobile-header-logo-link"> 3123 <img src="/assets/images/logos/sharklogo.svg" alt="Shark Earnings" class="mobile-header-logo-img" width="45" height="45"> 3124 </a> 3125 <div class="mobile-header-guest-actions" style="display:flex;gap:8px;margin-left:auto;padding:0 10px;"> 3126 <a href="#" onclick="openAuthModal('login'); return false;" class="btn btn-secondary btn-small">Sign In</a> 3127 <a href="#" onclick="openAuthModal('register'); return false;" class="btn btn-primary btn-small">Sign Up</a> 3128 </div> 3129 </div> 3130 3131 3132 <div class="mobile-sidebar-overlay" id="mobileSidebarOverlay"></div> 3133 3134 <div id="live-earnings-ticker"> 3135 <div class="ticker-wrapper"> 3136 <ul id="earnings-list"> 3137 <li class="earning-item" data-user-id="19611" data-username="Geography" data-description="Geography earned $0.912 · UpLevel Rewards - EA Sports FC 27 $100 (TapRain)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar2.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">UpLevel Rewards - EA Sports FC 27 $100</span><span class="ei-label-alt notranslate">Geography</span></span><span class="ei-label-bot">TapRain</span></div><span class="ei-amount">$0.912</span></li><li class="earning-item" data-user-id="19611" data-username="Geography" data-description="Geography earned $2.496 · UpLevel Rewards - GTA VI $100 (TapRain)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar2.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">UpLevel Rewards - GTA VI $100</span><span class="ei-label-alt notranslate">Geography</span></span><span class="ei-label-bot">TapRain</span></div><span class="ei-amount">$2.496</span></li><li class="earning-item private-item" data-user-id="0" data-description="Shark user earned $6.636 from TapRain"><div class="ei-avatar-wrap"><div class="earning-avatar ei-avatar-private"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="8" r="4"/><path stroke-linecap="round" d="M4 20c0-4 3.6-7 8-7s8 3 8 7"/></svg></div></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top">Shark user</span><span class="ei-label-alt">Shark user</span></span><span class="ei-label-bot">TapRain</span></div><span class="ei-amount">$6.636</span></li><li class="earning-item" data-user-id="20692" data-username="simalida" data-description="simalida earned $2.34 · Survey (BitLabs)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar6.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">Survey</span><span class="ei-label-alt notranslate">simalida</span></span><span class="ei-label-bot">BitLabs</span></div><span class="ei-amount">$2.34</span></li><li class="earning-item" data-user-id="20692" data-username="simalida" data-description="simalida earned $0.01 from Daily Streak"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar6.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">simalida</span><span class="ei-label-alt notranslate">simalida</span></span><span class="ei-label-bot">Daily Streak</span></div><span class="ei-amount">$0.01</span></li><li class="earning-item" data-user-id="6532" data-username="Cosmicz221" data-description="Cosmicz221 earned $0.009 · Shark Expedition Surface chest (L3): $0.009 (Offer)"><div class="ei-avatar-wrap"><img src="https://lh3.googleusercontent.com/a/ACg8ocJCTaGpon49gDHyItxwxg8wGCuvervrCKKsaIy7LdW-Plud57UB=s32-c" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">
3137Shark Expedition Surface chest (L3): $0.009</span><span class="ei-label-alt notranslate">Cosmicz221</span></span><span class="ei-label-bot">Offer</span></div><span class="ei-amount">$0.009</span></li><li class="earning-item private-item" data-user-id="0" data-description="Shark user earned $7.938 from TapRain"><div class="ei-avatar-wrap"><div class="earning-avatar ei-avatar-private"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="8" r="4"/><path stroke-linecap="round" d="M4 20c0-4 3.6-7 8-7s8 3 8 7"/></svg></div></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top">Shark user</span><span class="ei-label-alt">Shark user</span></span><span class="ei-label-bot">TapRain</span></div><span class="ei-amount">$7.938</span></li><li class="earning-item" data-user-id="20692" data-username="simalida" data-description="simalida earned $1.482 · Task Completed (Timewall)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar6.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">Task Completed</span><span class="ei-label-alt notranslate">simalida</span></span><span class="ei-label-bot">Timewall</span></div><span class="ei-amount">$1.482</span></li><li class="earning-item" data-user-id="29940" data-username="huany649" data-description="huany649 earned $0.003 · Task Completed (Timewall)"><div class="ei-avatar-wrap"><img src="https://lh3.googleusercontent.com/a/ACg8ocIdkvtPM4juKleSanx8aNgmt82H-zNtdEJ9gcFOUC15P6ndZA=s32-c" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">Task Completed</span><span class="ei-label-alt notranslate">huany649</span></span><span class="ei-label-bot">Timewall</span></div><span class="ei-amount">$0.003</span></li><li class="earning-item" data-user-id="19611" data-username="Geography" data-description="Geography earned $4.056 · 7 Eleven Gift Card (TapRain)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar2.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">7 Eleven Gift Card</span><span class="ei-label-alt notranslate">Geography</span></span><span class="ei-label-bot">TapRain</span></div><span class="ei-amount">$4.056</span></li><li class="earning-item" data-user-id="19611" data-username="Geography" data-description="Geography earned $2.496 · UpLevel Rewards - Dollar Tree $750 (TapRain)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar2.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">UpLevel Rewards - Dollar Tree $750</span><span class="ei-label-alt notranslate">Geography</span></span><span class="ei-label-bot">TapRain</span></div><span class="ei-amount">$2.496</span></li><li class="earning-item" data-user-id="20692" data-username="simalida" data-description="simalida earned $1.30 · Survey Completion (CPX Research)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar6.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">Survey Completion</span><span class="ei-label-alt notranslate">simalida</span></span><span class="ei-label-bot">CPX Research</span></div><span class="ei-amount">$1.30</span></li><li class="earning-item" data-user-id="20692" data-username="simalida" data-description="simalida earned $0.01 · Survey Bonus (CPX Research)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar6.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">Survey Bonus</span><span class="ei-label-alt notranslate">simalida</span></span><span class="ei-label-bot">CPX Research</span></div><span class="ei-amount">$0.01</span></li><li class="earning-item" data-user-id="20692" data-username="simalida" data-description="simalida earned $0.01 · Survey (Out) (CPX Research)"><div class="ei-avatar-wrap">
3137<img src="/assets/avatars/avatar6.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">Survey (Out)</span><span class="ei-label-alt notranslate">simalida</span></span><span class="ei-label-bot">CPX Research</span></div><span class="ei-amount">$0.01</span></li><li class="earning-item" data-user-id="20692" data-username="simalida" data-description="simalida earned $0.007 · Bitlabs Surveys (PixyLabs)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar6.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">Bitlabs Surveys</span><span class="ei-label-alt notranslate">simalida</span></span><span class="ei-label-bot">PixyLabs</span></div><span class="ei-amount">$0.007</span></li> </ul> 3138 </div> 3139 </div> 3140 3141 <div class="notification-dropdown" id="notificationDropdown"> 3142 <div class="notification-header"> 3143 <h4 id="notificationTitle">Notifications</h4> 3144 <button id="markAllRead" class="mark-all-read-btn">Mark all as read</button> 3145 </div> 3146 <div class="notification-list" id="notificationList"></div> 3147 </div> 3148 3149 3150 <div class="container"> 3151 3152 3153 <main> 3154 3155<section class="hero-section"> 3156<div class="hero-main-content section-container"> 3157<div class="hero-split-layout"> 3158<div class="hero-left-content"> 3159<h1 class="hero-headline"><span class="hl-green">Get paid</span> for games,<br>offers & surveys</h1> 3160<p class="hero-subheadline"><span style="color:#fff;font-weight:700;">5,000+</span> active offers available in <span class="hero-country-name notranslate">United States</span>.</p> 3161 3162<div class="trust-badges-row"> 3163 <div class="no-deposit-badge"><i class="fas fa-check-circle"></i> No deposit required</div> 3164 <div class="no-deposit-badge"><i class="fas fa-bolt"></i> Fast cashouts</div> 3165</div> 3166 3167<div class="hero-cards-row"> 3168<div class="glass-task-card" onclick="openAuthModal('register')" role="button" tabindex="0" aria-label="Sign up to earn with Hero Wars: Alliance"> 3169<div class="gtc-img"><img src="/assets/images/herowars.webp" alt="Earn money playing Hero Wars: Alliance" width="512" height="512" loading="eager"><span class="gtc-star-badge">â 4.6</span></div> 3170<div class="gtc-info"><div class="c-title notranslate">Hero Wars: Alliance</div> 3171<span class="gtc-desc">Strategy RPG</span></div> 3172</div> 3173<div class="glass-task-card featured" onclick="openAuthModal('register')" role="button" tabindex="0" aria-label="Sign up to earn with Call of Dragons - Featured offer"> 3174 <div class="gtc-img"> 3175 <img src="/assets/images/callofdragons.webp" alt="Earn money playing Call of Dragons" width="400" height="400" fetchpriority="high"> 3176 <span class="gtc-star-badge">â 4.9</span> 3177 </div> 3178<div class="gtc-info"><div class="c-title notranslate">Call of Dragons</div><span class="gtc-desc">Strategy RPG</span> 3179 </div> 3180</div> 3181<div class="glass-task-card" onclick="openAuthModal('register')" role="button" tabindex="0" aria-label="Sign up to earn with Mochi Fall"> 3182<div class="gtc-img"><img src="/assets/images/mochifall.webp" alt="Earn money playing Mochi Fall" width="300" height="300" loading="eager"><span class="gtc-star-badge">â 4.2</span></div> 3183<div class="gtc-info"><div class="c-title notranslate">Mochi Fall</div> 3184<span class="gtc-desc">Puzzle Game</span></div> 3185</div> 3186</div> 3187 3188<a class="hero-trustpilot" href="https://www.trustpilot.com/review/sharkearnings.com" target="_blank" rel="noopener" aria-label="See our reviews on Trustpilot"> 3189 <span class="tp-name"><span class="tp-star-lead">â </span> Trustpilot</span> 3190 <span class="tp-stars" aria-hidden="true"> 3191 <span class="tp-box"><i class="fas fa-star"></i></span> 3192 <span class="tp-box"><i class="fas fa-star"></i></span> 3193 <span class="tp-box"><i class="fas fa-star"></i></span> 3194 <span class="tp-box"><i class="fas fa-star"></i></span> 3195 <span class="tp-box tp-half"><i class="fas fa-star"></i></span> 3196 </span> 3197</a> 3198 3199<div class="payout-bar"> 3200 <div class="payout-inner">
3201 <span class="payout-label">Cash out via</span> 3202 <div class="payout-logos"> 3203 <i class="fab fa-paypal" style="color:#009cde" role="img" aria-label="PayPal" title="PayPal"></i> 3204 <i class="fab fa-cc-visa" style="color:#1a4bdb" role="img" aria-label="Visa" title="Visa"></i> 3205 <i class="fab fa-amazon" role="img" aria-label="Amazon Gift Cards" title="Amazon Gift Cards"></i> 3206 <i class="fab fa-google-play" style="color:#00d15a" role="img" aria-label="Google Play" title="Google Play"></i> 3207 <i class="fas fa-litecoin-sign" style="color:#5a86c4" role="img" aria-label="Litecoin" title="Litecoin"></i> 3208 <i class="fas fa-money-bill-wave" style="color:#4caf7d" role="img" aria-label="Bank Transfer" title="Bank Transfer"></i> 3209 </div> 3210 <span class="payout-divider" aria-hidden="true"></span> 3211 <span class="payout-more">200+ ways to cash out · from just $1</span> 3212 </div> 3213</div> 3214</div> 3215 3216<div class="hero-auth-side animate-on-scroll fade-in-right"> 3217<div class="hero-auth-card signup-only"> 3218<h2>Sign Up for Free</h2> 3219<form id="heroRegisterForm" class="hero-form active" translate="no" onsubmit="event.preventDefault(); handleHeroAuth(this, 'register');"> 3220<input type="hidden" name="csrf_token" value="998e8f34e9355502848cd48edfcac4aca9c6e20a319f93593cdd2f8f0ad64f93"> 3221<input type="hidden" name="action" value="register"> 3222<div class="h-input-group"><label for="fld-email">Email Address</label><input id="fld-email" type="email" name="email" placeholder="[email protected]" autocomplete="email" required onfocus="expandPassword(this)"></div> 3223<div class="h-input-expandable"><div class="h-input-group"><label for="fld-password">Password</label><input id="fld-password" type="password" name="password" placeholder="Create secure password" autocomplete="new-password" minlength="8"></div></div> 3224<div role="button" tabindex="0" class="h-referral-toggle" onclick="toggleHeroReferral()"><span>I have a referral code</span> <i class="fas fa-chevron-down"></i></div> 3225<div class="h-referral-input" style="display:none;"><div class="h-input-group"><input aria-label="Enter Code" type="text" name="referral_code" placeholder="Enter Code" value=""></div></div> 3226<div class="terms-text" style="font-size:max(.8rem,12px)">By clicking “Start Earning Now” you agree to our <a href="/tos">Terms of Service</a>, including binding individual arbitration and a class action waiver for U.S. users, and our <a href="/privacy">Privacy Policy</a>.</div> 3227<div class="cf-turnstile" data-sitekey="0x4AAAAAABgiM3aG2fCZPEea" data-execution="execute" data-size="flexible" style="margin: 15px 0; display: none; opacity: 0; max-height: 0; overflow: hidden; transition: max-height 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), opacity 0.4s ease;"></div> 3228<div class="promo-badge promo-badge-inline"><i class="fas fa-gift"></i><span>New members get a <span style="color:var(--highlight-color);font-weight:800">FREE</span> spin - win up to <span class="highlight-green notranslate">10,000 lottery tickets</span>!</span></div> 3229<button type="submit" class="btn-hero-submit cta-green">Start Earning Now</button> 3230<div class="h-divider"><span>OR</span></div> 3231<div class="social-stack"> 3232<div class="g_id_signin" 3233 data-type="standard" 3234 data-shape="rectangular" 3235 data-theme="outline" 3236 data-text="signup_with" 3237 data-size="large" 3238 data-logo_alignment="left" 3239 onclick="handleSocialLogin('google')" 3240 style="min-height:44px;height:44px;width:100%;contain:layout;"> 3241</div> 3242<button type="button" class="btn-social discord" onclick="handleSocialLogin('discord')"><i class="fab fa-discord"></i> Sign up with Discord</button> 3243</div> 3244<div class="terms-text" style="font-size:max(.8rem,12px);margin:12px 0 0">By signing up with Google or Discord you agree to our <a href="/tos">Terms of Service</a>, including binding individual arbitration and a class action waiver for U.S. users, and our <a href="/privacy">Privacy Policy</a>.</div> 3245</form> 3246<div class="hero-form-message"></div> 3247<div class="hero-signups-live"><span class="hs-dot"></span><strong class="notranslate">95</strong> sign ups in the past 24 hours</div> 3248</div> 3249</div> 3250</div> 3251 3252<div class="hero-stats-bar"> 3253<div class="h-stat-item"><i class="fas fa-coins"></i><div class="h-stat-info"><strong class="notranslate h-counter" data-end="250000" data-prefix="$" data-suffix="+" data-comma="1">$0+</strong><span>Total Paid Out</span></div></div> 3254<div class="h-stat-divider"></div> 3255<div class="h-stat-item"><i class="fas fa-stopwatch stat-pulse"></i><div class="h-stat-info"><strong class="notranslate h-counter" data-end="1709" data-format="time">0s</strong><span>Avg. time to first cashout</span></div></div> 3256<div class="h-stat-divider"></div> 3257<div class="h-stat-item"><i class="fas fa-globe"></i><div class="h-stat-info"><strong class="notranslate h-counter" data-end="160" data-suffix="+">0+</strong><span>Countries supported</span></div></div> 3258</div> 3259</div> 3260</section> 3261 3262<section id="how-it-works" class="section-container"> 3263 <h2 class="section-title animate-on-scroll fade-in-up"> 3264 How It Works 3265 </h2> 3266 3267 <div class="how-it-works-main"> 3268<div class="mascot-side animate-on-scroll fade-in-left"> 3269 <div class="mascot-thought-bubble"> 3270 <p>Smell the money yet? 3 steps and you're in the water!</p> 3271 <div class="thought-pointer"></div> 3272 </div> 3273
3274 <img src="/assets/images/shark.webp" 3275 alt="The Shark Earnings shark mascot next to the three steps for earning" 3276 loading="lazy" decoding="async" 3277 width="360" 3278 height="360" 3279 style="object-fit:contain"> 3280</div> 3281 3282 <div class="steps-side"> 3283 <div class="how-it-works-grid"> 3284 <div class="step-card animate-on-scroll fade-in-right"> 3285 <div class="step-num-wrap"><div class="step-number">1</div></div> 3286 <h3>Choose an Offer</h3> 3287 <p>Browse 5,000+ live offers: games, surveys, and app trials. Filter by payout, category, or your country to find the best match for you.</p> 3288 <div class="step-badge"><i class="fas fa-fire"></i> 5,000+ offers live</div> 3289 </div> 3290 3291 <div class="step-card animate-on-scroll fade-in-right"> 3292 <div class="step-num-wrap"><div class="step-number">2</div></div> 3293 <h3>Complete the Offer</h3> 3294 <p>Follow the simple steps: play a game, answer a survey, or try an app. Most tasks are beginner-friendly, and completion is tracked in real time.</p> 3295 <div class="step-badge"><i class="fas fa-shield-alt"></i> Verified by real users</div> 3296 </div> 3297 3298 <div class="step-card animate-on-scroll fade-in-right"> 3299 <div class="step-num-wrap"><div class="step-number">3</div></div> 3300 <h3>Get Paid</h3> 3301 <p>Cash out via PayPal, Crypto, or Gift Cards the moment you hit $1.00. No waiting periods, no hidden fees. Your money, your choice.</p> 3302 <div class="step-badge"><i class="fas fa-bolt"></i> Fast Payouts from $1.00</div> 3303 </div> 3304 </div> 3305 </div> 3306 </div> 3307 </section> 3308 3309 3310<section id="best-ways" class="section-container"> 3311<h2 class="section-title animate-on-scroll fade-in-up">Best Ways to Earn</h2> 3312<p class="section-subtitle animate-on-scroll fade-in-up">Choose from distinct methods to generate real cash online today.</p> 3313<div class="ways-grid"> 3314<div class="way-card animate-on-scroll fade-in-up" onclick="openAuthModal('register')" role="button" tabindex="0" aria-label="Sign up to play games and earn money"> 3315<div class="way-img"><img src="/assets/images/monopoly.webp" alt="Make money playing mobile games like Monopoly Go" loading="lazy" width="280" height="140"></div> 3316<div class="way-content"><h3>Play Games</h3><p class="way-desc">Gaming companies want more players, and they're willing to pay for it. Level up, hit milestones, and get rewarded just for playing.</p></div> 3317</div> 3318<div class="way-card animate-on-scroll fade-in-up" style="transition-delay: 0.12s;" onclick="openAuthModal('register')" role="button" tabindex="0" aria-label="Sign up to take surveys and earn money"> 3319<div class="way-img"><img src="/assets/images/surveys.webp" alt="Get paid for your opinion with online surveys" loading="lazy" width="280" height="210"></div> 3320<div class="way-content"><h3>Take Surveys</h3><p class="way-desc">Brands need real opinions to build better products, and they pay for yours. Share what you think, get paid for it.</p></div> 3321</div> 3322<div class="way-card animate-on-scroll fade-in-up" style="transition-delay: 0.24s;" onclick="openAuthModal('register')" role="button" tabindex="0" aria-label="Sign up to complete offers and earn money"> 3323<div class="way-img"><img src="/assets/images/wirexoffer.webp" alt="Earn money by testing new apps and offers" loading="lazy" width="280" height="147"></div> 3324<div class="way-content"><h3>Complete Offers</h3><p class="way-desc">Try out new apps and get to know new companies while you earn. It's time to get paid for the apps you'd be using anyway.</p></div> 3325</div> 3326</div> 3327</section> 3328 3329<section id="testimonials" class="testimonials-section section-container"> 3330 <h2 class="section-title animate-on-scroll fade-in-up"> 3331 Real Users, Real Success Stories 3332 </h2> 3333 <div class="testimonial-trust-bar animate-on-scroll fade-in-up">
3334 <span class="ttb-rating"><span class="ttb-stars" role="img" aria-label="4.5 out of 5 stars">â â â â <span class="ttb-half">â </span></span> <span class="ttb-score notranslate">4.5/5</span> average rating</span> 3335 <span class="ttb-sep">·</span> 3336 <span>Community-sourced reviews</span> 3337 <span class="ttb-sep">·</span> 3338 <span>Growing user base worldwide</span> 3339 </div> 3340 3341 <div class="testimonials-slider-wrapper" role="region" aria-label="User testimonials carousel"> 3342 <button class="slider-btn slider-prev" onclick="slideTestimonials('prev')" aria-label="Previous testimonial" aria-controls="testimonialsSlider"> 3343 <i class="fas fa-chevron-left"></i> 3344 </button> 3345 3346 <div class="testimonials-slider-container"> 3347 <div class="testimonials-slider" id="testimonialsSlider" role="list" aria-live="polite" translate="no" style="touch-action:pan-y;"> 3348 3349 <div class="testimonial-slide" data-date="2026-02-13" role="listitem"> 3350 <div class="testimonial-card"> 3351 <span class="tc-source-badge tc-source-fb"><i class="fab fa-facebook-f"></i></span> 3352 <div class="testimonial-header"> 3353 <div class="user-avatar" aria-hidden="true"><img src="https://flagcdn.com/et.svg" alt="Ethiopia" loading="lazy"></div> 3354 <div class="user-info"> 3355 <div class="u-name-row"> 3356 <span class="u-name notranslate" translate="no">Dawit Tadesse</span> 3357 <i class="fas fa-check-circle u-check" aria-hidden="true"></i> 3358 </div> 3359 <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div> 3360 </div> 3361 </div> 3362 <blockquote class="testimonial-content">Its good patform and good opportunity for earning</blockquote> 3363 </div> 3364 </div> 3365 3366 <div class="testimonial-slide" data-date="2026-02-12" role="listitem"> 3367 <div class="testimonial-card"> 3368 <span class="tc-source-badge tc-source-fb"><i class="fab fa-facebook-f"></i></span> 3369 <div class="testimonial-header"> 3370 <div class="user-avatar"><img src="https://flagcdn.com/pk.svg" alt="Pakistan" loading="lazy"></div> 3371 <div class="user-info"> 3372 <div class="u-name-row"> 3373 <span class="u-name notranslate" translate="no">Farhan Safdar</span> 3374 <i class="fas fa-check-circle u-check" aria-hidden="true"></i> 3375 </div> 3376 <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div> 3377 </div> 3378 </div> 3379 <blockquote class="testimonial-content">It's a good platform and it's a good community</blockquote> 3380 </div> 3381 </div> 3382 3383 <div class="testimonial-slide" data-date="2026-02-12" role="listitem"> 3384 <div class="testimonial-card"> 3385 <span class="tc-source-badge tc-source-fb"><i class="fab fa-facebook-f"></i></span> 3386 <div class="testimonial-header"> 3387 <div class="user-avatar"><img src="https://flagcdn.com/bd.svg" alt="Bangladesh" loading="lazy"></div> 3388 <div class="user-info"> 3389 <div class="u-name-row">
3390 <span class="u-name notranslate" translate="no">Sharmeen Sultana</span> 3391 <i class="fas fa-check-circle u-check" aria-hidden="true"></i> 3392 </div> 3393 <div class="star-rating" aria-label="4 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="far fa-star"></i></div> 3394 </div> 3395 </div> 3396 <blockquote class="testimonial-content">Support took a bit to respond at first, but they sorted out my issue and the platform itself has been smooth to use since.</blockquote> 3397 </div> 3398 </div> 3399 3400 <div class="testimonial-slide" data-date="2025-12-09" role="listitem"> 3401 <div class="testimonial-card"> 3402 <span class="tc-source-badge tc-source-fb"><i class="fab fa-facebook-f"></i></span> 3403 <div class="testimonial-header"> 3404 <div class="user-avatar"><img src="https://flagcdn.com/pk.svg" alt="Pakistan" loading="lazy"></div> 3405 <div class="user-info"> 3406 <div class="u-name-row"> 3407 <span class="u-name notranslate" translate="no">Ali Jani</span> 3408 <i class="fas fa-check-circle u-check" aria-hidden="true"></i> 3409 </div> 3410 <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div> 3411 </div> 3412 </div> 3413 <blockquote class="testimonial-content">
3413Shark Earnings is truly impressive! Easy to use, reliable, and offers great opportunities to earn. I highly recommend rating their Facebook page positively!</blockquote> 3414 </div> 3415 </div> 3416 3417 <div class="testimonial-slide" data-pin="1" data-date="2025-12-09" role="listitem"> 3418 <div class="testimonial-card"> 3419 <span class="tc-source-badge tc-source-fb"><i class="fab fa-facebook-f"></i></span> 3420 <div class="testimonial-header"> 3421 <div class="user-avatar"><img src="https://flagcdn.com/us.svg" alt="USA" loading="lazy"></div> 3422 <div class="user-info"> 3423 <div class="u-name-row"> 3424 <span class="u-name notranslate" translate="no">Marcus R.</span> 3425 <i class="fas fa-check-circle u-check" aria-hidden="true"></i> 3426 </div> 3427 <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div> 3428 </div> 3429 </div> 3430 <blockquote class="testimonial-content">Cashed out $47 in my first week just from game offers. The PayPal payout was in my account within hours. Wasn't expecting it to actually work this well.</blockquote> 3431 </div> 3432 </div> 3433 3434 <div class="testimonial-slide" data-pin="3" data-date="2025-12-09" role="listitem"> 3435 <div class="testimonial-card"> 3436 <span class="tc-source-badge tc-source-fb"><i class="fab fa-facebook-f"></i></span> 3437 <div class="testimonial-header"> 3438 <div class="user-avatar"><img src="https://flagcdn.com/gb.svg" alt="UK" loading="lazy"></div> 3439 <div class="user-info"> 3440 <div class="u-name-row"> 3441 <span class="u-name notranslate" translate="no">Eva Collins</span> 3442 <i class="fas fa-check-circle u-check" aria-hidden="true"></i> 3443 </div> 3444 <div class="star-rating" aria-label="4.5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star-half-alt"></i></div> 3445 </div> 3446 </div> 3447 <blockquote class="testimonial-content">Took me a couple tries to figure out which offers actually paid out fast, but once I got the hang of it the withdrawals came through without issues.</blockquote> 3448 </div> 3449 </div> 3450 3451 <div class="testimonial-slide" data-date="2026-01-26" role="listitem"> 3452 <div class="testimonial-card"> 3453 <span class="tc-source-badge tc-source-fb"><i class="fab fa-facebook-f"></i></span> 3454 <div class="testimonial-header"> 3455 <div class="user-avatar"><img src="https://flagcdn.com/dz.svg" alt="Algeria" loading="lazy"></div> 3456 <div class="user-info"> 3457 <div class="u-name-row"> 3458 <span class="u-name notranslate" translate="no">Tewfik Oran</span> 3459 <i class="fas fa-check-circle u-check" aria-hidden="true"></i> 3460 </div> 3461 <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div> 3462 </div> 3463 </div> 3464 <blockquote class="testimonial-content">Highly recommended! Simple, interactive, and rewarding.</blockquote> 3465 </div> 3466 </div> 3467 3468 <div class="testimonial-slide" data-date="2026-07-14" role="listitem"> 3469 <div class="testimonial-card">
3470 <span class="tc-source-badge tc-source-tp"><i class="fas fa-star"></i></span> 3471 <div class="testimonial-header"> 3472 <div class="user-avatar" aria-hidden="true"><img src="https://flagcdn.com/fr.svg" alt="France" loading="lazy"></div> 3473 <div class="user-info"> 3474 <div class="u-name-row"> 3475 <span class="u-name notranslate" translate="no">Zac</span> 3476 <i class="fas fa-check-circle u-check" aria-hidden="true"></i> 3477 </div> 3478 <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div> 3479 </div> 3480 </div> 3481 <blockquote class="testimonial-content">This site is real. Trustable, the owner is honest. I recommend it</blockquote> 3482 </div> 3483 </div> 3484 3485 <div class="testimonial-slide" data-pin="2" data-date="2026-07-11" role="listitem"> 3486 <div class="testimonial-card"> 3487 <span class="tc-source-badge tc-source-tp"><i class="fas fa-star"></i></span> 3488 <div class="testimonial-header"> 3489 <div class="user-avatar" aria-hidden="true"><img src="https://flagcdn.com/ng.svg" alt="Nigeria" loading="lazy"></div> 3490 <div class="user-info"> 3491 <div class="u-name-row"> 3492 <span class="u-name notranslate" translate="no">Blank</span> 3493 <i class="fas fa-check-circle u-check" aria-hidden="true"></i> 3494 </div> 3495 <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div> 3496 </div> 3497 </div> 3498 <blockquote class="testimonial-content">One of the best site for earning online. Fast withdrawals and high quality surveys and offers</blockquote> 3499 </div> 3500 </div> 3501 3502 <div class="testimonial-slide" data-date="2026-07-08" role="listitem"> 3503 <div class="testimonial-card"> 3504 <span class="tc-source-badge tc-source-tp"><i class="fas fa-star"></i></span> 3505 <div class="testimonial-header"> 3506 <div class="user-avatar" aria-hidden="true"><img src="https://flagcdn.com/hu.svg" alt="Hungary" loading="lazy"></div> 3507 <div class="user-info"> 3508 <div class="u-name-row"> 3509 <span class="u-name notranslate" translate="no">Norbert Kiraly</span> 3510 <i class="fas fa-check-circle u-check" aria-hidden="true"></i> 3511 </div> 3512 <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div> 3513 </div> 3514 </div> 3515 <blockquote class="testimonial-content">The best, reliable, pays on time. And the games are good.</blockquote> 3516 </div> 3517 </div> 3518 3519 <div class="testimonial-slide" data-date="2026-07-16" role="listitem"> 3520 <div class="testimonial-card"> 3521 <span class="tc-source-badge tc-source-tp"><i class="fas fa-star"></i></span> 3522 <div class="testimonial-header"> 3523 <div class="user-avatar" aria-hidden="true"><img src="https://flagcdn.com/us.svg" alt="USA" loading="lazy"></div> 3524 <div class="user-info"> 3525 <div class="u-name-row">
3526 <span class="u-name notranslate" translate="no">Veronica Robles</span> 3527 <i class="fas fa-check-circle u-check" aria-hidden="true"></i> 3528 </div> 3529 <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div> 3530 </div> 3531 </div> 3532 <blockquote class="testimonial-content">Thank you so much. I received cash out on Shark Earnings. Awesome!!!</blockquote> 3533 </div> 3534 </div> 3535 3536 3537 </div> 3538 </div> 3539 3540 <button class="slider-btn slider-next" onclick="slideTestimonials('next')" aria-label="Next testimonial" aria-controls="testimonialsSlider"> 3541 <i class="fas fa-chevron-right"></i> 3542 </button> 3543 </div> 3544 <div class="testimonial-dots" id="testimonialDots" role="tablist" aria-label="Testimonial pages"></div> 3545</section> 3546 3547<section id="affiliate-promo" class="section-container"> 3548 <h2 class="section-title animate-on-scroll fade-in-up">Earn From Your Friends</h2> 3549 <p class="section-subtitle animate-on-scroll fade-in-up" style="transition-delay: 0.1s;">Your network keeps paying you long after the invite.</p> 3550 <div class="affiliate-promo-card animate-on-scroll fade-in-up"> 3551 <div class="affiliate-promo-icon"><span class="affiliate-promo-pct-label">Up to</span><span class="affiliate-promo-pct notranslate">30%</span><span class="affiliate-promo-pct-sub">Lifetime</span></div> 3552 <div class="affiliate-promo-text"> 3553 <h3 class="affiliate-promo-title">Get Paid Every Time They Do</h3> 3554 <p class="affiliate-promo-desc">Every referral starts you at <strong>10% commission</strong> and climbs to <strong>30%</strong> as your network grows - for as long as they stay active, with no cap and no extra work.</p> 3555 </div> 3556 <a href="/affiliates" class="affiliate-promo-cta">Explore the Affiliate Program <i class="fas fa-arrow-right"></i></a> 3557 </div> 3558</section> 3559 3560<section id="faq" class="section-container"> 3561 <h2 class="section-title animate-on-scroll fade-in-up">Frequently Asked Questions</h2> 3562 <p class="section-subtitle animate-on-scroll fade-in-up" style="transition-delay: 0.1s;"> 3563 Here are the most common questions. For more details, check our <a href="/academy" class="section-link">Academy</a>. 3564 </p> 3565 <div class="faq-list" role="list"> 3566 3567 <div class="faq-item animate-on-scroll fade-in-up open" role="listitem"> 3568 <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="true" aria-controls="faq-answer-1">How much can I earn?</button></h3> 3569 <div class="faq-answer" id="faq-answer-1" role="region"> 3570 <div class="faq-answer-content"> 3571 There is no fixed or guaranteed amount - it depends on how many offers you complete, which ones are available in your country, and how active your referrals are. <strong>Every offer shows its exact reward before you start</strong>, and you can cash out from <span class="notranslate">$1.00</span>. 3572 </div> 3573 </div> 3574 </div> 3575 3576 <div class="faq-item animate-on-scroll fade-in-up" role="listitem"> 3577 <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-2">How fast do I get paid?</button></h3> 3578 <div class="faq-answer" id="faq-answer-2" role="region"> 3579 <div class="faq-answer-content"> 3580 We process payments daily! You can cash out via <strong>PayPal</strong> (min <span class="notranslate">$1.00</span>), <strong>Crypto</strong> (min <span class="notranslate">$2.50</span>), or Gift Cards (min <span class="notranslate">$1.00</span>). Most users receive their money within a few hours. 3581 </div> 3582 </div> 3583 </div> 3584 3585 <div class="faq-item animate-on-scroll fade-in-up" role="listitem"> 3586 <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-3">How does the referral program work?</button></h3> 3587 <div class="faq-answer" id="faq-answer-3" role="region"> 3588 <div class="faq-answer-content"> 3589 Invite friends and earn up to <strong>30% commission</strong> on their earnings for life. It's a great way to build passive income. <a href="/affiliates" class="section-link" title="Affiliate Program Details">View Affiliate Program details</a>. 3590 </div> 3591 </div> 3592 </div> 3593 3594 <div class="faq-item animate-on-scroll fade-in-up" role="listitem"> 3595 <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-4">Is Shark Earnings free and safe?</button></h3> 3596 <div class="faq-answer" id="faq-answer-4" role="region"> 3597 <div class="faq-answer-content"> 3598 Yes! Registration is 100% free - we will never ask you for money. Your data is protected by SSL encryption and we are fully GDPR compliant. 3599 </div> 3600 </div> 3601 </div> 3602 3603 <div class="faq-item animate-on-scroll fade-in-up" role="listitem"> 3604 <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-5">Do I need to invest money to start earning?</button></h3> 3605 <div class="faq-answer" id="faq-answer-5" role="region"> 3606 <div class="faq-answer-content"> 3607 No! Shark Earnings is <strong>100% free to join and use</strong>. You can start earning immediately after registration without any upfront costs or hidden fees. 3608 </div> 3609 </div> 3610 </div> 3611 3612 <div class="faq-item animate-on-scroll fade-in-up" role="listitem"> 3613 <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-6">What payment methods do you support?</button></h3> 3614 <div class="faq-answer" id="faq-answer-6" role="region"> 3615 <div class="faq-answer-content"> 3616 We offer <strong>PayPal</strong>, <strong>Cryptocurrency</strong> (Litecoin), and popular <strong>Gift Cards</strong> (Amazon, Google Play, Steam, etc.). Minimum cashout starts at <span class="notranslate">$1.00</span> (Crypto min <span class="notranslate">$2.50</span>). 3617 </div> 3618 </div> 3619 </div> 3620 3621 <div class="faq-item animate-on-scroll fade-in-up" role="listitem"> 3622 <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-7">Can I use Shark Earnings on mobile?</button></h3> 3623 <div class="faq-answer" id="faq-answer-7" role="region"> 3624 <div class="faq-answer-content"> 3625 Absolutely! Our platform is fully responsive and works on all devices. Many game offers are specifically designed for mobile devices (Android/iOS). 3626 </div> 3627 </div> 3628 </div> 3629 3630 <div class="faq-item animate-on-scroll fade-in-up" role="listitem"> 3631 <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-8">How do I track my earnings?</button></h3> 3632 <div class="faq-answer" id="faq-answer-8" role="region"> 3633 <div class="faq-answer-content"> 3634 Your earnings are tracked in real-time on your <strong>Dashboard</strong>. You can see pending offers, completed tasks, referral earnings, and withdrawal history all in one place. 3635 </div> 3636 </div> 3637 </div> 3638 3639 <div class="faq-item animate-on-scroll fade-in-up" role="listitem"> 3640 <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-9">Does Shark Earnings work in my country?</button></h3> 3641 <div class="faq-answer" id="faq-answer-9" role="region"> 3642 <div class="faq-answer-content"> 3643 <p>Yes! Shark Earnings is available in <strong>160+ countries</strong>. Offer availability depends on your region, but every country has access to at least some earning methods.</p> 3644 <div class="faq-region-list"> 3645 <div class="faq-region-item">
3646 <span class="faq-region-name"><img class="faq-region-flag" src="https://flagcdn.com/us.svg" alt="USA" width="20" height="20" loading="lazy"> Tier 1</span> 3647 <span class="faq-region-countries">USA, UK, Canada, Australia</span> 3648 <span class="faq-region-stars">â â â â â </span> 3649 </div> 3650 <div class="faq-region-item"> 3651 <span class="faq-region-name"><img class="faq-region-flag" src="https://flagcdn.com/eu.svg" alt="EU" width="20" height="20" loading="lazy"> Europe</span> 3652 <span class="faq-region-countries">Germany, France, Netherlands, Nordics</span> 3653 <span class="faq-region-stars">â â â â <span style="opacity:.25">â </span></span> 3654 </div> 3655 <div class="faq-region-item"> 3656 <span class="faq-region-name"><img class="faq-region-flag" src="https://flagcdn.com/in.svg" alt="Asia" width="20" height="20" loading="lazy"> Asia</span> 3657 <span class="faq-region-countries">India, Philippines, Indonesia</span> 3658 <span class="faq-region-stars">â â â <span style="opacity:.25">â â </span></span> 3659 </div> 3660 <div class="faq-region-item"> 3661 <span class="faq-region-name"><img class="faq-region-flag" src="https://flagcdn.com/br.svg" alt="LatAm" width="20" height="20" loading="lazy"> Latin America</span> 3662 <span class="faq-region-countries">Brazil, Mexico, Argentina</span> 3663 <span class="faq-region-stars">â â â <span style="opacity:.25">â â </span></span> 3664 </div> 3665 </div> 3666 <p>The <strong>referral program</strong> has no country restrictions at all. For a full regional breakdown visit our <a href="/academy/insider/best-offers-by-region-guide" class="section-link">Best Offers by Region</a> guide in the Academy.</p> 3667 </div> 3668 </div> 3669 </div> 3670 3671 </div> 3672 3673</section> 3674 3675<section id="start-earning" class="section-container"> 3676 <div class="final-cta animate-on-scroll fade-in-up"> 3677 <h2 class="final-cta-title">Start Earning With Shark Earnings Today</h2> 3678 <p class="final-cta-sub">Turn your spare time into real cash with <a href="/offers">game and app offers</a>, <a href="/surveys">paid online surveys</a>, and daily <a href="/rewards">rewards</a>. Joining is free, takes under a minute, and you can <a href="/cashout">cash out from just <span class="notranslate">$1.00</span></a> via PayPal, crypto, or gift cards in 160+ countries.</p> 3679 <button type="button" class="final-cta-btn" onclick="openAuthModal('register')"><i class="fas fa-bolt"></i> Create Your Free Account</button> 3680 <p class="final-cta-links">New to earning online? Start with the <a href="/academy">Shark Earnings Academy</a> for offer strategies and payout guides, or see how the <a href="/affiliates">affiliate program</a> pays up to 30% commission for life.</p> 3681 </div> 3682</section> 3683
3684<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 3685(function(){ 3686 if('IntersectionObserver' in window){ 3687 var skObs = new IntersectionObserver(function(entries){ 3688 entries.forEach(function(e){ 3689 if(e.isIntersecting){ 3690 setTimeout(function(){ 3691 e.target.classList.remove('sk-loading'); 3692 }, 300); 3693 skObs.unobserve(e.target); 3694 } 3695 }); 3696 },{threshold:0.2}); 3697 document.querySelectorAll('.step-card.sk-loading').forEach(function(el){ 3698 skObs.observe(el); 3699 }); 3700 } else { 3701 document.querySelectorAll('.sk-loading').forEach(function(el){ el.classList.remove('sk-loading'); }); 3702 } 3703})(); 3704</script>
3704 3705 </main> 3706 </div> 3707 3708 <style> 3709.shark-cookie-banner,.shark-cookie-modal,#cookie-mobile-trigger{--panel-bg:rgba(3,12,26,.96);--panel-border:rgba(0,229,255,.25);--text-primary:#E0F7FA;--text-secondary:#B2EBF2;--accent-primary:#00E5FF;--accent-secondary:#00B8D4;--success-color:#00C853;--error-color:#FF5252;--input-bg:rgba(0,0,0,.3);--deep-ocean-start:#00070f;--shadow-color-strong:rgba(0,229,255,.25);--shadow-color-light:rgba(0,229,255,.15)}.shark-cookie-modal *,.shark-cookie-modal *::before,.shark-cookie-modal *::after{box-sizing:border-box}:root{--shark-bottom-nav-space:0px}@media (max-width:768px){:root{--shark-bottom-nav-space:var(--mobile-bottom-nav-height,60px)}}.shark-cookie-banner{bottom:calc(var(--shark-bottom-nav-space) + 16px)}body.has-cookie-banner{padding-bottom:calc(var(--shark-bottom-nav-space) + var(--cookie-banner-h,170px) + 80px)}body.has-cookie-banner #support-fab-btn{bottom:calc(var(--shark-bottom-nav-space) + var(--cookie-banner-h,170px) + 16px)}@media (min-width:769px){body.has-cookie-banner .sidebar-menu{height:calc(100vh - var(--cookie-banner-h,170px))!important;height:calc(100dvh - var(--cookie-banner-h,170px))!important}}@media (max-width:600px){body.has-cookie-banner{padding-bottom:0}}.shark-cookie-banner{display:none;position:fixed;left:16px;right:16px;margin:0 auto;max-width:860px;bottom:calc(var(--shark-bottom-nav-space) + 16px);z-index:9999;background:var(--panel-bg);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-radius:16px;box-shadow:0 10px 36px rgba(0,0,0,.5);border:1.5px solid var(--panel-border);font-family:var(--font-main);animation:sharkFadeIn .5s;color:var(--text-primary);padding:.6rem .75rem .6rem 1rem;display:flex;align-items:center;justify-content:space-between;flex-wrap:nowrap;gap:1rem}.shark-cookie-text{margin:0;font-size:.85em;line-height:1.45;color:var(--text-secondary)}.shark-cookie-text a,.shark-cookie-link{color:var(--accent-primary);white-space:nowrap;text-decoration:underline;text-underline-offset:2px;font:inherit;font-weight:600;background:none;border:0;padding:0;cursor:pointer}.shark-cookie-text a:hover,.shark-cookie-link:hover{color:#fff}.shark-cookie-content-wrapper{display:flex;align-items:center;gap:15px;flex:1 1 auto;min-width:0}.shark-cookie-row{display:flex;gap:15px;align-items:center}.shark-cookie-logo{width:28px;height:auto;flex-shrink:0}.shark-cookie-actions{display:flex;gap:.5em;flex-shrink:0}.shark-cookie-actions .shark-cookie-btn{padding:.5em 1em;font-size:.88em}.shark-cookie-btn{border:none;border-radius:10px;padding:.6em 1.2em;font-size:.95em;font-weight:700;cursor:pointer;transition:all .2s ease-in-out;white-space:nowrap}.shark-cookie-btn.primary{background:linear-gradient(135deg,var(--accent-secondary),var(--accent-primary));color:var(--deep-ocean-start);box-shadow:0 4px 15px var(--shadow-color-light)}.shark-cookie-btn.secondary{background:var(--input-bg);color:var(--accent-primary);border:2px solid var(--panel-border)}.shark-cookie-btn.danger{background:transparent;color:var(--error-color);border:2px solid var(--error-color)}.shark-cookie-btn:hover{transform:translateY(-2px);filter:brightness(1.1);box-shadow:0 6px 20px var(--shadow-color-strong)}.shark-cookie-modal{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,7,15,.85);z-index:10000;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);animation:sharkFadeIn .3s;align-items:center;justify-content:center;padding:1rem;overflow:hidden}.shark-cookie-modal-content{background:var(--panel-bg);border-radius:18px;max-width:520px;width:100%;box-shadow:0 8px 40px var(--shadow-color-strong);overflow:hidden;border:1px solid var(--panel-border);color:var(--text-primary);display:flex;flex-direction:column;max-height:90vh;transition:max-width .3s ease}.shark-cookie-modal-content.wide{max-width:800px}.shark-cookie-modal-header{display:flex;align-items:center;justify-content:space-between;padding:1.2rem 1.5rem;border-bottom:1px solid var(--panel-border);flex-shrink:0}.shark-cookie-modal-header h3{margin:0;font-size:1.2em;font-weight:700;color:var(--accent-primary);display:flex;align-items:center;gap:.7em}.close-modal{background:none;border:none;font-size:1.8em;color:var(--text-secondary);cursor:pointer;transition:color .2s;padding:0;line-height:1}.close-modal:hover{color:var(--accent-primary)}.shark-cookie-modal-tabs{display:flex;border-bottom:1px solid var(--panel-border);padding:.5rem;background-color:rgba(0,0,0,.2);flex-shrink:0;gap:.5rem}.tab-btn{flex:1;padding:.8em;background:none;border:none;font-weight:600;font-size:.95em;color:var(--text-secondary);cursor:pointer;border-radius:8px;transition:background .2s,color .2s}.tab-btn.active{background:linear-gradient(135deg,var(--accent-secondary),var(--accent-primary));color:var(--deep-ocean-start);box-shadow:0 2px 12px var(--shadow-color-light)}.tab-btn:not(.active):hover{background:rgba(0,229,255,.1);color:var(--accent-primary)}.tab-simple-desc{color:var(--text-secondary);font-size:.9em;padding:.8rem 1.5rem .5rem;opacity:.9;text-align:center;flex-shrink:0}.shark-cookie-modal-body{overflow-y:auto;padding:0;flex-grow:1}.tab-content{display:none;padding:1rem}.tab-content.active{display:block;animation:sharkFadeIn .5s}.cookie-category{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-radius:12px;background:var(--input-bg);margin-bottom:.8rem;border:1px solid var(--panel-border);gap:1rem}.cookie-category div{flex-grow:1}.cookie-category h4{margin:0 0 .2em 0;font-size:1.05em;color:var(--text-primary);font-weight:600}.cookie-category-desc{font-size:.85em;color:var(--text-secondary);line-height:1.4}.switch{position:relative;display:inline-block;width:52px;height:28px;flex-shrink:0}.switch input{opacity:0;width:100%;height:100%;cursor:pointer}.slider{position:absolute;inset:0;background-color:var(--input-bg);border-radius:28px;transition:background-color .3s;border:1.5px solid var(--panel-border)}.slider:before{position:absolute;content:"";height:20px;width:20px;left:3px;top:50%;transform:translateY(-50%);background-color:var(--text-secondary);border-radius:50%;transition:all .3s ease-in-out}input:checked+.slider{background-color:var(--accent-secondary)}input:checked+.slider:before{transform:translateX(24px) translateY(-50%);background-color:white}input:disabled+.slider{background-color:rgba(0,0,0,.2);cursor:not-allowed;opacity:.6}.shark-cookie-table-container{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;margin-bottom:1.5rem}.shark-cookie-table{width:100%;border-collapse:collapse;margin:0;font-size:.85em;color:var(--text-secondary);min-width:100%}.shark-cookie-table caption{font-size:1.1em;font-weight:700;padding:.5rem 0;text-align:left;color:var(--text-primary);position:sticky;left:0}.shark-cookie-table th,.shark-cookie-table td{padding:.8em;border-bottom:1px solid var(--panel-border);text-align:left;vertical-align:top}.shark-cookie-table th{color:var(--accent-primary);background:rgba(0,0,0,.25);font-weight:600;white-space:nowrap}.shark-cookie-modal-footer{display:flex;gap:1em;padding:1.2rem;border-top:1px solid var(--panel-border);justify-content:center;background:rgba(0,0,0,.2);flex-shrink:0;flex-wrap:wrap}#cookie-mobile-trigger{display:none;position:fixed;left:16px;bottom:95px;z-index:9998;font-size:1.6em;cursor:pointer;background:var(--panel-bg);color:var(--accent-primary);width:50px;height:50px;border-radius:50%;align-items:center;justify-content:center;box-shadow:0 4px 16px var(--shadow-color-strong);border:1.5px solid var(--panel-border);transition:transform .2s ease-in-out,box-shadow .2s}#cookie-mobile-trigger:hover{transform:scale(1.1);box-shadow:0 6px 20px var(--shadow-color-strong)}@keyframes sharkFadeIn{from{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}@media (max-width:768px){.shark-cookie-banner{padding:.6rem .7rem}.shark-cookie-actions{flex-direction:column}}@media (max-width:600px){.shark-cookie-banner{display:none!important}.shark-cookie-modal{padding:10px!important;align-items:center}.shark-cookie-modal-content,.shark-cookie-modal-content.wide{max-width:100%!important;width:100%!important;max-height:85vh;margin:0 auto}.shark-cookie-modal-header{padding:1rem}.shark-cookie-modal-header h3{font-size:1.1em}.shark-cookie-modal-body{padding:0}.tab-content{padding:.8rem}.shark-cookie-modal-footer{flex-direction:column;gap:.8rem!important;padding:1rem}.shark-cookie-btn{width:100%;padding:.8em}.tab-btn{font-size:.85em;padding:.6em}.shark-cookie-table thead{display:none}.shark-cookie-table,.shark-cookie-table tbody,.shark-cookie-table tr,.shark-cookie-table td{display:block;width:100%}.shark-cookie-table tr{margin-bottom:1.2rem;border:1px solid var(--panel-border);border-radius:12px;padding:1rem;background:rgba(255,255,255,.02);box-shadow:0 4px 10px rgba(0,0,0,.2)}.shark-cookie-table caption{text-align:left;padding:10px;margin-bottom:8px;font-weight:700;font-size:1em;color:var(--accent-primary);background:rgba(0,229,255,.05);border-radius:8px;border:1px solid var(--panel-border);line-height:1.4;display:block}.shark-cookie-table td{padding:.5rem 0;text-align:left;position:relative;border:none;border-bottom:1px solid rgba(255,255,255,.05);display:flex;align-items:flex-start;gap:15px}.shark-cookie-table td:last-child{border-bottom:none}.shark-cookie-table td::before{content:attr(data-label);font-weight:600;color:var(--accent-primary);min-width:80px;flex-shrink:0;font-size:.9em;opacity:.9}.shark-cookie-table td.text-row{display:block;padding:0;line-height:1.5}.shark-cookie-table td.text-row::before{display:none}} 3710</style> 3711 3712<div id="cookie-banner" class="shark-cookie-banner" style="display: none;"> 3713 <div class="shark-cookie-content-wrapper"> 3714 <div class="shark-cookie-row"> 3715 <img src="https://sharkearnings.com/assets/images/logos/sharklogo.webp" alt="" class="shark-cookie-logo" width="28" height="27" onerror="this.style.display='none'"> 3716 <p class="shark-cookie-text">We use cookies to run the site and, with your consent, for analytics and marketing (Google Analytics, Meta Pixel). <a href="/cookie">Cookie Policy</a><span aria-hidden="true"> · </span><button type="button" class="shark-cookie-link" onclick="sharkShowCookieSettings()">Customize</button></p> 3717 </div> 3718 </div> 3719 <div class="shark-cookie-actions"> 3720 <button type="button" onclick="sharkAcceptNecessaryCookie
3720s()" class="shark-cookie-btn secondary">Necessary Only</button> 3721 <button type="button" onclick="sharkAcceptAllCookies()" class="shark-cookie-btn secondary">Accept All</button> 3722 </div> 3723</div> 3724 3725<div id="cookie-modal" class="shark-cookie-modal"> 3726 <div class="shark-cookie-modal-content" id="cookieModalContent"> 3727 <div class="shark-cookie-modal-header"> 3728 <h3><i class="fas fa-cookie-bite"></i> Cookie Preferences</h3> 3729 <button class="close-modal" onclick="sharkCloseCookieModal()">Ã</button> 3730 </div> 3731 <div class="shark-cookie-modal-tabs"> 3732 <button class="tab-btn active" onclick="sharkOpenTab('categories', this)">Categories</button> 3733 <button class="tab-btn" onclick="sharkOpenTab('declaration', this)">Cookie Declaration</button> 3734 </div> 3735 <div class="tab-simple-desc" id="desc-categories"> 3736 You can change or withdraw your consent here at any time. 3737 </div> 3738 <div class="tab-simple-desc" id="desc-declaration" style="display:none;"> 3739 Cookies are grouped by category. You can allow or deny them below. 3740 </div> 3741 <div class="shark-cookie-modal-body"> 3742 <div class="tab-content active" id="categories"> 3743 <div class="cookie-category"> 3744 <div> 3745 <h4>Necessary Cookies</h4> 3746 <div class="cookie-category-desc"> 3747 These cookies are essential for the website to function, including login sessions, security (CSRF protection, CAPTCHA), fraud prevention, identity verification (Face Match), and cannot be disabled. 3748 </div> 3749 </div> 3750 <label class="switch"> 3751 <input type="checkbox" checked disabled> 3752 <span class="slider"></span> 3753 </label> 3754 </div> 3755 <div class="cookie-category"> 3756 <div> 3757 <h4>Analytics & Advertising Cookies</h4> 3758 <div class="cookie-category-desc"> 3759 Google Analytics and the Meta Pixel help us understand how the site is used and whether our advertising works. They are only set if you allow them. 3760 </div> 3761 </div> 3762 <label class="switch"> 3763 <input type="checkbox" id="analyticsCookies"> 3764 <span class="slider"></span> 3765 </label> 3766 </div> 3767 <div class="cookie-category"> 3768 <div> 3769 <h4>Advertiser & Offer Cookies</h4> 3770 <div class="cookie-category-desc"> 3771 To track offer completions and credit your earnings, our partners place cookies when you visit their sites. These are essential for using our service and cannot be disabled here. 3772 </div> 3773 </div> 3774 </div> 3775 </div> 3776 <div class="tab-content" id="declaration"> 3777 <div class="shark-cookie-table-container"> 3778 <table class="shark-cookie-table"> 3779 <caption>Necessary (Essential for site function and security)</caption> 3780 <thead> 3781 <tr><th>Name</th><th>Provider</th><th>Purpose</th><th>Expiry</th></tr> 3782 </thead> 3783 <tbody> 3784 <tr><td data-label="Name">PHPSESSID</td><td data-label="Provider">sharkearnings.com</td><td data-label="Purpose">Manages user login session and CSRF protection.</td><td data-label="Expiry">Session</td></tr> 3785 <tr><td data-label="Name">_cf*</td><td data-label="Provider">Cloudflare</td><td data-label="Purpose">Used by Cloudflare Turnstile for CAPTCHA security on forms.</td><td data-label="Expiry">Varies</td></tr> 3786 <tr><td data-label="Name">Verisoul Session & Device Data</td><td data-label="Provider">verisoul.ai / sharkearnings.com</td><td data-label="Purpose">Identity verification through facial recognition (Face Match), device fingerprinting, fraud detection, bot prevention, and account security to protect against fraudulent activities and ensure user authenticity.</td><td data-label="Expiry">Session / Persistent</td></tr> 3787 <tr><td data-label="Name">localStorage: shark_cookie_prefs</td><td data-label="Provider">sharkearnings.com</td><td data-label="Purpose">Stores your cookie consent preferences.</td><td data-label="Expiry">Persistent</td></tr> 3788 <tr><td data-label="Name">G_AUTHUSER, G_ENABLED_IDPS</td><td data-label="Provider">accounts.google.com</td><td data-label="Purpose">Enables "Sign in with Google" functionality.</td><td data-label="Expiry">Varies</td></tr> 3789 <tr><td data-label="Name">referrer_code</td><td data-label="Provider">sharkearnings.com</td><td data-label="Purpose">Ensures your referrer gets credited correctly if you sign up later.</td><td data-label="Expiry">30 days</td></tr> 3790 </tbody> 3791 </table> 3792 </div> 3793 <div class="shark-cookie-table-container"> 3794 <table class="shark-cookie-table"> 3795 <caption>Analytics &
3795 Advertising (only with your consent)</caption> 3796 <thead> 3797 <tr><th>Name</th><th>Provider</th><th>Purpose</th><th>Expiry</th></tr> 3798 </thead> 3799 <tbody> 3800 <tr><td data-label="Name">_ga, _ga_*</td><td data-label="Provider">Google Analytics</td><td data-label="Purpose">Distinguishes visitors and sessions to produce usage statistics.</td><td data-label="Expiry">Up to 2 years</td></tr> 3801 <tr><td data-label="Name">_fbp</td><td data-label="Provider">Meta Platforms (Meta Pixel)</td><td data-label="Purpose">Identifies your browser to measure whether our Facebook and Instagram ads lead to visits and registrations.</td><td data-label="Expiry">3 months</td></tr> 3802 <tr><td data-label="Name">Cloudflare Insights ID</td><td data-label="Provider">cloudflareinsights.com</td><td data-label="Purpose">Collects anonymous performance and usage analytics.</td><td data-label="Expiry">Varies</td></tr> 3803 </tbody> 3804 </table> 3805 </div> 3806 <div class="shark-cookie-table-container"> 3807 <table class="shark-cookie-table"> 3808 <caption>Third-Party Offer & Advertiser Cookies (Essential for Earning)</caption> 3809 <tbody> 3810 <tr> 3811 <td colspan="4" class="text-row"> 3812 When you click a link to complete an offer (e.g., on an offerwall), you are redirected to a partner's website. These third-party sites use their own cookies to track the offer's completion. We do not control these cookies, and your interaction is governed by their respective privacy policies. Enabling cookies in your browser is essential for your earnings to be tracked correctly. 3813 </td> 3814 </tr> 3815 </tbody> 3816 </table> 3817 </div> 3818 </div> 3819 </div> 3820 <div class="shark-cookie-modal-footer"> 3821 <button onclick="sharkSaveCookieSettings()" class="shark-cookie-btn primary">Save Preferences</button> 3822 <button onclick="sharkAcceptAllCookies()" class="shark-cookie-btn secondary">Accept All</button>
3823 <button onclick="sharkAcceptNecessaryCookies()" class="shark-cookie-btn secondary">Necessary Only</button> 3824 </div> 3825 </div> 3826</div> 3827 3828<div id="cookie-mobile-trigger" role="button" aria-label="Cookie Settings" onclick="sharkShowCookieSettings()"> 3829 <i class="fas fa-cookie-bite"></i> 3830</div> 3831
3832<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">!function(){"use strict";let e="shark_cookie_prefs",t=document.getElementById("cookie-banner"),a=document.getElementById("cookie-modal"),n=document.getElementById("cookie-mobile-trigger"),s=document.getElementById("analyticsCookies"),i=document.getElementById("cookieModalContent");function o(){t&&(t.style.display="none"),a&&(a.style.display="none"),n&&(n.style.display="none")}function d(){let a=localStorage.getItem(e);if(a){o();return}let s=window.innerWidth<=600;s?(n&&(n.style.display="flex"),t&&(t.style.display="none")):(t&&(t.style.display="flex"),n&&(n.style.display="none"))}function l(t){localStorage.setItem(e,JSON.stringify({necessary:!0,analytics:t,date:new Date().toISOString()})),"function"==typeof gtag&&(t?gtag("consent","update",{analytics_storage:"granted",ad_storage:"granted",ad_user_data:"granted",ad_personalization:"granted"}):gtag("consent","update",{analytics_storage:"denied",ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"})),o()}function r(){!function t(){let a=document.createElement("script");function n(){dataLayer.push(arguments)}a.async=!0,a.src="https://www.googletagmanager.com/gtag/js?id=G-MRRRNEZD2W",document.head.appendChild(a),window.dataLayer=window.dataLayer||[],window.gtag=n,n("js",new Date);let s=localStorage.getItem(e),i=s?JSON.parse(s):{analytics:!1};i.analytics?(n("consent","update",{analytics_storage:"granted",ad_storage:"granted",ad_user_data:"granted",ad_personalization:"granted"}),n("config","G-MRRRNEZD2W",{anonymize_ip:!1})):(n("consent","default",{analytics_storage:"denied",ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}),n("config","G-MRRRNEZD2W",{anonymize_ip:!0,client_storage:"none"}))}(),d(),window.addEventListener("resize",d)}window.sharkAcceptAllCookies=function(){l(!0)}
3832,window.sharkAcceptNecessaryCookies=function(){l(!1)},window.sharkSaveCookieSettings=function(){s&&l(s.checked),a&&(a.style.display="none")},window.sharkShowCookieSettings=function(){if(!a)return;let i=localStorage.getItem(e),o=!!i&&!!JSON.parse(i).analytics;s&&(s.checked=o),a.style.display="flex",t&&(t.style.display="none"),n&&(n.style.display="none");let d=document.querySelector(".shark-cookie-modal-tabs .tab-btn");d&&window.sharkOpenTab("categories",d)},window.sharkCloseCookieModal=function(){a&&(a.style.display="none"),d()},window.sharkOpenTab=function(e,t){if(!document.getElementById(e)||!t)return;document.querySelectorAll(".tab-content").forEach(e=>e.classList.remove("active")),document.querySelectorAll(".tab-btn").forEach(e=>e.classList.remove("active")),document.getElementById(e).classList.add("active"),t.classList.add("active");let a=document.getElementById("desc-categories"),n=document.getElementById("desc-declaration");a&&(a.style.display="categories"===e?"block":"none"),n&&(n.style.display="declaration"===e?"block":"none"),i&&i.classList.toggle("wide","declaration"===e)},"loading"===document.readyState?document.addEventListener("DOMContentLoaded",r):r()}(); 3833 3834</script>
vendor: 1 bytes, line 3834
3834
3835<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">!function(){function g(){try{var p=JSON.parse(localStorage.getItem("shark_cookie_prefs")||"null");return!!(p&&p.analytics)}catch(e){return!1}}function w(){["_fbp","_fbc"].concat(document.cookie.split(";").map(function(c){return c.split("=")[0].trim()}).filter(function(n){return/^_ga(_|$)/.test(n)})).forEach(function(n){var h=location.hostname.replace(/^www\./,"");["","; domain="+h,"; domain=."+h].forEach(function(d){document.cookie=n+"=; Max-Age=0; path=/"+d})})}["sharkAcceptAllCookies","sharkAcceptNecessaryCookies","sharkSaveCookieSettings"].forEach(function(k){var f=window[k];if("function"!=typeof f)return;window[k]=function(){var r=f.apply(this,arguments);g()?"function"==typeof window.sharkOnAnalyticsConsent&&window.sharkOnAnalyticsConsent():w();return r}})}();</script>
vendor: 1 bytes, line 3835
3835
3836<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 3837/* A banner fixen all a lap aljan (z-index 9999), ezert eltakarja a lablec also 3838 sorat - a szabalyzat-linkeket es a nyelvvalasztot. Amig latszik, a body also 3839 paddingja tartja fenn a helyet, hogy a tartalom folebe tudjon gorogni. */ 3840(function () { 3841 var el = document.getElementById('cookie-banner'); 3842 if (!el) return; 3843 function sync() { 3844 var visible = getComputedStyle(el).display !== 'none'; 3845 document.body.classList.toggle('has-cookie-banner', visible); 3846 document.documentElement.style.setProperty( 3847 '--cookie-banner-h', visible ? el.offsetHeight + 'px' : '0px'); 3848 } 3849 sync(); 3850 try { 3851 new MutationObserver(sync).observe(el, { attributes: true, attributeFilter: ['style', 'class'] }); 3852 new ResizeObserver(sync).observe(el); 3853 } catch (e) {} 3854 window.addEventListener('resize', sync, { passive: true }); 3855})(); 3856</script>
3856 3857 <nav class="mobile-bottom-nav mobile-only" id="mobile-bottom-nav"> 3858 <a href="/earn" class=""> 3859 <i class="fas fa-coins"></i> 3860 <span>Earn</span> 3861 </a> 3862 <a href="/offers" class=""> 3863 <i class="fas fa-tags"></i> 3864 <span>Offers</span> 3865 </a> 3866 <a href="/surveys" class=""> 3867 <i class="fas fa-poll"></i> 3868 <span>Surveys</span> 3869 </a> 3870 <a href="/rewards" class=""> 3871 <i class="fas fa-gift"></i> 3872 <span>Rewards</span> 3873 </a> 3874 <a href="/cashout" class=""> 3875 <i class="fas fa-wallet"></i> 3876 <span>Cashout</span> 3877 </a> 3878 <button class="mobile-menu-toggle" id="mobileMenuToggle"> 3879 <i class="fas fa-bars"></i> 3880 <span>Menu</span> 3881 </button> 3882 </nav> 3883 <div id="android-app-banner" class="android-app-banner" role="region" aria-label="Get the Android app" hidden> 3884 <img src="/assets/images/logos/sharklogo.webp" alt="" class="aab-icon" width="120" height="115"> 3885 <div class="aab-text"> 3886 <strong>Shark Earnings is now on Android</strong> 3887 <span>Faster earning, right from your phone.</span> 3888 </div> 3889 <a class="aab-btn" href="https://play.google.com/store/apps/details?id=com.sharkearnings.app" target="_blank" rel="noopener noreferrer">Get the App</a> 3890 <button type="button" class="aab-close" id="aabClose" aria-label="Dismiss">×</button> 3891 </div> 3892
3892<script type="text/javascript" nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 3893 (function(){ 3894 var banner=document.getElementById('android-app-banner'); 3895 if(!banner)return; 3896 var ua=navigator.userAgent||''; 3897 var isAndroid=/Android/i.test(ua); 3898 var inApp=ua.indexOf('SharkEarningsApp')!==-1||document.body.classList.contains('is-mobile-app')||/wv\)/i.test(ua); 3899 var dismissed=false; 3900 try{dismissed=localStorage.getItem('aab_dismissed')==='1';}catch(e){} 3901 if(isAndroid&&!inApp&&!dismissed){ 3902 requestAnimationFrame(function(){banner.hidden=false;requestAnimationFrame(function(){banner.classList.add('aab-show');document.body.classList.add('has-app-banner');});}); 3903 } 3904 var close=document.getElementById('aabClose'); 3905 if(close){close.addEventListener('click',function(){ 3906 banner.classList.remove('aab-show'); 3907 document.body.classList.remove('has-app-banner'); 3908 try{localStorage.setItem('aab_dismissed','1');}catch(e){} 3909 setTimeout(function(){banner.hidden=true;},300); 3910 });} 3911 })(); 3912 </script>
3912 3913
3913<script type="text/javascript" nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 3914 (function(){ 3915 var nav=document.getElementById('mobile-bottom-nav'); 3916 if(!nav)return; 3917 var reduce=window.matchMedia&&window.matchMedia('(prefers-reduced-motion:reduce)').matches; 3918 function haptic(){ 3919 try{ 3920 if(window.flutter_inappwebview&&window.flutter_inappwebview.callHandler){window.flutter_inappwebview.callHandler('haptic','selection');return;} 3921 if(navigator.vibrate){navigator.vibrate(8);} 3922 }catch(e){} 3923 } 3924 nav.querySelectorAll('a,button').forEach(function(el){ 3925 el.addEventListener('pointerdown',function(){ 3926 haptic(); 3927 if(reduce||el.classList.contains('active'))return; 3928 el.classList.add('tap-press'); 3929 },{passive:true}); 3930 ['pointerup','pointerleave','pointercancel'].forEach(function(ev){ 3931 el.addEventListener(ev,function(){el.classList.remove('tap-press');},{passive:true}); 3932 }); 3933 }); 3934 })(); 3935 </script>
3935 3936 <footer class="gf-footer"> 3937 <div class="gf-main"> 3938 <div class="gf-brand"> 3939 <img src="/assets/images/logos/sharklogo_text_540.webp" alt="Shark Earnings" loading="lazy" decoding="async" width="180" height="48" style="height:48px;width:auto;"> 3940 <p class="gf-desc">Earn real money playing games, completing offers & surveys. Fast payouts via PayPal, Crypto & Gift Cards.</p> 3941 <a class="gf-gplay" href="https://play.google.com/store/apps/details?id=com.sharkearnings.app" target="_blank" rel="noopener noreferrer" aria-label="Get it on Google Play - Shark Earnings for Android"> 3942 <img src="/assets/images/get_it_on_googleplay.webp" alt="Get it on Google Play" loading="lazy" decoding="async" width="160" height="48"> 3943 </a> 3944 </div> 3945 <div class="gf-links"> 3946 <div class="gf-col gf-ai-col"> 3947 <div class="gf-col-title">Ask AI</div> 3948 <a href="https://chat.openai.com/?q=I%27m%20researching%20get-paid-to%20%28GPT%29%20reward%20platforms%20where%20you%20can%20earn%20real%20money%20playing%20games%2C%20testing%20apps%2C%20and%20completing%20surveys.%20What%20is%20Shark%20Earnings%20%28sharkearnings.com%29%3F%20What%20does%20it%20offer%2C%20and%20what%20are%20its%20best%20features%20compared%20to%20other%20GPT%20and%20rewards%20platforms%3F%20How%20is%20it%20different%20from%20traditional%20survey%20sites%20and%20cashback%20apps%3F%20Please%20explain%20its%20key%20strengths%20in%20payout%20speed%2C%20minimum%20cashout%20amount%2C%20payment%20method%20variety%20%28PayPal%2C%20crypto%2C%20gift%20cards%29%2C%20offer%20variety%2C%20and%20mobile%20experience.%20Focus%20on%20why%20these%20features%20matter%20for%20someone%20who%20wants%20to%20start%20earning%20quickly%20with%20a%20low%20barrier%20to%20entry." target="_blank" rel="noopener noreferrer nofollow"><span class="ask-ai-ico" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"/></svg></span>ChatGPT</a> 3949 <a href="https://claude.ai/new?q=I%27m%20researching%20get-paid-to%20%28GPT%29%20reward%20platforms%20where%20you%20can%20earn%20real%20money%20playing%20games%2C%20testing%20apps%2C%20and%20completing%20surveys.%20What%20is%20Shark%20Earnings%20%28sharkearnings.com%29%3F%20What%20does%20it%20offer%2C%20and%20what%20are%20its%20best%20features%20compared%20to%20other%20GPT%20and%20rewards%20platforms%3F%20How%20is%20it%20different%20from%20traditional%20survey%20sites%20and%20cashback%20apps%3F%20Please%20explain%20its%20key%20strengths%20in%20payout%20speed%2C%20minimum%20cashout%20amount%2C%20payment%20method%20variety%20%28PayPal%2C%20crypto%2C%20gift%20cards%29%2C%20offer%20variety%2C%20and%20mobile%20experience.%20Focus%20on%20why%20these%20features%20matter%20for%20someone%20who%20wants%20to%20start%20earning%20quickly%20with%20a%20low%20barrier%20to%20entry." target="_blank" rel="noopener noreferrer nofollow"><span class="ask-ai-ico" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578
39491.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.
39490182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z"/></svg></span>Claude</a> 3950 <a href="https://www.google.com/search?udm=50&aep=11&q=I%27m%20researching%20get-paid-to%20%28GPT%29%20reward%20platforms%20where%20you%20can%20earn%20real%20money%20playing%20games%2C%20testing%20apps%2C%20and%20completing%20surveys.%20What%20is%20Shark%20Earnings%20%28sharkearnings.com%29%3F%20What%20does%20it%20offer%2C%20and%20what%20are%20its%20best%20features%20compared%20to%20other%20GPT%20and%20rewards%20platforms%3F%20How%20is%20it%20different%20from%20traditional%20survey%20sites%20and%20cashback%20apps%3F%20Please%20explain%20its%20key%20strengths%20in%20payout%20speed%2C%20minimum%20cashout%20amount%2C%20payment%20method%20variety%20%28PayPal%2C%20crypto%2C%20gift%20cards%29%2C%20offer%20variety%2C%20and%20mobile%20experience.%20Focus%20on%20why%20these%20features%20matter%20for%20someone%20who%20wants%20to%20start%20earning%20quickly%20with%20a%20low%20barrier%20to%20entry." target="_blank" rel="noopener noreferrer nofollow"><span class="ask-ai-ico" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M11.04 19.32Q12 21.51 12 24q0-2.49.93-4.68.96-2.19 2.58-3.81t3.81-2.55Q21.51 12 24 12q-2.49 0-4.68-.93a12.3 12.3 0 0 1-3.81-2.58 12.3 12.3 0 0 1-2.58-3.81Q12 2.49 12 0q0 2.49-.96 4.68-.93 2.19-2.55 3.81a12.3 12.3 0 0 1-3.81 2.58Q2.49 12 0 12q2.49 0 4.68.96 2.19.93 3.81 2.55t2.55 3.81"/></svg></span>Gemini</a> 3951 <a href="https://grok.com/?q=I%27m%20researching%20get-paid-to%20%28GPT%29%20reward%20platforms%20where%20you%20can%20earn%20real%20money%20playing%20games%2C%20testing%20apps%2C%20and%20completing%20surveys.%20What%20is%20Shark%20Earnings%20%28sharkearnings.com%29%3F%20What%20does%20it%20offer%2C%20and%20what%20are%20its%20best%20features%20compared%20to%20other%20GPT%20and%20rewards%20platforms%3F%20How%20is%20it%20different%20from%20traditional%20survey%20sites%20and%20cashback%20apps%3F%20Please%20explain%20its%20key%20strengths%20in%20payout%20speed%2C%20minimum%20cashout%20amount%2C%20payment%20method%20variety%20%28PayPal%2C%20crypto%2C%20gift%20cards%29%2C%20offer%20variety%2C%20and%20mobile%20experience.%20Focus%20on%20why%20these%20features%20matter%20for%20someone%20who%20wants%20to%20start%20earning%20quickly%20with%20a%20low%20barrier%20to%20entry." target="_blank" rel="noopener noreferrer nofollow"><span class="ask-ai-ico" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="10.5" fill="none" stroke="currentColor" stroke-width="1.6"/><text x="12" y="16.5" text-anchor="middle" font-size="11" font-weight="700" fill="currentColor" font-family="Arial,sans-serif">G</text></svg></span>Grok</a> 3952 <a href="https://www.perplexity.ai/search?q=I%27m%20researching%20get-paid-to%20%28GPT%29%20reward%20platforms%20where%20you%20can%20earn%20real%20money%20playing%20games%2C%20testing%20apps%2C%20and%20completing%20surveys.%20What%20is%20Shark%20Earnings%20%28sharkearnings.com%29%3F%20What%20does%20it%20offer%2C%20and%20what%20are%20its%20best%20features%20compared%20to%20other%20GPT%20and%20rewards%20platforms%3F%20How%20is%20it%20different%20from%20traditional%20survey%20sites%20and%20cashback%20apps%3F%20Please%20explain%20its%20key%20strengths%20in%20payout%20speed%2C%20minimum%20cashout%20amount%2C%20payment%20method%20variety%20%28PayPal%2C%20crypto%2C%20gift%20cards%29%2C%20offer%20variety%2C%20and%20mobile%20experience.%20Focus%20on%20why%20these%20features%20matter%20for%20someone%20who%20wants%20to%20start%20earning%20quickly%20with%20a%20low%20barrier%20to%20entry." target="_blank" rel="noopener noreferrer nofollow"><span class="ask-ai-ico" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M22.3977 7.0896h-2.3106V.0676l-7.5094 6.3542V.1577h-1.1554v6.1966L4.4904 0v7.0896H1.6023v10.3976h2.8882V24l6.932-6.3591v6.2005h1.1554v-6.0469l6.9318 6.1807v-6.4879h2.8882V7.0896zm-3.4657-4.531v4.531h-5.355l5.355-4.531zm-13.2862.0676 4.8691 4.4634H5.6458V2.6262zM2.7576 16.332V8.245h7.8476l-6.1149 6.1147v1.9723H2.7576zm2.8882 5.0404v-3.8852h.0001v-2.6488l5.7763-5.7764v7.0111l-5.7764 5.2993zm12.7086.0248-5.7766-5.1509V9.0618l5.7766 5.7766v6.5588zm2.8882-5.0652h-1.733v-1.9723L13.3948 8.245h7.8478v8.087z"/></svg></span>Perplexity</a> 3953 </div> 3954 <div class="gf-col"> 3955 <div class="gf-col-title">Platform</div> 3956 <a href="/earn">Earn</a> 3957 <a href="/surveys">Surveys</a> 3958 <a href="/offers">Offers</a> 3959 <a href="/rewards">Rewards</a> 3960 <a href="/cashout">Cash out</a> 3961 <a href="/account">Account</a> 3962 <a href="/affiliates">Affiliates</a> 3963 <a href="/race">Races</a> 3964 </div> 3965 <div class="gf-col"> 3966 <div class="gf-col-title">Shark Earnings</div> 3967 <a href="/support">Contact Us</a> 3968 <a href="/academy/guides/how-to-start-earning">How to start?</a> 3969 <a href="https://sharklio.com/">Advertise with us</a> 3970 <a href="/academy">Academy</a> 3971 <a href="/academy/general/tracking-troubleshooting">Tracking Issues</a> 3972 <a href="/academy/rewards/missing-reward-help">Missing Reward</a> 3973 <a href="/academy/account/withdrawal-rejected">Withdrawal Rejected</a> 3974 <a href="/academy/general/how-long-does-withdrawal-take">How Long Withdrawals Take</a> 3975 </div> 3976 <div class="gf-col"> 3977 <div class="gf-col-title">Ways to Make Money</div> 3978 <a href="/academy/guides/how-to-make-money-playing-games-on-phone-2026">Earn Playing Games</a> 3979 <a href="/academy/guides/complete-survey-masterclass">Earn Answering Surveys</a> 3980 <a href="/academy/guides/profit-from-purchase-offers">Earn Testing Products</a> 3981 <a href="/academy/guides/passive-video-earning-guide">Earn Watching Videos</a> 3982 <a href="/academy/guides/watching-ads-earn-money-guide">Earn Watching Ads</a> 3983 <a href="/academy/guides/downloading-apps-earn-money-guide">Earn Downloading Apps</a> 3984 <a href="/academy/guides/free-trials-earn-money-guide">Earn Free Trials</a> 3985 <a href="/academy/guides/simple-tasks-earn-money-guide">
3985Earn Simple Tasks</a> 3986 </div> 3987 </div> 3988 </div> 3989 <div class="gf-bottom"> 3990 <span class="gf-copy">© 2026 Shark Earnings.</span> 3991 <div class="gf-legal"> 3992 <a href="/tos">Terms of Service</a> 3993 <span class="gf-sep">•</span> 3994 <a href="/privacy">Privacy Policy</a> 3995 <span class="gf-sep">•</span> 3996 <a href="/cookie">Cookie Policy</a> 3997 <span class="gf-sep">•</span> 3998 <a href="#" onclick="if(typeof sharkShowCookieSettings==='function')sharkShowCookieSettings();return false;">Cookie Settings</a> 3999 <span class="gf-sep">•</span> 4000 <a href="/affiliate">Affiliate Policy</a> 4001 <span class="gf-sep">•</span> 4002 <a href="/aml">AML & KYC Policy</a> 4003 <span class="gf-sep">•</span> 4004 <a href="/api/activity">Activity API</a> 4005 </div> 4006 <div class="gf-lang"><div class="gtranslate_wrapper"></div></div> 4007 <div class="gf-social"> 4008 <a href="https://www.facebook.com/officialsharknetwork" target="_blank" rel="noopener noreferrer" aria-label="Facebook"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"/></svg></a> 4009 <a href="https://x.com/ofcsharknetwork" target="_blank" rel="noopener noreferrer" aria-label="X / Twitter"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.746l7.73-8.835L1.254 2.25H8.08l4.253 5.622zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg></a> 4010 <a href="https://www.instagram.com/officialsharknetwork/" target="_blank" rel="noopener noreferrer" aria-label="Instagram"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><rect x="2" y="2" width="20" height="20" rx="5" ry="5"/><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z" fill="var(--bg,#00070f)"/><line x1="17.5" y1="6.5" x2="17.51" y2="6.5" stroke="var(--bg,#00070f)" stroke-width="2" stroke-linecap="round"/></svg></a> 4011 <a href="https://discord.gg/shark-earnings-earn-cash-rewards-897403167820636190" target="_blank" rel="noopener noreferrer" aria-label="Discord"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057c.002.022.015.043.03.056a19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"/></svg></a> 4012 <a href="https://www.linkedin.com/company/sharknetwork" target="_blank" rel="noopener noreferrer" aria-label="LinkedIn"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6zM2 9h4v12H2z"/><circle cx="4" cy="4" r="2"/></svg></a> 4013 </div> 4014 </div> 4015</footer> 4016<style>main.earn-page{padding-bottom:1rem!important}.gf-footer{transition:width .3s,margin-left .3s;background:linear-gradient(180deg,rgba(3,10,22,.98) 0%,var(--deep-ocean-start,#00070f) 100%);border-top:1px solid rgba(0,229,255,.2);margin-bottom:0;padding-bottom:0;backdrop-filter:blur(10px)}.gf-main{display:flex;align-items:flex-start;flex-wrap:wrap;gap:2.5rem;padding:2.5rem 3rem 1rem;width:100%;box-sizing:border-box}.gf-brand{display:flex;flex-direction:column;align-items:flex-start;gap:.75rem;max-width:280px;flex-shrink:0}.gf-desc{color:var(--muted,#b2ebf2);font-size:.9em;line-height:1.6;margin:0}.gf-links{display:flex;flex-wrap:wrap;gap:2.5rem;flex:1 1 auto;justify-content:space-between}.gf-col{display:flex;flex-direction:column;gap:.45em;min-width:130px}.gf-col a{color:var(--text,#e0f7fa);text-decoration:none;font-weight:500;font-size:.9em;transition:color .2s,transform .2s;position:relative;display:inline-flex;align-items:center;min-height:24px;padding-bottom:2px;align-self:flex-start;width:fit-content}.gf-col a:hover{color:var(--primary,#00e5ff);text-decoration:none;transform:translateX(3px)}.gf-col a::after{content:"";position:absolute;bottom:0;left:0;width:0;height:1.5px;background:linear-gradient(90deg,var(--accent-primary),var(--accent-glow));transition:width .25s cubic-bezier(.4,0,.2,1);border-radius:1px}.gf-col a:hover::after{width:100%}.gf-col-title{font-weight:600;color:var(--accent,#18ffff);margin-bottom:.45em;font-size:1.04em}.gf-bottom{display:flex;align-items:center;flex-wrap:wrap;gap:.4rem 1.2rem;padding:.6rem 3rem .8rem;border-top:1px solid var(--border,rgba(0,229,255,.25));width:100%;box-sizing:border-box}.gf-copy{color:var(--muted,#b2ebf2);font-size:.82rem;white-space:nowrap}.gf-legal{display:flex;align-items:center;flex-wrap:wrap;gap:.3rem .5rem;font-size:.82rem}.gf-legal a{color:var(--text-secondary,#b2ebf2);text-decoration:none;transition:color .2s;
4016display:inline-flex;align-items:center;min-height:24px;padding:2px 0}.gf-ai-col a{display:inline-flex;align-items:center;min-height:24px}.gf-legal a:hover{color:var(--accent-primary,#00e5ff);text-decoration:underline}.gf-sep{color:var(--muted,#b2ebf2);opacity:.5}.gf-lang{display:flex;align-items:center;margin:0 auto}.gf-social{display:flex;align-items:center;gap:.5rem}.gf-social a{color:var(--text-secondary,#b2ebf2);opacity:.85;transition:opacity .2s,background .2s;display:flex;padding:5px;border-radius:6px;background:rgba(255,255,255,.06)}.gf-social a:hover{opacity:1;background:rgba(0,229,255,.15)} 4017.gf-stats-mini span{font-size:.78rem;color:var(--muted,rgba(197,240,247,.6));white-space:nowrap} 4018.gf-stats-mini strong{color:var(--accent-primary,#00e5ff);font-weight:700} 4019.gf-desc{color:var(--muted,#b2ebf2);font-size:.88em;line-height:1.55;margin:0;max-width:220px} 4020.gf-social a{color:var(--text-secondary,#b2ebf2);opacity:.85;transition:all .2s;display:flex;padding:7px;border-radius:8px;background:rgba(0,229,255,.05);border:1px solid rgba(0,229,255,.12);font-size:1rem} 4021.gf-social a:hover{opacity:1;background:rgba(0,229,255,.15);border-color:rgba(0,229,255,.4);transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,229,255,.2)} 4022.gf-gplay{display:inline-flex;align-items:center;transition:transform .2s,filter .2s;flex-shrink:0;margin-top:.35rem} 4023.gf-gplay img{height:44px;width:auto;display:block;border-radius:8px} 4024.gf-gplay:hover{transform:translateY(-2px);filter:brightness(1.08)} 4025.gf-col-title{font-weight:700;color:var(--accent-primary,#00e5ff);margin-bottom:.5em;font-size:.88rem;text-transform:uppercase;letter-spacing:.6px}.gf-ai-col a{display:inline-flex;align-items:center;gap:.5em}.ask-ai-ico{display:inline-flex;width:14px;height:14px;flex-shrink:0;color:var(--text-secondary,#b2ebf2);opacity:.85;transition:color .2s,opacity .2s}.ask-ai-ico svg{width:100%;height:100%;fill:currentColor}.gf-ai-col a:hover .ask-ai-ico{color:var(--primary,#00e5ff);opacity:1}@media(max-width:900px){.gf-main{flex-direction:column}.gf-brand{max-width:100%}}@media(max-width:768px){.gf-col{gap:.35rem}.gf-col a{min-height:28px;display:flex;align-items:center;padding:3px 0}.gf-ai-col a,.gf-legal a{min-height:28px;display:inline-flex;align-items:center;gap:6px;padding:3px 2px}.gf-social a{min-width:32px;min-height:32px;align-items:center;justify-content:center}}@media(max-width:600px){.gf-footer{padding-bottom:env(safe-area-inset-bottom,0)}.gf-main{padding:1.5rem 1rem .75rem;gap:1.5rem}.gf-brand{max-width:100%}.gf-links{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem 1rem;width:100%;align-items:start}.gf-col{min-width:0;width:100%;align-items:flex-start}.gf-bottom{flex-direction:column;align-items:center;gap:.75rem;padding:.75rem 1rem calc(var(--mobile-bottom-nav-height,60px) + 1.25rem)}.gf-legal{justify-content:center}.gf-lang{margin:0}.gf-social{justify-content:center;display:flex!important;order:10;width:100%;}.gf-copy{order:1}.gf-legal{order:2}.gf-lang{order:3}}</style>
4026<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">window.gtranslateSettings={"default_language":"en","detect_browser_language":false,"languages":["en","hu","de","es","pt","fr","ru"],"wrapper_selector":".gtranslate_wrapper"}</script>
vendor: 1 bytes, line 4026
4026
4027<script src="https://cdn.gtranslate.net/widgets/latest/dropdown.js" defer nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"></script>
4027 4028
4028<script type="text/javascript" nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 4029 window.addEventListener('load', function() { 4030 updateLayout(); 4031 }); 4032 </script>
4032 4033 4034<div id="tutorial-overlay" class="hidden"> 4035 <div class="tutorial-card"> 4036 <div class="tutorial-header"> 4037 <div class="tutorial-logo"> 4038 <img src="/assets/images/logos/sharklogo.webp" alt="Shark Earnings" width="32" height="32" loading="lazy"> 4039 <span>Shark Earnings</span> 4040 </div> 4041 <div class="tutorial-actions"> 4042 <div class="lang-selector"> 4043 <button class="lang-btn"><img src="https://flagcdn.com/w40/us.png" id="curr-lang-flag" alt="EN" width="32" height="17" loading="lazy"></button> 4044 <div class="lang-dropdown"> 4045 <div class="lang-opt" data-l="en" data-f="us"><img src="https://flagcdn.com/w40/us.png" alt="EN" width="20" height="11" loading="lazy"> English</div> 4046 <div class="lang-opt" data-l="hu" data-f="hu"><img src="https://flagcdn.com/w40/hu.png" alt="HU" width="20" height="11" loading="lazy"> Magyar</div> 4047 <div class="lang-opt" data-l="de" data-f="de"><img src="https://flagcdn.com/w40/de.png" alt="DE" width="20" height="11" loading="lazy"> Deutsch</div> 4048 <div class="lang-opt" data-l="es" data-f="es"><img src="https://flagcdn.com/w40/es.png" alt="ES" width="20" height="11" loading="lazy"> Español</div> 4049 <div class="lang-opt" data-l="pt" data-f="pt"><img src="https://flagcdn.com/w40/pt.png" alt="PT" width="20" height="11" loading="lazy"> Português</div> 4050 <div class="lang-opt" data-l="fr" data-f="fr"><img src="https://flagcdn.com/w40/fr.png" alt="FR" width="20" height="11" loading="lazy"> Français</div> 4051 <div class="lang-opt" data-l="ru" data-f="ru"><img src="https://flagcdn.com/w40/ru.png" alt="RU" width="20" height="11" loading="lazy"> Ð ÑÑÑкий</div> 4052 </div> 4053 </div> 4054 <button id="tutorial-close-btn" class="tutorial-close" title="Close"><i class="fas fa-times"></i></button> 4055 </div> 4056 </div> 4057 4058 <div class="tutorial-slider-wrap"> 4059 <div class="tutorial-slider" id="tutorial-slider"> 4060 <div class="tutorial-slide"> 4061 <h2 class="slide-title">Welcome to <span class="text-highlight">Shark Earnings!</span></h2> 4062 <p class="slide-subtitle">Complete offers and surveys to earn real money. Cash out via PayPal, Crypto, Gift Cards, and more!</p> 4063 <div class="earn-methods-grid"> 4064 <div class="earn-method"> 4065 <div class="em-icon"><i class="fas fa-gamepad"></i></div> 4066 <div class="em-text"><strong>Games</strong><span>Play & earn</span></div> 4067 </div> 4068 <div class="earn-method"> 4069 <div class="em-icon"><i class="fas fa-mobile-alt"></i></div> 4070 <div class="em-text"><strong>Apps</strong><span>Try new apps</span></div> 4071 </div> 4072 <div class="earn-method"> 4073 <div class="em-icon"><i class="fas fa-clipboard-list"></i></div> 4074 <div class="em-text"><strong>Surveys</strong><span>Quick & easy</span></div> 4075 </div> 4076 <div class="earn-method"> 4077 <div class="em-icon"><i class="fas fa-play-circle"></i></div> 4078 <div class="em-text"><strong>Videos</strong><span>Watch & earn</span></div> 4079 </div> 4080 </div> 4081 <div class="slide-footer-info"> 4082 <p class="time-stat"><i class="fas fa-bolt"></i> Most people finish their first offer in under 10 minutes!</p> 4083 </div> 4084 </div> 4085 4086 <div class="tutorial-slide"> 4087 <h2 class="slide-title">Join the <span class="text-highlight">Community</span></h2> 4088 <p class="slide-subtitle">Chat with other earners, get tips, and stay in the loop!</p> 4089 <div class="community-list"> 4090 <div class="comm-item"> 4091 <div class="comm-icon"><i class="fas fa-comments"></i></div> 4092 <div class="comm-text"><strong>Get help fast</strong><span>Ask questions and get answers from the community</span></div> 4093 </div> 4094 <div class="comm-item"> 4095 <div class="comm-icon"><i class="fas fa-bullhorn"></i></div> 4096 <div class="comm-text"><strong>Stay updated</strong><span>New offers, events, and platform updates</span></div> 4097 </div> 4098 <div class="comm-item"> 4099 <div class="comm-icon"><i class="fas fa-trophy"></i></div> 4100 <div class="comm-text"><strong>See what others earn</strong><span>Real earnings shared by real members</span></div> 4101 </div> 4102 </div> 4103 <a href="https://discord.gg/shark-earnings-earn-cash-rewards-897403167820636190" target="_blank" rel="noopener noreferrer" class="discord-btn"> 4104 <i class="fab fa-discord"></i> Join our Discord Server 4105 </a> 4106 </div> 4107 4108 <div class="tutorial-slide"> 4109 <h2 class="slide-title">Maximize with <span class="text-highlight">
4109Rewards</span></h2> 4110 <p class="slide-subtitle">Claim free bonuses every single day to boost your balance!</p> 4111 <div class="rewards-list"> 4112 <div class="rew-item"> 4113 <div class="rew-icon-fa"><img src="/assets/images/rewards/menu-wheel.svg" alt="" style="width:62%;height:auto;object-fit:contain"></div> 4114 <span><strong>The Shark's Wheel:</strong> One free spin - win up to 10,000 lottery tickets for the $100 Weekly Lottery!</span> 4115 </div> 4116 <div class="rew-item"> 4117 <div class="rew-icon-fa"><img src="/assets/images/rewards/lottery_ticket.svg" alt="" style="width:96%;height:auto;object-fit:contain"></div> 4118 <span><strong>Weekly Lottery:</strong> Collect free tickets and win from a 100,000 coin pool every Sunday.</span> 4119 </div> 4120 <div class="rew-item"> 4121 <div class="rew-icon-fa"><img src="/assets/images/rewards/menu-code.svg" alt="" style="width:70%;height:auto;object-fit:contain"></div> 4122 <span><strong>Promo Codes:</strong> Find hidden codes on our socials.</span> 4123 </div> 4124 <div class="rew-item"> 4125 <div class="rew-icon-fa"><img src="/assets/images/rewards/menu-mission.svg" alt="" style="width:62%;height:auto;object-fit:contain"></div> 4126 <span><strong>Missions:</strong> Complete tiered tasks to unlock Milestone Wheels and win up to $5,000!</span> 4127 </div> 4128 </div> 4129 <a href="https://sharkearnings.com/rewards" class="spin-wheel-btn"> 4130 <i class="fas fa-dharmachakra"></i> Spin the Wheel Now 4131 </a> 4132 </div> 4133 </div> 4134 </div> 4135 4136 <div class="tutorial-footer"> 4137 <button id="tutorial-skip-btn" class="tut-nav-btn skip">Skip</button> 4138 <div class="tutorial-dots" id="tutorial-dots"> 4139 <span class="dot active"></span><span class="dot"></span><span class="dot"></span> 4140 </div> 4141 <button id="tutorial-next-btn" class="tut-nav-btn next">Next <i class="fas fa-arrow-right"></i></button> 4142 </div> 4143 </div> 4144</div> 4145 4146<style nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 4147#tutorial-overlay.hidden{display:none!important}#tutorial-overlay{position:fixed;inset:0;background:rgba(4,20,45,.85);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:200000;display:flex;justify-content:center;align-items:center;opacity:0;visibility:hidden;transition:opacity .4s ease,visibility .4s ease;padding:15px}#tutorial-overlay.visible{opacity:1;visibility:visible}.tutorial-card{background:linear-gradient(160deg,rgba(3,12,26,.98) 0,#00070f 100%);border:1px solid rgba(0,229,255,.2);border-radius:24px;width:100%;max-width:650px;box-shadow:0 30px 60px -12px rgba(0,0,0,.8),0 0 30px rgba(0,229,255,.1);transform:translateY(20px) scale(.95);transition:transform .4s cubic-bezier(.34,1.56,.64,1);display:flex;flex-direction:column;overflow:hidden;max-height:95vh}#tutorial-overlay.visible .tutorial-card{transform:translateY(0) scale(1)}.tutorial-header{display:flex;justify-content:space-between;align-items:center;padding:20px 25px;border-bottom:1px solid rgba(255,255,255,.05)}.tutorial-logo{display:flex;align-items:center;gap:6px;font-weight:800;font-size:1.15rem;color:#fff}.tutorial-logo img{width:32px;height:auto;filter:drop-shadow(0 0 8px rgba(0,229,255,.4))}.tutorial-actions{display:flex;align-items:center;gap:15px}.lang-selector{position:relative;z-index:50}.lang-btn{background:0 0;border:none;cursor:pointer;padding:0;display:flex;align-items:center}.lang-btn img{width:32px;border-radius:4px;box-shadow:0 2px 5px rgba(0,0,0,.3);transition:.2s}.lang-btn:hover img{transform:scale(1.1)}.lang-dropdown{position:absolute;top:120%;right:0;background:#051e3c;border:1px solid rgba(0,229,255,.2);border-radius:8px;padding:5px;display:none;min-width:140px;box-shadow:0 5px 15px rgba(0,0,0,.5)}.lang-selector:hover .lang-dropdown{display:block}.lang-opt{padding:8px 12px;color:#b2ebf2;cursor:pointer;display:flex;align-items:center;gap:10px;font-size:.9rem;border-radius:4px}.lang-opt:hover{background:rgba(0,229,255,.1);color:#fff}.lang-opt img{width:20px}.tutorial-close{background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.1);color:#94a3b8;border-radius:50%;width:32px;height:32px;display:flex;justify-content:center;align-items:center;cursor:pointer;transition:.2s;font-size:1.1rem}
4147.tutorial-close:hover{background:rgba(239,68,68,.15);color:#ef4444;border-color:rgba(239,68,68,.3);transform:rotate(90deg)}.tutorial-slider-wrap{width:100%;flex:1;overflow:hidden;position:relative}.tutorial-slider{display:flex;width:100%;height:100%;transition:transform .5s cubic-bezier(.25,1,.5,1)}.tutorial-slide{min-width:100%;padding:30px 40px;box-sizing:border-box;display:flex;flex-direction:column;align-items:center;text-align:center;overflow-y:auto}.slide-title{font-size:1.8rem;font-weight:800;color:#fff;margin:0 0 10px;line-height:1.2}.slide-subtitle{font-size:1rem;color:#94a3b8;margin:0 0 25px;line-height:1.4}.text-highlight{color:#00e5ff;text-shadow:0 0 10px rgba(0,229,255,.3)}.earn-methods-grid{display:grid;grid-template-columns:1fr 1fr;gap:15px;width:100%;margin-bottom:25px}.earn-method{background:rgba(0,229,255,.04);border:1px solid rgba(0,229,255,.15);border-radius:16px;padding:15px;display:flex;align-items:center;gap:15px;text-align:left;transition:transform .2s,background .2s;text-decoration:none}.earn-method:hover{background:rgba(0,229,255,.08);transform:translateY(-3px)}.em-new{display:inline-block;background:linear-gradient(135deg,#ffd84d,#f0b400);color:#1a1200!important;font-size:.58rem;font-weight:900;padding:.12rem .45rem;border-radius:6px;margin-left:.4rem;vertical-align:middle;letter-spacing:.05em;box-shadow:0 1px 4px rgba(240,180,0,.35);line-height:1.4}.em-icon{width:45px;height:45px;border-radius:12px;background:linear-gradient(135deg,rgba(0,229,255,.2),rgba(0,184,212,.1));color:#00e5ff;display:flex;justify-content:center;align-items:center;font-size:1.4rem}.em-text{display:flex;flex-direction:column}.em-text strong{color:#e2e8f0;font-size:1.05rem}.em-text span{color:#94a3b8;font-size:.85rem}.slide-footer-info{display:flex;flex-direction:column;align-items:center;gap:10px}.time-stat{margin:0;color:#fbbf24;background:rgba(251,191,36,.1);padding:8px 16px;border-radius:20px;font-size:.9rem;font-weight:600;border:1px solid rgba(251,191,36,.2)}.community-list{display:flex;flex-direction:column;gap:15px;width:100%;text-align:left;margin-bottom:30px}.comm-item{display:flex;align-items:center;gap:15px;padding:10px}.comm-icon{width:45px;height:45px;border-radius:50%;background:rgba(88,101,242,.15);color:#5865F2;display:flex;justify-content:center;align-items:center;font-size:1.3rem;flex-shrink:0}.comm-text{display:flex;flex-direction:column}.comm-text strong{color:#e2e8f0;font-size:1.05rem;margin-bottom:2px}.comm-text span{color:#94a3b8;font-size:.9rem;line-height:1.3}.discord-btn{background:#5865F2;color:#fff;text-decoration:none;padding:14px 28px;border-radius:12px;font-weight:700;font-size:1.05rem;display:inline-flex;align-items:center;gap:10px;transition:.3s;box-shadow:0 6px 20px rgba(88,101,242,.4)}.discord-btn:hover{background:#4752C4;transform:translateY(-3px);box-shadow:0 10px 25px rgba(88,101,242,.5)}.rewards-list{display:flex;flex-direction:column;gap:15px;width:100%;text-align:left;background:rgba(255,255,255,.02);border:1px solid rgba(255,255,255,.05);padding:20px;border-radius:16px;margin-bottom:25px}.rew-item{display:flex;align-items:center;gap:15px}.rew-icon-fa{width:34px;height:30px;display:flex;align-items:center;justify-content:center;font-size:1.4rem;flex-shrink:0}.rew-item span{color:#cbd5e1;font-size:.95rem;line-height:1.4}.rew-item strong{color:#fff}.spin-wheel-btn{background:linear-gradient(135deg,#00e5ff,#00b8d4);color:#00070f;text-decoration:none;padding:14px 28px;border-radius:12px;font-weight:800;font-size:1.05rem;display:inline-flex;align-items:center;gap:10px;transition:.3s;box-shadow:0 6px 20px rgba(0,229,255,.3)}.spin-wheel-btn:hover{transform:translateY(-3px);box-shadow:0 10px 25px rgba(0,229,255,.5)}.tutorial-footer{display:flex;justify-content:space-between;align-items:center;padding:20px 30px;background:rgba(0,0,0,.2);border-top:1px solid rgba(255,255,255,.05)}.tut-nav-btn{background:none;border:none;cursor:pointer;font-size:1rem;font-weight:600;transition:.2s;padding:8px 15px;border-radius:8px}.tut-nav-btn.skip{color:#64748b}.tut-nav-btn.skip:hover{color:#cbd5e1;background:rgba(255,255,255,.05)}.tut-nav-btn.next{color:#00e5ff;display:flex;align-items:center;gap:6px}.tut-nav-btn.next:hover{background:rgba(0,229,255,.1);transform:translateX(3px)}.tutorial-dots{display:flex;gap:8px}.tutorial-dots .dot{width:8px;height:8px;border-radius:50%;background:#334155;transition:.3s;
4147cursor:pointer}.tutorial-dots .dot.active{width:24px;background:#00e5ff;box-shadow:0 0 8px rgba(0,229,255,.5)}@media(max-width:600px){#tutorial-overlay{padding:0}.tutorial-card{height:100vh;max-height:100vh;border-radius:0;border:none}.tutorial-slide{padding:20px 15px;justify-content:center}.earn-methods-grid{grid-template-columns:1fr 1fr;gap:10px;margin-bottom:15px}.earn-method{flex-direction:column;text-align:center;padding:12px 8px;gap:8px}.em-icon{width:40px;height:40px;font-size:1.2rem}.em-text strong{font-size:.9rem}.em-text span{font-size:.75rem}.slide-title{font-size:1.4rem;margin-bottom:8px}.slide-subtitle{font-size:.85rem;margin-bottom:15px}.discord-btn,.spin-wheel-btn{width:100%;justify-content:center}.tutorial-footer{padding:15px 20px}}body.tutorial-open{overflow:hidden!important} 4148</style> 4149
4150<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 4151(function(){ 4152 const overlay=document.getElementById('tutorial-overlay'),slider=document.getElementById('tutorial-slider'),dots=document.querySelectorAll('#tutorial-dots .dot'),nextBtn=document.getElementById('tutorial-next-btn'),skipBtn=document.getElementById('tutorial-skip-btn'),closeBtn=document.getElementById('tutorial-close-btn'); 4153 let currentSlide=0;const totalSlides=3; 4154 function markTutorialCompleted(){ 4155 localStorage.setItem("tutorialCompleted","true"); 4156 const fd=new FormData();fd.append("action","complete_tutorial"); 4157 if(window.csrfToken)fd.append("csrf_token",window.csrfToken); 4158 return fetch("/earn",{method:"POST",body:fd,credentials:"same-origin"}) 4159 .then(function(r){return r.ok;}) 4160 .catch(function(e){console.error(e);return false;}); 4161 } 4162 function closeTutorial(){ 4163 overlay.classList.remove('visible');document.body.classList.remove("tutorial-open"); 4164 setTimeout(()=>overlay.classList.add('hidden'),400);markTutorialCompleted(); 4165 } 4166 function openTutorial(){ 4167 overlay.classList.remove('hidden');document.body.classList.add("tutorial-open"); 4168 void overlay.offsetWidth;overlay.classList.add('visible');updateSlider(); 4169 } 4170 function updateSlider(){ 4171 slider.style.transform=`translateX(-${currentSlide*100}%)`; 4172 dots.forEach((dot,index)=>dot.classList.toggle('active',index===currentSlide)); 4173 nextBtn.style.visibility=(currentSlide===totalSlides-1)?'hidden':'visible'; 4174 } 4175 nextBtn.addEventListener('click',()=>{if(currentSlide<totalSlides-1){currentSlide++;updateSlider();}}); 4176 skipBtn.addEventListener('click',closeTutorial); 4177 closeBtn.addEventListener('click',closeTutorial); 4178 dots.forEach((dot,index)=>{dot.addEventListener('click',()=>{currentSlide=index;updateSlider();});}); 4179 document.querySelectorAll('#tutorial').forEach(btn=>{btn.addEventListener('click',e=>{e.preventDefault();currentSlide=0;openTutorial();});}); document.querySelectorAll('.spin-wheel-btn').forEach(btn=>{btn.addEventListener('click',function(e){e.preventDefault();const href=this.href;markTutorialCompleted().then(()=>{window.location.href=href;});});}); 4180 document.querySelectorAll(".lang-opt").forEach(e=>{e.addEventListener("click",function(){ 4181 const lang=this.getAttribute("data-l"),flag=document.getElementById("curr-lang-flag"); 4182 if(flag)flag.src="https://flagcdn.com/w40/"+("en"===lang?"us":lang)+".png"; 4183 if(typeof doGTranslate==="function")doGTranslate("en|"+lang); 4184 else{const sel=document.querySelector(".gt_selector,.gtranslate_wrapper_earn select");if(sel){sel.value="en"===lang?"":lang;sel.dispatchEvent(new Event("change"));}} 4185 });}); 4186 function init(){ 4187 const isNewUser=false,hasStart=new URLSearchParams(window.location.search).has("start_tutorial"); 4188 const alreadySeen=localStorage.getItem("tutorialCompleted")==="true"; 4189 if(isNewUser&&!alreadySeen){ 4190 setTimeout(openTutorial,500); 4191 } else if(isNewUser&&alreadySeen){ 4192 markTutorialCompleted(); 4193 } 4194 if(hasStart){ 4195 localStorage.removeItem("tutorialCompleted"); 4196 setTimeout(openTutorial,500); 4197 window.history.replaceState({},document.title,window.location.pathname); 4198 } 4199 } 4200 if("loading"===document.readyState)document.addEventListener("DOMContentLoaded",init);else init(); 4201})(); 4202</script>
4202 4203 4204 4205
4205<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 4206 const userId = ''; 4207 4208 if (userId) { 4209 const theoremReachScript = document.createElement('script'); 4210 theoremReachScript.src = "https://s3.amazonaws.com/cdn.theoremreach/v3/theorem_reach.min.js"; 4211 theoremReachScript.onload = () => { 4212 if (typeof TheoremReach !== 'undefined') { 4213 window.TR = new TheoremReach({ 4214 apiKey: "guest", 4215 userId: "b5dcdeab-df24-45d5-a5ae-4319e700fa16", 4216 onSurveyNotAvailable: function () { 4217 alert('Sorry, no surveys are available for you at this moment. Please check back later!'); 4218 } 4219 }); 4220 } 4221 }; 4222 document.body.appendChild(theoremReachScript); 4223 } 4224 </script>
4224 4225 4226
4226<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 4227 (function(){ 4228 window.__sharkBalance = 0.000; 4229 window.__animateBalance = function(from, to){ 4230 const pills = document.querySelectorAll('.balance-pill'); 4231 if(pills.length === 0){ window.__sharkBalance = to; return; } 4232 const isIncrease = to > from; 4233 const start = performance.now(); 4234 const DUR = 2000; 4235 pills.forEach(pill => pill.classList.add('animating', isIncrease ? 'increase' : 'decrease')); 4236 function update(now){ 4237 const progress = Math.min((now - start) / DUR, 1); 4238 const eased = 1 - Math.pow(1 - progress, 3); 4239 const current = from + (to - from) * eased; 4240 pills.forEach(pill => { 4241 const span = pill.querySelector('span'); 4242 if(span){ 4243 span.textContent = current < 0 ? '-$' + formatAmountExact(Math.abs(current)) : '$' + formatAmountExact(current); 4244 span.classList.toggle('balance-negative', current < 0); 4245 } 4246 }); 4247 if(progress < 1){ requestAnimationFrame(update); } 4248 else { window.__sharkBalance = to; setTimeout(() => { pills.forEach(pill => pill.classList.remove('animating', 'increase', 'decrease')); }, 1200); } 4249 } 4250 requestAnimationFrame(update); 4251 }; 4252 })(); 4253 </script>
4253 4254
4254<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 4255 window.addEventListener('load', function(){ 4256 if (window.hideSharkLoader) { 4257 window.hideSharkLoader(); 4258 } 4259 4260 }); 4261 </script>
4261 4262 4263 <div id="verification-modal" class="verification-modal"> 4264 <div class="verification-modal-content"> 4265 <div class="verification-header"> 4266 <div class="verification-icon"> 4267 <svg width="48" height="48" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 4268 <path d="M12 2L3 7V11C3 16.55 6.84 21.74 12 23C17.16 21.74 21 16.55 21 11V7L12 2Z" fill="url(#shield-gradient)" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 4269 <path d="M9 12L11 14L15 10" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 4270 <defs> 4271 <linearGradient id="shield-gradient" x1="3" y1="2" x2="21" y2="23" gradientUnits="userSpaceOnUse"> 4272 <stop offset="0%" stop-color="#10B981"/> 4273 <stop offset="100%" stop-color="#059669"/> 4274 </linearGradient> 4275 </defs> 4276 </svg> 4277 </div> 4278 <h2>Account Verification Required</h2> 4279 <p class="verification-subtitle">Secure your account with quick face verification</p> 4280 <button class="verification-close" onclick="closeVerificationModal()">×</button> 4281 </div> 4282 <div class="verification-body"> 4283 <div class="verification-info"> 4284 <div class="info-item"> 4285 <span class="info-icon"><i class="fas fa-lock"></i></span> 4286 <span class="info-text">Secure face scan technology</span> 4287 </div> 4288 <div class="info-item"> 4289 <span class="info-icon"><i class="fas fa-bolt"></i></span> 4290 <span class="info-text">Complete in under 60 seconds</span> 4291 </div> 4292 <div class="info-item"> 4293 <span class="info-icon"><i class="fas fa-globe"></i></span> 4294 <span class="info-text">No ID required</span> 4295 </div> 4296 </div> 4297 <div class="verification-content"> 4298 <div class="verification-steps"> 4299 <div class="step active" id="step-1"> 4300 <div class="step-icon analyzing"> 4301 <div class="pulse-ring"></div> 4302 <i class="fas fa-shield-alt"></i> 4303 </div> 4304 <h3>Security Analysis</h3> 4305 <p>Analyzing your session with advanced fraud detection</p> 4306 <div class="loading-spinner"> 4307 <div class="spinner"></div> 4308 </div> 4309 </div> 4310 4311 <div class="step" id="step-2" style="display: none;"> 4312 <div class="step-icon success"> 4313 <i class="fas fa-check-circle"></i> 4314 </div> 4315 <h3>Verification Complete</h3> 4316 <p>Your account is now verified and secure!</p> 4317 <div class="success-confetti">ð</div> 4318 </div> 4319 4320 <div class="step" id="step-3" style="display: none;"> 4321 <div class="step-icon error"> 4322 <i class="fas fa-exclamation-triangle"></i> 4323 </div> 4324 <h3>Verification Failed</h3> 4325 <p>Unable to verify your identity. Please contact our support team for assistance.</p> 4326 </div> 4327 </div> 4328 4329 <div class="verification-actions"> 4330 <button id="verify-btn" class="verification-btn primary" onclick="startVerification()">
4331 <span class="btn-text">Start Verification</span> 4332 <span class="btn-loader" style="display: none;"> 4333 <i class="fas fa-spinner fa-spin"></i> Processing... 4334 </span> 4335 </button> 4336 <p class="verification-disclaimer">Your privacy is protected. We never share your verification data.</p> 4337 </div> 4338 </div> 4339 </div> 4340 </div> 4341 </div> 4342 4343 4344 4345 4346
4346<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 4347 let verificationInProgress = false; 4348 4349 function showVerificationModal() { 4350 const modal = document.getElementById('verification-modal'); 4351 if (modal) { 4352 modal.style.display = 'flex'; 4353 document.body.style.overflow = 'hidden'; 4354 4355 resetVerificationSteps(); 4356 } 4357 } 4358 4359 function closeVerificationModal() { 4360 const modal = document.getElementById('verification-modal'); 4361 if (modal) { 4362 modal.style.display = 'none'; 4363 document.body.style.overflow = 'auto'; 4364 4365 verificationInProgress = false; 4366 resetVerificationSteps(); 4367 } 4368 } 4369 4370 function resetVerificationSteps() { 4371 const step1 = document.getElementById('step-1'); 4372 const step2 = document.getElementById('step-2'); 4373 const step3 = document.getElementById('step-3'); 4374 if (step1) step1.style.display = 'block'; 4375 if (step2) step2.style.display = 'none'; 4376 if (step3) step3.style.display = 'none'; 4377 4378 const btn = document.getElementById('verify-btn'); 4379 if (!btn) return; 4380 btn.disabled = false; 4381 const btnText = btn.querySelector('.btn-text'); 4382 const btnLoader = btn.querySelector('.btn-loader'); 4383 if (btnText) btnText.style.display = 'inline'; 4384 if (btnLoader) btnLoader.style.display = 'none'; 4385 } 4386 4387 function showStep(stepNumber) { 4388 ['step-1', 'step-2', 'step-3'].forEach(id => { 4389 const el = document.getElementById(id); 4390 if (el) el.style.display = 'none'; 4391 }); 4392 4393 const targetStep = document.getElementById('step-' + stepNumber); 4394 if (!targetStep) return; 4395 targetStep.style.display = 'block'; 4396 targetStep.style.opacity = '0'; 4397 targetStep.style.transform = 'translateY(20px)'; 4398 4399 setTimeout(() => { 4400 targetStep.style.transition = 'all 0.4s ease-out'; 4401 targetStep.style.opacity = '1'; 4402 targetStep.style.transform = 'translateY(0)'; 4403 }, 50); 4404 } 4405 4406 async function startVerification() { 4407 if (verificationInProgress) return; 4408 4409 verificationInProgress = true; 4410 const btn = document.getElementById('verify-btn'); 4411 const btnText = btn?.querySelector('.btn-text'); 4412 const btnLoader = btn?.querySelector('.btn-loader'); 4413 4414 if (btn) btn.disabled = true; 4415 if (btnText) btnText.style.display = 'none'; 4416 if (btnLoader) btnLoader.style.display = 'inline'; 4417 4418 try { 4419 showStep(1); 4420 await new Promise(resolve => setTimeout(resolve, 1000)); 4421 4422 if (!window.Verisoul) { 4423 throw new Error('Verisoul SDK not loaded'); 4424 } 4425 4426 const session = await window.Verisoul.session(); 4427 const sessionId = session.session_id; 4428 4429 const response = await fetch('/api/secure_handler.php', { 4430 method: 'POST', 4431 headers: { 4432 'Content-Type': 'application/x-www-form-urlencoded', 4433 }, 4434 body: new URLSearchParams({ 4435 action: 'verisoul_verification', 4436 session_id: sessionId, 4437 csrf_token: "998e8f34e9355502848cd48edfcac4aca9c6e20a319f93593cdd2f8f0ad64f93" }) 4438 }); 4439 4440 if (!response.ok) { 4441 throw new Error('Network response was not ok'); 4442 } 4443 4444 const result = await response.json(); 4445 4446 if (result.success && result.facematch_session_id) { 4447 const redirectUrl = encodeURIComponent(window.location.origin + '/verification-complete'); 4448 const facematchUrl = `https://app.prod.verisoul.ai/?session_id=${result.facematch_session_id}&redirect_url=${redirectUrl}`; 4449 4450 window.location.href = facematchUrl; 4451 } else { 4452 throw new Error(result.error || 'Failed to initialize Face Match'); 4453 } 4454 4455 } catch (error) { 4456 console.error('Verification error:', error); 4457 showStep(3); 4458 } finally { 4459 verificationInProgress = false;
4460 if (btn) btn.disabled = false; 4461 if (btnText) btnText.style.display = 'inline'; 4462 if (btnLoader) btnLoader.style.display = 'none'; 4463 } 4464 } 4465 4466 document.addEventListener('DOMContentLoaded', function() { 4467 }); 4468 4469 document.addEventListener('keydown', function(e) { 4470 if (e.key === 'Escape') { 4471 closeVerificationModal(); 4472 } 4473 }); 4474 4475 document.getElementById('verification-modal')?.addEventListener('click', function(e) { 4476 if (e.target === this) { 4477 closeVerificationModal(); 4478 } 4479 }); 4480 4481 window.openVerificationModal = showVerificationModal; 4482 window.closeVerificationModal = closeVerificationModal; 4483 4484 const sidebarMenu = document.getElementById('sidebarMenu'); 4485 const floatingMenuBtn = document.getElementById('floatingMenuBtn'); 4486 4487 const _layoutContainer = document.querySelector('.container'); 4488 const _layoutHeader = document.querySelector('.main-header'); 4489 const _layoutTicker = document.getElementById('live-earnings-ticker'); 4490 const _layoutBanner = document.querySelector('.maintenance-banner'); 4491 const _layoutFooter = document.querySelector('.shark-footer, .gf-footer'); 4492 if (_layoutFooter) _layoutFooter.style.transition = 'width .3s, margin-left .3s'; 4493 4494 function updateLayout() { 4495 // A viewport-szelesseget EGYSZER olvassuk ki, a stilusirasok ELOTT. 4496 // Korabban ket kulon window.innerWidth olvasas volt, kozottuk irasokkal: 4497 // ilyenkor a bongeszo kenytelen szinkron ujraszamolni az elrendezest, 4498 // hogy friss erteket adjon vissza. A PageSpeed-jelentes (2026-08-31) ezt 4499 // 97 + 129 ms kenyszeritett ujraszamitaskent nevesitette ezen a ket soron. 4500 const vw = window.innerWidth; 4501 const isCollapsed = document.body.classList.contains('sidebar-collapsed'); 4502 const sidebarWidth = isCollapsed ? 70 : 240; 4503 4504 if (vw >= 1200) { 4505 [_layoutHeader, _layoutTicker, _layoutBanner, _layoutFooter].forEach(function(el) { 4506 if (!el) return; 4507 el.style.removeProperty('width'); 4508 el.style.removeProperty('left'); 4509 el.style.removeProperty('margin-left'); 4510 }); 4511 if (_layoutContainer) { 4512 _layoutContainer.style.marginLeft = sidebarWidth + 'px'; 4513 _layoutContainer.style.width = `calc(100% - ${sidebarWidth}px)`; 4514 } 4515 return; 4516 } 4517 4518 if (vw > 768) { 4519 if (_layoutHeader) { 4520 _layoutHeader.style.marginLeft = '0'; 4521 _layoutHeader.style.setProperty('width', '100%', 'important'); 4522 _layoutHeader.style.setProperty('left', '0', 'important'); 4523 } 4524 if (_layoutContainer) { 4525 _layoutContainer.style.marginLeft = sidebarWidth + 'px'; 4526 _layoutContainer.style.width = `calc(100% - ${sidebarWidth}px)`; 4527 } 4528 if (_layoutTicker) { 4529 _layoutTicker.style.left = sidebarWidth + 'px'; 4530 _layoutTicker.style.width = `calc(100% - ${sidebarWidth}px)`; 4531 } 4532 if (_layoutBanner) { 4533 _layoutBanner.style.left = sidebarWidth + 'px'; 4534 _layoutBanner.style.width = `calc(100% - ${sidebarWidth}px)`; 4535 } 4536 if (_layoutFooter) { 4537 _layoutFooter.style.marginLeft = sidebarWidth + 'px'; 4538 _layoutFooter.style.width = `calc(100% - ${sidebarWidth}px)`; 4539 } 4540 } else { 4541 if (_layoutHeader) { _layoutHeader.style.marginLeft = '0'; _layoutHeader.style.setProperty('width', '100%', 'important'); _layoutHeader.style.setProperty('left', '0', 'important'); } 4542 if (_layoutContainer) { _layoutContainer.style.marginLeft = '0'; _layoutContainer.style.width = '100%'; } 4543 if (_layoutTicker) { _layoutTicker.style.left = '0'; _layoutTicker.style.width = '100%'; } 4544 if (_layoutBanner) { _layoutBanner.style.left = '0'; _layoutBanner.style.width = '100%'; } 4545 if (_layoutFooter) { _layoutFooter.style.marginLeft = '0'; _layoutFooter.style.width = '100%'; } 4546 } 4547 } 4548 4549 function toggleSidebarCollapse() { 4550 document.body.classList.toggle('sidebar-collapsed'); 4551 // A classList.toggle ervenyteleniti a stilusokat; ha rogton utana olvasnank 4552 // a viewport-szelesseget, a bongeszo szinkron ujraszamolna az elrendezest. 4553 // Kovetkezo kepkockara halasztva ez a kenyszeritett ujraszamitas elmarad, 4554 // es a felhasznalo ugyanugy azonnalinak latja (egy frame = ~16 ms). 4555 requestAnimationFrame(updateLayout); 4556 4557 (function(){ 4558 var open = !document.body.classList.contains('sidebar-collapsed'); 4559 var cb = document.getElementById('sidebarCollapseBtn'); 4560 if (cb) cb.setAttribute('aria-expanded', open ? 'true' : 'false'); 4561 if (floatingMenuBtn) floatingMenuBtn.setAttribute('aria-expanded', open ? 'true' : 'false'); 4562 })(); 4563 4564 if (floatingMenuBtn) { 4565 const icon = floatingMenuBtn.querySelector('i'); 4566 if (icon) { 4567 if (document.body.classList.contains('sidebar-collapsed')) { 4568 icon.classList.remove('fa-times'); 4569 icon.classList.add('fa-bars'); 4570 localStorage.setItem('sidebarState', 'collapsed'); 4571 } else { 4572 icon.classList.remove('fa-bars'); 4573 icon.classList.add('fa-times'); 4574 localStorage.setItem('sidebarState', 'open'); 4575 } 4576 } 4577 } 4578 4579 const sidebarCloseBtn = document.getElementById('sidebarCloseBtn'); 4580 if (sidebarCloseBtn && window.innerWidth > 768) { 4581 if (document.body.classList.contains('sidebar-collapsed')) { 4582 sidebarCloseBtn.style.display = 'none'; 4583 } else { 4584 sidebarCloseBtn.style.display = 'flex'; 4585 } 4586 } 4587 } 4588 4589 floatingMenuBtn?.addEventListener('click', toggleSidebarCollapse); 4590 document.getElementById('sidebarCollapseBtn')?.addEventListener('click', toggleSidebarCollapse); 4591 4592 const savedSidebarState = localStorage.getItem('sidebarState'); 4593 const isInitiallyCollapsed = savedSidebarState === 'collapsed' || (savedSidebarState === null && document.body.classList.contains('sidebar-collapsed')); 4594 if (isInitiallyCollapsed) { 4595 document.body.classList.add('sidebar-collapsed'); 4596 if (floatingMenuBtn) { 4597 const icon = floatingMenuBtn.querySelector('i'); 4598 if (icon) { 4599 icon.classList.remove('fa-times'); 4600 icon.classList.add('fa-bars'); 4601 } 4602 } 4603 } else { 4604 document.body.classList.remove('sidebar-collapsed'); 4605 if (floatingMenuBtn) { 4606 const icon = floatingMenuBtn.querySelector('i'); 4607 if (icon) { 4608 icon.classList.remove('fa-bars'); 4609 icon.classList.add('fa-times'); 4610 } 4611 } 4612 } 4613 4614 updateLayout(); 4615 4616 setTimeout(updateLayout, 0); 4617 4618 const throttledUpdateLayout = throttle(updateLayout, 150); 4619 window.addEventListener('resize', throttledUpdateLayout); 4620 4621 document.addEventListener('visibilitychange', function() { 4622 if (!document.hidden) { 4623 updateLayout(); 4624 if (typeof loadNotifications === 'function') loadNotifications(); 4625 if (typeof fetchAndRenderEarnings === 'function') fetchAndRenderEarnings(); 4626 } 4627 }); 4628 4629 window.addEventListener('pageshow', function(e) { 4630 if (e.persisted) { 4631 const savedState = localStorage.getItem('sidebarState'); 4632 if (savedState === 'collapsed') { 4633 document.body.classList.add('sidebar-collapsed'); 4634 const icon = floatingMenuBtn?.querySelector('i'); 4635 if (icon) { icon.classList.remove('fa-times'); icon.classList.add('fa-bars'); } 4636 } else { 4637 document.body.classList.remove('sidebar-collapsed'); 4638 const icon = floatingMenuBtn?.querySelector('i'); 4639 if (icon) { icon.classList.remove('fa-bars'); icon.classList.add('fa-times'); } 4640 } 4641 if (sidebarMenu) sidebarMenu.classList.remove('mobile-open'); 4642 if (mobileSidebarOverlay) mobileSidebarOverlay.classList.remove('active'); 4643 document.body.style.overflow = ''; 4644 updateLayout(); 4645 } 4646 }); 4647 4648 const mobileMenuToggle = document.getElementById('mobileMenuToggle'); 4649 const mobileSidebarOverlay = document.getElementById('mobileSidebarOverlay'); 4650 4651 function openMobileSidebar() { 4652 sidebarMenu?.classList.add('mobile-open'); 4653 mobileSidebarOverlay?.classList.add('active'); 4654 document.body.style.overflow = 'hidden'; 4655 } 4656 4657 function closeMobileSidebar() { 4658 sidebarMenu?.classList.remove('mobile-open'); 4659 mobileSidebarOverlay?.classList.remove('active'); 4660 document.body.style.overflow = ''; 4661 } 4662 4663 mobileMenuToggle?.addEventListener('click', function() { 4664 if (sidebarMenu?.classList.contains('mobile-open')) { 4665 closeMobileSidebar(); 4666 } else { 4667 openMobileSidebar(); 4668 } 4669 }); 4670 4671 mobileSidebarOverlay?.addEventListener('click', closeMobileSidebar); 4672 4673 const sidebarCloseBtn = document.getElementById('sidebarCloseBtn'); 4674 sidebarCloseBtn?.addEventListener('click', function() { 4675 if (window.innerWidth <= 768) { 4676 closeMobileSidebar(); 4677 } else { 4678 toggleSidebarCollapse(); 4679 } 4680 }); 4681 4682 document.addEventListener('keydown', function(e) { 4683 if (e.key === 'Escape' && sidebarMenu.classList.contains('mobile-open')) { 4684 closeMobileSidebar(); 4685 } 4686 }); 4687 4688 function updateServerTime() { 4689 if (document.hidden) return; 4690 const now = new Date(); 4691 4692 const timeString = now.toLocaleTimeString('hu-HU', { 4693 timeZone: 'Europe/Budapest', 4694 hour12: false, 4695 hour: '2-digit', 4696 minute: '2-digit', 4697 second: '2-digit' 4698 }); 4699 4700 const serverTimeDisplay = document.getElementById('serverTimeDisplay'); 4701 if (serverTimeDisplay) {
4702 serverTimeDisplay.textContent = timeString; 4703 } 4704 4705 const streakTimers = document.querySelectorAll('.streak-timer'); 4706 if (streakTimers.length > 0) { 4707 const midnight = new Date(); 4708 midnight.setHours(24, 0, 0, 0); 4709 4710 const diff = midnight - now; 4711 4712 if (diff > 0) { 4713 const hours = Math.floor(diff / (1000 * 60 * 60)); 4714 const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); 4715 const seconds = Math.floor((diff % (1000 * 60)) / 1000); 4716 4717 const timeString = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; 4718 streakTimers.forEach(timer => timer.textContent = timeString); 4719 } else { 4720 streakTimers.forEach(timer => timer.textContent = '00:00:00'); 4721 } 4722 } 4723 } 4724 4725 if (document.readyState === 'loading') { 4726 document.addEventListener('DOMContentLoaded', function() { 4727 updateServerTime(); 4728 setInterval(updateServerTime, 1000); 4729 }); 4730 } else { 4731 updateServerTime(); 4732 setInterval(updateServerTime, 1000); 4733 } 4734 4735 document.addEventListener('DOMContentLoaded', function() { 4736 const sidebarLinks = document.querySelectorAll('.sidebar-link:not([onclick])'); 4737 sidebarLinks.forEach(link => { 4738 link.addEventListener('click', function(e) { 4739 const targetHref = this.getAttribute('href'); 4740 if (!targetHref || targetHref === '#' || targetHref.startsWith('#')) return; 4741 const currentPath = window.location.pathname + window.location.search; 4742 const targetPath = targetHref.startsWith('/') ? targetHref : '/' + targetHref; 4743 if (currentPath === targetPath) { 4744 closeMobileSidebar(); 4745 window.scrollTo({ top: 0, behavior: 'smooth' }); 4746 e.preventDefault(); 4747 return; 4748 } 4749 closeMobileSidebar(); 4750 }); 4751 }); 4752 }); 4753 4754 (function() { 4755 const walletBtn = document.getElementById('mobileWalletBtn'); 4756 const walletPanel = document.getElementById('mobileWalletPanel'); 4757 const walletChevron = document.getElementById('mobileWalletChevron'); 4758 if (!walletBtn || !walletPanel) return; 4759 4760 function openWalletPanel(e) { 4761 e.preventDefault(); 4762 const isOpen = walletPanel.classList.contains('active'); 4763 walletPanel.classList.toggle('active', !isOpen); 4764 if (walletChevron) walletChevron.style.transform = isOpen ? '' : 'rotate(180deg)'; 4765 } 4766 4767 walletBtn.addEventListener('click', openWalletPanel); 4768 4769 document.addEventListener('click', function(e) { 4770 if (!walletBtn.contains(e.target) && !walletPanel.contains(e.target)) { 4771 walletPanel.classList.remove('active'); 4772 if (walletChevron) walletChevron.style.transform = ''; 4773 } 4774 }); 4775 })(); 4776 4777 function handleLogout(event) { 4778 event.preventDefault(); 4779 4780 const isMobileApp = navigator.userAgent.includes('SharkEarningsApp'); 4781 4782 if (isMobileApp) { 4783 const appToken = sessionStorage.getItem('app_token') || localStorage.getItem('app_token'); 4784 4785 const formData = new FormData(); 4786 formData.append('action', 'logout'); 4787 if (appToken) { 4788 formData.append('app_token', appToken); 4789 } 4790 4791 fetch('/app/auth.php', { 4792 method: 'POST', 4793 body: formData 4794 }).then(response => response.json()) 4795 .then(data => { 4796 sessionStorage.removeItem('app_token'); 4797 localStorage.removeItem('app_token'); 4798 4799 if (window.flutter_inappwebview && window.flutter_inappwebview.callHandler) { 4800 window.flutter_inappwebview.callHandler('nativeLogout'); 4801 } else { 4802 window.location.href = '/'; 4803 } 4804 }).catch(() => { 4805 window.location.href = '/'; 4806 }); 4807 } else { 4808 window.location.href = '/auth/logout'; 4809 } 4810 } 4811 </script>
4811 4812 4813 4814 4815 <div role="dialog" aria-modal="true" id="authModal" class="auth-modal"> 4816 <div class="auth-modal-content"> 4817 <div class="auth-modal-left"> 4818 <div class="bonus-badge-top" id="authModalBadge"><i class="fas fa-gift"></i><span>Win up to <span class="notranslate">10,000</span> Free Lottery Tickets</span></div> 4819 <h2 id="authModalTitle">Get Paid To Play!</h2> 4820 <h3 id="authModalSubtitle">Fast Cashouts</h3> 4821 <div class="modal-benefits"> 4822 <div class="benefit-item"><i class="fas fa-th-large"></i><span><strong>5,000+</strong> offers to choose from</span></div> 4823 <div class="benefit-item"><i class="fas fa-bolt"></i><span>Fast Cashouts (PayPal, Crypto & more)</span></div> 4824 <div class="benefit-item"><i class="fas fa-users"></i><span>Start at <strong>10%</strong> Commission & Level Up Fast</span></div> 4825 <div class="benefit-item"><i class="fas fa-star"></i><span>Rated <strong>Excellent</strong> by our users</span></div> 4826 </div> 4827 <div class="trust-logos"> 4828 <i class="fab fa-paypal"></i> 4829 <i class="fas fa-litecoin-sign"></i> 4830 <i class="fab fa-amazon"></i> 4831 <i class="fab fa-google-play"></i> 4832 <i class="fab fa-cc-visa"></i> 4833 </div> 4834 <div class="mascot-bottom"><img width="400" height="400" src="/assets/images/sharkwel.webp" alt="Shark Mascot" loading="lazy"></div> 4835 </div> 4836 <div class="auth-modal-right"> 4837 <span role="button" tabindex="0" class="auth-modal-close" onclick="closeAuthModal()">×</span> 4838 <div id="authModalExitBanner" class="exit-intent-banner" style="display:none"><i class="fas fa-gift"></i> Don't leave without your gift! Sign up, spin the wheel and win up to 10,000 lottery tickets - join Sunday's $100 cash draw!</div> 4839 <div class="form-tabs"> 4840 <button class="tab-btn active" onclick="switchForm('login')">Sign In</button> 4841 <button class="tab-btn" onclick="switchForm('register')">Sign Up</button> 4842 </div> 4843 <div class="form-slider"><div class="form-slider-inner"> 4844 <form id="loginForm" class="auth-form active" autocomplete="on" translate="no"> 4845 <div class="form-messages"><div class="error"></div><div class="success"></div></div> 4846 <input type="hidden" name="csrf_token" value="998e8f34e9355502848cd48edfcac4aca9c6e20a319f93593cdd2f8f0ad64f93"> 4847 <input type="hidden" name="action" value="login"> 4848 <div id="g_id_onload" 4849 data-client_id="209163424327-1ejuooahnimq3korsk6g6dn3qnuq00bo.apps.googleusercontent.com" 4850 data-context="signin" data-ux_mode="redirect" 4851 data-login_uri="https://sharkearnings.com/social/google-api-php-client/google-callback.php" 4852 data-nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz" 4853 data-state='%7B%22referrer%22%3A%22%22%2C%22visitorId%22%3A%22%22%7D'> 4854 </div> 4855 <div class="g_id_signin_lazy" data-type="standard" data-shape="rectangular" data-theme="outline" data-text="continue_with" data-size="large" data-logo_alignment="left" onclick="handleSocialLogin('google')"></div> 4856 <button type="button" class="discord_button" onclick="handleSocialLogin('discord')">Continue with Discord</button> 4857 <div class="or-divider"><span>OR</span></div> 4858 <div class="input-wrapper"> 4859 <div class="input-icon-group"> 4860 <input aria-label="Username or Email" type="text" name="login" placeholder="Username or Email" required> 4861 <i class="fas fa-user"></i> 4862 </div> 4863 </div> 4864 <div class="input-wrapper"> 4865 <div class="input-icon-group"> 4866 <input aria-label="Password" type="password" name="password" placeholder="Password" required autocomplete="current-password"> 4867 <i class="fas fa-lock"></i>
4868 <span role="button" tabindex="0" class="toggle-password" onclick="togglePassword('login-password', this)"><i class="fas fa-eye"></i></span> 4869 </div> 4870 </div> 4871 <div class="cf-turnstile" data-sitekey="0x4AAAAAABgiM3aG2fCZPEea" data-execution="execute" data-size="flexible"></div> 4872 <button type="submit" class="btn" style="width:100%;">Sign In</button> 4873 <div class="form-desc" style="margin-top:15px;text-align:right;"><a href="/auth/forgot_password">Forgot Password?</a></div> 4874 <div class="form-desc" style="margin-top:10px;">By signing in, you agree to the <a href="/privacy" target="_blank" rel="noopener">Privacy Policy</a> and <a href="/tos" target="_blank" rel="noopener">Terms of Service</a>.</div> 4875 </form> 4876 <form id="registerForm" class="auth-form" autocomplete="on" translate="no"> 4877 <div class="form-messages"><div class="error"></div><div class="success"></div></div> 4878 <input type="hidden" name="csrf_token" value="998e8f34e9355502848cd48edfcac4aca9c6e20a319f93593cdd2f8f0ad64f93"> 4879 <input type="hidden" name="action" value="register"> 4880 <input type="hidden" name="fingerprint_visitor_id" id="fingerprint_visitor_id"> 4881 <div class="g_id_signin_lazy" data-type="standard" data-shape="rectangular" data-theme="outline" data-text="signup_with" data-size="large" data-logo_alignment="left" onclick="handleSocialLogin('google')"></div> 4882 <button type="button" class="discord_button" onclick="handleSocialLogin('discord')">Sign up with Discord</button> 4883 <div class="or-divider"><span>OR</span></div> 4884 <div class="input-wrapper"> 4885 <div class="input-icon-group"> 4886 <input aria-label="Enter your email address" type="email" name="email" placeholder="Enter your email address" autocomplete="email" required> 4887 <i class="fas fa-envelope"></i> 4888 </div> 4889 </div> 4890 <div class="input-wrapper"> 4891 <div class="input-icon-group"> 4892 <input aria-label="Create a strong password" type="password" name="password" id="register-password" placeholder="Create a strong password" required autocomplete="new-password"> 4893 <i class="fas fa-lock"></i> 4894 <span role="button" tabindex="0" class="toggle-password" onclick="togglePassword('register-password', this)"><i class="fas fa-eye"></i></span> 4895 </div> 4896 <div class="password-rules" id="register-password-rules"> 4897 <strong>Password Requirements:</strong> 4898 <ul> 4899 <li id="reg-rule-length"><i class="fas fa-times"></i><i class="fas fa-check"></i>At least 8 characters long</li> 4900 <li id="reg-rule-uppercase"><i class="fas fa-times"></i><i class="fas fa-check"></i>One uppercase letter (A-Z)</li> 4901 <li id="reg-rule-lowercase"><i class="fas fa-times"></i><i class="fas fa-check"></i>One lowercase letter (a-z)</li> 4902 <li id="reg-rule-number"><i class="fas fa-times"></i><i class="fas fa-check"></i>One number (0-9)</li> 4903 </ul> 4904 </div> 4905 </div> 4906 <div class="input-wrapper referral-input-wrapper" style="display:none;"> 4907 <div class="input-icon-group"> 4908 <input aria-label="Referral code" type="text" name="referral_code" id="referral-code-input" placeholder="Referral code" autocomplete="off"> 4909 <i class="fas fa-users"></i> 4910 </div> 4911 </div> 4912 <div class="referral-toggle-section"> 4913 <button type="button" class="referral-toggle-btn" onclick="toggleReferralInput()"><i class="fas fa-gift"></i> Have a referral code?</button> 4914 </div> 4915 <div class="cf-turnstile" data-sitekey="0x4AAAAAABgiM3aG2fCZPEea" data-execution="execute" data-size="flexible"></div> 4916 <button type="submit" class="btn cta-mobile-optimized" style="width:100%;">Create Account & Start Earning</button> 4917 <div class="form-desc">By signing up, you agree to the <a href="/privacy" target="_blank" rel="noopener">Privacy Policy</a> and <a href="/tos" target="_blank" rel="noopener">Terms of Service</a>.</div> 4918 </form> 4919 </div></div> 4920 </div> 4921 </div> 4922 </div> 4923
4923<script src="/assets/js/main.js?v=1788969767" defer nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"></script>
4923 4924
4924<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 4925 // The Google Sign-In library auto-renders every .g_id_signin it finds, which cost 4926 // one button iframe per element even while the modal was closed. The two modal 4927 // buttons are marked .g_id_signin_lazy and rendered on first open instead. 4928 (function(){ 4929 var modal = document.getElementById('authModal'); 4930 if (!modal) return; 4931 var done = false, tries = 0; 4932 4933 function renderLazyButtons() { 4934 if (done) return; 4935 var els = document.querySelectorAll('.g_id_signin_lazy'); 4936 if (!els.length) { done = true; return; } 4937 if (!(window.google && window.google.accounts && window.google.accounts.id)) { 4938 if (tries++ < 25) setTimeout(renderLazyButtons, 200); 4939 return; 4940 } 4941 done = true; 4942 els.forEach(function(el){ 4943 el.classList.remove('g_id_signin_lazy'); 4944 el.classList.add('g_id_signin'); 4945 try { 4946 window.google.accounts.id.renderButton(el, { 4947 type: el.dataset.type || 'standard', 4948 shape: el.dataset.shape || 'rectangular', 4949 theme: el.dataset.theme || 'outline', 4950 text: el.dataset.text || 'continue_with', 4951 size: el.dataset.size || 'large', 4952 logo_alignment: el.dataset.logo_alignment || 'left' 4953 }); 4954 } catch (err) {} 4955 }); 4956 } 4957 4958 new MutationObserver(function(){ 4959 if (modal.classList.contains('show')) renderLazyButtons(); 4960 }).observe(modal, { attributes: true, attributeFilter: ['class'] }); 4961 })(); 4962 </script>
4962 4963
4963<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 4964 (function(){ 4965 if (sessionStorage.getItem('exitIntentShown')) return; 4966 if (window.matchMedia && window.matchMedia('(hover:none)').matches) return; 4967 4968 function showExitIntent(e) { 4969 if (e.clientY > 0) return; 4970 var modal = document.getElementById('authModal'); 4971 if (!modal || modal.classList.contains('show')) return; 4972 4973 sessionStorage.setItem('exitIntentShown', '1'); 4974 document.removeEventListener('mouseleave', showExitIntent); 4975 4976 var badge = document.getElementById('authModalBadge'); 4977 var title = document.getElementById('authModalTitle'); 4978 var subtitle = document.getElementById('authModalSubtitle'); 4979 var banner = document.getElementById('authModalExitBanner'); 4980 if (badge) badge.innerHTML = '<i class="fas fa-gift"></i> Wait! Your gift is here!'; 4981 if (title) title.textContent = 'Sign Up & Spin to Win!'; 4982 if (subtitle) subtitle.textContent = 'Spin for tickets - join Sunday\'s $100 cash draw'; 4983 if (banner && window.getComputedStyle(document.querySelector('.auth-modal-left')).display === 'none') { 4984 banner.style.display = 'flex'; 4985 } 4986 4987 if (typeof window.openAuthModal === 'function') window.openAuthModal('register'); 4988 } 4989 4990 setTimeout(function(){ 4991 document.addEventListener('mouseleave', showExitIntent); 4992 }, 3000); 4993 })(); 4994 </script>
4994 4995 4996
4996<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 4997 (function(){ 4998 document.addEventListener('click', function(e){ 4999 var t = e.target.closest('[data-auth-open]'); 5000 if (!t) return; 5001 if (typeof window.openAuthModal === 'function') { 5002 e.preventDefault(); 5003 window.openAuthModal(t.getAttribute('data-auth-open')); 5004 } 5005 }); 5006 })(); 5007 </script>
5007 5008 5009
5009<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 5010 (function(){ 5011 var PING_URL = '/api/ping_session.php'; 5012 var INTERVAL = 30000; 5013 var IDLE_AFTER = 120000; 5014 var lastActive = Date.now(); 5015 var pingTimer; 5016 5017 function getPage() { 5018 return window.location.pathname + window.location.search; 5019 } 5020 function getReferrer() { 5021 return document.referrer || ''; 5022 } 5023 function isActive() { 5024 return (Date.now() - lastActive) < IDLE_AFTER; 5025 } 5026 function sendPing() { 5027 var fd = new FormData(); 5028 fd.append('page', getPage()); 5029 fd.append('referrer', getReferrer()); 5030 fd.append('is_active', isActive() ? '1' : '0'); 5031 fetch(PING_URL, {method:'POST', body:fd, credentials:'same-origin'}) 5032 .then(function(r){ return r.json(); }) 5033 .then(function(d){ 5034 if (d && d.maintenance === true && !window.isAdmin) { 5035 window.location.href = '/maintenance'; 5036 } 5037 }) 5038 .catch(function(){}); 5039 } 5040 5041 ['mousemove','click','keydown','scroll','touchstart'].forEach(function(ev){ 5042 document.addEventListener(ev, function(){ lastActive = Date.now(); }, {passive:true}); 5043 }); 5044 5045 function startPinging(){ 5046 sendPing(); 5047 pingTimer = setInterval(sendPing, INTERVAL); 5048 } 5049 if (window.requestIdleCallback) { 5050 requestIdleCallback(startPinging, { timeout: 5000 }); 5051 } else { 5052 setTimeout(startPinging, 2000); 5053 } 5054 5055 document.addEventListener('visibilitychange', function(){ 5056 if (document.visibilityState === 'hidden') { 5057 navigator.sendBeacon && navigator.sendBeacon(PING_URL, new URLSearchParams({ 5058 page: getPage(), referrer: getReferrer(), is_active: '0' 5059 })); 5060 clearInterval(pingTimer); 5061 } else { 5062 lastActive = Date.now(); 5063 sendPing(); 5064 pingTimer = setInterval(sendPing, INTERVAL); 5065 } 5066 }); 5067 })(); 5068 </script>
5068 5069 5070 5071 5072
5072<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 5073 </script>
5073 5074 5075
5075<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 5076 window.OfferReviews = (function(){ 5077 const DIMS = [['ease','Ease'],['speed','Speed'],['earnings','Earnings'],['tracking','Tracking'],['enjoyment','Enjoyment']]; 5078 const DESC = {ease:'How easy was it to complete?',speed:'How fast was the completion speed?',earnings:'How fair was the amount earned?',tracking:'How well did it track?',enjoyment:'How fun or interesting was it?'}; 5079 function esc(t){ const d=document.createElement('div'); d.textContent=(t==null?'':String(t)); return d.innerHTML; } 5080 function tipEl(){ let t=document.getElementById('ofrTip'); if(!t){ t=document.createElement('div'); t.id='ofrTip'; t.className='ofr-tip'; document.body.appendChild(t); } return t; } 5081 function showTip(el,e){ const t=tipEl(); t.textContent=el.getAttribute('data-ofr-tip')||''; t.classList.add('show'); const r=el.getBoundingClientRect(); const x=(e&&e.clientX!=null)?e.clientX:(r.left+r.width/2); const y=(e&&e.clientY!=null)?e.clientY:r.top; let L=x+14; if(L+250>window.innerWidth) L=window.innerWidth-258; t.style.left=Math.max(8,L)+'px'; t.style.top=(y+16)+'px'; } 5082 function bindTips(root){ if(!root) return; const els=[]; if(root.getAttribute&&root.getAttribute('data-ofr-tip')) els.push(root); if(root.querySelectorAll) root.querySelectorAll('[data-ofr-tip]').forEach(function(e){ els.push(e); });
5082 els.forEach(function(el){ if(el.__ofrTip) return; el.__ofrTip=1; el.addEventListener('mouseenter',function(e){ showTip(el,e); }); el.addEventListener('mousemove',function(e){ showTip(el,e); }); el.addEventListener('mouseleave',function(){ tipEl().classList.remove('show'); }); el.addEventListener('click',function(e){ showTip(el,e); clearTimeout(el.__ofrTipT); el.__ofrTipT=setTimeout(function(){ tipEl().classList.remove('show'); },2600); }); }); } 5083 function ago(ts){ if(!ts) return ''; const d=Math.floor(Date.now()/1000)-ts; if(d<60)return 'just now'; if(d<3600)return Math.floor(d/60)+'m ago'; if(d<86400)return Math.floor(d/3600)+'h ago'; if(d<2592000)return Math.floor(d/86400)+'d ago'; return Math.floor(d/2592000)+'mo ago'; } 5084 function stars(val){ val=Math.max(0,Math.min(5,val||0)); let h=''; for(let i=1;i<=5;i++){ if(val>=i) h+='<i class="fas fa-star"></i>'; else if(val>=i-0.5) h+='<i class="fas fa-star-half-alt"></i>'; else h+='<i class="far fa-star"></i>'; } return '<span class="ofr-stars">'+h+'</span>'; } 5085 function radarSVG(dims){ 5086 const L=[['ease','Ease'],['speed','Speed'],['earnings','Earnings'],['tracking','Tracking'],['enjoyment','Enjoyment']]; 5087 const N=5, cx=165, cy=110, R=68; 5088 const ang=i=>(-Math.PI/2)+i*(2*Math.PI/N); 5089 const pt=(i,r)=>[cx+r*Math.cos(ang(i)), cy+r*Math.sin(ang(i))]; 5090 let grid=''; 5091 [0.25,0.5,0.75,1].forEach(f=>{ let p=''; for(let i=0;i<N;i++){const a=pt(i,R*f);p+=(i?'L':'M')+a[0].toFixed(1)+' '+a[1].toFixed(1);} grid+='<path d="'+p+'Z" class="ofr-r-grid"/>'; }); 5092 let axes=''; for(let i=0;i<N;i++){const a=pt(i,R);axes+='<line x1="'+cx+'" y1="'+cy+'" x2="'+a[0].toFixed(1)+'" y2="'+a[1].toFixed(1)+'" class="ofr-r-axis"/>';} 5093 let poly='',dots=''; for(let i=0;i<N;i++){const v=Math.max(0,Math.min(5,dims[L[i][0]]||0));const a=pt(i,R*(v/5));poly+=(i?'L':'M')+a[0].toFixed(1)+' '+a[1].toFixed(1);dots+='<circle cx="'+a[0].toFixed(1)+'" cy="'+a[1].toFixed(1)+'" r="3.2" class="ofr-r-dot" data-ofr-tip="'+L[i][1]+': '+(Math.round(v*10)/10)+' / 5"/>';} 5094 let lb=''; for(let i=0;i<N;i++){const a=pt(i,R+20);const x=a[0];const anch=x<cx-6?'end':(x>cx+6?'start':'middle');lb+='<text x="'+x.toFixed(1)+'" y="'+a[1].toFixed(1)+'" class="ofr-r-lbl" text-anchor="'+anch+'" dominant-baseline="middle" data-ofr-tip="'+DESC[L[i][0]]+'">'+L[i][1]+'</text>';} 5095 return '<svg viewBox="0 0 330 216" class="ofr-radar" aria-hidden="true">'+grid+axes+'<path d="'+poly+'Z" class="ofr-r-area"/>'+dots+lb+'</svg>'; 5096 } 5097 function paint(area,k,v){ area.querySelectorAll('.ofr-in-star[data-k="'+k+'"]').forEach(function(st){ const i=+st.dataset.v; st.className='ofr-in-star '+(v>=i?'fas fa-star':(v>=i-0.5?'fas fa-star-half-alt':'far fa-star')); }); } 5098 function starVal(st,ev){ const r=st.getBoundingClientRect(); const i=+st.dataset.v; const cx=(ev.clientX!=null?ev.clientX:(ev.touches&&ev.touches[0]?ev.touches[0].clientX:r.right)); return (cx-r.left)<r.width/2 ? i-0.5 : i; } 5099 function showForm(area, my, offerId, container){ 5100 my = my||{}; 5101 let rows=''; 5102 DIMS.forEach(function(d){ const k=d[0],label=d[1]; const cur=my[k]||0; let st=''; for(let i=1;i<=5;i++){ st+='<i class="ofr-in-star '+(cur>=i?'fas fa-star':(cur>=i-0.5?'fas fa-star-half-alt':'far fa-star'))+'" data-k="'+k+'" data-v="'+i+'"></i>'; } rows+='<div class="ofr-form-row"><span class="ofr-form-lbl">'+label+'</span><span class="ofr-form-stars" data-k="'+k+'">'+st+'</span></div>'; }); 5103 area.innerHTML='<div class="ofr-form"><div class="ofr-form-title">Rate this offer</div>'+rows+'<div class="ofr-form-hint">Tap the left half of a star for a half rating.</div><div class="ofr-form-actions"><button type="button" class="ofr-submit">Submit</button><button type="button" class="ofr-cancel">Cancel</button></div><div class="ofr-form-msg"></div></div>'; 5104 const vals=Object.assign({},my); 5105 area.querySelectorAll('.ofr-in-star').forEach(function(st){ 5106 st.addEventListener('mousemove',function(e){ paint(area,st.dataset.k,starVal(st,e)); }); 5107 st.addEventListener('click',function(e){ const k=st.dataset.k,v=starVal(st,e); vals[k]=v; paint(area,k,v); }); 5108 }); 5109 area.querySelectorAll('.ofr-form-stars').forEach(function(g){ g.addEventListener('mouseleave',function(){ paint(area,g.dataset.k,vals[g.dataset.k]||0); }); }); 5110 area.querySelector('.ofr-cancel').addEventListener('click',function(){ renderRateArea(area,(_ctx&&_ctx.data)?_ctx.data:{review_count:0,can_review:true,my_review:(Object.keys(my).length?my:null)},offerId,container); }); 5111 area.querySelector('.ofr-submit').addEventListener('click',function(){ submit(area,vals,offerId,container); }); 5112 } 5113 function submit(area, vals, offerId, container){ 5114 const msg=area.querySelector('.ofr-form-msg'); 5115 for(let i=0;i<DIMS.length;
5115i++){ if(!vals[DIMS[i][0]]){ msg.textContent='Please rate all 5 categories.'; msg.className='ofr-form-msg err'; return; } } 5116 const btn=area.querySelector('.ofr-submit'); btn.disabled=true; btn.textContent='Saving...'; 5117 const fd=new FormData(); fd.append('action','submit_offer_review'); fd.append('offer_id',offerId); fd.append('csrf_token',window.csrfToken||''); 5118 DIMS.forEach(function(d){ fd.append(d[0],vals[d[0]]); }); 5119 fetch('/api/secure_handler.php',{method:'POST',body:fd}).then(function(r){return r.json();}).then(function(d){ 5120 if(d.success){ refresh(); } else { msg.textContent=d.message||'Failed to submit.'; msg.className='ofr-form-msg err'; btn.disabled=false; btn.textContent='Submit'; } 5121 }).catch(function(){ msg.textContent='Network error.'; msg.className='ofr-form-msg err'; btn.disabled=false; btn.textContent='Submit'; }); 5122 } 5123 function renderRateArea(area, data, offerId, container){ 5124 if(!data.can_review){ area.innerHTML='<div class="ofr-note">Complete at least one step of this offer to leave a rating.</div>'; return; } 5125 const my=data.my_review; 5126 area.innerHTML='<button type="button" class="ofr-rate-btn">'+(my?'Edit your rating':'Rate this offer')+'</button>'; 5127 area.querySelector('.ofr-rate-btn').addEventListener('click',function(){ showForm(area,my,offerId,container); }); 5128 } 5129 function render(container, data, offerId){ 5130 const rc=data.review_count||0; 5131 let h='<div class="ofr-wrap">'; 5132 if(data.dims){ h+='<div class="ofr-radar-wrap">'+radarSVG(data.dims)+'</div>'; } 5133 h+='<div class="ofr-score" data-ofr-tip="Average of user ratings. Starts at 3 stars by default."><span class="ofr-score-num notranslate">'+Number(data.overall).toFixed(1)+'</span><span class="ofr-score-sub">/ 5'+(rc>0?(' · '+rc+' rating'+(rc===1?'':'s')):'')+'</span></div>'; 5134 h+='<div class="ofr-rate-area"></div>'; 5135 h+='</div>'; 5136 container.innerHTML=h; 5137 renderRateArea(container.querySelector('.ofr-rate-area'), data, offerId, container); 5138 bindTips(container); 5139 } 5140 function renderTopStars(el, d){ 5141 if(!el) return; 5142 const rc=d.review_count||0; 5143 el.style.display=''; 5144 el.innerHTML='<span class="ofr-top-lbl">Rating</span>'+stars(d.overall)+'<span class="ofr-top-num notranslate">'+Number(d.overall).toFixed(1)+'</span>'; 5145 el.setAttribute('data-ofr-tip', 'Average of user ratings'+(rc>0?(' ('+rc+' rating'+(rc===1?'':'s')+')'):'')+'. Starts at 3 stars by default.'); 5146 bindTips(el); 5147 } 5148 function renderHeroStats(el, d){ 5149 if(!el) return; 5150 const c=d.completions||0; 5151 if(c<=0){ el.style.display='none'; el.innerHTML=''; return; } 5152 let h='<span class="ofr-hs-c"><i class="fas fa-users"></i> '+c.toLocaleString()+' completes</span>'; 5153 if(d.completion_rate!=null){ h+='<span class="ofr-hs-r"><i class="fas fa-chart-line"></i> '+d.completion_rate+'% completion rate</span>'; } 5154 el.innerHTML=h; el.style.display=''; 5155 } 5156 var _ctx=null; 5157 function load(offerId, reviewsEl, starsEl, heroEl){ 5158 _ctx={offerId:offerId, reviewsEl:reviewsEl, starsEl:starsEl, heroEl:heroEl, data:null}; 5159 if(!offerId){ if(reviewsEl) reviewsEl.innerHTML='<div class="ofr-note">Offer not available.</div>'; return; } 5160 if(reviewsEl) reviewsEl.innerHTML='<div class="ofr-loading"><i class="fas fa-spinner fa-spin"></i></div>'; 5161 const fd=new FormData(); fd.append('action','get_offer_reviews'); fd.append('offer_id',offerId); fd.append('csrf_token',window.csrfToken||''); 5162 fetch('/api/secure_handler.php',{method:'POST',body:fd}).then(function(r){return r.json();}).then(function(d){ 5163 if(!d.success){ if(reviewsEl) reviewsEl.innerHTML='<div class="ofr-note">Could not load reviews.</div>'; return; } 5164 if(_ctx) _ctx.data=d; 5165 if(reviewsEl) render(reviewsEl, d, offerId); 5166 if(starsEl) renderTopStars(starsEl, d); 5167 if(heroEl) renderHeroStats(heroEl, d); 5168 }).catch(function(){ if(reviewsEl) reviewsEl.innerHTML='<div class="ofr-note">Could not load reviews.</div>'; }); 5169 } 5170 function refresh(){ if(_ctx) load(_ctx.offerId, _ctx.reviewsEl, _ctx.starsEl, _ctx.heroEl); } 5171 return { load: load, refresh: refresh, mount: function(offerId, el){ load(offerId, el, null, null); } }; 5172 })(); 5173 </script>
5173 5174 5175
5175<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 5176 (function(){ 5177 function toast(msg, ok){ 5178 var t=document.getElementById('ofrShareToast'); 5179 if(!t){ t=document.createElement('div'); t.id='ofrShareToast'; t.className='ofr-toast'; t.setAttribute('aria-live','polite'); t.setAttribute('aria-atomic','true'); document.body.appendChild(t); } 5180 t.textContent=msg; t.className='ofr-toast '+(ok===false?'err':'ok')+' show'; 5181 clearTimeout(t.__h); t.__h=setTimeout(function(){ t.classList.remove('show'); }, 2800); 5182 } 5183 function ofrDeepModal(title, msg){ 5184 var ov=document.getElementById('ofrDeepModal'); 5185 if(!ov){ 5186 ov=document.createElement('div'); ov.id='ofrDeepModal'; ov.className='ofr-deep-overlay'; 5187 ov.innerHTML='<div class="ofr-deep-box"><button class="ofr-deep-close" type="button" aria-label="Close">×</button><div class="ofr-deep-ic"><svg viewBox="0 0 24 24" width="40" height="40" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg></div><div class="ofr-deep-t"></div><div class="ofr-deep-s"></div><button class="ofr-deep-ok" type="button">OK</button></div>'; 5188 document.body.appendChild(ov); 5189 var close=function(){ ov.classList.remove('show'); }; 5190 ov.addEventListener('click',function(e){ if(e.target===ov) close(); }); 5191 ov.querySelector('.ofr-deep-close').addEventListener('click',close); 5192 ov.querySelector('.ofr-deep-ok').addEventListener('click',close); 5193 } 5194 ov.querySelector('.ofr-deep-t').textContent=title; 5195 ov.querySelector('.ofr-deep-s').textContent=msg; 5196 ov.classList.add('show'); 5197 } 5198 window.ofrShare = function(){ 5199 var id = window.__ofrCurrentOffer; if(!id) return; 5200 var url = location.origin + '/earn?offer=' + encodeURIComponent(id); 5201 if(navigator.clipboard && navigator.clipboard.writeText){ 5202 navigator.clipboard.writeText(url).then(function(){ toast('Share link copied!', true); }, function(){ window.prompt('Copy this link:', url); }); 5203 } else { window.prompt('Copy this link:', url); } 5204 }; 5205 var ofrLoggedIn = false; 5206 var p=new URLSearchParams(location.search); var oid=p.get('offer'); 5207 // A partnerek id-je nem csak betu/szam: a Lootably pl. a hirdeto nevet is 5208 // beleteszi ("lootably_91-1|Varock.gg"), es van benne pont es szokoz is. 5209 // A korabbi [a-zA-Z0-9_-] szures ezeket eldobta, igy a helyes link sem 5210 // nyitotta meg az ajanlatot. Csak azt tiltjuk, ami tenyleg veszelyes vagy 5211 // ertelmetlen itt: vezerlokarakterek es a jelolest toro < > " ' ` jelek. 5212 if(oid && oid.length<=100 && !/[\u0000-\u001f<>"'`]/.test(oid)){ 5213 var run=function(){ 5214 if(!ofrLoggedIn){ 5215 (function tryAuth(n){ 5216 if(typeof window.openAuthModal==='function'){ window.openAuthModal('login'); } 5217 else if(n<24){ setTimeout(function(){ tryAuth(n+1); }, 250); } 5218 else { ofrDeepModal('Log in required', 'Please log in to view this offer.'); } 5219 })(0); 5220 return; 5221 } 5222 if(!window.csrfToken){ setTimeout(run,300); return; } 5223 var fd=new FormData(); fd.append('action','get_offer_by_id'); fd.append('offer_id',oid); fd.append('csrf_token',window.csrfToken); 5224 fetch('/api/secure_handler.php',{method:'POST',body:fd}).then(function(r){return r.json();}).then(function(d){ 5225 if(d && d.success && d.offer && typeof openOfferModal==='function'){ 5226 var o=d.offer; 5227 o.payout = (o.payout!=null? o.payout : (o.user_payout_usd||0)); 5228 o.reward_display = o.reward_display || ('$'+formatAmou
5228ntExact(Number(o.user_payout_usd||o.payout||0))); 5229 window.popularOffersData = window.popularOffersData || []; 5230 if(!window.popularOffersData.some(function(x){return String(x.id)===String(o.id);})) window.popularOffersData.push(o); 5231 try { openOfferModal(o.id, 'popular'); } catch(e){ try{ openOfferModal(o.id, 'task'); }catch(e2){ toast('Could not open this offer.', false); } } 5232 } else if(d && (d.requires_login || (d.error && /log(ged)?\s*in/i.test(d.error)))){ 5233 if(typeof window.openAuthModal==='function') window.openAuthModal('login'); 5234 else ofrDeepModal('Log in required', 'Please log in to view this offer.'); 5235 } else if(d && d.availability_status==='country'){ 5236 ofrDeepModal('Not available in your region', (d && d.error) ? d.error : "This offer isn't available in your country right now."); 5237 } else { 5238 ofrDeepModal('Offer no longer available', (d && d.error) ? d.error : 'This offer has ended or is no longer available.'); 5239 } 5240 }).catch(function(){ toast('This offer is no longer available or not available in your region.', false); }); 5241 }; 5242 if(document.readyState==='loading'){ document.addEventListener('DOMContentLoaded', function(){ setTimeout(run,700); }); } 5243 else { setTimeout(run,700); } 5244 } 5245 })(); 5246 </script>
5246 5247 5248 5249
5249<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 5250 /* Billentyuzetes aktivalas a role="button"-kent viselkedo div/span elemeken. 5251 A natÃv <button> ezt magatol tudja, az ARIA-val ellatott elemek nem. */ 5252 (function () { 5253 document.addEventListener('keydown', function (e) { 5254 if (e.key !== 'Enter' && e.key !== ' ' && e.key !== 'Spacebar') return; 5255 var el = e.target; 5256 if (!el || !el.closest) return; 5257 var btn = el.closest('[role="button"][tabindex]'); 5258 if (!btn || btn.getAttribute('aria-disabled') === 'true') return; 5259 var tag = el.tagName; 5260 if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || el.isContentEditable) return; 5261 e.preventDefault(); 5262 btn.click(); 5263 }); 5264 })(); 5265 </script>
5265 5266 5267
5267<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 5268 /* Kozponti modal-kezeles: Escape-pel zaras, gorgetes-zar a hatter mogott, 5269 es fokusz athelyezese a megnyilo dialogusba. Minden modal a sajat zaro 5270 gombjat kapja meg (btn.click()), igy a takarito logikajuk lefut. */ 5271 (function () { 5272 var MODAL_SEL = '[role="dialog"][aria-modal="true"]'; 5273 var CLOSE_SEL = '.tks-modal-cl,.modal-close,.offer-modal-close,.popular-offer-modal-close,' + 5274 '.ds-modal-close,.code-modal-close,.auth-modal-close,.settings-modal-close,' + 5275 '[data-modal-close],[aria-label="Close"],[aria-label="Close window"]'; 5276 var timer = null, lastOpen = null, prevFocus = null; 5277 5278 function isVisible(el) { 5279 if (!el || !el.isConnected) return false; 5280 var cs = window.getComputedStyle(el); 5281 if (cs.display === 'none' || cs.visibility === 'hidden') return false; 5282 if (parseFloat(cs.opacity) < 0.02) return false; 5283 return el.getClientRects().length > 0; 5284 } 5285 function openModals() { 5286 var all = document.querySelectorAll(MODAL_SEL), out = []; 5287 for (var i = 0; i < all.length; i++) { if (isVisible(all[i])) out.push(all[i]); } 5288 return out; 5289 } 5290 function sync() { 5291 timer = null; 5292 var open = openModals(); 5293 var top = open.length ? open[open.length - 1] : null; 5294 document.body.classList.toggle('has-open-modal', !!top); 5295 if (top && top !== lastOpen) { 5296 prevFocus = document.activeElement; 5297 if (!top.contains(document.activeElement)) { 5298 if (!top.hasAttribute('tabindex')) top.setAttribute('tabindex', '-1'); 5299 try { top.focus({ preventScroll: true }); } catch (e) {} 5300 } 5301 } else if (!top && lastOpen) { 5302 if (prevFocus && prevFocus.isConnected && typeof prevFocus.focus === 'function') { 5303 try { prevFocus.focus({ preventScroll: true }); } catch (e) {} 5304 } 5305 prevFocus = null; 5306 } 5307 lastOpen = top; 5308 } 5309 function schedule() { if (timer === null) timer = setTimeout(sync, 60); } 5310 5311 try { 5312 new MutationObserver(function (muts) { 5313 for (var i = 0; i < muts.length; i++) { 5314 var t = muts[i].target; 5315 if (t.nodeType !== 1) continue; 5316 if (t.matches && (t.matches(MODAL_SEL) || t.querySelector(MODAL_SEL) || t.closest(MODAL_SEL))) { 5317 schedule(); return; 5318 } 5319 } 5320 }).observe(document.documentElement, { 5321 subtree: true, childList: true, attributes: true, 5322 attributeFilter: ['style', 'class', 'hidden'] 5323 }); 5324 } catch (e) {} 5325 5326 document.addEventListener('keydown', function (e) { 5327 if (e.key !== 'Escape' && e.key !== 'Esc') return; 5328 var open = openModals(); 5329 if (!open.length) return; 5330 var top = open[open.length - 1]; 5331 var btn = top.querySelector(CLOSE_SEL); 5332 e.preventDefault(); 5333 if (btn) { btn.click(); } else { top.click(); } 5334 schedule(); 5335 }); 5336 })(); 5337 </script>
5337 5338
5338<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"> 5339 (function () { 5340 if (navigator.userAgent.indexOf('SharkEarningsApp') === -1) return; 5341 document.addEventListener('click', function (e) { 5342 if (e.defaultPrevented || e.button !== 0) return; 5343 var a = e.target.closest ? e.target.closest('a[href^="/offer/"]') : null; 5344 if (!a) return; 5345 e.preventDefault(); 5346 var href = a.getAttribute('href').split('?')[0]; 5347 fetch(href + '?json=1', { credentials: 'same-origin', cache: 'no-store' }) 5348 .then(function (r) { return r.json(); }) 5349 .then(function (d) { 5350 if (d && d.success && d.url) { window.open(d.url, '_blank'); } 5351 else if (d && d.login) { window.location.href = '/'; } 5352 else { window.location.href = href; } 5353 }) 5354 .catch(function () { window.location.href = href; }); 5355 }); 5356 })(); 5357 </script>
5357 5358
5358<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz" data-cf-beacon='{"version":"2024.11.0","token":"eb94d24335e646d39fb294310cd9605d","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 5358
5358
5359<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.nonce='P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz';d.innerHTML="window.__CF$cv$params={r:'a43f9c9ef8af0009',t:'MTc5MDkwMTE2NQ=='};var a=document.createElement('script');a.nonce='P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
5359</body> 5360 </html>
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.