// ===== SÜRÜM (logo/css cache kırım - değişiklikte artır) =====
const ASSET_V = 153;
// ===== SITES DATA =====
const SITES = [{"name":"Dinamobet","bonus":"500","bonusType":"Deneme Bonusu","link":"https://tinyurl.com/53xmummw","logo":"logos/dinamobet-logo.png","displayOrder":1,"active":true,"tag":"trend","badge":"TREND","isPopup":false,"isPinned":true,"isPopup3":true},{"name":"Şans Casino","bonus":"10.000","bonusType":"Deneme Bonusu","link":"https://bit.ly/sansyandex","logo":"logos/sanscasino-logo.png","displayOrder":2,"active":true,"tag":"trend","badge":"TREND","isPopup":false,"isPinned":true,"isPopup2":true,"isPopup2Order":3},{"name":"Vidobet","bonus":"9.999","bonusType":"Deneme Bonusu","link":"https://bit.ly/vidoyandex","logo":"logos/vidobet-logo.png","isPinned":true,"isPopup":false,"isPopup2":true,"displayOrder":3,"badge":"TREND","tag":"trend","active":true,"isPopup2Order":2},{"name":"Casino Levant","bonus":"7.777","bonusType":"Deneme Bonusu","link":"https://bit.ly/levantyandex","logo":"logos/casinolevant-logo.png","isPinned":true,"isPopup":false,"isPopup2":true,"displayOrder":4,"badge":"TREND","tag":"trend","active":true,"isPopup2Order":1},{"name":"Privebet","bonus":"500","bonusType":"Deneme Bonusu","link":"https://tinyurl.com/utv3ppaa","logo":"logos/privebet-logo.png","isPinned":true,"isPopup":false,"isPopup3":true,"displayOrder":5,"badge":"TREND","tag":"trend","active":true,"isPopup3Order":2},{"name":"Festwin","bonus":"1.000","bonusType":"Deneme Bonusu","link":"https://festwinortaklikdashboard.com/c/guvenmedia","logo":"logos/festwin-logo.png","isPinned":true,"isPopup":false,"displayOrder":6,"badge":"TREND","tag":"trend","active":true},{"name":"Tipobet","bonus":"1.001 TL + 101 FS","bonusType":"Deneme Bonusu","link":"https://tinyurl.com/mr2h6fyk","logo":"logos/tipobet.png","isPinned":true,"isPopup":true,"popupOrder":2,"displayOrder":7,"badge":"TREND","tag":"trend","active":true},{"name":"Sahabet","bonus":"1.000","bonusType":"Deneme Bonusu","link":"https://shrtly.to/M0Sf","logo":"logos/sahabet.png","isPinned":true,"isPopup":true,"popupOrder":3,"displayOrder":8,"badge":"TREND","tag":"trend","active":true},{"name":"Süpertotobet","bonus":"1.000","bonusType":"Deneme Bonusu","link":"https://t.ly/Zj15x","logo":"logos/supertoto-logo.webp","isPinned":true,"isPopup":true,"popupOrder":1,"displayOrder":9,"badge":"TREND","tag":"trend","active":true},{"name":"ZBahis","bonus":"666","bonusType":"Deneme Bonusu","link":"https://zbhs.short.gy/ch6wcD","logo":"logos/zbahis.png","displayOrder":10,"active":true,"tag":"trend","badge":"TREND","isPopup":true,"isPinned":true,"popupOrder":4},{"name":"FixBet","bonus":"1000","bonusType":"Deneme Bonusu","link":"http://tinyurl.com/2nzhn9m4","logo":"logos/fixbet.png","displayOrder":11,"active":true,"tag":"trend","badge":"TREND","isPopup":true,"isPinned":true,"popupOrder":5},{"name":"Q Casino","bonus":"5000","bonusType":"Deneme Bonusu","link":"https://shorturl.ly/qcasinostar","logo":"logos/qcasino.png","displayOrder":7,"active":true,"tag":"popular","badge":"TREND","isPopup":false,"isPinned":true},{"name":"MatadorBet","bonus":"1000 TL","bonusType":"Deneme Bonusu","link":"https://dub.sh/mtd/?aff=2378","logo":"logos/matadorbet.png","displayOrder":12,"active":true,"tag":"trend","badge":"TREND","isPopup":true,"isPinned":true,"popupOrder":6},{"name":"Betroy","bonus":"5.000","bonusType":"Deneme Bonusu","link":"https://betroy.link/denizyandex","logo":"logos/betroy.png","isPinned":true,"isPopup":false,"displayOrder":13,"badge":"TREND","tag":"trend","active":true},{"name":"Bahisliga","bonus":"500","bonusType":"Deneme Bonusu","link":"https://t.ly/bahisligaguven","logo":"logos/bahisliga.png","displayOrder":14,"active":true,"tag":"trend","badge":"TREND","isPopup":false,"isPinned":true,"isPopup2":true,"isPopup2Order":4},{"name":"Yakut Casino","bonus":"333","bonusType":"Deneme Bonusu","link":"https://yakutcasinosite.com/?btag=3333521","logo":"logos/yakutcasino-logo.gif","displayOrder":15,"active":true,"tag":"trend","badge":"TREND","isPopup":false,"isPinned":true,"isPopup3":true},{"name":"Betbox","bonus":"1.000","bonusType":"Deneme Bonusu","link":"https://boxaffi.com/affiliates/?btag=770678","logo":"logos/betbox.png","displayOrder":8,"active":false,"tag":"popular","badge":"TREND","isPopup":false,"isPinned":true},{"name":"Tarafbet","bonus":"1000","bonusType":"Deneme Bonusu","link":"https://tarafbet.short.gy/ZZ7bH","logo":"logos/tarafbet.png","displayOrder":2,"active":true,"tag":"popular","badge":"TREND","isPopup":false,"isPinned":true,"isPopup4":true,"isPopup4Order":2},{"name":"Mariobet","bonus":"1000","bonusType":"Deneme Bonusu","link":"https://girismario.com/v53vmu","logo":"logos/mariobet.png","displayOrder":3,"active":true,"tag":"popular","badge":"TREND","isPopup":false,"isPinned":true,"isPopup4":true},{"name":"Bahiscom","bonus":"750","bonusType":"Deneme Bonusu","link":"https://bahisgirisb.com/if1z54","logo":"logos/bahiscom.png","displayOrder":1,"active":true,"tag":"popular","badge":"TREND","isPopup":false,"isPinned":true,"isPopup4":true,"isPopup4Order":1},{"name":"Betewin","bonus":"1000","bonusType":"Deneme Bonusu","link":"https://wintikla.com/itjhmg","logo":"logos/betewin.png","displayOrder":4,"active":true,"tag":"popular","badge":"TREND","isPopup":false,"isPinned":true,"isPopup4":true,"isPopup4Order":4},{"name":"Bankobet","bonus":"1000","bonusType":"Deneme Bonusu","link":"https://bankogirisi.com/6zrwaq","logo":"logos/bankobet.png","displayOrder":5,"active":true,"tag":"popular","badge":"TREND","isPopup":false,"isPinned":true,"isPopup4":true,"isPopup4Order":5},{"name":"Betkom","bonus":"333","bonusType":"Deneme Bonusu","link":"https://btkmgir.com/ey62dq","logo":"logos/betkom.png","displayOrder":6,"active":true,"tag":"popular","badge":"TREND","isPopup":false,"isPinned":true,"isPopup4":true,"isPopup4Order":6},{"name":"Acarbet","bonus":"200","bonusType":"Yatırım Bonusu","link":"","logo":"logos/acarbet.webp","displayOrder":1,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Alfabahis","bonus":"150","bonusType":"Hoş Geldin Bonusu","link":"","logo":"logos/alfabahis.webp","displayOrder":2,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Altspin","bonus":"300","bonusType":"Hoş Geldin Bonusu","link":"","logo":"logos/altspin.webp","displayOrder":3,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Amkbet","bonus":"250","bonusType":"Deneme Bonusu","link":"","logo":"logos/amkbet.webp","displayOrder":4,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Anabahis","bonus":"750","bonusType":"Hoş Geldin Bonusu","link":"","logo":"logos/anabahis.webp","displayOrder":5,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Antikbet","bonus":"2.000","bonusType":"Yatırım Bonusu","link":"","logo":"logos/antikbet.webp","displayOrder":6,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Anubisbet","bonus":"1.000","bonusType":"Hoş Geldin Bonusu","link":"","logo":"logos/anubisbet.webp","displayOrder":7,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Anvilbet","bonus":"150","bonusType":"Kayıp Bonusu","link":"","logo":"logos/anvilbet.webp","displayOrder":8,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Atlantisbahis","bonus":"1.000","bonusType":"Kayıp Bonusu","link":"","logo":"logos/atlantisbahis.webp","displayOrder":9,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Atlasbet","bonus":"2.000","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/atlasbet.webp","displayOrder":10,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Ayazbet","bonus":"750","bonusType":"Kayıp Bonusu","link":"","logo":"logos/ayazbet.webp","displayOrder":11,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Babilbet","bonus":"1.500","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/babilbet.webp","displayOrder":12,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Bahibom","bonus":"2.000","bonusType":"Deneme Bonusu","link":"","logo":"logos/bahibom.webp","displayOrder":13,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Bahiks","bonus":"300","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/bahiks.png","displayOrder":14,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Bahismore","bonus":"200","bonusType":"Kayıp Bonusu","link":"","logo":"logos/bahismore.webp","displayOrder":15,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Bahisnow","bonus":"750","bonusType":"Hoş Geldin Bonusu","link":"","logo":"logos/bahisnow.webp","displayOrder":16,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Bahisoyna","bonus":"500","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/bahisoyna.webp","displayOrder":17,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Bahsegel","bonus":"1.500","bonusType":"Kayıp Bonusu","link":"","logo":"logos/bahsegel.webp","displayOrder":18,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Balbet","bonus":"300","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/balbet.webp","displayOrder":19,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Bekabet","bonus":"500","bonusType":"Deneme Bonusu","link":"","logo":"logos/bekabet.webp","displayOrder":20,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Benjaminsbet","bonus":"200","bonusType":"Deneme Bonusu","link":"","logo":"logos/benjaminsbet.webp","displayOrder":21,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Berlinbet","bonus":"750","bonusType":"Yatırım Bonusu","link":"","logo":"logos/berlinbet.webp","displayOrder":22,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Bet10bet","bonus":"3.000","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/bet10bet.webp","displayOrder":23,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betadonis","bonus":"1.500","bonusType":"Yatırım Bonusu","link":"","logo":"logos/betadonis.webp","displayOrder":24,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betamiral","bonus":"250","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/betamiral.webp","displayOrder":25,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betarena","bonus":"200","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/betarena.webp","displayOrder":26,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betbalina","bonus":"500","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/betbalina.webp","displayOrder":27,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betbon","bonus":"100","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/betbon.webp","displayOrder":28,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betcell","bonus":"3.000","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/betcell.webp","displayOrder":29,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betci","bonus":"1.000","bonusType":"Kayıp Bonusu","link":"","logo":"logos/betci.webp","displayOrder":30,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betcik","bonus":"3.000","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/betcik.webp","displayOrder":31,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betcool","bonus":"3.000","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/betcool.webp","displayOrder":32,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betebet","bonus":"150","bonusType":"Deneme Bonusu","link":"","logo":"logos/betebet.webp","displayOrder":33,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Beteking","bonus":"1.500","bonusType":"Hoş Geldin Bonusu","link":"","logo":"logos/beteking.webp","displayOrder":34,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betesen","bonus":"150","bonusType":"Hoş Geldin Bonusu","link":"","logo":"logos/betesen.webp","displayOrder":35,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betforce","bonus":"200","bonusType":"Hoş Geldin Bonusu","link":"","logo":"logos/betforce.webp","displayOrder":36,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betgar","bonus":"100","bonusType":"Deneme Bonusu","link":"","logo":"logos/betgar.webp","displayOrder":37,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betgaranti","bonus":"3.000","bonusType":"Yatırım Bonusu","link":"","logo":"logos/betgaranti.webp","displayOrder":38,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betgross","bonus":"100","bonusType":"Deneme Bonusu","link":"","logo":"logos/betgross.webp","displayOrder":39,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betifa","bonus":"150","bonusType":"Hoş Geldin Bonusu","link":"","logo":"logos/betifa.webp","displayOrder":40,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betigma","bonus":"150","bonusType":"Hoş Geldin Bonusu","link":"","logo":"logos/betigma.webp","displayOrder":41,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betingo","bonus":"3.000","bonusType":"Kayıp Bonusu","link":"","logo":"logos/betingo.webp","displayOrder":42,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betixir","bonus":"500","bonusType":"Deneme Bonusu","link":"","logo":"logos/betixir.webp","displayOrder":43,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betkong","bonus":"1.500","bonusType":"Yatırım Bonusu","link":"","logo":"logos/betkong.webp","displayOrder":44,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betkorner","bonus":"500","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/betkorner.webp","displayOrder":45,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betlesene","bonus":"500","bonusType":"Deneme Bonusu","link":"","logo":"logos/betlesene.webp","displayOrder":46,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betlike","bonus":"250","bonusType":"Yatırım Bonusu","link":"","logo":"logos/betlike.webp","displayOrder":47,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betlivo","bonus":"3.000","bonusType":"Hoş Geldin Bonusu","link":"","logo":"logos/betlivo.png","displayOrder":48,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betmarket","bonus":"500","bonusType":"Freespin Deneme Bonusu","link":"","logo":"logos/betmarket.webp","displayOrder":49,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false},{"name":"Betmoney","bonus":"200","bonusType":"Hoş Geldin Bonusu","link":"","logo":"logos/betmoney.webp","displayOrder":50,"active":true,"tag":"nonsponsor","isPopup":false,"isPinned":false}];
const wheelPrizes = [];
const curWheelSites = [];
const GAMES = [
{ name: "Aviator", image: "games/aviator.gif", m: "36x", d: "Aviator oynatan güvenilir casino siteleri", s: [] },
{ name: "Sweet Bonanza", image: "games/sweet-bonanza.gif", m: "500x", d: "Sweet Bonanza oynatan güvenilir casino siteleri", s: [] },
{ name: "Gates of Olympus", image: "games/gates.gif", m: "1000x", d: "Gates of Olympus slot oynatan güvenilir siteler", s: [] },
{ name: "Sugar Rush", image: "games/sugar.gif", m: "250x", d: "Sugar Rush oynatan güvenilir siteler", s: [] },
{ name: "40 Super Hot", image: "games/egt.gif", m: "100x", d: "EGT slot oyunları oynatan güvenilir siteler", s: [] },
{ name: "40 Burning Hot", image: "games/egt2.gif", m: "150x", d: "Burning Hot oynatan güvenilir casino siteleri", s: [] },
{ name: "Starlight Princess", image: "games/starlight.gif", m: "800x", d: "Starlight Princess oynatan güvenilir siteler", s: [] },
{ name: "The Dog House", image: "games/doghouse.webp", m: "300x", d: "Dog House slot oynatan güvenilir siteler", s: [] },
{ name: "Big Bass", image: "games/bigbass.webp", m: "400x", d: "Big Bass Bonanza oynatan güvenilir casino siteleri", s: [] }
];
const tresureRewards = curWheelSites;
// Nonsponsor kartlar icin donusumlu sponsor link havuzu
const _SPONSOR_POOL = SITES.filter(s => s.tag === 'trend').map(s => s.link);
let _poolStart = Math.floor(Math.random() * _SPONSOR_POOL.length);
// Helper: is TL?
function isTL(bonus, bonusType) {
const b = bonus.toLowerCase();
const bt = (bonusType || '').toLowerCase();
return !b.includes('%') && !b.includes('tl') && !b.includes(' fs') && !b.includes('kripto') && !b.includes('sınırsız') && !b.includes('freespin') && !b.includes('freebet') && !bt.includes('freespin') && !bt.includes('freebet') && !bt.includes('cashback');
}
function shortWheelPrize(bonus) {
const m = bonus.match(/[\d.,]+/);
if (!m) return bonus;
return m[0] + ' TL';
}
function buildWheelData() {
const pool = SITES.filter(s => (s.tag === 'trend' || s.tag === 'popular') && s.active !== false && s.link);
if (!pool.length) return;
const shuffled = pool.slice().sort(() => Math.random() - 0.5);
const picks = [];
while (picks.length < 8) picks.push(shuffled[picks.length % shuffled.length]);
wheelPrizes.length = 0;
curWheelSites.length = 0;
picks.forEach(s => {
const fullPrize = s.bonus + (isTL(s.bonus, s.bonusType) ? ' TL' : '');
wheelPrizes.push(shortWheelPrize(s.bonus));
curWheelSites.push({ p: fullPrize, s: s.name, l: s.link });
});
}
function buildGameSites() {
const pool = SITES.filter(s => (s.tag === 'trend' || s.tag === 'popular') && s.active !== false && s.link);
if (!pool.length) return;
GAMES.forEach(g => {
g.s = [pool[Math.floor(Math.random() * pool.length)].name];
});
}
// ==== GÖSTERİM KODLARI ====
function renderGames() {
const row = document.getElementById('gamesRow');
row.innerHTML = GAMES.map((g, i) => `
${g.image ? `

` : `
${g.name}`}
${g.name}
`).join('');
}
function getSiteLogoHTML(site, isGold, isPopular) {
const isSponsor = site.tag === 'trend';
const isPopularTag = site.tag === 'popular';
const showBadge = isSponsor || isPopularTag;
const badgeText = isPopularTag ? 'POPÜLER' : 'TREND';
const badgeClass = isGold ? 'badge-yilin' : (isPopularTag ? 'badge-popular' : 'badge-trend');
const badgeHtml = showBadge ? `${badgeText}
` : '';
const logoUrl = site.logo ? (site.logo + (site.logo.indexOf('?') >= 0 ? '&' : '?') + 'v=' + ASSET_V) : '';
const imgHtml = site.logo
? `
${site.name}`
: `${site.name}`;
const baseBox = `background:linear-gradient(145deg,#253e7a 0%,#1a2e5a 40%,#0a1428 100%);border:1px solid ${isGold ? 'rgba(251,191,36,.5)' : 'rgba(16,185,129,.4)'};border-radius:14px;box-shadow:inset 0 1px 0 rgba(255,255,255,.12),inset 0 0 20px rgba(0,0,0,.2),0 2px 10px rgba(0,0,0,.35)`;
const boxStyle = site.isPinned ? baseBox + `,0 0 12px rgba(16,185,129,.15);` : baseBox + `;`;
return `
`;
}
function renderSites(filter = 'all', search = '') {
const c = document.getElementById('siteListContainer');
let filtered = SITES;
if (search) {
const norm = t => t.toLocaleLowerCase('tr').replace(/İ/gi, 'i').replace(/ı/g, 'i').replace(/ö/g, 'o').replace(/ü/g, 'u').replace(/ş/g, 's').replace(/ç/g, 'c').replace(/ğ/g, 'g');
filtered = SITES.filter(s => norm(s.name).includes(norm(search)));
} else {
if (filter === 'trend') filtered = SITES.filter(s => s.tag === 'trend' || (s.isPinned && s.tag !== 'nonsponsor' && s.tag !== 'popular'));
if (filter === 'popular') filtered = SITES.filter(s => s.tag === 'popular');
}
const trends = filtered.filter(s => s.tag === 'trend' || (s.isPinned && s.tag !== 'nonsponsor' && s.tag !== 'popular'));
if (document.referrer && document.referrer.toLowerCase().includes('google.')) {
for (let i = trends.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [trends[i], trends[j]] = [trends[j], trends[i]]; }
} else {
trends.sort((a, b) => a.displayOrder - b.displayOrder);
}
const popularSites = (filter === 'trend') ? [] : SITES.filter(s => s.tag === 'popular');
for (let i = popularSites.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [popularSites[i], popularSites[j]] = [popularSites[j], popularSites[i]]; }
const popu = (filter === 'popular') ? [] : filtered.filter(s => s.tag === 'nonsponsor');
// Fisher-Yates shuffle — her sayfa yenilemede farklı sıralama
for (let i = popu.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [popu[i], popu[j]] = [popu[j], popu[i]]; }
let html = '';
if (trends.length > 0) {
html += `
${trends.map(s => {
const isGold = s.badge === 'YILIN SİTESİ';
return `
${getSiteLogoHTML(s, isGold)}
${s.bonus.includes('%') ? '%' + s.bonus.replace('%','') + '' : s.bonus}${isTL(s.bonus, s.bonusType) ? ' TL' : (s.bonusType.toLowerCase().includes('freespin') ? ' Freespin' : (s.bonusType.toLowerCase().includes('cashback') ? ' Cashback' : ''))}
${s.bonusType.toLowerCase().includes('freespin') ? 'Deneme Bonusu' : (s.bonusDesc || s.bonusType)}
Bonusu Al
`;
}).join('')}
`;
}
if (popularSites.length > 0) {
html += `
${popularSites.map(s => {
const isGold = s.badge === 'YILIN SİTESİ';
return `
${getSiteLogoHTML(s, isGold)}
${s.bonus.includes('%') ? '%' + s.bonus.replace('%','') + '' : s.bonus}${isTL(s.bonus, s.bonusType) ? ' TL' : (s.bonusType.toLowerCase().includes('freespin') ? ' Freespin' : (s.bonusType.toLowerCase().includes('cashback') ? ' Cashback' : ''))}
${s.bonusType.toLowerCase().includes('freespin') ? 'Deneme Bonusu' : (s.bonusDesc || s.bonusType)}
Bonusu Al
`;
}).join('')}
`;
}
if (popu.length > 0) {
html += `
${popu.map((s, i) => {
const _spLink = _SPONSOR_POOL[(_poolStart + i) % _SPONSOR_POOL.length];
const _spSite = SITES.find(x => x.link === _spLink);
const _spName = _spSite ? _spSite.name.replace(/'/g, "\\'") : 'Bilinmeyen';
return `
${getSiteLogoHTML(s, false, true)}
${s.bonus.includes('%') ? '%' + s.bonus.replace('%','') + '' : s.bonus}${isTL(s.bonus, s.bonusType) ? ' TL' : (s.bonusType.toLowerCase().includes('freespin') ? ' Freespin' : (s.bonusType.toLowerCase().includes('cashback') ? ' Cashback' : ''))}
${s.bonusType.toLowerCase().includes('freespin') ? 'Deneme Bonusu' : (s.bonusDesc || s.bonusType)}
Bonusu Al
`;}).join('')}
`;
}
c.innerHTML = html;
}
// ==== FILTER ====
let curFilter = 'all';
function setFilter(f, btn) {
curFilter = f;
document.querySelectorAll('.filter-pill').forEach(b => b.classList.remove('active'));
if (btn) btn.classList.add('active');
renderSites(f, '');
}
function toggleSearch() {
document.getElementById('filterBarNormal').style.display = 'none';
document.getElementById('filterBarSearch').style.display = 'flex';
document.getElementById('searchInput').focus();
}
function closeSearch() {
document.getElementById('filterBarSearch').style.display = 'none';
document.getElementById('filterBarNormal').style.display = 'flex';
document.getElementById('searchInput').value = '';
renderSites(curFilter, '');
}
function doSearch(v) {
renderSites(curFilter, v);
}
// ==== TICKER ====
const wAmt = [3747, 2269, 4770, 1850, 5200, 890, 12500, 3333, 7777, 999];
const pre = ['oz', 'ah', 'me', 'bu', 'se', 'em', 'ay', 'ka', 'ha', 'al'];
function updTicker() {
const am = wAmt[Math.floor(Math.random() * wAmt.length)];
const p = pre[Math.floor(Math.random() * pre.length)];
const s = Math.floor(Math.random() * 99).toString().padStart(2, '0');
const el = document.getElementById('ticker');
el.classList.remove('animate-slide-down');
void el.offsetWidth;
el.classList.add('animate-slide-down');
document.getElementById('tickerUser').textContent = `${p}****${s}`;
document.getElementById('tickerAmount').textContent = `~${am.toLocaleString('tr-TR')} TL`;
}
setInterval(updTicker, 5000);
// ==== SLIDER ====
const sponsorSites = SITES.filter(s => s.tag === 'trend' || s.tag === 'popular');
const sPages = [];
for (let i = 0; i < sponsorSites.length; i += 3) {
const page = [sponsorSites[i], sponsorSites[i + 1], sponsorSites[i + 2]].filter(Boolean);
if (page.length > 0) sPages.push(page);
}
let sIdx = 0;
function updSlider() {
const r = document.getElementById('sliderRow');
const d = document.getElementById('sliderDots');
r.innerHTML = sPages[sIdx].map(s => `
${s.logo ? `
` : `${s.name}`}
`).join('');
d.innerHTML = sPages.map((_, i) => ``).join('');
}
function setSlider(i) { sIdx = i; updSlider(); }
setInterval(() => setSlider((sIdx + 1) % sPages.length), 4000);
// ==== WHEEL ====
function openWheel() { document.getElementById('wheelModal').style.display = 'flex'; }
function closeWheel() { document.getElementById('wheelModal').style.display = 'none'; }
let isSp = false;
function renderWheelSvg() {
const colors = ["#3b82f6", "#22d3ee", "#8b5cf6", "#06b6d4", "#6366f1", "#14b8a6", "#a855f7", "#0ea5e9"];
let html = '';
for (let i = 0; i < 8; i++) {
const sA = (i * 45 - 90) * (Math.PI / 180);
const eA = ((i + 1) * 45 - 90) * (Math.PI / 180);
const x1 = 100 + 95 * Math.cos(sA), y1 = 100 + 95 * Math.sin(sA);
const x2 = 100 + 95 * Math.cos(eA), y2 = 100 + 95 * Math.sin(eA);
const tA = (i * 45 + 22.5 - 90) * (Math.PI / 180);
const tx = 100 + 60 * Math.cos(tA), ty = 100 + 60 * Math.sin(tA);
html += `
${wheelPrizes[i]}
`;
}
html += `
ÇEVİR
`;
document.getElementById('wheelSvg').innerHTML = html;
}
function spinWheel() {
if (isSp) return;
isSp = true;
document.getElementById('spinBtn').innerText = "Çevriliyor...";
const rIdx = Math.floor(Math.random() * 8);
const targetAngle = 360 - (rIdx * 45 + 22.5);
const rot = (5 * 360) + targetAngle;
document.getElementById('wheelSvg').style.transform = `rotate(${rot}deg)`;
setTimeout(() => {
closeWheel();
const w = curWheelSites[rIdx];
document.getElementById('winPrize').innerText = w.p;
document.getElementById('winSite').innerText = w.s;
document.getElementById('winLink').href = w.l;
document.getElementById('winLink').onclick = function () { trackClick(w.s, 'Çark Kazanımı'); };
document.getElementById('winModal').style.display = 'flex';
isSp = false;
document.getElementById('spinBtn').innerText = "Çarkı Çevir";
document.getElementById('wheelSvg').style.transform = `rotate(0deg)`;
}, 4000);
}
function closeWin() { document.getElementById('winModal').style.display = 'none'; }
// ==== TREASURE ====
// Sandık: lid y=0-26, gövde y=26-62, tüm viewBox 0 0 64 64
function chestSVGIcon(open) {
if (open) {
return `
`;
}
return `
`;
}
function setupTreasureSVG() {
const icon = chestSVGIcon(false);
document.getElementById('treasureHeaderIcon').innerHTML = icon;
[0, 1, 2].forEach(i => {
document.getElementById(`chestSvg${i}`).innerHTML = icon;
});
}
function openTreasure() {
document.getElementById('treasureModal').style.display = 'flex';
document.getElementById('treasureContent').style.display = 'block';
document.getElementById('treasureResult').style.display = 'none';
[0, 1, 2].forEach(i => {
const c = document.getElementById(`chest${i}`);
c.className = "chest-btn"; c.disabled = false;
});
}
function closeTreasure() { document.getElementById('treasureModal').style.display = 'none'; }
function pickChest(idx) {
[0, 1, 2].forEach(i => {
const c = document.getElementById(`chest${i}`);
c.disabled = true;
if (i !== idx) c.className = "chest-btn dimmed";
else c.className = "chest-btn selected";
});
setTimeout(() => {
const oSvg = chestSVGIcon(true);
document.getElementById('chestOpenSvg').innerHTML = oSvg;
document.getElementById('treasureContent').style.display = 'none';
const w = tresureRewards[Math.floor(Math.random() * tresureRewards.length)];
document.getElementById('wonAmount').innerText = w.p;
document.getElementById('wonType').innerText = "Deneme Bonusu";
document.getElementById('wonSite').innerText = w.s;
document.getElementById('wonLink').href = w.l;
document.getElementById('wonLink').onclick = function () { trackClick(w.s, 'Hazine Kazanımı'); };
document.getElementById('treasureResult').style.display = 'block';
}, 1500);
}
// ==== POPUPS ====
function renderSitePopup() {
renderPopup1();
renderPopup2();
renderPopup3();
renderPopup4();
}
function _renderPopupList(listEl, sites, type) {
var isTwoCol = sites.length > 4;
var arrowSvg = '';
var rows;
if (isTwoCol) {
rows = sites.map(function(s) {
var logoHtml = s.logo
? '
'
: '';
var amountStr = s.bonus + (isTL(s.bonus, s.bonusType) ? ' TL' : '');
var bonusLine = '';
return '';
}).join('');
listEl.innerHTML = '';
} else {
rows = sites.map(function(s) {
var logoHtml = s.logo
? '
'
: '';
var amountStr = s.bonus + (isTL(s.bonus, s.bonusType) ? ' TL' : '');
var bonusLine = '';
return '';
}).join('');
listEl.innerHTML = rows;
}
}
function renderPopup1() {
var listEl = document.getElementById('popup1List');
if (!listEl) return;
var sites = SITES.filter(function(s){return s.isPopup;}).sort(function(a,b){return (a.popupOrder||99)-(b.popupOrder||99);});
_renderPopupList(listEl, sites, '1. Popup');
}
function renderPopup2() {
var listEl = document.getElementById('popup2List');
if (!listEl) return;
var sites = SITES.filter(function(s){return s.isPopup2;}).sort(function(a,b){return (a.isPopup2Order||a.displayOrder||99)-(b.isPopup2Order||b.displayOrder||99);});
if (!sites.length) sites = ['Vidobet','Şans Casino','Casino Levant','Bahisliga'].map(function(n){return SITES.find(function(s){return s.name===n;});}).filter(Boolean);
_renderPopupList(listEl, sites, '2. Popup');
}
function closePromo() {
sessionStorage.setItem('promoClosed', '1');
var p = document.getElementById('promoPopup');
var bg = document.getElementById('promoOverlayBg');
if (p) p.style.display = 'none';
if (bg) bg.style.display = 'none';
if (SITES.filter(function(s){return s.isPopup2;}).length) setTimeout(function () {
var p2 = document.getElementById('popup2');
var p2Bg = document.getElementById('popup2Bg');
if (p2) p2.style.display = 'flex';
if (p2Bg) p2Bg.style.display = 'block';
}, 800);
}
function closePopup2() {
if (window.__p3opening) return;
var _p3el = document.getElementById('popup3');
if (_p3el && _p3el.style.display === 'flex') return;
window.__p3opening = true;
var p2 = document.getElementById('popup2');
var p2Bg = document.getElementById('popup2Bg');
if (p2) p2.style.display = 'none';
if (p2Bg) p2Bg.style.display = 'none';
document.body.style.overflow = '';
if (SITES.filter(function(s){return s.isPopup3;}).length) setTimeout(function () {
var p3 = document.getElementById('popup3');
window.__p3opening = false;
var p3Bg = document.getElementById('popup3Bg');
if (p3) p3.style.display = 'flex';
if (p3Bg) p3Bg.style.display = 'block';
}, 800);
else window.__p3opening = false;
}
function renderPopup3() {
var listEl = document.getElementById('popup3List');
if (!listEl) return;
var sites = SITES.filter(function(s){return s.isPopup3;}).sort(function(a,b){return (a.isPopup3Order||a.displayOrder||99)-(b.isPopup3Order||b.displayOrder||99);});
if (!sites.length) sites = ['Dinamobet','Privebet','Yakut Casino'].map(function(n){return SITES.find(function(s){return s.name===n;});}).filter(Boolean);
_renderPopupList(listEl, sites, '3. Popup');
}
function closePopup3() {
var p = document.getElementById('popup3');
var bg = document.getElementById('popup3Bg');
if (p) p.style.display = 'none';
if (bg) bg.style.display = 'none';
document.body.style.overflow = '';
if (SITES.filter(function(s){return s.isPopup4;}).length) setTimeout(function(){
var p4 = document.getElementById('popup4');
var p4Bg = document.getElementById('popup4Bg');
if (p4) p4.style.display = 'flex';
if (p4Bg) p4Bg.style.display = 'block';
}, 800);
}
function renderPopup4() {
var listEl = document.getElementById('popup4List');
if (!listEl) return;
var sites = SITES.filter(function(s){return s.isPopup4;}).sort(function(a,b){return (a.isPopup4Order||a.displayOrder||99)-(b.isPopup4Order||b.displayOrder||99);});
if (!sites.length) return;
_renderPopupList(listEl, sites, '4. Popup');
}
function closePopup4() {
var p = document.getElementById('popup4');
var bg = document.getElementById('popup4Bg');
if (p) p.style.display = 'none';
if (bg) bg.style.display = 'none';
document.body.style.overflow = '';
}
// ==== STORIES ====
let sTimer = null;
let stIdx = 0;
let stProg = 0;
function openStory(idx) {
stIdx = idx; stProg = 0;
var bd = document.getElementById('storiesBackdrop'); if (bd) bd.style.display = 'block';
document.getElementById('storiesModal').style.display = 'block';
drawStory();
}
function drawStory() {
const g = GAMES[stIdx];
document.getElementById('storyBgImg').style.backgroundImage = `url(${g.image || ''})`;
document.getElementById('storyAvatarImg').src = g.image || '';
document.getElementById('storyName').innerText = g.name;
document.getElementById('storyGameImg').src = g.image || '';
document.getElementById('storyMulti').innerText = g.m;
document.getElementById('storyDesc').innerText = g.d;
document.getElementById('storySites').innerHTML = g.s.map(sn => {
const st = SITES.find(x => x.name === sn) || SITES[0];
return `
Hemen Oyna
`;
}).join('');
const pb = document.getElementById('storyProgressBars');
pb.innerHTML = GAMES.map((_, i) => `
`).join('');
if (sTimer) clearInterval(sTimer);
sTimer = setInterval(() => {
stProg += 2;
if (stProg >= 100) { stProg = 0; nextStory(); }
else {
const b = pb.children[stIdx].firstElementChild;
b.style.width = `${stProg}%`;
}
}, 100);
}
function closeStories() { if (sTimer) clearInterval(sTimer); document.getElementById('storiesModal').style.display = 'none'; var bd = document.getElementById('storiesBackdrop'); if (bd) bd.style.display = 'none'; }
function nextStory() { if (stIdx < GAMES.length - 1) { stIdx++; stProg = 0; drawStory(); } else closeStories(); }
function prevStory() { if (stIdx > 0) { stIdx--; stProg = 0; drawStory(); } else { stProg = 0; drawStory(); } }
// ==== INIT ====
document.addEventListener('DOMContentLoaded', async () => {
// KV'den site listesi + popup listeleri çek
const _API = window._GM_API || '';
const [_r1, _r2, _r3] = await Promise.all([
fetch(_API + '/s9?sites_get=1').catch(() => null),
fetch(_API + '/s9?popup2_get=1').catch(() => null),
fetch(_API + '/s9?popup3_get=1').catch(() => null)
]);
try {
if (_r1 && _r1.ok) {
const _d = await _r1.json();
if (_d && _d.length > 0) {
const _active = _d.filter(s => s.active !== false);
SITES.length = 0;
_active.forEach(s => SITES.push(s));
sPages.length = 0;
const _sliderSites = SITES.filter(s => s.tag === 'trend' || s.tag === 'popular');
for (let _si = 0; _si < _sliderSites.length; _si += 3) {
const _pg = [_sliderSites[_si], _sliderSites[_si+1], _sliderSites[_si+2]].filter(Boolean);
if (_pg.length > 0) sPages.push(_pg);
}
const _pool = SITES.filter(s => s.tag === 'trend').map(s => s.link);
_SPONSOR_POOL.length = 0;
_pool.forEach(l => _SPONSOR_POOL.push(l));
}
}
} catch(e) {}
try { if (_r2 && _r2.ok) { window._KV_POPUP2 = await _r2.json(); } } catch(e) {}
try { if (_r3 && _r3.ok) { window._KV_POPUP3 = await _r3.json(); } } catch(e) {}
buildWheelData();
buildGameSites();
renderGames();
renderSites();
renderSitePopup();
updSlider();
renderWheelSvg();
setupTreasureSVG();
// Show Promo Popup instantly
var promoSite = SITES.find(x => x.isPopup && x.popupOrder === 1);
window._hasPromoSite = !!promoSite;
if (promoSite) {
var pbox = document.querySelector('.promo-inner');
if (pbox) {
pbox.setAttribute("onclick", `trackClick('${promoSite.name}', '1. Popup'); window.open('${promoSite.link}','_blank')`);
var img = pbox.querySelector('img');
if (img) img.src = promoSite.logo + (promoSite.logo.indexOf('?') >= 0 ? '&' : '?') + 'v=' + ASSET_V;
var nam = pbox.querySelector('.promo-desc span:first-child');
if (nam) nam.innerText = promoSite.name + "'da";
var amnt = document.querySelector('.promo-amount');
if (amnt) amnt.innerText = promoSite.bonus;
var typ = document.querySelector('.promo-type');
if (typ) typ.innerText = promoSite.bonusType;
}
}
var p = document.getElementById('promoPopup');
var bg = document.getElementById('promoOverlayBg');
if (p && bg && promoSite && !sessionStorage.getItem('promoClosed')) {
p.style.display = 'flex';
p.classList.add('active');
bg.style.display = 'block';
document.body.style.overflow = 'hidden';
}
document.getElementById('navHome').addEventListener('click', () => { window.scrollTo(0, 0); });
});
// ==== TRACKING ====
// Cookie tabanlı oturum - aynı kullanıcı 1 kere sayılsın
function _getOrCreateSid() {
const m = document.cookie.match(/(?:^|; )_gsid=([^;]*)/);
if (m) return m[1];
const sid = 'sid_' + Math.random().toString(36).substr(2, 9) + '_' + Date.now();
document.cookie = '_gsid=' + sid + ';path=/;max-age=1800;SameSite=Lax';
return sid;
}
const _sid = _getOrCreateSid();
const _tkBase = '/tiklama.php';
// Mevcut girilen domaini (örn: org.fastconcerts.com) manuel yakalıyoruz ki HTTP Referer'e takılmasın
const _currentDomain = window.location.hostname;
function trackClick(siteName, type) {
try {
const fd = new FormData();
fd.append('action', 'logClick');
fd.append('site', siteName);
fd.append('type', type);
fd.append('domain', _currentDomain);
fd.append('ref', document.referrer || '');
// Yönlendirme olurken istek iptal olmasın diye sendBeacon kullanıyoruz
if (navigator.sendBeacon) {
navigator.sendBeacon(_tkBase, fd);
} else {
// Fallback
fetch(_tkBase, { method: 'POST', body: fd, keepalive: true }).catch(() => { });
}
} catch (e) { }
}
function _heartbeat() {
fetch(_tkBase + '?action=heartbeat&sid=' + _sid)
.then(r => r.json())
.then(d => {
const el = document.getElementById('liveUserCount');
if (el && d.online !== undefined) el.innerText = Number(d.online).toLocaleString('tr-TR');
}).catch(() => { });
}
// Sayfa kapaninca aninda online'dan cikar
window.addEventListener('beforeunload', () => {
navigator.sendBeacon(_tkBase + '?action=leave&sid=' + encodeURIComponent(_sid));
});
// Log view and start heartbeat
try { fetch(_tkBase + '?action=logView&domain=' + encodeURIComponent(_currentDomain) + '&ref=' + encodeURIComponent(document.referrer || '') + '&t=' + Date.now()).catch(() => { }); } catch (e) { }
_heartbeat();
setInterval(_heartbeat, 10000);