VaKeR CYBER ARMY
Logo of a company Server : Apache/2.4.41 (Ubuntu)
System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Directory :  /var/www/html/keeview_app/html/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/html/keeview_app/html/onboarding.js
hr.onboarding.taskPreview = function(host, id){
    hr.onboarding.getValueOfVariableForTemplate(host).then(function(valueOfVariable){
        var index = host.database.task_templates.getIndex(id);
        var template = EncodingClass.string.toVariable(host.database.task_templates.items[index].content);
        var taskContent = {
            name: template.task_name != "" ? hr.sclang.executeTemplate(template.task_name, valueOfVariable.variableToString) : "",
            status: template.task_status ? 1 : 0,
            endtime: hr.sclang.executeExpression(template.task_expire_time.substring(3, template.task_expire_time.length - 3), valueOfVariable.originVariable),
            reminder: template.task_reminder,
            assignto: hr.sclang.executeExpression(template.task_assign_to.substring(3, template.task_assign_to.length - 3), valueOfVariable.originVariable),
            // participant: hr.templateSupportFunctions.templateParser(content.task_participant, Object.assign({},hr.templateSupportFunctions ,valueOfVariable.originVariable)),
            result: template.task_result != "" ? hr.sclang.executeTemplate(template.task_result, valueOfVariable.variableToString) : "",
            extrainfo: {}
        };
        if (template.task_participant.startsWith("{{") && template.task_participant.endsWith("}}")){
            taskContent.participant = [hr.sclang.executeExpression(template.task_participant.substring(3, template.task_participant.length - 3), valueOfVariable.originVariable)];
            if (taskContent.participant[0] == 0) taskContent.participant = [];
        }
        else taskContent.participant = [];
        var viewDiv = absol._({});
        contentModule.makeOutputFormData({
            typeid: data_module.form_config["task"].typeid,
            formid: data_module.form_config["task"].output_form,
            initialValue: taskContent,
            formContainer: viewDiv,
            typelists: data_module.typelists.items,
            variableType: "system"
        }).then(function(getValue){
            ModalElement.showWindow({
                index: 5,
                title: LanguageModule.text("txt_task"),
                bodycontent: viewDiv,
                buttonlist: [
                    {
                        text: LanguageModule.text("txt_close"),
                        onclick: function(){
                            ModalElement.close(5);
                        }
                    }
                ]
            });
        });
    });
};

hr.onboarding.meetingPreview = function(host, id){
    hr.onboarding.getValueOfVariableForTemplate(host).then(function(valueOfVariable){
        var index = host.database.meeting_templates.getIndex(id);
        var template = EncodingClass.string.toVariable(host.database.meeting_templates.items[index].content);
        var meetingContent = {
            name: hr.sclang.executeTemplate(template.meeting_name, valueOfVariable.variableToString),
            location: hr.sclang.executeTemplate(template.meeting_location, valueOfVariable.variableToString),
            status: template.meeting_status ? 1 : 0,
            type: template.meeting_type,
            starttime: hr.sclang.executeExpression(template.meeting_start_time.substring(3, template.meeting_start_time.length - 3), valueOfVariable.originVariable),
            endtime: hr.sclang.executeExpression(template.meeting_end_time.substring(3, template.meeting_end_time.length - 3), valueOfVariable.originVariable),
            reminder: template.meeting_reminder,
            allday: template.meeting_all_day ? 1 : 0,
            assignto: hr.sclang.executeExpression(template.meeting_assign_to.substring(3, template.meeting_assign_to.length - 3), valueOfVariable.originVariable),
            result: hr.sclang.executeTemplate(template.meeting_result, valueOfVariable.variableToString),
            extrainfo: {}
        };
        if (template.meeting_participant.startsWith("{{") && template.meeting_participant.endsWith("}}")){
            meetingContent.participant = [hr.sclang.executeExpression(template.meeting_participant.substring(3, template.meeting_participant.length - 3), valueOfVariable.originVariable)];
        }
        else meetingContent.participant = [];
        var viewDiv = absol._({});
        contentModule.makeOutputFormData({
            typeid: data_module.form_config["meeting"].typeid,
            formid: data_module.form_config["meeting"].output_form,
            initialValue: meetingContent,
            formContainer: viewDiv,
            typelists: data_module.typelists.items,
            variableType: "system"
        }).then(function(getValue){
            ModalElement.showWindow({
                index: 5,
                title: LanguageModule.text("txt_meeting"),
                bodycontent: viewDiv,
                buttonlist: [
                    {
                        text: LanguageModule.text("txt_close"),
                        onclick: function(){
                            ModalElement.close(5);
                        }
                    }
                ]
            });
        });
    });
};

hr.onboarding.emailPreview = function(host, id){
    hr.onboarding.getValueOfVariableForTemplate(host).then(function(valueOfVariable){
        var index = host.database.email_templates.getIndex(id);
        var template = EncodingClass.string.toVariable(host.database.email_templates.items[index].content);
        var emailContent = {
            receiver: hr.sclang.executeExpression(template.receiver.substring(3, template.receiver.length - 3), valueOfVariable.originVariable)
        };
        if (template.carbon_copy.startsWith("{{") && template.carbon_copy.endsWith("}}")){
            emailContent.carbon_copy = [hr.sclang.executeExpression(template.carbon_copy.substring(3, template.carbon_copy.length - 3), valueOfVariable.originVariable)];
        }
        else emailContent.carbon_copy = [];
        if (template.blind_carbon_copy.startsWith("{{") && template.blind_carbon_copy.endsWith("}}")){
            emailContent.blind_carbon_copy = [hr.sclang.executeExpression(template.blind_carbon_copy.substring(3, template.blind_carbon_copy.length - 3), valueOfVariable.originVariable)];
        }
        else emailContent.blind_carbon_copy = [];
        emailContent.email_content = hr.sclang.executeTemplate(template.email_content, valueOfVariable.variableToString);
        emailContent.subject = template.subject;
        ModalElement.showWindow({
            index: 5,
            title: "Email",
            bodycontent: absol._({
                child: DOMElement.table({
                    data: [
                        [
                            {
                                attrs: {
                                    style: {
                                        paddingRight: "20px"
                                    }
                                },
                                text: "Chủ đề"
                            },
                            {
                                text: emailContent.subject
                            }
                        ],
                        [{attrs: {style: {height: "10px"}}}],
                        [
                            {
                                attrs: {
                                    style: {
                                        paddingRight: "20px"
                                    }
                                },
                                text: "Người nhận"
                            },
                            {
                                text: emailContent.receiver
                            }
                        ],
                        [{attrs: {style: {height: "10px"}}}],
                        [
                            {
                                attrs: {
                                    style: {
                                        paddingRight: "20px"
                                    }
                                },
                                text: "Cc"
                            },
                            {
                                text: emailContent.carbon_copy.toString()
                            }
                        ],
                        [{attrs: {style: {height: "10px"}}}],
                        [
                            {
                                attrs: {
                                    style: {
                                        paddingRight: "20px"
                                    }
                                },
                                text: "Bcc"
                            },
                            {
                                text: emailContent.blind_carbon_copy.toString()
                            }
                        ],
                        [{attrs: {style: {height: "10px"}}}],
                        [
                            {
                                attrs: {
                                    style: {
                                        paddingRight: "20px"
                                    }
                                },
                                text: "Nội dung"
                            },
                            {
                                innerHTML: emailContent.email_content
                            }
                        ],
                    ]
                })
            }),
            buttonlist: [
                {
                    text: LanguageModule.text("txt_close"),
                    onclick: function(){
                        ModalElement.close(5);
                    }
                }
            ]
        })
    });
};

hr.onboarding.getCellActivities = function(host, onboardingid, id, params){
    var today = new Date();
    var relativeId = id;
    var index = host.database.activities.getIndex(id);
    var activityType = host.database.activities.items[index].activityType;
    if (activityType == "type_meeting") id = host.database.activities.items[index].meetingid;
    else id = host.database.activities.items[index].taskid;
    var func = {
        view: function(resolve){
            if (activityType == "type_meeting") {
                hr.onboarding.editMeeting(host, onboardingid, id, params).then(function(value){
                    resolve(value);
                });
            }
            else {
                hr.onboarding.editTask(host, onboardingid, id, params).then(function(value){
                    resolve(value);
                });
            }
        },
    };
    func.delete = function(){
        if (activityType == "type_meeting") {
            return hr.onboarding.deleteMeeting(host, onboardingid, id, params);
        }
        else {
            return hr.onboarding.deleteTask(host, onboardingid, id, params);
        }
        // return new Promise(function(resolve,reject){
        // });
    };
    func.changeStatus = function(value){
        // return new Promise(function(resolve, reject){
            if (host.database.activities.items[index].status == 1) host.chartContent.success--;
            else if (host.database.activities.items[index].endtime > today) host.chartContent.pending--;
            else host.chartContent.unsuccess--;
            host.chartContent.count--;
            return hr.onboarding.activitiesStatusChangeSave(host, activityType == "type_meeting" ? "meeting" : "task", id, value, params, onboardingid);
        // }, function(err){console.log(err);});
    };
    var res = EncodingClass.string.duplicate(host.database.activities.items[index]);
    if (host.database.activities.items[index].tablename) {
        res.activityPurpose = {
            tablename: host.database.activities.items[index].tablename,
            instanceid: host.database.activities.items[index].instanceid
        };
    }
    func.markedFunc = function(marked){
        return contentModule.markedFunc(host, {
            id: relativeId,
            marked: marked,
            task: "activities",
            tablename: "activities"
        });
    };
    res.func = func;
    return res;
};

hr.onboarding.drawActivitiesInformation = function(host, onboardingid, params) {
    return new Promise(function(rs, rj) {
        var employeeItems = contentModule.getMemberOfEmployeeSelectMenu(host);
        employeeItems[0].text = LanguageModule.text("txt_all_employee");

        var data = [];
        var x;
        for (var i = 0; i < host.database.activities.items.length; i++){
            x = hr.onboarding.getCellActivities(host, onboardingid, host.database.activities.items[i].id, params);
            data.push(x);
        };

        theme.formOnboardingActivitiesContentData({
            data: data,
            host: host,
            addMeetingByTemplate: params.addMeetingByTemplate,
            addTaskByTemplate: params.addTaskByTemplate,
            user_column_configsDic: host.user_column_configsDic,
            addMeeting: function(){
                return hr.onboarding.editMeeting(host, onboardingid, 0, params);
            },
            addTask: function(){
                return hr.onboarding.editTask(host, onboardingid, 0, params);
            },
            addActivitiesSelected: params.addActivitiesSelected,
            employeeItems: employeeItems
        }).then(function(dataView){
            params.activities.clearChild();
            params.activities.addChild(dataView);
            rs();
        }, function(err){console.log(err); rj(err)});
    })
};

hr.onboarding.wizardAddSubmit = function(host){
    var dataInfor = host.onboardingEdit.getValue();
    var dataEmail = host.emailEditElt.getValue();
    var dataTask = host.taskEditElt.getValue();
    var dataMeeting = host.meetingEditElt.getValue();
    dataInfor.ver = 1;
    dataInfor.available = dataInfor.available? 1: 0;
    dataInfor.extrainfo = EncodingClass.string.fromVariable(dataInfor.extrainfo);
    delete(dataInfor.files);
    host.employeeid = dataInfor.employeeid;
    hr.onboarding.getValueOfVariableForTemplate(host).then(function(valueOfVariable){
        var email_array = [];
        dataEmail.forEach(function(elt){
            var index = host.database.email_templates.getIndex(elt);
            var template = EncodingClass.string.toVariable(host.database.email_templates.items[index].content);
            var emailContent = {
                receiver: hr.sclang.executeExpression(template.receiver.substring(3, template.receiver.length - 3), valueOfVariable.originVariable)
            };
            if (template.carbon_copy.startsWith("{{") && template.carbon_copy.endsWith("}}")){
                emailContent.carbon_copy = [hr.sclang.executeExpression(template.carbon_copy.substring(3, template.carbon_copy.length - 3), valueOfVariable.originVariable)];
            }
            else emailContent.carbon_copy = [];
            if (template.blind_carbon_copy.startsWith("{{") && template.blind_carbon_copy.endsWith("}}")){
                emailContent.blind_carbon_copy = [hr.sclang.executeExpression(template.blind_carbon_copy.substring(3, template.blind_carbon_copy.length - 3), valueOfVariable.originVariable)];
            }
            else emailContent.blind_carbon_copy = [];
            emailContent.email_content = hr.sclang.executeTemplate(template.email_content, valueOfVariable.variableToString);
            emailContent.subject = template.subject;
            email_array.push(emailContent);
        });
        var task_array = [];
        dataTask.forEach(function(elt){
            ////////////////////
            var index = host.database.task_templates.getIndex(elt);
            var template = EncodingClass.string.toVariable(host.database.task_templates.items[index].content);
            var taskContent = {
                name: hr.sclang.executeTemplate(template.task_name, valueOfVariable.variableToString),
                status: template.task_status ? 1 : 0,
                endtime: hr.sclang.executeExpression(template.task_expire_time.substring(3, template.task_expire_time.length - 3), valueOfVariable.originVariable),
                reminder: template.task_reminder,
                assignto: hr.sclang.executeExpression(template.task_assign_to.substring(3, template.task_assign_to.length - 3), valueOfVariable.originVariable),
                // participant: hr.templateSupportFunctions.templateParser(content.task_participant, Object.assign({},hr.templateSupportFunctions ,valueOfVariable.originVariable)),
                result: template.task_result != "" ? hr.sclang.executeTemplate(template.task_result, valueOfVariable.variableToString) : "",
                extrainfo: EncodingClass.string.fromVariable({})
            };
            if (template.task_participant.startsWith("{{") && template.task_participant.endsWith("}}")){
                taskContent.participant = [hr.sclang.executeExpression(template.task_participant.substring(3, template.task_participant.length - 3), valueOfVariable.originVariable)];
            }
            else taskContent.participant = [];
            var participantStr = "";
            taskContent.participant.forEach(function(elt){
                if (elt != 0) participantStr += "_" + elt;
            });
            if (participantStr != "") participantStr += "_";
            taskContent.participant = participantStr;
            task_array.push(taskContent);
        });

        var meeting_array = [];
        dataMeeting.forEach(function(elt){
            ////////////////////
            var index = host.database.meeting_templates.getIndex(elt);
            var template = EncodingClass.string.toVariable(host.database.meeting_templates.items[index].content);
            var meetingContent = {
                name: hr.sclang.executeTemplate(template.meeting_name, valueOfVariable.variableToString),
                location: hr.sclang.executeTemplate(template.meeting_location, valueOfVariable.variableToString),
                status: template.meeting_status ? 1 : 0,
                type: template.meeting_type,
                starttime: hr.sclang.executeExpression(template.meeting_start_time.substring(3, template.meeting_start_time.length - 3), valueOfVariable.originVariable),
                endtime: hr.sclang.executeExpression(template.meeting_end_time.substring(3, template.meeting_end_time.length - 3), valueOfVariable.originVariable),
                reminder: template.meeting_reminder,
                allday: template.meeting_all_day ? 1 : 0,
                assignto: hr.sclang.executeExpression(template.meeting_assign_to.substring(3, template.meeting_assign_to.length - 3), valueOfVariable.originVariable),
                result: template.meeting_result != "" ? hr.sclang.executeTemplate(template.meeting_result, valueOfVariable.variableToString) : "",
                extrainfo: EncodingClass.string.fromVariable({})
            };
            if (template.meeting_participant.startsWith("{{") && template.meeting_participant.endsWith("}}")){
                meetingContent.participant = [hr.sclang.executeExpression(template.meeting_participant.substring(3, template.meeting_participant.length - 3), valueOfVariable.originVariable)];
            }
            else meetingContent.participant = [];
            var participantStr = "";
            meetingContent.participant.forEach(function(elt){
                if (elt != 0) participantStr += "_" + elt;
            });
            if (participantStr != "") participantStr += "_";
            meetingContent.participant = participantStr;
            meeting_array.push(meetingContent);
        });

        ModalElement.show_loading();
        FormClass.api_call({
            url: "onboarding_save_new.php",
            params: [
                {name: "dataInfor", value: EncodingClass.string.fromVariable(dataInfor)},
                {name: "dataEmail", value: EncodingClass.string.fromVariable(email_array)},
                {name: "dataTask", value: EncodingClass.string.fromVariable(task_array)},
                {name: "dataMeeting", value: EncodingClass.string.fromVariable(meeting_array)}
            ],
            func: function(success, message){
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var st = EncodingClass.string.toVariable(message.substr(2));
                        var content = st.dataInfor;
                        content.extrainfo = EncodingClass.string.toVariable(content.extrainfo);
                        if (content.available){
                            host.database.onboarding.items.forEach(function(item){
                                if (item.employeeid == dataInfor.employeeid) item.available = 0;
                            });
                        }
                        host.dataOnboardingEdit = content;
                        host.database.onboarding.items.push(content);

                        var taskContent = st.dataTask;
                        // host.database.tasks.items = host.database.tasks.items.concat(taskContent.tasks);
                        // host.database.task_links.items = host.database.task_links.items.concat(taskContent.task_links);

                        var taskContent = st.dataMeeting;
                        // host.database.meetings.items = host.database.meetings.items.concat(content.meetings);
                        // host.database.meeting_links.items = host.database.meeting_links.items.concat(content.meeting_links);

                        var emailContent = st.dataEmail;
                        emailErr = [];
                        emailContent.forEach(function(elt, idx){
                            if (elt.email_record == 0) {
                                emailErr.push(dataEmail[idx]);
                            }
                        });
                        ModalElement.close();

                        if (emailErr.length > 0){
                            var str = "";
                            emailErr.forEach((item, i) => {
                                var index = host.database.email_templates.getIndex(item);
                                if (str != "") str += ", ";
                                str += host.database.email_templates.items[index].name;
                            });
                            ModalElement.alert({
                                message: "Có " + emailErr.length + "/" + dataEmail.length + " gửi không thành công: " + str,
                                func: function(){
                                    hr.onboarding.redraw(host);
                                    hr.onboarding.showOnboardingPre(host, content.id);
                                }
                            })
                            // Promise.all(emailPromise).then(function(value){
                            //     // ModalElement.close(-1);
                            //     ModalElement.close();
                            //     hr.onboarding.redraw(host);
                            //     hr.onboarding.showOnboardingPre(host, content.id);
                            // });
                        }
                        else {
                            hr.onboarding.redraw(host);
                            hr.onboarding.showOnboardingPre(host, content.id);
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    }, function(err){console.log(err);});
};

hr.onboarding.wizardAdd = function(host){
    var redraw = function(){
        var vTimeline = absol.buildDom({
            tag: 'verticaltimeline',
            props: {
                items: [
                    {text: LanguageModule.text("txt_employee")},
                    {text: LanguageModule.text("txt_task")},
                    {text: LanguageModule.text("txt_meeting")},
                    {text: LanguageModule.text("txt_email")},
                    {text: LanguageModule.text("txt_finish")}
                ]
            }
        });
        host.onboardingEdit = DOMElement.div({});
        contentModule.makeFormData({
            typeid: data_module.form_config.onboarding.typeid,
            formid: data_module.form_config.onboarding.input_form,
            initialValue: {},
            formContainer: host.onboardingEdit,
            typelists: data_module.typelists.items,
            variableType: "system"
        }).then(function(getValue){
            host.onboardingEdit.getValue = getValue;
            host.onboardingEdit.formFragment.setContext('host', host);
        });
        var firstPageCtn = DOMElement.div({
            attrs: {
                className: 'kv-document-2-site-right kv-document-page'
            },
            children: [
                absol.buildDom({
                    class: 'kv-document-page-header',
                    child: [
                        {
                            tag: 'span',
                            class: 'kv-document-page-title',
                            child: { text: LanguageModule.text("txt_employee") }
                        },

                        {
                            tag: 'button',
                            class: ['kv-document-transparent-btn', 'kv-document-page-close-btn'],
                            child: 'span.mdi.mdi-close',
                            on: {
                                click: function(){
                                    ModalElement.close();
                                }
                            }
                        }
                    ]
                }),
                DOMElement.div({
                    attrs: {
                        className: 'kv-document-page-content'
                    },
                    children: [
                        absol._({
                            style: {
                                paddingBottom: "20px"
                            },
                            child: {text: LanguageModule.text("txt_onboarding_employee_note")}
                        }),
                        host.onboardingEdit
                    ]
                }),
                absol.buildDom({
                    class: 'kv-document-page-footer',
                    child: [
                        DOMElement.div({attrs: {className: "kv-document-page-footer-left"}}),
                        DOMElement.div({
                            attrs: {className: "kv-document-page-footer-right"},
                            children: [
                                theme.noneIconButton({
                                    className: "primary",
                                    text: LanguageModule.text("txt_next"),
                                    onclick: function(){
                                        var data = host.onboardingEdit.getValue();
                                        if (!data) return;
                                        vTimeline.current = 1;
                                        firstPageCtn.style.display = "none";
                                        emailPageCtn.style.display = "none";
                                        taskPageCtn.style.display = "";
                                        meetingPageCtn.style.display = "none";
                                        finishPageCtn.style.display = "none";
                                    }
                                }),
                                DOMElement.div({
                                    attrs: {
                                        className: "kv-document-link",
                                        onclick: function(){
                                            ModalElement.close();
                                        }
                                    },
                                    text: LanguageModule.text("txt_cancel")
                                })
                            ]
                        })
                    ]
                })
            ]
        });
        var dict = {};
        // var groupItems = host.database.template_groups.items.map(function(elt){
        //     dict[elt.id] = elt.name;
        //     return {
        //         value: elt.id,
        //         text: elt.name,
        //         sortText: absol.string.nonAccentVietnamese(elt.name.toLowerCase())
        //     }
        // });
        // groupItems.sort(function(a, b){
        //     if (a.sortText > b.sortText) return 1;
        //     if (a.sortText < b.sortText) return -1;
        //     return 0;
        // });
        // groupItems.unshift({value: 0, text: LanguageModule.text("txt_all")});
        var email_data = [];
        host.database.email_templates.items.forEach(function(elt){
            email_data.push({
                id: elt.id,
                name: elt.name,
                comment: elt.comment,
                groupid: elt.groupid,
                groupText: dict[elt.groupid],
                preview: function(){
                    var dataInfor = host.onboardingEdit.getValue();
                    host.employeeid = dataInfor.employeeid;
                    hr.onboarding.emailPreview(host, elt.id);
                }
            });
        });
        var task_data = []
        host.database.task_templates.items.forEach(function(elt){
            task_data.push({
                id: elt.id,
                name: elt.name,
                comment: elt.comment,
                groupid: elt.groupid,
                groupText: dict[elt.groupid],
                preview: function(){
                    var dataInfor = host.onboardingEdit.getValue();
                    host.employeeid = dataInfor.employeeid;
                    hr.onboarding.taskPreview(host, elt.id);
                }
            });
        });
        var meeting_data = [];
        host.database.meeting_templates.items.forEach(function(elt){
            meeting_data.push({
                id: elt.id,
                name: elt.name,
                comment: elt.comment,
                groupid: elt.groupid,
                groupText: dict[elt.groupid],
                preview: function(){
                    var dataInfor = host.onboardingEdit.getValue();
                    host.employeeid = dataInfor.employeeid;
                    hr.onboarding.meetingPreview(host, elt.id);
                }
            });
        });
        host.emailEditElt = theme.formOnboardingAddEmailMainContent({
            // groupItems: groupItems,
            data: email_data
        });
        var emailPageCtn = DOMElement.div({
            attrs: {
                className: 'kv-document-2-site-right kv-document-page',
                style: {display: "none"}
            },
            children: [
                absol.buildDom({
                    class: 'kv-document-page-header',
                    child: [
                        {
                            tag: 'span',
                            class: 'kv-document-page-title',
                            child: { text: LanguageModule.text("txt_email") }
                        },
                        {
                            tag: 'button',
                            class: ['kv-document-transparent-btn', 'kv-document-page-close-btn'],
                            child: 'span.mdi.mdi-close',
                            on: {
                                click: function(){
                                    ModalElement.close();
                                }
                            }
                        }
                    ]
                }),
                DOMElement.div({
                    attrs: {
                        className: 'kv-document-page-content'
                    },
                    children: [
                        absol._({
                            style: {
                                paddingBottom: "20px"
                            },
                            child: {text: LanguageModule.text("txt_onboarding_employee_email_note")}
                        }),
                        host.emailEditElt
                    ]
                }),
                absol.buildDom({
                    class: 'kv-document-page-footer',
                    child: [
                        DOMElement.div({
                            attrs: {className: "kv-document-page-footer-left"},
                            children: [
                                theme.noneIconButton({
                                    text: LanguageModule.text("txt_back"),
                                    onclick: function(){
                                        vTimeline.current = 2;
                                        firstPageCtn.style.display = "none";
                                        emailPageCtn.style.display = "none";
                                        taskPageCtn.style.display = "none";
                                        meetingPageCtn.style.display = "";
                                        finishPageCtn.style.display = "none";
                                    }
                                })
                            ]
                        }),
                        DOMElement.div({
                            attrs: {className: "kv-document-page-footer-right"},
                            children: [
                                theme.noneIconButton({
                                    className: "primary",
                                    text: LanguageModule.text("txt_next"),
                                    onclick: function(){
                                        var dataInfor = host.onboardingEdit.getValue();
                                        var eIndex = host.database.employees.getIndex(dataInfor.employeeid);
                                        var eName = host.database.employees.items[eIndex].fullname;
                                        var dataEmail = host.emailEditElt.getValue();
                                        finishText.clearChild();
                                        if (dataEmail.length > 0) {
                                            finishText.addChild(absol._({text: LanguageModule.text2("txt_onboarding_employee_finish_note_email_yes", [eName])}));
                                        }
                                        else {
                                            finishText.addChild(absol._({text: LanguageModule.text2("txt_onboarding_employee_finish_note_email_no", [eName])}));
                                        }
                                        vTimeline.current = 4;
                                        firstPageCtn.style.display = "none";
                                        emailPageCtn.style.display = "none";
                                        taskPageCtn.style.display = "none";
                                        meetingPageCtn.style.display = "none";
                                        finishPageCtn.style.display = "";
                                    }
                                }),
                                DOMElement.div({
                                    attrs: {
                                        className: "kv-document-link",
                                        onclick: function(){
                                            ModalElement.close();
                                        }
                                    },
                                    text: LanguageModule.text("txt_cancel")
                                })
                            ]
                        })
                    ]
                })
            ]
        });
        host.taskEditElt = theme.formOnboardingAddTaskMainContent({
            // groupItems: groupItems,
            data: task_data
        });
        var taskPageCtn = DOMElement.div({
            attrs: {
                className: 'kv-document-2-site-right kv-document-page',
                style: {display: "none"}
            },
            children: [
                absol.buildDom({
                    class: 'kv-document-page-header',
                    child: [
                        {
                            tag: 'span',
                            class: 'kv-document-page-title',
                            child: { text: LanguageModule.text("txt_task") }
                        },
                        {
                            tag: 'button',
                            class: ['kv-document-transparent-btn', 'kv-document-page-close-btn'],
                            child: 'span.mdi.mdi-close',
                            on: {
                                click: function(){
                                    ModalElement.close();
                                }
                            }
                        }
                    ]
                }),
                DOMElement.div({
                    attrs: {
                        className: 'kv-document-page-content'
                    },
                    children: [
                        absol._({
                            style: {
                                paddingBottom: "20px"
                            },
                            child: {text: LanguageModule.text("txt_onboarding_employee_task_note")}
                        }),
                        host.taskEditElt
                    ]
                }),
                absol.buildDom({
                    class: 'kv-document-page-footer',
                    child: [
                        DOMElement.div({
                            attrs: {className: "kv-document-page-footer-left"},
                            children: [
                                theme.noneIconButton({
                                    text: LanguageModule.text("txt_back"),
                                    onclick: function(){
                                        vTimeline.current = 0;
                                        firstPageCtn.style.display = "";
                                        emailPageCtn.style.display = "none";
                                        taskPageCtn.style.display = "none";
                                        meetingPageCtn.style.display = "none";
                                        finishPageCtn.style.display = "none";
                                    }
                                })
                            ]
                        }),
                        DOMElement.div({
                            attrs: {className: "kv-document-page-footer-right"},
                            children: [
                                theme.noneIconButton({
                                    className: "primary",
                                    text: LanguageModule.text("txt_next"),
                                    onclick: function(){
                                        vTimeline.current = 2;
                                        firstPageCtn.style.display = "none";
                                        emailPageCtn.style.display = "none";
                                        taskPageCtn.style.display = "none";
                                        meetingPageCtn.style.display = "";
                                        finishPageCtn.style.display = "none";
                                    }
                                }),
                                DOMElement.div({
                                    attrs: {
                                        className: "kv-document-link",
                                        onclick: function(){
                                            ModalElement.close();
                                        }
                                    },
                                    text: LanguageModule.text("txt_cancel")
                                })
                            ]
                        })
                    ]
                })
            ]
        });
        host.meetingEditElt = theme.formOnboardingAddTaskMainContent({
            // groupItems: groupItems,
            data: meeting_data
        });
        var meetingPageCtn = DOMElement.div({
            attrs: {
                className: 'kv-document-2-site-right kv-document-page',
                style: {display: "none"}
            },
            children: [
                absol.buildDom({
                    class: 'kv-document-page-header',
                    child: [
                        {
                            tag: 'span',
                            class: 'kv-document-page-title',
                            child: { text: LanguageModule.text("txt_meeting") }
                        },
                        {
                            tag: 'button',
                            class: ['kv-document-transparent-btn', 'kv-document-page-close-btn'],
                            child: 'span.mdi.mdi-close',
                            on: {
                                click: function(){
                                    ModalElement.close();
                                }
                            }
                        }
                    ]
                }),
                DOMElement.div({
                    attrs: {
                        className: 'kv-document-page-content'
                    },
                    children: [
                        absol._({
                            style: {
                                paddingBottom: "20px"
                            },
                            child: {text: LanguageModule.text("txt_onboarding_employee_meeting_note")}
                        }),
                        host.meetingEditElt
                    ]
                }),
                absol.buildDom({
                    class: 'kv-document-page-footer',
                    child: [
                        DOMElement.div({
                            attrs: {className: "kv-document-page-footer-left"},
                            children: [
                                theme.noneIconButton({
                                    text: LanguageModule.text("txt_back"),
                                    onclick: function(){
                                        vTimeline.current = 1;
                                        firstPageCtn.style.display = "none";
                                        emailPageCtn.style.display = "none";
                                        taskPageCtn.style.display = "";
                                        meetingPageCtn.style.display = "none";
                                        finishPageCtn.style.display = "none";
                                    }
                                })
                            ]
                        }),
                        DOMElement.div({
                            attrs: {className: "kv-document-page-footer-right"},
                            children: [
                                DOMElement.div({
                                    attrs: {className: "kv-document-page-footer-right"},
                                    children: [
                                        theme.noneIconButton({
                                            className: "primary",
                                            text: LanguageModule.text("txt_next"),
                                            onclick: function(){
                                                vTimeline.current = 3;
                                                firstPageCtn.style.display = "none";
                                                emailPageCtn.style.display = "";
                                                taskPageCtn.style.display = "none";
                                                meetingPageCtn.style.display = "none";
                                                finishPageCtn.style.display = "none";
                                            }
                                        }),
                                        DOMElement.div({
                                            attrs: {
                                                className: "kv-document-link",
                                                onclick: function(){
                                                    ModalElement.close();
                                                }
                                            },
                                            text: LanguageModule.text("txt_cancel")
                                        })
                                    ]
                                })
                            ]
                        })
                    ]
                })
            ]
        });
        var finishText = absol._({})
        var finishPageCtn = DOMElement.div({
            attrs: {
                className: 'kv-document-2-site-right kv-document-page',
                style: {display: "none"}
            },
            children: [
                absol.buildDom({
                    class: 'kv-document-page-header',
                    child: [
                        {
                            tag: 'span',
                            class: 'kv-document-page-title',
                            child: { text: LanguageModule.text("txt_finish") }
                        },
                        {
                            tag: 'button',
                            class: ['kv-document-transparent-btn', 'kv-document-page-close-btn'],
                            child: 'span.mdi.mdi-close',
                            on: {
                                click: function(){
                                    ModalElement.close();
                                }
                            }
                        }
                    ]
                }),
                DOMElement.div({
                    attrs: {
                        className: 'kv-document-page-content'
                    },
                    children: [
                        absol._({
                            style: {
                                paddingBottom: "20px"
                            },
                            child: finishText
                        })
                    ]
                }),
                absol.buildDom({
                    class: 'kv-document-page-footer',
                    child: [
                        DOMElement.div({
                            attrs: {className: "kv-document-page-footer-left"},
                            children: [
                                theme.noneIconButton({
                                    text: LanguageModule.text("txt_back"),
                                    onclick: function(){
                                        vTimeline.current = 3;
                                        firstPageCtn.style.display = "none";
                                        emailPageCtn.style.display = "";
                                        taskPageCtn.style.display = "none";
                                        meetingPageCtn.style.display = "none";
                                        finishPageCtn.style.display = "none";
                                    }
                                })
                            ]
                        }),
                        DOMElement.div({
                            attrs: {className: "kv-document-page-footer-right"},
                            children: [
                                theme.noneIconButton({
                                    className: "primary",
                                    text: LanguageModule.text("txt_save"),
                                    onclick: function(){
                                        hr.onboarding.wizardAddSubmit(host);
                                    }
                                }),
                                DOMElement.div({
                                    attrs: {
                                        className: "kv-document-link",
                                        onclick: function(){
                                            ModalElement.close();
                                        }
                                    },
                                    text: LanguageModule.text("txt_cancel")
                                })
                            ]
                        })
                    ]
                })
            ]
        });
        ModalElement.show({
            bodycontent: absol.buildDom({
                class: 'kv-document-2-site',
                style: {
                    minWidth: "50vw",
                    height: "70vh"
                },
                child: [
                    {
                        class: 'kv-document-2-site-left',
                        child: [
                            {
                                class: 'kv-document-2-site-left-header',
                                child: [
                                    {
                                        tag: 'span',
                                        class: 'kv-document-2-site-left-header-text',
                                        child: { text: LanguageModule.text("txt_onboarding") }
                                    }
                                ]
                            },
                            vTimeline
                        ]
                    },
                    firstPageCtn,
                    taskPageCtn,
                    meetingPageCtn,
                    emailPageCtn,
                    finishPageCtn
                ]
            })
        });
    };
    redraw();
};

hr.onboarding.wizardAddPre = function(host){
    ModalElement.show_loading();
    FormClass.api_call({
        url: "database_load.php",
        params: [
            {name: "task", value: "onboarding_load_template"}
        ],
        func: function(success, message){
            ModalElement.close(-1);
            if (success){
                if (message.substr(0, 2) == "ok") {
                    var st = EncodingClass.string.toVariable(message.substr(2));
                    var content = {
                        email_templates: [],
                        task_templates: [],
                        meeting_templates: []
                    }
                    st.forEach((cur) => {
                        switch (cur.type) {
                            case "email":
                                content.email_templates.push(cur);
                                break;
                            case "task":
                                content.task_templates.push(cur);
                                break;
                            case "meeting":
                                content.meeting_templates.push(cur);
                                break;
                            default:

                        }
                    });

                    contentModule.makeDatabaseContent(host, content);
                    hr.onboarding.wizardAdd(host);
                }
                else {
                    console.log(message);
                }
            }
            else {
                console.log(message);
            }
        }
    });
}

hr.onboarding.editTaskSave = function(host, onboardingid, id, editFormView, tableName){
    return new Promise(function(rs, rj){
        var typeIndex = host.dictionary.typelists[data_module.form_config.task.typeid];
        var table_infor = contentModule.getTaskMainData();
        var keys = Object.keys(table_infor);
        var mainData = [];
        keys.forEach(function(elt){
            mainData.push(table_infor[elt]);
        });
        var st = contentModule.getValueOfForm(editFormView, data_module.form_config.task.typeid, data_module.typelists.items, table_infor);
        if (st === null) {
            rj("can not get value of form");
            return
        };
        st.status = st.status ? 1 : 0;
        participantStr = "";
        st.participant.forEach(function(elt){
            participantStr += "_" + elt;
        });
        if (participantStr != "") participantStr += "_";
        st.participant = participantStr;
        st.extrainfo = EncodingClass.string.fromVariable(st.extrainfo);
        if (id == 0) ver = 1;
        else {
            ver = host.database.tasks.items[host.dictionary.tasks["task_" + id]].ver;
        }
        ModalElement.show_loading();
        FormClass.api_call({
            url: "activities_add_save.php",
            // url: "extends_structure_save.php",
            params: [
                {name: "tableName", value: tableName},
                {name: "task", value: "task"},
                {name: "onboardingid", value: onboardingid},
                {name: "id", value: id},
                {name: "ver", value: ver},
                {name: "data", value: EncodingClass.string.fromVariable(st)}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var content = EncodingClass.string.toVariable(message.substr(2));
                        content.data.extrainfo = EncodingClass.string.toVariable(content.data.extrainfo);
                        if (content.data.participant.indexOf("_") != -1) {
                            var participantStr = content.data.participant.split("_");
                            var participant = [];
                            for (var i = 0; i < participantStr.length; i++) {
                                if (participantStr[i] == "") continue;
                                participant.push(parseInt(participantStr[i], 10));
                            }
                            content.data.participant = participant;
                        }
                        else if (content.data.participant == "") content.data.participant = [];
                        else content.data.participant = EncodingClass.string.toVariable(content.data.participant);
                        content.data.tablename = content.links.tablename;
                        content.data.instanceid = content.links.instanceid;
                        content.data.taskid = content.data.id;
                        content.data.id = "task_" + content.data.id;
                        content.data.activityType = "type_task";
                        if (id == 0){
                            host.dictionary.tasks[content.data.id] = host.database.tasks.items.length;
                            host.database.tasks.items.push(content.data);
                            host.database.activities.items.push(content.data);
                            host.database.task_links.items.push(content.links);
                        }
                        else {
                            var index = host.dictionary.tasks["task_" + id];
                            host.database.tasks.items[index] = content.data;
                            var index1 = host.database.activities.getIndex("task_" + id);
                            host.database.activities.items[index1] = content.data;
                        }
                        rs(content.data);
                    }
                    else {
                        console.log(message);
                        rj(message);
                    }
                }
                else {
                    console.log(message);
                    rj(message);
                }
            }
        });
    });
};

hr.onboarding.editMeetingSave = function(host, onboardingid, id, editFormView, tableName){
    return new Promise(function(rs, rj){
        var typeIndex = host.dictionary.typelists[data_module.form_config.meeting.typeid];
        var table_infor = contentModule.getMeetingMainData();
        var keys = Object.keys(table_infor);
        var mainData = [];
        keys.forEach(function(elt){
            mainData.push(table_infor[elt]);
        });
        var st = contentModule.getValueOfForm(editFormView, data_module.form_config.meeting.typeid, data_module.typelists.items, table_infor);
        if (st === null) {
            rj("can not get value of form");
            return
        };
        st.status = st.status ? 1 : 0;
        st.allday = st.allday ? 1 : 0;
        participantStr = "";
        st.participant.forEach(function(elt){
            participantStr += "_" + elt;
        });
        if (participantStr != "") participantStr += "_";
        st.participant = participantStr;
        st.extrainfo = EncodingClass.string.fromVariable(st.extrainfo);
        if (id == 0) ver = 1;
        else {
            ver = host.database.meetings.items[host.dictionary.meetings["meeting_" + id]].ver;
        }
        ModalElement.show_loading();
        FormClass.api_call({
            url: "activities_add_save.php",
            // url: "extends_structure_save.php",
            params: [
                {name: "tableName", value: tableName},
                {name: "onboardingid", value: onboardingid},
                {name: "task", value: "meeting"},
                {name: "id", value: id},
                {name: "ver", value: ver},
                {name: "data", value: EncodingClass.string.fromVariable(st)}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var content = EncodingClass.string.toVariable(message.substr(2));
                        content.data.extrainfo = EncodingClass.string.toVariable(content.data.extrainfo);
                        if (content.data.participant.indexOf("_") != -1) {
                            var participantStr = content.data.participant.split("_");
                            var participant = [];
                            for (var i = 0; i < participantStr.length; i++) {
                                if (participantStr[i] == "") continue;
                                participant.push(parseInt(participantStr[i], 10));
                            }
                            content.data.participant = participant;
                        }
                        else if (content.data.participant == "") content.data.participant = [];
                        else content.data.participant = EncodingClass.string.toVariable(content.data.participant);
                        content.data.tablename = content.links.tablename;
                        content.data.instanceid = content.links.instanceid;
                        content.data.meetingid = content.data.id;
                        content.data.id = "meeting_" + content.data.id;
                        content.data.activityType = "type_meeting";
                        if (id == 0){
                            host.dictionary.meetings[content.data.id] = host.database.meetings.items.length;
                            host.database.meetings.items.push(content.data);
                            host.database.activities.items.push(content.data);
                            host.database.meeting_links.items.push(content.links);
                        }
                        else {
                            var index = host.dictionary.meetings["meeting_" + id];
                            host.database.meetings.items[index] = content.data;
                            var index1 = host.database.activities.getIndex("meeting_" + id);
                            host.database.activities.items[index1] = content.data;

                        }
                        rs(content.data);
                    }
                    else {
                        console.log(message);
                        rj(message);
                    }
                }
                else {
                    console.log(message);
                    rj(message);
                }
            }
        });
    });
};

hr.onboarding.activitiesStatusChangeSave = function(host, activityName, id, status, params, onboardingid){
    return new Promise(function(rs ,rj){
        ModalElement.show_loading();
        FormClass.api_call({
            url: "onboarding_activities_status_change_save.php",
            params: [
                {name: "activityName", value: activityName},
                {name: "id", value: id},
                {name: "status", value: status ? 1 : 0}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success) {
                    if (message.substr(0, 2) == "ok"){
                        if(activityName == "task") {
                            host.database.tasks.items[host.database.tasks.getIndex("task_" + id)].status = status ? 1 : 0;
                            host.database.activities.items[host.database.activities.getIndex("task_" + id)].status = status ? 1 : 0;
                            if (onboardingid) rs(hr.onboarding.getCellActivities(host, onboardingid, "task_" + id, params));
                            // hr.onboarding.drawTaskInformation(host, onboardingid, params);
                        }
                        else {
                            host.database.meetings.items[host.database.meetings.getIndex("meeting_" + id)].status = status ? 1 : 0;
                            host.database.activities.items[host.database.activities.getIndex("meeting_" + id)].status = status ? 1 : 0;
                            if (onboardingid) rs(hr.onboarding.getCellActivities(host, onboardingid, "meeting_" + id, params));
                            // hr.onboarding.drawMeetingInformation(host, onboardingid, params);
                        }
                        if (params.chartContainer) {
                            params.chartContainer.clearChild();
                            params.chartContainer.addChild(hr.onboarding.drawEmployeeInformationChart(host, params));
                        }
                    }
                    else {
                        console.log(message);
                    }
                }
                else {
                    console.log(message);
                }
            }
        });
    })
}

hr.onboarding.editMeeting = function(host, onboardingid, meetingid, params){
    return new Promise(function(rs, rj){
        host.dictionary = {
            typelists: contentModule.makeDictionaryIndex(data_module.typelists.items),
            meetings: contentModule.makeDictionaryIndex(host.database.meetings.items)
        };
        var value, valueContent;
        // var st = absol._({});

        if (meetingid != 0) {
            var index = host.dictionary.meetings["meeting_" + meetingid];
            var t_value = EncodingClass.string.duplicate(host.database.meetings.items[index]);
            t_value.status =  t_value.status == 1;
        }
        else t_value = {assignto: params.employeeid};
        theme.formOnboardingEditMeeting({
            typelists: data_module.typelists.items,
            form_config: data_module.form_config.meeting,
            value: t_value,
            frameList: params.frameList,
            meetingid: meetingid,
            saveFunc: function(editFormView){
                hr.onboarding.editMeetingSave(host, onboardingid, meetingid, editFormView, params.tableName).then(function(value){
                    if (hr.isMobile) params.frameList.removeLast();
                    else ModalElement.close(1);
                    hr.onboarding.drawMeetingInformation(host, onboardingid, params);
                    hr.onboarding.drawActivitiesInformation(host, onboardingid, params);
                    // rs(hr.onboarding.getCellActivities(host, onboardingid, value.id, params));
                    if (params.chartContainer) {
                        params.chartContainer.clearChild();
                        params.chartContainer.addChild(hr.onboarding.drawEmployeeInformationChart(host, params));
                    }
                }, function(message){console.log(message);});
            }
        })
    });
};

hr.onboarding.editTask = function(host, onboardingid, taskid, params){
    return new Promise(function(rs, rj){
        host.dictionary = {
            typelists: contentModule.makeDictionaryIndex(data_module.typelists.items),
            tasks: contentModule.makeDictionaryIndex(host.database.tasks.items)
        };
        var value, valueContent;
        // var st = absol._({});
        if (taskid != 0) {
            // var index = host.database.tasks.getIndex(taskid);
            var index = host.database.tasks.getIndex("task_" + taskid);
            var t_value = EncodingClass.string.duplicate(host.database.tasks.items[index]);
            t_value.status =  t_value.status == 1;
        }
        else t_value = {assignto: params.employeeid};
        theme.formOnboardingEditTask({
            typelists: data_module.typelists.items,
            form_config: data_module.form_config.task,
            value: t_value,
            frameList: params.frameList,
            taskid: taskid,
            saveFunc: function(editFormView){
                hr.onboarding.editTaskSave(host, onboardingid, taskid, editFormView, params.tableName).then(function(value){
                    if (hr.isMobile) params.frameList.removeLast();
                    else ModalElement.close(1);
                    // rs(hr.onboarding.getCellActivities(host, onboardingid, value.id, params));
                    hr.onboarding.drawTaskInformation(host, onboardingid, params);
                    hr.onboarding.drawActivitiesInformation(host, onboardingid, params);
                    if (params.chartContainer) {
                        params.chartContainer.clearChild();
                        params.chartContainer.addChild(hr.onboarding.drawEmployeeInformationChart(host, params));
                    }
                }, function(message){console.log(message);});
            }
        });
    });
};

hr.onboarding.getValueOfVariableForTemplate = function(host) {
    return new Promise(function(resolve, reject){
        var retval = {
            today: new Date(),
            software_link: window.domain,
            username: systemconfig.userid,
            employee_name: host.employeeid,
            link_to_open_form: window.location.href
        };
        var retvalToString = {
            // today: absol.datetime.formatDateTime(new Date(), 'dd/MM/yyyy'),
            today: new Date(),
            software_link: window.domain,
            username: host.database.users.items[host.database.users.getByhomeid(systemconfig.userid)].username,
            employee_name: host.database.employees.items[host.employeeDic[host.employeeid]].fullname,
            link_to_open_form: window.location.href
        };
        Promise.all([
            data_module.loadCompanyInHrDB()
        ]).then(function(rs){
            if (rs[0].name) {
                retval.company_name_of_employee = rs[0].name;
                retvalToString.company_name_of_employee = rs[0].name;
            }
            if (rs[0].config) {
                rs[0].config = EncodingClass.string.toVariable(rs[0].config);
                if (rs[0].config.address) {
                    retval.company_address_of_employee = rs[0].config.address;
                    retvalToString.company_address_of_employee = rs[0].config.address;
                }
                if (rs[0].config.email) {
                    retval.company_email_of_employee = rs[0].config.email;
                    retvalToString.company_email_of_employee = rs[0].config.email;
                }
                if (rs[0].config.website) {
                    retval.company_website_of_employee = rs[0].config.website;
                    retvalToString.company_website_of_employee = rs[0].config.website;
                }
            }
            else {
                retval.company_address_of_employee = "";
                retvalToString.company_address_of_employee = "";
                retval.company_email_of_employee = "";
                retvalToString.company_email_of_employee = "";
                retval.company_website_of_employee = "";
                retvalToString.company_website_of_employee = "";
            }
            var eIndex = host.employeeDic[host.employeeid];
            var peopleid = host.database.employees.items[eIndex].peopleid;
            var pIndex = host.peopleDic[peopleid];
            retval.employee_name = host.employeeid;
            retvalToString.employee_name = host.database.employees.items[eIndex].fullname;
            if (host.database.peoples.items[pIndex].content.phone_1) {
                retval.phonenumber_of_employee = host.database.peoples.items[pIndex].content.phone_1;
                retvalToString.phonenumber_of_employee = host.database.peoples.items[pIndex].content.phone_1;
            }
            else if (host.database.peoples.items[pIndex].content.phone_2) {
                retval.phonenumber_of_employee = host.database.peoples.items[pIndex].content.phone_2;
                retvalToString.phonenumber_of_employee = host.database.peoples.items[pIndex].content.phone_2;
            }
            else {
                retval.phonenumber_of_employee = "";
                retvalToString.phonenumber_of_employee = "";
            }

            if (host.database.peoples.items[pIndex].content.work_email) {
                retval.email_of_employee = host.database.peoples.items[pIndex].content.work_email;
                retvalToString.email_of_employee = host.database.peoples.items[pIndex].content.work_email;
            }
            else if (host.database.peoples.items[pIndex].content.private_email) {
                retval.email_of_employee = host.database.peoples.items[pIndex].content.private_email;
                retvalToString.email_of_employee = host.database.peoples.items[pIndex].content.private_email;
            }
            else {
                retval.email_of_employee = "";
                retvalToString.email_of_employee = "";
            }
            retval.permanent_address = host.database.peoples.items[pIndex].content.permanent_address;
            retval.probation_start_date = host.database.peoples.items[pIndex].content.start_date;
            retval.start_date_of_work = host.database.peoples.items[pIndex].content.official_date;
            retvalToString.permanent_address = host.database.peoples.items[pIndex].content.permanent_address;
            retvalToString.probation_start_date = host.database.peoples.items[pIndex].content.start_date;
            retvalToString.start_date_of_work = host.database.peoples.items[pIndex].content.official_date;
            retval.position_of_employee = host.database.employees.items[eIndex].position;
            retvalToString.position_of_employee = host.database.employees.items[eIndex].positionName;
            retval.department_of_employee = host.database.employees.items[eIndex].orgid;
            retvalToString.department_of_employee = host.database.orgs.items[host.orgDic[retval.department_of_employee]].name;
            var orgid = host.database.employees.items[eIndex].orgid;

            if (host.database.orgs.items[host.orgDic[orgid]].geopos.length > 0) {
                var geoposContent = host.database.geopos.items[host.geoposDic[host.database.orgs.items[host.orgDic[orgid]].geopos[0]]];
                retval.workplace_address_of_employee = geoposContent.address;
                retvalToString.workplace_address_of_employee = geoposContent.address;
                retval.workplace_name_of_employee = geoposContent.name;
                retvalToString.workplace_name_of_employee = geoposContent.name;
                retval.workplace_gps_address_of_employee = geoposContent.location;
                retvalToString.workplace_gps_address_of_employee = geoposContent.location;
            }
            else {
                retval.workplace_address_of_employee = "";
                retvalToString.workplace_address_of_employee = "";
                retval.workplace_name_of_employee = "";
                retvalToString.workplace_name_of_employee = "";
                retval.workplace_gps_address_of_employee = "";
                retvalToString.workplace_gps_address_of_employee = "";
            }

            retval.name_of_support_staff_hr = host.database.peoples.items[pIndex].content.hr_support_employee;
            retvalToString.name_of_support_staff_hr = "";
            if (retval.name_of_support_staff_hr != 0) retvalToString.name_of_support_staff_hr = host.database.employees.items[host.employeeDic[retval.name_of_support_staff_hr]].fullname;

            if (retval.name_of_support_staff_hr != 0){
                var dmIndex = host.employeeDic[retval.name_of_support_staff_hr];
                if (dmIndex != 0) {
                    var peopleid = host.database.employees.items[dmIndex].peopleid;
                    var pIndexOfDirectManager = host.peopleDic[peopleid];
                    var email, phone, position, depar;
                    if (host.database.peoples.items[pIndexOfDirectManager].content.phone_1) {
                        retval.phonenumber_of_support_staff_hr = host.database.peoples.items[pIndexOfDirectManager].content.phone_1;
                        retvalToString.phonenumber_of_support_staff_hr = host.database.peoples.items[pIndexOfDirectManager].content.phone_1;
                    }
                    else if (host.database.peoples.items[pIndexOfDirectManager].content.phone_2) {
                        retval.phonenumber_of_support_staff_hr = host.database.peoples.items[pIndexOfDirectManager].content.phone_2;
                        retvalToString.phonenumber_of_support_staff_hr = host.database.peoples.items[pIndexOfDirectManager].content.phone_2;
                    }
                    else {
                        retval.phonenumber_of_support_staff_hr = "";
                        retvalToString.phonenumber_of_support_staff_hr = "";
                    }

                    if (host.database.peoples.items[pIndexOfDirectManager].content.work_email) {
                        retval.email_of_support_staff_hr = host.database.peoples.items[pIndexOfDirectManager].content.work_email;
                        retvalToString.email_of_support_staff_hr = host.database.peoples.items[pIndexOfDirectManager].content.work_email;
                    }
                    else if (host.database.peoples.items[pIndexOfDirectManager].content.private_email) {
                        retval.email_of_support_staff_hr = host.database.peoples.items[pIndexOfDirectManager].content.private_email;
                        retvalToString.email_of_support_staff_hr = host.database.peoples.items[pIndexOfDirectManager].content.private_email;
                    }
                    else {
                        retval.email_of_support_staff_hr = "";
                        retvalToString.email_of_support_staff_hr = "";
                    }
                    retval.position_of_support_staff_hr = 0;
                    retvalToString.position_of_support_staff_hr = "";
                    retval.position_of_support_staff_hr = host.database.employees.items[dmIndex].position;
                    retvalToString.position_of_support_staff_hr = host.database.employees.items[dmIndex].positionName;
                    retval.department_of_support_staff_hr = host.database.employees.items[dmIndex].orgid;
                    retvalToString.department_of_support_staff_hr = host.database.orgs.items[host.orgDic[host.database.employees.items[dmIndex].orgid]].name;
                }
            }
            else {
                retval.email_of_support_staff_hr = "";
                retvalToString.email_of_support_staff_hr = "";

                retval.phonenumber_of_support_staff_hr = "";
                retvalToString.phonenumber_of_support_staff_hr = "";

                retval.position_of_support_staff_hr = 0;
                retvalToString.position_of_support_staff_hr = "";

                retval.department_of_support_staff_hr = 0;
                retvalToString.department_of_support_staff_hr = "";
            }

            // retvalToString.support_staff_hr = host.database.peoples.items[pIndex].content.hr_support_employee;
            retval.name_of_direct_manager = host.database.employees.items[eIndex].direct_manager;
            retvalToString.name_of_direct_manager = "";
            if (retval.name_of_direct_manager != 0) retvalToString.name_of_direct_manager = host.database.employees.items[host.employeeDic[retval.name_of_direct_manager]].fullname;

            retval.name_of_indirect_manager = host.database.employees.items[eIndex].indirect_manager;
            retvalToString.name_of_indirect_manager = "";
            if (retval.name_of_indirect_manager != 0) retvalToString.name_of_indirect_manager = host.database.employees.items[host.employeeDic[retval.name_of_indirect_manager]].fullname;
            if (retval.name_of_direct_manager != 0){
                var dmIndex = host.employeeDic[retval.name_of_direct_manager];
                if (dmIndex != 0) {
                    var peopleid = host.database.employees.items[dmIndex].peopleid;
                    var pIndexOfDirectManager = host.peopleDic[peopleid];
                    var email, phone, position, depar;
                    if (host.database.peoples.items[pIndexOfDirectManager].content.phone_1) {
                        retval.phonenumber_of_direct_manager = host.database.peoples.items[pIndexOfDirectManager].content.phone_1;
                        retvalToString.phonenumber_of_direct_manager = host.database.peoples.items[pIndexOfDirectManager].content.phone_1;
                    }
                    else if (host.database.peoples.items[pIndexOfDirectManager].content.phone_2) {
                        retval.phonenumber_of_direct_manager = host.database.peoples.items[pIndexOfDirectManager].content.phone_2;
                        retvalToString.phonenumber_of_direct_manager = host.database.peoples.items[pIndexOfDirectManager].content.phone_2;
                    }
                    else {
                        retval.phonenumber_of_direct_manager = "";
                        retvalToString.phonenumber_of_direct_manager = "";
                    }

                    if (host.database.peoples.items[pIndexOfDirectManager].content.work_email) {
                        retval.email_of_direct_manager = host.database.peoples.items[pIndexOfDirectManager].content.work_email;
                        retvalToString.email_of_direct_manager = host.database.peoples.items[pIndexOfDirectManager].content.work_email;
                    }
                    else if (host.database.peoples.items[pIndexOfDirectManager].content.private_email) {
                        retval.email_of_direct_manager = host.database.peoples.items[pIndexOfDirectManager].content.private_email;
                        retvalToString.email_of_direct_manager = host.database.peoples.items[pIndexOfDirectManager].content.private_email;
                    }
                    else {
                        retval.email_of_direct_manager = "";
                        retvalToString.email_of_direct_manager = "";
                    }
                    retval.position_of_direct_manager = 0;
                    retvalToString.position_of_direct_manager = "";
                    retval.position_of_direct_manager = host.database.employees.items[dmIndex].position;
                    retvalToString.position_of_direct_manager = host.database.employees.items[dmIndex].positionName;
                    retval.department_of_direct_manager = host.database.employees.items[dmIndex].orgid;
                    retvalToString.department_of_direct_manager = host.database.orgs.items[host.orgDic[host.database.employees.items[dmIndex].orgid]].name;
                }
            }
            else {
                retval.email_of_direct_manager = "";
                retvalToString.email_of_direct_manager = "";

                retval.phonenumber_of_direct_manager = "";
                retvalToString.phonenumber_of_direct_manager = "";

                retval.position_of_direct_manager = 0;
                retvalToString.position_of_direct_manager = "";

                retval.department_of_direct_manager = 0;
                retvalToString.department_of_direct_manager = "";
            }
            if (retval.name_of_indirect_manager) {
                var idmIndex = host.employeeDic[retval.name_of_indirect_manager];
                if (idmIndex != 0) {
                    var peopleid = host.database.employees.items[idmIndex].peopleid;
                    var pIndex = host.peopleDic[peopleid];
                    var email, phone, position, depar;
                    if (host.database.peoples.items[pIndexOfDirectManager].content.phone_1) {
                        retval.phonenumber_of_indirect_manager = host.database.peoples.items[pIndexOfDirectManager].content.phone_1;
                        retvalToString.phonenumber_of_indirect_manager = host.database.peoples.items[pIndexOfDirectManager].content.phone_1;
                    }
                    else if (host.database.peoples.items[pIndexOfDirectManager].content.phone_2) {
                        retval.phonenumber_of_indirect_manager = host.database.peoples.items[pIndexOfDirectManager].content.phone_2;
                        retvalToString.phonenumber_of_indirect_manager = host.database.peoples.items[pIndexOfDirectManager].content.phone_2;
                    }
                    else {
                        retval.phonenumber_of_indirect_manager = "";
                        retvalToString.phonenumber_of_indirect_manager = "";
                    }

                    if (host.database.peoples.items[pIndexOfDirectManager].content.work_email) {
                        retval.email_of_indirect_manager = host.database.peoples.items[pIndexOfDirectManager].content.work_email;
                        retvalToString.email_of_indirect_manager = host.database.peoples.items[pIndexOfDirectManager].content.work_email;
                    }
                    else if (host.database.peoples.items[pIndexOfDirectManager].content.private_email) {
                        retval.email_of_indirect_manager = host.database.peoples.items[pIndexOfDirectManager].content.private_email;
                        retvalToString.email_of_indirect_manager = host.database.peoples.items[pIndexOfDirectManager].content.private_email;
                    }
                    else {
                        retval.email_of_indirect_manager = "";
                        retvalToString.email_of_indirect_manager = "";
                    }
                    retval.position_of_indirect_manager = 0;
                    retvalToString.position_of_indirect_manager = "";
                    retval.position_of_indirect_manager = host.database.employees.items[idmIndex].position;
                    retvalToString.position_of_indirect_manager = host.database.employees.items[idmIndex].positionName;
                    retval.department_of_indirect_manager = host.database.employees.items[idmIndex].orgid;
                    retvalToString.department_of_indirect_manager = host.database.orgs.items[host.orgDic[host.database.employees.items[idmIndex].orgid]].name;
                }
            }
            else {
                retval.email_of_indirect_manager = "";
                retvalToString.email_of_indirect_manager = "";

                retval.phonenumber_of_indirect_manager = "";
                retvalToString.phonenumber_of_indirect_manager = "";

                retval.position_of_indirect_manager = 0;
                retvalToString.position_of_indirect_manager = "";

                retval.department_of_indirect_manager = 0;
                retvalToString.department_of_indirect_manager = "";
            }


            resolve({
                originVariable: retval,
                variableToString: retvalToString
            });
        });
    });
};

hr.onboarding.deleteOnboarding = function(host, id){
    return new Promise(function(resolve, reject){
        ModalElement.show_loading();
        FormClass.api_call({
            url: "orgs_delete_employee_onboarding.php",
            params: [
                {name: "id", value: id}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var index = host.database.onboarding.getIndex(id);
                        host.database.onboarding.items.splice(index, 1);
                        resolve();
                    }
                    else if (message == "failed_used"){
                        ModalElement.alert({
                            message: LanguageModule.text("war_txt_can_not_delete")
                        });
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

hr.onboarding.deleteOnboardingConfirm = function(host, id){
    return new Promise(function(resolve, reject){
        var index = host.database.onboarding.getIndex(id);
        ModalElement.question({
            title: LanguageModule.text("war_title_delete_onboarding"),
            message: LanguageModule.text2("war_txt_detele", [""]),
            onclick: function(sel){
                if (sel == 0){
                    hr.onboarding.deleteOnboarding(host, id).then(function(value){
                        resolve(value);
                    });
                }
            }
        });
    });
};

hr.onboarding.addOnboardingSubmit = function(host, id, getValueFunction){
    return new Promise(function(resolve, reject){
        var data = getValueFunction();
        if (!data) return;
        data.id = id;
        if (id > 0){
            var index = host.database.onboarding.getIndex(id);
            var ischange = contentModule.isChanged(host.database.onboarding.items[index], data,
                ["employeeid", "comment", "available"]
            );
            if (!ischange){
                ModalElement.close();
                return;
            }
            data.ver = host.database.onboarding.items[index].ver;
        }
        else {
            data.ver = 1;
        }
        data.available = data.available? 1: 0;
        data.extrainfo = EncodingClass.string.fromVariable(data.extrainfo);
        ModalElement.show_loading();
        FormClass.api_call({
            url: "onboarding_edit_save.php",
            params: [{name: "data", value: EncodingClass.string.fromVariable(data)}],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var content = EncodingClass.string.toVariable(message.substr(2));
                        content.extrainfo = EncodingClass.string.toVariable(content.extrainfo);
                        if (content.available){
                            host.database.onboarding.items.forEach(function(item){
                                if (item.employeeid == data.employeeid) item.available = 0;
                            });
                        }
                        host.dataOnboardingEdit = content;
                        if (id > 0){
                            var index = host.database.onboarding.getIndex(id);
                            if (index < 0){
                                ModalElement.alert({message: LanguageModule.text("war_txt_failed_ver_reload_data")});
                                return;
                            }
                            host.database.onboarding.items[index] = content;
                            host.drawOnboardingGeneralInforFunc();
                        }
                        else {
                            host.database.onboarding.items.push(content);
                        }
                        ModalElement.close();
                        hr.onboarding.redraw(host);
                    }
                    else if (message == "war_txt_code_was_used"){
                        ModalElement.alert({
                            message: LanguageModule.text(message)
                        });
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

hr.onboarding.addOnboardingClose = function(host, id, getValueFunction, resolveAdd, resolve){
    return new Promise(function(resolve, reject){
        var data = getValueFunction();
        var closeFunc = function(){
            ModalElement.close();
        };
        if (!data) {
            ModalElement.close();
            closeFunc();
        }
        else {
            if (id > 0){
                var index = host.database.onboarding.getIndex(id);
                var ischange = contentModule.isChanged(host.database.onboarding.items[index], data,
                    ["employeeid", "contractid", "effective_date", "salary_grade", "basic_salary_amount", "gross_salary_amount", "calculated_on", "reference_number", "decision_date", "attachments", "extrainfo", "available"]
                );
            }
            else {
                var ischange = contentModule.isChanged({contractid: 0, effective_date_from: new Date()}, data,
                    ["contractid", "effective_date"]
                );
            }
            if (!ischange){
                closeFunc();
            }
            else {
                contentModule.questionChange({
                    onclick: function(sel){
                        if (sel == 0){
                            hr.onboarding.addOnboardingSubmit(host, id, getValueFunction);
                        }
                        else if (sel == 1){
                            closeFunc();
                        }
                    }
                });
            }
        }
    });
};

hr.onboarding.redrawDetails = function(host, id){
    function redraw(value){
        var formContainer = DOMElement.div({});
        ModalElement.showWindow({
            title: LanguageModule.text("txt_onboarding"),
            bodycontent: formContainer,
            buttonlist: [
                {
                    text: LanguageModule.text("txt_save"),
                    onclick: function(){
                        hr.onboarding.addOnboardingSubmit(host, id, getValueFunction);
                    }
                },
                {
                    text: LanguageModule.text("txt_cancel"),
                    onclick: function(){
                        hr.onboarding.addOnboardingClose(host, id, getValueFunction);
                    }
                }
            ]
        });
        var getValueFunction;
        contentModule.makeFormData({
            typeid: data_module.form_config.onboarding.typeid,
            formid: data_module.form_config.onboarding.input_form,
            initialValue: value,
            formContainer: formContainer,
            typelists: data_module.typelists.items,
            variableType: "system"
        }).then(function(getValue){
            getValueFunction = getValue;
            formContainer.formFragment.setContext('host', host);
            var elt = absol.form.findComponent(formContainer.formFragment.view, {
                name: 'type_onboarding_employee_id',
                depth: false
            });
            if (elt){
                var noSelectDic = {};
                host.database.employees.items.forEach(function(item){
                    if (systemconfig.privSystem < 2 && !host.privilegesDic[-item.id].edit_onboarding) noSelectDic[item.id] = true;
                });
                elt.domElt.items = contentModule.getMemberOfEmployeeSelectMenu(host, {noSelectDic: noSelectDic});
            }
        });
    };
    if (id != 0){
        redraw(host.dataOnboardingEdit);
    }
    else {
        redraw();
    }
};

hr.onboarding.addOnboarding = function(host, id){
    if (id == 0){
        hr.onboarding.redrawDetails(host, id);
    }
    else {
        ModalElement.show_loading();
        FormClass.api_call({
            url: "database_load.php",
            params: [
                {name: "task", value: "onboarding_load_by_id"},
                {name: "id", value: id}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var st = EncodingClass.string.toVariable(message.substr(2));
                        host.dataOnboardingEdit = EncodingClass.string.duplicate(st.onboarding);
                        if (host.dataOnboardingEdit.extrainfo == "") host.dataOnboardingEdit.extrainfo = {};
                        else host.dataOnboardingEdit.extrainfo = EncodingClass.string.toVariable(host.dataOnboardingEdit.extrainfo);
                        delete(st.onboarding);
                        contentModule.makeDatabaseContent(host, st);
                        hr.onboarding.redrawDetails(host, id);
                    }
                    else if (message == "war_txt_failed_data"){
                        ModalElement.alert({
                            message: LanguageModule.text("war_txt_failed_data"),
                            func: function(){
                                hr.onboarding.init(host);
                            }
                        });
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    }
};

hr.onboarding.drawGeneralInformation = function(host, params){
    var viewGeneralInformation = DOMElement.div({
        attrs: {
            style: {
                paddingLeft: "var(--control-verticle-distance-2)",
                paddingTop: "var(--control-verticle-distance-2)"
            }
        }
    });
    host.drawOnboardingGeneralInforFunc = function(){
        contentModule.makeOutputFormData({
            typeid: data_module.form_config.onboarding.typeid,
            formid: data_module.form_config.onboarding.output_form,
            initialValue: host.dataOnboardingEdit,
            formContainer: viewGeneralInformation,
            typelists: data_module.typelists.items,
            variableType: "system"
        }).then(function(getValue){});
    };
    host.drawOnboardingGeneralInforFunc();
    var header = [
        {
            class: 'mk-section-header-name',
            child: { text: LanguageModule.text("txt_general_information") },
        }
    ];
    if (systemconfig.privSystem >= 2 || host.privilegesDic[-host.dataOnboardingEdit.employeeid].edit_onboarding){
        header.push({
            class: 'mk-section-header-right',
            child: [
                DOMElement.a({
                    attrs: {
                        onclick: function(){
                            params.editFunc();
                        }
                    },
                    text: LanguageModule.text("txt_edit")
                })
            ]
        });
    }

    var res = absol.buildDom({
        attr: {
            "data-sectionid": "general_information"
        },
        child: [
            absol.buildDom({
                class: 'mk-section-header',
                child: header
            }),
            viewGeneralInformation
        ]
    });
    return res;
};

hr.onboarding.addEmailSave = function(host, id, templateIdList) {
    hr.onboarding.getValueOfVariableForTemplate(host).then(function(valueOfVariable){
        var email_array = [];
        templateIdList.forEach(function(elt){
            var index = host.database.email_templates.getIndex(elt);
            var template = EncodingClass.string.toVariable(host.database.email_templates.items[index].content);
            var emailContent = {
                receiver: hr.sclang.executeExpression(template.receiver.substring(3, template.receiver.length - 3), valueOfVariable.originVariable)
            };
            if (template.carbon_copy.startsWith("{{") && template.carbon_copy.endsWith("}}")){
                emailContent.carbon_copy = [hr.sclang.executeExpression(template.carbon_copy.substring(3, template.carbon_copy.length - 3), valueOfVariable.originVariable)];
            }
            else emailContent.carbon_copy = [];
            if (template.blind_carbon_copy.startsWith("{{") && template.blind_carbon_copy.endsWith("}}")){
                emailContent.blind_carbon_copy = [hr.sclang.executeExpression(template.blind_carbon_copy.substring(3, template.blind_carbon_copy.length - 3), valueOfVariable.originVariable)];
            }
            else emailContent.blind_carbon_copy = [];
            emailContent.email_content = hr.sclang.executeTemplate(template.email_content, valueOfVariable.variableToString);
            emailContent.subject = template.subject;
            email_array.push(emailContent);
        });
        ModalElement.show_loading();
        FormClass.api_call({
            url: "onboarding_email_save.php",
            params: [
                {name: "data", value: EncodingClass.string.fromVariable(email_array)},
                {name: "id", value: id}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var emailContent = EncodingClass.string.toVariable(message.substr(2));
                        emailErr = [];
                        emailContent.forEach(function(elt, idx){
                            if (elt.email_record == 0) {
                                emailErr.push(templateIdList[idx]);
                            }
                        });
                        if (emailErr.length > 0){
                            var str = "";
                            emailErr.forEach((item, i) => {
                                var index = host.database.email_templates.getIndex(elt);
                                if (str != "") str += ", ";
                                str += host.database.email_templates.items[index].name;
                            });
                            ModalElement.alert({
                                message: "Có " + emailErr.length + "/" + templateIdList.length + " gửi không thành công: " + str,
                            })
                        }
                    }
                    else {
                        console.log(message);
                    }
                }
                else {
                    console.log(message);
                }
            }
        });
    });
};

hr.onboarding.addEmail = function(host, id){
    ModalElement.show_loading();
    FormClass.api_call({
        url: "database_load.php",
        params: [
            {name: "task", value: "onboarding_load_email_template"}
        ],
        func: function(success, message){
            ModalElement.close(-1);
            if (success){
                if (message.substr(0, 2) == "ok") {
                    var content = EncodingClass.string.toVariable(message.substr(2));
                    contentModule.makeDatabaseContent(host, content);
                    var dict = {};
                    var groupItems = host.database.template_groups.items.map(function(elt){
                        dict[elt.id] = elt.name;
                        return {
                            value: elt.id,
                            text: elt.name,
                            sortText: absol.string.nonAccentVietnamese(elt.name.toLowerCase())
                        }
                    });
                    groupItems.sort(function(a, b){
                        if (a.sortText > b.sortText) return 1;
                        if (a.sortText < b.sortText) return -1;
                        return 0;
                    });
                    groupItems.unshift({value: 0, text: LanguageModule.text("txt_all")});
                    var data = host.database.email_templates.items.map(function(elt){
                        return {
                            id: elt.id,
                            name: elt.name,
                            comment: elt.comment,
                            groupid: elt.groupid,
                            groupText: dict[elt.groupid],
                            preview: function(){
                                hr.onboarding.emailPreview(host, elt.id);
                            }
                        };
                    });
                    theme.formOnboardingAddEmail({data: data, groupItems: groupItems}).then(function(rs){
                        hr.onboarding.addEmailSave(host, id, rs);
                    });
                }
                else {
                    console.log(message);
                }
            }
            else {
                console.log(message);
            }
        }
    });
};

hr.onboarding.drawEmployeeInformation = function(host, params){
    var content = {};
    var eIndex = host.database.employees.getIndex(host.employeeid);
    content.employeeName = host.database.peoples.items[host.database.peoples.getIndex(host.database.employees.items[eIndex].peopleid)].fullname;
    content.orgName = host.database.orgs.items[host.database.orgs.getIndex(host.database.employees.items[eIndex].orgid)].name;
    content.positionName = host.database.employees.items[eIndex].positionName;
    return theme.formOnboardingEmployeeInformation(content);
};


hr.onboarding.drawEmployeeInformationChart = function(host, params){
    var content = {
        count: 0,
        pending: 0,
        success: 0,
        unsuccess: 0
    };
    if (params.workSelected == "task" || params.workSelected == "both") {
        content.count += host.database.tasks.items.length;
        host.database.tasks.items.forEach(function(elt){
            if (elt.status == 1) content.success += 1;
            else {
                if (elt.endtime.getTime() > (new Date()).getTime()) content.pending += 1;
                else content.unsuccess += 1;
            }
        });
    }
    if (params.workSelected == "meeting" || params.workSelected == "both") {
        content.count += host.database.meetings.items.length;
        host.database.meetings.items.forEach(function(elt){
            if (elt.status == 1) content.success += 1;
            else {
                if (elt.endtime.getTime() > (new Date()).getTime()) content.pending += 1;
                else content.unsuccess += 1;
            }
        });
    }
    return theme.formOnboardingEmployeeInformationChart(content);
};

hr.onboarding.drawEmailInformation = function(host, params) {
    var data = [];
    for (var i = 0; i < host.database.emails.items.length; i++){
        data.push({
            subject: host.database.emails.items[i].subject,
            toList: host.database.emails.items[i].receiver,
            ccList: host.database.emails.items[i].cc,
            bccList: host.database.emails.items[i].bcc,
            id: host.database.emails.items[i].id
        });
    }
    return theme.formOnboardingEmailInformation({content: data, addEmail: params.addEmail});
};


hr.templateSupportFunctions = {};
hr.templateSupportFunctions.toString = function toString(o){
    if (typeof o == 'string') return o;
    if (o === null) return '[null]';
    if (o instanceof Date) return absol.datetime.formatDateTime(o, 'dd/MM/yyyy');
    if (o instanceof Array) return o.map(toString).join(', ');

    return o + '';
};

hr.templateSupportFunctions.dateAfter = function(date, af){
        return new Date(date.getTime() + 3600000 * 24 * af);
};


hr.templateSupportFunctions.dateBefore = function(date, af){
        return new Date(date.getTime() - 3600000 * 24 * af);
};

hr.templateSupportFunctions.templateParser = function(str, args){
    var template = absol.TemplateString.parse(str);
    template.parts = template.parts.map(function(p){
        if (p.type === 0) return p;
        p.data = 'toString('+ p.data +')';
    });
    var jsExpression = absol.TemplateString.parse(str).toJSCode();
    var argsCode = Object.keys(args).map(function(name){
        return 'var '+ name + ' = args.'+ name +';';
    }).join('\n')+'\n';

    var bodyCode = argsCode + '\n return ' + jsExpression;
    var func = new Function('args', bodyCode);

    return func(args);
};

hr.onboarding.addTaskSave = function(host, id, templateIdList, params) {
    hr.onboarding.getValueOfVariableForTemplate(host).then(function(valueOfVariable){
        var task_array = [];
        templateIdList.forEach(function(elt){
            ////////////////////
            var index = host.database.task_templates.getIndex(elt);
            var template = EncodingClass.string.toVariable(host.database.task_templates.items[index].content);
            var taskContent = {
                name: hr.sclang.executeTemplate(template.task_name, valueOfVariable.variableToString),
                status: template.task_status ? 1 : 0,
                endtime: hr.sclang.executeExpression(template.task_expire_time.substring(3, template.task_expire_time.length - 3), valueOfVariable.originVariable),
                reminder: template.task_reminder,
                assignto: hr.sclang.executeExpression(template.task_assign_to.substring(3, template.task_assign_to.length - 3), valueOfVariable.originVariable),
                // participant: hr.templateSupportFunctions.templateParser(content.task_participant, Object.assign({},hr.templateSupportFunctions ,valueOfVariable.originVariable)),
                result: hr.sclang.executeTemplate(template.task_result, valueOfVariable.variableToString),
                extrainfo: EncodingClass.string.fromVariable({})
            };
            if (template.task_participant.startsWith("{{") && template.task_participant.endsWith("}}")){
                taskContent.participant = [hr.sclang.executeExpression(template.task_participant.substring(3, template.task_participant.length - 3), valueOfVariable.originVariable)];
            }
            else taskContent.participant = [];
            var participantStr = "";
            taskContent.participant.forEach(function(elt){
                if (elt != 0) participantStr += "_" + elt;
            });
            if (participantStr != "") participantStr += "_";
            taskContent.participant = participantStr;
            task_array.push(taskContent);
        });
        FormClass.api_call({
            url: "onboarding_task_save.php",
            params: [
                {name: "data", value: EncodingClass.string.fromVariable(task_array)},
                {name: "id", value: id},
                {name: "tableName", value: params.tableName}
            ],
            func: function(success, message){
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var content = EncodingClass.string.toVariable(message.substr(2));
                        host.database.tasks.items = host.database.tasks.items.concat(content.tasks);
                        host.database.task_links.items = host.database.task_links.items.concat(content.task_links);
                        hr.onboarding.drawTaskInformation(host, id, params);
                        hr.onboarding.drawActivitiesInformation(host, onboardingid, params);
                        if (params.chartContainer) {
                            params.chartContainer.clearChild();
                            params.chartContainer.addChild(hr.onboarding.drawEmployeeInformationChart(host, params));
                        }
                    }
                    else {
                        console.log(message);
                    }
                }
                else {
                    console.log(message);
                }
            }
        });
    });
};

hr.onboarding.addTaskByTemplate = function(host, id, params){
    ModalElement.show_loading();
    FormClass.api_call({
        url: "database_load.php",
        params: [
            {name: "task", value: "onboarding_load_task_template"}
        ],
        func: function(success, message){
            ModalElement.close(-1);
            if (success){
                if (message.substr(0, 2) == "ok") {
                    var content = EncodingClass.string.toVariable(message.substr(2));
                    contentModule.makeDatabaseContent(host, content);
                    var dict = {};
                    var groupItems = host.database.template_groups.items.map(function(elt){
                        dict[elt.id] = elt.name;
                        return {
                            value: elt.id,
                            text: elt.name,
                            sortText: absol.string.nonAccentVietnamese(elt.name.toLowerCase())
                        }
                    });
                    groupItems.sort(function(a, b){
                        if (a.sortText > b.sortText) return 1;
                        if (a.sortText < b.sortText) return -1;
                        return 0;
                    });
                    groupItems.unshift({value: 0, text: LanguageModule.text("txt_all")});
                    var data = host.database.task_templates.items.map(function(elt){
                        return {
                            id: elt.id,
                            name: elt.name,
                            comment: elt.comment,
                            groupid: elt.groupid,
                            groupText: dict[elt.groupid],
                            preview: function(){
                                hr.onboarding.taskPreview(host, elt.id);
                            }
                        };
                    });
                    theme.formOnboardingAddTask({data: data, groupItems: groupItems}).then(function(rs){
                        hr.onboarding.addTaskSave(host, id, rs, params);
                    });
                }
                else {
                    console.log(message);
                }
            }
            else {
                console.log(message);
            }
        }
    });
};

hr.onboarding.deleteTask = function(host, onboardingid, id, params){
    return new Promise(function(rs, rj){
        ModalElement.show_loading();
        FormClass.api_call({
            url: "onboarding_delete_task_save.php",
            params: [
                {name: "onboardingid", value: onboardingid},
                {name: "taskid", value: id}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok") {
                        for (var i = 0; i < host.database.task_links.items.length; i++){
                            if (host.database.task_links.items[i].onboardingid == onboardingid && host.database.task_links.items[i].taskid == id){
                                host.database.task_links.items.splice(i, 1);
                                break;
                            }
                        }
                        host.database.tasks.items = host.database.tasks.items.filter(function(elt){
                            return elt.id != "task_" + id;
                        });
                        host.database.activities.items = host.database.activities.items.filter(function(elt){
                            return elt.id != "task_" + id;
                        });
                        rs("success");
                        hr.onboarding.drawTaskInformation(host, onboardingid, params);
                        // hr.onboarding.drawActivitiesInformation(host, onboardingid, params);
                        if (params.chartContainer) {
                            params.chartContainer.clearChild();
                            params.chartContainer.addChild(hr.onboarding.drawEmployeeInformationChart(host, params));
                        }
                    }
                    else {
                        console.log(message);
                    }
                }
                else {
                    console.log(message);
                }
            }
        });
    });
};

hr.onboarding.drawTaskInformation = function(host, onboardingid, params) {
    return new Promise(function(rs, rj){
        var data = [];
        for (var i = 0; i < host.database.tasks.items.length; i++){
            host.database.tasks.items[i].func = {
                editTask: function(host, onboardingid, id){
                    return function(){
                         hr.onboarding.editTask(host, onboardingid, id, params);
                    }
                }(host, onboardingid,  host.database.tasks.items[i].taskid),
                deleteTask: function(host, onboardingid, id){
                    return function(){
                        hr.onboarding.deleteTask(host, onboardingid, id, params);
                    }
                }(host, onboardingid,  host.database.tasks.items[i].taskid),
                statusChange: function(host, onboardingid, id){
                    return function(status){
                        hr.onboarding.activitiesStatusChangeSave(host, "task", id, status, params, onboardingid);
                    }
                }(host, onboardingid,  host.database.tasks.items[i].taskid)
            };
            data.push(host.database.tasks.items[i]);
        }
        var displayDic = {
            name: true,
            status: true,
            assignto: true,
            userid: true,
            createdtime: true
        };
        var columnList = contentModule.getColumnListFromDatatype(host, "task", displayDic);
        if (!host.task_user_column_configsDic[params.tableName + "activities_task_view_on_function"]){
            for (var i = 0; i < columnList.length; i++){
                if (columnList[i].value == "status"){
                    var x = columnList[i];
                    columnList.splice(i, 1);
                    columnList.unshift(x);
                    break;
                }
            }
        }
        var redrawTableFunc = function(){
            contentModule.getColumnListConfig(host, host.task_user_column_configsDic, columnList, params.tableName + "activities_task_view_on_function").then(function(value){
                host.configColumnActivitiesTask = value;
                params.task.clearChild();
                host.dataView = theme.formOnboardingTaskContentData({
                    data: data,
                    inputsearchbox: host.inputsearchbox,
                    configColumnActivitiesTask: host.configColumnActivitiesTask,
                    configColumnFunc: function(){
                        contentModule.userColumnConfigForm({
                            type: params.tableName + "activities_task_view_on_function",
                            columnList: columnList
                        }).then(function(value){
                            host.task_user_column_configsDic[params.tableName + "activities_task_view_on_function"] = value;
                            redrawTableFunc();
                        });
                    },
                    addTaskByTemplate: params.addTaskByTemplate,
                    addTask: function(){
                        hr.onboarding.editTask(host, onboardingid, 0, params);
                    },
                    addActivitiesSelected: params.addActivitiesSelected
                });
                params.task.addChild(host.dataView);
                rs();
            });
        };
        redrawTableFunc();
    })
    // return theme.formOnboardingTaskInformation({
    //     content: data,
    //     addTask: params.addTask
    // });
};

hr.onboarding.addMeetingSave = function(host, id, templateIdList, params) {
    hr.onboarding.getValueOfVariableForTemplate(host).then(function(valueOfVariable){
        var meeting_array = [];
        templateIdList.forEach(function(elt){
            ////////////////////
            var index = host.database.meeting_templates.getIndex(elt);
            var template = EncodingClass.string.toVariable(host.database.meeting_templates.items[index].content);
            var meetingContent = {
                name: hr.sclang.executeTemplate(template.meeting_name, valueOfVariable.variableToString),
                location: hr.sclang.executeTemplate(template.meeting_location, valueOfVariable.variableToString),
                status: template.meeting_status ? 1 : 0,
                type: template.meeting_type,
                starttime: hr.sclang.executeExpression(template.meeting_start_time.substring(3, template.meeting_start_time.length - 3), valueOfVariable.originVariable),
                endtime: hr.sclang.executeExpression(template.meeting_end_time.substring(3, template.meeting_end_time.length - 3), valueOfVariable.originVariable),
                reminder: template.meeting_reminder,
                allday: template.meeting_all_day ? 1 : 0,
                assignto: hr.sclang.executeExpression(template.meeting_assign_to.substring(3, template.meeting_assign_to.length - 3), valueOfVariable.originVariable),
                result: hr.sclang.executeTemplate(template.meeting_result, valueOfVariable.variableToString),
                extrainfo: EncodingClass.string.fromVariable({})
            };
            if (template.meeting_participant.startsWith("{{") && template.meeting_participant.endsWith("}}")){
                meetingContent.participant = [hr.sclang.executeExpression(template.meeting_participant.substring(3, template.meeting_participant.length - 3), valueOfVariable.originVariable)];
            }
            else meetingContent.participant = [];
            var participantStr = "";
            meetingContent.participant.forEach(function(elt){
                if (elt != 0) participantStr += "_" + elt;
            });
            if (participantStr != "") participantStr += "_";
            meetingContent.participant = participantStr;
            meeting_array.push(meetingContent);
        });
        FormClass.api_call({
            url: "onboarding_meeting_save.php",
            params: [
                {name: "data", value: EncodingClass.string.fromVariable(meeting_array)},
                {name: "id", value: id},
                {name: "tableName", value: params.tableName}
            ],
            func: function(success, message){
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var content = EncodingClass.string.toVariable(message.substr(2));
                        host.database.meetings.items = host.database.meetings.items.concat(content.meetings);
                        host.database.meeting_links.items = host.database.meeting_links.items.concat(content.meeting_links);
                        hr.onboarding.drawMeetingInformation(host, id, params);
                        hr.onboarding.drawActivitiesInformation(host, onboardingid, params);
                        if (params.chartContainer) {
                            params.chartContainer.clearChild();
                            params.chartContainer.addChild(hr.onboarding.drawEmployeeInformationChart(host, params));
                        }
                    }
                    else {
                        console.log(message);
                    }
                }
                else {
                    console.log(message);
                }
            }
        });
    });
};

hr.onboarding.addMeetingByTemplate = function(host, id, params){
    ModalElement.show_loading();
    FormClass.api_call({
        url: "database_load.php",
        params: [
            {name: "task", value: "onboarding_load_meeting_template"}
        ],
        func: function(success, message){
            ModalElement.close(-1);
            if (success){
                if (message.substr(0, 2) == "ok") {
                    var content = EncodingClass.string.toVariable(message.substr(2));
                    contentModule.makeDatabaseContent(host, content);
                    var dict = {};
                    var groupItems = host.database.template_groups.items.map(function(elt){
                        dict[elt.id] = elt.name;
                        return {
                            value: elt.id,
                            text: elt.name,
                            sortText: absol.string.nonAccentVietnamese(elt.name.toLowerCase())
                        }
                    });
                    groupItems.sort(function(a, b){
                        if (a.sortText > b.sortText) return 1;
                        if (a.sortText < b.sortText) return -1;
                        return 0;
                    });
                    groupItems.unshift({value: 0, text: LanguageModule.text("txt_all")});
                    var data = host.database.meeting_templates.items.map(function(elt){
                        return {
                            id: elt.id,
                            name: elt.name,
                            comment: elt.comment,
                            groupid: elt.groupid,
                            groupText: dict[elt.groupid],
                            preview: function(){
                                hr.onboarding.meetingPreview(host, elt.id);
                            }
                        };
                    });
                    theme.formOnboardingAddTask({data: data, groupItems: groupItems}).then(function(rs){
                        hr.onboarding.addMeetingSave(host, id, rs, params);
                    });
                }
                else {
                    console.log(message);
                }
            }
            else {
                console.log(message);
            }
        }
    });
};

hr.onboarding.deleteMeeting = function(host, onboardingid, id, params){
    return new Promise(function(rs, rj){
        ModalElement.show_loading();
        FormClass.api_call({
            url: "onboarding_delete_meeting_save.php",
            params: [
                {name: "onboardingid", value: onboardingid},
                {name: "meetingid", value: id}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok") {
                        for (var i = 0; i < host.database.meeting_links.items.length; i++){
                            if (host.database.meeting_links.items[i].onboardingid == onboardingid && host.database.meeting_links.items[i].meetingid == id){
                                host.database.meeting_links.items.splice(i, 1);
                                break;
                            }
                        }
                        host.database.meetings.items = host.database.meetings.items.filter(function(elt){
                            return elt.id != "meeting_" + id;
                        });
                        host.database.activities.items = host.database.activities.items.filter(function(elt){
                            return elt.id != "meeting_" + id;
                        });
                        rs("success");
                        hr.onboarding.drawMeetingInformation(host, onboardingid, params);
                        // hr.onboarding.drawActivitiesInformation(host, onboardingid, params);
                        if (params.chartContainer) {
                            params.chartContainer.clearChild();
                            params.chartContainer.addChild(hr.onboarding.drawEmployeeInformationChart(host, params));
                        }
                    }
                    else {
                        console.log(message);
                    }
                }
                else {
                    console.log(message);
                }
            }
        });
    });
};

hr.onboarding.drawMeetingInformation = function(host, onboardingid, params) {
    return new Promise(function(rs, rj) {
        var data = [];
        for (var i = 0; i < host.database.meetings.items.length; i++){
            host.database.meetings.items[i].func = {
                editMeeting: function(host, onboardingid, id){
                    return function(){
                        hr.onboarding.editMeeting(host, onboardingid, id, params);
                    }
                }(host, onboardingid,  host.database.meetings.items[i].meetingid),
                deleteMeeting: function(host, onboardingid, id){
                    return function(){
                        hr.onboarding.deleteMeeting(host, onboardingid, id, params);
                    }
                }(host, onboardingid,  host.database.meetings.items[i].meetingid),
                statusChange: function(host, onboardingid, id){
                    return function(status){
                        hr.onboarding.activitiesStatusChangeSave(host, "meeting", id, status, params, onboardingid);
                    }
                }(host, onboardingid,  host.database.meetings.items[i].meetingid)
            };
            data.push(host.database.meetings.items[i]);
        }
        var displayDic = {
            name: true,
            status: true,
            assignto: true,
            userid: true,
            createdtime: true
        };
        var columnList = contentModule.getColumnListFromDatatype(host, "meeting", displayDic);
        if (!host.meeting_user_column_configsDic[params.tableName + "activities_meeting_view_on_function"]){
            for (var i = 0; i < columnList.length; i++){
                if (columnList[i].value == "status"){
                    var x = columnList[i];
                    columnList.splice(i, 1);
                    columnList.unshift(x);
                    break;
                }
            }
        }
        var redrawTableFunc = function(){
            contentModule.getColumnListConfig(host, host.meeting_user_column_configsDic, columnList, params.tableName + "activities_meeting_view_on_function").then(function(value){
                host.configColumnActivitiesMeeting = value;
                params.meeting.clearChild();
                host.dataView = theme.formOnboardingMeetingContentData({
                    data: data,
                    inputsearchbox: host.inputsearchbox,
                    configColumnActivitiesMeeting: host.configColumnActivitiesMeeting,
                    configColumnFunc: function(){
                        contentModule.userColumnConfigForm({
                            type: params.tableName + "activities_meeting_view_on_function",
                            columnList: columnList
                        }).then(function(value){
                            host.meeting_user_column_configsDic[params.tableName + "activities_meeting_view_on_function"] = value;
                            redrawTableFunc();
                        });
                    },
                    addMeetingByTemplate: params.addMeetingByTemplate,
                    addMeeting: function(){
                        hr.onboarding.editMeeting(host, onboardingid, 0, params);
                    },
                    addActivitiesSelected: params.addActivitiesSelected
                });
                params.meeting.addChild(host.dataView);
                rs();
            });
        };
        redrawTableFunc();
    })
};

hr.onboarding.showOnboardingFunc = function(host, onboardingid, params){
    contentModule.activitiesInformation({
        workSelected: "both", //   task, meeting, both
        tableName: "onboarding",
        instanceid: onboardingid,
        employeeid: host.employeeid, // id người thực hiện công việc
        addActivitiesSelected: "normal" //  normal/template/both
    }).then(function(result){
        var nav = absol.buildDom({
            tag:'mknav',
            class: 'mk-nav',
            props: {
                items: [
                    {text: LanguageModule.text("txt_general_information"), value: "general_information"},
                    {text: LanguageModule.text("txt_task"), value: "task"},
                    {text: LanguageModule.text("txt_meeting"), value: "meeting"},
                    // {text: LanguageModule.text("txt_email"), value: "email"},
                    {text: LanguageModule.text("txt_history"), value: "history"},
                ],
                value: "general_information"
            },
            on:{
                clickitem: function(event){
                    rightCtn.off('scroll',scrollRightFunc);// prevent loop
                    if (sectionList[this.value]) sectionList[this.value].scrollIntoView();
                    setTimeout(function(){
                        rightCtn.on('scroll',scrollRightFunc );
                    }, 10);
                }
            }
        });
        var rightChild = [];
        host.employeeInformation = absol._({
            child: hr.onboarding.drawEmployeeInformation(host)
        });
        var t = absol.$(".activities-chart-container", host.employeeInformation);
        t.appendChild(result.getChartContent());
        rightChild.push(host.employeeInformation);
        rightChild.push(hr.onboarding.drawGeneralInformation(host, params));
        // host.emailInformation = absol._({
        //     child: hr.onboarding.drawEmailInformation(host, params)
        // });
        // rightChild.push(host.emailInformation);
        result.task["data-sectionid"] = "task";
        host.taskInformation = absol._({
            child: result.task
        });
        rightChild.push(host.taskInformation);
        result.task["data-sectionid"] = "meeting";
        host.meetingInformation = absol._({
            child: result.meeting
        });
        rightChild.push(host.meetingInformation);
        var scrollRightFunc = function(){
            var elt;
            var bound = rightCtn.getBoundingClientRect();
            var eltBound;
            var nearestEltId;
            var nearestDistance = 100000000;
            var distance;
            for (var i in sectionList){
                elt = sectionList[i];
                eltBound = elt.getBoundingClientRect();
                distance = 1000000;
                if (eltBound.top <= bound.top){
                    if (eltBound.bottom >= bound.bottom){
                        distance = -1e6;
                    }
                    else if (bound.top - eltBound.top  < 30){
                        distance = eltBound.top - bound.bottom;//negative
                    }
                    else if (eltBound.bottom > bound.top){
                        distance = bound.top - eltBound.top;
                    }
                }
                else if (eltBound.top < bound.bottom){
                    distance = eltBound.top - bound.bottom;//negative
                }
                else {
                    distance = Math.abs(bound.top - eltBound.top)
                }
                if (nearestDistance > distance){
                    nearestDistance = distance;
                    nearestEltId = i;
                }
            }
            nav.value = nearestEltId;
        };
        var rightCtn = absol.buildDom({
            class: 'mk-main-right',
            style: {
                paddingBottom: "var(--footer-margin)"
            },
            child: rightChild,
            on: {
                scroll: scrollRightFunc
            }
        });
        var data_ctn = absol._({
            class: 'mk-main',
            style: {
                height: '100%'
            },
            child: [
                {
                    class: 'mk-main-left-ctn',
                    child: [nav]
                },
                rightCtn
            ]
        });
        var sectionList = {};
        absol.$("div", rightCtn, function(elt){
            var id = elt.getAttribute("data-sectionid");
            if (!id) return;
            sectionList[id] = elt;
        });
        var singlePage = absol.buildDom({
            tag: "singlepage",
            class: ["cd-page-not-padding-right", "as-viewport-full", "as-no-scroll"],
            child: [
                {
                    class: ['button-panel-header', 'absol-single-page-header'],
                    child: [
                        {
                            class: "single-button-header",
                            child: theme.closeButton({
                                onclick: params.closeFunc
                            })
                        },
                        {
                            class: "single-button-header",
                            child: theme.noneIconButton({
                                text: LanguageModule.text("txt_send_mail"),
                                onclick: function(){
                                    hr.onboarding.addEmail(host, onboardingid);
                                }
                            })
                        }
                    ]
                },
                data_ctn
            ]
        });
        if (host.frameList.getLength() > 1) host.frameList.removeLast();
        host.frameList.addChild(singlePage);
        singlePage.requestActive();
    });

};

hr.onboarding.showOnboarding = function(host, id){
    hr.menu.changeCurrentUrlTab(host, "onboarding/" + id);
    host.id = id;
    host.showOnboardingParams = {
        editFunc: function(){
            hr.onboarding.addOnboarding(host, id);
        },
        closeFunc: function(){
            host.frameList.removeLast();
            hr.menu.changeCurrentUrlTab(host, "onboarding");
        },
        addTask: function(){
            hr.onboarding.addTask(host, id);
        },
        addMeeting: function(){
            hr.onboarding.addMeeting(host, id);
        },
        addEmail: function(){
            hr.onboarding.addEmail(host, id);
        }
    };
    hr.onboarding.showOnboardingFunc(host, id, host.showOnboardingParams);
};

hr.onboarding.showOnboardingPre = function(host, id){
    if (host.database.onboarding.getIndex(id) < 0){
        ModalElement.alert({message: LanguageModule.text("war_txt_no_privilege_view_content")});
        return;
    }
    var index = host.database.onboarding.getIndex(id);
    var employeeid = host.database.onboarding.items[index].employeeid;
    if (index < 0 || (systemconfig.privSystem < 2 && !host.privilegesDic[-employeeid].view_onboarding && !host.privilegesDic[-employeeid].edit_onboarding)){
        ModalElement.alert({
            message: LanguageModule.text("war_txt_no_privilege_view_content")
        });
        return;
    }
    ModalElement.show_loading();
    FormClass.api_call({
        url: "database_load.php",
        params: [
            {name: "task", value: "onboarding_load_by_id"},
            {name: "id", value: id}
        ],
        func: function(success, message){
            ModalElement.close(-1);
            if (success){
                if (message.substr(0, 2) == "ok"){
                    var st = EncodingClass.string.toVariable(message.substr(2));
                    host.dataOnboardingEdit = EncodingClass.string.duplicate(st.onboarding);
                    host.employeeid = host.dataOnboardingEdit.employeeid;
                    if (host.dataOnboardingEdit.extrainfo == "") host.dataOnboardingEdit.extrainfo = {};
                    else host.dataOnboardingEdit.extrainfo = EncodingClass.string.toVariable(host.dataOnboardingEdit.extrainfo);
                    delete(st.onboarding);
                    contentModule.makeDatabaseContent(host, st);
                    // host.database.emails.items.forEach(function(elt){
                    //     elt.receiver = EncodingClass.string.toVariable(elt.receiver);
                    //     elt.cc = EncodingClass.string.toVariable(elt.cc);
                    //     elt.bcc = EncodingClass.string.toVariable(elt.bcc);
                    // });
                    hr.onboarding.showOnboarding(host, id);
                }
                else if (message == "war_txt_failed_data"){
                    ModalElement.alert({
                        message: LanguageModule.text("war_txt_failed_data"),
                        func: function(){
                            hr.onboarding.init(host);
                        }
                    });
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
            else {
                ModalElement.alert({message: message});
            }
        }
    });
};

hr.onboarding.getCellOnboarding = function(host, id){
    var index = host.database.onboarding.getIndex(id);
    var func = {
        view: function(resolve){
            hr.onboarding.showOnboardingPre(host, id);
        }
    };
    var res = host.database.onboarding.items[index];
    if (systemconfig.privSystem >= 2 || host.privilegesDic[-res.employeeid].edit_onboarding){
        func.delete = function(){
            return new Promise(function(resolve, reject){
                hr.onboarding.deleteOnboardingConfirm(host, id).then(function(value){
                    resolve(value);
                });
            });
        };
    }
    var empIndex = host.employeeDic[res.employeeid];
    res.departmentid = host.database.employees.items[empIndex].orgid;
    res.func = func;
    return res;
};

hr.onboarding.redraw = function(host){
    var departmentid = host.department_select.value;
    if (departmentid == 0){
        var oIndex = host.database.orgs.getIndex(host.company_select.value);
        var orgIDList = contentModule.getDepartmentIDList(host, oIndex);
    }
    else {
        var oIndex = host.database.orgs.getIndex(departmentid);
        var orgIDList = contentModule.getDepartmentIDList(host, oIndex);
    }
    var employeeDic = {};
    for (var i = 0; i < host.database.employees.items.length; i++){
        if (orgIDList.indexOf(host.database.employees.items[i].orgid) >= 0) employeeDic[host.database.employees.items[i].id] = true;
    }
    var displayDic = {
        employeeid: true,
        position: true,
        available: true
    };
    var columnList = contentModule.getColumnListFromDatatype(host, "onboarding", displayDic);
    var k = -1;
    for (var i = 0; i < columnList.length; i++){
        if (columnList[i].value == "employeeid"){
            k = i;
            break;
        }
    }
    if (k >= 0){
        columnList.splice(k, 0, {value: "departmentid", display: true, main: true, type: -24, text: LanguageModule.text("txt_department")});
    }
    var redrawTableFunc = function(){
        var data = [];
        var row, employeeid;
        for (var i = 0; i < host.database.onboarding.items.length; i++){
            employeeid = host.database.onboarding.items[i].employeeid;
            if (!employeeDic[employeeid]) continue;
            if (systemconfig.privSystem < 2 && !host.privilegesDic[-employeeid].view_onboarding && !host.privilegesDic[-employeeid].edit_onboarding) continue;
            row = hr.onboarding.getCellOnboarding(host, host.database.onboarding.items[i].id);
            if (!row) continue;
            data.push(row);
        }
        contentModule.getColumnListConfig(host, host.user_column_configsDic, columnList, "onboarding_list").then(function(value){
            host.configColumnOnboarding = value;
            DOMElement.removeAllChildren(host.data_container);
            host.dataView = host.funcs.formOnboardingContentData({
                data: data,
                inputsearchbox: host.inputsearchbox,
                configColumnOnboarding: host.configColumnOnboarding,
                configColumnFunc: function(){
                    contentModule.userColumnConfigForm({
                        type: "onboarding_list",
                        columnList: columnList
                    }).then(function(value){
                        host.user_column_configsDic["onboarding_list"] = value;
                        redrawTableFunc();
                    });
                }
            });
            host.data_container.appendChild(host.dataView);
        });
    }
    redrawTableFunc();
};

hr.onboarding.init2 = function(host){
    return new Promise(function(resolveMn, rejectMn){
        var departmentid = host.company_select.value;
        var oIndex = host.database.orgs.getIndex(host.company_select.value);
        var orgIDList = contentModule.getDepartmentIDList(host, oIndex);
        var orgDic = contentModule.makeDictionaryIndex(host.database.orgs.items);
        var employeeIdList = [], employeeid;
        for (var i = 0; i < orgIDList.length; i++){
            oIndex = orgDic[orgIDList[i]];
            host.database.orgs.items[oIndex].employeeIndexList.forEach(function(empIndex){
                employeeid = host.database.employees.items[empIndex].id;
                if (systemconfig.privSystem < 2 && !host.privilegesDic[-employeeid].view_onboarding && !host.privilegesDic[-employeeid].edit_onboarding) return;
                employeeIdList.push(employeeid);
            });
        }
        employeeIdList.sort(function(a, b){
            return a - b;
        });
        if (employeeIdList.length == 0) {
            ModalElement.close(-1);
            return;
        }
        ModalElement.show_loading();
        FormClass.api_call({
            url: "database_load.php",
            params: [
                {name: "task", value: "onboarding_load_init2"},
                {name: "employeeIdList", value: EncodingClass.string.fromVariable(employeeIdList)}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var st = EncodingClass.string.toVariable(message.substr(2));
                        contentModule.makeDatabaseContent(host, st);
                        hr.onboarding.redraw(host);
                        resolveMn(host);
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

hr.onboarding.init = function(host){
    return new Promise(function(resolveMn, rejectMn){
        hr.menu.changeCurrentUrlTab(host, "onboarding");
        host.database = {};
        ModalElement.show_loading();
        FormClass.api_call({
            url: "database_load.php",
            params: [
                {name: "task", value: "onboarding_load_init"}
            ],
            func: function(success, message){
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var content = EncodingClass.string.toVariable(message.substr(2));
                        data_module.loadOnboardingInit().then(function(retval){
                            Object.assign(content, retval);
                            contentModule.makeDatabaseContent(host, content);
                            if (host.database.orgs.items.length == 0){
                                ModalElement.alert({message: "Chưa có bộ phận"});
                                return;
                            }
                            contentModule.makeOrgsIndex(host);
                            contentModule.makeEmployeeData(host);
                            contentModule.makeEmployeesIndex(host);
                            contentModule.makeEmployeePosition2Data(host);
                            // contentModule.makePositions2Index(host);
                            contentModule.makeGeoposOrgsData(host);
                            contentModule.makeEmployeeManagerData(host);
                            host.database.peoples.items.forEach(function(elt){
                                elt.content = EncodingClass.string.toVariable(elt.content);
                                elt.email = [];
                                if (elt.content.work_email) elt.email.push(elt.content.work_email);
                                if (elt.content.private_email) elt.email.push(elt.content.private_email);
                                elt.phone = [];
                                if (elt.content.phone_1) elt.email.push(elt.content.phone_1);
                                if (elt.content.phone_2) elt.email.push(elt.content.phone_2);
                            });
                            host.employeeDic = contentModule.makeDictionaryIndex(host.database.employees.items);
                            host.peopleDic = contentModule.makeDictionaryIndex(host.database.peoples.items);
                            host.positionDic = contentModule.makeDictionaryIndex(host.database.positions.items);
                            host.orgDic = contentModule.makeDictionaryIndex(host.database.orgs.items);
                            host.geoposDic = contentModule.makeDictionaryIndex(host.database.geopos.items);
                            host.user_column_configsDic = contentModule.getUser_column_configsDic(host);
                            var cmdbutton = {
                                close: function () {
                                    if (hr.isMobile){
                                        host.holder.selfRemove();
                                        hr.menu.loadPage(100);
                                    }
                                    else {
                                        hr.menu.tabPanel.removeTab(host.holder.id);
                                    }
                                },
                                add: function () {
                                    hr.onboarding.wizardAddPre(host);
                                }
                            };
                            host.inputsearchbox = absol.buildDom({
                                tag:'searchcrosstextinput',
                                style: {
                                    width: "var(--searchbox-width)"
                                },
                                props:{
                                    placeholder: LanguageModule.text("txt_search")
                                }
                            });
                            var companyList = [];
                            for (var i = 0; i < host.database.orgs.items.length; i++){
                                if (host.database.orgs.items[i].parentid == 0) {
                                    companyList.push({
                                        value: host.database.orgs.items[i].id,
                                        text: host.database.orgs.items[i].name
                                    });
                                }
                            }
                            host.company_select = absol.buildDom({
                                tag: "selectmenu",
                                props: {
                                    items: companyList,
                                    enableSearch: true
                                },
                                on: {
                                    change: function(){
                                        departmentList = contentModule.getDepartmentListSelectTreeMenuFilter(host, this.value);
                                        host.department_select.items = departmentList;
                                        host.department_select.value = departmentList[0].value;
                                        hr.onboarding.init2(host);
                                    }
                                }
                            });
                            var departmentList;
                            if (companyList.length > 1){
                                departmentList = contentModule.getDepartmentListSelectTreeMenuFilter(host, host.company_select.value);
                            }
                            else {
                                departmentList = contentModule.getDepartmentListSelectTreeMenuFilter(host, 0);
                            }
                            host.department_select = absol.buildDom({
                                tag: "selecttreemenu",
                                props: {
                                    items: departmentList,
                                    enableSearch: true
                                },
                                on: {
                                    change: function(){
                                        hr.onboarding.redraw(host);
                                    }
                                }
                            });
                            host.data_container = DOMElement.div({attrs: {style: {paddingBottom: "var(--footer-margin)"}}});
                            host.holder.addChild(host.frameList);
                            var singlePage = host.funcs.formOnboardingInit({
                                cmdbutton: cmdbutton,
                                company_select: host.company_select,
                                department_select: host.department_select,
                                data_container: host.data_container,
                                inputsearchbox: host.inputsearchbox,
                                companyList: companyList
                            });
                            host.frameList.addChild(singlePage);
                            singlePage.requestActive();
                            hr.onboarding.init2(host).then(function(value){
                                resolveMn(value);
                            });
                        })
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

VaKeR 2022