PageSourceSearch

https://indopremier.com/app/js/registration.js?v=20260122

js indopremier.com collected 2026-09-24 17:36:08 UTC 27,377 bytes, 829 lines download raw bytes

1function checkCameraSupport(context) {
2    if (!app.device.desktop) {
3        context.resolve();
4    }
5
6    if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
7        // Firefox 38+ seems having support of enumerateDevices
8        navigator.enumerateDevices = function (callback) {
9            navigator.mediaDevices.enumerateDevices().then(callback);
10        };
11    }
12
13    var MediaDevices = [];
14    var isHTTPs = location.protocol === 'https:';
15    var canEnumerate = false;
16
17    if (typeof MediaStreamTrack !== 'undefined' && 'getSources' in MediaStreamTrack) {
18        canEnumerate = true;
19    } else if (navigator.mediaDevices && !!navigator.mediaDevices.enumerateDevices) {
20        canEnumerate = true;
21    }
22
23    var hasMicrophone = false;
24    var hasSpeakers = false;
25    var hasWebcam = false;
26
27    var isMicrophoneAlreadyCaptured = false;
28    var isWebcamAlreadyCaptured = false;
29
30    function checkDeviceSupport(callback) {
31        if (!canEnumerate) {
32            return;
33        }
34
35        if (!navigator.enumerateDevices && window.MediaStreamTrack && window.MediaStreamTrack.getSources) {
36            navigator.enumerateDevices = window.MediaStreamTrack.getSources.bind(window.MediaStreamTrack);
37        }
38
39        if (!navigator.enumerateDevices && navigator.enumerateDevices) {
40            navigator.enumerateDevices = navigator.enumerateDevices.bind(navigator);
41        }
42
43        if (!navigator.enumerateDevices) {
44            if (callback) {
45                callback();
46            }
47            return;
48        }
49
50        MediaDevices = [];
51        navigator.enumerateDevices(function (devices) {
52            devices.forEach(function (_device) {
53                var device = {};
54                for (var d in _device) {
55                    device[d] = _device[d];
56                }
57
58                if (device.kind === 'audio') {
59                    device.kind = 'audioinput';
60                }
61
62                if (device.kind === 'video') {
63                    device.kind = 'videoinput';
64                }
65
66                var skip;
67                MediaDevices.forEach(function (d) {
68                    if (d.id === device.id && d.kind === device.kind) {
69                        skip = true;
70                    }
71                });
72
73                if (skip) {
74                    return;
75                }
76
77                if (!device.deviceId) {
78                    device.deviceId = device.id;
79                }
80
81                if (!device.id) {
82                    device.id = device.deviceId;
83                }
84
85                if (!device.label) {
86                    device.label = 'Please invoke getUserMedia once.';
87                    if (!isHTTPs) {
88                        device.label = 'HTTPs is required to get label of this ' + device.kind + ' device.';
89                    }
90                } else {
91                    if (device.kind === 'videoinput' && !isWebcamAlreadyCaptured) {
92                        isWebcamAlreadyCaptured = true;
93                    }
94
95                    if (device.kind === 'audioinput' && !isMicrophoneAlreadyCaptured) {
96                        isMicrophoneAlreadyCaptured = true;
97                    }
98                }
99
100                if (device.kind === 'audioinput') {
101                    hasMicrophone = true;
102                }
103
104                if (device.kind === 'audiooutput') {
105                    hasSpeakers = true;
106                }
107
108                if (device.kind === 'videoinput') {
109                    hasWebcam = true;
110                }
111
112                // there is no 'videoouput' in the spec.
113
114                MediaDevices.push(device);
115            });
116
117            if (callback) {
118                callback();
119            }
120        });
121    }
122
123    // check for microphone/camera support!
124    checkDeviceSupport(function () {
125        if (hasWebcam && hasMicrophone) {
126            context.resolve();
127        } else {
128            let alert;
129            let initialUrl = mainView.router.initialUrl;
130
131            if (!hasWebcam && !hasMicrophone) {
132                alert = 'Device does not support camera and microphone';
133            } else if (!hasWebcam) {
134                alert = 'Device does not support camera';
135            } else if (!hasMicrophone) {
136                alert = 'Device does not support microphone';
137            }
138
139            app.dialog.alert(alert, function () {
140                context.reject();
141
142                if (initialUrl.indexOf('registration') >= 0) {
143                    mainView.router.navigate('/home');
144                }
145            });
146        }
147    });
148}
149
150function checkiOS(context) {
151    if (app.device.ios) {
152        context.reject();
153        window.open(DATA.appstore_url, '_blank');
154    } else {
155        context.resolve();
156    }
157}
158
159function checkReload() {
160    let path = getCurrentRoute('path');
161    let pathRegistration = path.indexOf('registration') >= 0;
162
163    if ((pathRegistration || isApp()) && !isLocal()) {
164        return 'Are you sure?';
165    }
166}
167
168function createAutoCompleteLocation(autocompleteId, setAutoComplete) {
169    return app.autocomplete.create({
170        openIn: 'popup',
171        openerEl: '#' + autocompleteId,
172        limit: 50,
173        searchbarPlaceholder: 'Ketik nama kelurahan / kode pos..',
174        notFoundText: 'Kelurahan / kode pos tidak ditemukan',
175        closeOnSelect: true,
176        autoFocus: true,
177        source: function (query, render) {
178            let results = [];
179            let location = store.state.registration.location;
180
181            if (location) {
182                handleRender(location);
183            } else {
184                app.request({
185                    url: 'app/json/location.json',
186                    method: 'GET',
187                    dataType: 'json',
188                    data: {
189                        query: query
190                    },
191                    success: function (data) {
192                        store.state.registration.location = data;
193                        handleRender(data);
194                    }
195                });
196            }
197
198            function handleRender(data) {
199                for (var i = 0; i < data.length; i++) {
200                    let summary = data[i].summary;
201
202                    if (summary.toLowerCase().indexOf(query.toLowerCase()) >= 0) {
203                        results.push(summary);
204                    }
205
206                    if (results.length == 50) break;
207                }
208
209                // if (results.length == 0 && query != '') {
210                //     results.push(query);
211                // }
212
213                render(results);
214            }
215        },
216        on: {
217            change: function (value) {
218                setAutoComplete(value[0]);
219            }
220        }
221    });
222}
223
224function formatBytes(bytes, decimals = 2) {
225    if (bytes === 0) return '0 Bytes';
226
227    const k = 1024;
228    const dm = decimals < 0 ? 0 : decimals;
229    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
230
231    const i = Math.floor(Math.log(bytes) / Math.log(k));
232
233    return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
234}
235
236async function getCameraDevice(type) {
237    return await navigator.mediaDevices.enumerateDevices()
238        .then((devices) => {
239            let deviceIds = {};
240
241            for (const device of devices) {
242                if (device.kind == 'videoinput') {
243                    deviceIds[device.label] = device.deviceId;
244                }
245            }
246
247            if (type == 'back') {
248                return deviceIds['camera2 0, facing back'];
249            } else {
250                return deviceIds['camera2 1, facing front'];
251            }
252        });
253}
254
255function handleRegResponse(res) {
256    let data = res.data || res;
257
258    // console.log('res: ', data);
259    app.dialog.close();
260
261    if (data.status == 'OK') {
262        let regid = data['reg-id'];
263        let levelid = data['level-id'];
264        let sessionid = data['sessionid']
265
266        if (levelid) store.state.registration.levelid = levelid;
267        if (regid) store.state.registration.regid = regid;
268        if (sessionid) store.state.registration.sessionid = sessionid;
269
270        return data;
271    } else {
272        let errcode = data.errcode;
273
274        // console.log('errcode: ', errcode);
275
276        switch (errcode) {
277            case 'ACCESS-TIMEOUT':
278            case 'ERR-SYS':
279            case 'SESSION-INVALID':
280                app.dialog.alert(data.message, errcode, function () {
281                    mainView.router.navigate('/home', {
282                        clearPreviousHistory: true
283                    });
284                });
285                break;
286            default:
287                return data;
288        }
289    }
290}
291
292function navigateReg(route) {
293    if (isLocal() && false) {
294        mainView.router.navigate(route);
295    } else {
296        let data = getRegData();
297
298        postReg('/update_data', data)
299            .then((res) => {
300                mainView.router.navigate(route);
301            });
302    }
303}
304
305function navigateOpeningAccount() {
306    setTimeout(() => {
307        let path = getCurrentRoute('path');
308
309        if (path == '/home') {
310            scrollToElement('#section-opening-account');
311        } else {
312            mainView.router.navigate('/home');
313
314            setTimeout(() => {
315                scrollToElement('#section-opening-account');
316            }, 300);
317        }
318    }, 300);
319}
320
321async function postReg(path, data = {}, headers, json = true) {
322    const pageName = getCurrentRoute('name');
323    const registration = store.state.registration;
324    const {
325        levelid, regid, sessionid
326    } = registration;
327    const tokenId = registration.data.phone;
328    const url = (path == '/hello_ipot' ? DATA.registration_url : registration.url) + path;
329
330    app.dialog.preloader();
331
332    if (json) {
333        app.utils.extend(data, {
334            'level-id': levelid,
335            'pageName': pageName,
336            'reg-id': regid,
337            'token-id': tokenId,
338            'sessionid': sessionid
339        });
340
341        return await app.request.postJSON(url, data)
342            .then((res) => {
343                return handleRegResponse(res);
344            })
345            .catch((err) => {
346                app.dialog.close();
347            });
348    } else {
349        app.utils.extend(headers, {
350            'level-id': levelid,
351            'pageName': pageName,
352            'reg-id': regid,
353            'token-id': tokenId,
354            'sessionid': sessionid
355        });
356
357        return await app.request({
358            url,
359            method: 'POST',
360            dataType: 'json',
361            headers,
362            processData: false,
363            contentType: 'application/octet-stream',
364            data,
365            error: function (xhr, status, message) {
366                app.dialog.close();
367                app.dialog.alert('Gagal');
368            },
369            success: async function (res, status, xhr) {
370                return await handleRegResponse(res);
371            }
372        });
373    }
374}
375
376function preventDirectURL(context) {
377    const router = this;
378
379    if (Object.keys(context.from).length == 0) {
380        context.reject();
381        this.navigate('/registration', {
382            clearPreviousHistory: true
383        });
384    } else {
385        if (context.from.name == 'Finish') {
386            context.reject();
387            this.navigate('/home');
388        } else {
389            context.resolve();
390        }
391    }
392}
393
394async function createBlob(src) {
395    return await fetch(src) // Retrieve its body as ReadableStream
396        .then(response => {
397            var reader = response.body.getReader();
398            return new ReadableStream({
399                start(controller) {
400                    return pump();
401                    function pump() {
402                        return reader.read().then(({ done, value }) => {
403                            // When no more data needs to be consumed, close the stream
404                            if (done) {
405                                controller.close();
406                                return;
407                            }
408                            // Enqueue the next data chunk into our target stream
409                            controller.enqueue(value);
410                            return pump();
411                        });
412                    }
413                }
414            })
415        })
416        .then(stream => new Response(stream))
417        .then(response => response.blob())
418        .then(blob => {
419            return blob;
420        });
421}
422
423function getRegistrationRoute(res, route) {
424    switch (res.message) {
425        case 'goto_bank':
426            return '/registration/data-tambahan-a';
427        case 'goto_selfie':
428            return '/registration/take-picture';
429        case 'goto_ktp':
430            return '/registration/take-ektp';
431        case 'goto_ttd':
432            return '/registration/take-specimen';
433        case 'goto_video':
434            return '/registration/take-video?name=' + res.data.user_name;
435        case 'goto_info':
436            return '/registration/finish/?info=' + res.data.info + '&status=' + res.data.oastatus +
437                '&userid=' + res.data.user_id + '&username=' + res.data.user_name;
438        default:
439            return route;
440    }
441}
442
443function getRegData() {
444    const reg = store.state.registration;
445
446    let data = {};
447
448    data['reg-id'] = reg.regid || '';
449    data['token-id'] = reg.data.phone || '';
450    data['OneSignalID'] = '';
451
452    data['Sumber Kekayaan Warisan'] = 'false';
453    data['Sumber Kekayaan Tabungan'] = 'false';
454    data['Sumber Kekayaan Hasil Usaha'] = 'false';
455    data['Sumber Kekayaan Hibah'] = 'false';
456    data['Sumber Kekayaan Gaji'] = 'false';
457    data['Sumber Kekayaan Lainnya'] = '';
458
459    data['Email'] = reg.data.email || '';
460    data['Handphone'] = reg.data.phone || '';
461
462    if (reg.data.nik) {
463        data['EKTP'] = reg.data.nik.replace(/-/g, '') || '';
464    } else {
465        data['EKTP'] = reg.data.nik || '';
466    }
467
468    data['nama'] = reg.data.name || '';
469
470    data['SumberDana'] = reg.data.fund || '';
471
472    switch (reg.data.fund) {
473        case 'Orang Tua':
474            data['Sumber Kekayaan Warisan'] = 'true';
475            data['Pekerjaan'] = 'Pelajar/Mahasiswa';
476            data['Jabatan'] = 'Pelajar';
477            data['Bidang Usaha'] = 'Pendidikan';
478            data['Nama Sekolah'] = reg.data['school-name'] || '';
479            data['Telp Sekolah'] = reg.data['school-phone'] || '';
480            data['Alamat Sekolah'] = reg.data['school-address'] || '';
481            data['KodePos Sekolah'] = reg.data['school-postal-code'] || '';
482
483            data['BO'] = {
484                'Nama': reg.data.funder || '',
485                'Pekerjaan': reg.data.job || '',
486                'Jabatan': reg.data.title || 'Pemilik',
487                'Nama Perusahaan': reg.data['company-name'] || '',
488                'Telp Kantor ': reg.data['company-phone'] || '',
489                'Bidang Usaha': reg.data['company-sector'] || '',
490                'Alamat Kantor': reg.data['company-address'] || '',
491                'KodePos Kantor': reg.data['company-postal-code'] || '',
492                'Penghasilan': reg.data.income || ''
493            };
494
495            // data['Nama OrangTua'] = reg.data.funder || '';
496            // data['Pekerjaan OrangTua'] = reg.data.job || '';
497            // data['Jabatan OrangTua'] = reg.data.title || '';
498            // data['Nama Perusahaan OrangTua'] = reg.data['company-name'] || '';
499            // data['Telp Kantor OrangTua'] = reg.data['company-phone'] || '';
500            // data['Bidang Usaha OrangTua'] = reg.data['company-sector'] || '';
501            // data['Alamat Kantor OrangTua'] = reg.data['company-address'] || '';
502            // data['KodePos Kantor OrangTua'] = reg.data['company-postal-code'] || '';
503            // data['Penghasilan OrangTua'] = reg.data.income || '';
504
505            break;
506        case 'Pasangan':
507            data['Sumber Kekayaan Tabungan'] = 'true';
508            data['Pekerjaan'] = 'Ibu Rumah Tangga';
509            data['Jabatan'] = 'Ibu/Bapak Rumah Tangga';
510            data['Nama Perusahaan'] = 'Rumah Tangga';
511            data['Bidang Usaha'] = 'Lainnya';
512            data['Telp Kantor'] = '02112345678';
513            data['Alamat Kantor'] = 'Jalan';
514            data['KodePos Kantor'] = reg.data['company-postal-code'] || '10210';
515
516            data['BO'] = {
517                'Nama': reg.data.funder || '',
518                'Pekerjaan': reg.data.job || '',
519                'Jabatan': reg.data.title || 'Pemilik',
520                'Nama Perusahaan': reg.data['company-name'] || '',
521                'Telp Kantor ': reg.data['company-phone'] || '',
522                'Bidang Usaha': reg.data['company-sector'] || '',
523                'Alamat Kantor': reg.data['company-address'] || '',
524                'KodePos Kantor': reg.data['company-postal-code'] || '',
525                'Penghasilan': reg.data.income || ''
526            };
527
528            // data['Nama Pasangan'] = reg.data.funder || '';
529            // data['Pekerjaan Pasangan'] = reg.data.job || '';
530            // data['Jabatan Pasangan'] = reg.data.title || '';
531            // data['Nama Perusahaan Pasangan'] = reg.data['company-name'] || '';
532            // data['Telp Kantor Pasangan'] = reg.data['company-phone'] || '';
533            // data['Bidang Usaha Pasangan'] = reg.data['company-sector'] || '';
534            // data['Alamat Kantor Pasangan'] = reg.data['company-address'] || '';
535            // data['KodePos Kantor Pasangan'] = reg.data['company-postal-code'] || '';
536            // data['Penghasilan Pasangan'] = reg.data.income || '';
537
538            break;
539        default:
540            data['Pekerjaan'] = reg.data.job || '';
541            data['Jabatan'] = reg.data.title || '';
542            data['Nama Perusahaan'] = reg.data['company-name'] || '';
543            data['Telp Kantor'] = reg.data['company-phone'] || '';
544            data['Bidang Usaha'] = reg.data['company-sector'] || '';
545            data['Alamat Kantor'] = reg.data['company-address'] || '';
546            data['KodePos Kantor'] = reg.data['company-postal-code'] || '';
547            data['Penghasilan'] = reg.data.income || '';
548
549            if (reg.data.fund == 'Gaji') {
550                data['Sumber Kekayaan Gaji'] = 'true';
551            } else if (reg.data.fund == 'Hasil Usaha') {
552                data['Sumber Kekayaan Hasil Usaha'] = 'true';
553            } else if (reg.data.fund == 'Dana Pensiun') {
554                data['Sumber Kekayaan Tabungan'] = 'true';
555            }
556
557            break;
558    }
559
560    if (reg.data.npwp) {
561        data['NPWP'] = reg.data.npwp.replace(/-/g, '').replace(/\./g, '') || '';
562    } else {
563        data['NPWP'] = reg.data.npwp || '';
564    }
565
566    data['Tujuan BukaRekening'] = reg.data.goal || '';
567
568    if (reg.data.fatca) {
569        data['Facta'] = reg.data.fatca[0] == 'on' ? 'true' : 'false';
570    } else {
571        data['Facta'] = 'false';
572    }
573
574    if (reg.data.correspondence == 'Lainnya') {
575        data['Alamat Korespondensi'] = reg.data['correspondence-address'] || '';
576        data['KodePos Korespondensi'] = reg.data['correspondence-postal-code'] || '';
577    } else {
578        data['Korespondensi'] = reg.data.correspondence || '';
579    }
580
581    data['Nama Bank Pribadi'] = reg.data['account-name'] || '';
582    data['No Rekening Pribadi'] = reg.data['account-number'] || '';
583    data['Ibu Kandung'] = reg.data['mother-maiden-name'] || '';
584    data['Lama Tinggal Di Alamat Terakhir'] = reg.data.year || '';
585
586    if (reg.data['radio-other-account-name'] == 'Y') {
587        data['Pemilikan Rekening Bank Lain'] = 'true';
588        data['Nama Bank Lainnya'] = reg.data['other-account-name'] || '';
589        data['Lama Kepemilikan Rekening Bank Lain'] = reg.data['other-account-name-year'] || '';
590    } else {
591        data['Pemilikan Rekening Bank Lain'] = 'false';
592    }
593
594    if (reg.data['radio-country'] == 'Y') {
595        data['Hubungan Usaha Di Luar Negeri'] = 'true';
596        data['Negara Tempat Usaha'] = reg.data.country || '';
597    } else {
598        data['Hubungan Usaha Di Luar Negeri'] = 'false';
599    }
600
601    data['Username'] = reg.data.username || '';
602
603    data['Syariah'] = 'false';
604    data['data_version'] = '4';
605    data['indopremieraggreementinfo'] = 'INDOPREMIER-IPOT_V1.0_20260121';
606    data['rdnbankagreementinfo'] = '15-aggreement-rdn-non-bca.html';
607
608    return data;
609}
610
611async function requestSheetDisagree(title) {
612    return await app.request.get('app/ipot_oa/template/sheet_disagree.html')
613        .then((res) => {
614            let content = res.data;
615
616            return app.sheet.create({
617                content,
618                swipeToClose: true,
619                backdrop: true,
620                on: {
621                    open: function (sheet) {
622                        $$('#account-type').text(title);
623
624                        if (app.width < 768) {
625                            $$('#button-disagree').addClass('margin-bottom-half');
626                        }
627
628                        $$('#button-disagree').on('click', function (e) {
629                            sheet.disagree = true;
630                        });
631                    },
632                    closed: function (sheet) {
633                        if (sheet.disagree) {
634                            mainView.router.navigate('/home/', {
635                                clearPreviousHistory: true
636                            });
637                        }
638                    }
639                }
640            });
641        });
642}
643
644function setOcrData(OCR, custom) {
645    // console.log('setOcrData: ', [OCR, custom]);
646
647    if (custom) {
648        if (custom.customBirthDate) OCR.TGL_LHR = custom.customBirthDate;
649        if (custom.customJob) OCR.JENIS_PKRJN = custom.customJob;
650    }
651
652    let {
653        PROP_NAME,
654        KAB_NAME,
655        NIK,
656        NAMA_LGKP,
657        TMPT_LHR,
658        TGL_LHR,
659        JENIS_KLMIN,
660        GOL_DARAH,
661        ALAMAT,
662        NO_RT,
663        NO_RW,
664        KEL_NAME,
665        KEC_NAME,
666        AGAMA,
667        STATUS_KAWIN,
668        JENIS_PKRJN,
669        KEWARGANEGARAAN,
670        BERLAKU_HGA,
671        NAMA_LGKP_IBU
672    } = OCR;
673
674    app.request({
675        url: 'app/json/job.json',
676        method: 'GET',
677        dataType: 'json',
678        success: function (data) {
679            let key = 'karyawan swasta';
680
681            if (JENIS_PKRJN) {
682                key = JENIS_PKRJN.toLowerCase();
683            }
684
685            if (!data[key]) {
686                data[key] = {
687                    bidang_usaha: '', fund: 'Gaji', job: 'Karyawan Swasta', jabatan: ''
688                };
689            }
690
691            // console.log('job: ', key);
692            // console.log('job data: ', data[key]);
693            const {
694                bidang_usaha, fund, job, jabatan
695            } = data[key];
696            let age;
697
698            if (TGL_LHR) {
699                age = _calculateAge(new Date(TGL_LHR));
700            } else {
701                age = 35;
702            }
703
704            if (age) {
705                let penghasilan;
706
707                if (age < 26) {
708                    penghasilan = 'Lebih besar 50 Juta dan kurang atau sama dengan 100 Juta';
709                } else if (age >= 26 && age < 31) {
710                    penghasilan = 'Lebih besar 100 Juta dan kurang atau sama dengan 250 Juta';
711                } else if (age >= 31 && age < 41) {
712                    penghasilan = 'Lebih besar 250 Juta dan kurang atau sama dengan 400 Juta';
713                } else if (age >= 41 && age < 51) {
714                    penghasilan = 'Lebih besar 400 Juta dan kurang atau sama dengan 500 Juta';
715                } else {
716                    penghasilan = 'Lebih besar 500 Juta dan kurang atau sama dengan 1 Milyar';
717                }
718
719                let dataPenghasilan = app.form.getFormData('form-income');
720
721                if (dataPenghasilan) {
722                    dataPenghasilan.income = penghasilan;
723                    app.form.storeFormData('form-income', dataPenghasilan);
724                    app.utils.extend(app.store.state.registration.data, dataPenghasilan);
725                } else {
726                    const data = {
727                        income: penghasilan
728                    };
729                    app.form.storeFormData('form-income', data);
730                    app.utils.extend(app.store.state.registration.data, data);
731                }
732            }
733
734            if (jabatan) {
735                const data = {
736                    title: jabatan
737                };
738                app.form.storeFormData('form-title', data);
739                app.utils.extend(app.store.state.registration.data, data);
740            } else {
741                let jbt;
742
743                switch (job) {
744                    case 'Karyawan Swasta':
745                        if (age < 31) {
746                            jbt = 'Staff';
747                        } else {
748                            jbt = 'Manajer';
749                        }
750                        break;
751                    case 'Pegawai BUMN/BUMD':
752                        if (age < 31) {
753                            jbt = 'Staff';
754                        } else {
755                            jbt = 'Manajer';
756                        }
757                        break;
758                    case 'PNS':
759                        if (age < 26) {
760                            jbt = 'PNS Esselon 4';
761                        } else if (age >= 31 && age < 41) {
762                            jbt = 'PNS Esselon 3';
763                        } else {
764                            jbt = 'PNS Esselon 2';
765                        }
766                        break;
767                    case 'TNI / Polri':
768                        if (age < 41) {
769                            jbt = 'Staff Polsek/Polres';
770                        } else {
771                            jbt = 'Perwira Tinggi';
772                        }
773                        break;
774                    default:
775                        break;
776                }
777
778                if (jbt) {
779                    const data = {
780                        title: jbt
781                    };
782                    app.form.storeFormData('form-title', data);
783                    app.utils.extend(app.store.state.registration.data, data);
784                }
785            }
786
787            app.form.storeFormData('form-job', {
788                job
789            });
790
791            app.form.storeFormData('form-fund', {
792                fund
793            });
794
795            app.form.storeFormData('form-fund-awal', {
796                fund
797            });
798
799            let data1 = {
800                job, fund
801            };
802            app.utils.extend(app.store.state.registration.data, data1);
803
804            if (bidang_usaha && fund != 'Gaji' && fund != 'Orang Tua') {
805                const data = {
806                    'company-sector': bidang_usaha
807                };
808
809                app.form.storeFormData('form-company', data);
810                app.utils.extend(app.store.state.registration.data, data);
811            }
812
813            if (fund == 'Dana Pensiun') {
814                const data = {
815                    title: 'Pensiun PNS Esselon 1/2'
816                };
817
818                app.form.storeFormData('form-title', data);
819                app.utils.extend(app.store.state.registration.data, data);
820            }
821        }
822    });
823}
824
825function _calculateAge(birthday) {
826    var ageDifMs = Date.now() - birthday.getTime();
827    var ageDate = new Date(ageDifMs);
828    return Math.abs(ageDate.getUTCFullYear() - 1970);
829}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.