function showModalDetailKamar() { const modal = document.getElementById("modalDetailKamar"); modal.style.display = "block"; // Show the modal } function closeModalDetailKamar() { const modal = document.getElementById("modalDetailKamar"); modal.style.display = "none"; // Close the modal } window.onclick = function(event) { const modal = document.getElementById("modalDetailKamar"); if (event.target === modal) { closeModalDetailKamar(); // Close modal if clicked outside } } function showModalDetailKamar() { // Your logic to show modal for room details const modal = document.getElementById("modalDetailKamar"); modal.style.display = "block"; // Assuming modal visibility is controlled by display style }

Daftar Kamar Kost

Tersedia Ekonomis
232
Rp 650.000/bulan
Tanpa fasilitas
Tersedia Standar
225
Rp 750.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Standar
226
Rp 750.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Standar
227
Rp 750.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Standar
228
Rp 750.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Standar
233
Rp 750.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Standar
234
Rp 750.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Standar
236
Rp 750.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Standar
334
Rp 750.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Standar
335
Rp 750.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Standar
336
Rp 750.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Standar
337
Rp 750.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Standar
338
Rp 750.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Standar
339
Rp 750.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Standar
341
Rp 750.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Standar
330
Rp 800.000/bulan
Kipas, Kasur, Lemari, Kursi, Meja
Tersedia Premium
133
Rp 1.000.000/bulan
AC, Kasur, Lemari, Kursi, Meja
Tersedia Premium
224
Rp 1.000.000/bulan
AC, Kasur, Lemari, Kursi, Meja
Tersedia Premium
230
Rp 1.000.000/bulan
AC, Kasur, Lemari, Kursi, Meja
Tersedia Premium
235
Rp 1.000.000/bulan
AC, Kasur, Lemari, Kursi, Meja
Tersedia Premium
238
Rp 1.000.000/bulan
AC, Kasur, Lemari, Kursi, Meja
Tersedia Premium
239
Rp 1.000.000/bulan
AC, Kasur, Lemari, Kursi, Meja
Tersedia Premium
340
Rp 1.000.000/bulan
AC, Kasur, Lemari, Kursi, Meja
Tersedia Premium
342
Rp 1.000.000/bulan
AC, Kasur, Lemari, Kursi, Meja
Tersedia Premium
114
Rp 1.200.000/bulan
AC, Kasur, Lemari, Kursi, Meja
Tersedia Premium
240
Rp 1.300.000/bulan
AC, Kasur, Lemari, Kursi, Meja
function showModalDetailKamar() { const modal = document.getElementById("modalDetailKamar"); modal.style.display = "block"; // Show the modal } function closeModalDetailKamar() { const modal = document.getElementById("modalDetailKamar"); modal.style.display = "none"; // Close the modal } window.onclick = function(event) { const modal = document.getElementById("modalDetailKamar"); if (event.target === modal) { closeModalDetailKamar(); // Close modal if clicked outside } } var kamarData = null; var pemesananState = { tanggal_mulai: null, jumlah_penyewa: 1, durasi_bulan: '', anggota: [], // setiap elemen: {nama, umur, nik, no_wa, no_wali, no_plat, pekerjaan, jenis_kelamin, hubungan} akun: {} // username, password }; // DETAIL kamar (tanpa foto di modal) function showModalDetailKamar(btn) { const card = btn.closest('.card-kamar'); kamarData = JSON.parse(card.getAttribute('data-kamar')); // ensure cluster present const cluster = kamarData.cluster || ''; document.getElementById('modalContent').innerHTML = ` `; new bootstrap.Modal(document.getElementById('modalKamar')).show(); } function showFormTanggalMulai() { const today = new Date().toISOString().split('T')[0]; const pre = pemesananState.tanggal_mulai ? pemesananState.tanggal_mulai : today; const html = ` `; document.getElementById('modalContent').innerHTML = html; document.getElementById('formTanggalMulai').onsubmit = function(e) { e.preventDefault(); pemesananState.tanggal_mulai = this.tanggal_mulai.value; showFormDataSewa(); }; } function showFormDataSewa() { // use saved state const tanggalMulai = pemesananState.tanggal_mulai || new Date().toISOString().split('T')[0]; const jumlah = pemesananState.jumlah_penyewa || 1; const durasi = pemesananState.durasi_bulan || ''; const durasiOpsi = ``; const html = ` `; document.getElementById('modalContent').innerHTML = html; // set selected durasi if present (after innerHTML) if (durasi) { const sel = document.querySelector('#modalContent select[name="durasi_bulan"]'); if (sel) sel.value = durasi; } const jumlahInput = document.getElementById('jumlah_penyewa'); jumlahInput.addEventListener('input', () => { if (+jumlahInput.value > 4) { jumlahInput.value = 4; alert('Maksimum jumlah penyewa adalah 4 orang.'); } else if (+jumlahInput.value < 1) { jumlahInput.value = 1; } }); document.getElementById('formStep1').onsubmit = function(e) { e.preventDefault(); const jumlahVal = parseInt(this.jumlah_penyewa.value); const durasiVal = this.durasi_bulan.value; pemesananState.jumlah_penyewa = jumlahVal; pemesananState.durasi_bulan = durasiVal; showFormDataPenyewa(); } } function showFormDataPenyewa() { const jumlah = pemesananState.jumlah_penyewa || 1; const durasi = pemesananState.durasi_bulan || ''; const tanggalMulai = pemesananState.tanggal_mulai || new Date().toISOString().split('T')[0]; let htmlPenyewa = ''; for (let i = 1; i <= jumlah; i++) { const isKetua = (i === 1); const ag = pemesananState.anggota[i-1] || {}; htmlPenyewa += `
Data Penyewa #${i}${isKetua ? ' (Ketua)' : ''} ${isKetua ? `` : `` }

`; } const html = ` `; document.getElementById('modalContent').innerHTML = html; document.getElementById('formAnggota').onsubmit = function(e) { e.preventDefault(); // Ambil semua data anggota dan simpan ke state let ok = true, msg = ""; const namaList = document.getElementsByName('nama[]'); const umurList = document.getElementsByName('umur[]'); const nikList = document.getElementsByName('nik[]'); const no_waList = document.getElementsByName('no_wa[]'); const no_waliList = document.getElementsByName('no_wali[]'); const jkList = document.getElementsByName('jenis_kelamin[]'); const pekerjaanList = document.getElementsByName('pekerjaan[]'); const no_platList = document.getElementsByName('no_plat[]'); const hubunganList = document.getElementsByName('hubungan[]'); const anggotaArr = []; for (let i = 0; i < namaList.length; i++) { const isKetua = (i === 0); const nama = (namaList[i].value || '').trim(); const umur = (umurList[i].value || '').trim(); const nik = (nikList[i].value || '').trim(); const no_wa = (no_waList[i].value || '').trim(); const no_wali= no_waliList[i] ? (no_waliList[i].value || '').trim() : ""; const pekerjaan = pekerjaanList[i] ? (pekerjaanList[i].value || '').trim() : ''; const no_plat = no_platList[i] ? (no_platList[i].value || '').trim() : ''; const jk = (jkList[i].value || '').trim(); const hubungan = (hubunganList[i] ? (hubunganList[i].value || '').trim() : (isKetua ? 'Ketua' : '')); if (!/^([a-zA-Z\s\-]+)$/.test(nama)) { ok = false; msg = `Nama #${i+1} hanya huruf/spasi/-`; break; } if (!/^\d+$/.test(umur) || +umur < 1 || +umur > 120){ ok = false; msg = `Umur #${i+1} 1–120`; break; } if (isKetua && (+umur < 18)) { ok = false; msg = `Umur penyewa #1 (ketua) minimal 18 tahun`; break; } if (!(nik === '-' || /^\d+$/.test(nik))) { ok = false; msg = `NIK #${i+1} angka atau '-'`; break; } if (isKetua) { if (!/^\d{9,15}$/.test(no_wa)) { ok = false; msg = `No. WA penyewa 1 wajib diisi (9–15 digit)`; break; } } else { if (!(no_wa === '-' || /^\d+$/.test(no_wa))) { ok = false; msg = `No. WA #${i+1} angka atau '-'`; break; } } if (no_wali && !(no_wali === '-' || /^\d+$/.test(no_wali))) { ok = false; msg = `No. Wali #${i+1} angka atau '-'`; break; } if (!jk) { ok = false; msg = `Jenis Kelamin #${i+1} wajib`; break; } anggotaArr.push({ nama: nama, umur: umur, nik: nik, no_wa: no_wa, no_wali: no_wali, no_plat: no_plat, pekerjaan: pekerjaan, jenis_kelamin: jk, hubungan: hubungan }); } if (!ok) { alert(msg); return; } // simpan ke state pemesananState.anggota = anggotaArr; // lanjut ke pembuatan akun ketua showFormAkunKetua(); }; } function showFormAkunKetua() { const preUser = pemesananState.akun.username || ''; const html = ` `; document.getElementById('modalContent').innerHTML = html; document.getElementById('formKetua').onsubmit = function(e) { e.preventDefault(); // simpan akun di state const username = this.username.value.trim(); const password = this.password.value; pemesananState.akun = { username: username, password: password }; // bangun FormData lengkap dari state const fd = new FormData(); fd.append('tanggal_mulai', pemesananState.tanggal_mulai || ''); fd.append('durasi_bulan', pemesananState.durasi_bulan || ''); fd.append('jumlah_penyewa', pemesananState.jumlah_penyewa || 1); pemesananState.anggota.forEach(a => { fd.append('nama[]', a.nama); fd.append('umur[]', a.umur); fd.append('nik[]', a.nik); fd.append('no_wa[]', a.no_wa); fd.append('no_wali[]', a.no_wali); fd.append('no_plat[]', a.no_plat); fd.append('pekerjaan[]', a.pekerjaan); fd.append('jenis_kelamin[]', a.jenis_kelamin); fd.append('hubungan[]', a.hubungan); }); fd.append('username', pemesananState.akun.username); fd.append('password', pemesananState.akun.password); submitPemesananBaru(fd); }; } function submitPemesananBaru(formData) { formData.append('no_kamar', kamarData.nomor); function showModalDetailKamar() { const modal = document.getElementById("modalDetailKamar"); modal.style.display = "block"; // Show the modal } function closeModalDetailKamar() { const modal = document.getElementById("modalDetailKamar"); modal.style.display = "none"; // Close the modal } window.onclick = function(event) { const modal = document.getElementById("modalDetailKamar"); if (event.target === modal) { closeModalDetailKamar(); // Close modal if clicked outside } } (function(){ try { var inserted = false; var selectors = [ 'form[action*="proses_pemesanan.php"]', '#formPemesanan', '.form-pemesanan', '#form-booking', '#formBooking', 'form' ]; for (var i=0; i' + '
Maks 4MB. Format: JPG/PNG/PDF.
'; var submit = el.querySelector('button[type="submit"], input[type="submit"], .btn-submit'); if (submit && submit.parentNode) submit.parentNode.insertBefore(wrapper, submit); else el.appendChild(wrapper); inserted = true; } if (!inserted && !document.querySelector('#berkas')) { var fallback = document.createElement('div'); fallback.className = 'mb-3'; fallback.style.margin = '8px'; fallback.innerHTML = '' + '' + '
Maks 4MB. Format: JPG/PNG/PDF.
'; document.body.insertBefore(fallback, document.body.firstChild); } } catch(e) { console && console.error && console.error('Insert berkas input failed', e); } window.submitPemesananWithFile = async function(extraValues){ var fd = new FormData(); try { if (extraValues && typeof extraValues === 'object') { for (var k in extraValues) { if (!extraValues.hasOwnProperty(k)) continue; fd.append(k, extraValues[k]); } } else { var fileEl = document.getElementById('berkas'); var parentForm = fileEl ? fileEl.closest('form') : null; var scope = parentForm || document; var inputs = scope.querySelectorAll('input[name], select[name], textarea[name]'); inputs.forEach(function(inp){ if (!inp.name) return; if (inp.type === 'file') return; if ((inp.type === 'checkbox' || inp.type === 'radio') && !inp.checked) return; fd.append(inp.name, inp.value || ''); }); } var fileInput = document.getElementById('berkas'); if (!fileInput || !fileInput.files || fileInput.files.length === 0) { alert('Silakan pilih berkas KTP / Buku Nikah (wajib).'); return null; } fd.append('berkas', fileInput.files[0]); var resp = await submitPemesananWithFile(this) // patched, { method: 'POST', body: fd, credentials: 'same-origin' }); var txt = await resp.text(); var container = document.getElementById('content') || document.getElementById('mainContent') || document.body; container.innerHTML = txt; return txt; } catch (err) { alert('Gagal mengirim pemesanan: ' + err); console.error(err); return null; } }; })(); submitPemesananWithFile(); // reset pemesananState after success (optional) pemesananState = { tanggal_mulai: null, jumlah_penyewa: 1, durasi_bulan: '', anggota: [], akun: {} }; }) .catch(err => { alert('Terjadi kesalahan: ' + err); }); } // helper kecil untuk aman dari XSS pada konten text function escapeHtml(s) { return String(s||'').replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"'}[c])); }
Maks 4MB. Format: JPG/PNG/PDF.
function showModalDetailKamar() { const modal = document.getElementById("modalDetailKamar"); modal.style.display = "block"; // Show the modal } function closeModalDetailKamar() { const modal = document.getElementById("modalDetailKamar"); modal.style.display = "none"; // Close the modal } window.onclick = function(event) { const modal = document.getElementById("modalDetailKamar"); if (event.target === modal) { closeModalDetailKamar(); // Close modal if clicked outside } } if (typeof submitPemesananWithFile !== 'function') { function submitPemesananWithFile(formElem){ try { var form = formElem || document.querySelector('form[action*="proses_pemesanan.php"]') || document.querySelector('form'); if (!form) { alert('Form pemesanan tidak ditemukan'); return; } var fd = new FormData(form); var fileEl = form.querySelector('input[type="file"][name="berkas"]') || document.getElementById('berkas'); if (!fileEl || !fileEl.files || fileEl.files.length === 0) { alert('Silakan pilih berkas KTP / Buku Nikah (wajib).'); return; } if (!fd.has('berkas')) fd.append('berkas', fileEl.files[0]); fetch('proses_pemesanan.php', { method: 'POST', body: fd, credentials: 'same-origin' }) .then(function(resp){ return resp.text(); }) .then(function(txt){ var container = document.getElementById('modalDetailKamarBody') || document.getElementById('content') || document.body; try { container.innerHTML = txt; } catch(e) { alert(txt); } }) .catch(function(err){ alert('Terjadi kesalahan saat mengirim: ' + err); console.error(err); }); } catch(e){ console.error(e); alert('Gagal mengirim pemesanan.'); } } } function showModalDetailKamar() { const modal = document.getElementById("modalDetailKamar"); modal.style.display = "block"; // Show the modal } function closeModalDetailKamar() { const modal = document.getElementById("modalDetailKamar"); modal.style.display = "none"; // Close the modal } window.onclick = function(event) { const modal = document.getElementById("modalDetailKamar"); if (event.target === modal) { closeModalDetailKamar(); // Close modal if clicked outside } } function submitPemesananWithFile(form) { event.preventDefault(); const fd = new FormData(form); fetch('proses_pemesanan.php', { method: 'POST', body: fd }) .then(r => r.text()) .then(msg => { alert(msg); location.reload(); }) .catch(err => alert('Error: ' + err)); }