(function(){var d=document.documentElement;d.classList.add(‘riem-js’);var l=null;try{l=localStorage.getItem(‘riem-lang’)}catch(e){} if(!l)l=(navigator.language||’en’).toLowerCase().indexOf(‘id’)===0?’id’:’en’;d.setAttribute(‘data-lang’,l); window.RIEM_READY=function(f){if(document.readyState===’loading’)document.addEventListener(‘DOMContentLoaded’,f);else f();}; function vw(){d.style.setProperty(‘–riem-vw’,d.clientWidth+’px’);}vw();window.addEventListener(‘resize’,vw); window.addEventListener(‘load’,function(){vw();if(!window.RIEM)d.classList.remove(‘riem-js’);});})(); #riem :where(*),#riem :where(*)::before,#riem :where(*)::after{all:revert} html:not(.riem-js) #riem [lang=”id”]{display:none!important} body.admin-bar #riem .site-header{top:32px} @media (max-width:782px){body.admin-bar #riem .site-header{top:46px}} @media (max-width:600px){body.admin-bar #riem .site-header{top:0}} #riem{ –navy:#0a2351; –navy-2:#0f3170; –itb:#00479d; –cyan:#1aa7e0; –green:#5cb847; –gold:#f2b705; –ink:#16233b; –muted:#5a6a85; –line:#e3e9f3; –bg:#f5f8fd; –white:#fff; –c-energy:#e8a317; –c-material:#7a5cc0; –c-manufacturing:#0e9f9a; –c-transport:#d9423e; –c-aero:#1e88e5; –c-hr:#3f9f4a; –radius:16px; –shadow:0 10px 30px rgba(10,35,81,.10); –shadow-lg:0 24px 60px rgba(10,35,81,.18); –maxw:1220px; } #riem *{box-sizing:border-box} #riem{scroll-behavior:smooth} #riem{margin:0;font-family:”Inter”,”Segoe UI”,system-ui,-apple-system,Roboto,Arial,sans-serif;color:var(–ink);background:#fff;line-height:1.65;font-size:16px;-webkit-font-smoothing:antialiased} #riem img{max-width:100%;display:block} #riem a{color:var(–itb);text-decoration:none} #riem a:hover{text-decoration:underline} #riem h1,#riem h2,#riem h3,#riem h4{font-family:”Poppins”,”Inter”,”Segoe UI”,sans-serif;line-height:1.2;margin:0 0 .6em;color:var(–navy)} #riem h1{font-size:clamp(32px,4.6vw,54.4px);font-weight:700} #riem h2{font-size:clamp(24.8px,3vw,37.6px);font-weight:700} #riem h3{font-size:19.2px;font-weight:600} #riem p{margin:0 0 1em} #riem .container{max-width:var(–maxw);margin:0 auto;padding:0 24px} html[data-lang=”en”] #riem [lang=”id”]{display:none!important} html[data-lang=”id”] #riem [lang=”en”]{display:none!important} #riem .topbar{background:#061a3d;color:#c9d7f0;font-size:13.12px} #riem .topbar .container{display:flex;justify-content:space-between;align-items:center;gap:16px;padding-top:7px;padding-bottom:7px;flex-wrap:wrap} #riem .topbar a{color:#c9d7f0} #riem .topbar .tb-left{display:flex;gap:22px;flex-wrap:wrap} #riem .lang-switch{display:inline-flex;border:1px solid rgba(255,255,255,.3);border-radius:999px;overflow:hidden} #riem .lang-switch button{background:transparent;color:#c9d7f0;border:0;padding:3px 14px;font-weight:600;cursor:pointer;font-size:12.48px;letter-spacing:.04em} #riem .lang-switch button.active{background:var(–gold);color:#1b2b4d} #riem .site-header{position:sticky;top:0;z-index:50;background:linear-gradient(100deg,var(–navy) 0%,var(–navy-2) 100%);box-shadow:0 4px 18px rgba(0,0,0,.2)} #riem .site-header .container{display:flex;align-items:center;justify-content:space-between;gap:20px;min-height:72px} #riem .brand{display:flex;align-items:center;gap:16px} #riem .brand img.l1{height:46px;width:auto} #riem .brand img.l2{height:36px;width:auto;padding-left:16px;border-left:1px solid rgba(255,255,255,.3)} #riem .nav{display:flex;align-items:center;gap:4px} #riem .nav>a,#riem .nav .dd>button{color:#e6eefc;font-weight:500;font-size:14.72px;padding:10px 12px;border-radius:8px;background:none;border:0;cursor:pointer;font-family:inherit;text-decoration:none;display:inline-flex;align-items:center;gap:6px} #riem .nav>a:hover,#riem .nav .dd>button:hover,#riem .nav>a.active,#riem .nav .dd.active>button{background:rgba(255,255,255,.12);color:#fff;text-decoration:none} #riem .nav>a.active{box-shadow:inset 0 -3px 0 var(–gold)} #riem .nav .dd{position:relative} #riem .nav .dd-menu{position:absolute;right:0;top:100%;min-width:260px;background:#fff;border-radius:12px;box-shadow:var(–shadow-lg);padding:8px;display:none} #riem .nav .dd:hover .dd-menu,#riem .nav .dd.open .dd-menu{display:block} #riem .nav .dd-menu a{display:block;color:var(–ink);padding:10px 14px;border-radius:8px;font-size:14.72px} #riem .nav .dd-menu a:hover{background:var(–bg);text-decoration:none} #riem .nav .dd-menu small{display:block;color:var(–muted);font-size:12.48px} #riem .btn{display:inline-flex;align-items:center;gap:8px;padding:12px 24px;border-radius:999px;font-weight:600;font-size:15.2px;border:2px solid transparent;cursor:pointer;transition:.2s;font-family:inherit;text-decoration:none!important} #riem .btn-gold{background:var(–gold);color:#1b2b4d} #riem .btn-gold:hover{background:#ffc928;transform:translateY(-2px);box-shadow:0 8px 20px rgba(242,183,5,.4)} #riem .btn-primary{background:var(–itb);color:#fff} #riem .btn-primary:hover{background:var(–navy-2);transform:translateY(-2px)} #riem .btn-ghost{border-color:rgba(255,255,255,.6);color:#fff} #riem .btn-ghost:hover{background:rgba(255,255,255,.15)} #riem .btn-outline{border-color:var(–itb);color:var(–itb);background:#fff} #riem .btn-outline:hover{background:var(–itb);color:#fff} #riem .btn-sm{padding:8px 16px;font-size:13.6px} #riem .burger{display:none;background:none;border:0;color:#fff;font-size:27.2px;cursor:pointer} #riem .hero{position:relative;color:#fff;overflow:hidden;background:var(–navy)} #riem .hero .bg{position:absolute;inset:0;background-size:cover;background-position:center;opacity:.5;transform:scale(1.04);animation:riem-kb 24s ease-in-out infinite alternate} @keyframes riem-kb{to{transform:scale(1.12)}} #riem .hero::before{content:””;position:absolute;inset:0;background:linear-gradient(105deg,rgba(6,26,61,.96) 8%,rgba(10,35,81,.78) 52%,rgba(0,71,157,.35) 100%);z-index:1} #riem .hero .container{position:relative;z-index:2;padding-top:96px;padding-bottom:110px} #riem .hero h1{color:#fff;max-width:880px} #riem .hero h1 em{font-style:normal;color:var(–gold)} #riem .hero .lead{font-size:19.2px;max-width:740px;color:#d8e4fa} #riem .eyebrow{display:inline-block;font-size:12.8px;letter-spacing:.16em;text-transform:uppercase;font-weight:700;color:var(–cyan);margin-bottom:12px} #riem .hero .eyebrow{color:var(–gold)} #riem .hero-cta{display:flex;gap:14px;flex-wrap:wrap;margin-top:30px} #riem .dots{position:absolute;right:-60px;bottom:-60px;width:380px;opacity:.14;z-index:1} #riem .page-hero{position:relative;color:#fff;background:var(–navy);overflow:hidden} #riem .page-hero .bg{position:absolute;inset:0;background-size:cover;background-position:center;opacity:.35} #riem .page-hero::before{content:””;position:absolute;inset:0;background:linear-gradient(100deg,rgba(6,26,61,.95),rgba(0,71,157,.6));z-index:1} #riem .page-hero .container{position:relative;z-index:2;padding-top:64px;padding-bottom:64px} #riem .page-hero h1{color:#fff;font-size:clamp(30.4px,4vw,44.8px);margin-bottom:.3em} #riem .page-hero p{color:#d8e4fa;max-width:760px;font-size:17.6px;margin:0} #riem .crumbs{font-size:13.6px;color:#a9bde0;margin-bottom:10px} #riem .crumbs a{color:#a9bde0} #riem .stats{position:relative;z-index:5;margin-top:-62px} #riem .stats-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:0;background:#fff;border-radius:20px;box-shadow:var(–shadow-lg);overflow:hidden} @media (max-width:1020px){#riem .stats-grid{grid-template-columns:repeat(3,1fr)} #riem .stat{border-bottom:1px solid var(–line)} } @media (max-width:520px){#riem .stats-grid{grid-template-columns:repeat(2,1fr)} } #riem .stat{padding:28px 22px;text-align:center;border-right:1px solid var(–line)} #riem .stat:last-child{border-right:0} #riem .stat b{display:block;font-family:”Poppins”,sans-serif;font-size:35.2px;color:var(–itb);line-height:1.1} #riem .stat span{font-size:14.08px;color:var(–muted)} #riem section.sec{padding:84px 0} #riem section.alt{background:var(–bg)} #riem section.dark{background:linear-gradient(120deg,var(–navy),var(–navy-2));color:#dbe6fb} #riem section.dark h2,#riem section.dark h3{color:#fff} #riem .sec-head{max-width:760px;margin-bottom:44px} #riem .sec-head.center{margin-left:auto;margin-right:auto;text-align:center} #riem .sec-head p{color:var(–muted);font-size:16.96px} #riem .dark .sec-head p{color:#b9cbec} #riem .grid{display:grid;gap:26px} #riem .g2{grid-template-columns:repeat(auto-fit,minmax(420px,1fr))} #riem .g3{grid-template-columns:repeat(auto-fit,minmax(290px,1fr))} #riem .g4{grid-template-columns:repeat(auto-fit,minmax(230px,1fr))} #riem .split{display:grid;grid-template-columns:1.05fr .95fr;gap:56px;align-items:center} #riem .split.rev{grid-template-columns:.95fr 1.05fr} #riem .rounded{border-radius:var(–radius);box-shadow:var(–shadow)} #riem .card{background:#fff;border:1px solid var(–line);border-radius:var(–radius);padding:26px;transition:.25s;position:relative;height:100%} #riem .card:hover{transform:translateY(-6px);box-shadow:var(–shadow-lg);border-color:transparent} #riem .card .ico{width:54px;height:54px;border-radius:14px;background:linear-gradient(135deg,var(–itb),var(–cyan));display:grid;place-items:center;margin-bottom:16px} #riem .card .ico img{width:30px;height:30px;object-fit:contain} #riem .card .ico.emoji{font-size:24px} #riem .card p{color:var(–muted);margin:0} #riem .card ul{margin:.6em 0 0;padding-left:18px;color:var(–muted)} #riem .card ul li{margin:.2em 0} #riem .div-card{border-radius:var(–radius);overflow:hidden;background:#fff;border:1px solid var(–line);display:flex;flex-direction:column;transition:.25s;height:100%} #riem .div-card:hover{transform:translateY(-6px);box-shadow:var(–shadow-lg)} #riem .div-card .ph{height:190px;background-size:cover;background-position:center;position:relative} #riem .div-card .ph::after{content:””;position:absolute;left:0;right:0;bottom:0;height:5px;background:var(–dc,var(–itb))} #riem .div-card .body{padding:22px;flex:1;display:flex;flex-direction:column} #riem .div-card h3{margin-bottom:.35em} #riem .div-card p{color:var(–muted);font-size:15.2px;flex:1} #riem .div-card .more{font-weight:600;font-size:14.4px} #riem .tag{display:inline-block;font-size:11.52px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;padding:3px 10px;border-radius:999px;background:var(–dc,var(–itb));color:#fff} #riem .dv-energy{–dc:var(–c-energy)} #riem .dv-material{–dc:var(–c-material)} #riem .dv-manufacturing{–dc:var(–c-manufacturing)} #riem .dv-transport{–dc:var(–c-transport)} #riem .dv-aero{–dc:var(–c-aero)} #riem .dv-hr{–dc:var(–c-hr)} #riem .svc{display:flex;gap:18px;align-items:flex-start} #riem .svc .n{font-family:”Poppins”,sans-serif;font-weight:700;font-size:35.2px;color:var(–gold);line-height:1;min-width:52px} #riem .steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:18px;counter-reset:s} #riem .step{background:#fff;border:1px solid var(–line);border-radius:var(–radius);padding:24px 20px 22px;position:relative} #riem .step::before{counter-increment:s;content:counter(s);position:absolute;top:-16px;left:20px;background:var(–gold);color:#1b2b4d;width:34px;height:34px;border-radius:50%;display:grid;place-items:center;font-weight:700;font-family:”Poppins”} #riem .step h4{margin:.5em 0 .3em;font-size:16px} #riem .step p{font-size:14.4px;color:var(–muted);margin:0} #riem .step small{display:block;margin-top:8px;color:var(–itb);font-weight:600} #riem .timeline{position:relative;padding-left:30px;border-left:3px solid var(–cyan)} #riem .tl-item{position:relative;margin-bottom:26px} #riem .tl-item::before{content:””;position:absolute;left:-40px;top:6px;width:16px;height:16px;border-radius:50%;background:var(–gold);border:3px solid #fff;box-shadow:0 0 0 3px var(–cyan)} #riem .tl-item b{font-family:”Poppins”;color:var(–itb);font-size:18.4px} #riem .logo-wall{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:16px} #riem .logo-wall .lg{background:#fff;border:1px solid var(–line);border-radius:14px;height:96px;display:grid;place-items:center;padding:14px;transition:.2s} #riem .logo-wall .lg:hover{box-shadow:var(–shadow);transform:translateY(-3px)} #riem .logo-wall img{max-height:66px;max-width:100%;object-fit:contain} #riem .marquee{overflow:hidden;mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)} #riem .marquee-track{display:flex;gap:18px;width:max-content;animation:riem-mq 50s linear infinite} #riem .marquee:hover .marquee-track{animation-play-state:paused} #riem .marquee .lg{width:170px;height:92px;flex:none;background:#fff;border:1px solid var(–line);border-radius:14px;display:grid;place-items:center;padding:14px} #riem .marquee img{max-height:62px;max-width:100%;object-fit:contain} @keyframes riem-mq{to{transform:translateX(-50%)}} #riem .person{text-align:center} #riem .person .pic{width:170px;height:170px;border-radius:50%;margin:0 auto 14px;background:linear-gradient(160deg,var(–cyan),var(–itb));overflow:hidden;display:flex;align-items:flex-end;justify-content:center;box-shadow:var(–shadow)} #riem .person .pic img{height:118%;width:auto;max-width:none;object-fit:cover;object-position:top} #riem .person h4{margin:0;font-size:16px} #riem .person small{color:var(–muted);display:block;font-size:13.44px} #riem .person .role{color:var(–itb);font-weight:600;font-size:13.12px;margin-bottom:4px;display:block} #riem .head-box{display:grid;grid-template-columns:260px 1fr;gap:34px;align-items:center;background:#fff;border-radius:22px;box-shadow:var(–shadow);padding:34px;border:1px solid var(–line)} #riem .head-box .pic{background:linear-gradient(160deg,var(–cyan),var(–itb));border-radius:20px;overflow:hidden;height:340px;display:flex;align-items:flex-end;justify-content:center} #riem .head-box .pic img{height:105%;width:auto} #riem .quote{border-left:5px solid var(–gold);padding-left:18px;font-style:italic;color:var(–navy)} #riem .chips{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:26px} #riem .chip{border:1.5px solid var(–line);background:#fff;color:var(–ink);padding:8px 16px;border-radius:999px;cursor:pointer;font-weight:600;font-size:14.08px;font-family:inherit;transition:.2s} #riem .chip:hover{border-color:var(–itb);color:var(–itb)} #riem .chip.active{background:var(–itb);border-color:var(–itb);color:#fff} #riem .search{width:100%;max-width:420px;padding:12px 18px;border:1.5px solid var(–line);border-radius:999px;font:inherit;background:#fff} #riem .search:focus{outline:none;border-color:var(–itb);box-shadow:0 0 0 4px rgba(0,71,157,.12)} #riem .toolbar{display:flex;gap:16px;flex-wrap:wrap;align-items:center;margin-bottom:22px} #riem .toolbar select{padding:11px 16px;border:1.5px solid var(–line);border-radius:999px;font:inherit;background:#fff} #riem .count{color:var(–muted);font-size:14.72px} #riem .proj{background:#fff;border:1px solid var(–line);border-left:5px solid var(–dc,var(–itb));border-radius:12px;padding:18px 20px;display:flex;flex-direction:column;gap:6px;transition:.2s;height:100%} #riem .proj:hover{box-shadow:var(–shadow);transform:translateY(-3px)} #riem .proj h4{font-size:15.68px;margin:0;line-height:1.4} #riem .proj .meta{display:flex;flex-wrap:wrap;gap:8px;align-items:center;font-size:12.8px;color:var(–muted)} #riem .pill{display:inline-block;padding:2px 10px;border-radius:999px;font-size:11.52px;font-weight:700;background:#e8f0fb;color:var(–itb)} #riem .pill.done{background:#e3f6e8;color:#1b7a34} #riem .pill.run{background:#fff3d6;color:#8a6200} #riem .case{background:#fff;border-radius:var(–radius);overflow:hidden;border:1px solid var(–line);box-shadow:var(–shadow);display:flex;flex-direction:column} #riem .case .ph{height:220px;background-size:cover;background-position:center} #riem .case .bd{padding:24px} #riem .case h3{font-size:17.6px} #riem .case dl{margin:0} #riem .case dt{font-weight:700;color:var(–itb);font-size:12.48px;letter-spacing:.1em;text-transform:uppercase;margin-top:10px} #riem .case dd{margin:2px 0 0;color:var(–muted);font-size:14.88px} #riem .table-wrap{overflow:auto;border-radius:var(–radius);border:1px solid var(–line);background:#fff} #riem table.tbl{width:100%;border-collapse:collapse;min-width:640px} #riem .tbl th{background:var(–navy);color:#fff;text-align:left;padding:12px 16px;font-size:13.6px} #riem .tbl td{padding:12px 16px;border-top:1px solid var(–line);font-size:14.72px;vertical-align:top} #riem .tbl tr:hover td{background:#f8fbff} #riem .trl{display:inline-block;background:linear-gradient(90deg,#f2b705,#5cb847);color:#102;font-weight:700;border-radius:999px;padding:2px 12px;font-size:12.8px} #riem .lec{background:#fff;border:1px solid var(–line);border-radius:14px;padding:18px;display:flex;gap:14px;transition:.2s;height:100%;border-top:4px solid var(–dc,var(–itb))} #riem .lec:hover{box-shadow:var(–shadow);transform:translateY(-3px)} #riem .lec .av{flex:none;width:52px;height:52px;border-radius:50%;background:var(–dc,var(–itb));color:#fff;display:grid;place-items:center;font-weight:700;font-family:”Poppins”} #riem .lec h4{margin:0 0 2px;font-size:15.68px;line-height:1.3} #riem .lec .rk{font-size:12.48px;color:var(–muted)} #riem .lec ul{margin:8px 0 8px;padding-left:16px;font-size:12.8px;color:var(–muted)} #riem .lec .mx{display:flex;gap:12px;font-size:12.16px;color:var(–muted);margin-bottom:8px;flex-wrap:wrap} #riem .lec .mx b{color:var(–navy)} #riem .lec a.lnk{font-size:13.12px;font-weight:600} #riem .form-card{background:#fff;border:1px solid var(–line);border-radius:22px;box-shadow:var(–shadow);padding:36px} #riem .fs{border:0;padding:0;margin:0 0 34px} #riem .fs legend{font-family:”Poppins”;font-weight:600;font-size:18.4px;color:var(–navy);padding:0 0 10px;margin-bottom:14px;border-bottom:2px solid var(–gold);width:100%} #riem .fgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:18px 22px} #riem .fgrid .full{grid-column:1/-1} #riem .fld label.lb{display:block;font-weight:600;font-size:14.4px;margin-bottom:6px;color:var(–navy)} #riem .fld .req{color:#d9423e} #riem .fld .hint{font-size:12.48px;color:var(–muted);margin-top:4px} #riem .fld input[type=text],#riem .fld input[type=email],#riem .fld input[type=tel],#riem .fld input[type=date],#riem .fld input[type=number],#riem .fld input[type=url],#riem .fld select,#riem .fld textarea{width:100%;padding:12px 14px;border:1.5px solid #cfd9ea;border-radius:10px;font:inherit;background:#fbfdff;transition:.15s} #riem .fld textarea{min-height:110px;resize:vertical} #riem .fld input:focus,#riem .fld select:focus,#riem .fld textarea:focus{outline:none;border-color:var(–itb);box-shadow:0 0 0 4px rgba(0,71,157,.12);background:#fff} #riem .fld.err input,#riem .fld.err select,#riem .fld.err textarea{border-color:#d9423e} #riem .fld .emsg{color:#d9423e;font-size:12.48px;display:none;margin-top:4px} #riem .fld.err .emsg{display:block} #riem .opts{display:flex;flex-wrap:wrap;gap:10px} #riem .opt{display:flex;align-items:center;gap:8px;padding:9px 14px;border:1.5px solid #cfd9ea;border-radius:10px;background:#fbfdff;cursor:pointer;font-size:14.4px;transition:.15s} #riem .opt:hover{border-color:var(–itb)} #riem .opt input{accent-color:var(–itb)} #riem .opt:has(input:checked){background:#e8f0fb;border-color:var(–itb)} #riem .rate-table{width:100%;border-collapse:collapse;margin-top:6px} #riem .rate-table th{font-size:12.48px;text-align:center;color:var(–muted);padding:6px 8px;font-weight:600} #riem .rate-table td{padding:10px 8px;border-top:1px solid var(–line);font-size:14.72px} #riem .rate-table td.c{text-align:center;width:120px} #riem .rate-table input{accent-color:var(–itb);width:18px;height:18px} #riem .rate-group{background:#f7faff;border:1px solid var(–line);border-radius:14px;padding:16px 20px;margin-bottom:18px} #riem .rate-group h4{margin:0 0 4px;font-size:16px} #riem .stars{display:flex;flex-direction:row-reverse;justify-content:flex-end;gap:4px} #riem .stars input{display:none} #riem .stars label{font-size:32px;color:#cfd9ea;cursor:pointer;transition:.15s;line-height:1} #riem .stars input:checked~label,#riem .stars label:hover,#riem .stars label:hover~label{color:var(–gold)} #riem .nps{display:grid;grid-template-columns:repeat(11,1fr);gap:6px} #riem .nps label{display:block;text-align:center;padding:10px 0;border:1.5px solid #cfd9ea;border-radius:8px;cursor:pointer;font-weight:600;font-size:14.08px} #riem .nps input{display:none} #riem .nps input:checked+span{background:var(–itb);color:#fff} #riem .nps label span{display:block;border-radius:6px;padding:10px 0;margin:-10px 0} #riem .form-actions{display:flex;gap:14px;flex-wrap:wrap;align-items:center;margin-top:10px} #riem .notice{background:#eef6ff;border:1px solid #cfe2fb;border-radius:12px;padding:14px 18px;color:#24456f;font-size:14.4px} #riem .notice.ok{background:#e9f8ee;border-color:#bfe8cb;color:#1b6a33} #riem .result{display:none;margin-top:26px} #riem .result.show{display:block} #riem .result pre{background:#0d1b3a;color:#cfe0ff;padding:18px;border-radius:12px;overflow:auto;max-height:360px;font-size:13.12px;white-space:pre-wrap} #riem .cta-band{background:linear-gradient(110deg,var(–itb),var(–navy));color:#fff;border-radius:26px;padding:54px;display:flex;justify-content:space-between;align-items:center;gap:30px;flex-wrap:wrap;position:relative;overflow:hidden} #riem .cta-band h2{color:#fff;margin-bottom:.2em} #riem .cta-band p{color:#d6e4ff;margin:0;max-width:620px} #riem .cta-band::after{content:””;position:absolute;right:-80px;top:-80px;width:300px;height:300px;border-radius:50%;background:rgba(255,255,255,.07)} #riem .gallery{display:grid;grid-template-columns:repeat(4,1fr);grid-auto-rows:170px;gap:12px} #riem .gallery div{background-size:cover;background-position:center;border-radius:12px;transition:.3s;position:relative;overflow:hidden} #riem .gallery div:hover{transform:scale(1.03);z-index:2;box-shadow:var(–shadow-lg)} #riem .gallery .w2{grid-column:span 2} #riem .gallery .h2{grid-row:span 2} #riem .gallery span{position:absolute;left:0;right:0;bottom:0;background:linear-gradient(transparent,rgba(6,26,61,.85));color:#fff;font-size:12.8px;padding:24px 12px 8px;opacity:0;transition:.25s} #riem .gallery div:hover span{opacity:1} #riem .list-check{list-style:none;padding:0;margin:0} #riem .list-check li{padding-left:30px;position:relative;margin:.55em 0} #riem .list-check li::before{content:”✓”;position:absolute;left:0;top:0;width:22px;height:22px;border-radius:50%;background:var(–green);color:#fff;font-size:12px;display:grid;place-items:center;font-weight:700} #riem .badge-row{display:flex;gap:12px;flex-wrap:wrap} #riem .badge{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.25);padding:8px 16px;border-radius:999px;font-weight:600;font-size:14.08px} #riem .contact-box{display:flex;gap:14px;align-items:flex-start;margin-bottom:20px} #riem .contact-box .ci{width:48px;height:48px;border-radius:50%;background:var(–itb);display:grid;place-items:center;flex:none} #riem .contact-box .ci img{width:24px} #riem .contact-box b{display:block;color:var(–navy)} #riem .map{border:0;width:100%;height:380px;border-radius:var(–radius);box-shadow:var(–shadow)} #riem .faq details{background:#fff;border:1px solid var(–line);border-radius:12px;padding:16px 20px;margin-bottom:12px} #riem .faq summary{font-weight:600;cursor:pointer;color:var(–navy)} #riem .faq details[open]{box-shadow:var(–shadow)} #riem .faq details p{margin:.8em 0 0;color:var(–muted)} #riem .footer{background:#061a3d;color:#aab9d6;padding:64px 0 0;font-size:14.72px} #riem .footer h4{color:#fff;font-size:16px;margin-bottom:14px} #riem .footer a{color:#aab9d6} #riem .footer a:hover{color:#fff} #riem .footer .cols{display:grid;grid-template-columns:1.6fr 1fr 1fr 1.2fr;gap:40px} #riem .footer ul{list-style:none;padding:0;margin:0} #riem .footer li{margin:.5em 0} #riem .footer .flogos{display:flex;gap:16px;align-items:center;margin-bottom:16px} #riem .footer .flogos img{height:44px} #riem .footer .copy{border-top:1px solid rgba(255,255,255,.12);margin-top:44px;padding:18px 0;font-size:13.12px;display:flex;justify-content:space-between;flex-wrap:wrap;gap:10px} #riem .to-top{position:fixed;right:22px;bottom:22px;width:46px;height:46px;border-radius:50%;background:var(–gold);color:#1b2b4d;border:0;font-size:19.2px;cursor:pointer;box-shadow:var(–shadow-lg);opacity:0;pointer-events:none;transition:.3s;z-index:60} #riem .to-top.show{opacity:1;pointer-events:auto} html.riem-js #riem .rv{opacity:0;transform:translateY(26px);transition:opacity .7s ease,transform .7s ease} html.riem-js #riem .rv.in{opacity:1;transform:none} @media (prefers-reduced-motion:reduce){html.riem-js #riem .rv{opacity:1;transform:none;transition:none} #riem .hero .bg,#riem .marquee-track{animation:none} } @media (max-width:1020px){#riem .nav{display:none;position:absolute;left:0;right:0;top:100%;background:var(–navy);flex-direction:column;align-items:stretch;padding:12px 20px 20px;box-shadow:0 18px 30px rgba(0,0,0,.3)} #riem .nav.open{display:flex} #riem .nav .dd-menu{position:static;display:block;background:transparent;box-shadow:none;padding:0 0 0 14px} #riem .nav .dd-menu a{color:#cfdcf5} #riem .nav .dd-menu a:hover{background:rgba(255,255,255,.1)} #riem .nav .dd-menu small{color:#92a7cf} #riem .burger{display:block} #riem .split,#riem .split.rev{grid-template-columns:1fr;gap:30px} #riem .head-box{grid-template-columns:1fr} #riem .footer .cols{grid-template-columns:1fr 1fr} #riem .g2{grid-template-columns:1fr} #riem .gallery{grid-template-columns:repeat(2,1fr)} } @media (max-width:640px){#riem .fgrid{grid-template-columns:1fr} #riem section.sec{padding:60px 0} #riem .brand img.l2{display:none} #riem .footer .cols{grid-template-columns:1fr} #riem .nps{grid-template-columns:repeat(6,1fr)} #riem .form-card{padding:22px} #riem .cta-band{padding:34px 26px} #riem .stat{border-right:0;border-bottom:1px solid var(–line)} } @media print{#riem .topbar,#riem .site-header,#riem .footer,#riem .to-top,#riem .hero-cta,#riem .form-actions{display:none!important} } #riem{position:relative;width:var(–riem-vw,100vw);max-width:none;margin:0 calc(50% – var(–riem-vw,100vw) / 2);text-align:left} body:has(#riem){overflow-x:clip} @media (max-width:1020px){#riem #form-layout{grid-template-columns:1fr!important} #riem #form-layout aside{position:static!important} }
HomeBeranda / Partner FormsFormulir Mitra

Project Initiation FormFormulir Inisiasi Kerja Sama

Start a collaboration with RIEM2TB FTMD ITB. Tell us about your organization, your engineering need and your plan.Mulai kerja sama dengan RIEM2TB FTMD ITB. Ceritakan organisasi, kebutuhan rekayasa, dan rencana Anda.

/* common.js */ /* RIEM2TB – shared components, language handling, data */ (function () { ‘use strict’; var CFG = { email: ‘kerjasamaftmd@itb.ac.id’, phone: ‘+62 (22) 2504243’, phoneHref: ‘+62222504243’, web: ‘https://ftmd.itb.ac.id’, address: { en: ‘Faculty of Mechanical and Aerospace Engineering, Institut Teknologi Bandung, Jl. Ganesha No. 10, Bandung 40132, West Java, Indonesia’, id: ‘Fakultas Teknik Mesin dan Dirgantara, Institut Teknologi Bandung, Jl. Ganesha No. 10, Bandung 40132, Jawa Barat, Indonesia’ } }; var DIVISIONS = [ { id: ‘energy’, cls: ‘dv-energy’, img: ‘energy-geothermal’, icon: ‘ic-flask’, name: { en: ‘Sustainable Energy’, id: ‘Energi Berkelanjutan’ }, short: { en: ‘Power plant performance, geothermal, biomass and hydrogen co-firing, biofuels, bioavtur and energy systems.’, id: ‘Kinerja pembangkit, panas bumi, co-firing biomassa dan hidrogen, biofuel, bioavtur, dan sistem energi.’ }, lead: { name: ‘Poetro Lebdo Sambegoro, M.Sc., Ph.D.’, photo: ‘team-poetro’ }, points: { en: [‘Geothermal power plant performance test (PTC 46) and training’, ‘Biomass co-firing study in coal-fired power plants’, ‘Hydrogen and natural gas co-firing in gas engine power plants’, ‘Biofuel and bioavtur (SAF) testing, from lab scale to road test’, ‘Power plant thermodynamic, CFD and equipment evaluation, hydropower design criteria’], id: [‘Uji kinerja PLTP (PTC 46) dan pelatihan’, ‘Kajian co-firing biomassa pada PLTU batubara’, ‘Co-firing hidrogen dan gas alam pada pembangkit mesin gas’, ‘Pengujian biofuel dan bioavtur (SAF), dari skala lab hingga uji jalan’, ‘Evaluasi termodinamika, CFD, dan peralatan pembangkit; kriteria desain PLTA’] }, gallery: [‘energy-performance-test’, ‘energy-hydrogen-cofiring’, ‘energy-biomass-dome’, ‘energy-floating-solar’] }, { id: ‘material’, cls: ‘dv-material’, img: ‘mat-foundry’, icon: ‘ic-micro’, name: { en: ‘Materials & Structural Integrity’, id: ‘Material & Integritas Struktur’ }, short: { en: ‘Material identification, failure analysis, fitness for service, advanced materials and industrial product development.’, id: ‘Identifikasi material, analisis kegagalan, fitness for service, material maju, dan pengembangan produk industri.’ }, lead: { name: ‘Dr.Eng. Raden Dadan Ramdan, S.T.’, photo: ‘team-dadan’ }, points: { en: [‘Hundreds of material identification and failure analysis cases across industries’, ‘Fitness-for-service and fracture mechanics of turbine rotors and pressure equipment’, ‘Advanced materials: biomaterials, energy storage materials, nanomaterials’, ‘Corrosion, polymer and composite studies (e.g. HDPE pipe performance)’, ‘Joint industrial product development’], id: [‘Ratusan kasus identifikasi material dan analisis kegagalan di berbagai industri’, ‘Fitness-for-service dan mekanika retak pada rotor turbin dan peralatan bertekanan’, ‘Material maju: biomaterial, material penyimpan energi, nanomaterial’, ‘Studi korosi, polimer, dan komposit (mis. kinerja pipa HDPE)’, ‘Pengembangan produk industri bersama’] }, gallery: [‘mat-lab’, ‘mat-sparks’, ‘mat-prosthetic’, ‘mat-textile’] }, { id: ‘manufacturing’, cls: ‘dv-manufacturing’, img: ‘man-cnc’, icon: ‘ic-gear’, name: { en: ‘Product Development & Manufacturing Technology’, id: ‘Pengembangan Produk & Teknologi Manufaktur’ }, short: { en: ‘Machinery and precision manufacturing, metrology, reverse engineering, industrial automation and Industry 4.0.’, id: ‘Mesin dan manufaktur presisi, metrologi, reverse engineering, otomasi industri, dan Industri 4.0.’ }, lead: { name: ‘Ditho Ardiansyah Pulungan, S.T., M.Sc., Ph.D.’, photo: ‘team-ditho’ }, points: { en: [‘Redesign, machinability and remanufacturing of mechanical components’, ‘Geometric Dimensioning & Tolerancing (GD&T) training’, ‘Measurement and inspection, reverse engineering, NC simulation’, ‘National machine tool technology and industry development’, ‘Industry 4.0 implementation and industrial automation’], id: [‘Redesain, ketermesinan, dan remanufaktur komponen mekanik’, ‘Pelatihan Geometric Dimensioning & Tolerancing (GD&T)’, ‘Pengukuran dan inspeksi, reverse engineering, simulasi NC’, ‘Pengembangan teknologi dan industri mesin perkakas nasional’, ‘Implementasi Industri 4.0 dan otomasi industri’] }, gallery: [‘man-gdt-training’, ‘man-metrology’, ‘man-3d-scan’, ‘man-machining’] }, { id: ‘transport’, cls: ‘dv-transport’, img: ‘rail-lrt’, icon: ‘ic-factory’, name: { en: ‘Sustainable Transportation’, id: ‘Transportasi Berkelanjutan’ }, short: { en: ‘Railway technology: bogie, carbody, crashworthiness, vehicle-track dynamics, NVH and composite interiors.’, id: ‘Teknologi perkeretaapian: bogie, carbody, crashworthiness, dinamika kendaraan-rel, NVH, dan interior komposit.’ }, lead: { name: ‘Yunendar Aryo Handoko, Ph.D.’, photo: ‘team-yunendar’ }, points: { en: [‘Bogie engineering, FE analysis and test rigs (roller rig, yaw and twist test)’, ‘Carbody structural analysis, buckling and crashworthiness’, ‘Rail vehicle dynamic simulation and train aerodynamics’, ‘Noise, vibration and harshness, composite carbody and interior’, ‘Smart manufacturing and Industry 4.0 for rolling stock factories’], id: [‘Rekayasa bogie, analisis elemen hingga, dan alat uji (roller rig, yaw dan twist test)’, ‘Analisis struktur carbody, buckling, dan crashworthiness’, ‘Simulasi dinamika kendaraan rel dan aerodinamika kereta’, ‘Noise, vibration, harshness; carbody dan interior komposit’, ‘Smart manufacturing dan Industri 4.0 untuk pabrik sarana perkeretaapian’] }, gallery: [‘rail-bogie-test’, ‘rail-rollerrig’, ‘rail-krl’, ‘rail-bogie-fea’] }, { id: ‘aero’, cls: ‘dv-aero’, img: ‘aero-n219’, icon: ‘ic-design’, name: { en: ‘Aerospace Technology’, id: ‘Teknologi Dirgantara’ }, short: { en: ‘Aircraft and UAV development, flight safety analytics, aviation operations and airport studies.’, id: ‘Pengembangan pesawat dan UAV, analitik keselamatan penerbangan, operasi penerbangan, dan kajian bandara.’ }, lead: { name: ‘Dr.-Ing. Ir. Javensius Sembiring, S.T., M.T.’, photo: ‘team-javensius’ }, points: { en: [‘Aircraft programs: CN235, CN295, NC212, N219 and N219 Amphibian’, ‘UAV: PUNA Wulung, HALE, micro UAV and confined-space inspection drones’, ‘WiSE (Wing-in-Surface Effect) craft and flight simulators’, ‘Flight data analysis and predictive safety analytics; KNKT investigator support’, ‘Airport and air transport network studies for the Ministry of Transportation’], id: [‘Program pesawat: CN235, CN295, NC212, N219, dan N219 Amfibi’, ‘UAV: PUNA Wulung, HALE, micro UAV, dan drone inspeksi ruang terbatas’, ‘Wahana WiSE (Wing-in-Surface Effect) dan simulator terbang’, ‘Analisis data penerbangan dan analitik keselamatan prediktif; dukungan investigator KNKT’, ‘Kajian bandara dan jaringan transportasi udara untuk Kementerian Perhubungan’] }, gallery: [‘aero-hale’, ‘aero-wise’, ‘aero-drone-inspect’, ‘aero-simulator’] }, { id: ‘hr’, cls: ‘dv-hr’, img: ‘train-class’, icon: ‘ic-train’, name: { en: ‘Human Capital Development & Training’, id: ‘Pengembangan SDM & Pelatihan’ }, short: { en: ‘Public and customized technical training, certified by ITB, delivered by academics and industry professionals.’, id: ‘Pelatihan teknis umum dan khusus (customized) bersertifikat ITB, oleh akademisi dan praktisi industri.’ }, lead: { name: ‘Yohanes Bimo Dwianto, S.T., M.T., Ph.D.’, photo: ‘team-bimo’ }, points: { en: [‘FEA, CFD, failure analysis and predictive maintenance’, ‘Machine learning, system identification, industrial metrology, GD&T’, ‘Geothermal power generation and power plant thermodynamics’, ‘Customized on-site or online programs and thematic workshops’, ‘Official ITB certificate through ICE Center’], id: [‘FEA, CFD, analisis kegagalan, dan predictive maintenance’, ‘Machine learning, system identification, metrologi industri, GD&T’, ‘Pembangkitan panas bumi dan termodinamika pembangkit’, ‘Program customized luring atau daring serta workshop tematik’, ‘Sertifikat resmi ITB melalui ICE Center’] }, gallery: [‘train-class’, ‘train-lab’, ‘train-cnc’, ‘man-gdt-training’] } ]; var PARTNERS = [ [‘p-inka’, ‘PT INKA’], [‘p-kai’, ‘PT KAI’], [‘p-gde’, ‘PT Geo Dipa Energi’], [‘p-ip’, ‘PLN Indonesia Power’], [‘p-plnnp’, ‘PLN Nusantara Power’], [‘p-esdm’, ‘Kementerian ESDM’], [‘p-kemenhub’, ‘Kementerian Perhubungan’], [‘p-bkpm’, ‘Kementerian Investasi/BKPM’], [‘p-gmf’, ‘GMF AeroAsia’], [‘p-badak’, ‘Badak LNG’], [‘p-pertadaya’, ‘Perta Daya Gas’], [‘p-pupukkaltim’, ‘Pupuk Kalimantan Timur’], [‘p-rekayasa’, ‘Rekayasa Engineering’], [‘p-amman’, ‘Amman Mineral’], [‘p-krm’, ‘Krama Yudha Ratu Motor’], [‘p-gs’, ‘GS Battery’], [‘p-danone’, ‘Danone’], [‘p-peruri’, ‘Peruri’], [‘p-ut’, ‘United Tractors’], [‘p-bakerhughes’, ‘Baker Hughes’], [‘p-yokogawa’, ‘Yokogawa’], [‘p-brikasa’, ‘Brikasa’], [‘p-petrochina’, ‘PetroChina’], [‘p-chevron’, ‘Chevron’], [‘p-krakatau’, ‘Krakatau Steel’], [‘p-pusri’, ‘Pusri’], [‘p-vico’, ‘VICO Indonesia’] ]; var RESEARCH_GROUPS = [ { k: ‘dc’, en: ‘Dynamics and Control’, id: ‘Dinamika dan Kendali’ }, { k: ‘fp’, en: ‘Fluid Dynamics and Propulsion’, id: ‘Dinamika Fluida dan Propulsi’ }, { k: ‘th’, en: ‘Thermal Science and Engineering’, id: ‘Ilmu dan Rekayasa Termal’ }, { k: ‘mt’, en: ‘Materials Science and Engineering’, id: ‘Ilmu dan Teknik Material’ }, { k: ‘fo’, en: ‘Flight Mechanics and Operations’, id: ‘Mekanika dan Operasi Terbang’ }, { k: ‘sl’, en: ‘Solid Mechanics and Lightweight Structures’, id: ‘Mekanika Padatan dan Struktur Ringan’ }, { k: ‘dp’, en: ‘Engineering Design and Production’, id: ‘Perancangan Teknik dan Produksi’ } ]; var NAV = [ { href: ‘/riem2tb/’, en: ‘Home’, id: ‘Beranda’ }, { href: ‘/riem2tb/about/’, en: ‘About’, id: ‘Tentang’ }, { href: ‘/riem2tb/expertise/’, en: ‘Expertise’, id: ‘Kepakaran’ }, { href: ‘/riem2tb/services/’, en: ‘Services’, id: ‘Layanan’ }, { href: ‘/riem2tb/portfolio/’, en: ‘Portfolio’, id: ‘Portofolio’ }, { href: ‘/riem2tb/lecturers/’, en: ‘Experts’, id: ‘Dosen & Pakar’ }, { dd: true, en: ‘Partner Forms’, id: ‘Formulir Mitra’, items: [ { href: ‘/riem2tb/partner/’, en: ‘Project Initiation Form’, id: ‘Formulir Inisiasi Kerja Sama’, sen: ‘For new partners and new projects’, sid: ‘Untuk mitra dan proyek baru’ }, { href: ‘/riem2tb/assessment/’, en: ‘Project Assessment Form’, id: ‘Formulir Penilaian Proyek’, sen: ‘After the project is finished’, sid: ‘Setelah proyek selesai’ } ] }, { href: ‘/riem2tb/contact/’, en: ‘Contact’, id: ‘Kontak’ } ]; function T(en, id) { return ‘‘ + en + ‘‘ + id + ‘‘; } function esc(s) { return String(s == null ? ” : s).replace(/[&”‘]/g, function (c) { return { ‘&’: ‘&’, ”: ‘>’, ‘”‘: ‘"’, “‘”: ‘'’ }[c]; }); } /* language */ function getLang() { return document.documentElement.getAttribute(‘data-lang’) || ‘en’; } function setLang(l) { document.documentElement.setAttribute(‘data-lang’, l); document.documentElement.setAttribute(‘lang’, l); try { localStorage.setItem(‘riem-lang’, l); } catch (e) {} document.querySelectorAll(‘#riem .lang-switch button’).forEach(function (b) { b.classList.toggle(‘active’, b.dataset.l === l); }); document.querySelectorAll(‘[data-ph-en]’).forEach(function (el) { el.setAttribute(‘placeholder’, el.getAttribute(‘data-ph-‘ + l)); }); var t = document.querySelector(‘meta[name=”title-‘ + l + ‘”]’); if (t) document.title = t.content; document.dispatchEvent(new CustomEvent(‘langchange’, { detail: l })); } (function initLang() { var l = null; try { l = localStorage.getItem(‘riem-lang’); } catch (e) {} if (!l) l = (navigator.language || ‘en’).toLowerCase().indexOf(‘id’) === 0 ? ‘id’ : ‘en’; document.documentElement.setAttribute(‘data-lang’, l); })(); function buildHeader() { var page = location.pathname.replace(/\/?$/, ‘/’).toLowerCase(); var nav = NAV.map(function (n) { if (n.dd) { var act = n.items.some(function (i) { return i.href === page; }); return ‘
‘ + n.items.map(function (i) { return ‘‘ + T(i.en, i.id) + ‘‘ + T(i.sen, i.sid) + ‘‘; }).join(”) + ‘
‘; } return ‘‘ + T(n.en, n.id) + ‘‘; }).join(”); var html = ‘‘ + ‘‘; var h = document.getElementById(‘riem-header’); if (h) h.innerHTML = html; var burger = document.querySelector(‘#riem .burger’), navEl = document.getElementById(‘riem-nav’); if (burger) burger.addEventListener(‘click’, function () { navEl.classList.toggle(‘open’); }); document.querySelectorAll(‘#riem .nav .dd > button’).forEach(function (b) { b.addEventListener(‘click’, function () { b.parentElement.classList.toggle(‘open’); }); }); document.querySelectorAll(‘#riem .lang-switch button’).forEach(function (b) { b.addEventListener(‘click’, function () { setLang(b.dataset.l); }); }); } function buildFooter() { var f = document.getElementById(‘riem-footer’); if (!f) return; f.innerHTML = ‘‘ + ‘‘; document.getElementById(‘yr’).textContent = new Date().getFullYear(); var tt = f.querySelector(‘.to-top’); tt.addEventListener(‘click’, function () { window.scrollTo({ top: 0, behavior: ‘smooth’ }); }); window.addEventListener(‘scroll’, function () { tt.classList.toggle(‘show’, window.scrollY > 600); }); } function reveal() { var els = document.querySelectorAll(‘#riem .rv’); if (!(‘IntersectionObserver’ in window)) { els.forEach(function (e) { e.classList.add(‘in’); }); return; } var io = new IntersectionObserver(function (en) { en.forEach(function (x) { if (x.isIntersecting) { x.target.classList.add(‘in’); io.unobserve(x.target); } }); }, { threshold: .12 }); els.forEach(function (e) { io.observe(e); }); } function counters() { var els = document.querySelectorAll(‘[data-count]’); if (!els.length) return; var io = new IntersectionObserver(function (en) { en.forEach(function (x) { if (!x.isIntersecting) return; io.unobserve(x.target); var el = x.target, end = parseFloat(el.dataset.count), suf = el.dataset.suffix || ”, t0 = null; function step(t) { if (!t0) t0 = t; var p = Math.min((t – t0) / 1400, 1); el.textContent = Math.floor(end * (1 – Math.pow(1 – p, 3))).toLocaleString(‘en-US’) + suf; if (p < 1) requestAnimationFrame(step); } requestAnimationFrame(step); }); }, { threshold: .5 }); els.forEach(function (e) { io.observe(e); }); } function logoWall(el, marquee) { var items = PARTNERS.map(function (p) { return '
' + esc(p[1]) + '
‘; }).join(”); if (marquee) el.innerHTML = ‘
‘ + items + items + ‘
‘; else el.innerHTML = ‘
‘ + items + ‘
‘; } window.RIEM = { CFG: CFG, DIVISIONS: DIVISIONS, PARTNERS: PARTNERS, GROUPS: RESEARCH_GROUPS, T: T, esc: esc, getLang: getLang, setLang: setLang, logoWall: logoWall }; window.RIEM_READY( function () { buildHeader(); buildFooter(); setLang(getLang()); document.querySelectorAll(‘[data-logowall]’).forEach(function (el) { logoWall(el, el.dataset.logowall === ‘marquee’); }); reveal(); counters(); }); })(); /* form-config.js */ /* Optional online submission endpoint. Leave endpoint empty to use the built-in fallback (email draft + downloadable file). To receive submissions online, set endpoint to an HTTPS URL that accepts a JSON POST, e.g. a Microsoft Power Automate “When an HTTP request is received” flow, a Google Apps Script web app, or a form service such as Formspree. */ window.RIEM_FORM_CONFIG = { endpoint: ”, recipient: ‘kerjasamaftmd@itb.ac.id’ }; /* forms.js */ /* RIEM2TB – schema driven bilingual forms (project initiation and project assessment) */ (function () { ‘use strict’; var R = window.RIEM, T = R.T, esc = R.esc; var CFG = window.RIEM_FORM_CONFIG || { endpoint: ”, recipient: R.CFG.email }; function B(en, id) { return { en: en, id: id }; } function O(v, en, id) { return { v: v, en: en, id: id || en }; } /* ———- schemas ———- */ var DIV_OPTS = R.DIVISIONS.map(function (d) { return O(d.id, d.name.en, d.name.id); }).concat([O(‘unsure’, ‘Not sure yet’, ‘Belum yakin’)]); var INITIATION = { id: ‘initiation’, prefix: ‘INI’, subject: B(‘RIEM2TB project initiation’, ‘Inisiasi kerja sama RIEM2TB’), sections: [ { title: B(‘1. Organization’, ‘1. Organisasi’), fields: [ { n: ‘org’, t: ‘text’, l: B(‘Organization / company name’, ‘Nama organisasi / perusahaan’), req: 1 }, { n: ‘orgType’, t: ‘select’, l: B(‘Organization type’, ‘Jenis organisasi’), req: 1, opts: [ O(‘soe’, ‘State-owned enterprise (BUMN/BUMD)’, ‘BUMN / BUMD’), O(‘private’, ‘Private company’, ‘Perusahaan swasta’), O(‘gov’, ‘Ministry / government agency’, ‘Kementerian / instansi pemerintah’), O(‘assoc’, ‘Association / foundation’, ‘Asosiasi / yayasan’), O(‘univ’, ‘University / research institution’, ‘Perguruan tinggi / lembaga riset’), O(‘intl’, ‘International organization’, ‘Organisasi internasional’), O(‘other’, ‘Other’, ‘Lainnya’)] }, { n: ‘sector’, t: ‘select’, l: B(‘Industry sector’, ‘Sektor industri’), opts: [ O(‘energy’, ‘Energy & power’, ‘Energi & ketenagalistrikan’), O(‘oilgas’, ‘Mining, oil & gas’, ‘Pertambangan, migas’), O(‘transport’, ‘Transportation & railway’, ‘Transportasi & perkeretaapian’), O(‘aero’, ‘Aerospace & defence’, ‘Dirgantara & pertahanan’), O(‘manufacturing’, ‘Manufacturing & automotive’, ‘Manufaktur & otomotif’), O(‘material’, ‘Materials & chemicals’, ‘Material & kimia’), O(‘health’, ‘Health’, ‘Kesehatan’), O(‘maritime’, ‘Maritime’, ‘Maritim’), O(‘agri’, ‘Agriculture & food’, ‘Pertanian & pangan’), O(‘env’, ‘Environment’, ‘Lingkungan’), O(‘other’, ‘Other’, ‘Lainnya’)] }, { n: ‘website’, t: ‘url’, l: B(‘Website’, ‘Situs web’), ph: ‘https://’ }, { n: ‘address’, t: ‘textarea’, l: B(‘Address’, ‘Alamat’), full: 1, rows: 2 } ] }, { title: B(‘2. Contact person (PIC)’, ‘2. Narahubung (PIC)’), fields: [ { n: ‘picName’, t: ‘text’, l: B(‘Full name’, ‘Nama lengkap’), req: 1 }, { n: ‘picTitle’, t: ‘text’, l: B(‘Position’, ‘Jabatan’), req: 1 }, { n: ‘picEmail’, t: ’email’, l: B(‘Email’, ‘Email’), req: 1 }, { n: ‘picPhone’, t: ‘tel’, l: B(‘Phone / WhatsApp’, ‘Telepon / WhatsApp’), req: 1 } ] }, { title: B(‘3. Cooperation interest’, ‘3. Minat kerja sama’), fields: [ { n: ‘coopType’, t: ‘checks’, l: B(‘Type of cooperation’, ‘Jenis kerja sama’), req: 1, full: 1, opts: [ O(‘consult’, ‘Expert consultation / technical study’, ‘Konsultasi ahli / kajian teknis’), O(‘test’, ‘Laboratory testing & characterization’, ‘Pengujian & karakterisasi laboratorium’), O(‘failure’, ‘Failure analysis & reliability’, ‘Analisis kegagalan & keandalan’), O(‘product’, ‘Product development & prototyping’, ‘Pengembangan produk & prototipe’), O(‘research’, ‘Joint research’, ‘Riset bersama’), O(‘training’, ‘Training (public / customized)’, ‘Pelatihan (umum / customized)’), O(‘degree’, ‘Degree education (Master / Doctoral)’, ‘Pendidikan bergelar (Magister / Doktor)’), O(‘other’, ‘Other’, ‘Lainnya’)] }, { n: ‘division’, t: ‘checks’, l: B(‘Division of interest’, ‘Divisi yang diminati’), full: 1, opts: DIV_OPTS }, { n: ‘title’, t: ‘text’, l: B(‘Project / activity title’, ‘Judul proyek / kegiatan’), req: 1, full: 1 }, { n: ‘background’, t: ‘textarea’, l: B(‘Background and technical problem’, ‘Latar belakang dan masalah teknis’), req: 1, full: 1, hint: B(‘Describe the asset, system or product concerned and the issue you face.’, ‘Jelaskan aset, sistem, atau produk terkait dan masalah yang dihadapi.’) }, { n: ‘objective’, t: ‘textarea’, l: B(‘Objectives and expected results’, ‘Tujuan dan hasil yang diharapkan’), req: 1, full: 1 }, { n: ‘scope’, t: ‘textarea’, l: B(‘Scope and location of work (if known)’, ‘Ruang lingkup dan lokasi pekerjaan (jika diketahui)’), full: 1, rows: 3 }, { n: ‘deliverables’, t: ‘checks’, l: B(‘Expected deliverables’, ‘Luaran yang diharapkan’), full: 1, opts: [ O(‘report’, ‘Study / technical report’, ‘Laporan kajian / teknis’), O(‘design’, ‘Design & drawings’, ‘Desain & gambar teknik’), O(‘sim’, ‘Simulation / analysis model’, ‘Model simulasi / analisis’), O(‘testresult’, ‘Test results’, ‘Hasil pengujian’), O(‘proto’, ‘Prototype’, ‘Prototipe’), O(‘training’, ‘Training & certificate’, ‘Pelatihan & sertifikat’), O(‘reco’, ‘Recommendation / advisory’, ‘Rekomendasi / pendampingan’)] } ] }, { title: B(‘4. Planning & readiness’, ‘4. Perencanaan & kesiapan’), fields: [ { n: ‘startDate’, t: ‘date’, l: B(‘Target start date’, ‘Target mulai’) }, { n: ‘duration’, t: ‘select’, l: B(‘Expected duration’, ‘Perkiraan durasi’), opts: [O(’12’, ‘More than 12 months’, ‘Lebih dari 12 bulan’), O(‘tbd’, ‘To be discussed’, ‘Dibahas lebih lanjut’)] }, { n: ‘budget’, t: ‘select’, l: B(‘Indicative budget range (optional)’, ‘Kisaran anggaran indikatif (opsional)’), opts: [O(‘5000’, ‘Above IDR 5 billion’, ‘Di atas Rp5 miliar’), O(‘tbd’, ‘Not yet determined’, ‘Belum ditentukan’)] }, { n: ‘procurement’, t: ‘select’, l: B(‘Procurement mechanism’, ‘Mekanisme pengadaan’), opts: [O(‘direct’, ‘Direct appointment’, ‘Penunjukan langsung’), O(‘tender’, ‘Tender / selection’, ‘Tender / seleksi’), O(‘rfq’, ‘Request for quotation (RFQ)’, ‘Permintaan penawaran (RFQ)’), O(‘tbd’, ‘Not yet determined’, ‘Belum ditentukan’)] }, { n: ‘tor’, t: ‘radio’, l: B(‘TOR / RFQ document available?’, ‘Dokumen TOR / RFQ tersedia?’), opts: [O(‘yes’, ‘Yes’, ‘Ya’), O(‘no’, ‘No’, ‘Tidak’)] }, { n: ‘data’, t: ‘radio’, l: B(‘Technical data available?’, ‘Data teknis tersedia?’), opts: [O(‘yes’, ‘Yes’, ‘Ya’), O(‘partial’, ‘Partially’, ‘Sebagian’), O(‘no’, ‘Not yet’, ‘Belum’)] }, { n: ‘visit’, t: ‘radio’, l: B(‘Site visit needed?’, ‘Perlu kunjungan lapangan?’), opts: [O(‘yes’, ‘Yes’, ‘Ya’), O(‘no’, ‘No’, ‘Tidak’), O(‘tbd’, ‘Not sure’, ‘Belum tahu’)] }, { n: ‘nda’, t: ‘radio’, l: B(‘Confidentiality (NDA) required?’, ‘Perlu perjanjian kerahasiaan (NDA)?’), opts: [O(‘yes’, ‘Yes’, ‘Ya’), O(‘no’, ‘No’, ‘Tidak’)] }, { n: ‘mou’, t: ‘radio’, l: B(‘Existing MoU with ITB / FTMD?’, ‘Sudah ada MoU dengan ITB / FTMD?’), opts: [O(‘yes’, ‘Yes’, ‘Ya’), O(‘no’, ‘No’, ‘Tidak’), O(‘unknown’, ‘Unknown’, ‘Tidak tahu’)] }, { n: ‘refPIC’, t: ‘text’, l: B(‘Known FTMD contact / referred by (if any)’, ‘Kontak FTMD yang dikenal / direkomendasikan oleh (jika ada)’) }, { n: ‘meetDate’, t: ‘date’, l: B(‘Preferred technical meeting date’, ‘Tanggal technical meeting yang diinginkan’) }, { n: ‘meetMode’, t: ‘radio’, l: B(‘Meeting mode’, ‘Mode pertemuan’), opts: [O(‘online’, ‘Online’, ‘Daring’), O(‘onsite’, ‘On-site’, ‘Tatap muka’)] }, { n: ‘notes’, t: ‘textarea’, l: B(‘Additional notes’, ‘Catatan tambahan’), full: 1, rows: 3 } ] }, { title: B(‘5. Consent’, ‘5. Persetujuan’), fields: [ { n: ‘consent’, t: ‘consent’, req: 1, full: 1, l: B(‘I confirm that the information is correct and agree that RIEM2TB FTMD ITB may contact me regarding this request. This form is an initial inquiry and is not a binding agreement.’, ‘Saya menyatakan informasi ini benar dan menyetujui RIEM2TB FTMD ITB menghubungi saya terkait permohonan ini. Formulir ini merupakan permohonan awal dan bukan perjanjian yang mengikat.’) } ] } ] }; var SAT = [O(‘S’, ‘Satisfactory’, ‘Memuaskan’), O(‘U’, ‘Unsatisfactory’, ‘Kurang memuaskan’), O(‘N’, ‘No chance to observe’, ‘Tidak sempat mengamati’)]; function grp(n, title, items) { return { n: n, title: title, items: items.map(function (x, i) { return { n: n + (i + 1), l: x }; }) }; } var MATRIX = [ grp(‘dep’, B(‘Dependability’, ‘Keandalan’), [ B(‘Completed work on time’, ‘Pekerjaan selesai tepat waktu’), B(‘Strictly adhered to and respected contracted obligations’, ‘Mematuhi dan menghormati kewajiban kontrak’), B(‘Reported and updated project personnel on issues, status and milestones’, ‘Melaporkan dan memperbarui personel proyek tentang isu, status, dan milestone’), B(‘Showed dedication and determination to deliver despite constraints’, ‘Menunjukkan dedikasi dan tekad menyelesaikan pekerjaan meski ada kendala’), B(‘Made appropriate arrangements for delays’, ‘Mengatur dengan tepat apabila terjadi keterlambatan’), B(‘Performed well under pressure’, ‘Bekerja baik di bawah tekanan’)]), grp(‘job’, B(‘Job Knowledge’, ‘Penguasaan Pekerjaan’), [ B(‘Consistently demonstrated technical and professional expertise’, ‘Konsisten menunjukkan keahlian teknis dan profesional’), B(‘Applied state-of-the-art knowledge and skills’, ‘Menerapkan pengetahuan dan keterampilan mutakhir’), B(‘Understood and adjusted to the project context and operating environment’, ‘Memahami dan menyesuaikan diri dengan konteks proyek dan lingkungan operasi’), B(‘Recognized priorities relative to other client activities’, ‘Mengenali prioritas terkait kegiatan klien lainnya’)]), grp(‘qow’, B(‘Quality of Work’, ‘Kualitas Hasil Kerja’), [ B(‘Deliverables met the agreed scope and specifications’, ‘Luaran sesuai ruang lingkup dan spesifikasi yang disepakati’), B(‘Analysis, calculation and data were accurate and well verified’, ‘Analisis, perhitungan, dan data akurat serta terverifikasi’), B(‘Reports and documents were clear, complete and well structured’, ‘Laporan dan dokumen jelas, lengkap, dan terstruktur’), B(‘Recommendations were practical and actionable’, ‘Rekomendasi praktis dan dapat ditindaklanjuti’)]), grp(‘coop’, B(‘Cooperation’, ‘Kerja Sama’), [ B(‘Accepted guidelines and recommendations willingly’, ‘Menerima pedoman dan masukan dengan terbuka’), B(‘Worked well and integrated smoothly with all other entities in the project’, ‘Bekerja baik dan menyatu dengan pihak lain dalam proyek’), B(‘Gained respect and confidence of everyone involved’, ‘Memperoleh rasa hormat dan kepercayaan semua pihak’), B(‘Related to others in a manner that leads to optimum productivity’, ‘Berinteraksi dengan cara yang menghasilkan produktivitas optimal’)]), grp(‘inter’, B(‘Inter-Personal’, ‘Hubungan Antarpribadi’), [ B(‘Responded sensitively to project staff and stakeholders with discretion’, ‘Merespons dengan peka dan bijak terhadap staf proyek dan pemangku kepentingan’), B(‘Recognized cultural diversity and related to others equally and without discrimination’, ‘Menghargai keberagaman budaya dan memperlakukan semua pihak setara tanpa diskriminasi’), B(‘Communicated effectively with people of varied levels and capacity’, ‘Berkomunikasi efektif dengan berbagai tingkat dan kapasitas’), B(‘Showed empathy and sensitivity to the rights of those affected by the work’, ‘Menunjukkan empati dan kepekaan terhadap hak pihak yang terdampak pekerjaan’), B(‘Related to others appropriately to the relationship with the employer’, ‘Berinteraksi sesuai hubungan dengan pemberi kerja’), B(‘Displayed a positive and constructive attitude, with energy and enthusiasm’, ‘Menunjukkan sikap positif dan konstruktif, penuh energi dan antusias’)]), grp(‘judg’, B(‘Judgment’, ‘Pertimbangan Profesional’), [ B(‘Consistently demonstrated the highest integrity in decisions’, ‘Konsisten menunjukkan integritas tertinggi dalam pengambilan keputusan’), B(‘Recognized and analyzed problems and acted on effective solutions’, ‘Mengenali dan menganalisis masalah serta mengambil solusi efektif’), B(‘Anticipated adverse situations and prepared, addressed or avoided them’, ‘Mengantisipasi situasi merugikan dan mempersiapkan, menangani, atau menghindarinya’), B(‘Took responsibility for actions and consequences’, ‘Bertanggung jawab atas tindakan dan konsekuensinya’), B(‘Adapted well to changes in work situations and procedures’, ‘Beradaptasi baik terhadap perubahan situasi kerja dan prosedur’)]) ]; var ASSESSMENT = { id: ‘assessment’, prefix: ‘ASM’, subject: B(‘RIEM2TB project assessment’, ‘Penilaian proyek RIEM2TB’), sections: [ { title: B(‘1. Project information’, ‘1. Informasi proyek’), fields: [ { n: ‘org’, t: ‘text’, l: B(‘Company / institution name’, ‘Nama perusahaan / institusi’), req: 1 }, { n: ‘project’, t: ‘text’, l: B(‘Project / contract title’, ‘Judul proyek / kontrak’), req: 1, full: 1 }, { n: ‘contractNo’, t: ‘text’, l: B(‘Contract / SPK number (if any)’, ‘Nomor kontrak / SPK (jika ada)’) }, { n: ‘division’, t: ‘select’, l: B(‘RIEM2TB division’, ‘Divisi RIEM2TB’), req: 1, opts: DIV_OPTS }, { n: ‘start’, t: ‘date’, l: B(‘Project start’, ‘Awal proyek’) }, { n: ‘end’, t: ‘date’, l: B(‘Project end’, ‘Akhir proyek’), req: 1 }, { n: ‘ftmdPic’, t: ‘text’, l: B(‘FTMD PIC / lead expert (if known)’, ‘PIC / ketua tim FTMD (jika diketahui)’) }, { n: ‘desc’, t: ‘textarea’, l: B(‘Brief description of the work’, ‘Deskripsi singkat pekerjaan’), full: 1, rows: 3 } ] }, { title: B(‘2. Evaluator’, ‘2. Penilai’), fields: [ { n: ‘evName’, t: ‘text’, l: B(‘Name’, ‘Nama’), req: 1 }, { n: ‘evTitle’, t: ‘text’, l: B(‘Title / position’, ‘Jabatan’), req: 1 }, { n: ‘evEmail’, t: ’email’, l: B(‘Email’, ‘Email’), req: 1 }, { n: ‘evPhone’, t: ‘tel’, l: B(‘Phone’, ‘Telepon’) }, { n: ‘evDate’, t: ‘date’, l: B(‘Date of evaluation’, ‘Tanggal penilaian’), req: 1 } ] }, { title: B(‘3. Performance evaluation’, ‘3. Evaluasi kinerja’), matrix: MATRIX }, { title: B(‘4. Overall assessment’, ‘4. Penilaian keseluruhan’), fields: [ { n: ‘stars’, t: ‘stars’, l: B(‘Overall satisfaction’, ‘Kepuasan keseluruhan’), req: 1, full: 1 }, { n: ‘expect’, t: ‘radio’, l: B(‘Were your expectations met?’, ‘Apakah ekspektasi Anda terpenuhi?’), req: 1, full: 1, opts: [O(‘exceeded’, ‘Exceeded’, ‘Terlampaui’), O(‘met’, ‘Met’, ‘Terpenuhi’), O(‘partly’, ‘Partly met’, ‘Sebagian terpenuhi’), O(‘notmet’, ‘Not met’, ‘Tidak terpenuhi’)] }, { n: ‘nps’, t: ‘nps’, l: B(‘How likely are you to recommend RIEM2TB FTMD ITB to a colleague? (0 = not at all, 10 = extremely likely)’, ‘Seberapa besar kemungkinan Anda merekomendasikan RIEM2TB FTMD ITB kepada kolega? (0 = tidak sama sekali, 10 = sangat mungkin)’), req: 1, full: 1 }, { n: ‘again’, t: ‘radio’, l: B(‘Would you collaborate with us again?’, ‘Apakah Anda akan bekerja sama lagi dengan kami?’), full: 1, opts: [O(‘yes’, ‘Yes’, ‘Ya’), O(‘maybe’, ‘Maybe’, ‘Mungkin’), O(‘no’, ‘No’, ‘Tidak’)] }, { n: ‘good’, t: ‘textarea’, l: B(‘What went well?’, ‘Apa yang berjalan baik?’), full: 1, rows: 3 }, { n: ‘improve’, t: ‘textarea’, l: B(‘What could we improve?’, ‘Apa yang dapat kami tingkatkan?’), full: 1, rows: 3 }, { n: ‘future’, t: ‘checks’, l: B(‘Follow-up opportunities of interest’, ‘Peluang tindak lanjut yang diminati’), full: 1, opts: [O(‘project’, ‘Follow-up project’, ‘Proyek lanjutan’), O(‘training’, ‘Training for our staff’, ‘Pelatihan bagi staf kami’), O(‘testing’, ‘Laboratory testing’, ‘Pengujian laboratorium’), O(‘research’, ‘Joint research / innovation’, ‘Riset / inovasi bersama’), O(‘mou’, ‘MoU / long-term cooperation’, ‘MoU / kerja sama jangka panjang’)] } ] }, { title: B(‘5. Permission & confirmation’, ‘5. Izin & konfirmasi’), fields: [ { n: ‘testi’, t: ‘radio’, l: B(‘May RIEM2TB quote your comments as a testimonial?’, ‘Bolehkah RIEM2TB mengutip komentar Anda sebagai testimoni?’), full: 1, opts: [O(‘named’, ‘Yes, with my name and organization’, ‘Ya, dengan nama dan organisasi saya’), O(‘org’, ‘Yes, with organization only’, ‘Ya, hanya dengan nama organisasi’), O(‘anon’, ‘Yes, anonymously’, ‘Ya, secara anonim’), O(‘no’, ‘No’, ‘Tidak’)] }, { n: ‘logo’, t: ‘radio’, l: B(‘May RIEM2TB list your organization name/logo as a partner reference?’, ‘Bolehkah RIEM2TB mencantumkan nama/logo organisasi Anda sebagai referensi mitra?’), full: 1, opts: [O(‘yes’, ‘Yes’, ‘Ya’), O(‘no’, ‘No’, ‘Tidak’)] }, { n: ‘signName’, t: ‘text’, l: B(‘Name as signature’, ‘Nama sebagai tanda tangan’), req: 1 }, { n: ‘consent’, t: ‘consent’, req: 1, full: 1, l: B(‘I confirm that this evaluation reflects my honest assessment of the project.’, ‘Saya menyatakan penilaian ini mencerminkan penilaian jujur saya atas proyek tersebut.’) } ] } ] }; /* ———- rendering ———- */ var uid = 0; function reqMark(f) { return f.req ? ‘ *‘ : ”; } function msg() { return ‘
‘ + T(‘This field is required.’, ‘Kolom ini wajib diisi.’) + ‘
‘; } function fieldHTML(f) { var id = ‘f_’ + f.n + ‘_’ + (uid++), lab = ‘‘; var hint = f.hint ? ‘
‘ + T(f.hint.en, f.hint.id) + ‘
‘ : ”; var cls = ‘fld’ + (f.full ? ‘ full’ : ”), body = ”; switch (f.t) { case ‘text’: case ’email’: case ‘tel’: case ‘url’: case ‘date’: case ‘number’: body = lab + ” + hint + msg(); break; case ‘textarea’: body = lab + ‘‘ + hint + msg(); break; case ‘select’: body = lab + ‘— Select —’ + f.opts.map(function (o) { return ” + esc(o.en) + ”; }).join(”) + ” + hint + msg(); break; case ‘radio’: case ‘checks’: var type = f.t === ‘radio’ ? ‘radio’ : ‘checkbox’; body = ‘‘ + T(f.l.en, f.l.id) + reqMark(f) + ‘
‘ + f.opts.map(function (o) { return ‘‘; }).join(”) + ‘
‘ + hint + msg(); break; case ‘stars’: body = ‘‘ + T(f.l.en, f.l.id) + reqMark(f) + ‘
‘ + [5, 4, 3, 2, 1].map(function (i) { return ‘‘; }).join(”) + ‘
‘ + msg(); break; case ‘nps’: var cells = ”; for (var i = 0; i <= 10; i++) cells += '‘; body = ‘‘ + T(f.l.en, f.l.id) + reqMark(f) + ‘
‘ + cells + ‘
‘ + msg(); break; case ‘consent’: body = ‘‘ + msg(); break; } return ‘
‘ + body + ‘
‘; } function matrixHTML(m) { return m.map(function (g) { var head = ‘‘ + SAT.map(function (o) { return ‘‘ + T(o.en, o.id) + ‘‘; }).join(”) + ‘‘; var rows = g.items.map(function (it) { return ‘‘ + T(it.l.en, it.l.id) + ‘‘ + SAT.map(function (o) { return ‘‘; }).join(”) + ‘‘; }).join(”); return ‘

‘ + T(g.title.en, g.title.id) + ‘

‘ + head + rows + ‘
‘ + ‘
‘; }).join(”); } function build(schema, form) { var html = schema.sections.map(function (s) { var inner = s.matrix ? ‘

‘ + T(‘Please mark one option per statement.’, ‘Mohon pilih satu opsi untuk setiap pernyataan.’) + ‘

‘ + matrixHTML(s.matrix) : ‘
‘ + s.fields.map(fieldHTML).join(”) + ‘
‘; return ‘
‘ + T(s.title.en, s.title.id) + ‘‘ + inner + ‘
‘; }).join(”); html += ‘
‘ + ‘
‘; form.innerHTML = html; } function syncOptions(form) { var l = R.getLang(); form.querySelectorAll(‘select option’).forEach(function (o) { o.textContent = o.getAttribute(‘data-‘ + l) || o.textContent; }); } /* ———- data helpers ———- */ function labelOf(schema, name) { var found = null; schema.sections.forEach(function (s) { if (s.fields) s.fields.forEach(function (f) { if (f.n === name) found = f; }); if (s.matrix) s.matrix.forEach(function (g) { g.items.forEach(function (it) { if (it.n === name) found = { l: it.l, t: ‘matrix’, grp: g.title }; }); if (g.n + ‘_c’ === name) found = { l: B(‘Comments – ‘ + g.title.en, ‘Komentar – ‘ + g.title.id), t: ‘text’ }; }); }); return found; } function collect(form) { var data = {}, fd = new FormData(form); fd.forEach(function (v, k) { if (data[k] === undefined) data[k] = v; else if (Array.isArray(data[k])) data[k].push(v); else data[k] = [data[k], v]; }); return data; } function valueLabel(schema, f, v) { var l = R.getLang(); if (v === undefined || v === ”) return ”; var arr = Array.isArray(v) ? v : [v]; if (f && f.opts) return arr.map(function (x) { var o = f.opts.filter(function (o) { return o.v === x; })[0]; return o ? o[l] : x; }).join(‘; ‘); if (f && f.t === ‘matrix’) return arr.map(function (x) { var o = SAT.filter(function (o) { return o.v === x; })[0]; return o ? o[l] : x; }).join(‘; ‘); if (f && f.t === ‘consent’) return l === ‘id’ ? ‘Ya, disetujui’ : ‘Yes, agreed’; return arr.join(‘; ‘); } function summary(schema, data, ref) { var l = R.getLang(), out = []; out.push(‘RIEM2TB FTMD ITB – ‘ + schema.subject[l]); out.push((l === ‘id’ ? ‘Nomor referensi: ‘ : ‘Reference: ‘) + ref); out.push((l === ‘id’ ? ‘Tanggal kirim: ‘ : ‘Submitted: ‘) + new Date().toLocaleString(l === ‘id’ ? ‘id-ID’ : ‘en-GB’)); out.push(”); schema.sections.forEach(function (s) { out.push(‘== ‘ + s.title[l] + ‘ ==’); if (s.fields) s.fields.forEach(function (f) { if (f.t === ‘consent’) return; var v = valueLabel(schema, f, data[f.n]); out.push(f.l[l] + ‘: ‘ + (v || ‘-‘)); }); if (s.matrix) s.matrix.forEach(function (g) { out.push(‘[‘ + g.title[l] + ‘]’); g.items.forEach(function (it) { out.push(‘ – ‘ + it.l[l] + ‘: ‘ + (valueLabel(schema, { t: ‘matrix’ }, data[it.n]) || ‘-‘)); }); if (data[g.n + ‘_c’]) out.push(‘ ‘ + (l === ‘id’ ? ‘Komentar: ‘ : ‘Comments: ‘) + data[g.n + ‘_c’]); }); out.push(”); }); return out.join(‘\n’); } function download(name, text, mime) { var a = document.createElement(‘a’); a.href = URL.createObjectURL(new Blob([text], { type: mime + ‘;charset=utf-8’ })); a.download = name; document.body.appendChild(a); a.click(); setTimeout(function () { URL.revokeObjectURL(a.href); a.remove(); }, 500); } /* ———- validation ———- */ function validate(form, schema) { var ok = true, first = null; form.querySelectorAll(‘.fld[data-req]’).forEach(function (w) { var t = w.dataset.type, good = true, n = w.dataset.field; if (t === ‘radio’ || t === ‘stars’ || t === ‘nps’) good = !!form.querySelector(‘input[name=”‘ + n + ‘”]:checked’); else if (t === ‘checks’) good = !!form.querySelector(‘input[name=”‘ + n + ‘”]:checked’); else if (t === ‘consent’) good = form.querySelector(‘input[name=”‘ + n + ‘”]’).checked; else { var el = w.querySelector(‘input,select,textarea’); good = !!el.value.trim(); if (good && t === ’email’) good = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(el.value.trim()); if (good && t === ‘url’ && el.value) good = /^https?:\/\/.+/i.test(el.value.trim()); } w.classList.toggle(‘err’, !good); if (!good) { ok = false; if (!first) first = w; } }); form.querySelectorAll(‘input[type=url]’).forEach(function (el) { var w = el.closest(‘.fld’); if (!w || w.hasAttribute(‘data-req’)) return; var good = !el.value || /^https?:\/\/.+/i.test(el.value.trim()); w.classList.toggle(‘err’, !good); if (!good) { ok = false; if (!first) first = w; } }); if (first) first.scrollIntoView({ behavior: ‘smooth’, block: ‘center’ }); return ok; } /* ———- init ———- */ function init(schema, formId, resultId) { var form = document.getElementById(formId), res = document.getElementById(resultId); if (!form) return; build(schema, form); syncOptions(form); document.addEventListener(‘langchange’, function () { syncOptions(form); }); var key = ‘riem-draft-‘ + schema.id, saved = form.querySelector(‘[data-role=saved]’); function restore() { try { var d = JSON.parse(localStorage.getItem(key) || ‘null’); if (!d) return; Object.keys(d).forEach(function (k) { var vals = Array.isArray(d[k]) ? d[k] : [d[k]]; var els = form.querySelectorAll(‘[name=”‘ + k + ‘”]’); els.forEach(function (el) { if (el.type === ‘radio’ || el.type === ‘checkbox’) el.checked = vals.indexOf(el.value) >= 0; else if (k !== ‘consent’) el.value = vals[0]; }); }); if (saved) saved.textContent = R.getLang() === ‘id’ ? ‘Draf tersimpan dipulihkan.’ : ‘Saved draft restored.’; } catch (e) {} } restore(); var timer; form.addEventListener(‘input’, function () { clearTimeout(timer); timer = setTimeout(function () { try { var d = collect(form); delete d.consent; localStorage.setItem(key, JSON.stringify(d)); if (saved) saved.textContent = R.getLang() === ‘id’ ? ‘Draf tersimpan otomatis di perangkat ini.’ : ‘Draft auto-saved on this device.’; } catch (e) {} }, 500); }); form.addEventListener(‘change’, function (e) { var w = e.target.closest(‘.fld’); if (w) w.classList.remove(‘err’); }); form.querySelector(‘[data-act=reset]’).addEventListener(‘click’, function () { form.reset(); try { localStorage.removeItem(key); } catch (e) {} form.querySelectorAll(‘.err’).forEach(function (e) { e.classList.remove(‘err’); }); res.className = ‘result’; res.innerHTML = ”; if (saved) saved.textContent = ”; }); form.addEventListener(‘submit’, function (ev) { ev.preventDefault(); if (!validate(form, schema)) return; var data = collect(form), l = R.getLang(); var ref = schema.prefix + ‘-‘ + new Date().toISOString().slice(0, 10).replace(/-/g, ”) + ‘-‘ + Math.random().toString(36).slice(2, 6).toUpperCase(); var text = summary(schema, data, ref); var payload = { reference: ref, form: schema.id, language: l, submittedAt: new Date().toISOString(), data: data }; var subject = ‘[‘ + ref + ‘] ‘ + schema.subject[l] + ‘ – ‘ + (data.org || ”); var body = text.length > 1800 ? text.slice(0, 1800) + ‘\n…\n(‘ + (l === ‘id’ ? ‘lihat file lampiran’ : ‘see attached file’) + ‘)’ : text; var mailto = ‘mailto:’ + CFG.recipient + ‘?subject=’ + encodeURIComponent(subject) + ‘&body=’ + encodeURIComponent(body); res.className = ‘result show’; res.innerHTML = ‘
‘ + T(‘Thank you! Your form is ready.’, ‘Terima kasih! Formulir Anda siap.’) + ‘ ‘ + T(‘Reference number’, ‘Nomor referensi’) + ‘: ‘ + ref + ‘. ‘ + ‘
✉ ‘ + T(‘Send by email’, ‘Kirim lewat email’) + ‘‘ + ‘‘ + ‘‘ + ‘
‘;
      res.querySelector(‘pre’).textContent = text;
      var msgEl = res.querySelector(‘[data-role=msg]’);
      function setMsg(en, id) { msgEl.innerHTML = T(en, id); }
      if (CFG.endpoint) {
        setMsg(‘Sending to RIEM2TB…’, ‘Mengirim ke RIEM2TB…’);
        fetch(CFG.endpoint, { method: ‘POST’, headers: { ‘Content-Type’: ‘application/json’ }, body: JSON.stringify(payload) })
          .then(function (r) { if (!r.ok) throw new Error(r.status); setMsg(‘Your submission has been received by RIEM2TB.’, ‘Pengajuan Anda telah diterima RIEM2TB.’); try { localStorage.removeItem(key); } catch (e) {} })
          .catch(function () { setMsg(‘Online submission failed. Please send by email or download the file below and email it to ‘ + CFG.recipient + ‘.’, ‘Pengiriman daring gagal. Silakan kirim lewat email atau unduh file di bawah dan kirim ke ‘ + CFG.recipient + ‘.’); });
      } else {
        setMsg(‘Please press “Send by email” and attach the downloaded file if needed, so the RIEM2TB team can follow up: ‘ + CFG.recipient + ‘.’, ‘Silakan tekan “Kirim lewat email” dan lampirkan file unduhan bila perlu agar tim RIEM2TB dapat menindaklanjuti: ‘ + CFG.recipient + ‘.’);
      }
      res.querySelectorAll(‘[data-a]’).forEach(function (b) {
        b.addEventListener(‘click’, function () {
          var a = b.dataset.a;
          if (a === ‘txt’) download(ref + ‘.txt’, text, ‘text/plain’);
          else if (a === ‘json’) download(ref + ‘.json’, JSON.stringify(payload, null, 2), ‘application/json’);
          else if (a === ‘print’) window.print();
          else if (a === ‘copy’) { if (navigator.clipboard) navigator.clipboard.writeText(text); }
        });
      });
      res.scrollIntoView({ behavior: ‘smooth’, block: ‘start’ });
    });
  }

  window.RIEMForms = { init: init, INITIATION: INITIATION, ASSESSMENT: ASSESSMENT };
  window.RIEM_READY( function () {
    if (document.getElementById(‘initiation-form’)) init(INITIATION, ‘initiation-form’, ‘initiation-result’);
    if (document.getElementById(‘assessment-form’)) init(ASSESSMENT, ‘assessment-form’, ‘assessment-result’);
    var d = document.querySelector(‘input[name=evDate]’); if (d && !d.value) d.value = new Date().toISOString().slice(0, 10);
  });
})();