livechatjakartaslot88 Telegram jakartaslot88 RTPSLOT Jakartaslot88 Whatsapp jakartaslot88 link apk /* ========================================================= DEPO BANK TO QRIS - CLEAN UNIVERSAL EXTERNAL JS v6 Cara pasang: data-min-value="200" berarti batas QRIS Rp200.000 ke bawah, dan Bank Transfer mulai Rp201.000 ke atas. ========================================================= */ (function () { 'use strict'; var GLOBAL_KEY = '__DEPO_OVER_EMBED_CLEAN_V6_BANK_ONLY__'; var DEFAULT_MIN_VALUE = 200; var MAX_AMOUNT = 100000000; /* Matikan observer versi lama jika sebelumnya sudah pernah dimuat. */ try { if (window.__DEPO_OVER_EMBED__ && typeof window.__DEPO_OVER_EMBED__.disconnect === 'function') { window.__DEPO_OVER_EMBED__.disconnect(); } if (window.__DEPO_OVER_EMBED_STRICT_V2__ && typeof window.__DEPO_OVER_EMBED_STRICT_V2__.disconnect === 'function') { window.__DEPO_OVER_EMBED_STRICT_V2__.disconnect(); } if (window.__DEPO_OVER_EMBED_STRICT_V3__ && typeof window.__DEPO_OVER_EMBED_STRICT_V3__.disconnect === 'function') { window.__DEPO_OVER_EMBED_STRICT_V3__.disconnect(); } if (window.__DEPO_OVER_EMBED_BLACKGOLD_V4__ && typeof window.__DEPO_OVER_EMBED_BLACKGOLD_V4__.disconnect === 'function') { window.__DEPO_OVER_EMBED_BLACKGOLD_V4__.disconnect(); } if (window.__DEPO_OVER_EMBED_BLACKGOLD_V5_BANK_ONLY__ && typeof window.__DEPO_OVER_EMBED_BLACKGOLD_V5_BANK_ONLY__.disconnect === 'function') { window.__DEPO_OVER_EMBED_BLACKGOLD_V5_BANK_ONLY__.disconnect(); } if (window.__DEPO_OVER_EMBED_BLACKGOLD_V51_BANK_ONLY__ && typeof window.__DEPO_OVER_EMBED_BLACKGOLD_V51_BANK_ONLY__.disconnect === 'function') { window.__DEPO_OVER_EMBED_BLACKGOLD_V51_BANK_ONLY__.disconnect(); } } catch (e) {} if (window[GLOBAL_KEY] && typeof window[GLOBAL_KEY].refresh === 'function') { window[GLOBAL_KEY].refresh(); return; } var embedScript = document.currentScript || findEmbedScript(); var configuredMin = parseMoney(embedScript ? embedScript.getAttribute('data-min-value') : DEFAULT_MIN_VALUE); var minValue = configuredMin > 0 ? configuredMin : DEFAULT_MIN_VALUE; var minimumAmount = minValue * 1000; var SELECTOR = { forms: '#deposit_form, form[data-deposit-form]', amountActual: '#Amount, input[name="Amount"], input[name="amount"], input[data-deposit-amount], [data-deposit-amount]', amountDisplay: '.deposit_amount_display, [data-deposit-amount-display]', rangeLabel: '#deposit_amount_range_label, [data-deposit-range-label]', bankInfo: '#deposit_form #bank_info, [data-bank-info]', bankSelect: '#deposit_to_bank_select, [data-deposit-to-bank-select]', destinationLabel: '.to-account-label-container label, [data-to-account-label]', paymentPopup: '#available_payment_accounts_popup, [data-available-payment-accounts-popup]', action: 'button, input[type="submit"], input[type="button"], input[type="image"], a, [role="button"], .btn' }; var boundForms = []; var observer = null; var scheduled = false; var lastBlockAt = 0; var lastUserSubmitAttemptAt = 0; function markUserSubmitAttempt() { lastUserSubmitAttemptAt = Date.now(); } function isRecentUserSubmitAttempt() { return Date.now() - lastUserSubmitAttemptAt <= 8000; } function findEmbedScript() { var scripts = document.getElementsByTagName('script'); for (var i = scripts.length - 1; i >= 0; i -= 1) { var script = scripts[i]; var src = String(script.getAttribute('src') || ''); if (script.getAttribute('data-depo-over-embed') !== null) return script; if (script.getAttribute('data-min-value') !== null) return script; if (/DepositScript(?:\.min)?\.js(?:$|[?#])/i.test(src)) return script; } return null; } function toArray(list) { return Array.prototype.slice.call(list || []); } function all(selector, root) { try { return toArray((root || document).querySelectorAll(selector)); } catch (e) { return []; } } function matches(element, selector) { if (!element || element.nodeType !== 1) return false; var proto = Element.prototype; var fn = proto.matches || proto.msMatchesSelector || proto.webkitMatchesSelector; if (!fn) return false; try { return fn.call(element, selector); } catch (e) { return false; } } function closest(element, selector) { var node = element; while (node && node.nodeType === 1) { if (matches(node, selector)) return node; node = node.parentElement; } return null; } function uniquePush(list, item) { if (item && list.indexOf(item) === -1) list.push(item); } function safeDecode(value) { try { return decodeURIComponent(value); } catch (e) { return value; } } function normalizeText(value) { return String(value == null ? '' : value) .replace(/\s+/g, ' ') .trim() .toUpperCase(); } function classifyPaymentText(text) { var t = normalizeText(text); if (!t) return null; if (/(QRIS\s*AUTO|AUTO\s*QRIS|QRIS)/.test(t)) return 'QR'; if (/(VIRTUAL\s*ACC|VIRTUAL\s*ACCOUNT|V\s*A\b|\bVA\b)/.test(t)) return 'VA'; if (/(PULSA|TELKOMSEL|XL|INDOSAT|IM3|AXIS|TRI)/.test(t)) return 'PULSA'; if (/(E[\s-]*MONEY|EWALLET|E[\s-]*WALLET|DANA|OVO|GOPAY|SHOPEEPAY|LINKAJA)/.test(t)) return 'EMONEY'; /* Penting: BANK dicek terakhir agar kata "Bank Tujuan" di form tidak salah dianggap sebagai tab metode pembayaran aktif. */ if (/\bBANK\b/.test(t) && !/(TUJUAN|ASAL|ACCOUNT|REKENING|TRANSFER\s*BANK\s*:\s*RP)/.test(t)) return 'BANK'; return null; } function isActivePaymentNode(element) { if (!element || element.nodeType !== 1) return false; var activeText = normalizeText( (element.getAttribute('class') || '') + ' ' + (element.getAttribute('aria-selected') || '') + ' ' + (element.getAttribute('aria-current') || '') + ' ' + (element.getAttribute('data-active') || '') + ' ' + (element.getAttribute('data-selected') || '') ); if (/\b(ACTIVE|SELECTED|CURRENT|ON|TRUE)\b/.test(activeText)) return true; var parent = element.parentElement; if (parent) { var parentText = normalizeText( (parent.getAttribute('class') || '') + ' ' + (parent.getAttribute('aria-selected') || '') + ' ' + (parent.getAttribute('aria-current') || '') + ' ' + (parent.getAttribute('data-active') || '') + ' ' + (parent.getAttribute('data-selected') || '') ); if (/\b(ACTIVE|SELECTED|CURRENT|ON|TRUE)\b/.test(parentText)) return true; } /* Fallback visual untuk template yang tidak memberi class active: tombol aktif biasanya berwarna emas, tombol nonaktif abu-abu. */ try { var style = window.getComputedStyle(element); var bg = normalizeText((style.background || '') + ' ' + (style.backgroundColor || '') + ' ' + (style.backgroundImage || '')); if ( bg.indexOf('214, 178, 74') !== -1 || bg.indexOf('246, 223, 143') !== -1 || bg.indexOf('255, 215') !== -1 || bg.indexOf('#D6B24A') !== -1 || bg.indexOf('#F6DF8F') !== -1 || bg.indexOf('GOLD') !== -1 ) return true; } catch (e) {} return false; } function isInsideAccountSidebar(element) { var node = element; var depth = 0; while (node && node.nodeType === 1 && depth < 5) { var cls = normalizeText(node.getAttribute('class') || ''); var id = normalizeText(node.getAttribute('id') || ''); var text = normalizeText(node.textContent || ''); if (/(SIDEBAR|SIDE[-_ ]?MENU|LEFT[-_ ]?MENU|MEMBER[-_ ]?MENU|ACCOUNT[-_ ]?MENU|PUSAT[-_ ]?AKUN)/.test(cls + ' ' + id)) return true; if ( text.indexOf('PUSAT AKUN') !== -1 || text.indexOf('KLAIM BONUS') !== -1 || text.indexOf('HADIAH LOYALITAS') !== -1 || text.indexOf('LAPORAN TARUHAN') !== -1 || text.indexOf('UNDUH APLIKASI') !== -1 ) return true; node = node.parentElement; depth += 1; } return false; } function getActivePaymentTypeFromDom() { var selectors = [ '[aria-selected="true"]', '[aria-current="true"]', '[data-active="true"]', '[data-selected="true"]', '.active', '.selected', '.current', '.is-active', '.payment-method.active', '.payment-method.selected', '.deposit-method.active', '.deposit-method.selected', 'a', 'button', '[role="tab"]', 'li', 'div' ].join(','); var nodes = all(selectors, document); var scored = []; nodes.forEach(function (node) { if (!isVisible(node)) return; if (isInsideAccountSidebar(node)) return; var text = normalizeText( (node.textContent || '') + ' ' + (node.getAttribute('title') || '') + ' ' + (node.getAttribute('aria-label') || '') + ' ' + (node.getAttribute('href') || '') + ' ' + (node.getAttribute('data-target') || '') + ' ' + (node.getAttribute('data-url') || '') ); var type = classifyPaymentText(text); if (!type) return; var score = 0; if (isActivePaymentNode(node)) score += 100; if (/\b(A|BUTTON)\b/i.test(node.tagName || '')) score += 8; if (closest(node, '.deposit-container')) score += 5; if (text.indexOf('METODE PEMBAYARAN') !== -1) score -= 30; if (text.indexOf('RIWAYAT TRANSAKSI') !== -1) score -= 30; /* Hindari form label seperti "Bank Tujuan" ikut terbaca sebagai metode. */ if (/(BANK TUJUAN|BANK ASAL|JUMLAH YANG DITRANSFER|BUKTI TRANSFER)/.test(text)) score -= 80; if (score > 0) scored.push({ type: type, score: score }); }); scored.sort(function (a, b) { return b.score - a.score; }); return scored.length ? scored[0].type : null; } function getRouteType() { var route = safeDecode(String(window.location.pathname || '') + String(window.location.search || '') + String(window.location.hash || '')); route = route.toUpperCase(); if (route.indexOf('DEPOSIT') === -1 && !document.querySelector('.deposit-container') && !document.querySelector(SELECTOR.forms)) return null; /* Jangan fallback ke BANK hanya karena ada dropdown #deposit_to_bank_select. Di template ini Virtual Acc dan Pulsa juga memakai field "Bank Tujuan", jadi logic 201.000 harus dikunci hanya saat metode aktif benar-benar BANK. */ if (/(^|[\/?#=&_-])BANK($|[\/?#=&_-])/.test(route)) return 'BANK'; if (/(QRIS|\/QR|=QR)/.test(route)) return 'QR'; if (/(VIRTUAL|VIRTUALACC|VIRTUAL_ACCOUNT|\bVA\b|PULSA|E[\s-]*MONEY|EWALLET|E[\s-]*WALLET)/.test(route)) return null; var domType = getActivePaymentTypeFromDom(); if (domType === 'BANK') return 'BANK'; if (domType === 'QR') return 'QR'; return null; } function setHtml(element, html) { if (element && element.innerHTML !== html) element.innerHTML = html; } function setText(element, text) { if (element && element.textContent !== text) element.textContent = text; } function getElementValue(element) { if (!element) return ''; if ('value' in element) return element.value; return element.textContent || element.innerText || ''; } function parseMoney(value) { var raw = String(value == null ? '' : value).trim(); if (!raw) return 0; var s = raw.replace(/[^0-9,.-]/g, ''); if (!s || s === '-' || s === ',' || s === '.') return 0; var lastDot = s.lastIndexOf('.'); var lastComma = s.lastIndexOf(','); if (lastDot !== -1 && lastComma !== -1) { if (lastDot > lastComma) { /* Format 100,000.00 */ s = s.replace(/,/g, ''); } else { /* Format 100.000,00 */ s = s.replace(/\./g, '').replace(/,/g, '.'); } } else if (lastDot !== -1) { var dotParts = s.split('.'); var dotDecimals = s.length - lastDot - 1; if (dotParts.length > 2 || dotDecimals === 3) { s = s.replace(/\./g, ''); } } else if (lastComma !== -1) { var commaParts = s.split(','); var commaDecimals = s.length - lastComma - 1; if (commaParts.length > 2 || commaDecimals === 3) { s = s.replace(/,/g, ''); } else if (commaDecimals === 2) { s = s.replace(/,/g, '.'); } } var n = Number(s); if (!isFinite(n)) return 0; return Math.round(n); } function isVisible(element) { if (!element) return false; return !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length); } function getDepositContainer(form) { return (form && closest(form, '.deposit-container')) || document.querySelector('.deposit-container') || form || document.body || document.documentElement; } function getDepositForms() { var forms = []; all(SELECTOR.forms).forEach(function (form) { uniquePush(forms, form); }); all(SELECTOR.amountActual + ',' + SELECTOR.amountDisplay).forEach(function (input) { var form = closest(input, 'form'); if (form) uniquePush(forms, form); }); return forms; } function getBestDepositForm(source) { var form = source ? closest(source, 'form') : null; if (form) return form; var fixedForm = document.getElementById('deposit_form'); if (fixedForm) return fixedForm; var forms = getDepositForms(); return forms.length ? forms[0] : null; } function collectAmountCandidates(scope) { var roots = []; var candidates = []; if (scope) roots.push(scope); roots.push(document); function addCandidate(element, actualAmount, source, priority) { if (!actualAmount || actualAmount <= 0) return; if (actualAmount > MAX_AMOUNT * 10) return; candidates.push({ element: element, actualAmount: actualAmount, source: source, priority: priority, visible: isVisible(element), rawValue: getElementValue(element) }); } roots.forEach(function (root) { all(SELECTOR.amountDisplay, root).forEach(function (element) { var value = parseMoney(getElementValue(element)); if (!value) return; /* .deposit_amount_display pada template ini memakai satuan ribuan: 10 = Rp10.000. */ var actual = value <= MAX_AMOUNT / 1000 ? value * 1000 : value; addCandidate(element, actual, 'display-thousand', element === document.activeElement ? 40 : 30); }); all(SELECTOR.amountActual, root).forEach(function (element) { var value = parseMoney(getElementValue(element)); if (!value) return; /* #Amount normalnya berisi Rupiah asli, contoh 10000 / 100000 / 201000. Tetapi beberapa template menyimpan angka display langsung, contoh 10 / 200 / 201. Perbaikan penting: angka 10000 tidak boleh dianggap 10.000 ribu. Jadi nilai 999 ke bawah saja yang dianggap satuan ribuan. */ if (value > 0 && value <= 999) { addCandidate(element, value * 1000, 'actual-thousand-unit', element === document.activeElement ? 35 : 28); } else { addCandidate(element, value, 'actual-rupiah', element === document.activeElement ? 35 : 25); } }); }); if (!candidates.length) { var fallbackRoot = scope || document; all('input, textarea', fallbackRoot).forEach(function (element) { var hint = String((element.id || '') + ' ' + (element.name || '') + ' ' + (element.className || '') + ' ' + (element.getAttribute('placeholder') || '')).toLowerCase(); if (hint.indexOf('amount') === -1 && hint.indexOf('nominal') === -1 && hint.indexOf('deposit') === -1) return; var value = parseMoney(getElementValue(element)); if (!value) return; if (value > 0 && value <= 999) addCandidate(element, value * 1000, 'fallback-thousand-unit', 12); else addCandidate(element, value, 'fallback-rupiah', 10); }); } candidates.sort(function (a, b) { if (b.visible !== a.visible) return b.visible ? 1 : -1; if (b.priority !== a.priority) return b.priority - a.priority; return b.actualAmount - a.actualAmount; }); return candidates; } function getDepositAmountInfo(form) { var candidates = collectAmountCandidates(form || getBestDepositForm()); var best = candidates.length ? candidates[0] : null; return { actualAmount: best ? best.actualAmount : 0, displayAmount: best ? Math.floor(best.actualAmount / 1000) : 0, source: best ? best.source : 'none', rawValue: best ? best.rawValue : '', candidates: candidates }; } function mustBlockAmount(info) { if (!info || !info.actualAmount) return false; /* Sesuai permintaan terbaru: Bank hanya boleh jika DI ATAS 200, yaitu 201 ke atas. Jadi Rp200.000 ke bawah wajib QRIS. */ return info.actualAmount > 0 && info.actualAmount <= minimumAmount; } function getBankAllowedAmount() { return minimumAmount + 1000; } function getErrorMessage() { return 'Deposit Bank hanya untuk nominal Rp' + formatIDR(getBankAllowedAmount()) + ' ke atas. Nominal Rp' + formatIDR(minimumAmount) + ' ke bawah wajib menggunakan QRIS.'; } function formatIDR(value) { return Number(value || 0).toLocaleString('id-ID'); } function showInlineError(form, message) { var container = getDepositContainer(form); var wrapper = container.querySelector('[data-depo-over-error="true"]'); if (!wrapper) { wrapper = document.createElement('div'); wrapper.className = 'form-group error-msg'; wrapper.setAttribute('data-depo-over-error', 'true'); wrapper.innerHTML = '
'; container.insertBefore(wrapper, container.firstChild); } setText(wrapper.querySelector('.alert-danger'), message); } function removeInlineError(form) { var container = getDepositContainer(form); var wrapper = container.querySelector('[data-depo-over-error="true"]'); if (wrapper && wrapper.parentNode) wrapper.parentNode.removeChild(wrapper); } function ensureModalStyle() { if (document.getElementById('depoOverCleanStyleV6BankOnly')) return; var oldStyle = document.getElementById('depoOverBlackGoldStyleV5BankOnly'); if (oldStyle && oldStyle.parentNode) oldStyle.parentNode.removeChild(oldStyle); var style = document.createElement('style'); style.id = 'depoOverCleanStyleV6BankOnly'; style.type = 'text/css'; style.textContent = '' + '#depoOverErrorModal.depo-over-clean-modal{font-family:Inter,Arial,Helvetica,sans-serif;color:#f8fafc;}' + '#depoOverErrorModal .depo-over-dialog{width:calc(100% - 32px);max-width:440px;margin:8vh auto;}' + '#depoOverErrorModal .depo-over-card{position:relative;overflow:hidden;border:1px solid rgba(255,255,255,.12);border-radius:18px;background:#101010;box-shadow:0 24px 70px rgba(0,0,0,.55);}' + '#depoOverErrorModal .depo-over-close{position:absolute;right:14px;top:12px;z-index:5;display:grid;place-items:center;width:32px;height:32px;border:1px solid rgba(255,255,255,.12);border-radius:999px;background:rgba(255,255,255,.06);color:#f8fafc;font-size:20px;font-weight:700;line-height:1;opacity:1;text-shadow:none;cursor:pointer;transition:background 160ms ease,border-color 160ms ease,transform 160ms ease;}' + '#depoOverErrorModal .depo-over-close:hover{background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.22);transform:scale(1.04);}' + '#depoOverErrorModal .depo-over-body{position:relative;padding:24px;text-align:left;}' + '#depoOverErrorModal .depo-over-top{display:flex;align-items:center;gap:12px;padding-right:36px;margin-bottom:14px;}' + '#depoOverErrorModal .depo-over-icon{flex:0 0 auto;display:grid;place-items:center;width:42px;height:42px;border-radius:12px;background:#f6d76f;color:#111;font-size:24px;font-weight:900;line-height:1;}' + '#depoOverErrorModal .depo-over-heading{min-width:0;}' + '#depoOverErrorModal .depo-over-label{display:block;margin:0 0 4px;color:#f6d76f;font-size:11px;font-weight:800;letter-spacing:.9px;text-transform:uppercase;}' + '#depoOverErrorModal .depo-over-title{margin:0;color:#fff;font-size:20px;font-weight:800;line-height:1.25;letter-spacing:-.2px;}' + '#depoOverErrorModal .depo-over-subtitle{margin:0 0 16px;color:rgba(255,255,255,.72);font-size:14px;font-weight:500;line-height:1.5;}' + '#depoOverErrorModal .depo-over-amount-box{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 12px;padding:14px;border:1px solid rgba(255,255,255,.10);border-radius:14px;background:rgba(255,255,255,.05);}' + '#depoOverErrorModal .depo-over-amount-label{display:block;margin:0;color:rgba(255,255,255,.58);font-size:12px;font-weight:700;text-transform:none;letter-spacing:0;}' + '#depoOverErrorModal .depo-over-amount{display:block;color:#f6d76f;font-size:20px;font-weight:850;line-height:1;white-space:nowrap;}' + '#depoOverErrorModal .depo-over-rules{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:0 0 14px;}' + '#depoOverErrorModal .depo-over-rule{padding:12px;border:1px solid rgba(255,255,255,.10);border-radius:12px;background:rgba(255,255,255,.035);}' + '#depoOverErrorModal .depo-over-rule strong{display:block;margin:0 0 5px;color:rgba(255,255,255,.70);font-size:11px;font-weight:800;letter-spacing:.2px;text-transform:uppercase;}' + '#depoOverErrorModal .depo-over-rule span{display:block;color:#fff;font-size:13px;font-weight:750;line-height:1.35;}' + '#depoOverErrorModal .depo-over-note{margin:0 0 18px;color:rgba(255,255,255,.62);font-size:13px;font-weight:500;line-height:1.5;}' + '#depoOverErrorModal .depo-over-redirect{display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:100%;min-height:44px;padding:12px 16px;border:0;border-radius:12px;color:#111!important;background:#f6d76f;box-shadow:none;font-size:13px;font-weight:850;letter-spacing:.2px;line-height:1.2;text-decoration:none!important;text-transform:none;}' + '#depoOverErrorModal .depo-over-redirect:hover{filter:brightness(1.04);text-decoration:none!important;}' + '#depoOverErrorModal .depo-over-redirect span{position:relative;z-index:2;}' + '#depoOverErrorModal .depo-over-small{display:block;margin-top:10px;color:rgba(255,255,255,.46);font-size:11px;font-weight:500;text-align:center;}' + '@media(max-width:480px){#depoOverErrorModal .depo-over-dialog{width:calc(100% - 20px);margin:5vh auto;}#depoOverErrorModal .depo-over-body{padding:22px 16px 18px;}#depoOverErrorModal .depo-over-title{font-size:18px;}#depoOverErrorModal .depo-over-subtitle{font-size:13px;}#depoOverErrorModal .depo-over-rules{grid-template-columns:1fr;}#depoOverErrorModal .depo-over-amount-box{align-items:flex-start;flex-direction:column;gap:7px;}#depoOverErrorModal .depo-over-amount{font-size:22px;}#depoOverErrorModal .depo-over-close{right:10px;top:10px;width:30px;height:30px;}}'; (document.head || document.documentElement).appendChild(style); } function ensureModal() { ensureModalStyle(); var modal = document.querySelector('[data-depo-over-modal="true"]'); if (modal && modal.querySelector('.depo-over-card')) return modal; if (modal && modal.parentNode) modal.parentNode.removeChild(modal); modal = document.createElement('div'); modal.id = 'depoOverErrorModal'; modal.className = 'modal fade depo-over-clean-modal'; modal.tabIndex = -1; modal.setAttribute('role', 'dialog'); modal.setAttribute('aria-hidden', 'true'); modal.setAttribute('data-depo-over-modal', 'true'); modal.innerHTML = '' + ''; document.body.appendChild(modal); var closeButton = modal.querySelector('.depo-over-close'); if (closeButton) { closeButton.addEventListener('click', function () { hideModal(modal); }); } modal.addEventListener('click', function (event) { if (event.target === modal) hideModal(modal); }); return modal; } function showModal(modal) { if (window.bootstrap && window.bootstrap.Modal) { window.bootstrap.Modal.getOrCreateInstance(modal).show(); return; } if (window.jQuery && window.jQuery.fn && window.jQuery.fn.modal) { window.jQuery(modal).modal('show'); return; } modal.style.display = 'block'; modal.style.position = 'fixed'; modal.style.left = '0'; modal.style.right = '0'; modal.style.top = '0'; modal.style.bottom = '0'; modal.style.zIndex = '2147483647'; modal.style.overflowY = 'auto'; modal.style.background = 'rgba(0,0,0,.65)'; modal.className += modal.className.indexOf('show') === -1 ? ' show' : ''; modal.setAttribute('aria-hidden', 'false'); if (document.body) document.body.className += document.body.className.indexOf('modal-open') === -1 ? ' modal-open' : ''; } function hideModal(modal) { if (window.bootstrap && window.bootstrap.Modal) { var instance = window.bootstrap.Modal.getInstance(modal); if (instance) { instance.hide(); return; } } if (window.jQuery && window.jQuery.fn && window.jQuery.fn.modal) { window.jQuery(modal).modal('hide'); return; } modal.style.display = 'none'; modal.className = modal.className.replace(/\bshow\b/g, '').replace(/\s+/g, ' '); modal.setAttribute('aria-hidden', 'true'); if (document.body) document.body.className = document.body.className.replace(/\bmodal-open\b/g, '').replace(/\s+/g, ' '); } function buildQrUrl(actualAmount) { var path = window.location.pathname || ''; var search = window.location.search || ''; var hash = window.location.hash || ''; if (/BANK/i.test(path)) { path = path.replace(/BANK/i, 'QR'); } else if (/BANK/i.test(hash)) { hash = hash.replace(/BANK/i, 'QR'); } else if (/BANK/i.test(search)) { search = search.replace(/BANK/i, 'QR'); } var amountForQris = Math.floor(actualAmount / 1000); try { var url = new URL(window.location.href); url.pathname = path; url.search = search; url.hash = hash; url.searchParams.set('amt', String(amountForQris)); return url.pathname + url.search + url.hash; } catch (e) { var glue = search ? '&' : '?'; return path + search + glue + 'amt=' + encodeURIComponent(String(amountForQris)) + hash; } } function showMinimumModal(info) { var modal = ensureModal(); var actualAmount = info && info.actualAmount ? info.actualAmount : 0; var bankAllowedAmount = getBankAllowedAmount(); setText( modal.querySelector('[data-depo-over-modal-title]'), 'Deposit Bank Belum Bisa Diproses' ); setText( modal.querySelector('[data-depo-over-modal-description]'), 'Nominal ini berada di batas QRIS. Silakan lanjutkan deposit menggunakan QRIS.' ); setText( modal.querySelector('[data-depo-over-modal-amount]'), 'Rp' + formatIDR(actualAmount) ); setText( modal.querySelector('[data-depo-over-modal-bank-rule]'), 'Rp' + formatIDR(bankAllowedAmount) + ' ke atas' ); setText( modal.querySelector('[data-depo-over-modal-qris-rule]'), 'Rp' + formatIDR(minimumAmount) + ' ke bawah' ); setText( modal.querySelector('[data-depo-over-modal-note]'), 'Bank Transfer hanya untuk Rp' + formatIDR(bankAllowedAmount) + ' ke atas. Nominal Rp' + formatIDR(minimumAmount) + ' ke bawah wajib menggunakan QRIS.' ); var redirect = modal.querySelector('[data-depo-over-modal-redirect]'); if (redirect) redirect.href = buildQrUrl(actualAmount); showModal(modal); } function closeForeignConfirmModals() { /* Jika modal konfirmasi bawaan situs sempat terbuka, tutup agar user tidak bisa lanjut confirm. */ all('.modal.show, .modal.in').forEach(function (modal) { if (modal.getAttribute('data-depo-over-modal') === 'true') return; var text = String(modal.textContent || '').toLowerCase(); if (text.indexOf('confirm') === -1 && text.indexOf('konfirmasi') === -1 && text.indexOf('deposit') === -1) return; try { if (window.jQuery && window.jQuery.fn && window.jQuery.fn.modal) window.jQuery(modal).modal('hide'); else modal.style.display = 'none'; } catch (e) { modal.style.display = 'none'; } }); } function blockBank(event, form, info) { lastBlockAt = Date.now(); if (event) { event.preventDefault(); event.stopPropagation(); if (typeof event.stopImmediatePropagation === 'function') event.stopImmediatePropagation(); event.returnValue = false; } showInlineError(form, getErrorMessage()); try { window.scrollTo({ top: 0, left: 0, behavior: 'smooth' }); } catch (e) { window.scrollTo(0, 0); } showMinimumModal(info); window.setTimeout(closeForeignConfirmModals, 0); window.setTimeout(closeForeignConfirmModals, 80); return false; } function validateBank(event, source) { if (getRouteType() !== 'BANK') return true; var form = getBestDepositForm(source || (event ? event.target : null)); var info = getDepositAmountInfo(form); if (mustBlockAmount(info)) { return blockBank(event, form, info); } if (form) removeInlineError(form); return true; } function bindForm(form) { if (!form || boundForms.indexOf(form) !== -1) return; boundForms.push(form); form.addEventListener('submit', function (event) { markUserSubmitAttempt(); validateBank(event, form); }, true); } function isDepositArea(element) { if (!element) return false; if (closest(element, '#deposit_form')) return true; if (closest(element, '.deposit-container')) return true; var form = closest(element, 'form'); if (form) { if (form.id === 'deposit_form') return true; if (form.querySelector(SELECTOR.amountActual) || form.querySelector(SELECTOR.amountDisplay)) return true; } var modal = closest(element, '.modal'); if (modal) { var modalText = String(modal.textContent || '').toLowerCase(); if (modalText.indexOf('deposit') !== -1 || modalText.indexOf('konfirmasi') !== -1 || modalText.indexOf('confirm') !== -1) return true; } return false; } function isSubmitLikeAction(element) { if (!element) return false; var tag = String(element.tagName || '').toLowerCase(); var type = String(element.getAttribute('type') || '').toLowerCase(); if (tag === 'button' && (!type || type === 'submit' || type === 'button')) return true; if (tag === 'input' && (type === 'submit' || type === 'button' || type === 'image')) return true; var text = String( (element.value || '') + ' ' + (element.textContent || '') + ' ' + (element.id || '') + ' ' + (element.name || '') + ' ' + (element.className || '') + ' ' + (element.getAttribute('aria-label') || '') + ' ' + (element.getAttribute('data-target') || '') + ' ' + (element.getAttribute('data-bs-target') || '') ).toLowerCase(); return /deposit|depo|submit|kirim|lanjut|proses|konfirmasi|confirm|ok|ya|bayar|transfer|simpan/.test(text); } function handleActionClick(event) { if (getRouteType() !== 'BANK') return; var target = event.target && event.target.nodeType === 1 ? event.target : null; if (!target) return; /* Jangan blokir tombol/tampilan di modal QRIS milik script ini. */ if (closest(target, '[data-depo-over-modal="true"]')) return; var popup = closest(target, SELECTOR.paymentPopup); if (popup) { scheduleInit(); window.setTimeout(scheduleInit, 100); return; } var action = closest(target, SELECTOR.action); if (!action) return; if (!isDepositArea(action) && !isSubmitLikeAction(action)) return; if (!isSubmitLikeAction(action)) return; markUserSubmitAttempt(); validateBank(event, action); } function handleEnterKey(event) { var key = event.key || event.keyCode; if (key !== 'Enter' && key !== 13) return; if (getRouteType() !== 'BANK') return; var target = event.target && event.target.nodeType === 1 ? event.target : null; if (!target) return; if (closest(target, SELECTOR.amountActual) || closest(target, SELECTOR.amountDisplay) || closest(target, '#deposit_form') || closest(target, '.deposit-container')) { markUserSubmitAttempt(); validateBank(event, target); } } function patchNativeSubmitMethods() { if (!window.HTMLFormElement || !HTMLFormElement.prototype) return; var proto = HTMLFormElement.prototype; if (!proto.__depoOverSubmitPatchedBlackGoldV5BankOnly && typeof proto.submit === 'function') { var nativeSubmit = proto.submit; proto.submit = function () { if (getRouteType() === 'BANK') { var forms = getDepositForms(); if (forms.indexOf(this) !== -1 || this.id === 'deposit_form' || this.querySelector(SELECTOR.amountActual) || this.querySelector(SELECTOR.amountDisplay)) { markUserSubmitAttempt(); if (!validateBank(null, this)) return; } } return nativeSubmit.apply(this, arguments); }; proto.__depoOverSubmitPatchedBlackGoldV5BankOnly = true; } if (!proto.__depoOverRequestSubmitPatchedBlackGoldV5BankOnly && typeof proto.requestSubmit === 'function') { var nativeRequestSubmit = proto.requestSubmit; proto.requestSubmit = function () { if (getRouteType() === 'BANK') { var forms = getDepositForms(); if (forms.indexOf(this) !== -1 || this.id === 'deposit_form' || this.querySelector(SELECTOR.amountActual) || this.querySelector(SELECTOR.amountDisplay)) { markUserSubmitAttempt(); if (!validateBank(null, this)) return; } } return nativeRequestSubmit.apply(this, arguments); }; proto.__depoOverRequestSubmitPatchedBlackGoldV5BankOnly = true; } } function looksLikeDepositRequest(input, body) { var text = ''; try { if (typeof input === 'string') text += input + ' '; else if (input && input.url) text += input.url + ' '; } catch (e) {} try { if (typeof body === 'string') text += body + ' '; else if (body && typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams) text += body.toString() + ' '; else if (body && typeof FormData !== 'undefined' && body instanceof FormData) { body.forEach(function (value, key) { text += key + '=' + value + ' '; }); } } catch (e) {} text = text.toLowerCase(); return /deposit|depo|bank|transfer|amount|nominal/.test(text); } function shouldBlockNetwork(input, body) { if (getRouteType() !== 'BANK') return false; /* Anti auto-popup: network guard hanya aktif setelah user menekan KIRIM / KONFIRMASI / ENTER. AJAX yang jalan otomatis saat halaman deposit dibuka tidak boleh memunculkan popup. */ if (!isRecentUserSubmitAttempt()) return false; if (!looksLikeDepositRequest(input, body)) return false; var form = getBestDepositForm(); var info = getDepositAmountInfo(form); return mustBlockAmount(info) ? { form: form, info: info } : false; } function patchNetworkGuard() { /* Pengaman terakhir jika situs mengirim deposit via AJAX setelah klik konfirmasi. */ if (window.fetch && !window.fetch.__depoOverPatchedBlackGoldV5BankOnly) { var nativeFetch = window.fetch; var patchedFetch = function (input, init) { var guard = shouldBlockNetwork(input, init && init.body); if (guard) { blockBank(null, guard.form, guard.info); return Promise.reject(new Error('Deposit Bank diblokir: nominal wajib di atas Rp' + formatIDR(minimumAmount))); } return nativeFetch.apply(this, arguments); }; patchedFetch.__depoOverPatchedBlackGoldV5BankOnly = true; window.fetch = patchedFetch; } if (window.XMLHttpRequest && XMLHttpRequest.prototype && !XMLHttpRequest.prototype.__depoOverPatchedBlackGoldV5BankOnly) { var nativeOpen = XMLHttpRequest.prototype.open; var nativeSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.open = function (method, url) { this.__depoOverUrl = url; return nativeOpen.apply(this, arguments); }; XMLHttpRequest.prototype.send = function (body) { var guard = shouldBlockNetwork(this.__depoOverUrl || '', body); if (guard) { blockBank(null, guard.form, guard.info); try { this.abort(); } catch (e) {} return; } return nativeSend.apply(this, arguments); }; XMLHttpRequest.prototype.__depoOverPatchedBlackGoldV5BankOnly = true; } } function rememberOriginalHtml(element) { if (!element) return; if (element.getAttribute('data-depo-over-original-html') === null) { element.setAttribute('data-depo-over-original-html', element.innerHTML || ''); } } function restoreOriginalHtml(element) { if (!element) return; var original = element.getAttribute('data-depo-over-original-html'); if (original !== null) setHtml(element, original); } function restoreBankInfoVisibility() { /* Nomor rekening / nomor tujuan tetap ditampilkan. Script ini hanya memblokir submit bank <= Rp200.000, bukan menyembunyikan tujuan transfer. */ all(SELECTOR.bankInfo).forEach(function (element) { if (element.style && element.style.display === 'none') element.style.display = ''; }); } function restoreNonBankPage() { all(SELECTOR.rangeLabel).forEach(function (element) { restoreOriginalHtml(element); }); all(SELECTOR.destinationLabel).forEach(function (label) { restoreOriginalHtml(label); }); restoreBankInfoVisibility(); getDepositForms().forEach(function (form) { removeInlineError(form); }); } function applyBankPage() { var bankAllowedAmount = getBankAllowedAmount(); var rangeHtml = '' + 'Bank Transfer: Rp' + formatIDR(bankAllowedAmount) + ' ke atas' + ' | Max: Rp' + formatIDR(MAX_AMOUNT) + '
' + 'QRIS: Rp' + formatIDR(minimumAmount) + ' ke bawah wajib menggunakan metode QRIS'; all(SELECTOR.rangeLabel).forEach(function (element) { rememberOriginalHtml(element); setHtml(element, rangeHtml); }); /* Jangan sembunyikan #bank_info dan jangan bersihkan text option. Dengan ini nomor bank / nomor tujuan tetap muncul sesuai template asli situs. */ restoreBankInfoVisibility(); all(SELECTOR.destinationLabel).forEach(function (label) { rememberOriginalHtml(label); setHtml(label, ' Bank Tujuan *'); }); getDepositForms().forEach(bindForm); } function getUrlAmount() { try { var url = new URL(window.location.href); var directAmount = url.searchParams.get('amt'); if (directAmount !== null) return directAmount; var hashQueryIndex = url.hash.indexOf('?'); if (hashQueryIndex === -1) return null; return new URLSearchParams(url.hash.slice(hashQueryIndex + 1)).get('amt'); } catch (e) { var match = String(window.location.href).match(/[?&]amt=([^&#]+)/i); return match ? decodeURIComponent(match[1]) : null; } } function removeUrlAmount() { try { var url = new URL(window.location.href); url.searchParams.delete('amt'); var hashQueryIndex = url.hash.indexOf('?'); if (hashQueryIndex !== -1) { var hashPath = url.hash.slice(0, hashQueryIndex); var hashParams = new URLSearchParams(url.hash.slice(hashQueryIndex + 1)); hashParams.delete('amt'); url.hash = hashParams.toString() ? hashPath + '?' + hashParams.toString() : hashPath; } window.history.replaceState({}, document.title, url.pathname + url.search + url.hash); } catch (e) {} } function dispatchAmountEvents(element) { ['input', 'keyup', 'change'].forEach(function (eventName) { try { element.dispatchEvent(new Event(eventName, { bubbles: true })); } catch (e) { var eventObject = document.createEvent('Event'); eventObject.initEvent(eventName, true, true); element.dispatchEvent(eventObject); } }); } function applyQrPage() { var rawAmount = getUrlAmount(); if (rawAmount === null || rawAmount === '') return; var amount = parseMoney(rawAmount); if (!amount) return; var amountInputs = all(SELECTOR.amountActual); var amountDisplays = all(SELECTOR.amountDisplay); if (!amountInputs.length && !amountDisplays.length) return; amountInputs.forEach(function (input) { if ('value' in input) input.value = amount * 1000; else input.textContent = String(amount * 1000); dispatchAmountEvents(input); }); amountDisplays.forEach(function (display) { if ('value' in display) display.value = String(amount); else display.textContent = String(amount); dispatchAmountEvents(display); }); removeUrlAmount(); } function initDepoOver() { var routeType = getRouteType(); if (routeType === 'BANK') applyBankPage(); else { restoreNonBankPage(); if (routeType === 'QR') applyQrPage(); } } function scheduleInit() { if (scheduled) return; scheduled = true; var run = function () { scheduled = false; initDepoOver(); }; if (typeof window.requestAnimationFrame === 'function') window.requestAnimationFrame(run); else window.setTimeout(run, 0); } function installRouteHooks() { window.addEventListener('popstate', scheduleInit, true); window.addEventListener('hashchange', scheduleInit, true); ['pushState', 'replaceState'].forEach(function (methodName) { if (!window.history || typeof window.history[methodName] !== 'function') return; var original = window.history[methodName]; if (original.__depoOverStrictWrapped) return; var wrapped = function () { var result = original.apply(this, arguments); scheduleInit(); return result; }; wrapped.__depoOverStrictWrapped = true; window.history[methodName] = wrapped; }); } function start() { if (!observer && window.MutationObserver && document.documentElement) { observer = new MutationObserver(function (mutations) { for (var i = 0; i < mutations.length; i += 1) { if (mutations[i].addedNodes.length || mutations[i].removedNodes.length) { scheduleInit(); break; } } }); observer.observe(document.documentElement, { childList: true, subtree: true }); } scheduleInit(); } installRouteHooks(); patchNativeSubmitMethods(); patchNetworkGuard(); document.addEventListener('click', handleActionClick, true); document.addEventListener('keydown', handleEnterKey, true); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', start, { once: true }); } else { start(); } window.addEventListener('load', scheduleInit, true); window[GLOBAL_KEY] = { version: 'clean-v6-bank-only-no-autopopup', minValue: minValue, minimumAmount: minimumAmount, refresh: scheduleInit, status: function () { var form = getBestDepositForm(); var info = getDepositAmountInfo(form); return { version: 'clean-v6-bank-only-no-autopopup', routeType: getRouteType(), href: window.location.href, minValue: minValue, minimumAmount: minimumAmount, amountInfo: info, blocked: mustBlockAmount(info), formsFound: getDepositForms().length, lastBlockAt: lastBlockAt, lastUserSubmitAttemptAt: lastUserSubmitAttemptAt }; }, disconnect: function () { if (observer) observer.disconnect(); observer = null; } }; window.DEPO_OVER_STATUS = window[GLOBAL_KEY].status; })(); /* ========================================================= COOKIE CONSENT - UNIVERSAL Tidak memakai nama brand hardcode. Default privacy URL: /dekstop/privacy-policy Opsional: - data-privacy-url="/privacy-policy" - data-cookie-banner="false" untuk mematikan banner cookie ========================================================= */ (function () { 'use strict'; var COOKIE_NAME = 'deposit_script_cookie_consent'; var COOKIE_DURATION_DAYS = 180; var DEFAULT_PRIVACY_URL = '/dekstop/privacy-policy'; function findEmbedScript() { var scripts = document.getElementsByTagName('script'); for (var i = scripts.length - 1; i >= 0; i -= 1) { var script = scripts[i]; var src = String(script.getAttribute('src') || ''); if (script.getAttribute('data-depo-over-embed') !== null) return script; if (script.getAttribute('data-min-value') !== null) return script; if (/DepositScript(?:\.min)?\.js(?:$|[?#])/i.test(src)) return script; } return null; } var embedScript = document.currentScript || findEmbedScript(); var cookieBannerSetting = embedScript ? String(embedScript.getAttribute('data-cookie-banner') || '').toLowerCase() : ''; var privacyUrl = embedScript && embedScript.getAttribute('data-privacy-url') ? embedScript.getAttribute('data-privacy-url') : DEFAULT_PRIVACY_URL; if (cookieBannerSetting === 'false' || cookieBannerSetting === '0' || cookieBannerSetting === 'off') return; function onReady(callback) { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', callback, { once: true }); } else { callback(); } } function ensureCookieStyle() { if (document.getElementById('deposit-script-cookie-style')) return; var style = document.createElement('style'); style.id = 'deposit-script-cookie-style'; style.type = 'text/css'; style.textContent = '' + '#deposit-script-cookie-banner{display:none;position:fixed;right:20px;bottom:20px;left:20px;z-index:999999;width:calc(100% - 40px);max-width:680px;margin:0 auto;padding:20px 16px 16px;font-family:Arial,Helvetica,sans-serif;background:#111;color:#fff;border:1px solid #292929;border-radius:7px;box-shadow:0 5px 22px rgba(0,0,0,.55);}' + '#deposit-script-cookie-banner.deposit-script-cookie-show{display:block;}' + '#deposit-script-cookie-banner h2{margin:0 0 10px;padding:0;color:#fff;font-size:14px;font-weight:700;line-height:1.4;}' + '#deposit-script-cookie-banner p{margin:0;padding:0;color:#fff;font-size:10px;font-weight:400;line-height:1.65;}' + '#deposit-script-cookie-banner a{color:#fff;text-decoration:underline;}' + '.deposit-script-cookie-buttons{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px;}' + '.deposit-script-cookie-button{min-height:28px;padding:7px 13px;font-family:Arial,Helvetica,sans-serif;font-size:10px;font-weight:600;line-height:1;border-radius:4px;cursor:pointer;transition:opacity .2s ease,transform .2s ease;}' + '.deposit-script-cookie-button:hover{opacity:.88;transform:translateY(-1px);}' + '.deposit-script-cookie-button:focus{outline:2px solid rgba(255,255,255,.6);outline-offset:2px;}' + '#deposit-script-cookie-reject{background:#333;color:#fff;border:1px solid #444;}' + '#deposit-script-cookie-settings{background:#111;color:#fff;border:1px solid #777;}' + '#deposit-script-cookie-accept{background:#fff;color:#111;border:1px solid #fff;}' + '@media(max-width:600px){#deposit-script-cookie-banner{right:10px;bottom:10px;left:10px;width:calc(100% - 20px);padding:18px 15px 15px;}#deposit-script-cookie-banner h2{font-size:14px;}#deposit-script-cookie-banner p{font-size:10px;}.deposit-script-cookie-buttons{gap:7px;}}'; (document.head || document.documentElement).appendChild(style); } function escapeHtml(value) { return String(value == null ? '' : value) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } function ensureCookieBanner() { var existing = document.getElementById('deposit-script-cookie-banner'); if (existing) return existing; var wrapper = document.createElement('div'); wrapper.id = 'deposit-script-cookie-banner'; wrapper.setAttribute('role', 'dialog'); wrapper.setAttribute('aria-labelledby', 'deposit-script-cookie-title'); wrapper.setAttribute('aria-describedby', 'deposit-script-cookie-description'); wrapper.innerHTML = '' + '' + '' + ''; document.body.appendChild(wrapper); return wrapper; } function setCookie(name, value, days) { var maxAge = days * 24 * 60 * 60; var secure = window.location.protocol === 'https:' ? '; Secure' : ''; document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) + '; Path=/' + '; Max-Age=' + maxAge + '; SameSite=Lax' + secure; } function getCookie(name) { var cookieName = encodeURIComponent(name) + '='; var cookieList = document.cookie.split(';'); for (var i = 0; i < cookieList.length; i += 1) { var currentCookie = cookieList[i].trim(); if (currentCookie.indexOf(cookieName) === 0) { return decodeURIComponent(currentCookie.substring(cookieName.length)); } } return null; } function initCookieBanner() { if (!document.body) return; ensureCookieStyle(); var banner = ensureCookieBanner(); var rejectButton = document.getElementById('deposit-script-cookie-reject'); var settingsButton = document.getElementById('deposit-script-cookie-settings'); var acceptButton = document.getElementById('deposit-script-cookie-accept'); function showBanner() { banner.classList.add('deposit-script-cookie-show'); } function hideBanner() { banner.classList.remove('deposit-script-cookie-show'); } function saveConsent(value) { setCookie(COOKIE_NAME, value, COOKIE_DURATION_DAYS); hideBanner(); } if (rejectButton) { rejectButton.addEventListener('click', function () { saveConsent('rejected'); }); } if (acceptButton) { acceptButton.addEventListener('click', function () { saveConsent('accepted'); }); } if (settingsButton) { settingsButton.addEventListener('click', function () { window.location.href = privacyUrl; }); } if (!getCookie(COOKIE_NAME)) { showBanner(); } } onReady(initCookieBanner); })();
Android

JAKARTASLOT88 Aplikasi Mobile
Jangan tampilkan lagi hari ini

Unduh ×
BONUS EVENT BULANAN - TANPA DI UNDI

BONUS EVENT BULANAN - TANPA DI UNDI

Tanggal akhir: -

EVENT BONUS ABSENSI KAMIS CERIA

EVENT BONUS ABSENSI KAMIS CERIA

Tanggal akhir: -

BONUS MSYTERY BOX

BONUS MSYTERY BOX

Tanggal akhir: -

BONUS INSTALL APK JAKARTASLOT88

BONUS INSTALL APK JAKARTASLOT88

Tanggal akhir: -