{"id":2290,"date":"2026-04-04T15:21:25","date_gmt":"2026-04-04T14:21:25","guid":{"rendered":"https:\/\/surabayasurveysolution.com\/index.php\/quotation-request\/"},"modified":"2026-04-12T03:54:49","modified_gmt":"2026-04-12T02:54:49","slug":"quotation-request","status":"publish","type":"page","link":"https:\/\/surabayasurveysolution.com\/index.php\/quotation-request\/","title":{"rendered":"Quotation Request"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2290\" class=\"elementor elementor-2290\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5985501 e-flex e-con-boxed e-con e-parent\" data-id=\"5985501\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1a8bc9a3 elementor-widget elementor-widget-text-editor\" data-id=\"1a8bc9a3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div id=\"tqs3s-app\" class=\"tqs3s-wrap\">\n<div class=\"tqs3s-card\">\n<h2>Quotation Request<\/h2>\n<p class=\"tqs3s-sub\">Isi data diri terlebih dahulu, lalu lanjut ke detail kebutuhan.<\/p>\n<div id=\"tqs3s-step1\">\n<div class=\"tqs3s-grid\">\n<div class=\"tqs3s-field\">\n                        <label>Kebutuhan<\/label><br \/>\n                        <select id=\"tqs3s-kebutuhan\"><option value=\"Jasa Survey\">Jasa Survey<\/option><option value=\"Rental Alat\">Rental Alat<\/option><\/select>\n                    <\/div>\n<div class=\"tqs3s-field\"><label>Email<\/label><input type=\"email\" id=\"tqs3s-email\" required><\/div>\n<div class=\"tqs3s-field\"><label>Nama<\/label><input type=\"text\" id=\"tqs3s-nama\" required><\/div>\n<div class=\"tqs3s-field\"><label>Nama PIC Proyek<\/label><input type=\"text\" id=\"tqs3s-nama-pic\" required><\/div>\n<div class=\"tqs3s-field\"><label>No. Telp PIC<\/label><input type=\"text\" id=\"tqs3s-no-telp-pic\" required><\/div>\n<div class=\"tqs3s-field\"><label>Asal Instansi\/Perusahaan<\/label><input type=\"text\" id=\"tqs3s-perusahaan\" required><\/div>\n<\/p><\/div>\n<div class=\"tqs3s-actions\">\n                    <button type=\"button\" id=\"tqs3s-next\" class=\"tqs3s-btn\">Next<\/button>\n                <\/div>\n<div id=\"tqs3s-step1-message\" class=\"tqs3s-message\"><\/div>\n<\/p><\/div>\n<div id=\"tqs3s-step2\" style=\"display:none;\">\n                <input type=\"hidden\" id=\"tqs3s-submission-id\" value=\"\"><\/p>\n<div id=\"tqs3s-step2-form-content\">\n<h3>Detail Jasa Survey<\/h3>\n<div class=\"tqs3s-grid\">\n<div class=\"tqs3s-field\">\n                        <label>Jenis Pekerjaan<\/label><br \/>\n                        <select id=\"tqs3s-jenis-pekerjaan\"><option value=\"\">Pilih<\/option><option value=\"Terestris\">Terestris<\/option><option value=\"Hidrografi\">Hidrografi<\/option><option value=\"Fotogrametri\">Fotogrametri<\/option><\/select>\n                    <\/div>\n<div class=\"tqs3s-field\">\n                        <label>Provinsi<\/label><br \/>\n                        <select id=\"tqs3s-provinsi\"><option value=\"\">Pilih<\/option><option value=\"Aceh\">Aceh<\/option><option value=\"Sumatera Utara\">Sumatera Utara<\/option><option value=\"Sumatera Barat\">Sumatera Barat<\/option><option value=\"Riau\">Riau<\/option><option value=\"Kepulauan Riau\">Kepulauan Riau<\/option><option value=\"Jambi\">Jambi<\/option><option value=\"Sumatera Selatan\">Sumatera Selatan<\/option><option value=\"Bengkulu\">Bengkulu<\/option><option value=\"Lampung\">Lampung<\/option><option value=\"Kepulauan Bangka Belitung\">Kepulauan Bangka Belitung<\/option><option value=\"DKI Jakarta\">DKI Jakarta<\/option><option value=\"Banten\">Banten<\/option><option value=\"Jawa Barat\">Jawa Barat<\/option><option value=\"Jawa Tengah\">Jawa Tengah<\/option><option value=\"DI Yogyakarta\">DI Yogyakarta<\/option><option value=\"Jawa Timur\">Jawa Timur<\/option><option value=\"Bali\">Bali<\/option><option value=\"Nusa Tenggara Barat\">Nusa Tenggara Barat<\/option><option value=\"Nusa Tenggara Timur\">Nusa Tenggara Timur<\/option><option value=\"Kalimantan Barat\">Kalimantan Barat<\/option><option value=\"Kalimantan Tengah\">Kalimantan Tengah<\/option><option value=\"Kalimantan Selatan\">Kalimantan Selatan<\/option><option value=\"Kalimantan Timur\">Kalimantan Timur<\/option><option value=\"Kalimantan Utara\">Kalimantan Utara<\/option><option value=\"Sulawesi Utara\">Sulawesi Utara<\/option><option value=\"Gorontalo\">Gorontalo<\/option><option value=\"Sulawesi Tengah\">Sulawesi Tengah<\/option><option value=\"Sulawesi Barat\">Sulawesi Barat<\/option><option value=\"Sulawesi Selatan\">Sulawesi Selatan<\/option><option value=\"Sulawesi Tenggara\">Sulawesi Tenggara<\/option><option value=\"Maluku\">Maluku<\/option><option value=\"Maluku Utara\">Maluku Utara<\/option><option value=\"Papua\">Papua<\/option><option value=\"Papua Barat\">Papua Barat<\/option><option value=\"Papua Selatan\">Papua Selatan<\/option><option value=\"Papua Tengah\">Papua Tengah<\/option><option value=\"Papua Pegunungan\">Papua Pegunungan<\/option><option value=\"Papua Barat Daya\">Papua Barat Daya<\/option><\/select>\n                    <\/div>\n<div class=\"tqs3s-field\">\n                        <label>Kabupaten\/Kota<\/label><br \/>\n                        <input type=\"text\" id=\"tqs3s-kabupaten-kota\" placeholder=\"Tulis kabupaten\/kota\">\n                    <\/div>\n<div class=\"tqs3s-field\">\n                        <label>Equipment \/ Alat Survey<\/label><br \/>\n                        <select id=\"tqs3s-equipment\"><option value=\"\">Pilih jenis pekerjaan dahulu<\/option><\/select>\n                    <\/div>\n<div class=\"tqs3s-field\">\n                        <label>Kualitas Data<\/label><br \/>\n                        <select id=\"tqs3s-kualitas\"><option value=\"\">Pilih<\/option><option value=\"Ekonomis\">Ekonomis<\/option><option value=\"Basic\">Basic<\/option><option value=\"Premium\">Premium<\/option><\/select>\n                    <\/div>\n<div class=\"tqs3s-field tqs3s-field-full\">\n                        <label>Deskripsi Kualitas Data<\/label><\/p>\n<div id=\"tqs3s-quality-desc\" class=\"tqs3s-note tqs3s-quality-desc-box\">Pilih jenis pekerjaan, equipment, dan kualitas data untuk melihat deskripsi.<\/div>\n<\/p><\/div>\n<div class=\"tqs3s-field\">\n                        <label id=\"tqs3s-quantity-label\">Luasan (ha)<\/label><br \/>\n                        <input type=\"number\" min=\"0.01\" step=\"0.01\" id=\"tqs3s-luasan\">\n                    <\/div>\n<div class=\"tqs3s-field\">\n                        <label>Target Pelaksanaan<\/label><br \/>\n                        <input type=\"date\" id=\"tqs3s-target\">\n                    <\/div>\n<div class=\"tqs3s-field tqs3s-field-full\">\n                        <label>Upload File (Opsional)<\/label><br \/>\n                        <input type=\"file\" id=\"tqs3s-file\" accept=\"application\/pdf\"><br \/>\n                        <small>Silahkan melampirkan referensi dokumen seperti KAK\/SOW\/BOQ atau request detail pekerjaan lainnya. Maksimum 2 MB, format PDF.<\/small>\n                    <\/div>\n<div class=\"tqs3s-field tqs3s-field-full\">\n                        <label>Catatan (Opsional)<\/label><br \/>\n                        <textarea id=\"tqs3s-catatan\" rows=\"4\"><\/textarea>\n                    <\/div>\n<div class=\"tqs3s-field tqs3s-field-full\">\n                        <label>Opsi Pembayaran<\/label><br \/>\n                        <select id=\"tqs3s-followup\"><option value=\"cash\">Pembayaran langsung (cash)<\/option><option value=\"termin\">Pembayaran termin<\/option><option value=\"consult\">Konsultasi terlebih dahulu melalui email<\/option><\/select>\n                    <\/div>\n<div class=\"tqs3s-field tqs3s-field-full\" id=\"tqs3s-termin-wrap\" style=\"display:none;\">\n                        <label>Pilihan Termin<\/label><br \/>\n                        <select id=\"tqs3s-termin-scheme\"><option value=\"2_termin\">2 termin (50%-50%)<\/option><option value=\"4_termin\">4 termin (30%-30%-30%-10%)<\/option><\/select>\n                    <\/div>\n<\/p><\/div>\n<div id=\"tqs3s-live-result\" class=\"tqs3s-result\" style=\"display:none;\"><\/div>\n<\/p><\/div>\n<div class=\"tqs3s-actions\">\n                    <button type=\"button\" id=\"tqs3s-download\" class=\"tqs3s-btn tqs3s-btn-secondary\" disabled>Download PDF Quotation<\/button><br \/>\n                    <button type=\"button\" id=\"tqs3s-submit\" class=\"tqs3s-btn\" disabled>Submit<\/button>\n                <\/div>\n<div id=\"tqs3s-step2-message\" class=\"tqs3s-message\"><\/div>\n<\/p><\/div>\n<div id=\"tqs3s-rental\" style=\"display:none;\">\n                <input type=\"hidden\" id=\"tqs3s-rental-submission-id\" value=\"\"><\/p>\n<div id=\"tqs3s-rental-form-content\">\n<h3>Form Sewa Alat<\/h3>\n<div class=\"tqs3s-grid\">\n<div class=\"tqs3s-field\">\n                        <label>Alat<\/label><br \/>\n                        <select id=\"tqs3s-rental-category\"><option value=\"\">Pilih<\/option><option value=\"Total Station\">Total Station<\/option><option value=\"GPS Geodetic \/ GNSS\">GPS Geodetic \/ GNSS<\/option><option value=\"Waterpass Auto Level\">Waterpass Auto Level<\/option><option value=\"GPS Handheld\">GPS Handheld<\/option><option value=\"Hidrografi\">Hidrografi<\/option><option value=\"Foto Udara\">Foto Udara<\/option><option value=\"Aksesoris dan Lain-lain\">Aksesoris dan Lain-lain<\/option><\/select>\n                    <\/div>\n<div class=\"tqs3s-field\">\n                        <label>Jenis Alat<\/label><br \/>\n                        <select id=\"tqs3s-rental-tool\"><option value=\"\">Pilih alat dahulu<\/option><\/select>\n                    <\/div>\n<div class=\"tqs3s-field tqs3s-field-full\">\n                        <label>Foto Alat<\/label><\/p>\n<div id=\"tqs3s-rental-photo\" class=\"tqs3s-note\">Pilih jenis alat untuk melihat foto.<\/div>\n<\/p><\/div>\n<div class=\"tqs3s-field tqs3s-field-full\">\n                        <label>Deskripsi Alat<\/label><\/p>\n<div id=\"tqs3s-rental-desc\" class=\"tqs3s-note\">Pilih jenis alat untuk melihat deskripsi.<\/div>\n<\/p><\/div>\n<div class=\"tqs3s-field\">\n                        <label>Durasi<\/label><\/p>\n<div class=\"tqs3s-inline\">\n                            <input type=\"number\" min=\"1\" step=\"1\" id=\"tqs3s-rental-duration-value\" value=\"\"><br \/>\n                            <select id=\"tqs3s-rental-duration-unit\"><option value=\"Harian\">Harian<\/option><option value=\"Mingguan\">Mingguan<\/option><option value=\"Bulanan\">Bulanan<\/option><\/select>\n                        <\/div>\n<\/p><\/div>\n<div class=\"tqs3s-field\">\n                        <label>Pengambilan<\/label><br \/>\n                        <select id=\"tqs3s-rental-pickup\"><option value=\"Pickup\">Pickup<\/option><option value=\"Delivery\">Delivery<\/option><\/select><br \/>\n                        <small>Harga yang dikalkulasikan merupakan harga pickup. Jika memilih delivery, biaya akan diinformasikan admin secara terpisah.<\/small>\n                    <\/div>\n<div class=\"tqs3s-field tqs3s-field-full\">\n                        <label>Catatan<\/label><br \/>\n                        <textarea id=\"tqs3s-rental-catatan\" rows=\"4\"><\/textarea>\n                    <\/div>\n<div class=\"tqs3s-field tqs3s-field-full\">\n                        <label>Opsi Pembayaran<\/label><br \/>\n                        <select id=\"tqs3s-rental-followup\"><option value=\"cash\">Pembayaran langsung (cash)<\/option><option value=\"termin\">Pembayaran termin<\/option><option value=\"consult\">Konsultasi terlebih dahulu melalui email<\/option><\/select>\n                    <\/div>\n<div class=\"tqs3s-field tqs3s-field-full\" id=\"tqs3s-rental-termin-wrap\" style=\"display:none;\">\n                        <label>Pilihan Termin<\/label><br \/>\n                        <select id=\"tqs3s-rental-termin-scheme\"><option value=\"2_termin\">2 termin (50%-50%)<\/option><option value=\"4_termin\">4 termin (30%-30%-30%-10%)<\/option><\/select>\n                    <\/div>\n<\/p><\/div>\n<div id=\"tqs3s-rental-result\" class=\"tqs3s-result\" style=\"display:none;\"><\/div>\n<\/p><\/div>\n<div class=\"tqs3s-actions\">\n                    <button type=\"button\" id=\"tqs3s-rental-download\" class=\"tqs3s-btn tqs3s-btn-secondary\" disabled>Download PDF Quotation<\/button><br \/>\n                    <button type=\"button\" id=\"tqs3s-rental-submit\" class=\"tqs3s-btn\" disabled>Submit<\/button>\n                <\/div>\n<div id=\"tqs3s-rental-message\" class=\"tqs3s-message\"><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div id=\"tqs3s-image-modal\" class=\"tqs3s-image-modal\" aria-hidden=\"true\">\n<div class=\"tqs3s-image-modal-inner\">\n            <button type=\"button\" id=\"tqs3s-image-modal-close\" class=\"tqs3s-image-modal-close\" aria-label=\"Tutup\">&times;<\/button><br \/>\n            <button type=\"button\" id=\"tqs3s-image-modal-prev\" class=\"tqs3s-image-modal-nav is-prev\" aria-label=\"Sebelumnya\">&#10094;<\/button><br \/>\n            <img decoding=\"async\" id=\"tqs3s-image-modal-img\" src=\"\" alt=\"Preview alat\"><br \/>\n            <button type=\"button\" id=\"tqs3s-image-modal-next\" class=\"tqs3s-image-modal-nav is-next\" aria-label=\"Berikutnya\">&#10095;<\/button>\n        <\/div>\n<\/p><\/div>\n<style>\n    .tqs3s-wrap{max-width:960px;margin:24px auto;font-family:Arial,sans-serif}\n    .tqs3s-card{background:#fff;border:1px solid #dfe3e8;border-radius:16px;padding:24px;box-shadow:0 6px 20px rgba(0,0,0,.04)}\n    .tqs3s-sub{color:#667085;margin-top:-8px;margin-bottom:20px}\n    .tqs3s-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}\n    .tqs3s-field{display:flex;flex-direction:column;gap:6px}\n    .tqs3s-field-full{grid-column:1\/-1}\n    .tqs3s-field input,.tqs3s-field select,.tqs3s-field textarea{width:100%;padding:12px;border:1px solid #d0d5dd;border-radius:10px;box-sizing:border-box}\n    .tqs3s-inline{display:grid;grid-template-columns:1fr 180px;gap:12px}\n    .tqs3s-actions{margin-top:18px;display:flex;gap:12px;flex-wrap:wrap}\n    .tqs3s-btn{background:#206842;color:#fff;border:0;padding:12px 18px;border-radius:10px;cursor:pointer}\n    .tqs3s-btn[disabled]{opacity:.5;cursor:not-allowed}\n    .tqs3s-btn-secondary{background:#101828}\n    .tqs3s-message{margin-top:12px;color:#b42318}\n    .tqs3s-info,.tqs3s-note{padding:14px;border-radius:10px;background:#f8f9fc;color:#344054;border:1px solid #e4e7ec}\n    .tqs3s-quality-desc-box{white-space:pre-line;line-height:1.6}\n    .tqs3s-result{margin-top:18px;padding:18px;background:#f6fef9;border:1px solid #abefc6;border-radius:12px}\n    .tqs3s-result strong{font-size:20px;display:block;margin-bottom:8px}\n    #tqs3s-rental-photo{text-align:center;padding:15px}\n    .tqs3s-photo-gallery{display:flex;gap:14px;justify-content:center;align-items:flex-start;flex-wrap:nowrap;overflow-x:auto;padding:6px 2px}\n    .tqs3s-photo-card{border:1px solid #d0d5dd;background:#fff;border-radius:12px;padding:8px;cursor:pointer;box-shadow:0 4px 12px rgba(0,0,0,.08);flex:0 0 auto}\n    .tqs3s-photo-card:hover{transform:translateY(-1px)}\n    .tqs3s-photo-preview{width:180px;height:180px;display:block;border-radius:8px;object-fit:contain}\n    .tqs3s-photo-empty{padding:24px 12px;border:1px dashed #d0d5dd;border-radius:12px;background:#fff;color:#667085}\n    .tqs3s-image-modal{position:fixed !important;inset:0;background:rgba(0,0,0,.88);display:none;align-items:center;justify-content:center;padding:10px;z-index:99999}\n    .tqs3s-image-modal.is-open{display:flex}\n    .tqs3s-image-modal-inner{position:relative;display:flex;align-items:center;justify-content:center;max-width:min(96vw,1100px);max-height:96vh;background:#fff;border-radius:12px;padding:8px;box-sizing:border-box;box-shadow:0 16px 40px rgba(0,0,0,.28);overflow:hidden;touch-action:pan-y}\n    .tqs3s-image-modal img{max-width:min(82vw,920px);max-height:calc(96vh - 16px);display:block;border-radius:8px;object-fit:contain;margin:0 auto;transition:transform .2s ease;transform-origin:center center;cursor:zoom-in;-webkit-user-drag:none;user-select:none}\n    .tqs3s-image-modal img:hover{transform:scale(1.025)}\n    .tqs3s-image-modal-close{position:absolute;top:8px;right:8px;display:flex;align-items:center;justify-content:center;border:none;background:rgba(17,17,17,.92);color:#fff;border-radius:999px;width:36px;height:36px;line-height:1;font-size:28px;font-weight:700;cursor:pointer;z-index:100000;padding:0;box-shadow:0 4px 12px rgba(0,0,0,.2)}\n    .tqs3s-image-modal-close:hover{transform:scale(1.03)}\n    .tqs3s-image-modal-close:focus{outline:2px solid #fff;outline-offset:2px}\n    .tqs3s-image-modal-nav{position:absolute;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;width:40px;height:40px;border:none;border-radius:999px;background:rgba(17,17,17,.75);color:#fff;font-size:28px;line-height:1;cursor:pointer;z-index:100000;padding:0;box-shadow:0 4px 10px rgba(0,0,0,.18)}\n    .tqs3s-image-modal-nav:hover{background:rgba(17,17,17,.9)}\n    .tqs3s-image-modal-nav.is-prev{left:8px}\n    .tqs3s-image-modal-nav.is-next{right:8px}\n    @media (max-width:768px){.tqs3s-photo-gallery{justify-content:flex-start}.tqs3s-photo-preview{width:140px;height:140px}.tqs3s-image-modal{padding:6px}.tqs3s-image-modal-inner{padding:6px;border-radius:10px}.tqs3s-image-modal img{max-width:calc(100vw - 56px);max-height:calc(100vh - 20px)}.tqs3s-image-modal-nav{width:36px;height:36px;font-size:24px}.tqs3s-image-modal-nav.is-prev{left:6px}.tqs3s-image-modal-nav.is-next{right:6px}.tqs3s-image-modal-close{top:6px;right:6px;width:34px;height:34px;font-size:26px}}\n    @media (max-width:768px){.tqs3s-grid,.tqs3s-inline{grid-template-columns:1fr}}\n    <\/style>\n<p>    <script>\n    (function(){\n        const cfg = {\"ajaxUrl\":\"https:\\\/\\\/surabayasurveysolution.com\\\/wp-admin\\\/admin-ajax.php\",\"nonce\":\"25a405daa9\",\"equipmentMap\":{\"Terestris\":[\"GPS RTK\",\"SLAM LIDAR\",\"TLS\",\"TOTAL STATION\",\"WATERPASS\",\"WATERPASS + GPS RTK\",\"WATERPASS + TOTAL STATION\"],\"Hidrografi\":[\"ADCP\",\"CURRENT METER\",\"MBES\",\"MBES + SBP\",\"MBES + SSS\",\"SBES + SBP\",\"SBES + SSS\",\"SBES DUAL FREQ\",\"SBES SINGLE FREQ\",\"SBP\",\"SSS\",\"TIDE\"],\"Fotogrametri\":[\"Drone Lidar\",\"Drone mapping\"]},\"qualityDescRules\":[{\"survey_type\":\"Terestris\",\"equipment\":\"\",\"quality_level\":\"Ekonomis\",\"description\":\"1. Pengambilan topo per 25 m\\r\\n2. Pembuatan grid data kontur 25 m\\r\\n3. Request stake out\\\/monitoring 75 titik\\r\\n4. Alat ekonomis\\r\\n5. SDM Freshgraduate\\r\\n6. Raw Data\"},{\"survey_type\":\"Terestris\",\"equipment\":\"\",\"quality_level\":\"Premium\",\"description\":\"1. Pengambilan topo per 5 m\\r\\n2. Pembuatan grid data kontur 5 m\\r\\n3. Request stake out\\\/monitoring 175 titik\\r\\n4. Alat high quality\\r\\n5. Sdm high skill\\r\\n6. Pembuatan 2 BM permanen\\r\\n7. Raw data, peta, laporan, perhitungan, analisa\"},{\"survey_type\":\"Hidrografi\",\"equipment\":\"\",\"quality_level\":\"Ekonomis\",\"description\":\"1. Grid\\\/kerapatan data besar\\r\\n2. Raw data\"},{\"survey_type\":\"Hidrografi\",\"equipment\":\"\",\"quality_level\":\"Basic\",\"description\":\"1. Grid\\\/kerapatan data standar hidro\\r\\n2. Raw data, peta, laporan.\"},{\"survey_type\":\"Hidrografi\",\"equipment\":\"\",\"quality_level\":\"Premium\",\"description\":\"1. Grid\\\/kerapatan data sangat rapat (by request owner) \\r\\n2. Raw data, peta, laporan, analisa, perhitungan volume dsb\"},{\"survey_type\":\"Fotogrametri\",\"equipment\":\"Drone mapping\",\"quality_level\":\"Ekonomis\",\"description\":\"1. Dji Mini series\\r\\n2. GSD 20 cm\\r\\n3. Overlap sidelap 60%\\r\\n4. Tanpa GCP tanpa RTK\\\/PPK\\r\\n5. Raw data+peta\"},{\"survey_type\":\"Fotogrametri\",\"equipment\":\"Drone mapping\",\"quality_level\":\"Basic\",\"description\":\"1. Dji Mavic\\\/Air series\\r\\n2. GSD 10 cm\\r\\n3. Overlap sidelap 70%\\r\\n4. GCP\\r\\n5. Raw data, peta, laporan\"},{\"survey_type\":\"Fotogrametri\",\"equipment\":\"Drone mapping\",\"quality_level\":\"Premium\",\"description\":\"1. Dji Enterprise\\\/matrice\\r\\n2. GSD &lt; 5cm\\r\\n3. Overlap sidelap 80%\\r\\n4. RTK\\\/PPK\\\/GCP\\r\\n5. Raw data, peta, laporan, analisa, perhitungan.\"},{\"survey_type\":\"Fotogrametri\",\"equipment\":\"Drone Lidar\",\"quality_level\":\"Ekonomis\",\"description\":\"1. Point Cloud Low\\u2013Medium Density (\\u00b1 50\\u2013150 pts\\\/m\\u00b2)\\r\\n2. Digital Terrain Model (DTM) dasar\\r\\n3. Kontur 0.5\\u20131 m interval\\r\\n4. Laporan ringkas\\r\\n5. Tidak termasuk klasifikasi lanjutan point cloud\\r\\n6. Tidak termasuk orthophoto\\r\\n7. Tidak termasuk analisis volume \\\/ cut & fill\"},{\"survey_type\":\"Fotogrametri\",\"equipment\":\"Drone Lidar\",\"quality_level\":\"Basic\",\"description\":\"1. Point Cloud High Density (\\u00b1 150\\u2013300 pts\\\/m\\u00b2)\\r\\n2. DEM & DTM resolusi tinggi\\r\\n3. DSM (Digital Surface Model)\\r\\n4. Kontur 0.25\\u20130.5 m\\r\\n5. Orthophoto\\r\\n6. Klasifikasi point cloud basic (Ground, Vegetation, Building)\\r\\n7. Laporan lengkap\\r\\n8. Tidak termasuk analisis volume\"},{\"survey_type\":\"Fotogrametri\",\"equipment\":\"Drone Lidar\",\"quality_level\":\"Premium\",\"description\":\"1. Point Cloud Ultra High Density (\\u00b1 300\\u2013700 pts\\\/m\\u00b2)\\r\\n2. DEM \\\/ DTM \\\/ DSM presisi tinggi\\r\\n3. Orthophoto resoulusi tiggi\\r\\n4. Klasifikasi point cloud lanjutan\\r\\n5. Analisis engineering:\\r\\n- Cut & Fill\\r\\n- Perhitungan Volume Stockpile\\r\\n- Penampang melintang & memanjang\\r\\n6. Peta tematik\\r\\n7. Laporan teknis full\"},{\"survey_type\":\"Terestris\",\"equipment\":\"\",\"quality_level\":\"Basic\",\"description\":\"1. Pengambilan topo per 10 m-an\\r\\n2. Pembuatan grid data kontur 10 m\\r\\n3. Request stake out\\\/monitoring 125 titik\\r\\n4. Alat standar 3S\\r\\n5. Sdm standar 3S\\r\\n6. pembuatan 2 BM semi permanen \\r\\n7. raw data, peta, laporan\"}],\"rentalRules\":[{\"tool_name\":\"Total Station GM-52 (Callibrate)\",\"photo_urls\":[\"https:\\\/\\\/www.solusigeospasial.co.id\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/topcon_gm52.jpg\"],\"photo_url\":\"https:\\\/\\\/www.solusigeospasial.co.id\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/topcon_gm52.jpg\",\"photo_url_1\":\"https:\\\/\\\/www.solusigeospasial.co.id\\\/wp-content\\\/uploads\\\/2024\\\/08\\\/topcon_gm52.jpg\",\"photo_url_2\":\"\",\"photo_url_3\":\"\",\"description\":\"Fast and accurate new EDM\\r\\nBluetooth\\u00ae communications (optional)\\r\\nAdvanced angle accuracy\\r\\nLong battery life \\u2013 14 hours\\r\\nRugged, waterproof design with IP66 rating\\r\\n500 m long-range reflectorless measurement\\r\\n50,000 point internal memory\",\"daily_price\":250000,\"weekly_price\":1500000,\"monthly_price\":5000000},{\"tool_name\":\"Total Station GM-55 (Callibrate)\",\"photo_urls\":[\"https:\\\/\\\/www.theodist.com\\\/Images\\\/ProductImages\\\/GM55.jpg\"],\"photo_url\":\"https:\\\/\\\/www.theodist.com\\\/Images\\\/ProductImages\\\/GM55.jpg\",\"photo_url_1\":\"https:\\\/\\\/www.theodist.com\\\/Images\\\/ProductImages\\\/GM55.jpg\",\"photo_url_2\":\"\",\"photo_url_3\":\"\",\"description\":\"Construction and Survey Application Software\\r\\nFast & Accurate & Powerful Measuring Distance Feature\\r\\n500m Long Range Reflectoress Measurement\\r\\nRugged & Waterproof Design\\r\\nReliable Large Volume Internal Memory\",\"daily_price\":250000,\"weekly_price\":1500000,\"monthly_price\":5000000},{\"tool_name\":\"Total Station STEC ARMOR 3 (Callibrate)\",\"photo_urls\":[\"https:\\\/\\\/stecindonesia.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/total-station-stec-armor-3-ts-laser-armor3-stecindonesia-alat-ukur-survey-tanah-4.jpg\",\"https:\\\/\\\/stecindonesia.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/total-station-stec-armor-3-ts-laser-armor3-stecindonesia-alat-ukur-survey-tanah-3.jpg\"],\"photo_url\":\"https:\\\/\\\/stecindonesia.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/total-station-stec-armor-3-ts-laser-armor3-stecindonesia-alat-ukur-survey-tanah-4.jpg\",\"photo_url_1\":\"https:\\\/\\\/stecindonesia.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/total-station-stec-armor-3-ts-laser-armor3-stecindonesia-alat-ukur-survey-tanah-4.jpg\",\"photo_url_2\":\"https:\\\/\\\/stecindonesia.com\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/total-station-stec-armor-3-ts-laser-armor3-stecindonesia-alat-ukur-survey-tanah-3.jpg\",\"photo_url_3\":\"\",\"description\":\"2\\u2033 accuracy that supports 30x resolution and an enhanced EDM with a non-prism range of 1500m\\r\\nThe simple LCD screen makes it easy for users to read.\\r\\nConnectivity using USB and Bluetooth makes it easy to transfer data.\",\"daily_price\":250000,\"weekly_price\":1500000,\"monthly_price\":5000000},{\"category\":\"GPS Geodetic \\\/ GNSS\",\"tool_name\":\"GNSS Hi-Target V60\\\/Set (Base+Rover)\",\"photo_url\":\"\",\"description\":\"GNSS Hi-Target V60\\\/Set (Base+Rover).\",\"daily_price\":600000,\"weekly_price\":3600000,\"monthly_price\":12000000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"GPS Geodetic \\\/ GNSS\",\"tool_name\":\"GNSS Hi-Target V90\\\/Set (Base+Rover)\",\"photo_url\":\"\",\"description\":\"GNSS Hi-Target V90\\\/Set (Base+Rover).\",\"daily_price\":600000,\"weekly_price\":3600000,\"monthly_price\":12000000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"GPS Geodetic \\\/ GNSS\",\"tool_name\":\"GNSS CHC i50\\\/Set (Base+Rover)\",\"photo_url\":\"\",\"description\":\"GNSS CHC i50\\\/Set (Base+Rover).\",\"daily_price\":600000,\"weekly_price\":3600000,\"monthly_price\":12000000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"GPS Geodetic \\\/ GNSS\",\"tool_name\":\"GNSS STEC SV1\\\/Set (Base+Rover)\",\"photo_url\":\"\",\"description\":\"GNSS STEC SV1\\\/Set (Base+Rover).\",\"daily_price\":600000,\"weekly_price\":3600000,\"monthly_price\":12000000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"GPS Geodetic \\\/ GNSS\",\"tool_name\":\"Eksternal Radio Hi-Target\\\/CHC\",\"photo_url\":\"\",\"description\":\"Eksternal Radio Hi-Target\\\/CHC.\",\"daily_price\":250000,\"weekly_price\":1500000,\"monthly_price\":5000000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Waterpass Auto Level\",\"tool_name\":\"Waterpass Topcon ATB-3 (Callibrate)\",\"photo_url\":\"\",\"description\":\"Waterpass Topcon ATB-3 (Callibrate).\",\"daily_price\":100000,\"weekly_price\":600000,\"monthly_price\":1500000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Waterpass Auto Level\",\"tool_name\":\"Waterpass Leica NA-828 (Callibrate)\",\"photo_url\":\"\",\"description\":\"Waterpass Leica NA-828 (Callibrate).\",\"daily_price\":100000,\"weekly_price\":600000,\"monthly_price\":1500000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Waterpass Auto Level\",\"tool_name\":\"Waterpass Topcon ATB-4 (Callibrate)\",\"photo_url\":\"\",\"description\":\"Waterpass Topcon ATB-4 (Callibrate).\",\"daily_price\":100000,\"weekly_price\":600000,\"monthly_price\":1500000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"GPS Handheld\",\"tool_name\":\"GPS Handheld Garmin Etrex 10\",\"photo_url\":\"\",\"description\":\"GPS Handheld Garmin Etrex 10.\",\"daily_price\":25000,\"weekly_price\":150000,\"monthly_price\":350000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"GPS Handheld\",\"tool_name\":\"GPS Handheld Garmin Monterra\",\"photo_url\":\"\",\"description\":\"GPS Handheld Garmin Monterra.\",\"daily_price\":25000,\"weekly_price\":150000,\"monthly_price\":350000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"GPS Handheld\",\"tool_name\":\"GPS Handheld Garmin Oregon 650\",\"photo_url\":\"\",\"description\":\"GPS Handheld Garmin Oregon 650.\",\"daily_price\":25000,\"weekly_price\":150000,\"monthly_price\":350000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"GPS Handheld\",\"tool_name\":\"GPS Handheld Garmin Montana 680\",\"photo_url\":\"\",\"description\":\"GPS Handheld Garmin Montana 680.\",\"daily_price\":25000,\"weekly_price\":150000,\"monthly_price\":350000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Hidrografi\",\"tool_name\":\"SBES Hi-Target HD LITE\",\"photo_url\":\"\",\"description\":\"SBES Hi-Target HD LITE.\",\"daily_price\":1500000,\"weekly_price\":9000000,\"monthly_price\":30000000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Hidrografi\",\"tool_name\":\"Aquamap\\\/Fish Finder Garmin 80XS\",\"photo_url\":\"\",\"description\":\"Aquamap\\\/Fish Finder Garmin 80XS.\",\"daily_price\":500000,\"weekly_price\":3000000,\"monthly_price\":10000000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Hidrografi\",\"tool_name\":\"Valeport Tidemaster Gauge (Pasang Surut)\",\"photo_url\":\"\",\"description\":\"Valeport Tidemaster Gauge (Pasang Surut).\",\"daily_price\":500000,\"weekly_price\":3000000,\"monthly_price\":10000000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Foto Udara\",\"tool_name\":\"Drone DJI Matrice 4E\",\"photo_url\":\"\",\"description\":\"Drone DJI Matrice 4E.\",\"daily_price\":1000000,\"weekly_price\":6000000,\"monthly_price\":20000000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Foto Udara\",\"tool_name\":\"Drone DJI Mavic Pro\",\"photo_url\":\"\",\"description\":\"Drone DJI Mavic Pro.\",\"daily_price\":600000,\"weekly_price\":3600000,\"monthly_price\":12000000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Aksesoris dan Lain-lain\",\"tool_name\":\"Vertikallity Lup\\\/Lup Diagonal Sokkia\",\"photo_url\":\"\",\"description\":\"Vertikallity Lup\\\/Lup Diagonal Sokkia.\",\"daily_price\":50000,\"weekly_price\":300000,\"monthly_price\":1000000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Aksesoris dan Lain-lain\",\"tool_name\":\"HandyTalky\",\"photo_url\":\"\",\"description\":\"Perangkat komunikasi lapangan untuk koordinasi tim.\",\"daily_price\":20000,\"weekly_price\":50000,\"monthly_price\":120000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Aksesoris dan Lain-lain\",\"tool_name\":\"Jalon\\\/Pole\",\"photo_url\":\"\",\"description\":\"Jalon\\\/Pole.\",\"daily_price\":25000,\"weekly_price\":150000,\"monthly_price\":500000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Aksesoris dan Lain-lain\",\"tool_name\":\"Rambu Ukur\",\"photo_url\":\"\",\"description\":\"Rambu Ukur.\",\"daily_price\":25000,\"weekly_price\":150000,\"monthly_price\":500000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Aksesoris dan Lain-lain\",\"tool_name\":\"Statif\\\/Tripod\",\"photo_url\":\"\",\"description\":\"Statif\\\/Tripod.\",\"daily_price\":25000,\"weekly_price\":150000,\"monthly_price\":500000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Aksesoris dan Lain-lain\",\"tool_name\":\"Tribrach\",\"photo_url\":\"\",\"description\":\"Tribrach.\",\"daily_price\":25000,\"weekly_price\":150000,\"monthly_price\":500000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Aksesoris dan Lain-lain\",\"tool_name\":\"Aki+Charger\",\"photo_url\":\"\",\"description\":\"Aki+Charger.\",\"daily_price\":50000,\"weekly_price\":300000,\"monthly_price\":1000000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"},{\"category\":\"Aksesoris dan Lain-lain\",\"tool_name\":\"Bar Check Hidrografi\",\"photo_url\":\"\",\"description\":\"Bar Check Hidrografi.\",\"daily_price\":50000,\"weekly_price\":300000,\"monthly_price\":1000000,\"photo_urls\":[],\"photo_url_1\":\"\",\"photo_url_2\":\"\",\"photo_url_3\":\"\"}],\"rentalCatalog\":{\"Total Station\":[{\"tool_name\":\"Total Station GM-52 (Callibrate)\",\"description\":\"Dummy deskripsi untuk Total Station GM-52 (Callibrate).\",\"photo_url\":\"\"},{\"tool_name\":\"Total Station GM-55 (Callibrate)\",\"description\":\"Dummy deskripsi untuk Total Station GM-55 (Callibrate).\",\"photo_url\":\"\"},{\"tool_name\":\"Total Station STEC ARMOR 3 (Callibrate)\",\"description\":\"Dummy deskripsi untuk Total Station STEC ARMOR 3 (Callibrate).\",\"photo_url\":\"\"}],\"GPS Geodetic \\\/ GNSS\":[{\"tool_name\":\"GNSS Hi-Target V60\\\/Set (Base+Rover)\",\"description\":\"Dummy deskripsi untuk GNSS Hi-Target V60\\\/Set (Base+Rover).\",\"photo_url\":\"\"},{\"tool_name\":\"GNSS Hi-Target V90\\\/Set (Base+Rover)\",\"description\":\"Dummy deskripsi untuk GNSS Hi-Target V90\\\/Set (Base+Rover).\",\"photo_url\":\"\"},{\"tool_name\":\"GNSS CHC i50\\\/Set (Base+Rover)\",\"description\":\"Dummy deskripsi untuk GNSS CHC i50\\\/Set (Base+Rover).\",\"photo_url\":\"\"},{\"tool_name\":\"GNSS STEC SV1\\\/Set (Base+Rover)\",\"description\":\"Dummy deskripsi untuk GNSS STEC SV1\\\/Set (Base+Rover).\",\"photo_url\":\"\"},{\"tool_name\":\"Eksternal Radio Hi-Target\\\/CHC\",\"description\":\"Dummy deskripsi untuk Eksternal Radio Hi-Target\\\/CHC.\",\"photo_url\":\"\"}],\"Waterpass Auto Level\":[{\"tool_name\":\"Waterpass Topcon ATB-3 (Callibrate)\",\"description\":\"Dummy deskripsi untuk Waterpass Topcon ATB-3 (Callibrate).\",\"photo_url\":\"\"},{\"tool_name\":\"Waterpass Leica NA-828 (Callibrate)\",\"description\":\"Dummy deskripsi untuk Waterpass Leica NA-828 (Callibrate).\",\"photo_url\":\"\"},{\"tool_name\":\"Waterpass Topcon ATB-4 (Callibrate)\",\"description\":\"Dummy deskripsi untuk Waterpass Topcon ATB-4 (Callibrate).\",\"photo_url\":\"\"}],\"GPS Handheld\":[{\"tool_name\":\"GPS Handheld Garmin Etrex 10\",\"description\":\"Dummy deskripsi untuk GPS Handheld Garmin Etrex 10.\",\"photo_url\":\"\"},{\"tool_name\":\"GPS Handheld Garmin Monterra\",\"description\":\"Dummy deskripsi untuk GPS Handheld Garmin Monterra.\",\"photo_url\":\"\"},{\"tool_name\":\"GPS Handheld Garmin Oregon 650\",\"description\":\"Dummy deskripsi untuk GPS Handheld Garmin Oregon 650.\",\"photo_url\":\"\"},{\"tool_name\":\"GPS Handheld Garmin Montana 680\",\"description\":\"Dummy deskripsi untuk GPS Handheld Garmin Montana 680.\",\"photo_url\":\"\"}],\"Hidrografi\":[{\"tool_name\":\"SBES Hi-Target HD LITE\",\"description\":\"Dummy deskripsi untuk SBES Hi-Target HD LITE.\",\"photo_url\":\"\"},{\"tool_name\":\"Aquamap\\\/Fish Finder Garmin 80XS\",\"description\":\"Dummy deskripsi untuk Aquamap\\\/Fish Finder Garmin 80XS.\",\"photo_url\":\"\"},{\"tool_name\":\"Valeport Tidemaster Gauge (Pasang Surut)\",\"description\":\"Dummy deskripsi untuk Valeport Tidemaster Gauge (Pasang Surut).\",\"photo_url\":\"\"}],\"Foto Udara\":[{\"tool_name\":\"Drone DJI Matrice 4E\",\"description\":\"Dummy deskripsi untuk Drone DJI Matrice 4E.\",\"photo_url\":\"\"},{\"tool_name\":\"Drone DJI Mavic Pro\",\"description\":\"Dummy deskripsi untuk Drone DJI Mavic Pro.\",\"photo_url\":\"\"}],\"Aksesoris dan Lain-lain\":[{\"tool_name\":\"Vertikallity Lup\\\/Lup Diagonal Sokkia\",\"description\":\"Dummy deskripsi untuk Vertikallity Lup\\\/Lup Diagonal Sokkia.\",\"photo_url\":\"\"},{\"tool_name\":\"HandyTalky\",\"description\":\"Dummy deskripsi untuk HandyTalky.\",\"photo_url\":\"\"},{\"tool_name\":\"Jalon\\\/Pole\",\"description\":\"Dummy deskripsi untuk Jalon\\\/Pole.\",\"photo_url\":\"\"},{\"tool_name\":\"Rambu Ukur\",\"description\":\"Dummy deskripsi untuk Rambu Ukur.\",\"photo_url\":\"\"},{\"tool_name\":\"Statif\\\/Tripod\",\"description\":\"Dummy deskripsi untuk Statif\\\/Tripod.\",\"photo_url\":\"\"},{\"tool_name\":\"Tribrach\",\"description\":\"Dummy deskripsi untuk Tribrach.\",\"photo_url\":\"\"},{\"tool_name\":\"Aki+Charger\",\"description\":\"Dummy deskripsi untuk Aki+Charger.\",\"photo_url\":\"\"},{\"tool_name\":\"Bar Check Hidrografi\",\"description\":\"Dummy deskripsi untuk Bar Check Hidrografi.\",\"photo_url\":\"\"}]}};\n        let submissionId = null;\n        let rentalSubmissionId = null;\n        let lastCalcReady = false;\n        let lastRentalCalcReady = false;\n        let surveySubmitted = false;\n        let rentalSubmitted = false;\n        let surveyPdfUrl = '';\n        let rentalPdfUrl = '';<\/p>\n<p>        const el = (id) => document.getElementById(id);\n        const step1Msg = el('tqs3s-step1-message');\n        const step2Msg = el('tqs3s-step2-message');\n        const resultBox = el('tqs3s-live-result');\n        const rentalMsg = el('tqs3s-rental-message');\n        const rentalResult = el('tqs3s-rental-result');<\/p>\n<p>        function escapeHtml(text){\n            return (text || '').toString().replace(\/[&<>\"']\/g, (m)=>({ '&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#039;' }[m]));\n        }<\/p>\n<p>        function getFollowupChoice(){\n            return el('tqs3s-followup') ? el('tqs3s-followup').value : 'cash';\n        }<\/p>\n<p>        function updateTerminVisibility() {\n            el('tqs3s-termin-wrap').style.display = getFollowupChoice() === 'termin' ? 'block' : 'none';\n        }\n        function getRentalFollowupChoice(){\n            return el('tqs3s-rental-followup') ? el('tqs3s-rental-followup').value : 'cash';\n        }\n        function updateRentalTerminVisibility() {\n            el('tqs3s-rental-termin-wrap').style.display = getRentalFollowupChoice() === 'termin' ? 'block' : 'none';\n        }<\/p>\n<p>        function formatMultilineText(text) {\n            return escapeHtml(text || '-').replace(\/(?:\\r\\n|\\r|\\n)\/g, '<br \/>');\n        }<\/p>\n<p>        function updateEquipmentOptions() {\n            const survey = el('tqs3s-jenis-pekerjaan').value;\n            const eq = el('tqs3s-equipment');\n            eq.innerHTML = '';\n            if (!survey || !cfg.equipmentMap[survey]) {\n                eq.innerHTML = '<option value=\"\">Pilih jenis pekerjaan dahulu<\/option>';\n                updateQualityDesc();\n                return;\n            }\n            eq.innerHTML = '<option value=\"\">Pilih<\/option>';\n            cfg.equipmentMap[survey].forEach((item) => {\n                const opt = document.createElement('option');\n                opt.value = item;\n                opt.textContent = item;\n                eq.appendChild(opt);\n            });\n            updateQuantityLabel();\n            updateQualityDesc();\n        }<\/p>\n<p>        function updateQuantityLabel() {\n            const survey = el('tqs3s-jenis-pekerjaan').value;\n            const equipment = el('tqs3s-equipment').value;\n            let label = 'Luasan (ha)';\n            if (survey === 'Hidrografi' && ['TIDE','ADCP','CURRENT METER'].includes((equipment || '').toUpperCase())) {\n                label = 'Durasi Hari';\n            }\n            el('tqs3s-quantity-label').textContent = label;\n        }<\/p>\n<p>        function updateQualityDesc() {\n            const survey = el('tqs3s-jenis-pekerjaan').value;\n            const quality = el('tqs3s-kualitas').value;\n            const equipment = el('tqs3s-equipment').value;\n            let desc = '';\n            (cfg.qualityDescRules || []).forEach((rule) => {\n                if (desc) return;\n                if (rule.survey_type === survey && rule.quality_level === quality && (rule.equipment || '') !== '' && rule.equipment === equipment) {\n                    desc = rule.description || '';\n                }\n            });\n            if (!desc) {\n                (cfg.qualityDescRules || []).forEach((rule) => {\n                    if (desc) return;\n                    if (rule.survey_type === survey && rule.quality_level === quality && (!rule.equipment || rule.equipment === '')) {\n                        desc = rule.description || '';\n                    }\n                });\n            }\n            el('tqs3s-quality-desc').innerHTML = formatMultilineText(desc || 'Pilih jenis pekerjaan, equipment, dan kualitas data untuk melihat deskripsi.');\n        }<\/p>\n<p>        function getStep2Fields() {\n            return {\n                submission_id: submissionId || el('tqs3s-submission-id').value,\n                jenis_pekerjaan: el('tqs3s-jenis-pekerjaan').value,\n                provinsi: el('tqs3s-provinsi').value,\n                kabupaten_kota: el('tqs3s-kabupaten-kota').value,\n                equipment: el('tqs3s-equipment').value,\n                kualitas_data: el('tqs3s-kualitas').value,\n                luasan: el('tqs3s-luasan').value,\n                target_pelaksanaan: el('tqs3s-target').value,\n                catatan: el('tqs3s-catatan').value,\n                followup_choice: getFollowupChoice(),\n                termin_scheme: el('tqs3s-termin-scheme').value,\n            };\n        }\n        function readyForCalc() {\n            const p = getStep2Fields();\n            return !!(submissionId && p.jenis_pekerjaan && p.provinsi && p.kabupaten_kota && p.equipment && p.kualitas_data && p.luasan && parseFloat(p.luasan) > 0);\n        }\n        async function postFormData(formData) {\n            const res = await fetch(cfg.ajaxUrl, {method:'POST', body: formData});\n            return await res.json();\n        }\n        function renderSummary(summary, totalFormatted) {\n            let html = '<strong>RINGKASAN<\/strong>';\n            Object.keys(summary).forEach((label) => {\n                const value = summary[label] || '-';\n                if (label === 'Deskripsi Kualitas Data') {\n                    html += '<\/p>\n<div><b>' + escapeHtml(label) + ':<\/b><\/div>\n<p>';\n                    html += '<\/p>\n<div style=\"margin-left:0; margin-top:4px; line-height:1.7;\">' + formatMultilineText(value) + '<\/div>\n<p>';\n                } else {\n                    html += '<\/p>\n<div><b>' + escapeHtml(label) + ':<\/b> ' + formatMultilineText(value) + '<\/div>\n<p>';\n                }\n            });\n            return html;\n        }\n        function openPdfInNewTab(url) {\n            if (!url) return;\n            window.open(url + (url.indexOf('?') !== -1 ? '&' : '?') + 'v=' + Date.now(), '_blank');\n        }<\/p>\n<p>        function setSurveySubmittedState(isSubmitted, pdfUrl) {\n            surveySubmitted = !!isSubmitted;\n            surveyPdfUrl = pdfUrl || surveyPdfUrl || '';\n            const formContent = el('tqs3s-step2-form-content');\n            const submitBtn = el('tqs3s-submit');\n            const downloadBtn = el('tqs3s-download');\n            const sub = document.querySelector('.tqs3s-sub');\n            if (formContent) formContent.style.display = surveySubmitted ? 'none' : 'block';\n            if (submitBtn) submitBtn.style.display = surveySubmitted ? 'none' : 'inline-flex';\n            if (downloadBtn) downloadBtn.disabled = !surveySubmitted;\n            if (sub) {\n                sub.textContent = surveySubmitted\n                    ? 'Silahkan download Quotation!'\n                    : 'Data diri sudah terisi, silahkan mengisi detail kebutuhan.';\n            }\n        }<\/p>\n<p>        function setRentalSubmittedState(isSubmitted, pdfUrl) {\n            rentalSubmitted = !!isSubmitted;\n            rentalPdfUrl = pdfUrl || rentalPdfUrl || '';\n            const formContent = el('tqs3s-rental-form-content');\n            const submitBtn = el('tqs3s-rental-submit');\n            const downloadBtn = el('tqs3s-rental-download');\n            const sub = document.querySelector('.tqs3s-sub');\n            if (formContent) formContent.style.display = rentalSubmitted ? 'none' : 'block';\n            if (submitBtn) submitBtn.style.display = rentalSubmitted ? 'none' : 'inline-flex';\n            if (downloadBtn) downloadBtn.disabled = !rentalSubmitted;\n            if (sub) {\n                sub.textContent = rentalSubmitted\n                    ? 'Silahkan download Quotation!'\n                    : 'Data diri sudah terisi, silahkan mengisi detail kebutuhan.';\n            }\n        }<\/p>\n<p>        async function triggerLiveCalc() {\n            step2Msg.textContent = '';\n            if (surveySubmitted) {\n                el('tqs3s-download').disabled = false;\n                el('tqs3s-submit').disabled = true;\n                return;\n            }\n            if (!readyForCalc()) {\n                lastCalcReady = false;\n                resultBox.style.display = 'none';\n                el('tqs3s-download').disabled = true;\n                el('tqs3s-submit').disabled = true;\n                return;\n            }\n            const payload = getStep2Fields();\n            const formData = new FormData();\n            formData.append('action','tqs3s_calculate_quote');\n            formData.append('nonce',cfg.nonce);\n            Object.keys(payload).forEach((key)=>formData.append(key,payload[key]));\n            const response = await postFormData(formData);\n            if (!response.success) {\n                lastCalcReady = false;\n                resultBox.style.display = 'none';\n                el('tqs3s-download').disabled = true;\n                el('tqs3s-submit').disabled = true;\n                step2Msg.textContent = response.data && response.data.message ? response.data.message : 'Gagal menghitung harga.';\n                return;\n            }\n            lastCalcReady = true;\n            const d = response.data;\n            resultBox.style.display = 'block';\n            resultBox.innerHTML = renderSummary(d.summary, d.total_formatted);\n            el('tqs3s-download').disabled = true;\n            el('tqs3s-submit').disabled = false;\n        }<\/p>\n<p>        function getMergedRentalCatalog() {\n            const catalog = JSON.parse(JSON.stringify(cfg.rentalCatalog || {}));\n            const adminRules = cfg.rentalRules || [];\n            Object.keys(catalog).forEach((category) => {\n                catalog[category] = (catalog[category] || []).map((item) => {\n                    const admin = adminRules.find((r) => (r.tool_name || '') === (item.tool_name || ''));\n                    return {\n                        tool_name: item.tool_name || '',\n                        description: (admin && admin.description) ? admin.description : (item.description || '-'),\n                        photo_urls: ((admin && admin.photo_urls && admin.photo_urls.length) ? admin.photo_urls : ((admin && admin.photo_url) ? [admin.photo_url] : ((item.photo_urls && item.photo_urls.length) ? item.photo_urls : (item.photo_url ? [item.photo_url] : [])))),\n                        photo_url: (admin && admin.photo_url) ? admin.photo_url : (item.photo_url || '')\n                    };\n                });\n            });\n            return catalog;\n        }<\/p>\n<p>        function updateRentalToolOptions() {\n            const categoryEl = el('tqs3s-rental-category');\n            const toolEl = el('tqs3s-rental-tool');\n            if (!categoryEl || !toolEl) return;<\/p>\n<p>            const category = categoryEl.value || '';\n            const catalog = getMergedRentalCatalog();\n            const items = catalog[category] || [];<\/p>\n<p>            toolEl.innerHTML = '';\n            if (!category) {\n                toolEl.innerHTML = '<option value=\"\">Pilih alat dahulu<\/option>';\n                return;\n            }<\/p>\n<p>            toolEl.innerHTML = '<option value=\"\">Pilih<\/option>';\n            items.forEach((item) => {\n                const opt = document.createElement('option');\n                opt.value = item.tool_name || '';\n                opt.textContent = item.tool_name || '';\n                toolEl.appendChild(opt);\n            });\n        }<\/p>\n<p>        function updateRentalPreview() {\n            const categoryEl = el('tqs3s-rental-category');\n            const toolEl = el('tqs3s-rental-tool');\n            const photoEl = el('tqs3s-rental-photo');\n            const descEl = el('tqs3s-rental-desc');\n            if (!toolEl || !photoEl || !descEl) return;<\/p>\n<p>            const category = categoryEl ? (categoryEl.value || '') : '';\n            const toolName = toolEl.value || '';\n            const catalog = getMergedRentalCatalog();\n            const items = catalog[category] || [];\n            const item = items.find((r) => (r.tool_name || '') === toolName);<\/p>\n<p>            if (!item) {\n                descEl.innerHTML = formatMultilineText('Pilih jenis alat untuk melihat deskripsi.');\n                photoEl.innerHTML = 'Pilih jenis alat untuk melihat foto.';\n                return;\n            }<\/p>\n<p>            descEl.innerHTML = formatMultilineText(item.description || '-');\n            const photoUrls = Array.isArray(item.photo_urls) ? item.photo_urls.filter(Boolean).slice(0,3) : (item.photo_url ? [item.photo_url] : []);\n            if (photoUrls.length) {\n                photoEl.innerHTML = '<\/p>\n<div class=\"tqs3s-photo-gallery\">' + photoUrls.map(function(url, idx){\n                    return '<button type=\"button\" class=\"tqs3s-photo-card\" data-index=\"' + idx + '\" aria-label=\"Lihat gambar ' + (idx + 1) + '\"><img decoding=\"async\" src=\"' + escapeHtml(url) + '\" alt=\"' + escapeHtml(toolName) + ' ' + (idx + 1) + '\" class=\"tqs3s-photo-preview\"><\/button>';\n                }).join('') + '<\/div>\n<p>';\n                photoEl.querySelectorAll('.tqs3s-photo-card').forEach(function(btn){\n                    btn.addEventListener('click', function(){\n                        openRentalImageModal(photoUrls, parseInt(this.getAttribute('data-index') || '0', 10));\n                    });\n                });\n            } else {\n                photoEl.innerHTML = '<\/p>\n<div class=\"tqs3s-photo-empty\">Gambar belum tersedia<\/div>\n<p>';\n            }\n        }<\/p>\n<p>        let rentalModalImages = [];\n        let rentalModalIndex = 0;<\/p>\n<p>        function renderRentalModalImage() {\n            const modalImg = el('tqs3s-image-modal-img');\n            const prevBtn = el('tqs3s-image-modal-prev');\n            const nextBtn = el('tqs3s-image-modal-next');\n            if (!modalImg) return;\n            const current = rentalModalImages[rentalModalIndex] || '';\n            modalImg.setAttribute('src', current);\n            if (prevBtn) prevBtn.style.display = rentalModalImages.length > 1 ? 'flex' : 'none';\n            if (nextBtn) nextBtn.style.display = rentalModalImages.length > 1 ? 'flex' : 'none';\n        }<\/p>\n<p>        function stepRentalModalImage(step) {\n            if (!rentalModalImages.length) return;\n            rentalModalIndex = (rentalModalIndex + step + rentalModalImages.length) % rentalModalImages.length;\n            renderRentalModalImage();\n        }<\/p>\n<p>        function openRentalImageModal(srcList, startIndex) {\n            const modal = el('tqs3s-image-modal');\n            if (!modal) return;\n            rentalModalImages = Array.isArray(srcList) ? srcList.filter(Boolean) : [srcList].filter(Boolean);\n            rentalModalIndex = Math.max(0, Math.min(parseInt(startIndex || 0, 10), Math.max(rentalModalImages.length - 1, 0)));\n            if (!rentalModalImages.length) return;\n            renderRentalModalImage();\n            modal.classList.add('is-open');\n            modal.setAttribute('aria-hidden', 'false');\n            document.body.style.overflow = 'hidden';\n        }<\/p>\n<p>        function closeRentalImageModal() {\n            const modal = el('tqs3s-image-modal');\n            const modalImg = el('tqs3s-image-modal-img');\n            if (!modal || !modalImg) return;\n            modal.classList.remove('is-open');\n            modal.setAttribute('aria-hidden', 'true');\n            modalImg.setAttribute('src', '');\n            rentalModalImages = [];\n            rentalModalIndex = 0;\n            document.body.style.overflow = '';\n        }<\/p>\n<p>        function bindRentalImageModal() {\n            const modal = el('tqs3s-image-modal');\n            const modalInner = modal ? modal.querySelector('.tqs3s-image-modal-inner') : null;\n            const modalImg = el('tqs3s-image-modal-img');\n            const closeBtn = el('tqs3s-image-modal-close');\n            const prevBtn = el('tqs3s-image-modal-prev');\n            const nextBtn = el('tqs3s-image-modal-next');\n            if (!modal || modal.dataset.bound === '1') return;<\/p>\n<p>            let touchStartX = 0;\n            let touchStartY = 0;\n            let touchEndX = 0;\n            let touchEndY = 0;<\/p>\n<p>            if (closeBtn) {\n                closeBtn.addEventListener('click', closeRentalImageModal);\n            }\n            if (prevBtn) {\n                prevBtn.addEventListener('click', function(e){ e.stopPropagation(); stepRentalModalImage(-1); });\n            }\n            if (nextBtn) {\n                nextBtn.addEventListener('click', function(e){ e.stopPropagation(); stepRentalModalImage(1); });\n            }<\/p>\n<p>            modal.addEventListener('click', function(e){\n                if (e.target === modal) closeRentalImageModal();\n            });<\/p>\n<p>            document.addEventListener('keydown', function(e){\n                if (!modal.classList.contains('is-open')) return;\n                if (e.key === 'Escape') closeRentalImageModal();\n                if (e.key === 'ArrowLeft') stepRentalModalImage(-1);\n                if (e.key === 'ArrowRight') stepRentalModalImage(1);\n            });<\/p>\n<p>            if (modalInner) {\n                modalInner.addEventListener('touchstart', function(e){\n                    if (!modal.classList.contains('is-open') || !e.touches || !e.touches.length) return;\n                    touchStartX = e.touches[0].clientX;\n                    touchStartY = e.touches[0].clientY;\n                    touchEndX = touchStartX;\n                    touchEndY = touchStartY;\n                }, { passive: true });<\/p>\n<p>                modalInner.addEventListener('touchmove', function(e){\n                    if (!modal.classList.contains('is-open') || !e.touches || !e.touches.length) return;\n                    touchEndX = e.touches[0].clientX;\n                    touchEndY = e.touches[0].clientY;\n                }, { passive: true });<\/p>\n<p>                modalInner.addEventListener('touchend', function(){\n                    if (!modal.classList.contains('is-open') || rentalModalImages.length < 2) return;\n                    const deltaX = touchEndX - touchStartX;\n                    const deltaY = touchEndY - touchStartY;\n                    if (Math.abs(deltaX) > 50 && Math.abs(deltaX) > Math.abs(deltaY)) {\n                        if (deltaX < 0) stepRentalModalImage(1);\n                        else stepRentalModalImage(-1);\n                    }\n                    touchStartX = 0;\n                    touchStartY = 0;\n                    touchEndX = 0;\n                    touchEndY = 0;\n                }, { passive: true });\n            }\n\n            if (modalImg) {\n                modalImg.addEventListener('dragstart', function(e){ e.preventDefault(); });\n            }\n\n            modal.dataset.bound = '1';\n        }\n\n        function getRentalFields() {\n            return {\n                submission_id: rentalSubmissionId || el('tqs3s-rental-submission-id').value,\n                rental_tool: el('tqs3s-rental-tool').value,\n                rental_duration_value: el('tqs3s-rental-duration-value').value,\n                rental_duration_unit: el('tqs3s-rental-duration-unit').value,\n                pickup_method: el('tqs3s-rental-pickup').value,\n                catatan: el('tqs3s-rental-catatan').value,\n                followup_choice: getRentalFollowupChoice(),\n                termin_scheme: el('tqs3s-rental-termin-scheme').value,\n            };\n        }\n        function readyForRentalCalc() {\n            const p = getRentalFields();\n            return !!(rentalSubmissionId &#038;&#038; p.rental_tool &#038;&#038; p.rental_duration_value &#038;&#038; parseFloat(p.rental_duration_value) > 0);\n        }\n        async function triggerRentalCalc() {\n            rentalMsg.textContent = '';\n            if (rentalSubmitted) {\n                el('tqs3s-rental-download').disabled = false;\n                el('tqs3s-rental-submit').disabled = true;\n                return;\n            }\n            if (!readyForRentalCalc()) {\n                lastRentalCalcReady = false;\n                rentalResult.style.display = 'none';\n                el('tqs3s-rental-download').disabled = true;\n                el('tqs3s-rental-submit').disabled = true;\n                return;\n            }\n            const payload = getRentalFields();\n            const formData = new FormData();\n            formData.append('action','tqs3s_calculate_rental');\n            formData.append('nonce',cfg.nonce);\n            Object.keys(payload).forEach((key)=>formData.append(key,payload[key]));\n            const response = await postFormData(formData);\n            if (!response.success) {\n                lastRentalCalcReady = false;\n                rentalResult.style.display = 'none';\n                el('tqs3s-rental-download').disabled = true;\n                el('tqs3s-rental-submit').disabled = true;\n                rentalMsg.textContent = response.data && response.data.message ? response.data.message : 'Gagal menghitung harga sewa alat.';\n                return;\n            }\n            lastRentalCalcReady = true;\n            rentalResult.style.display = 'block';\n            rentalResult.innerHTML = renderSummary(response.data.summary, response.data.total_formatted) + '<\/p>\n<div style=\"margin-top:8px;\">' + escapeHtml(response.data.pickup_note || '') + '<\/div>\n<p>';\n            el('tqs3s-rental-download').disabled = true;\n            el('tqs3s-rental-submit').disabled = false;\n        }<\/p>\n<p>        function resetAllForms() {\n            submissionId = null;\n            rentalSubmissionId = null;\n            lastCalcReady = false;\n            lastRentalCalcReady = false;\n            surveySubmitted = false;\n            rentalSubmitted = false;\n            surveyPdfUrl = '';\n            rentalPdfUrl = '';\n            ['tqs3s-email','tqs3s-nama','tqs3s-nama-pic','tqs3s-no-telp-pic','tqs3s-perusahaan','tqs3s-kabupaten-kota','tqs3s-luasan','tqs3s-catatan','tqs3s-rental-duration-value','tqs3s-rental-catatan'].forEach((id)=>{\n                if (el(id)) el(id).value='';\n            });\n            ['tqs3s-kebutuhan','tqs3s-jenis-pekerjaan','tqs3s-provinsi','tqs3s-equipment','tqs3s-kualitas','tqs3s-target','tqs3s-rental-tool','tqs3s-rental-category','tqs3s-rental-duration-unit','tqs3s-rental-pickup','tqs3s-termin-scheme','tqs3s-rental-termin-scheme'].forEach((id)=>{\n                if (el(id)) el(id).selectedIndex = 0;\n            });\n            if (el('tqs3s-file')) el('tqs3s-file').value = '';\n            if (el('tqs3s-followup')) el('tqs3s-followup').value='cash';\n            if (el('tqs3s-rental-followup')) el('tqs3s-rental-followup').value='cash';\n            updateTerminVisibility(); updateRentalTerminVisibility(); updateEquipmentOptions(); updateQualityDesc(); updateRentalToolOptions(); updateRentalPreview(); bindRentalImageModal();\n            resultBox.style.display='none'; rentalResult.style.display='none';\n            el('tqs3s-download').disabled = true; el('tqs3s-submit').disabled = true;\n            el('tqs3s-rental-download').disabled = true; el('tqs3s-rental-submit').disabled = true;\n            if (el('tqs3s-step2-form-content')) el('tqs3s-step2-form-content').style.display = 'block';\n            if (el('tqs3s-rental-form-content')) el('tqs3s-rental-form-content').style.display = 'block';\n            if (el('tqs3s-submit')) el('tqs3s-submit').style.display = 'inline-flex';\n            if (el('tqs3s-rental-submit')) el('tqs3s-rental-submit').style.display = 'inline-flex';\n            el('tqs3s-step2').style.display='none';\n            el('tqs3s-rental').style.display='none';\n            el('tqs3s-step1').style.display='block';\n        }<\/p>\n<p>        el('tqs3s-next').addEventListener('click', async function() {\n            step1Msg.textContent = '';\n            const kebutuhan = el('tqs3s-kebutuhan').value;\n            const email = el('tqs3s-email').value.trim();\n            const nama = el('tqs3s-nama').value.trim();\n            const namaPic = el('tqs3s-nama-pic').value.trim();\n            const phone = el('tqs3s-no-telp-pic').value.trim();\n            const perusahaan = el('tqs3s-perusahaan').value.trim();\n            if (!email || !nama || !namaPic || !phone || !perusahaan) {\n                step1Msg.textContent = 'Mohon lengkapi semua field data diri.';\n                return;\n            }\n            const formData = new FormData();\n            formData.append('action','tqs3s_save_step1');\n            formData.append('nonce',cfg.nonce);\n            formData.append('kebutuhan',kebutuhan);\n            formData.append('email',email);\n            formData.append('nama',nama);\n            formData.append('nama_pic',namaPic);\n            formData.append('no_telp_pic',phone);\n            formData.append('perusahaan',perusahaan);\n            const response = await postFormData(formData);\n            if (!response.success) {\n                step1Msg.textContent = response.data && response.data.message ? response.data.message : 'Gagal menyimpan data diri.';\n                return;\n            }\n            if (kebutuhan === 'Rental Alat') {\n                rentalSubmissionId = response.data.submission_id;\n                el('tqs3s-rental-submission-id').value = rentalSubmissionId;\n                setRentalSubmittedState(false, '');\n                el('tqs3s-rental').style.display='block';\n                el('tqs3s-step2').style.display='none';\n            } else {\n                submissionId = response.data.submission_id;\n                el('tqs3s-submission-id').value = submissionId;\n                setSurveySubmittedState(false, '');\n                el('tqs3s-step2').style.display='block';\n                el('tqs3s-rental').style.display='none';\n            }\n            el('tqs3s-step1').style.display='none';\n            const sub = document.querySelector('.tqs3s-sub');\n            if (sub) sub.textContent = 'Data diri sudah terisi, silahkan mengisi detail kebutuhan.';\n        });<\/p>\n<p>        ['tqs3s-kabupaten-kota','tqs3s-luasan','tqs3s-target','tqs3s-catatan'].forEach((id)=>el(id).addEventListener('input', triggerLiveCalc));\n        ['tqs3s-jenis-pekerjaan','tqs3s-provinsi','tqs3s-equipment','tqs3s-kualitas'].forEach((id)=>el(id).addEventListener('change', ()=>{ if(id==='tqs3s-jenis-pekerjaan'){ updateEquipmentOptions(); } updateQuantityLabel(); updateQualityDesc(); triggerLiveCalc(); }));\n        el('tqs3s-equipment').addEventListener('change', ()=>{ updateQuantityLabel(); updateQualityDesc(); triggerLiveCalc(); });\n        el('tqs3s-followup').addEventListener('change', ()=>{ updateTerminVisibility(); triggerLiveCalc(); });<\/p>\n<p>        if (el('tqs3s-rental-category')) el('tqs3s-rental-category').addEventListener('change', ()=>{ updateRentalToolOptions(); updateRentalPreview(); triggerRentalCalc(); });\n        ['tqs3s-rental-tool','tqs3s-rental-duration-unit','tqs3s-rental-pickup'].forEach((id)=>el(id).addEventListener('change', ()=>{ updateRentalPreview(); triggerRentalCalc(); }));\n        ['tqs3s-rental-duration-value','tqs3s-rental-catatan'].forEach((id)=>el(id).addEventListener('input', triggerRentalCalc));\n        el('tqs3s-rental-followup').addEventListener('change', ()=>{ updateRentalTerminVisibility(); triggerRentalCalc(); });<\/p>\n<p>        el('tqs3s-download').addEventListener('click', async function() {\n            step2Msg.textContent = '';\n            if (!surveySubmitted || !surveyPdfUrl) { step2Msg.textContent = 'Download quotation akan aktif setelah tombol submit diklik.'; return; }\n            openPdfInNewTab(surveyPdfUrl);\n        });<\/p>\n<p>        el('tqs3s-submit').addEventListener('click', async function() {\n            step2Msg.textContent = '';\n            if (!lastCalcReady) { step2Msg.textContent = 'Lengkapi form detail survey terlebih dahulu.'; return; }\n            const file = el('tqs3s-file').files[0];\n            if (file && file.size > 2*1024*1024) { step2Msg.textContent = 'Ukuran file maksimum 2 MB.'; return; }\n            const formData = new FormData();\n            formData.append('action','tqs3s_submit_quote');\n            formData.append('nonce',cfg.nonce);\n            Object.entries(getStep2Fields()).forEach(([k,v])=>formData.append(k,v));\n            if (file) formData.append('supporting_pdf', file);\n            const response = await postFormData(formData);\n            if (!response.success) { step2Msg.textContent = response.data && response.data.message ? response.data.message : 'Gagal mengirim quotation.'; return; }\n            step2Msg.style.color = '#027a48';\n            step2Msg.textContent = response.data && response.data.message ? response.data.message : 'Terima kasih form sudah tersubmit! Cek email anda dan admin akan segera mengirimkan pesan!';\n            setSurveySubmittedState(true, response.data && response.data.pdf_url ? response.data.pdf_url : '');\n        });<\/p>\n<p>        async function handleRentalDownload() {\n            rentalMsg.textContent = '';\n            if (!rentalSubmitted || !rentalPdfUrl) { rentalMsg.textContent = 'Download quotation akan aktif setelah tombol submit diklik.'; return; }\n            openPdfInNewTab(rentalPdfUrl);\n        }\n        async function handleRentalSubmit() {\n            rentalMsg.textContent = '';\n            if (!lastRentalCalcReady) { rentalMsg.textContent = 'Lengkapi form sewa alat terlebih dahulu.'; return; }\n            const formData = new FormData();\n            formData.append('action','tqs3s_submit_quote');\n            formData.append('nonce',cfg.nonce);\n            formData.append('kebutuhan','Rental Alat');\n            Object.entries(getRentalFields()).forEach(([k,v])=>formData.append(k,v));\n            const response = await postFormData(formData);\n            if (!response.success) { rentalMsg.textContent = response.data && response.data.message ? response.data.message : 'Gagal mengirim quotation.'; return; }\n            rentalMsg.style.color = '#027a48';\n            rentalMsg.textContent = response.data && response.data.message ? response.data.message : 'Terima kasih form sudah tersubmit! Cek email anda dan admin akan segera mengirimkan pesan!';\n            setRentalSubmittedState(true, response.data && response.data.pdf_url ? response.data.pdf_url : '');\n        }\n        el('tqs3s-rental-download').addEventListener('click', handleRentalDownload);\n        el('tqs3s-rental-submit').addEventListener('click', handleRentalSubmit);<\/p>\n<p>        updateTerminVisibility(); updateRentalTerminVisibility(); updateEquipmentOptions(); updateQualityDesc(); updateRentalToolOptions(); updateRentalPreview(); bindRentalImageModal();\n    })();\n    <\/script><\/p>\n\n<p>\u00a0<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u00a0<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"enabled","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-2290","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/surabayasurveysolution.com\/index.php\/wp-json\/wp\/v2\/pages\/2290","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/surabayasurveysolution.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/surabayasurveysolution.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/surabayasurveysolution.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/surabayasurveysolution.com\/index.php\/wp-json\/wp\/v2\/comments?post=2290"}],"version-history":[{"count":4,"href":"https:\/\/surabayasurveysolution.com\/index.php\/wp-json\/wp\/v2\/pages\/2290\/revisions"}],"predecessor-version":[{"id":2332,"href":"https:\/\/surabayasurveysolution.com\/index.php\/wp-json\/wp\/v2\/pages\/2290\/revisions\/2332"}],"wp:attachment":[{"href":"https:\/\/surabayasurveysolution.com\/index.php\/wp-json\/wp\/v2\/media?parent=2290"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}