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/content_module.js
 'use strict';

 systemconfig.bsc_performance_threshold = [70, 85, 100];
 systemconfig.bsc_thresholdcolor =  ['#ff0000', '#ffee58', '#66bb6a', '#29b6f6'];
 systemconfig.bsc_locked_by = "month";
 systemconfig.bsc_locked_on_day = 3;

FormClass.readFileAsync = function(file){
    return new Promise(function(resolve, reject){
        FormClass.readFile(file, function (result) {
            resolve(result[0]);//tại sao lại trả về mảng nhỉ, kì lạ thật
        });
    });
};
///

window.contentModule = {};

contentModule.performanceView = function (score) {
    var i, s, is, k, k2, x;
    var thlen = systemconfig.bsc_performance_threshold.length;
    var tlen = systemconfig.bsc_performance_threshold[thlen - 1] + 20;
    if (!isNaN(score)) {
        s = score + "";
    } else {
        s = "-";
    }
    if ((s != "NaN") && (s != "-") && (s != "") && (s != "N/A")) {
        k = k2 = parseInt(score.toFixed(0), 10);
        if (k2 < 2) k2 = 2;
        if (k2 > systemconfig.bsc_performance_threshold[thlen - 1]) k2 = systemconfig.bsc_performance_threshold[thlen - 1];
        is = systemconfig.bsc_thresholdcolor[0];
        for (i = thlen; i > 0; i--) {
            if (k2 >= systemconfig.bsc_performance_threshold[i - 1]) {
                is = systemconfig.bsc_thresholdcolor[i];
                break;
            }
        }
        s = DOMElement.div({
            attrs: {
                style: {
                    width: (tlen + 100) + "px"
                },
            },
            children: [DOMElement.div({
                attrs: {style: {whiteSpace: "nowrap"}},
                children: [
                    DOMElement.div({
                        attrs: {
                            align: "right",
                            title: contentModule.moneyFormat2(score, 0, 8) + "%",
                            style: {
                                width: "80px",
                                verticalAlign: "middle",
                                display: "inline-block"
                            }
                        },
                        text: contentModule.moneyFormat2(score, 0, 2) + "%"
                    }),
                    DOMElement.div({
                        attrs: {
                            style: {
                                width: tlen + "px",
                                marginLeft: "5px",
                                verticalAlign: "middle",
                                display: "inline-block"
                            }
                        },
                        children: [
                            absol._('div')
                                .attr('style', 'background-color: '+ is + '!important')
                                .addStyle({
                                        width: k2 + "px",
                                        height: "10px",
                                        fontSize: "4px"
                                    }
                                )
                        ]
                    })
                ]
            })]
        });
        x = DOMElement.div({
            attrs: {
                align: "left",
                style: {
                    width: (tlen + 120) + "px",
                    paddingTop: "0px",
                    paddingBottom: "0px"
                }
            },
            children: [s]
        });
    } else {
        x = DOMElement.div({
            attrs: {
                align: "center",
                style: {
                    width: (tlen + 120) + "px",
                    paddingTop: "0px",
                    paddingBottom: "0px"
                }
            },
            text: s
        });
    }
    return x;
};

contentModule.generateRandom = function () {
    var res = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for (var i = 0; i < 20; i++){
        res += possible.charAt(Math.floor(Math.random() * possible.length));
    }
    return res;
};

contentModule.getListApprovalMethod = function(){
    return [
        {value: "sequence", text: LanguageModule.text("txt_sequence")},
        {value: "parallel", text: LanguageModule.text("txt_parallel")},
        {value: "one_approver", text: LanguageModule.text("txt_one_approver")}
    ];
};

contentModule.getBscFormulasSystem = function(){
    return [
        {id: -1, name: LanguageModule.text("txt_formulation_name1"), description: "", content: "KEggPSBHKSAmIChWID49IEcpCjEKViA+PSBHCjEgKyAoVi1HKS8oSC1HKQoxCihWLUwpLyhHLUwpCg==", func: null},
        {id: -10, name: LanguageModule.text("txt_formulation_name10"), description: "", content: "KEggPSBHKSAmIChWID49IEcpCjEKVjw9TAowClY+PUcKMQoxCihWIC0gTCkvKEctTCkK", func: null},
        {id: -5, name: LanguageModule.text("txt_formulation_name5"), description: "", content: "ViA+PSBHCjEKMQooVi1MKS8oRy1MKQo=", func: null},
        {id: -11, name: LanguageModule.text("txt_formulation_name11"), description: "", content: "KEggPSBHKSAmIChWID49IEcpCjEKVjw9TAowClY8RwooViAtIEwpLyhHLUwpClY+PUcKMSArIChWLUcpLyhILUcpCg==", func: null, lastInGroup: true},
        {id: -12, name: LanguageModule.text("txt_formulation_name12"), description: "", content: "KEwgPSBHKSAmIChWIDw9IEcpCjEKVjxHCihWLUcpLyhMLUcpClY+PUcKMSArIChHIC0gVikvKEgtRykK", func: null},
        {id: -13, name: LanguageModule.text("txt_formulation_name13"), description: "", content: "KEwgPSBHKSAmIChWIDw9IEcpCjEKVjxHCjEKVj49SAowClY+PUcKMSArIChHIC0gVikvKEgtRykK", func: null},
        {id: -6, name: LanguageModule.text("txt_formulation_name6"), description: "", content: "ViA8PSBHCjEKMQooSC1WKS8oSC1HKQo=", func: null},
        {id: -14, name: LanguageModule.text("txt_formulation_name14"), description: "", content: "KEwgPSBHKSAmIChWIDw9IEcpCjEKVjxHCihWLUcpLyhMLUcpClY+PUgKMApWPj1HCjEgKyAoRyAtIFYpLyhILUcpCg==", func: null, lastInGroup: true},
        {id: -15, name: LanguageModule.text("txt_formulation_name15"), description: "", content: "KEggPSBHKSAmIChWID49IEcpCjEKVjxHCihWIC0gTCkvKEctTCkKVj49RwoxICsgMC41MCooViAtIEcpLyhILUcpCg==", func: null},
        {id: -16, name: LanguageModule.text("txt_formulation_name16"), description: "", content: "KEggPSBHKSAmIChWID49IEcpCjEKVjw9TAowClY8RwooViAtIEwpLyhHLUwpClY+PUgKMS41ClY+PUcKMSArIDAuNTAqKFYgLSBHKS8oSC1HKQo=", func: null},
        {id: -17, name: LanguageModule.text("txt_formulation_name17"), description: "", content: "KEggPSBHKSAmIChWID49IEcpCjEKVjxHCihWIC0gTCkvKEctTCkKVj49SAoxLjUKVj49RwoxICsgMC41MCooViAtIEcpLyhILUcpCg==", func: null},
        {id: -18, name: LanguageModule.text("txt_formulation_name18"), description: "", content: "KEggPSBHKSAmIChWID49IEcpCjEKVjw9TAowClY8RwooViAtIEwpLyhHLUwpClY+PUcKMSArIDAuNTAqKFYgLSBHKS8oSC1HKQo=", func: null, lastInGroup: true},
        {id: -19, name: LanguageModule.text("txt_formulation_name19"), description: "", content: "KEwgPSBHKSAmIChWIDw9IEcpCjEKVjxHCjEuNSArIDAuNTAqKEwgLSBWKS8oRy1MKQpWPj1HCjEgKyAoRyAtIFYpLyhILUcpCg==", func: null},
        {id: -20, name: LanguageModule.text("txt_formulation_name20"), description: "", content: "KEwgPSBHKSAmIChWIDw9IEcpCjEKVjw9TAoxLjUKVjxHCjEuNSArIDAuNTAqKEwgLSBWKS8oRy1MKQpWPj1ICjAKVj49RwoxICsgKEcgLSBWKS8oSC1HKQo", func: null},
        {id: -21, name: LanguageModule.text("txt_formulation_name21"), description: "", content: "KEwgPSBHKSAmIChWIDw9IEcpCjEKVjw9TAoxLjUKVjxHCjEuNSArIDAuNTAqKEwgLSBWKS8oRy1MKQpWPj1HCjEgKyAoRyAtIFYpLyhILUcpCg==", func: null},
        {id: -22, name: LanguageModule.text("txt_formulation_name22"), description: "", content: "KEwgPSBHKSAmIChWIDw9IEcpCjEKVjxHCjEuNSArIDAuNTAqKEwgLSBWKS8oRy1MKQpWPj1ICjAKVj49RwoxICsgKEcgLSBWKS8oSC1HKQo=", func: null, lastInGroup: true},
        {id: -23, name: LanguageModule.text("txt_formulation_name23"), description: "", content: "KEggPSBHKSAmIChWID49IEcpCjEKVjxHCihWIC0gTCkvKEctTCkKVj49RwoxICsgKFYgLSBHKS8oSC1HKQo=", func: null},
        {id: -2, name: LanguageModule.text("txt_formulation_name2"), description: "", content: "KEggPSBHKSAmIChWID49IEcpCjEKVjw9TAowClY8RwooViAtIEwpLyhHLUwpClY+PUgKMgpWPj1HCjEgKyAoViAtIEcpLyhILUcpCg==", func: null},
        {id: -24, name: LanguageModule.text("txt_formulation_name24"), description: "", content: "KEggPSBHKSAmIChWID49IEcpCjEKVjxHCihWIC0gTCkvKEctTCkKVj49SAoyClY+PUcKMSArIChWIC0gRykvKEgtRykK", func: null},
        {id: -25, name: LanguageModule.text("txt_formulation_name25"), description: "", content: "KEggPSBHKSAmIChWID49IEcpCjEKVjw9TAowClY8RwooViAtIEwpLyhHLUwpClY+PUcKMSArIChWIC0gRykvKEgtRykK", func: null, lastInGroup: true},
        {id: -3, name: LanguageModule.text("txt_formulation_name3"), description: "", content: "KEwgPSBHKSAmIChWIDw9IEcpCjEKViA8PSBHCjEgKyAoRy1WKS8oRy1MKQoxCihILVYpLyhILUcpCg==", func: null},
        {id: -4, name: LanguageModule.text("txt_formulation_name4"), description: "", content: "KEwgPSBHKSAmIChWIDw9IEcpCjEKViA8PSBMCjIKViA8PSBHCjEgKyAoRy1WKS8oRy1MKQpWID49IEgKMAoxCihILVYpLyhILUcpCg==", func: null},
        {id: -26, name: LanguageModule.text("txt_formulation_name26"), description: "", content: "KEwgPSBHKSAmIChWIDw9IEcpCjEKVjw9TAoyClY8RwoyICsgKEwgLSBWKS8oRy1MKQpWPj1HCjEgKyAoRyAtIFYpLyhILUcpCg", func: null},
        {id: -27, name: LanguageModule.text("txt_formulation_name27"), description: "", content: "KEwgPSBHKSAmIChWIDw9IEcpCjEKVjxHCjIgKyAoTCAtIFYpLyhHLUwpClY+PUgKMApWPj1HCjEgKyAoRyAtIFYpLyhILUcpCg==", func: null, lastInGroup: true},
        {id: -7, name: LanguageModule.text("txt_formulation_name7"), description: "", content: "ViA+PSBHCjEKMQowCg==", func: null},
        {id: -8, name: LanguageModule.text("txt_formulation_name8"), description: "", content: "ViA8PSBHCjEKMQowCg==", func: null, lastInGroup: true},
        {id: -9, name: LanguageModule.text("txt_formulation_name9"), description: "", content: "ViA9IEcKMQpWIDw9IEwKMApWID49IEgKMApWIDwgRwooViAtIEwpLyhHLUwpCjEKKEgtVikvKEgtRykK", func: null, lastInGroup: true}
    ];
};

contentModule.makeDictionaryIndex = function(items){
    var dic = {};
    for (var i = 0; i < items.length; i++){
        dic[items[i].id] = i;
    }
    return dic;
};

contentModule.listTableHasGeneralDefault = [
    "bonus_policy_groups",
    "benefit_policy_groups",
    "other_liability_policy_groups",
    "insurance_policy_groups",
    "tax_policy_groups",
    "punishment_policy_groups",
    "late_early_checkin_policy_groups",
    "trade_union_policy_groups",
    "overtime_policy_groups",
    "standard_workday_policy_groups",
    "piece_wage_policy_groups",
    "attendance_clock_policy_groups",
    "asset_category",
    "other_policy_groups"
];

contentModule.makeDatabaseContent = function(host, content){
    var i, keys;
    keys = Object.keys(content);
    keys.forEach(function(item, i){
        host.database[item] = {};
        host.database[item].items = content[item];
        host.database[item].getIndex = function(id){
            for (var i = 0; i < host.database[item].items.length; i++){
                if (host.database[item].items[i].id == id) return i;
            }
            return -1;
        }
        for (var i = 0; i < host.database[item].items.length; i++){
            if (host.database[item].items[i].extrainfo !== undefined && EncodingClass.type.isString(host.database[item].items[i].extrainfo)){
                if (host.database[item].items[i].extrainfo != ""){
                    host.database[item].items[i].extrainfo = EncodingClass.string.toVariable(host.database[item].items[i].extrainfo);
                }
                else {
                    host.database[item].items[i].extrainfo = {};
                }
            }
        }
        if (item == "users"){
            host.database[item].getByhomeid = function(homeid){
                for (var i = 0; i < host.database[item].items.length; i++){
                    if (host.database[item].items[i].homeid == homeid) return i;
                }
                return -1;
            }
            for (var i = 0; i < host.database.users.items.length; i++){
                if (host.database.users.items[i].avatar !== ""){
                    host.database.users.items[i].avatarSrc = host.database.users.items[i].homeid + "_" + host.database.users.items[i].avatar;
                    host.database.users.items[i].avatarSrc = window.domainUser_avatarsNew + host.database.users.items[i].avatarSrc;
                }
                else {
                    if (systemconfig.connectorFile){
                        host.database.users.items[i].avatarSrc = window.domainUser_avatarsNew + "default.svg";
                    }
                    else {
                        host.database.users.items[i].avatarSrc = window.domainUser_avatars + "avatar-default.png";
                    }
                }
            }
        }
        else if (item == "employee_family_members"){
            host.database.employee_family_members.items.forEach(function(item){
                if (item.dayofbirth == "") item.dayofbirth = {level: null, value: null};
                else item.dayofbirth = EncodingClass.string.toVariable(item.dayofbirth);
            });
        }
        else if (item == "holidays"){
            host.database.holidays.items.sort(function(a, b){
                return a.timestart.getTime() - b.timestart.getTime();
            });
        }
        else if (item == "worktime_checkins"){
            for (var i = 0; i < host.database[item].items.length; i++){
                if (host.database[item].items[i].method === "") host.database[item].items[i].method = "worktime_machine";
            }
        }
        else if (item == "typelists"){
            for (var i = 0; i < host.database[item].items.length; i++){
                if (host.database[item].items[i].content !== undefined){
                    if (host.database[item].items[i].content != ""){
                        if (typeof(host.database[item].items[i].content) == "string"){
                            host.database[item].items[i].content = EncodingClass.string.toVariable(host.database[item].items[i].content);
                        }
                    }
                    else {
                        host.database[item].items[i].content = {};
                    }
                }
            }
            host.database.typelists.items = contentModule.getDatatypePrimitiveList().concat(host.database.typelists.items);
        }
        else if (item == "allowance_policy_groups"){
            var x = contentModule.getAllowance_policy_groupsListPri();
            for (var i = 0; i < x.length; i++){
                if (host.database.allowance_policy_groups.getIndex(x[i].id) < 0){
                    host.database.allowance_policy_groups.items.unshift(x[i]);
                }
            }
        }
        else if (item == "leave_policy_groups"){
            var x = contentModule.getLeave_policy_groupsListPri();
            for (var i = 0; i < x.length; i++){
                if (host.database.leave_policy_groups.getIndex(x[i].id) < 0){
                    host.database.leave_policy_groups.items.unshift(x[i]);
                }
            }
        }
        else if (item == "advance_payment_policy_groups"){
            var x = contentModule.getAdvance_payment_policy_groupsListPri();
            for (var i = 0; i < x.length; i++){
                if (host.database.advance_payment_policy_groups.getIndex(x[i].id) < 0){
                    host.database.advance_payment_policy_groups.items.unshift(x[i]);
                }
            }
        }
        else if (item == "employment_contract_types"){
            var x = contentModule.getEmployment_contract_typesListPri();
            for (var i = 0; i < x.length; i++){
                if (host.database.employment_contract_types.getIndex(x[i].id) < 0){
                    host.database.employment_contract_types.items.unshift(x[i]);
                }
            }
        }
        else if (item == "religions"){
            var x = contentModule.getReligionsListPri();
            for (var i = 0; i < x.length; i++){
                if (host.database.religions.getIndex(x[i].id) < 0){
                    host.database.religions.items.unshift(x[i]);
                }
            }
            var stt = ["BUDD", "CATH", "CRIS", "MUSM", "N"];
            host.database.religions.items.sort(function(a, b){
                return stt.indexOf(a.code) - stt.indexOf(b.code);
                if (a.id > 0 && b.id > 0) return a.id - b.id;
            });
        }
        else if (item == "pay_percentage"){
            var x = contentModule.getPayPercentageListPri();
            for (var i = x.length - 1; i >= 0; i--){
                if (host.database.pay_percentage.getIndex(x[i].id) < 0){
                    host.database.pay_percentage.items.unshift(x[i]);
                }
            }
        }
        else if (item == "document_groups"){
            contentModule.makeDocumentGroupsIndex(host);
        }
        else if (item == "document_properties"){
            var x = contentModule.getDocumentPropertiesListPri();
            var index;
            for (var i = x.length - 1; i >= 0; i--){
                index = host.database.document_properties.getIndex(x[i].id);
                if (index < 0){
                    host.database.document_properties.items.push(x[i]);
                }
                else {
                    host.database.document_properties.items[index].name = x[i].name;
                }
            }
            host.database.document_properties.items.sort(function(a, b){
                return a.id - b.id;
            });
            contentModule.makeDocumentPropertiesIndex(host);
        }
        else if (item == "document_folders"){
            contentModule.makeDocumentFoldersIndex(host);
        }
        else if (item == "chat_sessions"){
            for (var i = 0; i < host.database.chat_sessions.items.length; i++){
                if (host.database.chat_sessions.items[i].content != ""){
                    host.database.chat_sessions.items[i].content = EncodingClass.string.toVariable(host.database.chat_sessions.items[i].content);
                }
                else {
                    host.database.chat_sessions.items[i].content = [];
                }
            }
        }
        else if (item == "offboarding_types"){
            var x = contentModule.getOffboardingTypesListPri();
            for (var i = 0; i < x.length; i++){
                if (host.database.offboarding_types.getIndex(x[i].id) < 0){
                    host.database.offboarding_types.items.unshift(x[i]);
                }
            }
        }
        else if (item == "bsc_formulas"){
            var holderForSort = host.database.bsc_formulas.items.map(function(item){
                return {
                    item: item,
                    val: absol.string.nonAccentVietnamese(item.name.toLowerCase())
                }
            });
            holderForSort.sort(function(a, b){
                if (a.val < b.val) return -1;
                if (a.val > b.val) return 1;
                return 0;
            });

            host.database.bsc_formulas.items = holderForSort.map(function(holder){
                return holder.item;
            });
            var x = contentModule.getBscFormulasSystem();
            for (var i = x.length - 1; i >= 0; i--){
                x[i].name = "HT " + x[i].name;
                host.database.bsc_formulas.items.unshift(x[i]);
            }
            for (var i = 0; i < host.database.bsc_formulas.items.length; i++){
                contentModule.makeBscFormulasData(host.database.bsc_formulas.items[i]);
            }
        }
        else if (item == "bsc_inputs" || item == "bsc_input_queues"){
            for (var i = 0; i < host.database[item].items.length; i++){
                if (host.database[item].items[i].details_result != ""){
                    host.database[item].items[i].details_result = EncodingClass.string.toVariable(host.database[item].items[i].details_result);
                }
                else {
                    host.database[item].items[i].details_result = {};
                }
            }
        }
        else if (item == "bsc_scorecards"){
            for (var i = 0; i < host.database[item].items.length; i++){
                if (host.database[item].items[i].template != ""){
                    host.database[item].items[i].template = EncodingClass.string.toVariable(host.database[item].items[i].template);
                }
                else {
                    host.database[item].items[i].template = undefined;
                }
            }
        }
        else if (item == "pay_sheet_column_configs"){
            host.database.pay_sheet_column_configs.getIndexByCode = function(code){
                for (var i = 0; i < host.database[item].items.length; i++){
                    if (host.database[item].items[i].code == code) return i;
                }
                return -1;
            };
            var x = contentModule.getPaySheetColumnSystem();
            var index;
            for (var i = x.length - 1; i >= 0; i--){
                index = host.database.pay_sheet_column_configs.getIndexByCode(x[i].code);
                if (index < 0){
                    x[i].type = "system";
                    host.database.pay_sheet_column_configs.items.unshift(x[i]);
                }
            }
            host.database.pay_sheet_column_configs.items.sort(function(a, b){
                return a.cindex - b.cindex;
            });
        }
        else if (item == "processes"){
            var x = contentModule.getProcessesSystem();
            var index;
            for (var i = 0; i < x.length; i++){
                index = host.database.processes.getIndex(x[i].id);
                if (index < 0){
                    host.database.processes.items.unshift(x[i]);
                }
                else {
                    host.database.processes.items[index].name = x[i].name;
                    host.database.processes.items[index].value = x[i].value;
                }
            }
            console.log(host.database.processes.items);
        }
        else if (item == "leave_policies"){
            for (var i = 0; i < host.database.leave_policies.items.length; i++){
                if (host.database.leave_policies.items[i].accumulated_leave_expired_before != ""){
                    host.database.leave_policies.items[i].accumulated_leave_expired_before = EncodingClass.string.toVariable(host.database.leave_policies.items[i].accumulated_leave_expired_before);
                }
                else {
                    host.database.leave_policies.items[i].accumulated_leave_expired_before = {};
                }
            }
        }
        else if (item == "leave_list"){
            for (var i = 0; i < host.database.leave_list.items.length; i++){
                if (host.database.leave_list.items[i].time_period != ""){
                    host.database.leave_list.items[i].time_period = EncodingClass.string.toVariable(host.database.leave_list.items[i].time_period);
                }
                else {
                    host.database.leave_list.items[i].time_period = {};
                }
            }
        }
        else if (contentModule.listTableHasGeneralDefault.indexOf(item) >= 0){
            var x = contentModule.getGeneralDefault();
            if (host.database[item].getIndex(x.id) < 0){
                host.database[item].items.unshift(x);
            }
        }
    });
};

contentModule.makeBscFormulasData = function(item){
    var t = Base64.decode(item.content);
    var s = [], q;
    while (true){
        t = contentModule.getStringLine(t);
        if (t[1] == null) break;
        q = t[0];
        t = contentModule.getStringLine(t[1]);
        if (t[1] == null) break;
        s.push([q, t[0]]);
        t = t[1];
    }
    t = "na";
    for (var j = s.length-1; j >= 0; j--) {
        t = "if (" + s[j][0] + "," + s[j][1] + "," + t + ")";
    }
    item.condlist = s;
    item.parsedData = MathClass.Expression.parse(t);
    item.func = item.parsedData.calc;
};

contentModule.getStringLine = function(st) {
    var k;
    k = st.indexOf("\n");
    if (k == -1) return [st, null];
    return [st.substr(0, k), st.substr(k+1)];
};

contentModule.getBscFormulasMessageSystemList = function(){
    var res = [
        {
            cond: "L > G",
            content: LanguageModule.text("war_txt_target_smaller_low_threshold"),
            type: "system"
        },
        {
            cond: "H < G",
            content: LanguageModule.text("war_txt_target_bigger_high_threshold"),
            type: "system"
        },
        {
            cond: "L == H",
            content: LanguageModule.text("war_txt_low_threshold_equal_high_threshold"),
            type: "system"
        }
    ];
    return res;
};

contentModule.getTimeSend = function (timesend) {
    var res = "";
    var month, day, year, hour, minute;
    month = timesend.getMonth() + 1;
    day = timesend.getDate();
    year = timesend.getFullYear();
    hour = timesend.getHours();
    minute = timesend.getMinutes();
    if (month < 10) {
        month = "0" + month;
    }
    if (day < 10) {
        day = "0" + day;
    }
    if (hour < 10) {
        hour = "0" + hour;
    }
    if (minute < 10) {
        minute = "0" + minute;
    }
    res += day + "/";
    res += month + "/";
    res += year;
    res += " " + hour + ":";
    res += minute;
    return res;
};

contentModule.getDateTimeView = function(timesend){
    if (!timesend) return "";
    var res = "";
    var month, day, year, hour, minute;
    month = timesend.getMonth() + 1;
    day = timesend.getDate();
    year = timesend.getFullYear();
    hour = timesend.getHours();
    minute = timesend.getMinutes();
    if (month < 10) {
        month = "0" + month;
    }
    if (day < 10) {
        day = "0" + day;
    }
    if (hour < 10) {
        hour = "0" + hour;
    }
    if (minute < 10) {
        minute = "0" + minute;
    }
    res += day + "/";
    res += month + "/";
    res += year;
    res += " " + hour + ":";
    res += minute;
    return res;
};

contentModule.getTimeView = function(value){
    if (!value) return "";
    var res = "";
    var hour = parseInt(value/(60*60*1000), 10);
    value = value - hour*(60*60*1000);
    if (hour < 10) {
        hour = "0" + hour;
    }
    var minute = value/(60*1000);
    if (minute < 10) {
        minute = "0" + minute;
    }
    res = hour + ":";
    res += minute;
    return res;
};

contentModule.getHourView = function(dayOffset){
    var d = new Date(absol.datetime.beginOfDay(new Date()).getTime()+ dayOffset);
    return absol.datetime.formatDateTime(d, 'HH:mm');
};

contentModule.getDateView = function(timesend){
    if (!timesend) return "";
    var res = "";
    var month, day, year, hour, minute;
    month = timesend.getMonth() + 1;
    day = timesend.getDate();
    year = timesend.getFullYear();
    if (month < 10) {
        month = "0" + month;
    }
    if (day < 10) {
        day = "0" + day;
    }
    res += day + "/";
    res += month + "/";
    res += year;
    return res;
};

contentModule.getYearView = function(timesend){
    if (!timesend) return "";
    var res = "";
    var year;
    year = timesend.getFullYear();
    res += year;
    return res;
};

contentModule.getDateMonthView = function(timesend){
    if (!timesend) return "";
    var res = "";
    var month, day, year, hour, minute;
    month = timesend.getMonth() + 1;
    day = timesend.getDate();
    year = timesend.getFullYear();
    if (month < 10) {
        month = "0" + month;
    }
    if (day < 10) {
        day = "0" + day;
    }
    res += day + "/";
    res += month;
    return res;
};

contentModule.getTimeGallerySeparate = function(timeview){
    var now = new Date();
    var res = "";
    var seenHours = timeview.getHours();
    if (seenHours < 10){
        seenHours = "0" + seenHours;
    }
    var seenMinutes = timeview.getMinutes();
    if (seenMinutes < 10){
        seenMinutes = "0" + seenMinutes;
    }
    var nowTime = now.getTime()/86400000;
    var seenTime = timeview.getTime()/86400000;
    var nowDate = now.getDate()
    var seenDate = timeview.getDate();
    var nowMonth = now.getMonth() + 1;
    var seenMonth = timeview.getMonth() + 1;
    var nowYear = now.getFullYear();
    var seenYear = timeview.getFullYear();
    if (nowYear == seenYear){
        if (nowMonth == seenMonth && nowDate == seenDate){
            res = "Today";
        }
        else if (nowTime - seenTime < 7){
            var weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
            res = weekday[timeview.getDay()];
        }
        else {
            res = contentModule.getDateView(timeview);
        }
    }
    else {
        res = contentModule.getDateView(timeview);
    }
    return res;
};

contentModule.compareDate = function(time1, time2){
    var date1 = time1.getDate()
    var date2 = time2.getDate();
    var month1 = time1.getMonth() + 1;
    var month2 = time2.getMonth() + 1;
    var year1 = time1.getFullYear();
    var year2 = time2.getFullYear();
    if (date1 == date2 && month1 == month2 && year1 == year2) return true;
    return false;
};

contentModule.getTimeMessageList = function(timeview){
    var now = new Date();
    var res = "";
    var seenHours = timeview.getHours();
    if (seenHours < 10){
        seenHours = "0" + seenHours;
    }
    var seenMinutes = timeview.getMinutes();
    if (seenMinutes < 10){
        seenMinutes = "0" + seenMinutes;
    }
    var nowTime = now.getTime()/86400000;
    var seenTime = timeview.getTime()/86400000;
    var nowDate = now.getDate()
    var seenDate = timeview.getDate();
    var nowMonth = now.getMonth() + 1;
    var seenMonth = timeview.getMonth() + 1;
    var nowYear = now.getFullYear();
    var seenYear = timeview.getFullYear();
    if (nowYear == seenYear){
        if (nowMonth == seenMonth && nowDate == seenDate){
            res = seenHours + ":" + seenMinutes;
        }
        else if (nowTime - seenTime < 7){
            var weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
            res = weekday[timeview.getDay()];
        }
        else {
            res = contentModule.getDateView(timeview);
        }
    }
    else {
        res = contentModule.getTimeView(timeview);
    }
    return res;
};

contentModule.generateLanguageList = function () {
    var i, list = [];
    for (i = 0; i < LanguageModule.code.length; i++) {
        list.push({
            value: LanguageModule.code[i].name,
            text: LanguageModule.code[i].value
        });
    }
    return list;
};

contentModule.filterEmail = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

contentModule.getUserNameByHomeid = function(host, homeid){
    for (var i = 0; i < host.database.users.items.length; i++){
        if (host.database.users.items[i].homeid == homeid) return host.database.users.items[i].username;
    }
    return "-";
};

contentModule.getFieldsMergeByTypeID = function(host, typeid, displayName, name){
    return new Promise(function(resolve, reject){
        var typeIndex = host.typelistsDic[typeid];
        var typeData = data_module.typelists.items[typeIndex];
        switch (typeData.type) {
            case "string":
            case "note":
            case "email_address":
            case "phonenumber":
            case "website":
            case "gps":
                resolve({
                    displayName: displayName,
                    name: name,
                    type: "string"
                });
                break;
            case "number":
            case "currency":
                resolve({
                    displayName: displayName,
                    name: name,
                    type: "number"
                });
                break;
            case "date":
                resolve({
                    displayName: displayName,
                    name: name,
                    type: "date"
                });
                break;
            case "datetime":
                resolve({
                    displayName: displayName,
                    name: name,
                    type: "datetime"
                });
                break;
            case "boolean":
                resolve({
                    displayName: displayName,
                    name: name,
                    type: "bool"
                });
                break;
            case "html":
                resolve({
                    displayName: displayName,
                    name: name,
                    type: "html"
                });
                break;
            case "color_picker":
                resolve({
                    displayName: displayName,
                    name: name,
                    type: "color"
                });
                break;
            case "any_file":
                resolve({
                    displayName: displayName,
                    name: name,
                    type: "file"
                });
                break;
            case "image_file":
                resolve({
                    displayName: displayName,
                    name: name,
                    type: "image"
                });
                break;
            case "files":
                resolve({
                    displayName: displayName,
                    name: name,
                    type: "file[]"
                });
                break;
            case "array":
                contentModule.getFieldsMergeByTypeID(host, typeData.content.typeof, "", "").then(function(v){
                    resolve({
                        displayName: displayName,
                        name: name,
                        type: "array",
                        of: v
                    });
                });
                break;
            case "treetable":
                contentModule.getFieldsMergeByTypeID(host, typeData.content.typeof, "", "").then(function(v){
                    resolve({
                        displayName: displayName,
                        name: name,
                        type: "treetable",
                        of: v
                    });
                });
                break;
            default:
                if (contentModule.listTypeSelectmenu.indexOf(typeData.type) >= 0){
                    if (typeData.type == "nation_city"){
                        contentModule.loadListPrimaryTypeEnum(typeData.type).then(function(list){
                            resolve({
                                displayName: displayName,
                                name: name,
                                type: "enum<pair>",
                                items: list
                            });
                        });
                    }
                    else {
                        contentModule.loadListPrimaryTypeEnum(typeData.type).then(function(list){
                            list[0].text = "";
                            resolve({
                                displayName: displayName,
                                name: name,
                                type: "enum",
                                items: list
                            });
                        });
                    }
                }
                else if (contentModule.listTypeSelectbox.indexOf(typeData.type) >= 0){
                    contentModule.loadListPrimaryTypeEnum(typeData.type).then(function(list){
                        resolve({
                            displayName: displayName,
                            name: name,
                            type: "{enum}",
                            items: list,
                            onchange: function(){
                                if (name == "type_partner_class"){
                                    host.change_partner_class_func(this.export());
                                }
                            }
                        });
                    });
                }
                else if (typeData.type == "enum" || typeData.type == "extends_enum" || typeData.type2 == "enum"){
                    var list = [];
                    contentModule.getDetailsExtends(host, list, typeid);
                    var listItems = [{value: 0, text: ""}];
                    for (var i = 0; i < list.length; i++){
                        listItems.push({value: list[i].localid, text: list[i].text});
                    }
                    resolve({
                        displayName: displayName,
                        name: name,
                        type: "enum",
                        items: listItems
                    });
                }
                else if (typeData.type == "enum_multi" || typeData.type == "extends_enum_multi" || typeData.type2 == "enum_multi"){
                    var list = [];
                    contentModule.getDetailsExtends(host, list, typeid);
                    var listItems = [];
                    for (var i = 0; i < list.length; i++){
                        listItems.push({value: list[i].localid, text: list[i].text});
                    }
                    resolve({
                        displayName: displayName,
                        name: name,
                        type: "{enum}",
                        items: listItems
                    });
                }
                else if (typeData.type == "structure" || typeData.type == "extends_structure" || typeData.type2 == "structure"){
                    var detailsList = [];
                    contentModule.getDetailsExtends(host, detailsList, typeid);
                    var promiseArray = [];
                    for (var i = 0; i < detailsList.length; i++){
                        promiseArray.push(contentModule.getFieldsMergeByTypeID(host, detailsList[i].type, detailsList[i].name, detailsList[i].localid));
                    }
                    Promise.all(promiseArray).then(function(fields){
                        resolve({
                            displayName: displayName,
                            name: name,
                            type: "struct",
                            fields: fields
                        });
                    });
                }
                else {
                    resolve({
                        displayName: displayName,
                        name: name,
                        type: "string"
                    });
                }
        }
    });
};

contentModule.getDatatypePrimitiveList = function(){
    var typelists = [
        {id: -1, name: LanguageModule.text("txt_string"), type: "string", stt: 1},
        {id: -2, name: LanguageModule.text("txt_textarea"), type: "note", stt: 2},
        {id: -3, name: LanguageModule.text("txt_number"), type: "number", stt: 3},
        {id: -4, name: LanguageModule.text("txt_date"), type: "date", stt: 4},
        {id: -5, name: LanguageModule.text("txt_date_time"), type: "datetime", stt: 5},
        {id: -6, name: LanguageModule.text("txt_boolean"), type: "boolean", stt: 6},
        {id: -7, name: LanguageModule.text("txt_email_address"), type: "email_address"},
        {id: -8, name: LanguageModule.text("txt_user"), type: "user", type2: "enum"},
        {id: -9, name: LanguageModule.text("txt_userlist"), type: "userlist", type2: "enum_multi"},
        {id: -10, name: LanguageModule.text("txt_phone_number"), type: "phonenumber"},
        {id: -11, name: LanguageModule.text("txt_website"), type: "website"},
        {id: -12, name: LanguageModule.text("txt_gps"), type: "gps"},
        {id: -14, name: LanguageModule.text("txt_select_nation"), type: 'member_of_nations', type2: "enum"},
        {id: -15, name: LanguageModule.text("txt_select_city"), type: 'member_of_cities', type2: "enum"},
        {id: -16, name: LanguageModule.text("txt_select_ethnic"), type: 'member_of_ethnics', type2: "enum"},
        {
            id: -17, name: LanguageModule.text("txt_phone_type"), type: 'enum',
            content: {
                typeof: -1,
                details: [
                    {key: "home", value: "type_phone_type_home", localid: "type_phone_type_home", text: LanguageModule.text("txt_home")},
                    {key: "mobile", value: "type_phone_type_mobile", localid: "type_phone_type_mobile", text: LanguageModule.text("txt_mobile")}
                ]
            }
        },
        {
            id: -18, name: LanguageModule.text("txt_phone"), type: "phone", type2: "structure",
            content: {
                details: [
                    {key: "type", localid: "type_phone_type", name: LanguageModule.text("txt_type"), type: -17, require: true},
                    {key: "number", localid: "type_phone_number", name: LanguageModule.text("txt_phone_number"), type: -10, default: "", require: true}
                ]
            }
        },
        {
            id: - 19, name: LanguageModule.text("txt_personal_document_type"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "identity_card", value: "type_personal_document_identity_card", localid: "type_personal_document_identity_card", text: LanguageModule.text("txt_identity_card")},
                    {key: "passport", value: "type_personal_document_passport", localid: "type_personal_document_passport", text: LanguageModule.text("txt_passport")},
                    {key: "car_driving_license", value: "type_personal_document_car_driving_license", localid: "type_personal_document_car_driving_license", text: LanguageModule.text("txt_car_driving_license")}
                ]
            }
        },
        {
            id: - 20, name: LanguageModule.text("txt_personal_document"), type: "personal_document", type2: "structure",
            content: {
                details: [
                    {key: "type", localid: "type_personal_document_type", name: LanguageModule.text("txt_type"), type: -19, require: true},
                    {key: "number", localid: "type_personal_document_number", name: LanguageModule.text("txt_number"), type: -1, default: "", require: true},
                    {key: "place_of_issue", localid: "type_personal_document_place", name: LanguageModule.text("txt_place_of_issue"), type: -1, default: "", require: true},
                    {key: "date_of_issue", localid: "type_personal_document_date", name: LanguageModule.text("txt_date_of_issue"), type: -4, default: ["custom", null], require: true},
                    {key: "expire_time", localid: "type_personal_document_expire_time", name: LanguageModule.text("txt_expire_time"), type: -4, default: ["custom", null], require: true}
                ]
            }
        },
        {
            id: - 21, name: LanguageModule.text("txt_family_member"), type: "family_members", type2: "structure",
            content: {
                details: [
                    {key: "fullname", localid: "type_family_members_fullname", name: LanguageModule.text("txt_fullname"), type: -1, require: true},
                    {key: "dayofbirth", localid: "type_family_members_dayofbirth", name: LanguageModule.text("txt_day_of_birth"), type: -335, require: false},
                    {key: "sex", localid: "type_family_members_sex", name: LanguageModule.text("txt_sex"), type: -40, require: false},
                    {key: "relation", localid: "type_family_members_relation", name: LanguageModule.text("txt_relation"), type: -1, require: false},
                    {key: "comment", localid: "type_family_members_note", name: LanguageModule.text("txt_note"), type: -2, require: false}
                ]
            }
        },
        {id: -22, name: LanguageModule.text("txt_select_religion"), type: 'member_of_religions', type2: "enum"},
        {id: -23, name: LanguageModule.text("txt_geographical_position"), type: 'geopos'},
        {id: -24, name: "Chọn bộ phận", type: 'member_of_department', type2: "enum"},
        {
            id: -25, name: "Chọn nhiều chức danh", type: 'position_list', type2: "enum_multi"
        },
        {
            id: - 26, name: LanguageModule.text("txt_department"), type: "org", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "name", localid: "type_org_name", name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "code", localid: "type_org_code", name: LanguageModule.text("txt_code"), type: -1, default: "", require: true},
                    {key: "parentid", localid: "type_org_parentid", name: LanguageModule.text("txt_parent_department"), type: -24, default: 0, require: true},
                    {key: "geopos", localid: "type_org_geopos", name: LanguageModule.text("txt_geographical_position"), type: -210, require: false}
                ]
            }
        },
        {
            id: - 27, name: LanguageModule.text("txt_employee_work_information"), type: "employee", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "code", localid: "type_employee_code", name: LanguageModule.text("txt_employee_code"), type: -1, default: "", require: true},
                    {key: "position", localid: "type_employee_position", name: LanguageModule.text("txt_position"), type: -296, require: false},
                    {key: "concurrent_position", localid: "type_employee_concurrent_position", name: LanguageModule.text("txt_concurrent_position"), type: -296, require: false},
                    {key: "userid", localid: "type_employee_userid", name: LanguageModule.text("txt_user"), type: -8, default: 0, require: false},
                    {key: "work_email", localid: "type_employee_work_email", name: LanguageModule.text("txt_work_email"), type: -7, default: "", require: false},
                    {key: "start_date", localid: "type_employee_start_date", name: LanguageModule.text("txt_probation_start_date"), type: -4, default: ["custom", null], require: false},
                    {key: "official_date", localid: "type_employee_official_date", name: LanguageModule.text("txt_official_start_date_of_work"), type: -4, default: ["custom", null], require: false},
                    {key: "hr_support_employee", localid: "type_employee_hr_support_employee", name: LanguageModule.text("txt_hr_support_employee"), type: -47, default: 0, require: false},
                    {key: "direct_manager", localid: "type_employee_direct_manager", name: LanguageModule.text("txt_direct_manager"), type: -47, default: 0, require: false},
                    {key: "indirect_manager", localid: "type_employee_indirect_manager", name: LanguageModule.text("txt_indirect_manager"), type: -47, default: 0, require: false},
                    {key: "available", localid: "type_employee_available", name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 28, name: LanguageModule.text("txt_position"), type: "position", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "name", localid: "type_position_name", name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "code", localid: "type_position_code", name: LanguageModule.text("txt_code"), type: -1, default: "", require: true},
                    {key: "orgid", localid: "type_position_orgid", name: LanguageModule.text("txt_department"), type: -24, default: 0, require: true},
                    {key: "benefits", localid: "type_position_benefits", name: LanguageModule.text("txt_benefits"), type: -2, default: "", require: false},
                    {key: "report_to", localid: "type_position_report_to", name: LanguageModule.text("txt_report_to"), type: -2, default: "", require: false},
                    {key: "job_description", localid: "type_position_job_description", name: LanguageModule.text("txt_job_description"), type: -218, default: "", require: false},
                    {key: "liability_and_authority", localid: "type_position_liability_and_authority", name: LanguageModule.text("txt_liability_and_authority"), type: -218, default: "", require: false},
                    {key: "working_condition", localid: "type_position_working_condition", name: LanguageModule.text("txt_working_condition"), type: -218, default: "", require: false},
                    {key: "prefered_ability", localid: "type_position_prefered_ability", name: LanguageModule.text("txt_prefered_ability"), type: -218, default: "", require: false}
                ]
            }
        },
        {id: -32, name: LanguageModule.text("txt_image_file"), type: "image_file"},
        {id: -34, name: LanguageModule.text("txt_any_file"), type: "any_file"},
        {id: -35, name: LanguageModule.text("txt_languages"), type: 'language', notTypeOfUnion : true, type2: "enum"},
        {
            id: - 39, name: LanguageModule.text("txt_marital_status"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "single", value: "type_marital_status_single", localid: "type_marital_status_single", text: LanguageModule.text("txt_marital_status_single")},
                    {key: "married", value: "type_marital_status_married", localid: "type_marital_status_married", text: LanguageModule.text("txt_married")},
                    {key: "other", value: "type_marital_status_other", localid: "type_marital_status_other", text: LanguageModule.text("txt_other")}
                ]
            }
        },
        {
            id: - 40, name: LanguageModule.text("txt_sex"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "male", value: "type_sex_male", localid: "type_sex_male", text: LanguageModule.text("txt_male"), key: "male"},
                    {key: "female", value: "type_sex_female", localid: "type_sex_female", text: LanguageModule.text("txt_female"), key: "female"},
                ]
            }
        },
        {
            id: -41, name: LanguageModule.text("txt_email_type"), type: 'enum',
            content: {
                typeof: -1,
                details: [
                    {key: "company", value: "type_email_type_company", localid: "type_email_type_company", text: LanguageModule.text("txt_company")},
                    {key: "personal", value: "type_email_type_personal", localid: "type_email_type_personal", text: LanguageModule.text("txt_personal")}
                ]
            }
        },
        {
            id: -42, name: LanguageModule.text("txt_email"), type: "email", type2: "structure",
            content: {
                details: [
                    {key: "type", localid: "type_email_type", name: LanguageModule.text("txt_type"), type: -41, require: true},
                    {key: "address", localid: "type_email_address", name: LanguageModule.text("txt_email_address"), type: -7, default: "", require: true}
                ]
            }
        },
        {id: -43, name: LanguageModule.text("txt_reminder"), type: 'enum',
            content: {
                typeof: -1,
                details: [
                    {key: "none", localid: "type_reminder_none", text: LanguageModule.text("txt_no_reminder"), value: "type_reminder_none"},
                    {key: "_15_minutes", localid: "type_reminder_15_minutes", text: LanguageModule.text("txt_15_minutes"), value: "type_reminder_15_minutes"},
                    {key: "_30_minutes", localid: "type_reminder_30_minutes", text: LanguageModule.text("txt_30_minutes"), value: "type_reminder_30_minutes"},
                    {key: "_1_hour", localid: "type_reminder_1_hour", text: LanguageModule.text("txt_1_hour"), value: "type_reminder_1_hour"},
                    {key: "_2_hours", localid: "type_reminder_2_hours", text: LanguageModule.text("txt_2_hours"), value: "type_reminder_2_hours"},
                    {key: "_4_hours", localid: "type_reminder_4_hours", text: LanguageModule.text("txt_4_hours"), value: "type_reminder_4_hours"},
                    {key: "_8_hours", localid: "type_reminder_8_hours", text: LanguageModule.text("txt_8_hours"), value: "type_reminder_8_hours"},
                    {key: "_1_day", localid: "type_reminder_1_day", text: LanguageModule.text("txt_1_day"), value: "type_reminder_1_day"},
                    {key: "_2_days", localid: "type_reminder_2_days", text: LanguageModule.text("txt_2_days"), value: "type_reminder_2_days"},
                    {key: "_4_days", localid: "type_reminder_4_days", text: LanguageModule.text("txt_4_days"), value: "type_reminder_4_days"},
                    {key: "_8_days", localid: "type_reminder_8_days", text: LanguageModule.text("txt_8_days"), value: "type_reminder_8_days"}
                ]
            }
        },
        {id: -44, name: LanguageModule.text("txt_type_of_meeting"), type: 'enum',
            content: {
                typeof: -1,
                details: [
                    {key: "visit", localid: "type_visit", text: LanguageModule.text("txt_visit"), value: "type_visit"},
                    {key: "online", localid: "type_online", text: LanguageModule.text("txt_online"), value: "type_online"}
                ]
            }
        },
        {
            id: -45, name: LanguageModule.text("txt_task"), type: "task", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: "type_task_name", name: LanguageModule.text("txt_name"), type: -1, require: true, default: ""},
                    {key: "status", localid: "type_task_status", name: LanguageModule.text("txt_completed"), type: -6, default: false},
                    {key: "starttime", localid: "type_task_start_time", name: LanguageModule.text("txt_start"), type: -5, default: ["today", ""]},
                    {key: "endtime", localid: "type_task_expire_time", name: LanguageModule.text("txt_end"), type: -5, default: ["today", ""]},
                    {key: "reminder", localid: "type_task_reminder", name: LanguageModule.text("txt_reminder"), type: -43, default: 'type_reminder_none'},
                    {key: "assignto", localid: "type_task_assign_to", name: LanguageModule.text("txt_assign_to"), type: -47, require: true},
                    {key: "participant", localid: "type_task_participant", name: LanguageModule.text("txt_participant"), type: -48, default: []},
                    {key: "result", localid: "type_task_result", name: LanguageModule.text("txt_result"), type: -218, default: ""}
                ]
            }
        },
        {
            id: -46, name: LanguageModule.text("txt_meeting"), type: "meeting", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: "type_meeting_name", name: LanguageModule.text("txt_name"), type: -1, require: true, default: ""},
                    {key: "type", localid: "type_meeting_type", name: LanguageModule.text("txt_type"), type: -44, default: 'type_visit'},
                    {key: "location", localid: "type_meeting_location", name: LanguageModule.text("txt_meeting_location"), type: -1, require: true, default: ""},
                    {key: "status", localid: "type_meeting_status", name: LanguageModule.text("txt_completed"), type: -6, default: false},
                    {key: "starttime", localid: "type_meeting_start_time", name: LanguageModule.text("txt_start"), type: -5, default: ["today", ""]},
                    {key: "endtime", localid: "type_meeting_end_time", name: LanguageModule.text("txt_end"), type: -5, default: ["today", ""]},
                    {key: "allday", localid: "type_meeting_all_day", name: LanguageModule.text("txt_all_day"), type: -6, default: false},
                    {key: "reminder", localid: "type_meeting_reminder", name: LanguageModule.text("txt_reminder"), type: -43, default: 'type_reminder_none'},
                    {key: "assignto", localid: "type_meeting_assign_to", name: LanguageModule.text("txt_assign_to"), type: -47, require: true},
                    {key: "participant", localid: "type_meeting_participant", name: LanguageModule.text("txt_participant"), type: -48, default: []},
                    {key: "result", localid: "type_meeting_result", name: LanguageModule.text("txt_result"), type: -218, default: ""}
                ]
            }
        },
        {id: -47, name: "Chọn nhân viên", type: 'member_of_employee', type2: "enum"},
        {id: -48, name: "Chọn nhiều nhân viên", type: 'employee_list', type2: "enum_multi"},
        {
            id: -50, name: LanguageModule.text("txt_holiday"), type: "holidays", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "name", localid: "type_holiday_name", name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "timestart", localid: "type_holiday_timestart", name: LanguageModule.text("txt_start_time"), type: -4, require: true},
                    {key: "timeend", localid: "type_holiday_timeend", name: LanguageModule.text("txt_end_time"), type: -4, require: true},
                    {
                        key: "type", localid: 'type_holiday_type', name: LanguageModule.text("txt_time_off_type"), type: "union", typeOfUnion: -334, require: true,
                        detailUnion: {
                            holiday: [
                                {key: "pay_percentageid", localid: 'type_holiday_pay_percentage', name: LanguageModule.text("txt_pay_percentage"), type: -338, default: -1, require: true}
                            ],
                            compensatory_leave: []
                        }
                    },
                    {key: "shifts", localid: "type_holiday_shifts", name: LanguageModule.text("txt_shift"), type: -138, require: false},
                    {key: "available", localid: "type_holiday_available", name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: -53, name: LanguageModule.text("txt_working_form"), type: 'enum',
            content: {
                typeof: -1,
                details: [
                    {key: "full_shift", value: "type_working_form_full_shift", localid: "type_working_form_full_shift", text: LanguageModule.text("txt_full_shift")},
                    {key: "half_shift", value: "type_working_form_first_half_shift", localid: "type_working_form_first_half_shift", text: LanguageModule.text("txt_first_half_shift")},
                    {key: "half_shift", value: "type_working_form_second_half_shift", localid: "type_working_form_second_half_shift", text: LanguageModule.text("txt_second_half_shift")},
                    {key: "day_off", value: "type_working_form_day_off", localid: "type_working_form_day_off", text: LanguageModule.text("txt_off")}
                ]
            }
        },
        {
            id: -54, name: LanguageModule.text("txt_shift_general"), type: "shift_general", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "name", localid: "type_shift_name", name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "description", localid: "type_shift_description", name: LanguageModule.text("txt_description"), type: -2, default: "", require: false},
                    {key: "symbol", localid: "type_shift_symbol", name: LanguageModule.text("txt_symbol"), type: -1, default: "", require: true},
                    {key: "color", localid: "type_shift_color", name: LanguageModule.text("txt_color"), type: -261, require: false},
                    {key: "available", localid: "type_shift_available", name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -55, name: "Time", type: "time", stt: 5},
        {
            id: -56, name: LanguageModule.text("txt_worktime_checkins"), type: "worktime_checkins", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "employeeid", localid: "type_worktime_checkins_employeeid", name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "ctime", localid: "type_worktime_checkins_ctime", name: LanguageModule.text("txt_time"), type: -5, default: ["custom", null], require: true},
                    {key: "method", localid: "type_worktime_checkins_method", name: LanguageModule.text("txt_checkin_method"), type: -349, require: true},
                    {key: "checkingps", localid: "type_worktime_checkins_gps", name: LanguageModule.text("txt_checkin_gps"), type: -1},
                    {key: "machineid", localid: "type_worktime_checkins_machineid", name: LanguageModule.text("txt_worktime_machine"), type: -58, default: 0, require: true},
                    {key: "comment", localid: "type_worktime_checkins_note", name: LanguageModule.text("txt_note"), type: -2},
                    {key: "available", localid: "type_worktime_checkins_available", name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: -57, name: LanguageModule.text("txt_worktime_machine"), type: "worktime_machines", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "name", localid: "type_worktime_machines_name", name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "code", localid: "type_worktime_machines_code", name: LanguageModule.text("txt_code"), type: -1, default: "", require: true},
                    {key: "geoid", localid: "type_worktime_machines_geoid", name: LanguageModule.text("txt_geographical_position"), type: -23, require: true},
                    {key: "available", localid: "type_worktime_machines_available", name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -58, name: "Chọn máy chấm công", type: 'member_of_worktime_machines', type2: "enum"},
        {
            id: -59, name: LanguageModule.text("txt_worktime_logs"), type: "worktime_logs", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "employeeid", localid: "type_worktime_logs_employeeid", name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "shiftid", localid: "type_worktime_logs_shift", name: LanguageModule.text("txt_shift"), type: -137, require: false},
                    {key: "intime", localid: "type_worktime_logs_intime", name: LanguageModule.text("txt_in_time"), type: -5, default: ["custom", null], require: true},
                    {key: "outtime", localid: "type_worktime_logs_outtime", name: LanguageModule.text("txt_out_time"), type: -5, default: ["custom", null], require: true},
                    {key: "comment", localid: "type_worktime_logs_comment", name: LanguageModule.text("txt_note"), type: -2, default: "", require: false},
                    {key: "available", localid: "type_worktime_logs_available", name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 64, name: LanguageModule.text("txt_files_list"), type: "files"
        },
        {
            id: -66, name: LanguageModule.text("txt_asset"), type: "assets", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: "type_asset_name", name: LanguageModule.text("txt_name"), type: -1, require: true, default: ""},
                    {key: "code", localid: "type_asset_code", name: LanguageModule.text("txt_code"), type: -1, require: true, default: ""},
                    {key: "warehouseid", localid: "type_asset_warehouseid", name: LanguageModule.text("txt_warehouse"), type: -70, require: true, default: 0},
                    {key: "specification", localid: "type_asset_specification", name: LanguageModule.text("txt_specification"), type: -1, require: false, default: ""},
                    {key: "input_date", localid: "type_asset_input_date", name: LanguageModule.text("txt_input_date"), type: -4, require: true, default: ["today", ""]},
                    {key: "purchased_price", localid: "type_asset_purchased_price", name: LanguageModule.text("txt_purchased_price"), type: -3, require: false, decpre: 2},
                    {key: "expireddate", localid: "type_asset_expireddate", name: LanguageModule.text("txt_expired_date"), type: -4, require: false},
                    {key: "comment", localid: "type_asset_comment", name: LanguageModule.text("txt_note"), type: -2, require: false, default: ""},
                    {key: "attachments", localid: "type_asset_attachments", name: LanguageModule.text("txt_attachments"), type: -64}
                ]
            }
        },
        {
            id: -67, name: LanguageModule.text("txt_instruments_and_tools"), type: "instruments_and_tools", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: "type_instruments_and_tools_name", name: LanguageModule.text("txt_name"), type: -1, require: true, default: ""},
                    {key: "code", localid: "type_instruments_and_tools_code", name: LanguageModule.text("txt_code"), type: -1, require: true, default: ""},
                    {key: "warehouseid", localid: "type_instruments_and_tools_warehouseid", name: LanguageModule.text("txt_warehouse"), type: -70, require: true, default: 0},
                    {key: "categoryid", localid: "type_instruments_and_tools_asset_category", name: LanguageModule.text("txt_instruments_and_tools_category"), type: -205, require: true},
                    {key: "specification", localid: "type_instruments_and_tools_specification", name: LanguageModule.text("txt_specification"), type: -1, require: false, default: ""},
                    {key: "amount", localid: "type_instruments_and_tools_amount", name: LanguageModule.text("txt_quantity"), type: -3, require: true, default: ""},
                    {key: "unit", localid: "type_instruments_and_tools_unit", name: LanguageModule.text("txt_unit"), type: -1, require: false, default: ""},
                    {key: "input_date", localid: "type_instruments_and_tools_input_date", name: LanguageModule.text("txt_input_date"), type: -4, require: true, default: ["today", ""]},
                    {key: "purchased_price", localid: "type_instruments_and_tools_purchased_price", name: LanguageModule.text("txt_purchased_price"), type: -3, require: false, decpre: 2},
                    {key: "comment", localid: "type_instruments_and_tools_comment", name: LanguageModule.text("txt_note"), type: -2, require: false, default: ""},
                    {key: "attachments", localid: "type_instruments_and_tools_attachments", name: LanguageModule.text("txt_attachments"), type: -64}
                ]
            }
        },
        {
            id: -68, name: LanguageModule.text("txt_warehouse"), type: "warehouses", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "name", localid: "type_warehouses_name", name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "code", localid: "type_warehouses_code", name: LanguageModule.text("txt_code"), type: -1, default: "", require: true},
                    {key: "storekeepers", localid: "type_warehouses_storekeepers", name: LanguageModule.text("txt_storekeeper"), type: -48, require: true},
                    {key: "geoid", localid: "type_warehouses_geoid", name: LanguageModule.text("txt_geographical_position"), type: -23, require: true},
                    {key: "available", localid: "type_warehouses_available", name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -69, name: "Chọn tài sản", type: 'member_of_assets', type2: "enum"},
        {id: -70, name: "Chọn kho", type: 'member_of_warehouses', type2: "enum"},
        {
            id: -71, name: LanguageModule.text("txt_asset_handover_lines"), type: "asset_handover_lines", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "assetid", localid: "type_asset_handover_lines_assetid", name: LanguageModule.text("txt_asset"), type: -69, default: "", require: true},
                    {key: "status", localid: "type_asset_handover_lines_status", name: LanguageModule.text("txt_status"), type: -348, default: "good", require: true, readOnly: true},
                    {key: "comment", localid: "type_asset_handover_lines_comment", name: LanguageModule.text("txt_note"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 72, name: LanguageModule.text("txt_asset_handover_lines_array"), type: "array", notPri: true,
            content: {
                typeof: -71
            }
        },
        {
            id: -73, name: LanguageModule.text("txt_asset_handover"), type: "asset_handover", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "date_transaction", localid: "type_asset_handover_date", name: LanguageModule.text("txt_handover_date"), type: -4, default: ["today", ""], require: true},
                    {key: "employeeid", localid: "type_asset_handover_receiver", name: LanguageModule.text("txt_receiver"), type: -47, default: 0, require: true},
                    {key: "warehouseid", localid: "type_asset_handover_warehouseid", name: LanguageModule.text("txt_warehouse"), type: -70, default: 0, require: true},
                    {key: "comment", localid: "type_asset_handover_comment", name: LanguageModule.text("txt_note"), type: -2, default: "", require: false},
                    {key: "attachments", localid: "type_asset_handover_attachments", name: LanguageModule.text("txt_attachments"), type: -64},
                    {key: "details", localid: "type_asset_handover_details", name: LanguageModule.text("txt_details"), type: -72}
                ]
            }
        },
        {id: -74, name: "Chọn tài sản và công cụ dụng cụ", type: 'member_of_assets_instruments_and_tools', type2: "enum"},
        {
            id: -75, name: LanguageModule.text("txt_asset_recall_lines"), type: "asset_recall_lines", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "assetid", localid: "type_asset_recall_lines_assetid", name: LanguageModule.text("txt_asset"), type: -69, default: "", require: true},
                    {key: "status", localid: "type_asset_recall_lines_status", name: LanguageModule.text("txt_status"), type: -348, default: "good", require: true, readOnly: true},
                    {key: "comment", localid: "type_asset_recall_lines_comment", name: LanguageModule.text("txt_note"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 76, name: LanguageModule.text("txt_asset_recall_lines_array"), type: "array", notPri: true,
            content: {
                typeof: -75
            }
        },
        {
            id: -77, name: LanguageModule.text("txt_asset_recall"), type: "asset_recall", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "date_transaction", localid: "type_asset_recall_date", name: LanguageModule.text("txt_recall_date"), type: -4, default: ["today", ""], require: true},
                    {key: "employeeid", localid: "type_asset_recall_employeeid", name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "warehouseid", localid: "type_asset_recall_warehouseid", name: LanguageModule.text("txt_warehouse"), type: -70, default: 0, require: true},
                    {key: "comment", localid: "type_asset_recall_comment", name: LanguageModule.text("txt_note"), type: -2, default: "", require: false},
                    {key: "attachments", localid: "type_asset_recall_attachments", name: LanguageModule.text("txt_attachments"), type: -64},
                    {key: "details", localid: "type_asset_recall_details", name: LanguageModule.text("txt_details"), type: -76}
                ]
            }
        },
        {
            id: -78, name: LanguageModule.text("txt_config_line"), type: "config_line", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "key", localid: "type_config_line_key", name: LanguageModule.text("txt_key"), type: -1, default: "", require: true},
                    {key: "name", localid: "type_config_line_name", name: LanguageModule.text("txt_name"), type: -1, default: "", require: false},
                    {key: "shortname", localid: "type_config_line_shortname", name: LanguageModule.text("txt_shortname"), type: -1, default: "", require: false},
                    {key: "description", localid: "type_config_line_description", name: LanguageModule.text("txt_description"), type: -1, default: "", require: false},
                    {key: "number_value", localid: "type_config_line_number_value", name: LanguageModule.text("txt_number_value"), type: -3, default: "", require: false},
                    {key: "string_value", localid: "type_config_line_string_value", name: LanguageModule.text("txt_string_value"), type: -1, default: "", require: false}
                ]
            }
        },
        {
            id: - 79, name: LanguageModule.text("txt_config"), type: "array", notPri: true,
            content: {
                typeof: -78
            }
        },
        {
            id: - 80, name: LanguageModule.text("txt_allowance_policy_group"), type: "allowance_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_allowance_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_allowance_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_allowance_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -81, name: "Chọn nhóm chính sách trợ cấp", type: 'member_of_allowance_policy_groups', type2: "enum"},
        {
            id: - 82, name: LanguageModule.text("txt_allowance_policy"), type: "allowance_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_allowance_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_allowance_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "groupid", localid: 'type_allowance_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: -81, default: 0, require: true},
                    {
                        key: "allowance_type", localid: 'type_allowance_policy_allowance_type', name: LanguageModule.text("txt_allowance_type"), type: "union", typeOfUnion: -113, default: 0, require: false,
                        detailUnion: {
                            actual_expenses: [],
                            actual_expenses_with_limit: [
                                {key: "value", localid: 'type_allowance_policy_value', name: LanguageModule.text("txt_value") + " ($)", type: -118, default: '', require: true, variable_tooltip: "value"},
                            ],
                            fixed_amount: [
                                {key: "value", localid: 'type_allowance_policy_value', name: LanguageModule.text("txt_value") + " ($)", type: -118, default: '', require: true, variable_tooltip: "value"},
                            ]
                        }
                    },
                    {key: "meal_value", localid: 'type_allowance_policy_meal_value', name: LanguageModule.text("txt_meal_value") + " ($)", type: -118, default: '', require: false, variable_tooltip: "value"},
                    {key: "available", localid: 'type_allowance_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 83, name: LanguageModule.text("txt_benefit_type"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "actual_expenses", value: "actual_expenses", localid: "actual_expenses", text: LanguageModule.text("txt_actual_expenses")},
                    {key: "actual_expenses_with_limit", value: "actual_expenses_with_limit", localid: "actual_expenses_with_limit", text: LanguageModule.text("txt_actual_expenses_with_limit")},
                    {key: "fixed_amount", value: "fixed_amount", localid: "fixed_amount", text: LanguageModule.text("txt_fixed_amount")}
                ]
            }
        },
        {
            id: - 84, name: LanguageModule.text("txt_allowance_frequency"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "week", value: "week", localid: "week", text: LanguageModule.text("txt_week")},
                    {key: "month", value: "month", localid: "month", text: LanguageModule.text("txt_month")},
                    {key: "quarter", value: "quarter", localid: "quarter", text: LanguageModule.text("txt_quarter")},
                    {key: "six_months", value: "six_months", localid: "six_months", text: LanguageModule.text("txt_six_months")},
                    {key: "year", value: "year", localid: "year", text: LanguageModule.text("txt_year")},
                    {key: "one_time", value: "one_time", localid: "one_time", text: LanguageModule.text("txt_one_time")}
                ]
            }
        },
        {
            id: - 85, name: LanguageModule.text("txt_training_program_group"), type: "training_program_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_training_program_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_training_program_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_training_program_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -86, name: "Chọn nhóm chương trình đào tạo", type: 'member_of_training_program_groups', type2: "enum"},
        {
            id: - 87, name: LanguageModule.text("txt_insurance_policy"), type: "insurance_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_insurance_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_insurance_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "groupid", localid: 'type_insurance_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: -97, default: 0, require: true},
                    {key: "calculated_on", localid: 'type_insurance_policy_calculated_on', name: LanguageModule.text("txt_calculated_on"), type: -88, default: 0, require: true},
                    {key: "contributed_by_company", localid: 'type_insurance_policy_contributed_by_company', name: LanguageModule.text("txt_contributed_by_company") + " (%)", type: -3, default: '', require: false, variable_tooltip: "contributed_by_company"},
                    {key: "contributed_by_employee", localid: 'type_insurance_policy_contributed_by_employee', name: LanguageModule.text("txt_contributed_by_employee") + " (%)", type: -3, default: '', require: false, variable_tooltip: "contributed_by_employee"},
                    {key: "available", localid: 'type_insurance_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 88, name: LanguageModule.text("txt_insurance_calculation_base"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "basic", value: "basic", localid: "basic", text: LanguageModule.text("txt_basic_salary")},
                    {key: "gross", value: "gross", localid: "gross", text: LanguageModule.text("txt_gross_salary")},
                    {key: "option", value: "option", localid: "option", text: LanguageModule.text("txt_option_follow_employee")}
                ]
            }
        },
        {id: - 89, name: LanguageModule.text("txt_select_employment_contract_type"), type: "member_of_employment_contract_types", type2: "enum"},
        {id: -90, name: "Chọn nhóm chính sách nghỉ", type: 'member_of_leave_policy_groups', type2: "enum"},
        {
            id: - 91, name: LanguageModule.text("txt_maximal_day_leave_calculation"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "fixed_number_of_day_per_year", value: "fixed_number_of_day_per_year", localid: "fixed_number_of_day_per_year", text: LanguageModule.text("txt_fixed_number_of_day_per_year")},
                    {key: "monthly_incresmental", value: "monthly_incresmental", localid: "monthly_incresmental", text: LanguageModule.text("txt_monthly_incresmental")}
                ]
            }
        },
        {
            id: - 92, name: LanguageModule.text("txt_approval_workflow"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "sequence", value: "sequence", localid: "sequence", text: LanguageModule.text("txt_sequence")},
                    {key: "parallel", value: "parallel", localid: "parallel", text: LanguageModule.text("txt_parallel")},
                    {key: "one_approver", value: "one_approver", localid: "one_approver", text: LanguageModule.text("txt_one_approver")}
                ]
            }
        },
        {
            id: - 93, name: LanguageModule.text("txt_salary_payment_method"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "hourly_rate", value: "hourly_rate", localid: "hourly_rate", text: LanguageModule.text("txt_hourly_rate")},
                    {key: "daily_rate", value: "daily_rate", localid: "daily_rate", text: LanguageModule.text("txt_daily_rate")},
                    {key: "weekly_rate", value: "weekly_rate", localid: "weekly_rate", text: LanguageModule.text("txt_weekly_rate")},
                    {key: "monthly_rate", value: "monthly_rate", localid: "monthly_rate", text: LanguageModule.text("txt_monthly_rate")},
                    {key: "contractual_wages", value: "contractual_wages", localid: "contractual_wages", text: LanguageModule.text("txt_contractual_wages")},
                    {key: "piece_rate", value: "piece_rate", localid: "piece_rate", text: LanguageModule.text("txt_piece_rate")}
                ]
            }
        },
        {
            id: -94, name: LanguageModule.text("txt_leave_policy"), type: "leave_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_leave_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "symbol", localid: 'type_leave_policy_symbol', name: LanguageModule.text("txt_symbol"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_leave_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {
                        key: "groupid", localid: 'type_leave_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: "union", typeOfUnion: -90, default: 0, require: true,
                        detailUnion: {
                            "-1": [
                                {key: "leave_days_per_year", localid: 'type_leave_policy_leave_days_per_year', name: LanguageModule.text("txt_leave_days_per_year"), type: -3, default: '', require: false, decpre: 1, variable_tooltip: "leave_days_per_year"},
                                {key: "maximum_leave_days_per_year", localid: 'type_leave_policy_maximal_day_calculation', name: LanguageModule.text("txt_maximal_day_calculation"), type: -91, default: 0, require: true, variable_tooltip: "maximal_day_calculation"},
                                {key: "number_of_working_months_to_increase_one_day_leave", localid: 'type_leave_policy_number_of_working_months_to_increase_one_day_leave', name: LanguageModule.text("txt_number_of_working_months_to_increase_one_day_leave"), type: -3, default: '', require: true, decpre: 1, variable_tooltip: "number_of_working_months_to_increase_one_day_leave"},
                                {key: "maximum_leave_days_per_year", localid: 'type_leave_policy_maximum_leave_days_per_year', name: LanguageModule.text("txt_maximum_leave_days_per_year"), type: -3, default: '', require: false, decpre: 1},
                                {key: "carried_forward_leave", localid: 'type_leave_policy_carried_forward_leave', name: LanguageModule.text("txt_carried_forward_leave"), type: -3, default: '', require: false, decpre: 1, variable_tooltip: "carried_forward_leave"},
                                {key: "accumulated_leave_expired_before", localid: 'type_leave_policy_accumulated_leave_expired_before', name: LanguageModule.text("txt_accumulated_leave_expired_before"), type: -201, default: null, require: true, variable_tooltip: "accumulated_leave_expired_before"},
                            ]
                        }
                    },
                    {key: "proposal_submitted_before", localid: 'type_leave_policy_proposal_submitted_before', name: LanguageModule.text("txt_proposal_submitted_before"), type: -3, default: -10, require: false, decpre: 1},
                    {key: "work_paid", localid: 'type_leave_policy_work_paid', name: LanguageModule.text("txt_work_paid"), type: -6, default: false, require: false},
                    {key: "pay_percentage", localid: 'type_leave_policy_pay_percentage', name: LanguageModule.text("txt_pay_percentage"), type: -338, default: false, require: false},
                    {key: "available", localid: 'type_leave_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 95, name: LanguageModule.text("txt_leave_policy_group"), type: "leave_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_leave_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_leave_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "symbol", localid: 'type_leave_policy_group_symbol', name: LanguageModule.text("txt_symbol"), type: -1, default: '', require: true},
                    {key: "available", localid: 'type_leave_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 96, name: LanguageModule.text("txt_insurance_policy_group"), type: "insurance_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_insurance_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_insurance_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_insurance_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -97, name: "Chọn nhóm chính sách bảo hiểm", type: 'member_of_insurance_policy_groups', type2: "enum"},
        {
            id: - 98, name: LanguageModule.text("txt_benefit_policy_group"), type: "benefit_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_benefit_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_benefit_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_benefit_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -99, name: "Chọn nhóm chính sách phúc lợi", type: 'member_of_benefit_policy_groups', type2: "enum"},
        {
            id: - 100, name: LanguageModule.text("txt_benefit_policy"), type: "benefit_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_benefit_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_benefit_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "groupid", localid: 'type_benefit_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: -99, default: 0, require: true},
                    {key: "taxable_income", localid: 'type_benefit_policy_taxable_income', name: LanguageModule.text("txt_taxable_income"), type: -6, default: '', require: false},
                    {key: "income_subject_to_insurance_contribution", localid: 'type_benefit_policy_income_subject_to_insurance_contribution', name: LanguageModule.text("txt_income_subject_to_insurance_contribution"), type: -6, default: '', require: false},
                    {
                        key: "benefit_type", localid: 'type_benefit_policy_benefit_type', name: LanguageModule.text("txt_benefit_type"), type: "union", typeOfUnion: -83, default: 0, require: true,
                        detailUnion: {
                            actual_expenses: [],
                            actual_expenses_with_limit: [
                                {key: "value", localid: 'type_benefit_policy_value', name: LanguageModule.text("txt_value") + " ($)", type: -118, default: '', require: true},
                                {key: "frequency", localid: 'type_benefit_policy_frequency', name: LanguageModule.text("txt_frequency"), type: -114, default: 0, require: true},
                            ],
                            fixed_amount: [
                                {key: "value", localid: 'type_benefit_policy_value', name: LanguageModule.text("txt_value") + " ($)", type: -118, default: '', require: true},
                                {key: "frequency", localid: 'type_benefit_policy_frequency', name: LanguageModule.text("txt_frequency"), type: -114, default: 0, require: true},
                            ]
                        }
                    },
                    {key: "available", localid: 'type_benefit_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 101, name: LanguageModule.text("txt_bonus_policy_group"), type: "bonus_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_bonus_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_bonus_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_bonus_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -102, name: "Chọn nhóm chính sách thưởng", type: 'member_of_bonus_policy_groups', type2: "enum"},
        {
            id: - 103, name: LanguageModule.text("txt_punishment_policy_group"), type: "punishment_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_punishment_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_punishment_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_punishment_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -104, name: "Chọn nhóm chính sách thưởng", type: 'member_of_punishment_policy_groups', type2: "enum"},
        {
            id: - 105, name: LanguageModule.text("txt_tax_policy_group"), type: "tax_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_tax_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_tax_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_tax_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -106, name: "Chọn nhóm chính sách thuế", type: 'member_of_tax_policy_groups', type2: "enum"},
        {
            id: - 107, name: LanguageModule.text("txt_advance_payment_policy_group"), type: "advance_payment_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_advance_payment_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_advance_payment_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_advance_payment_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -108, name: "Chọn nhóm chính sách tạm ứng", type: 'member_of_advance_payment_policy_groups', type2: "enum"},
        {
            id: - 109, name: LanguageModule.text("txt_late_early_checkin_policy_group"), type: "late_early_checkin_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_late_early_checkin_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_late_early_checkin_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_late_early_checkin_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -110, name: "Chọn nhóm chính sách DMVS", type: 'member_of_late_early_checkin_policy_groups', type2: "enum"},
        {
            id: - 111, name: LanguageModule.text("txt_bonus_policy"), type: "bonus_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_bonus_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_bonus_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "groupid", localid: 'type_bonus_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: -102, default: 0, require: true},
                    {key: "taxable_income", localid: 'type_bonus_policy_taxable_income', name: LanguageModule.text("txt_taxable_income"), type: -6, default: '', require: false},
                    {key: "income_subject_to_insurance_contribution", localid: 'type_bonus_policy_income_subject_to_insurance_contribution', name: LanguageModule.text("txt_income_subject_to_insurance_contribution"), type: -6, default: '', require: false},
                    {key: "available", localid: 'type_bonus_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 112, name: LanguageModule.text("txt_punishment_policy"), type: "punishment_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_punishment_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_punishment_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "groupid", localid: 'type_punishment_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: -104, default: 0, require: true},
                    {key: "tax_relief", localid: 'type_punishment_policy_tax_relief', name: LanguageModule.text("txt_tax_relief"), type: -6, default: false, require: false},
                    {key: "insurance_contribution_relief", localid: 'type_punishment_policy_insurance_contribution_relief', name: LanguageModule.text("txt_insurance_contribution_relief"), type: -6, default: '', require: false},
                    {key: "available", localid: 'type_punishment_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 113, name: LanguageModule.text("txt_allowance_type"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "actual_expenses", value: "actual_expenses", localid: "actual_expenses", text: LanguageModule.text("txt_actual_expenses")},
                    {key: "actual_expenses_with_limit", value: "actual_expenses_with_limit", localid: "actual_expenses_with_limit", text: LanguageModule.text("txt_actual_expenses_with_limit")},
                    {key: "fixed_amount", value: "fixed_amount", localid: "fixed_amount", text: LanguageModule.text("txt_fixed_amount")}
                ]
            }
        },
        {
            id: - 114, name: LanguageModule.text("txt_benefit_frequency"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "week", value: "week", localid: "week", text: LanguageModule.text("txt_week")},
                    {key: "month", value: "month", localid: "month", text: LanguageModule.text("txt_month")},
                    {key: "quarter", value: "quarter", localid: "quarter", text: LanguageModule.text("txt_quarter")},
                    {key: "six_months", value: "six_months", localid: "six_months", text: LanguageModule.text("txt_six_months")},
                    {key: "year", value: "year", localid: "year", text: LanguageModule.text("txt_year")},
                    {key: "one_time", value: "one_time", localid: "one_time", text: LanguageModule.text("txt_one_time")}
                ]
            }
        },
        {
            id: - 115, name: LanguageModule.text("txt_advance_payment_policy"), type: "advance_payment_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_advance_payment_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_advance_payment_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "groupid", localid: 'type_advance_payment_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: -108, default: 0, require: true},
                    {key: "advance_payment_on", localid: 'type_advance_payment_policy_advance_payment_on', name: LanguageModule.text("txt_advance_payment_on"), type: "union", typeOfUnion: -117, default: 0, require: true, variable_tooltip: "advance_payment_on",
                        detailUnion: {
                            basic_salary: [{key: "maximum_percentage", localid: 'type_advance_payment_policy_maximum_percentage', name: LanguageModule.text("txt_maximum_percentage") + " (%)", type: -3, default: "", variable_tooltip: "maximum_percentage"}],
                            gross_salary: [{key: "maximum_percentage", localid: 'type_advance_payment_policy_maximum_percentage', name: LanguageModule.text("txt_maximum_percentage") + " (%)", type: -3, default: "", variable_tooltip: "maximum_percentage"}],
                            fixed_amount: [{key: "maximum_amount", localid: 'type_advance_payment_policy_maximum_amount', name: LanguageModule.text("txt_maximum_amount") + " ($)", type: -118, default: "", variable_tooltip: "maximum_amount"}]
                        }
                    },
                    {key: "calculated_on", localid: 'type_advance_payment_policy_calculated_on', name: LanguageModule.text("txt_calculated_on"), type: -116, default: 0, require: true, variable_tooltip: "calculated_on"},
                    {key: "salary_advance", localid: 'type_advance_payment_policy_salary_advance', name: LanguageModule.text("txt_salary_advance"), type: -6, default: false},
                    {key: "available", localid: 'type_advance_payment_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 116, name: LanguageModule.text("txt_advance_payment_frequency"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "one_request", value: "one_request", localid: "one_request", text: LanguageModule.text("txt_one_request")},
                    {key: "week", value: "week", localid: "week", text: LanguageModule.text("txt_week")},
                    {key: "month", value: "month", localid: "month", text: LanguageModule.text("txt_month")},
                    {key: "year", value: "year", localid: "year", text: LanguageModule.text("txt_year")},
                ]
            }
        },
        {
            id: - 117, name: LanguageModule.text("txt_advance_payment_calculation_base"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "basic_salary", value: "basic_salary", localid: "basic_salary", text: LanguageModule.text("txt_basic_salary")},
                    {key: "gross_salary", value: "gross_salary", localid: "gross_salary", text: LanguageModule.text("txt_gross_salary")},
                    {key: "fixed_amount", value: "fixed_amount", localid: "fixed_amount", text: LanguageModule.text("txt_fixed_amount")}
                ]
            }
        },
        {id: -118, name: LanguageModule.text("txt_currency"), type: "currency"},
        {
            id: - 119, name: LanguageModule.text("txt_late_early_checkin_policy"), type: "late_early_checkin_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_late_early_checkin_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_late_early_checkin_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "groupid", localid: 'type_late_early_checkin_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: -110, default: 0, require: true},
                    {key: "late", localid: 'type_late_early_checkin_policy_late', name: LanguageModule.text("txt_late_checkin_minute"), type: -3, default: "", require: true, variable_tooltip: "late"},
                    {key: "early", localid: 'type_late_early_checkin_policy_early', name: LanguageModule.text("txt_early_checkout_minute"), type: -3, default: 0, require: true, variable_tooltip: "early"},
                    {key: "proposal_submitted_before", localid: 'type_late_early_checkin_policy_proposal_submitted_before', name: LanguageModule.text("txt_proposal_submitted_before"), type: -3, default: 0, require: false},
                    {key: "available", localid: 'type_late_early_checkin_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 120, name: LanguageModule.text("txt_tax_rate_lines"), type: "tax_rate_lines", type2: "structure",
            content: {
                details: [
                    {key: "amount", localid: 'tax_rate_lines_amount', name: LanguageModule.text("txt_amount") + " ($)", type: -118, default: '', require: true},
                    {key: "rate", localid: 'tax_rate_lines_rate', name: LanguageModule.text("txt_rate") + " (%)", type: -3, default: '', require: false}
                ]
            }
        },
        {
            id: - 121, name: LanguageModule.text("txt_tax_rate"), type: "array", notPri: true,
            content: {
                typeof: -120
            }
        },
        {
            id: - 122, name: LanguageModule.text("txt_tax_policy"), type: "tax_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_tax_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_tax_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "groupid", localid: 'type_tax_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: -106, default: 0, require: true},
                    {
                        key: "tax_type", localid: 'type_tax_policy_tax_type', name: LanguageModule.text("txt_tax_type"), type: "union", typeOfUnion: -123, default: 0, require: true,
                        detailUnion: {
                            progressive_tax: [{key: "tax_rate_progressive_tax", localid: 'type_tax_policy_tax_rate_progressive_tax', name: LanguageModule.text("txt_tax_rate"), type: -121, default: '', require: true}],
                            fixed_percentage: [{key: "tax_rate_fixed_percentage", localid: 'type_tax_policy_tax_rate_fixed_percentage', name: LanguageModule.text("txt_tax_rate") + " (%)", type: -3, default: '', require: true}]
                        }
                    },
                    {key: "available", localid: 'type_tax_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 123, name: LanguageModule.text("txt_tax_type"), type: "enum", notExtend: true,
            content: {
                typeof: -1,
                details: [
                    {key: "progressive_tax", value: "progressive_tax", localid: "progressive_tax", text: LanguageModule.text("txt_progressive_tax")},
                    {key: "fixed_percentage", value: "fixed_percentage", localid: "fixed_percentage", text: LanguageModule.text("txt_fixed_percentage")}
                ]
            }
        },
        {
            id: - 126, name: LanguageModule.text("txt_trade_union_policy_group"), type: "trade_union_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_trade_union_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_trade_union_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_trade_union_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -127, name: "Chọn nhóm chính sách công đoàn", type: 'member_of_trade_union_policy_groups', type2: "enum"},
        {
            id: - 128, name: LanguageModule.text("txt_other_liability_policy_group"), type: "other_liability_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_other_liability_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_other_liability_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_other_liability_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -129, name: "Chọn nhóm chính sách trách nhiệm khác", type: 'member_of_other_liability_policy_groups', type2: "enum"},
        {
            id: - 130, name: LanguageModule.text("txt_other_liability_calculation_base"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "basic", value: "basic", localid: "basic", text: LanguageModule.text("txt_basic_salary")},
                    {key: "gross", value: "gross", localid: "gross", text: LanguageModule.text("txt_gross_salary")},
                    {key: "option", value: "option", localid: "option", text: LanguageModule.text("txt_option_follow_employee")}
                ]
            }
        },
        {
            id: - 131, name: LanguageModule.text("txt_other_liability_frequency"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "week", value: "week", localid: "week", text: LanguageModule.text("txt_week")},
                    {key: "month", value: "month", localid: "month", text: LanguageModule.text("txt_month")},
                    {key: "quarter", value: "quarter", localid: "quarter", text: LanguageModule.text("txt_quarter")},
                    {key: "six_months", value: "six_months", localid: "six_months", text: LanguageModule.text("txt_six_months")},
                    {key: "year", value: "year", localid: "year", text: LanguageModule.text("txt_year")},
                    {key: "one_time", value: "one_time", localid: "one_time", text: LanguageModule.text("txt_one_time")}
                ]
            }
        },
        {
            id: - 132, name: LanguageModule.text("txt_trade_union_fee_type"), type: "enum", notExtend: true,
            content: {
                typeof: -1,
                details: [
                    {key: "fixed_amount", value: "fixed_amount", localid: "fixed_amount", text: LanguageModule.text("txt_fixed_amount")},
                    {key: "percentage", value: "percentage", localid: "percentage", text: LanguageModule.text("txt_percentage")}
                ]
            }
        },
        {
            id: - 134, name: LanguageModule.text("txt_trade_union_policy"), type: "trade_union_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_trade_union_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_trade_union_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "groupid", localid: 'type_trade_union_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: -127, default: 0, require: true},
                    {key: "tax_relief", localid: 'type_trade_union_policy_tax_relief', name: LanguageModule.text("txt_tax_relief"), type: -6, default: false, require: false},
                    {key: "insurance_contribution_relief", localid: 'type_trade_union_policy_insurance_contribution_relief', name: LanguageModule.text("txt_insurance_contribution_relief"), type: -6, default: false},
                    {
                        key: "fee_type", localid: 'type_trade_union_policy_fee_type', name: LanguageModule.text("txt_fee_type"), type: "union", typeOfUnion: -132, default: 0, require: true,
                        detailUnion: {
                            percentage: [{key: "rate", localid: 'type_trade_union_policy_rate', name: LanguageModule.text("txt_rate") + " (%)", type: -3, default: "", require: true, variable_tooltip: "rate"}],
                            fixed_amount: [{key: "amount", localid: 'type_trade_union_policy_amount', name: LanguageModule.text("txt_amount") + " ($)", type: -118, default: '', require: true, variable_tooltip: "amount"}]
                        }
                    },
                    {key: "limit_on_maximum_trade_union_fee", localid: 'type_trade_union_policy_limit_on_maximum_trade_union_fee', name: LanguageModule.text("txt_limit_on_maximum_trade_union_fee"), type: -6, default: false, require: false},
                    {key: "maximum_trade_union_fee", localid: 'type_trade_union_policy_maximum_trade_union_fee', name: LanguageModule.text("txt_maximum_trade_union_fee") + " ($)", type: -118, default: ""},
                    {key: "available", localid: 'type_trade_union_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 135, name: LanguageModule.text("txt_other_liability_policy"), type: "other_liability_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_other_liability_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_other_liability_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "groupid", localid: 'type_other_liability_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: -129, default: 0, require: true},
                    {key: "tax_relief", localid: 'type_other_liability_policy_tax_relief', name: LanguageModule.text("txt_tax_relief"), type: -6, default: false, require: false},
                    {key: "insurance_contribution_relief", localid: 'type_other_liability_policy_insurance_contribution_relief', name: LanguageModule.text("txt_insurance_contribution_relief"), type: -6, default: false},
                    {
                        key: "other_liability_type", localid: 'type_other_liability_policy_other_liability_type', name: LanguageModule.text("txt_other_liability_type"), type: "union", typeOfUnion: -199, default: 0, require: true,
                        detailUnion: {
                            actual_expenses: [],
                            actual_expenses_with_limit: [
                                {key: "value", localid: 'type_other_liability_policy_value', name: LanguageModule.text("txt_value") + " ($)", type: -118, default: '', require: true, variable_tooltip: "value"},
                                {key: "frequency", localid: 'type_other_liability_policy_frequency', name: LanguageModule.text("txt_frequency"), type: -131, default: 0, require: true},
                            ],
                            fixed_amount: [
                                {key: "value", localid: 'type_other_liability_policy_value', name: LanguageModule.text("txt_value") + " ($)", type: -118, default: '', require: true, variable_tooltip: "value"},
                                {key: "frequency", localid: 'type_other_liability_policy_frequency', name: LanguageModule.text("txt_frequency"), type: -131, default: 0, require: true},
                            ]
                        }
                    },
                    {key: "available", localid: 'type_other_liability_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -136, name: LanguageModule.text("txt_hour_period"), type: "hour_period"},
        {id: -137, name: LanguageModule.text("txt_select_shift"), type: "member_of_shifts", type2: "enum"},
        {id: -138, name: LanguageModule.text("txt_select_shifts"), type: "members_of_shifts", type2: "enum_multi"},
        {id: -139, name: "Chọn chính sách bảo hiểm", type: 'member_of_insurance_policies', type2: "enum"},
        {id: -140, name: "Chọn chính sách thuế", type: 'member_of_tax_policies', type2: "enum"},
        {id: -141, name: "Chọn chính sách công đoàn", type: 'member_of_trade_union_policies', type2: "enum"},
        {id: -142, name: "Chọn chính sách nghỉ ngày", type: 'member_of_leave_policies', type2: "enum"},
        {id: -143, name: "Chọn chính sách phúc lợi", type: 'member_of_benefit_policies', type2: "enum"},
        {id: -144, name: "Chọn chính sách trợ cấp", type: 'member_of_allowance_policies', type2: "enum"},
        {id: -145, name: "Chọn chính sách thưởng", type: 'member_of_bonus_policies', type2: "enum"},
        {id: -146, name: "Chọn chính sách phạt", type: 'member_of_punishment_policies', type2: "enum"},
        {id: -147, name: "Chọn chính sách tạm ứng", type: 'member_of_advance_payment_policies', type2: "enum"},
        {id: -148, name: "Chọn chính sách đi muộn, về sớm", type: 'member_of_late_early_checkin_policies', type2: "enum"},
        {id: -149, name: "Chọn chính sách lương", type: 'member_of_salary_policies', type2: "enum"},
        {id: -150, name: "Chọn chính sách trách nhiệm khác", type: 'member_of_other_liability_policies', type2: "enum"},
        {
            id: - 151, name: LanguageModule.text("txt_insurance_policies_applied_to_employee"), type: "insurance_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_insurance_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_insurance_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -139, default: 0, require: true},
                    {key: "description", localid: 'type_insurance_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false},
                    {
                        key: "calculated_on", localid: 'type_insurance_policies_applied_to_employee_calculated_on', name: LanguageModule.text("txt_calculated_on"), type: "union", typeOfUnion: -88, default: 0, require: true,
                        detailUnion: {
                            option: [{key: "value", localid: 'type_insurance_policies_applied_to_employee_value', name: LanguageModule.text("txt_value") + " ($)", type: -118, default: "", require: true}]
                        }
                    }
                ]
            }
        },
        {
            id: - 152, name: LanguageModule.text("txt_employment_contract_type"), type: "employment_contract_types", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_employment_contract_type_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_employment_contract_type_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_employment_contract_type_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 153, name: LanguageModule.text("txt_social_network"), type: "social_network", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_social_network_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "account", localid: 'type_social_network_account', name: LanguageModule.text("txt_account"), type: -1, default: '', require: false}
                ]
            }
        },
        {
            id: - 154, name: LanguageModule.text("txt_education_history"), type: "education_history", type2: "structure",
            content: {
                details: [
                    {key: "major", localid: 'type_education_history_major', name: LanguageModule.text("txt_major"), type: -1, default: '', require: true},
                    {key: "school", localid: 'type_education_history_school', name: LanguageModule.text("txt_school"), type: -1, default: '', require: false},
                    {key: "degree", localid: 'type_education_history_degree', name: LanguageModule.text("txt_degree"), type: -157, default: 0, require: false},
                    {key: "from_month", localid: 'type_education_history_from_month', name: LanguageModule.text("txt_from_month"), type: -335, require: false},
                    {key: "to_month", localid: 'type_education_history_to_month', name: LanguageModule.text("txt_to_month"), type: -335, require: false},
                    {key: "comment", localid: 'type_education_history_comment', name: LanguageModule.text("txt_note"), type: -2, require: false},
                    {key: "top_level", localid: 'type_education_history_top_level', name: LanguageModule.text("txt_top_level"), type: -6, require: false},
                    {key: "attachments", localid: 'type_education_history_attachments', name: LanguageModule.text("txt_attachments"), type: -64}
                ]
            }
        },
        {
            id: - 155, name: LanguageModule.text("txt_skill"), type: "skill", type2: "structure",
            content: {
                details: [
                    {key: "skill", localid: 'type_skill_skill', name: LanguageModule.text("txt_skill"), type: -1, default: '', require: true},
                    {key: "level", localid: 'type_skill_level', name: LanguageModule.text("txt_level"), type: -156, default: 0, require: false},
                    {key: "comment", localid: 'type_skill_comment', name: LanguageModule.text("txt_note"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 156, name: LanguageModule.text("txt_skill_level"), type: "enum", notExtend: true,
            content: {
                typeof: -1,
                details: [
                    {key: '1', value: '1', localid: "1", text: 1},
                    {key: '2', value: '2', localid: "2", text: 2},
                    {key: '3', value: '3', localid: "3", text: 3},
                    {key: '4', value: '4', localid: "4", text: 4},
                    {key: '5', value: '5', localid: "5", text: 5}
                ]
            }
        },
        {
            id: - 157, name: LanguageModule.text("txt_degree"), type: "enum", notExtend: true,
            content: {
                typeof: -1,
                details: [
                    {key: "midle_school", value: "midle_school", localid: "midle_school", text: LanguageModule.text("txt_midle_school")},
                    {key: "high_school", value: "high_school", localid: "high_school", text: LanguageModule.text("txt_high_school")},
                    {key: "intermediate", value: "intermediate", localid: "intermediate", text: LanguageModule.text("txt_intermediate")},
                    {key: "college", value: "college", localid: "college", text: LanguageModule.text("txt_college")},
                    {key: "university", value: "university", localid: "university", text: LanguageModule.text("txt_university")},
                    {key: "master", value: "master", localid: "master", text: LanguageModule.text("txt_master")},
                    {key: "doctor", value: "doctor", localid: "doctor", text: LanguageModule.text("txt_doctor")}
                ]
            }
        },
        {
            id: - 158, name: LanguageModule.text("txt_work_history"), type: "work_history", type2: "structure",
            content: {
                details: [
                    {key: "position", localid: 'type_work_history_position', name: LanguageModule.text("txt_position"), type: -1, default: '', require: true},
                    {key: "organization", localid: 'type_work_history_organization', name: LanguageModule.text("txt_organization"), type: -1, default: '', require: false},
                    {key: "from_month", localid: 'type_work_history_from_month', name: LanguageModule.text("txt_from_month"), type: -335, require: false},
                    {key: "to_month", localid: 'type_work_history_to_month', name: LanguageModule.text("txt_to_month"), type: -335, require: false},
                    {key: "comment", localid: 'type_work_history_comment', name: LanguageModule.text("txt_note"), type: -2, require: false}
                ]
            }
        },
        {
            id: - 159, name: LanguageModule.text("txt_bank_account"), type: "bank_account", type2: "structure",
            content: {
                details: [
                    {key: "account_number", localid: 'type_bank_account_number', name: LanguageModule.text("txt_account_number"), type: -1, default: '', require: true},
                    {key: "account_holder_name", localid: 'type_bank_account_holder_name', name: LanguageModule.text("txt_account_holder_name"), type: -1, default: "", require: false},
                    {key: "bank_name", localid: 'type_bank_account_bank_name', name: LanguageModule.text("txt_bank_name"), type: -1, default: "", require: false},
                    {key: "agency", localid: 'type_bank_account_agency', name: LanguageModule.text("txt_agency"), type: -1, default: "", require: false}
                ]
            }
        },
        {
            id: - 160, name: LanguageModule.text("txt_nation"), type: "nations", type2: "structure",
            content: {
                details: [
                    {key: "shortname", localid: 'type_nation_short_name', name: LanguageModule.text("txt_shortname"), type: -1, default: '', require: true},
                    {key: "fullname", localid: 'type_nation_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "phonecode", localid: 'type_nation_phonecode', name: LanguageModule.text("txt_phone_code"), type: -1, default: "", require: false},
                    {key: "available", localid: 'type_nation_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 161, name: LanguageModule.text("txt_city"), type: "cities", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_city_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "nationid", localid: 'type_city_nationid', name: LanguageModule.text("txt_nation"), type: -14, default: 0, require: true},
                    {key: "code", localid: 'type_city_code', name: LanguageModule.text("txt_code"), type: -1, default: '', require: true},
                    {key: "postalcode", localid: 'type_city_postalcode', name: LanguageModule.text("txt_postal_code"), type: -1, default: '', require: false},
                    {key: "phonecode", localid: 'type_city_phonecode', name: LanguageModule.text("txt_phone_code"), type: -1, default: "", require: false},
                    {key: "available", localid: 'type_city_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 162, name: LanguageModule.text("txt_ethnic"), type: "ethnics", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_ethnic_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "code", localid: 'type_ethnic_code', name: LanguageModule.text("txt_code"), type: -1, default: '', require: true},
                    {key: "available", localid: 'type_ethnic_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 163, name: LanguageModule.text("txt_religion"), type: "religions", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_religion_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "code", localid: 'type_religion_code', name: LanguageModule.text("txt_code"), type: -1, default: '', require: true},
                    {key: "available", localid: 'type_religion_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 164, name: LanguageModule.text("txt_bonus_policies_applied_to_employee"), type: "bonus_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_bonus_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_bonus_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -145, default: 0, require: true},
                    {key: "description", localid: 'type_bonus_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 165, name: LanguageModule.text("txt_punishment_policies_applied_to_employee"), type: "punishment_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_punishment_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_punishment_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -146, default: 0, require: true},
                    {key: "description", localid: 'type_punishment_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 166, name: LanguageModule.text("txt_benefit_policies_applied_to_employee"), type: "benefit_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_benefit_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_benefit_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -143, default: 0, require: true},
                    {key: "description", localid: 'type_benefit_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 167, name: LanguageModule.text("txt_allowance_policies_applied_to_employee"), type: "allowance_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_allowance_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_allowance_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -144, default: 0, require: true},
                    {key: "description", localid: 'type_allowance_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 168, name: LanguageModule.text("txt_tax_policies_applied_to_employee"), type: "tax_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_tax_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_tax_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -140, default: 0, require: true},
                    {key: "description", localid: 'type_tax_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false},
                    {key: "tax_type", localid: 'type_tax_policies_applied_to_employee_tax_type', name: LanguageModule.text("txt_tax_type"), type: -123, default: 0, require: false}
                ]
            }
        },
        {
            id: - 169, name: LanguageModule.text("txt_trade_union_policies_applied_to_employee"), type: "trade_union_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_trade_union_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_trade_union_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -141, default: 0, require: true},
                    {key: "description", localid: 'type_trade_union_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 170, name: LanguageModule.text("txt_other_liability_policies_applied_to_employee"), type: "other_liability_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_other_liability_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_other_liability_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -150, default: 0, require: true},
                    {key: "description", localid: 'type_other_liability_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false},
                    {key: "tax_relief", localid: 'type_other_liability_policies_applied_to_employee_tax_relief', name: LanguageModule.text("txt_tax_relief"), type: -6, default: false, require: false},
                    {key: "insurance_contribution_relief", localid: 'type_other_liability_policies_applied_to_employee_insurance_contribution_relief', name: LanguageModule.text("txt_insurance_contribution_relief"), type: -6, default: false},
                    {key: "other_liability_type", localid: 'type_other_liability_policies_applied_to_employee_other_liability_type', name: LanguageModule.text("txt_other_liability_type"), type: -199, default: 0, require: false},
                    {key: "frequency", localid: 'type_other_liability_policies_applied_to_employee_frequency', name: LanguageModule.text("txt_frequency"), type: -131, default: 0, require: true}
                ]
            }
        },
        {
            id: - 171, name: LanguageModule.text("txt_leave_policies_applied_to_employee"), type: "leave_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_leave_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_leave_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -142, default: 0, require: true},
                    {key: "description", localid: 'type_leave_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 172, name: LanguageModule.text("txt_late_early_checkin_policies_applied_to_employee"), type: "late_early_checkin_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_late_early_checkin_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_late_early_checkin_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -148, default: 0, require: true},
                    {key: "description", localid: 'type_late_early_checkin_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 173, name: LanguageModule.text("txt_advance_payment_policies_applied_to_employee"), type: "advance_payment_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_advance_payment_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_advance_payment_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -147, default: 0, require: true},
                    {key: "description", localid: 'type_advance_payment_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 174, name: LanguageModule.text("txt_salary_decisions_applied_to_employee"), type: "salary_decisions_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_salary_decisions_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "note", localid: 'type_salary_decisions_applied_to_employee_note', name: LanguageModule.text("txt_note"), type: -2, default: "", require: false},
                    {key: "salary_grade", localid: 'type_salary_decisions_applied_to_employee_salary_grade', name: LanguageModule.text("txt_salary_grade"), type: -1, default: "", require: false},
                    {key: "salary_coefficient", localid: 'type_salary_decisions_applied_to_employee_salary_coefficient', name: LanguageModule.text("txt_salary_coefficient"), type: -3, default: 0, decpre: 2, require: false},
                    {key: "basic_salary_amount", localid: 'type_salary_decisions_applied_to_employee_basic_salary_amount', name: LanguageModule.text("txt_basic_salary") + " ($)", type: -118, default: 0, require: false},
                    {key: "gross_salary_amount", localid: 'type_salary_decisions_applied_to_employee_gross_salary_amount', name: LanguageModule.text("txt_gross_salary") + " ($)", type: -118, default: 0, require: false},
                    {key: "calculated_on", localid: 'type_salary_decisions_applied_to_employee_calculated_on', name: LanguageModule.text("txt_calculated_on"), type: -181, default: 0, require: true},
                    {key: "effective_date", localid: 'type_salary_decisions_applied_to_employee_effective_date', name: LanguageModule.text("txt_effective_date"), type: -4, default: ["today", ""], require: true},
                    {key: "reference_number", localid: 'type_salary_decisions_applied_to_employee_reference_number', name: LanguageModule.text("txt_reference_number"), type: -1, default: "", require: false},
                    {key: "decision_date", localid: 'type_salary_decisions_applied_to_employee_decision_date', name: LanguageModule.text("txt_decision_date"), type: -4, default: ["today", ""], require: true},
                    {key: "salary_review_period", localid: 'type_salary_decisions_applied_to_employee_salary_review_period', name: LanguageModule.text("txt_salary_review_period"), type: -3, default: 0},
                    {key: "attachments", localid: "type_salary_decisions_applied_to_employee_attachments", name: LanguageModule.text("txt_attachments"), type: -64},
                    {key: "available", localid: 'type_salary_decisions_applied_to_employee_available', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 175, name: LanguageModule.text("txt_salary_policy_applied_to_employee"), type: "salary_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_salary_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "position", localid: 'type_salary_policies_applied_to_employee_position', name: LanguageModule.text("txt_position"), type: -1, default: "", require: false},
                    {key: "policyid", localid: 'type_salary_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -149, default: 0, require: true},
                    {key: "description", localid: 'type_salary_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 176, name: LanguageModule.text("txt_employment_contract"), type: "employment_contracts", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_employee_employment_contract_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "contract_number", localid: 'type_employee_employment_contract_number', name: LanguageModule.text("txt_employment_contract_number"), type: -1, default: "", require: true},
                    {key: "signing_date", localid: 'type_employee_employment_contract_signing_date', name: LanguageModule.text("txt_employment_contract_signing_date"), type: -4, default: ["today", ""], require: true},
                    {key: "contractid", localid: 'type_employee_employment_contract_contractid', name: LanguageModule.text("txt_employment_contract_type"), type: -89, default: 0, require: true},
                    {key: "description", localid: 'type_employee_employment_contract_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false},
                    {key: "effective_date_from", localid: 'type_employee_employment_contract_effective_date_from', name: LanguageModule.text("txt_effective_date_from"), type: -4, default: ["today", ""], require: true},
                    {key: "effective_date_to", localid: 'type_employee_employment_contract_effective_date_to', name: LanguageModule.text("txt_effective_date_to"), type: -4, default: ["today", ""], require: false},
                    {key: "attachments", localid: 'type_employee_employment_contract_attachments', name: LanguageModule.text("txt_attachments"), type: -64, default: [], require: false},
                    {key: "available", localid: 'type_employee_employment_contract_available', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 177, name: LanguageModule.text("txt_bonus_list"), type: "bonus_list", type2: "structure",
            content: {
                details: [
                    {key: "cycleid", localid: 'type_bonus_list_cycleid', name: LanguageModule.text("txt_payroll_cycle"), type: -266, default: 0, require: true},
                    {key: "policyid", localid: 'type_bonus_list_policyid', name: LanguageModule.text("txt_policy"), type: -145, default: 0, require: true},
                    {key: "payroll_date_month", localid: 'type_bonus_list_payroll_date_month', name: LanguageModule.text("txt_payroll_date"), type: -267, require: false},
                    {key: "payroll_date_week", localid: 'type_bonus_list_payroll_date_week', name: LanguageModule.text("txt_payroll_date"), type: -268, require: false},
                    {key: "name", localid: 'type_bonus_list_name', name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "reference_number", localid: 'type_bonus_list_reference_number', name: LanguageModule.text("txt_reference_number"), type: -1, default: "", require: true},
                    {key: "reference_date", localid: 'type_bonus_list_reference_date', name: LanguageModule.text("txt_reference_date"), type: -4, default: ["today", ""], require: true}
                ]
            }
        },
        {
            id: -179, name: LanguageModule.text("txt_people"), type: "people", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "fullname", localid: "type_people_fullname", name: LanguageModule.text("txt_fullname"), type: -1, require: true},
                    {key: "dayofbirth", localid: "type_people_dayofbirth", name: LanguageModule.text("txt_day_of_birth"), type: -4, default: ["custom", null], require: true},
                    {key: "sex", localid: "type_people_sex", name: LanguageModule.text("txt_sex"), type: -40, default: 0, require: false},
                    {key: "marital_status", localid: "type_people_marital_status", name: LanguageModule.text("txt_marital_status"), type: -39, default: 0, require: false},
                    {key: "nationalidno", localid: "type_people_nationalidno", name: LanguageModule.text("txt_nation_id_number"), type: -1, default: "", require: true},
                    {key: "nationalidno_date", localid: "type_people_nationalidno_date", name: LanguageModule.text("txt_date_of_issue"), type: -4, default: ["custom", null], require: false},
                    {key: "nationalidno_place", localid: "type_people_nationalidno_place", name: LanguageModule.text("txt_place_of_issue"), type: -1, default: "", require: false},
                    {key: "nationality", localid: "type_people_nationality", name: LanguageModule.text("txt_nationality"), type: -14, default: 0, require: true},
                    {key: "religion", localid: "type_people_religion", name: LanguageModule.text("txt_religion"), type: -22, default: 0, require: false},
                    {key: "ethnic", localid: "type_people_ethnic", name: LanguageModule.text("txt_ethnic"), type: -16, default: 0, require: false},
                    {key: "permanent_address", localid: "type_people_permanent_address", name: LanguageModule.text("txt_permanent_address"), type: -1, require: false},
                    {key: "permanent_nation_city", localid: "type_people_permanent_nation_city", name: LanguageModule.text("txt_permanent_nation_city"), type: -207, default: 0, require: false},
                    {key: "temporary_address", localid: "type_people_temporary_address", name: LanguageModule.text("txt_temporary_address"), type: -1, require: false},
                    {key: "temporary_nation_city", localid: "type_people_temporary_nation_city", name: LanguageModule.text("txt_temporary_nation_city"), type: -207, default: 0, require: false},
                    {key: "personal_tax_code", localid: "type_people_personal_tax_code", name: LanguageModule.text("txt_personal_tax_code"), type: -1, default: "", require: false},
                    {key: "personal_income_tax_relief", localid: "type_people_personal_income_tax_relief", name: LanguageModule.text("txt_personal_income_tax_relief"), type: -6, default: false, require: false},
                    {key: "social_security_number", localid: "type_people_social_security_number", name: LanguageModule.text("txt_social_security_number"), type: -1, default: "", require: false},
                    {key: "social_insurance_date", localid: "type_people_social_insurance_date", name: LanguageModule.text("txt_social_insurance_date"), type: -4, default: ["custom", null], require: false},
                    {key: "place_of_social_insurance", localid: "type_people_place_of_social_insurance", name: LanguageModule.text("txt_place_of_social_insurance"), type: -1, default: "", require: false},
                    {key: "emergency_contact", localid: "type_people_emergency_contact", name: LanguageModule.text("txt_emergency_contact"), type: -2, default: "", require: false},
                    {key: "reference", localid: "type_people_reference", name: LanguageModule.text("txt_reference"), type: -2, default: "", require: false},
                    {key: "start_date", localid: "type_people_start_date", name: LanguageModule.text("txt_start_date"), type: -4, default: ["custom", null], require: false},
                    {key: "official_date", localid: "type_people_official_date", name: LanguageModule.text("txt_official_date"), type: -4, default: ["custom", null], require: false},
                    {key: "available", localid: "type_people_available", name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 180, name: LanguageModule.text("txt_training_participant"), type: "training_participant", type2: "structure",
            content: {
                details: [
                    {key: "peopleid", localid: "type_training_program_participant", name: LanguageModule.text("txt_training_participant"), type: -47, require: true}
                ]
            }
        },
        {
            id: - 181, name: LanguageModule.text("txt_calculated_on_salary_decision"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "week", value: "week", localid: "week", text: LanguageModule.text("txt_week")},
                    {key: "month", value: "month", localid: "month", text: LanguageModule.text("txt_month")},
                    {key: "year", value: "year", localid: "year", text: LanguageModule.text("txt_year")}
                ]
            }
        },
        {
            id: -182, name: LanguageModule.text("txt_request_advance_payment"), type: "request_advance_payment", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "employeeid", localid: "type_request_advance_payment_employeeid", name: LanguageModule.text("txt_employee"), type: -47, require: true},
                    {key: "policyid", localid: "type_request_advance_payment_policyid", name: LanguageModule.text("txt_policy"), type: -147, require: true, default: 0},
                    {key: "time_hours_needed_for_approval", localid: "type_request_advance_payment_time_hours_needed_for_approval", name: LanguageModule.text("txt_time_hours_needed_for_approval"), type: -3, require: false},
                    {key: "date", localid: "type_request_advance_payment_date", name: LanguageModule.text("txt_date"), type: -4, require: true, default: ["today", ""]},
                    {key: "amount", localid: "type_request_advance_payment_amount", name: LanguageModule.text("txt_amount"), type: -118, require: true, default: 0},
                    {key: "reason", localid: "type_request_advance_payment_reason", name: LanguageModule.text("txt_reason"), type: -2, require: false, default: ""},
                    {key: "attachments", localid: "type_request_advance_payment_attachments", name: LanguageModule.text("txt_attachments"), type: -64, require: false, default: []},
                    {key: "approvers", localid: "type_request_advance_payment_approvers", name: LanguageModule.text("txt_approvers"), type: -1, require: false}
                ]
            }
        },
        {
            id: -188, name: LanguageModule.text("txt_request_leave"), type: "request_leave", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "employeeid", localid: "type_request_leave_employeeid", name: LanguageModule.text("txt_employee"), type: -47, require: true},
                    {key: "policyid", localid: "type_request_leave_policyid", name: LanguageModule.text("txt_policy"), type: -142, require: true, default: 0},
                    {key: "remain_day_off", localid: "type_request_leave_remain_day_off", name: LanguageModule.text("txt_remain_day_off"), type: -3},
                    {key: "fromdate", localid: "type_request_leave_fromdate", name: LanguageModule.text("txt_date_from"), type: -4, require: true},
                    {key: "todate", localid: "type_request_leave_todate", name: LanguageModule.text("txt_date_to"), type: -4, require: true},
                    {key: "days_portion", localid: "type_request_leave_days_portion", name: LanguageModule.text("txt_day_portion"), type: -192, require: true},
                    {key: "time_period", localid: "type_request_leave_time_period", name: LanguageModule.text("txt_time_period"), type: -136, require: false},
                    {key: "number_of_day_off", localid: "type_request_leave_number_of_day_off", name: LanguageModule.text("txt_number_of_day_off"), type: -3, require: true, default: ["today", ""]},
                    {key: "reason", localid: "type_request_leave_reason", name: LanguageModule.text("txt_reason"), type: -2, require: false, default: ""},
                    {key: "substitute", localid: "type_request_leave_substitute", name: LanguageModule.text("txt_substitute"), type: -47, require: false},
                    {key: "approvers", localid: "type_request_leave_approvers", name: LanguageModule.text("txt_approvers"), type: -1, require: false}
                ]
            }
        },
        {id: -189, name: LanguageModule.text("txt_select_department_employee"), type: "select_department_employee", type2: "enum"},
        {
            id: -190, name: LanguageModule.text("txt_shift_schedule"), type: "shift_schedule", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "department_employee", localid: "type_shift_schedule_department_employee", name: LanguageModule.text("txt_employee"), type: -189, require: true},
                    {key: "shiftid", localid: "type_shift_schedule_shift", name: LanguageModule.text("txt_shift"), type: -137, require: true},
                    {key: "date_from", localid: "type_shift_schedule_date_from", name: LanguageModule.text("txt_date_from"), type: -4, require: true, default: ["today", ""]},
                    {key: "date_to", localid: "type_shift_schedule_date_to", name: LanguageModule.text("txt_date_to"), type: -4, require: true, default: ["today", ""]},
                    {key: "substitute", localid: "type_shift_schedule_substitute", name: LanguageModule.text("txt_substitute"), type: -6},
                    {key: "substitute_employee", localid: "type_shift_schedule_substitute_employee", name: LanguageModule.text("txt_employee"), type: -47, require: false}
                ]
            }
        },
        {
            id: - 191, name: LanguageModule.text("txt_punishment_list"), type: "punishment_list", type2: "structure",
            content: {
                details: [
                    {key: "cycleid", localid: 'type_punishment_list_cycleid', name: LanguageModule.text("txt_payroll_cycle"), type: -266, default: 0, require: true},
                    {key: "policyid", localid: 'type_punishment_list_policyid', name: LanguageModule.text("txt_policy"), type: -146, default: 0, require: true},
                    {key: "payroll_date_month", localid: 'type_punishment_list_payroll_date_month', name: LanguageModule.text("txt_payroll_date"), type: -267, require: false},
                    {key: "payroll_date_week", localid: 'type_punishment_list_payroll_date_week', name: LanguageModule.text("txt_payroll_date"), type: -268, require: false},
                    {key: "name", localid: 'type_punishment_list_name', name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "reference_number", localid: 'type_punishment_list_reference_number', name: LanguageModule.text("txt_reference_number"), type: -1, default: "", require: true},
                    {key: "reference_date", localid: 'type_punishment_list_reference_date', name: LanguageModule.text("txt_reference_date"), type: -4, default: ["today", ""], require: true}
                ]
            }
        },
        {
            id: -192, name: LanguageModule.text("txt_day_portion_leave"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "full_workday", value: "full_workday", localid: "full_workday", text: LanguageModule.text("txt_full_workday")},
                    {key: "half_workday", value: "half_workday", localid: "half_workday", text: LanguageModule.text("txt_half_workday")},
                    {key: "one_fourth_workday", value: "one_fourth_workday", localid: "one_fourth_workday", text: LanguageModule.text("txt_one_fourth_workday")},
                    {key: "one_eighth_workday", value: "one_eighth_workday", localid: "one_eighth_workday", text: LanguageModule.text("txt_one_eighth_workday")},
                    {key: "one_sixteenth_workday", value: "one_sixteenth_workday", localid: "one_sixteenth_workday", text: LanguageModule.text("txt_one_sixteenth_workday")}
                ]
            }
        },
        {
            id: -193, name: LanguageModule.text("txt_day_off_lines"), type: "day_off_lines", type2: "structure",
            content: {
                details: [
                    {key: "policyid", localid: 'type_day_off_lines_date', name: LanguageModule.text("txt_date"), type: -4, default: ["today", ""], require: true},
                    {key: "policyid", localid: 'type_day_off_lines_days_portion', name: LanguageModule.text("txt_day_portion"), type: -192, default: 0, require: true},
                    {key: "policyid", localid: 'type_day_off_lines_time_period', name: LanguageModule.text("txt_checkintime"), type: -136, require: false}
                ]
            }
        },
        {
            id: - 194, name: LanguageModule.text("txt_days_off"), type: "array", notPri: true,
            content: {
                typeof: -193
            }
        },
        {
            id: - 195, name: LanguageModule.text("txt_request_late_early_checkin"), type: "request_late_early_checkin", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_request_late_early_checkin_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_request_late_early_checkin_policyid', name: LanguageModule.text("txt_policy"), type: -148, default: 0, require: true},
                    {key: "late", localid: 'type_request_late_early_checkin_late', name: LanguageModule.text("txt_late_checkin_minute"), type: -3, default: 0, require: true},
                    {key: "early", localid: 'type_request_late_early_checkin_early', name: LanguageModule.text("txt_early_checkout_minute"), type: -3, default: 0, require: false},
                    {key: "fromdate", localid: 'type_request_late_early_checkin_from', name: LanguageModule.text("txt_date_from"), type: -4, require: true},
                    {key: "todate", localid: 'type_request_late_early_checkin_to', name: LanguageModule.text("txt_date_to"), type: -4, require: true},
                    {key: "reason", localid: 'type_request_late_early_checkin_reason', name: LanguageModule.text("txt_reason"), type: -2, default: "", require: false},
                    {key: "approvers", localid: 'type_request_late_early_checkin_approvers', name: LanguageModule.text("txt_approvers"), type: -1, default: "", require: false}
                ]
            }
        },
        {
            id: - 196, name: LanguageModule.text("txt_allowance_list"), type: "allowance_list", type2: "structure",
            content: {
                details: [
                    {key: "cycleid", localid: 'type_allowance_list_cycleid', name: LanguageModule.text("txt_payroll_cycle"), type: -266, default: 0, require: true},
                    {key: "policyid", localid: 'type_allowance_list_policyid', name: LanguageModule.text("txt_policy"), type: -144, default: 0, require: true},
                    {key: "payroll_date_month", localid: 'type_allowance_list_payroll_date_month', name: LanguageModule.text("txt_payroll_date"), type: -267, require: false},
                    {key: "payroll_date_week", localid: 'type_allowance_list_payroll_date_week', name: LanguageModule.text("txt_payroll_date"), type: -268, require: false},
                    {key: "name", localid: 'type_allowance_list_name', name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "reference_number", localid: 'type_allowance_list_reference_number', name: LanguageModule.text("txt_reference_number"), type: -1, default: "", require: true},
                    {key: "reference_date", localid: 'type_allowance_list_reference_date', name: LanguageModule.text("txt_reference_date"), type: -4, default: ["today", ""], require: true}
                ]
            }
        },
        {
            id: - 197, name: LanguageModule.text("txt_benefit_list"), type: "benefit_list", type2: "structure",
            content: {
                details: [
                    {key: "cycleid", localid: 'type_benefit_list_cycleid', name: LanguageModule.text("txt_payroll_cycle"), type: -266, default: 0, require: true},
                    {key: "policyid", localid: 'type_benefit_list_policyid', name: LanguageModule.text("txt_policy"), type: -143, default: 0, require: true},
                    {key: "payroll_date_month", localid: 'type_benefit_list_payroll_date_month', name: LanguageModule.text("txt_payroll_date"), type: -267, require: false},
                    {key: "payroll_date_week", localid: 'type_benefit_list_payroll_date_week', name: LanguageModule.text("txt_payroll_date"), type: -268, require: false},
                    {key: "name", localid: 'type_benefit_list_name', name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "reference_number", localid: 'type_benefit_list_reference_number', name: LanguageModule.text("txt_reference_number"), type: -1, default: "", require: true},
                    {key: "reference_date", localid: 'type_benefit_list_reference_date', name: LanguageModule.text("txt_reference_date"), type: -4, default: ["today", ""], require: true}
                ]
            }
        },
        {
            id: - 198, name: LanguageModule.text("txt_other_liability_list"), type: "other_liability_list", type2: "structure",
            content: {
                details: [
                    {key: "cycleid", localid: 'type_other_liability_list_cycleid', name: LanguageModule.text("txt_payroll_cycle"), type: -266, default: 0, require: true},
                    {key: "policyid", localid: 'type_other_liability_list_policyid', name: LanguageModule.text("txt_policy"), type: -150, default: 0, require: true},
                    {key: "payroll_date_month", localid: 'type_other_liability_list_payroll_date_month', name: LanguageModule.text("txt_payroll_date"), type: -267, require: false},
                    {key: "payroll_date_week", localid: 'type_other_liability_list_payroll_date_week', name: LanguageModule.text("txt_payroll_date"), type: -268, require: false},
                    {key: "name", localid: 'type_other_liability_list_name', name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "reference_number", localid: 'type_other_liability_list_reference_number', name: LanguageModule.text("txt_reference_number"), type: -1, default: "", require: true},
                    {key: "reference_date", localid: 'type_other_liability_list_reference_date', name: LanguageModule.text("txt_reference_date"), type: -4, default: ["today", ""], require: true}
                ]
            }
        },
        {
            id: - 199, name: LanguageModule.text("txt_other_liability_type"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "actual_expenses", value: "actual_expenses", localid: "actual_expenses", text: LanguageModule.text("txt_actual_expenses")},
                    {key: "actual_expenses_with_limit", value: "actual_expenses_with_limit", localid: "actual_expenses_with_limit", text: LanguageModule.text("txt_actual_expenses_with_limit")},
                    {key: "fixed_amount", value: "fixed_amount", localid: "fixed_amount", text: LanguageModule.text("txt_fixed_amount")}
                ]
            }
        },
        {
            id: - 200, name: LanguageModule.text("txt_salary_adjustment_list"), type: "salary_adjustment_list", type2: "structure",
            content: {
                details: [
                    {key: "cycleid", localid: 'type_salary_adjustment_list_cycleid', name: LanguageModule.text("txt_payroll_cycle"), type: -266, default: 0, require: true},
                    {key: "payroll_date_month", localid: 'type_salary_adjustment_list_payroll_date_month', name: LanguageModule.text("txt_payroll_date"), type: -267, require: false},
                    {key: "payroll_date_week", localid: 'type_salary_adjustment_list_payroll_date_week', name: LanguageModule.text("txt_payroll_date"), type: -268, require: false},
                    {key: "name", localid: 'type_salary_adjustment_list_name', name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "reference_number", localid: 'type_salary_adjustment_list_reference_number', name: LanguageModule.text("txt_reference_number"), type: -1, default: "", require: true},
                    {key: "reference_date", localid: 'type_salary_adjustment_list_reference_date', name: LanguageModule.text("txt_reference_date"), type: -4, default: ["today", ""], require: true}
                ]
            }
        },
        {
            id: - 201, name: LanguageModule.text("txt_date_month"), type: "datemonth"
        },
        {
            id: - 202, name: LanguageModule.text("txt_asset_category"), type: "asset_category", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_asset_category_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "code", localid: 'type_asset_category_code', name: LanguageModule.text("txt_code"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_asset_category_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "typeid", localid: 'type_asset_category_typeid', name: LanguageModule.text("txt_datatypes"), type: -252, default: 0, require: false},
                    {key: "input_formid", localid: 'type_asset_category_input_formid', name: LanguageModule.text("txt_input_form"), type: -253, default: 0, require: false},
                    {key: "output_formid", localid: 'type_asset_category_output_formid', name: LanguageModule.text("txt_output_form"), type: -254, default: 0, require: false},
                    {key: "available", localid: 'type_asset_category_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -203, name: "Chọn nhóm tài sản", type: 'member_of_asset_category', type2: "enum"},
        {
            id: - 204, name: LanguageModule.text("txt_instruments_and_tools_category"), type: "instruments_and_tools_category", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_instruments_and_tools_category_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "code", localid: 'type_instruments_and_tools_category_code', name: LanguageModule.text("txt_code"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_instruments_and_tools_category_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_instruments_and_tools_category_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -205, name: "Chọn nhóm nhóm công cụ dụng cụ", type: 'member_of_instruments_and_tools_category', type2: "enum"},
        {
            id: - 206, name: LanguageModule.text("txt_projects"), type: "projects", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_projects_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "name", localid: 'type_projects_shortname', name: LanguageModule.text("txt_shortname"), type: -1, default: '', require: true},
                    {key: "geoid", localid: 'type_projects_geoid', name: LanguageModule.text("txt_geographical_position"), type: -210, require: true},
                    {key: "timestart", localid: 'type_projects_timestart', name: LanguageModule.text("txt_time_start"), type: -4, default: null, require: true},
                    {key: "timeend", localid: 'type_projects_timeend', name: LanguageModule.text("txt_time_end"), type: -4, default: null, require: true},
                    {key: "comment", localid: 'type_projects_comment', name: LanguageModule.text("txt_note"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_projects_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: - 207, name: LanguageModule.text("txt_nation_city"), type: "nation_city"},
        {id: - 208, name: LanguageModule.text("txt_choose_project"), type: "member_of_projects", type2: "enum"},
        {
            id: - 209, name: LanguageModule.text("txt_project_applied_to_employee"), type: "project_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_project_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "projectid", localid: 'type_project_applied_to_employee_projectid', name: LanguageModule.text("txt_projects"), type: -208, default: 0, require: true},
                    {key: "timestart", localid: 'type_project_applied_to_employee_timestart', name: LanguageModule.text("txt_effective_date"), type: -4, default: ["today", ""], require: true},
                    {key: "timeend", localid: 'type_project_applied_to_employee_timeend', name: LanguageModule.text("txt_attachments"), type: -4, default: ["today", ""], require: false},
                    {key: "available", localid: 'type_project_applied_to_employee_available', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -210, name: LanguageModule.text("txt_select_locations"), type: "members_of_locations", type2: "enum_multi"},
        {
            id: - 211, name: LanguageModule.text("txt_document_type"), type: "document_types", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_document_type_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_document_type_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_document_type_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -212, name: LanguageModule.text("txt_select_document_type"), type: 'member_of_document_types', type2: "enum"},
        {
            id: - 213, name: LanguageModule.text("txt_document_group"), type: "document_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_document_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "parentid", localid: 'type_document_group_parentid', name: LanguageModule.text("txt_parent_group"), type: -214, default: 0, require: false},
                    {key: "description", localid: 'type_document_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_document_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: - 214, name: LanguageModule.text("txt_select_document_group"), type: 'member_of_document_groups', type2: "enum"},
        {id: - 215, name: LanguageModule.text("txt_select_company"), type: 'member_of_orgs', type2: "enum"},
        {
            id: - 216, name: LanguageModule.text("txt_document_template"), type: "document_templates", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_document_template_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "tag", localid: 'type_document_template_tag', name: LanguageModule.text("txt_tag"), type: -1, default: "", require: false},
                    {key: "summary_content", localid: 'type_document_template_summary_content', name: LanguageModule.text("txt_summary_content"), type: -2, default: "", require: false},
                    {key: "available", localid: 'type_document_template_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false},
                    {key: "detail_content", localid: 'type_document_template_detail_content', name: LanguageModule.text("txt_detail_content"), type: -218, default: "", require: false}
                ]
            }
        },
        {id: - 217, name: LanguageModule.text("txt_select_folder"), type: 'member_of_document_folders', type2: "enum"},
        {id: - 218, name: LanguageModule.text("txt_html"), type: 'html'},
        {
            id: - 219, name: LanguageModule.text("txt_documents"), type: "documents", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_document_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "number", localid: 'type_document_number', name: "Số", type: -1, default: '', require: true},
                    {key: "issued_date", localid: 'type_document_issued_date', name: LanguageModule.text("txt_issued_date"), type: -4, default: ["custom", null], require: true},
                    {key: "effective_date", localid: 'type_document_effective_date', name: LanguageModule.text("txt_effective_date"), type: -4, default: ["custom", null], require: false},
                    {key: "expired_date", localid: 'type_document_expired_date', name: LanguageModule.text("txt_expired_date"), type: -4, default: ["custom", null], require: false},
                    {key: "tag", localid: 'type_document_tag', name: LanguageModule.text("txt_tag"), type: -1, default: "", require: false},
                    {key: "summary_content", localid: 'type_document_summary_content', name: LanguageModule.text("txt_summary_content"), type: -2, default: "", require: true},
                    {key: "attachments", localid: 'type_document_attachments', name: LanguageModule.text("txt_attachments"), type: -64, default: [], require: false},
                    {key: "available", localid: 'type_document_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false},
                    {key: "detail_content", localid: 'type_document_detail_content', name: LanguageModule.text("txt_detail_content"), type: -218, default: "", require: false}
                ]
            }
        },
        {id: - 220, name: LanguageModule.text("txt_variable_input"), type: 'variable_input'},
        {id: - 221, name: LanguageModule.text("txt_variable_textarea"), type: 'variable_textarea'},
        {
            id: - 222, name: LanguageModule.text("txt_template_groups"), type: "template_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_template_groups_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    // {localid: 'type_template_groups_typeid', name: LanguageModule.text("txt_datatypes"), type: -3, default: '', require: true},
                    {key: "comment", localid: 'type_template_groups_comment', name: LanguageModule.text("txt_note"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_template_groups_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: - 223, name: LanguageModule.text("txt_select_template_group"), type: 'member_of_template_groups', type2: "enum"},
        {
            id: - 224, name: LanguageModule.text("txt_task_template"), type: "task_templates", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_task_template_name', name: LanguageModule.text("txt_template_name"), type: -1, default: '', require: true, disabled: true},
                    // {key: "groupid", localid: 'type_task_template_groupid', name: LanguageModule.text("txt_template_groups"), type: -223, default: '', require: false, disabled: true},
                    {key: "language", localid: 'type_task_template_language', name: LanguageModule.text("txt_language"), type: -35, default: '', require: true, disabled: true},
                    {key: "comment", localid: 'type_task_template_comment', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_task_template_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: true, disabled: true},
                    {key: "task_name", localid: "type_task_template_task_name", name: LanguageModule.text("txt_task_name"), type: -220, require: true, default: ""},
                    {key: "task_status", localid: "type_task_template_task_status", name: LanguageModule.text("txt_completed"), type: -6, default: false, require: true},
                    {key: "task_expire_time", localid: "type_task_template_task_expire_time", name: LanguageModule.text("txt_expire_time"), type: -220, default: "", require: true},
                    {key: "task_reminder", localid: "type_task_template_task_reminder", name: LanguageModule.text("txt_reminder"), type: -43, default: 'type_reminder_none', require: true},
                    {key: "task_assign_to", localid: "type_task_template_task_assign_to", name: LanguageModule.text("txt_assign_to"), type: -220, default: "", require: true},
                    {key: "task_participant", localid: "type_task_template_task_participant", name: LanguageModule.text("txt_participant"), type: -220, default: "", require: false},
                    {key: "task_result", localid: "type_task_template_task_result", name: LanguageModule.text("txt_result"), type: -221, default: ""}
                ]
            }
        },
        {
            id: - 225, name: LanguageModule.text("txt_meeting_template"), type: "meeting_templates", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_meeting_template_name', name: LanguageModule.text("txt_template_name"), type: -1, default: '', require: true, disabled: true},
                    // {key: "groupid", localid: 'type_meeting_template_groupid', name: LanguageModule.text("txt_template_groups"), type: -223, default: '', require: false, disabled: true},
                    {key: "language", localid: 'type_meeting_template_language', name: LanguageModule.text("txt_language"), type: -35, default: '', require: true, disabled: true},
                    {key: "comment", localid: 'type_meeting_template_comment', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_meeting_template_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: true, disabled: true},
                    {key: "meeting_name", localid: "type_meeting_template_meeting_name", name: LanguageModule.text("txt_meeting_name"), type: -220, require: true, default: ""},
                    {key: "meeting_type", localid: "type_meeting_template_meeting_type", name: LanguageModule.text("txt_type"), type: -44, default: 'type_visit', require: true},
                    {key: "meeting_location", localid: "type_meeting_template_meeting_location", name: LanguageModule.text("txt_meeting_location"), type: -220, require: true, default: ""},
                    {key: "meeting_status", localid: "type_meeting_template_meeting_status", name: LanguageModule.text("txt_completed"), type: -6, default: false, require: true},
                    {key: "meeting_start_time", localid: "type_meeting_template_meeting_start_time", name: LanguageModule.text("txt_start"), type: -220, default: "", require: true},
                    {key: "meeting_end_time", localid: "type_meeting_template_meeting_end_time", name: LanguageModule.text("txt_end"), type: -220, default: "", require: true},
                    {key: "meeting_all_day", localid: "type_meeting_template_meeting_all_day", name: LanguageModule.text("txt_all_day"), type: -6, default: false, require: true},
                    {key: "meeting_reminder", localid: "type_meeting_template_meeting_reminder", name: LanguageModule.text("txt_reminder"), type: -43, default: 'type_reminder_none', require: true},
                    {key: "meeting_assign_to", localid: "type_meeting_template_meeting_assign_to", name: LanguageModule.text("txt_assign_to"), type: -220, default: "", require: true},
                    {key: "meeting_participant", localid: "type_meeting_template_meeting_participant", name: LanguageModule.text("txt_participant"), type: -220, default: "", require: false},
                    {key: "meeting_result", localid: "type_meeting_template_meeting_result", name: LanguageModule.text("txt_result"), type: -221, default: ""}
                ]
            }
        },
        {
            id: - 226, name: LanguageModule.text("txt_email_template"), type: "email_templates", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_email_template_name', name: LanguageModule.text("txt_template_name"), type: -1, default: '', require: true, disabled: true},
                    // {key: "groupid", localid: 'type_email_template_groupid', name: LanguageModule.text("txt_template_groups"), type: -223, default: '', require: false, disabled: true},
                    {key: "language", localid: 'type_email_template_language', name: LanguageModule.text("txt_language"), type: -35, default: '', require: true, disabled: true},
                    {key: "comment", localid: 'type_email_template_comment', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_email_template_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: true, disabled: true},
                    {key: "receiver", localid: "type_email_template_receiver", name: LanguageModule.text("txt_receiver"), type: -220, require: true, default: ""},
                    {key: "carbon_copy", localid: "type_email_template_carbon_copy", name: LanguageModule.text("txt_carbon_copy"), type: -220, default: "", require: false},
                    {key: "blind_carbon_copy", localid: "type_email_template_blind_carbon_copy", name: LanguageModule.text("txt_blind_carbon_copy"), type: -220, default: "", require: false},
                    {key: "subject", localid: "type_email_template_subject", name: LanguageModule.text("txt_subject"), type: -1, default: "", require: true},
                    {key: "email_content", localid: "type_email_template_content", name: LanguageModule.text("txt_content"), type: -221, default: "", require: true}
                ]
            }
        },
        {
            id: - 227, name: LanguageModule.text("txt_onboarding"), type: "onboarding", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_onboarding_employee_id', name: LanguageModule.text("txt_employee_name"), type: -47, default: '', require: true},
                    {key: "code", localid: 'type_onboarding_employee_code', name: LanguageModule.text("txt_employee_code"), type: -1, default: '', require: true, disabled: true},
                    {key: "status", localid: 'type_onboarding_status', name: LanguageModule.text("txt_status"), type: -284, default: 'onboarding_onloading', require: true},
                    {key: "start_date", localid: 'type_onboarding_employee_start_date', name: LanguageModule.text("txt_probation_start_date"), type: -4, default: ["custom", null], disabled: true},
                    {key: "official_date", localid: 'type_onboarding_employee_official_date', name: LanguageModule.text("txt_official_start_date_of_work"), type: -4, default: ["custom", null], disabled: true},
                    {key: "welcome_templateid", localid: 'type_onboarding_welcome_templateid', name: LanguageModule.text("txt_welcome_template"), type: -235, require: true},
                    {key: "comment", localid: 'type_onboarding_comment', name: LanguageModule.text("txt_note"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_onboarding_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: true}
                ]
            }
        },
        {
            id: - 228, name: LanguageModule.text("txt_offboarding"), type: "offboarding", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_offboarding_employee_id', name: LanguageModule.text("txt_employee_name"), type: -47, default: '', require: true},
                    {key: "status", localid: 'type_offboarding_status', name: LanguageModule.text("txt_status"), type: -285, default: 'offboarding_proposal', require: true},
                    {key: "code", localid: 'type_offboarding_employee_code', name: LanguageModule.text("txt_employee_code"), type: -1, default: '', disabled: true},
                    {key: "username", localid: 'type_offboarding_user', name: LanguageModule.text("txt_user"), type: -8, disabled: true},
                    {key: "direct_manager", localid: 'type_offboarding_direct_manager', name: LanguageModule.text("txt_direct_manager"), type: -47, default: ["custom", null], disabled: true},
                    {key: "indirect_manager", localid: 'type_offboarding_indirect_manager', name: LanguageModule.text("txt_indirect_manager"), type: -47, disabled: true},
                    {key: "hr_support_employee", localid: 'type_offboarding_hr_support_employee', name: LanguageModule.text("txt_hr_support_employee"), type: -47, disabled: true},
                    {key: "application_recipients", localid: 'type_offboarding_application_recipients', name: LanguageModule.text("txt_application_recipients"), type: -48, require: true},
                    {key: "expected_day_off", localid: 'type_offboarding_expected_day_off', name: LanguageModule.text("txt_expected_day_off"), type: -4, require: true},
                    {key: "handover_recipients", localid: 'type_offboarding_handover_recipients', name: LanguageModule.text("txt_handover_recipients"), type: -48, require: true},
                    {key: "letter", localid: 'type_offboarding_resignation_letter', name: LanguageModule.text("txt_resignation_letter"), type: -218, default: '', require: false},
                    {key: "available", localid: 'type_offboarding_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: true}
                ]
            }
        },
        {
            id: - 229, name: LanguageModule.text("txt_geographical_position"), type: "geographical_positions", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_geographical_position_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "location", localid: 'type_geographical_position_location', name: LanguageModule.text("txt_location"), type: -12, default: '', require: true},
                    {key: "nation_city", localid: 'type_geographical_position_nation_city', name: LanguageModule.text("txt_nationcity"), type: -207, default: '', require: true},
                    {key: "address", localid: 'type_geographical_position_address', name: LanguageModule.text("txt_address"), type: -1, default: '', require: false},
                    {key: "phone", localid: 'type_geographical_position_phone', name: LanguageModule.text("txt_phone"), type: -10, default: '', require: false},
                    {key: "post_code", localid: 'type_geographical_position_post_code', name: LanguageModule.text("txt_postal_code"), type: -1, default: '', require: false},
                    {key: "comment", localid: 'type_geographical_position_comment', name: LanguageModule.text("txt_note"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_geographical_position_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: -230, name: LanguageModule.text("txt_instruments_and_tools_handover_lines"), type: "instruments_and_tools_handover_lines", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "assetid", localid: "type_instruments_and_tools_handover_lines_assetid", name: LanguageModule.text("txt_instruments_and_tools"), type: -233, default: "", require: true},
                    {key: "unit", localid: "type_instruments_and_tools_handover_lines_unit", name: LanguageModule.text("txt_unit"), type: -1, default: "", require: true, readOnly: true},
                    {key: "inventory", localid: "type_instruments_and_tools_handover_lines_inventory", name: LanguageModule.text("txt_inventory"), type: -3, default: "", require: true, readOnly: true},
                    {key: "amount", localid: "type_instruments_and_tools_handover_lines_amount", name: LanguageModule.text("txt_quantity"), type: -3, default: "", require: true},
                    {key: "comment", localid: "type_instruments_and_tools_handover_lines_comment", name: LanguageModule.text("txt_note"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 231, name: LanguageModule.text("txt_instruments_and_tools_handover_lines_array"), type: "array", notPri: true,
            content: {
                typeof: -230
            }
        },
        {
            id: -232, name: LanguageModule.text("txt_instruments_and_tools_handover"), type: "instruments_and_tools_handover", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "date_transaction", localid: "type_instruments_and_tools_handover_date", name: LanguageModule.text("txt_handover_date"), type: -4, default: ["today", ""], require: true},
                    {key: "employeeid", localid: "type_instruments_and_tools_handover_receiver", name: LanguageModule.text("txt_receiver"), type: -47, default: 0, require: true},
                    {key: "warehouseid", localid: "type_instruments_and_tools_handover_warehouseid", name: LanguageModule.text("txt_warehouse"), type: -70, default: 0, require: true},
                    {key: "comment", localid: "type_instruments_and_tools_handover_comment", name: LanguageModule.text("txt_note"), type: -2, default: "", require: false},
                    {key: "attachments", localid: "type_instruments_and_tools_handover_attachments", name: LanguageModule.text("txt_attachments"), type: -64},
                    {key: "details", localid: "type_instruments_and_tools_handover_details", name: LanguageModule.text("txt_details"), type: -231}
                ]
            }
        },
        {id: -233, name: "Chọn công cụ dụng cụ", type: 'member_of_instruments_and_tools', type2: "enum"},
        {
            id: - 234, name: LanguageModule.text("txt_document_property"), type: "document_properties", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_document_property_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_document_property_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_document_property_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -235, name: LanguageModule.text("txt_select_welcome_template"), type: 'member_of_welcome_templates', type2: "enum"},
        {
            id: - 236, name: LanguageModule.text("txt_offboarding_type"), type: "offboarding_types", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_offboarding_type_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "available", localid: 'type_offboarding_type_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 237, name: LanguageModule.text("txt_offboarding_reason"), type: "offboarding_reasons", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_offboarding_reason_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "available", localid: 'type_offboarding_reason_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 238, name: LanguageModule.text("txt_social_network_array"), type: "array", notPri: true,
            content: {
                typeof: -153
            }
        },
        {
            id: - 239, name: LanguageModule.text("txt_partner_class"), type: "partner_class", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_partner_class_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "color", localid: 'type_partner_class_color', name: LanguageModule.text("txt_color"), type: -261, default: "white", require: true},
                    {key: "description", localid: 'type_partner_class_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "type_extra", localid: 'type_partner_class_type_extra', name: LanguageModule.text("txt_type_extra"), type: -252, default: 0, require: false},
                    {key: "input_form_extra", localid: 'type_partner_class_input_form_extra', name: LanguageModule.text("txt_input_form_extra"), type: -253, default: 0, require: false},
                    {key: "output_form_extra", localid: 'type_partner_class_output_form_extra', name: LanguageModule.text("txt_output_form_extra"), type: -254, default: 0, require: false},
                    {key: "mobile_input_form_extra", localid: 'type_partner_class_mobile_input_form_extra', name: LanguageModule.text("txt_mobile_input_form_extra"), type: -258, default: 0, require: false},
                    {key: "mobile_output_form_extra", localid: 'type_partner_class_mobile_output_form_extra', name: LanguageModule.text("txt_mobile_output_form_extra"), type: -259, default: 0, require: false},
                    {key: "available", localid: 'type_partner_class_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 240, name: LanguageModule.text("txt_select_partner_class"), type: "member_of_partner_class", type2: "enum"
        },
        {
            id: - 241, name: LanguageModule.text("txt_partner"), type: "partner", type2: "structure",
            content: {
                details: [
                    {key: "fullname", localid: 'type_partner_fullname', name: LanguageModule.text("txt_partner_fullname"), type: -1, default: '', require: true},
                    {key: "name", localid: 'type_partner_name', name: LanguageModule.text("txt_shortname"), type: -1, default: '', require: true},
                    {key: "class", localid: 'type_partner_class', name: LanguageModule.text("txt_partner_class"), type: -256, require: true},
                    {key: "address", localid: 'type_partner_address', name: LanguageModule.text("txt_address"), type: -1, default: '', require: false},
                    {key: "nation_city", localid: 'type_partner_nation_city', name: LanguageModule.text("txt_nationcity"), type: -207, require: false},
                    {key: "phone", localid: 'type_partner_phone', name: LanguageModule.text("txt_phone"), type: -10, default: '', require: false},
                    {key: "email", localid: 'type_partner_email', name: LanguageModule.text("txt_email"), type: -7, default: '', require: false},
                    {key: "website", localid: 'type_partner_website', name: LanguageModule.text("txt_website"), type: -11, default: '', require: false},
                    {key: "fax", localid: 'type_partner_fax', name: LanguageModule.text("txt_fax"), type: -1, default: '', require: false},
                    {key: "taxcode", localid: 'type_partner_taxcode', name: LanguageModule.text("txt_taxcode"), type: -1, default: '', require: false},
                    {key: "description", localid: 'type_partner_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_partner_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false},
                    {key: "gps", localid: 'type_partner_gps', name: LanguageModule.text("txt_gps"), type: -12, default: '', require: false}
                ]
            }
        },
        {
            id: - 242, name: LanguageModule.text("txt_select_partner"), type: "member_of_partner", type2: "enum"
        },
        {
            id: - 243, name: LanguageModule.text("txt_contact"), type: "contact", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_contact_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "position", localid: 'type_contact_position', name: LanguageModule.text("txt_position"), type: -1, default: "", require: false},
                    {key: "department", localid: 'type_contact_department', name: LanguageModule.text("txt_department"), type: -1, default: '', require: false},
                    {key: "partnerid", localid: 'type_contact_partnerid', name: LanguageModule.text("txt_partner"), type: -242, require: false},
                    {key: "phone_1", localid: 'type_contact_phone_1', name: LanguageModule.text("txt_phone_1"), type: -10, default: '', require: false},
                    {key: "phone_2", localid: 'type_contact_phone_2', name: LanguageModule.text("txt_phone_2"), type: -10, default: '', require: false},
                    {key: "email_1", localid: 'type_contact_email_1', name: LanguageModule.text("txt_email_1"), type: -7, default: '', require: false},
                    {key: "email_2", localid: 'type_contact_email_2', name: LanguageModule.text("txt_email_2"), type: -7, default: '', require: false},
                    {key: "owner", localid: 'type_contact_owner', name: LanguageModule.text("txt_owner"), type: -47, default: 0, require: true},
                    {key: "available", localid: 'type_contact_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 244, name: LanguageModule.text("txt_select_contact"), type: "member_of_contact", type2: "enum"
        },
        {
            id: - 245, name: LanguageModule.text("txt_work_flow_group"), type: "work_flow_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_work_flow_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_work_flow_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_work_flow_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 246, name: LanguageModule.text("txt_select_work_flow_group"), type: "member_of_work_flow_groups", type2: "enum"
        },
        {
            id: - 247, name: LanguageModule.text("txt_work_flows"), type: "work_flows", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_work_flow_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "groupid", localid: 'type_work_flow_groupid', name: LanguageModule.text("txt_group"), type: -246, default: 0, require: true},
                    {key: "description", localid: 'type_work_flow_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "type_extra_of_object", localid: 'type_work_flow_type_extra_of_object', name: LanguageModule.text("txt_type_extra_of_object"), type: -252, default: 0, require: false},
                    {key: "input_form_extra_of_object", localid: 'type_work_flow_input_form_extra_of_object', name: LanguageModule.text("txt_input_form_extra_of_object"), type: -253, default: 0, require: false},
                    {key: "output_form_extra_of_object", localid: 'type_work_flow_output_form_extra_of_object', name: LanguageModule.text("txt_output_form_extra_of_object"), type: -254, default: 0, require: false},
                    {key: "mobile_input_form_extra_of_object", localid: 'type_work_flow_mobile_input_form_extra_of_object', name: LanguageModule.text("txt_mobile_input_form_extra_of_object"), type: -258, default: 0, require: false},
                    {key: "mobile_output_form_extra_of_object", localid: 'type_work_flow_mobile_output_form_extra_of_object', name: LanguageModule.text("txt_mobile_output_form_extra_of_object"), type: -259, default: 0, require: false},
                    {key: "available", localid: 'type_work_flow_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 248, name: LanguageModule.text("txt_select_work_flow"), type: "member_of_work_flows", type2: "enum"
        },
        {
            id: - 249, name: LanguageModule.text("txt_object"), type: "objects", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_object_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "work_flowid", localid: 'type_object_work_flowid', name: LanguageModule.text("txt_work_flows"), type: -248, default: 0, require: true},
                    {key: "period", localid: 'type_object_period', name: LanguageModule.text("txt_period"), type: -251, default: 0, require: true},
                    {key: "priority", localid: 'type_object_priority', name: LanguageModule.text("txt_priority"), type: -250, default: "medium", require: true},
                    {key: "attachments", localid: 'type_object_attachments', name: LanguageModule.text("txt_attachments"), type: -64},
                    {key: "description", localid: 'type_object_description', name: LanguageModule.text("txt_description"), type: -218, default: '', require: false}
                ]
            }
        },
        {
            id: - 250, name: LanguageModule.text("txt_object_priority"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "high", value: "high", localid: "high", text: LanguageModule.text("txt_high")},
                    {key: "medium", value: "medium", localid: "medium", text: LanguageModule.text("txt_medium")},
                    {key: "low", value: "low", localid: "low", text: LanguageModule.text("txt_low")}
                ]
            }
        },
        {
            id: - 251, name: LanguageModule.text("txt_object_period"), type: "enum", notExtend: true,
            content: {
                typeof: -3,
                details: [
                    {key: -1, value: -1, localid: -1, text: LanguageModule.text("txt_success")},
                    {key: -2, value: -2, localid: -2, text: LanguageModule.text("txt_failed")},
                    {key: -3, value: -3, localid: -3, text: "Hủy thực hiện"}
                ]
            }
        },
        {
            id: -252, name: LanguageModule.text("txt_select_typelists"), type: "member_of_typelists", type2: "enum"
        },
        {
            id: -253, name: "Chọn input form", type: "member_of_input_forms", type2: "enum"
        },
        {
            id: -254, name: "Chọn output form", type: "member_of_output_forms", type2: "enum"
        },
        {
            id: -255, name: LanguageModule.text("txt_select_object"), type: "member_of_objects", type2: "enum"
        },
        {
            id: -256, name: "Chọn nhiều loại đối tác", type: "members_of_partner_class", type2: "enum_multi"
        },
        {id: -257, name: LanguageModule.text("txt_type_of_activity"), type: 'enum',
            content: {
                typeof: -1,
                details: [
                    {key: "type_task", value: "type_task", localid: "type_task", text: LanguageModule.text("txt_task")},
                    {key: "type_meeting", value: "type_meeting", localid: "type_meeting", text: LanguageModule.text("txt_meeting")}
                ]
            }
        },
        {
            id: -258, name: "Chọn input form mobile", type: "member_of_mobile_input_forms", type2: "enum"
        },
        {
            id: -259, name: "Chọn output form mobile", type: "member_of_mobile_output_forms", type2: "enum"
        },
        {
            id: - 260, name: LanguageModule.text("txt_company"), type: "company", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "name", localid: "type_company_name", name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "code", localid: "type_company_code", name: LanguageModule.text("txt_code"), type: -1, default: "", require: true},
                    {key: "geopos", localid: "type_company_geopos", name: LanguageModule.text("txt_geographical_position"), type: -210, require: true}
                ]
            }
        },
        {
            id: -261, name: "Color picker", type: "color_picker"
        },
        {
            id: - 264, name: LanguageModule.text("txt_lesson_category"), type: "lesson_categories", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_lesson_category_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_lesson_category_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_lesson_category_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 265, name: "Chọn nhóm bài học", type: "member_of_lesson_categories", type2: "enum"
        },
        {
            id: - 266, name: "Chọn chu kỳ tính lương", type: "member_of_payroll_cycle", type2: "enum"
        },
        {
            id: - 267, name: LanguageModule.text("txt_month"), type: "month", stt: 5
        },
        {
            id: - 268, name: LanguageModule.text("txt_week"), type: "week", stt: 5
        },
        {
            id: - 269, name: LanguageModule.text("txt_bonus_list_details"), type: "bonus_list_details", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_bonus_list_details_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "amount", localid: 'type_bonus_list_details_amount', name: LanguageModule.text("txt_amount") + " ($)", type: -118, require: true},
                    {key: "comment", localid: 'type_bonus_list_details_comment', name: LanguageModule.text("txt_note"), type: -2, require: false}
                ]
            }
        },
        {
            id: -270, name: LanguageModule.text("txt_shift_worktime"), type: "shift_worktime", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "working_time", localid: "type_shift_working_time", name: LanguageModule.text("txt_working_time"), type: -136, require: true},
                    {key: "break_time", localid: "type_shift_break_time", name: LanguageModule.text("txt_break_time"), type: -136, require: true},
                    {key: "night_work_time", localid: "type_shift_night_work_time", name: LanguageModule.text("txt_night_work_time"), type: -136, require: true},
                    {key: "late_checkin_minutes", localid: "type_shift_late_checkin_minutes", name: LanguageModule.text("txt_allow_late_check_in_minute"), type: -3, default: 0, require: false},
                    {key: "early_checkout_minutes", localid: "type_shift_early_checkout_minutes", name: LanguageModule.text("txt_allow_early_check_out_minute"), type: -3, default: 0, require: false},
                    {key: "monday", localid: "type_shift_monday", name: LanguageModule.text("txt_monday"), type: -53, default: 4, require: true},
                    {key: "tuesday", localid: "type_shift_tuesday", name: LanguageModule.text("txt_tuesday"), type: -53, default: 4, require: true},
                    {key: "wednesday", localid: "type_shift_wednesday", name: LanguageModule.text("txt_wednesday"), type: -53, default: 4, require: true},
                    {key: "thursday", localid: "type_shift_thursday", name: LanguageModule.text("txt_thursday"), type: -53, default: 4, require: true},
                    {key: "friday", localid: "type_shift_friday", name: LanguageModule.text("txt_friday"), type: -53, default: 4, require: true},
                    {key: "saturday", localid: "type_shift_saturday", name: LanguageModule.text("txt_saturday"), type: -53, default: 4, require: true},
                    {key: "sunday", localid: "type_shift_sunday", name: LanguageModule.text("txt_sunday"), type: -53, default: 4, require: true}
                ]
            }
        },
        {
            id: -271, name: LanguageModule.text("txt_shift_timekeeping"), type: "shift_timekeeping", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "number_of_standard_working_hours", localid: "type_shift_number_of_standard_working_hours", name: LanguageModule.text("txt_number_of_standard_working_hours"), type: -3, default: 8, require: false, decpre: 1},
                    {key: "number_of_work_days", localid: "type_shift_number_of_work_days", name: LanguageModule.text("txt_number_of_work_days"), type: -3, default: 1, require: false, decpre: 1},
                    {
                        key: "workdays_accumulation_method", localid: "type_shift_workdays_accumulation_method", name: LanguageModule.text("txt_workdays_accumulation_method"), type: "union", typeOfUnion: -298, require: true,
                        detailUnion: {
                            by_block: [
                                {key: "block_duration", localid: 'type_shift_block_duration', name: LanguageModule.text("txt_block_duration"), type: -3, require: true, default: 30},
                                {key: "block_rounding_method", localid: 'type_shift_block_rounding_method', name: LanguageModule.text("txt_block_rounding_method"), type: -299, require: true}
                            ],
                            by_actual_working_time: [
                                {key: "minimum_working_minutes_required_for_salary_calculation", localid: "type_shift_minimum_working_minutes_required_for_salary_calculation", name: LanguageModule.text("txt_minimum_working_minutes_required_for_salary_calculation"), type: -3, default: 0, require: false, decpre: 1},
                                {key: "round_to_one_days_wage", localid: "type_shift_round_to_one_days_wage", name: LanguageModule.text("txt_round_to_one_days_wage"), type: -3, default: 7.5, require: false, decpre: 1}
                            ]
                        }
                    }
                    // ,
                    // {localid: "type_shift_checkin_first_half_shift", name: LanguageModule.text("txt_checkin_first_half_shift"), type: -6, default: true, require: false},
                    // {localid: "type_shift_time_for_checking_in_first_half_shift", name: LanguageModule.text("txt_time_for_checking_in_first_half_shift"), type: -136, require: false},
                    // {localid: "type_shift_checkout_first_half_shift", name: LanguageModule.text("txt_checkout_first_half_shift"), type: -6, default: false, require: false},
                    // {localid: "type_shift_time_for_checking_out_first_half_shift", name: LanguageModule.text("txt_time_for_checking_out_first_half_shift"), type: -136, require: false},
                    // {localid: "type_shift_checkin_second_half_shift", name: LanguageModule.text("txt_checkin_second_half_shift"), type: -6, default: false, require: false},
                    // {localid: "type_shift_time_for_checking_in_second_half_shift", name: LanguageModule.text("txt_time_for_checking_in_second_half_shift"), type: -136, require: false},
                    // {localid: "type_shift_checkout_second_half_shift", name: LanguageModule.text("txt_checkout_second_half_shift"), type: -6, default: true, require: false},
                    // {localid: "type_shift_time_for_checking_out_second_half_shift", name: LanguageModule.text("txt_time_for_checking_out_second_half_shift"), type: -136, require: false}
                ]
            }
        },
        {
            id: - 272, name: LanguageModule.text("txt_overtime_policy_group"), type: "overtime_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_overtime_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_overtime_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_overtime_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -273, name: LanguageModule.text("txt_select_overtime_policy_group"), type: 'member_of_overtime_policy_groups', type2: "enum"},
        {
            id: - 274, name: LanguageModule.text("txt_overtime_policy"), type: "overtime_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_overtime_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_overtime_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "groupid", localid: 'type_overtime_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: -127, default: 0, require: true},
                    {key: "maximum_overtime_hours_per_day", localid: 'type_overtime_policy_maximum_overtime_hours_per_day', name: LanguageModule.text("txt_maximum_overtime_hours_per_day"), type: -3, default: 0.0, require: false, variable_tooltip: "maximum_overtime_hours_per_day"},
                    {key: "maximum_overtime_hours_per_month", localid: 'type_overtime_policy_maximum_overtime_hours_per_month', name: LanguageModule.text("txt_maximum_overtime_hours_per_month"), type: -3, default: 0.0, require: false, variable_tooltip: "maximum_overtime_hours_per_month"},
                    {key: "proposal_submitted_before", localid: 'type_overtime_policy_proposal_submitted_before', name: LanguageModule.text("txt_proposal_submitted_before"), type: -3, default: "0.0"},
                    {key: "available", localid: 'type_overtime_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -275, name: LanguageModule.text("txt_select_overtime_policy"), type: 'member_of_overtime_policies', type2: "enum"},
        {
            id: - 277, name: LanguageModule.text("txt_overtime_request"), type: "overtime_request", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_overtime_request_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    // {localid: 'type_overtime_request_policyid', name: LanguageModule.text("txt_policy"), type: -275, default: 0, require: true},
                    {key: "shiftid", localid: 'type_overtime_request_shiftid', name: LanguageModule.text("txt_shift"), type: -137, default: 0, require: true},
                    {key: "fromdate", localid: 'type_overtime_request_fromdate', name: LanguageModule.text("txt_date_from"), type: -4, require: true},
                    {key: "todate", localid: 'type_overtime_request_todate', name: LanguageModule.text("txt_date_to"), type: -4, require: true},
                    {key: "time_period", localid: 'type_overtime_request_time_period', name: LanguageModule.text("txt_time_period"), type: -136, require: true},
                    {key: "overtime_hours", localid: 'type_overtime_request_overtime_hours', name: LanguageModule.text("txt_overtime_hours"), type: -3, default: 0, require: false, decpre: 1},
                    {key: "reason", localid: 'type_overtime_request_reason', name: LanguageModule.text("txt_reason"), type: -2, default: ""}
                ]
            }
        },
        {
            id: - 278, name: LanguageModule.text("txt_overtime_policies_applied_to_employee"), type: "overtime_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_overtime_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_overtime_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -275, default: 0, require: true},
                    {key: "description", localid: 'type_overtime_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 279, name: LanguageModule.text("txt_punishment_list_details"), type: "punishment_list_details", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_punishment_list_details_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "amount", localid: 'type_punishment_list_details_amount', name: LanguageModule.text("txt_amount") + " ($)", type: -118, require: true},
                    {key: "comment", localid: 'type_punishment_list_details_comment', name: LanguageModule.text("txt_note"), type: -2, require: false}
                ]
            }
        },
        {
            id: - 280, name: LanguageModule.text("txt_allowance_list_details"), type: "allowance_list_details", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_allowance_list_details_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "amount", localid: 'type_allowance_list_details_amount', name: LanguageModule.text("txt_amount") + " ($)", type: -118, require: true},
                    {key: "comment", localid: 'type_allowance_list_details_comment', name: LanguageModule.text("txt_note"), type: -2, require: false}
                ]
            }
        },
        {
            id: - 281, name: LanguageModule.text("txt_benefit_list_details"), type: "benefit_list_details", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_benefit_list_details_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "amount", localid: 'type_benefit_list_details_amount', name: LanguageModule.text("txt_amount") + " ($)", type: -118, require: true},
                    {key: "comment", localid: 'type_benefit_list_details_comment', name: LanguageModule.text("txt_note"), type: -2, require: false}
                ]
            }
        },
        {
            id: - 282, name: LanguageModule.text("txt_other_liability_list_details"), type: "other_liability_list_details", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_other_liability_list_details_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "amount", localid: 'type_other_liability_list_details_amount', name: LanguageModule.text("txt_amount") + " ($)", type: -118, require: true},
                    {key: "comment", localid: 'type_other_liability_list_details_comment', name: LanguageModule.text("txt_note"), type: -2, require: false}
                ]
            }
        },
        {
            id: - 283, name: LanguageModule.text("txt_salary_adjustment_list_details"), type: "salary_adjustment_list_details", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_salary_adjustment_list_details_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "amount", localid: 'type_salary_adjustment_list_details_amount', name: LanguageModule.text("txt_amount") + " ($)", type: -118, require: true},
                    {key: "tax_exempt", localid: 'type_salary_adjustment_list_details_tax_exempt', name: LanguageModule.text("txt_tax_exempt") + " ($)", type: -118, require: true},
                    {key: "insurance_exempt", localid: 'type_salary_adjustment_list_details_insurance_exempt', name: LanguageModule.text("txt_insurance_exempt") + " ($)", type: -118, require: true},
                    {key: "comment", localid: 'type_salary_adjustment_list_details_comment', name: LanguageModule.text("txt_note"), type: -2, require: false}
                ]
            }
        },
        {
            id: - 284, name: LanguageModule.text("txt_onboarding_status"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "onboarding_onloading", localid: "onboarding_onloading", text: LanguageModule.text("txt_doing"), value: "onboarding_onloading"},
                    {key: "onboarding_success", localid: "onboarding_success", text: LanguageModule.text("txt_success"), value: "onboarding_success"}
                ]
            }
        },
        {
            id: - 285, name: LanguageModule.text("txt_offboarding_status"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "offboarding_proposal", localid: "offboarding_proposal", text: LanguageModule.text("txt_proposal"), value: "offboarding_proposal"},
                    {key: "offboarding_approval", localid: "offboarding_approval", text: LanguageModule.text("txt_approval"), value: "offboarding_approval"},
                    {key: "offboarding_evaluation", localid: "offboarding_evaluation", text: LanguageModule.text("txt_evaluation"), value: "offboarding_evaluation"},
                    {key: "offboarding_finish", localid: "offboarding_finish", text: LanguageModule.text("txt_finish"), value: "offboarding_finish"}
                ]
            }
        },
        {
            id: - 286, name: "Chọn loại nghỉ việc", type: "member_of_offboarding_types", type2: "enum"
        },
        {
            id: - 287, name: "Chọn lý do nghỉ việc", type: "member_of_offboarding_reasons", type2: "enum"
        },
        {
            id: - 288, name: "Chọn lý do nghỉ việc", type: "multiselect_offboarding_reasons", type2: "enum_multi"
        },
        {
            id: - 289, name: LanguageModule.text("txt_leave_approval"), type: "approval_resignation", type2: "structure",
            content: {
                details: [
                    {key: "approvers", localid: 'type_approval_resignation_approver', name: LanguageModule.text("txt_approver_quits_job"), type: -48, default: 0, require: true},
                    {key: "the_last_working_day", localid: 'type_approval_resignation_the_last_working_day', name: LanguageModule.text("txt_the_last_working_day"), type: -4, require: true},
                    {key: "interview", localid: 'type_approval_resignation_interview', name: LanguageModule.text("txt_job_leave_interview"), type: -6, require: true, default: false},
                    {key: "interviewers", localid: 'type_approval_resignation_interviewer', name: LanguageModule.text("txt_interviewer_quits_job"), type: -48, require: false},
                    {key: "interview_date", localid: 'type_approval_resignation_interview_date', name: LanguageModule.text("txt_interview_date"), type: -4, require: false}
                ]
            }
        },
        {
            id: - 290, name: LanguageModule.text("txt_leave_review"), type: "leave_assessment", type2: "structure",
            content: {
                details: [
                    {key: "type", localid: 'type_leave_assessment_type', name: LanguageModule.text("txt_offboarding_type"), type: -286, require: true},
                    {key: "reasons", localid: 'type_leave_assessment_reason', name: LanguageModule.text("txt_offboarding_reason"), type: -288, require: true},
                    {key: "comment", localid: 'type_leave_assessment_comment', name: LanguageModule.text("txt_note"), type: -218, require: false},
                ]
            }
        },
        {
            id: - 291, name: "Đồ thị hiệu suất", type: "performance_chart"
        },
        {
            id: -294, name: LanguageModule.text("txt_arrange_ot_shift"), type: "shift_schedule_ot", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "employee", localid: "type_shift_schedule_ot_employee", name: LanguageModule.text("txt_employee"), type: -47, require: true},
                    {key: "shiftid", localid: "type_shift_schedule_ot_shift", name: LanguageModule.text("txt_shift"), type: -137, require: true},
                    {key: "date_from", localid: "type_shift_schedule_ot_date_from", name: LanguageModule.text("txt_date_from"), type: -4, require: true, default: ["today", ""]},
                    {key: "date_to", localid: "type_shift_schedule_ot_date_to", name: LanguageModule.text("txt_date_to"), type: -4, require: true, default: ["today", ""]},
                    {key: "time_period", localid: 'type_shift_schedule_ot_time_period', name: LanguageModule.text("txt_time_period"), type: -136, require: true},
                    {key: "ot_in_breaktime", localid: 'type_shift_schedule_ot_ot_in_breaktime', name: LanguageModule.text("txt_ot_in_breaktime"), type: -6},
                    {key: "overtime_hours", localid: 'type_shift_schedule_ot_overtime_hours', name: LanguageModule.text("txt_overtime_hours"), type: -3, default: 0, require: false, decpre: 1},
                    {key: "substitute", localid: "type_shift_schedule_ot_substitute", name: LanguageModule.text("txt_substitute"), type: -6},
                    {key: "substitute_employee", localid: "type_shift_schedule_ot_substitute_employee", name: LanguageModule.text("txt_employee"), type: -47, require: false}
                ]
            }
        },
        {
            id: - 295, name: LanguageModule.text("txt_position_2"), type: "position_2", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "name", localid: "type_position_name", name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "code", localid: "type_position_code", name: LanguageModule.text("txt_code"), type: -1, default: "", require: true},
                    {key: "groupid", localid: "type_position_groupid", name: LanguageModule.text("txt_group"), type: -340, default: "", require: true},
                    {key: "benefits", localid: "type_position_benefits", name: LanguageModule.text("txt_benefits"), type: -2, default: "", require: false},
                    {key: "report_to", localid: "type_position_report_to", name: LanguageModule.text("txt_report_to"), type: -2, default: "", require: false},
                    {key: "job_description", localid: "type_position_job_description", name: LanguageModule.text("txt_job_description"), type: -218, default: "", require: false},
                    {key: "liability_and_authority", localid: "type_position_liability_and_authority", name: LanguageModule.text("txt_liability_and_authority"), type: -218, default: "", require: false},
                    {key: "working_condition", localid: "type_position_working_condition", name: LanguageModule.text("txt_working_condition"), type: -218, default: "", require: false},
                    {key: "prefered_ability", localid: "type_position_prefered_ability", name: LanguageModule.text("txt_prefered_ability"), type: -218, default: "", require: false}
                ]
            }
        },
        {id: -296, name: "Chọn chức danh", type: 'member_of_position_2', type2: "enum"},
        {id: -297, name: LanguageModule.text("txt_select_timesheet"), type: 'member_of_timesheets', type2: "enum"},
        {id: -298, name: LanguageModule.text("txt_workdays_accumulation_method"), type: 'enum',
            content: {
                typeof: -1,
                details: [
                    {key: "by_block", localid: "by_block", text: LanguageModule.text("txt_by_block"), value: "by_block"},
                    {key: "by_actual_working_time", localid: "by_actual_working_time", text: LanguageModule.text("txt_by_actual_working_time"), value: "by_actual_working_time"}
                ]
            }
        },
        {id: -299, name: LanguageModule.text("txt_block_rounding_method"), type: 'enum',
            content: {
                typeof: -1,
                details: [
                    {key: "round_up", localid: "round_up", text: LanguageModule.text("txt_round_up"), value: "round_up"},
                    {key: "round_down", localid: "round_down", text: LanguageModule.text("txt_round_down"), value: "round_down"}
                ]
            }
        },
        {id: -300, name: LanguageModule.text("txt_sample_employment_contract"), type: 'sample_employment_contract', type2: "structure",
            content: {
                details: [
                    {key: "number", localid: "type_sample_employment_contract_number", name: LanguageModule.text("txt_number_2"), type: -1, default: "", require: true},
                    {key: "name", localid: "type_sample_employment_contract_employee_name", name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "address", localid: "type_sample_employment_contract_employee_address", name: LanguageModule.text("txt_address"), type: -1, default: "", require: true},
                    {key: "sex", localid: "type_sample_employment_contract_employee_sex", name: LanguageModule.text("txt_sex"), type: -40, default: 0, require: false},
                    {key: "dayofbirth", localid: "type_sample_employment_contract_employee_dayofbirth", name: LanguageModule.text("txt_day_of_birth"), type: -4, default: ["custom", null], require: false},
                    {key: "nationalidno", localid: "type_sample_employment_contract_employee_nationalidno", name: LanguageModule.text("txt_nation_id_number"), type: -1, default: "", require: false},
                    {key: "nationalidno_date", localid: "type_sample_employment_contract_employee_nationalidno_date", name: LanguageModule.text("txt_date_of_issue"), type: -4, default: ["custom", null], require: false},
                    {key: "nationalidno_place", localid: "type_sample_employment_contract_employee_nationalidno_place", name: LanguageModule.text("txt_place_of_issue"), type: -1, default: "", require: false},
                    {key: "permanent_address", localid: "type_sample_employment_contract_employee_permanent_address", name: LanguageModule.text("txt_permanent_address"), type: -1, default: "", require: false},
                    {key: "type", localid: "type_sample_employment_contract_contract_type", name: LanguageModule.text("txt_employment_contract_type"), type: -89, require: false},
                    {key: "effective_date_from", localid: "type_sample_employment_contract_contract_effective_date_from", name: LanguageModule.text("txt_effective_date_from"), type: -4, default: ["custom", null], require: false},
                    {key: "effective_date_to", localid: "type_sample_employment_contract_contract_effective_date_to", name: LanguageModule.text("txt_effective_date_to"), type: -4, default: ["custom", null], require: false},
                    {key: "workplace", localid: "type_sample_employment_contract_contract_workplace", name: LanguageModule.text("txt_workplace"), type: -218, default: "", require: false},
                    {key: "department", localid: "type_sample_employment_contract_contract_employee_department", name: LanguageModule.text("txt_department"), type: -24, require: false},
                    {key: "position", localid: "type_sample_employment_contract_contract_employee_position", name: LanguageModule.text("txt_position"), type: -296, require: false},
                    {key: "concurrent_position", localid: "type_sample_employment_contract_contract_employee_concurrent_position", name: LanguageModule.text("txt_concurrent_position"), type: -296, require: false},
                    {key: "gross_salary", localid: "type_sample_employment_contract_contract_employee_gross_salary", name: LanguageModule.text("txt_gross_salary"), type: -118, default: 0, require: false},
                    {key: "basic_salary", localid: "type_sample_employment_contract_contract_employee_basic_salary", name: LanguageModule.text("txt_basic_salary"), type: -118, default: 0, require: false},
                    {key: "salary_caculated_on", localid: "type_sample_employment_contract_contract_employee_salary_caculated_on", name: LanguageModule.text("txt_calculated_on"), type: -181, default: 0, require: false},
                    {key: "salary_grade", localid: "type_sample_employment_contract_contract_employee_salary_grade", name: LanguageModule.text("txt_salary_grade"), type: -1, default: "", require: false},
                    {key: "leave_policy", localid: "type_sample_employment_contract_contract_employee_leave_policy", name: LanguageModule.text("txt_leave_policy"), type: -218, default: "", require: false},
                    {key: "late_early_checkin_policy", localid: "type_sample_employment_contract_contract_employee_late_early_checkin_policy", name: LanguageModule.text("txt_late_early_checkin_policy"), type: -218, default: "", require: false},
                    {key: "advance_payment_policy", localid: "type_sample_employment_contract_contract_employee_advance_payment_policy", name: LanguageModule.text("txt_advance_payment_policy"), type: -218, default: "", require: false},
                    {key: "allowance_policy", localid: "type_sample_employment_contract_contract_employee_allowance_policy", name: LanguageModule.text("txt_allowance_policy"), type: -218, default: "", require: false},
                    {key: "benefit_policy", localid: "type_sample_employment_contract_contract_employee_benefit_policy", name: LanguageModule.text("txt_benefit_policy"), type: -218, default: "", require: false},
                    {key: "bonus_policy", localid: "type_sample_employment_contract_contract_employee_bonus_policy", name: LanguageModule.text("txt_bonus_policy"), type: -218, default: "", require: false},
                    {key: "punishment_policy", localid: "type_sample_employment_contract_contract_employee_punishment_policy", name: LanguageModule.text("txt_punishment_policy"), type: -218, default: "", require: false},
                    {key: "insurance_policy", localid: "type_sample_employment_contract_contract_employee_insurance_policy", name: LanguageModule.text("txt_insurance_policy"), type: -218, default: "", require: false},
                    {key: "trade_union_policy", localid: "type_sample_employment_contract_contract_employee_trade_union_policy", name: LanguageModule.text("txt_trade_union_policy"), type: -218, default: "", require: false},
                    {key: "tax_policy", localid: "type_sample_employment_contract_contract_employee_tax_policy", name: LanguageModule.text("txt_tax_policy"), type: -218, default: "", require: false},
                    {key: "other_liability_policy", localid: "type_sample_employment_contract_contract_employee_other_liability_policy", name: LanguageModule.text("txt_other_liability_policy"), type: -218, default: "", require: false},
                    {key: "signature", localid: "type_sample_employment_contract_contract_employee_signature", name: LanguageModule.text("txt_laborer"), type: -1, default: "", require: false}
                ]
            }
        },
        {
            id: -301, name: LanguageModule.text("txt_timekeeping_code"), type: "checkin_employee_ident", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "employeeid", localid: "checkin_employee_ident_employeeid", name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "machineid", localid: "checkin_employee_ident_machineid", name: LanguageModule.text("txt_worktime_machine"), type: -58, default: 0, require: true},
                    {key: "code", localid: "checkin_employee_ident_code", name: LanguageModule.text("txt_timekeeping_code"), type: -3, default: "", require: true},
                    {key: "description", localid: "checkin_employee_ident_description", name: LanguageModule.text("txt_description"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 302, name: LanguageModule.text("txt_standard_workday_policy_group"), type: "standard_workday_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_standard_workday_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_standard_workday_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_standard_workday_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -303, name: LanguageModule.text("txt_select_standard_workday_policy_group"), type: 'member_of_standard_workday_policy_groups', type2: "enum"},
        {id: -304, name: LanguageModule.text("txt_standard_workday_calculation"), type: 'enum',
            content: {
                typeof: -1,
                details: [
                    {key: "work_days_in_month_excluding_sunday", value: "work_days_in_month_excluding_sunday", localid: "work_days_in_month_excluding_sunday", text: LanguageModule.text("txt_work_days_in_month_excluding_sunday")},
                    {key: "work_days_in_month_excluding_saturday_sunday", value: "work_days_in_month_excluding_saturday_sunday", localid: "work_days_in_month_excluding_saturday_sunday", text: LanguageModule.text("txt_work_days_in_month_excluding_saturday_sunday")},
                    {key: "work_days_in_month_excluding_half_saturday_sunday", value: "work_days_in_month_excluding_half_saturday_sunday", localid: "work_days_in_month_excluding_half_saturday_sunday", text: LanguageModule.text("txt_work_days_in_month_excluding_half_saturday_sunday")},
                    {key: "work_days_in_month_excluding_sunday_and_n_days", value: "work_days_in_month_excluding_sunday_and_n_days", localid: "work_days_in_month_excluding_sunday_and_n_days", text: LanguageModule.text("txt_work_days_in_month_excluding_sunday_and_n_days")},
                    {key: "total_shifts_assigned", value: "total_shifts_assigned", localid: "total_shifts_assigned", text: LanguageModule.text("txt_total_shifts_assigned")},
                    {key: "total_fixed_days", value: "total_fixed_days", localid: "total_fixed_days", text: LanguageModule.text("txt_total_fixed_days")}
                ]
            }
        },
        {
            id: - 305, name: LanguageModule.text("txt_standard_workday_policy"), type: "standard_workday_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_standard_workday_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_standard_workday_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "groupid", localid: 'type_standard_workday_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: -303, default: 0, require: true},
                    {
                        key: "calculation", localid: 'type_standard_workday_policy_calculation', name: LanguageModule.text("txt_standard_workday_calculation"), type: "union", typeOfUnion: -304, require: true,
                        detailUnion: {
                            work_days_in_month_excluding_sunday: [],
                            work_days_in_month_excluding_saturday_sunday: [],
                            work_days_in_month_excluding_half_saturday_sunday: [],
                            work_days_in_month_excluding_sunday_and_n_days: [
                                {key: "excluded_days", localid: 'type_standard_workday_policy_excluded_days', name: LanguageModule.text("txt_number_of_days_excluded"), type: -3, default: 0, require: true}
                            ],
                            total_shifts_assigned: [],
                            total_fixed_days: [
                                {key: "fixed_days", localid: 'type_standard_workday_policy_fixed_days', name: LanguageModule.text("txt_fixed_days"), type: -3, default: 0, require: true}
                            ]
                        }
                    },
                    {key: "available", localid: 'type_standard_workday_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -306, name: LanguageModule.text("txt_select_standard_workday_policy"), type: 'member_of_standard_workday_policies', type2: "enum"},
        {
            id: - 307, name: LanguageModule.text("txt_standard_workday_policies_applied_to_employee"), type: "standard_workday_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_standard_workday_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_standard_workday_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -306, default: 0, require: true},
                    {key: "description", localid: 'type_standard_workday_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 308, name: LanguageModule.text("txt_piece_wage_policy_group"), type: "piece_wage_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_piece_wage_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_piece_wage_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_piece_wage_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -309, name: LanguageModule.text("txt_select_piece_wage_policy_group"), type: 'member_of_piece_wage_policy_groups', type2: "enum"},
        {
            id: - 310, name: LanguageModule.text("txt_piece_wage_policy"), type: "piece_wage_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_piece_wage_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_piece_wage_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "groupid", localid: 'type_piece_wage_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: -309, default: 0, require: true},
                    {key: "available", localid: 'type_piece_wage_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {
            id: - 311, name: LanguageModule.text("txt_product_groups"), type: "product_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_product_groups_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: false},
                    {key: "code", localid: 'type_product_groups_code', name: LanguageModule.text("txt_code"), type: -1, default: '', require: true}
                ]
            }
        },
        {id: -312, name: LanguageModule.text("txt_select_product_groups"), type: 'member_of_product_groups', type2: "enum"},
        {
            id: - 313, name: LanguageModule.text("txt_product_list"), type: "product_list", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_product_list_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "code", localid: 'type_product_list_code', name: LanguageModule.text("txt_code"), type: -1, default: '', require: true},
                    {key: "unit", localid: 'type_product_list_unit', name: LanguageModule.text("txt_unit"), type: -1, default: '', require: true},
                    {key: "groupid", localid: 'type_product_list_groupid', name: LanguageModule.text("txt_group"), type: -312, default: 0, require: true},
                    {key: "price", localid: 'type_product_list_price', name: LanguageModule.text("txt_unit_price"), type: -118, default: '', require: true},
                    {key: "description", localid: 'type_product_list_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false}
                ]
            }
        },
        {id: -314, name: LanguageModule.text("txt_select_products"), type: 'member_of_product_list', type2: "enum_multi"},
        {
            id: - 315, name: LanguageModule.text("txt_piece_wage_table_field"), type: "piece_wage_table_field", type2: "structure",
            content: {
                details: [
                    {key: "code", localid: 'type_piece_wage_table_field_code', name: LanguageModule.text("txt_code"), type: -1, default: "", require: true},
                    {key: "productid", localid: 'type_piece_wage_table_field_name', name: LanguageModule.text("txt_name"), type: -314, default: 0, require: true},
                    {key: "unit", localid: 'type_piece_wage_table_field_unit', name: LanguageModule.text("txt_unit"), type: -1, default: "", require: true},
                    {key: "price", localid: 'type_piece_wage_table_field_unit_price', name: LanguageModule.text("txt_unit_price"), type: -118, default: "", require: true},
                    {key: "quantity", localid: 'type_piece_wage_table_field_quantity', name: LanguageModule.text("txt_quantity"), type: -3, default: "", require: true},
                    {key: "coefficient", localid: 'type_piece_wage_table_field_coefficient', name: LanguageModule.text("txt_coefficient"), type: -3, default: "", require: true, decpre: 2},
                    {key: "money", localid: 'type_piece_wage_table_field_money', name: "Thành tiền", type: -118, default: "", require: true, disabled: true}
                ]
            }
        },
        // {
        //     id: - 316, name: LanguageModule.text("txt_piece_wage_table"), type: "array", notPri: true,
        //     content: {
        //         typeof: -315
        //     }
        // },
        {
            id: - 317, name: LanguageModule.text("txt_piece_wage_list"), type: "piece_wage_list", type2: "structure",
            content: {
                details: [
                    {key: "cycleid", localid: 'type_piece_wage_list_cycle', name: LanguageModule.text("txt_cycle"), type: -266, default: 0, require: true},
                    {key: "payroll_date", localid: 'type_piece_wage_list_payroll_date', name: LanguageModule.text("txt_payroll_date"), type: -267, require: false},
                    // {localid: 'type_piece_wage_list_payroll_date_month', name: LanguageModule.text("txt_payroll_month"), type: -267, require: false},
                    // {localid: 'type_piece_wage_list_payroll_date_week', name: LanguageModule.text("txt_payroll_week"), type: -268, require: false},
                    {key: "policyid", localid: 'type_piece_wage_list_policyid', name: LanguageModule.text("txt_policy"), type: -318, default: 0, require: true},
                    {key: "employeeid", localid: 'type_piece_wage_list_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "orgid", localid: 'type_piece_wage_list_orgid', name: LanguageModule.text("txt_department"), type: -24, default: 0, require: true, disabled: true},
                    {key: "number", localid: 'type_piece_wage_list_number', name: LanguageModule.text("txt_reference_number"), type: -1, default: "", require: true},
                    {key: "date", localid: 'type_piece_wage_list_date', name: LanguageModule.text("txt_date"), type: -4, default: ["today", ""], require: true}
                    // {key: "content", localid: 'type_piece_wage_list_content', name: LanguageModule.text("txt_content"), type: -316, default: "", require: true}
                ]
            }
        },
        {id: -318, name: LanguageModule.text("txt_select_piece_wage_policies"), type: 'member_of_piece_wage_policies', type2: "enum"},
        {
            id: - 319, name: LanguageModule.text("txt_payslip_detail_line"), type: "payslip_detail_line", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_payslip_detail_line_name', name: LanguageModule.text("txt_name"), type: -1, default: 0, require: true},
                    {key: "description", localid: 'type_payslip_detail_line_description', name: LanguageModule.text("txt_description"), type: -1, default: "", require: true},
                    {key: "amount", localid: 'type_payslip_detail_line_amount', name: LanguageModule.text("txt_amount"), type: -1, default: "", require: true}
                ]
            }
        },
        {
            id: - 320, name: LanguageModule.text("txt_payslip_details"), type: "array", notPri: true,
            content: {
                typeof: -319
            }
        },
        {
            id: - 321, name: LanguageModule.text("txt_payslip"), type: "payslip", type2: "structure",
            content: {
                details: [
                    {key: "companylogo", localid: 'type_payslip_paysheet_company_logo', name: LanguageModule.text("txt_company_logo"), type: -32, require: true},
                    {key: "companyname", localid: 'type_payslip_paysheet_company_name', name: LanguageModule.text("txt_company_name"), type: -1, require: true},
                    {key: "companyaddress", localid: 'type_payslip_paysheet_company_address', name: LanguageModule.text("txt_company_address"), type: -1, require: true},
                    {key: "paysheetname", localid: 'type_payslip_paysheet_name', name: LanguageModule.text("txt_paysheet_name"), type: -1, require: true},
                    {key: "employeecode", localid: 'type_payslip_employee_code', name: LanguageModule.text("txt_employee_code"), type: -1, require: false},
                    {key: "employeename", localid: 'type_payslip_employee_name', name: LanguageModule.text("txt_employee_name"), type: -1, require: false},
                    {key: "employeeposition", localid: 'type_payslip_position', name: LanguageModule.text("txt_position"), type: -1, require: false},
                    {key: "employeedepartment", localid: 'type_payslip_department', name: LanguageModule.text("txt_department"), type: -1, require: false},
                    {key: "bankaccount", localid: 'type_payslip_bank_account', name: LanguageModule.text("txt_bank_account"), type: -1, require: false},
                    {key: "bankname", localid: 'type_payslip_bank_name', name: LanguageModule.text("txt_bank_name"), type: -1, require: false},
                    {key: "accountholdername", localid: 'type_payslip_account_holder_name', name: LanguageModule.text("txt_account_holder_name"), type: -1, require: false},
                    {key: "basicsalary", localid: 'type_payslip_basic_salary', name: LanguageModule.text("txt_basic_salary"), type: -118, decpre: 1, require: false},
                    {key: "grosssalary", localid: 'type_payslip_gross_salary', name: LanguageModule.text("txt_gross_salary"), type: -118, decpre: 1, require: false},
                    {key: "standardworkdays", localid: 'type_payslip_standard_workdays', name: LanguageModule.text("txt_standard_workdays"), type: -3, decpre: 1, require: false},
                    {key: "actualworkdays", localid: 'type_payslip_actual_workdays', name: LanguageModule.text("txt_actual_workdays"), type: -3, decpre: 1, require: false},
                    {key: "taxableincome", localid: 'type_payslip_taxable_income', name: LanguageModule.text("txt_taxable_income"), type: -118, decpre: 1, require: false},
                    {key: "totalincome", localid: 'type_payslip_total_income', name: LanguageModule.text("txt_total_income"), type: -118, decpre: 1, require: false},
                    {key: "incometax", localid: 'type_payslip_income_tax', name: LanguageModule.text("txt_income_tax"), type: -118, decpre: 1, require: false},
                    {key: "netpay", localid: 'type_payslip_net_pay', name: LanguageModule.text("txt_net_pay"), type: -118, decpre: 1, require: false},
                    {key: "employeesignature", localid: 'type_payslip_employee_signature', name: LanguageModule.text("txt_receiver"), type: -1, require: false}
                ]
            }
        },
        {
            id: - 322, name: LanguageModule.text("txt_piece_wage_policies_applied_to_employee"), type: "piece_wage_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_piece_wage_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_piece_wage_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -318, default: 0, require: true},
                    {key: "description", localid: 'type_piece_wage_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 323, name: LanguageModule.text("txt_pay_percentage"), type: "pay_percentage", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_pay_percentage_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "percentage", localid: 'type_pay_percentage_percentage', name: LanguageModule.text("txt_ratio"), type: -3, default: 0, require: true},
                    {key: "available", localid: 'type_pay_percentage_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false},
                    {key: "comment", localid: 'type_pay_percentage_comment', name: LanguageModule.text("txt_note"), type: -2, require: false}
                ]
            }
        },
        // {id: -324, name: LanguageModule.text("txt_emulation_and_reward_phase"), type: 'enum',
        //     content: {
        //         typeof: -3,
        //         details: [
        //             {localid: "before", text: LanguageModule.text("txt_before_work_in_company"), value: 1},
        //             {localid: "after", text: LanguageModule.text("txt_after_work_in_company"), value: 2}
        //         ]
        //     }
        // },
        {
            id: - 325, name: LanguageModule.text("txt_year"), type: "year", stt: 5
        },
        {
            id: - 326, name: LanguageModule.text("txt_emulation_and_reward"), type: "emulation_and_reward", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_emulation_and_reward_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "reference_number", localid: 'type_emulation_and_reward_reference_number', name: LanguageModule.text("txt_reference_number"), type: -1, default: "", require: true},
                    {key: "date", localid: 'type_emulation_and_reward_date', name: LanguageModule.text("txt_time"), type: -335, require: true, default: {level: "date", value: ["custom", null]}},
                    {key: "company", localid: 'type_emulation_and_reward_company', name: LanguageModule.text("txt_company"), type: -1, default: "", require: true},
                    {key: "content", localid: 'type_emulation_and_reward_content', name: LanguageModule.text("txt_content"), type: -2, default: "", require: true},
                    {key: "attachments", localid: "type_emulation_and_reward_attachments", name: LanguageModule.text("txt_attachments"), type: -64}
                ]
            }
        },
        {
            id: - 327, name: LanguageModule.text("txt_discipline"), type: "discipline", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_discipline_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "reference_number", localid: 'type_discipline_reference_number', name: LanguageModule.text("txt_reference_number"), type: -1, default: "", require: true},
                    {key: "date", localid: 'type_discipline_date', name: LanguageModule.text("txt_time"), type: -335, require: true, default: {level: "date", value: ["custom", null]}},
                    {key: "company", localid: 'type_discipline_company', name: LanguageModule.text("txt_company"), type: -1, default: "", require: true},
                    {key: "content", localid: 'type_discipline_content', name: LanguageModule.text("txt_content"), type: -2, default: "", require: true},
                    {key: "attachments", localid: "type_discipline_attachments", name: LanguageModule.text("txt_attachments"), type: -64}
                ]
            }
        },
        {
            id: - 328, name: LanguageModule.text("txt_emulation_and_reward_table"), type: "array", notPri: true,
            content: {
                typeof: -326
            }
        },
        {
            id: - 329, name: LanguageModule.text("txt_discipline_table"), type: "array", notPri: true,
            content: {
                typeof: -327
            }
        },
        {
            id: - 330, name: LanguageModule.text("txt_work_history_table"), type: "array", notPri: true,
            content: {
                typeof: -158
            }
        },
        {
            id: - 331, name: LanguageModule.text("txt_family_member_table"), type: "array", notPri: true,
            content: {
                typeof: -21
            }
        },
        {
            id: - 332, name: LanguageModule.text("txt_education_history_table"), type: "array", notPri: true,
            content: {
                typeof: -154
            }
        },
        {
            id: - 333, name: LanguageModule.text("txt_employee_profile"), type: "employee_profile", type2: "structure",
            content: {
                details: [
                    {key: "picture", localid: 'type_employee_profile_picture', name: LanguageModule.text("txt_picture"), type: -32, require: true},
                    {key: "name", localid: 'type_employee_profile_name', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "dayofbirth", localid: 'type_employee_profile_day_of_birth', name: LanguageModule.text("txt_day_of_birth"), type: -4, default: ["custom", null], require: false},
                    {key: "placeofbirth", localid: 'type_employee_profile_day_of_place', name: LanguageModule.text("txt_place_of_birth"), type: -1, require: false},
                    {key: "sex", localid: 'type_employee_profile_sex', name: LanguageModule.text("txt_sex"), type: -40, require: false},
                    {key: "ethnic", localid: 'type_employee_profile_ethnic', name: LanguageModule.text("txt_ethnic"), type: -16, require: false},
                    {key: "religion", localid: 'type_employee_profile_religion', name: LanguageModule.text("txt_religion"), type: -22, require: false},
                    {key: "hometown", localid: 'type_employee_profile_hometown', name: LanguageModule.text("txt_hometown"), type: -1, require: false},
                    {key: "permanent_address", localid: 'type_employee_profile_permanent_address', name: LanguageModule.text("txt_permanent_address"), type: -1, require: false},
                    {key: "temporary_address", localid: 'type_employee_profile_temporary_address', name: LanguageModule.text("txt_temporary_address"), type: -1, require: false},
                    {key: "recruiment_date", localid: 'type_employee_profile_recruiment_date', name: LanguageModule.text("txt_recruiment_date"), type: -4, default: ["custom", null], require: false},
                    {key: "official_date", localid: 'type_employee_profile_official_date', name: LanguageModule.text("txt_official_start_date_of_work"), type: -4, default: ["custom", null], require: false},
                    {key: "position", localid: 'type_employee_profile_position', name: LanguageModule.text("txt_position"), type: -296, require: false},
                    {key: "concurrent_position", localid: 'type_employee_profile_concurrent_position', name: LanguageModule.text("txt_concurrent_position"), type: -296, require: false},
                    {key: "education_history", localid: 'type_employee_profile_education_history', name: LanguageModule.text("txt_education_history"), type: -332, require: false},
                    {key: "emulation_reward", localid: 'type_employee_profile_emulation_reward', name: LanguageModule.text("txt_emulation_and_reward"), type: -328, require: false},
                    {key: "discipline", localid: 'type_employee_profile_discipline', name: LanguageModule.text("txt_discipline"), type: -329, require: false},
                    {key: "nationalidno", localid: 'type_employee_profile_nationalidno', name: LanguageModule.text("txt_nation_id_number"), type: -1, require: false},
                    {key: "nationalidno_date", localid: 'type_employee_profile_nationalidno_date', name: LanguageModule.text("txt_date_of_issue"), type: -4, default: ["custom", null], require: false},
                    {key: "nationalidno_place", localid: 'type_employee_profile_nationalidno_place', name: LanguageModule.text("txt_place_of_issue"), type: -1, require: false},
                    {key: "social_security_number", localid: 'type_employee_profile_social_security_number', name: LanguageModule.text("txt_social_security_number"), type: -1, require: false},
                    {key: "work_history", localid: 'type_employee_profile_work_history', name: LanguageModule.text("txt_work_history"), type: -330, require: false},
                    {key: "family_members", localid: 'type_employee_profile_family_members', name: LanguageModule.text("txt_family_member"), type: -331, require: false},
                    {key: "signature", localid: 'type_employee_profile_signature', name: LanguageModule.text("txt_signature"), type: -47, require: false}
                ]
            }
        },
        {id: -334, name: LanguageModule.text("txt_holiday_time_off_type"), type: 'enum',
            content: {
                typeof: -1,
                details: [
                    {key: "holiday", value: "holiday", localid: "holiday", text: LanguageModule.text("txt_holiday")},
                    {key: "compensatory_leave", value: "compensatory_leave", localid: "compensatory_leave", text: LanguageModule.text("txt_compensatory_leave")}
                ]
            }
        },
        {
            id: -335, name: LanguageModule.text("txt_date_level"), type: "date_level", stt: 3
        },
        {id: -336, name: LanguageModule.text("txt_days_off_schedule_time_off_type"), type: 'enum',
            content: {
                typeof: -1,
                details: [
                    {key: "cl", value: "cl", localid: "cl", text: LanguageModule.text("txt_compensatory_leave")},
                    {key: "hrp", value: "hrp", localid: "hrp", text: LanguageModule.text("txt_human_resource_policy")}
                ]
            }
        },
        {
            id: -337, name: LanguageModule.text("txt_days_off_schedule"), type: "days_off_schedule", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {
                        key: "type", localid: 'type_days_off_schedule_time_off_type', name: LanguageModule.text("txt_time_off_type"), type: "union", typeOfUnion: -336, require: true,
                        detailUnion: {
                            cl: [],
                            hrp: [
                                {key: "policyid", localid: 'type_days_off_schedule_policy', name: LanguageModule.text("txt_leave_policy"), type: -142, default: 0, require: true}
                            ]
                        }
                    },
                    {key: "employee", localid: "type_days_off_schedule_employee", name: LanguageModule.text("txt_employee"), type: -48, require: true},
                    {key: "date_from", localid: "type_days_off_schedule_date_from", name: LanguageModule.text("txt_date_from"), type: -4, require: true, default: ["today", ""]},
                    {key: "date_to", localid: "type_days_off_schedule_date_to", name: LanguageModule.text("txt_date_to"), type: -4, require: true, default: ["today", ""]},
                    {key: "days_portion", localid: "type_days_off_schedule_days_portion", name: LanguageModule.text("txt_day_portion"), type: -192, default: "full_workday"},
                    {key: "time_period", localid: "type_days_off_schedule_time_period", name: LanguageModule.text("txt_time"), type: -136, require: false}
                ]
            }
        },
        {id: -338, name: LanguageModule.text("txt_select_pay_percentage"), type: 'member_of_pay_percentage', type2: "enum"},
        {
            id: - 339, name: LanguageModule.text("txt_position_groups"), type: "position_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_position_groups_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: false},
                    {key: "code", localid: 'type_position_groups_code', name: LanguageModule.text("txt_code"), type: -1, default: '', require: true}
                ]
            }
        },
        {id: -340, name: LanguageModule.text("txt_select_position_groups"), type: 'member_of_position_groups', type2: "enum"},
        {
            id: - 341, name: LanguageModule.text("txt_attendance_clock_policy_group"), type: "attendance_clock_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_attendance_clock_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_attendance_clock_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_attendance_clock_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -342, name: LanguageModule.text("txt_select_attendance_clock_policy_group"), type: 'member_of_attendance_clock_policy_groups', type2: "enum"},
        {
            id: - 343, name: LanguageModule.text("txt_attendance_clock_policy"), type: "attendance_clock_policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_attendance_clock_policy_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_attendance_clock_policy_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "groupid", localid: 'type_attendance_clock_policy_groupid', name: LanguageModule.text("txt_policy_group"), type: -342, default: 0, require: true},
                    {key: "available", localid: 'type_attendance_clock_policy_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -344, name: LanguageModule.text("txt_select_attendance_clock_policies"), type: 'member_of_attendance_clock_policies', type2: "enum"},
        {
            id: - 345, name: LanguageModule.text("txt_attendance_clock_policies_applied_to_employee"), type: "attendance_clock_policies_applied_to_employee", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_attendance_clock_policies_applied_to_employee_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "policyid", localid: 'type_attendance_clock_policies_applied_to_employee_policyid', name: LanguageModule.text("txt_policy"), type: -344, default: 0, require: true},
                    {key: "description", localid: 'type_attendance_clock_policies_applied_to_employee_description', name: LanguageModule.text("txt_description"), type: -2, default: "", require: false}
                ]
            }
        },
        {
            id: - 346, name: LanguageModule.text("txt_advance_payment_list"), type: "advance_payment_list", type2: "structure",
            content: {
                details: [
                    {key: "cycleid", localid: 'type_advance_payment_list_cycleid', name: LanguageModule.text("txt_payroll_cycle"), type: -266, default: 0, require: true},
                    {key: "policyid", localid: 'type_advance_payment_list_policyid', name: LanguageModule.text("txt_policy"), type: -147, default: 0, require: true},
                    {key: "payroll_date_month", localid: 'type_advance_payment_list_payroll_date_month', name: LanguageModule.text("txt_payroll_date"), type: -267, require: false},
                    {key: "payroll_date_week", localid: 'type_advance_payment_list_payroll_date_week', name: LanguageModule.text("txt_payroll_date"), type: -268, require: false},
                    {key: "name", localid: 'type_advance_payment_list_name', name: LanguageModule.text("txt_name"), type: -1, default: "", require: true},
                    {key: "reference_number", localid: 'type_advance_payment_list_reference_number', name: LanguageModule.text("txt_reference_number"), type: -1, default: "", require: true},
                    {key: "reference_date", localid: 'type_advance_payment_list_reference_date', name: LanguageModule.text("txt_reference_date"), type: -4, default: ["today", ""], require: true}
                ]
            }
        },
        {
            id: - 347, name: LanguageModule.text("txt_advance_payment_list_details"), type: "advance_payment_list_details", type2: "structure",
            content: {
                details: [
                    {key: "employeeid", localid: 'type_advance_payment_list_details_employeeid', name: LanguageModule.text("txt_employee"), type: -47, default: 0, require: true},
                    {key: "amount", localid: 'type_advance_payment_list_details_amount', name: LanguageModule.text("txt_amount") + " ($)", type: -118, require: true},
                    {key: "comment", localid: 'type_advance_payment_list_details_comment', name: LanguageModule.text("txt_note"), type: -2, require: false}
                ]
            }
        },
        {
            id: - 348, name: LanguageModule.text("txt_asset_status"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "good", value: "good", localid: "good", text: LanguageModule.text("txt_good")},
                    {key: "liquidate", value: "liquidate", localid: "liquidate", text: LanguageModule.text("txt_liquidated")},
                    {key: "missing", value: "missing", localid: "missing", text: LanguageModule.text("txt_missing")},
                    {key: "broken", value: "broken", localid: "broken", text: LanguageModule.text("txt_broken")}
                ]
            }
        },
        {
            id: - 349, name: LanguageModule.text("txt_checkin_method"), type: "enum",
            content: {
                typeof: -1,
                details: [
                    {key: "worktime_machine", value: "worktime_machine", localid: "worktime_machine", text: LanguageModule.text("txt_worktime_machine")},
                    {key: "other", value: "other", localid: "other", text: LanguageModule.text("txt_other")}
                ]
            }
        },
        {
            id: - 350, name: LanguageModule.text("txt_other_policy_group"), type: "other_policy_groups", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_other_policy_group_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "description", localid: 'type_other_policy_group_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_other_policy_group_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -351, name: "Chọn nhóm chính sách khác", type: 'member_of_other_policy_groups', type2: "enum"},
        {
            id: - 352, name: LanguageModule.text("txt_policies"), type: "policies", type2: "structure",
            content: {
                details: [
                    {key: "name", localid: 'type_policies_name', name: LanguageModule.text("txt_name"), type: -1, default: '', require: true},
                    {key: "symbol", localid: 'type_policies_symbol', name: LanguageModule.text("txt_symbol"), type: -1, default: '', require: true},
                    {key: "groupid", localid: 'type_policies_groupid', name: LanguageModule.text("txt_policy_group"), type: -351, default: '', require: false},
                    {key: "apply_for", localid: 'type_policies_apply_for', name: LanguageModule.text("txt_employee_apply"), type: -48, default: '', require: false},
                    {key: "description", localid: 'type_policies_description', name: LanguageModule.text("txt_description"), type: -2, default: '', require: false},
                    {key: "available", localid: 'type_policies_active', name: LanguageModule.text("txt_active"), type: -6, default: true, require: false}
                ]
            }
        },
        {id: -353, name: "Chọn chính sách", type: 'member_of_policies', type2: "enum"},
        {
            id: - 354, name: LanguageModule.text("txt_employee_personal_information"), type: "employee_personal_information", type2: "structure", isnotFieldofStructure: true,
            content: {
                details: [
                    {key: "image", localid: "type_employee_personal_information_image", name: LanguageModule.text("txt_employee_image"), type: -32, require: true},
                    {key: "phone_1", localid: "type_employee_personal_information_phone_1", name: LanguageModule.text("txt_phone_1"), type: -10, default: "", require: false},
                    {key: "phone_2", localid: "type_employee_personal_information_phone_2", name: LanguageModule.text("txt_phone_2"), type: -10, default: "", require: false},
                    {key: "private_email", localid: "type_employee_personal_information_private_email", name: LanguageModule.text("txt_private_email"), type: -7, default: "", require: false},
                    {key: "social_network", localid: "type_employee_personal_information_social_network", name: LanguageModule.text("txt_social_network"), type: -238, default: "", require: false},
                    {key: "dayofbirth", localid: "type_employee_personal_information_dayofbirth", name: LanguageModule.text("txt_day_of_birth"), type: -4, default: ["custom", null], require: true},
                    {key: "placeofbirth", localid: "type_employee_personal_information_placeofbirth", name: LanguageModule.text("txt_place_of_birth"), type: -1, default: "", require: false},
                    {key: "sex", localid: "type_employee_personal_information_sex", name: LanguageModule.text("txt_sex"), type: -40, default: 0, require: false},
                    {key: "marital_status", localid: "type_employee_personal_information_marital_status", name: LanguageModule.text("txt_marital_status"), type: -39, default: 0, require: false},
                    {key: "religion", localid: "type_employee_personal_information_religion", name: LanguageModule.text("txt_religion"), type: -22, default: 0, require: false},
                    {key: "ethnic", localid: "type_employee_personal_information_ethnic", name: LanguageModule.text("txt_ethnic"), type: -16, default: 0, require: false},
                    {key: "hometown", localid: "type_employee_personal_information_hometown", name: LanguageModule.text("txt_hometown"), type: -1, require: false},
                    {key: "permanent_address", localid: "type_employee_personal_information_permanent_address", name: LanguageModule.text("txt_permanent_address"), type: -1, require: false},
                    {key: "permanent_nation_city", localid: "type_employee_personal_information_permanent_nation_city", name: LanguageModule.text("txt_permanent_nation_city"), type: -207, default: 0, require: false},
                    {key: "temporary_address", localid: "type_employee_personal_information_temporary_address", name: LanguageModule.text("txt_temporary_address"), type: -1, require: false},
                    {key: "temporary_nation_city", localid: "type_employee_personal_information_temporary_nation_city", name: LanguageModule.text("txt_temporary_nation_city"), type: -207, default: 0, require: false},
                    {key: "personal_tax_code", localid: "type_employee_personal_information_personal_tax_code", name: LanguageModule.text("txt_personal_tax_code"), type: -1, default: "", require: false},
                    {key: "personal_income_tax_relief", localid: "type_employee_personal_information_personal_income_tax_relief", name: LanguageModule.text("txt_personal_income_tax_relief"), type: -6, default: false, require: false},
                    {key: "number_of_dependent_persons", localid: "type_employee_personal_information_number_of_dependent_persons", name: LanguageModule.text("txt_number_of_dependent_persons"), type: -3, default: 0, require: false},
                    {key: "social_security_number", localid: "type_employee_personal_information_social_security_number", name: LanguageModule.text("txt_social_security_number"), type: -1, default: "", require: false},
                    {key: "social_insurance_date", localid: "type_employee_personal_information_social_insurance_date", name: LanguageModule.text("txt_social_insurance_date"), type: -4, default: ["custom", null], require: false},
                    {key: "place_of_social_insurance", localid: "type_employee_personal_information_place_of_social_insurance", name: LanguageModule.text("txt_place_of_social_insurance"), type: -1, default: "", require: false},
                    {key: "emergency_contact", localid: "type_employee_personal_information_emergency_contact", name: LanguageModule.text("txt_emergency_contact"), type: -2, default: "", require: false},
                    {key: "reference", localid: "type_employee_personal_information_reference", name: LanguageModule.text("txt_reference"), type: -2, default: "", require: false},
                    {key: "bank_account_number", localid: "type_employee_personal_information_bank_account_number", name: LanguageModule.text("txt_bank_account_number"), type: -1, require: false},
                    {key: "bank_account_holder_name", localid: "type_employee_personal_information_bank_account_holder_name", name: LanguageModule.text("txt_account_holder_name"), type: -1, require: false},
                    {key: "bank_name", localid: "type_employee_personal_information_bank_name", name: LanguageModule.text("txt_bank_name"), type: -1, require: false},
                    {key: "bank_agency", localid: "type_employee_personal_information_bank_agency", name: LanguageModule.text("txt_agency"), type: -1, require: false}
                ]
            }
        }
    ];
    for (var i = 0; i < typelists.length; i++){
        typelists[i].userid = systemconfig.userid;
        typelists[i].available = 1;
    }
    return typelists;
};

contentModule.datatypeAdvanced = ["array", "enum", "enum_multi", "structure", "extends_structure", "extends_enum", "extends_enum_multi", "treetable"];
contentModule.getDatatypeAdvancedList = function(){
    var typelists = [
        {id: -1000, name: LanguageModule.text("txt_enum"), type: "enum", stt: 8},
        {id: -1001, name: LanguageModule.text("txt_array"), type: "array", stt: 10},
        {id: -1001, name: "Treetable", type: "treetable", stt: 11},
        {id: -1002, name: LanguageModule.text("txt_structure"), type: "structure", stt: 11},
        {id: -1003, name: LanguageModule.text("txt_extends"), type: "extends", stt: 12},
        {id: -1004, name: LanguageModule.text("txt_enum_multi_select"), type: "enum_multi", stt: 9}
    ];
    for (var i = 0; i < typelists.length; i++){
        typelists[i].userid = systemconfig.userid;
        typelists[i].available = 1;
    }
    return typelists;
};

contentModule.dataTypeOfExtends = ["enum", "structure", "extends_structure", "extends_enum", "enum_multi", "extends_enum_multi"];

contentModule.getTypeName = function(type){
    if (type == "enum") return LanguageModule.text("txt_enum");
    if (type == "extends_enum" || type == "extends_structure" || type == "extends_enum_multi") return LanguageModule.text("txt_extends");
    var a = contentModule.getDatatypePrimitiveList();
    var b = contentModule.getDatatypeAdvancedList();
    var list = a.concat(b);
    for (var i = 0; i < list.length; i++){
        if (list[i].notPri) continue;
        if (list[i].type == type) return list[i].name;
    }
    return "-";
};
contentModule.getDescendantsId = function(host, item){
    var typelists;
    if (host && host.database && host.database.typelists) typelists = host.database.typelists;
    else typelists = data_module.typelists;
    if (item.descendanIdList !== undefined) return item.descendanIdList;
    item.descendanIdList = [];
    if (contentModule.datatypeAdvanced.indexOf(item.type) < 0) return item.descendanIdList;
    switch (item.type) {
        case "array":
        case "treetable":
            item.descendanIdList.push(item.content.typeof);
            var index = typelists.getIndex(item.content.typeof);
            if (index < 0) return item.descendanIdList;
            item.descendanIdList = item.descendanIdList.concat(contentModule.getDescendantsId(host, typelists.items[index]));
            break;
        case "enum":
        case "enum_multi":
            item.descendanIdList.push(item.content.typeof);
            var index = typelists.getIndex(item.content.typeof);
            if (index < 0) return item.descendanIdList;
            item.descendanIdList = item.descendanIdList.concat(contentModule.getDescendantsId(host, typelists.items[index]));
            break;
        case "structure":
            var index;
            for (var i = 0; i < item.content.details.length; i++){
                item.descendanIdList.push(item.content.details[i].type);
                index = typelists.getIndex(item.content.details[i].type);
                if (index < 0) continue;
                item.descendanIdList = item.descendanIdList.concat(contentModule.getDescendantsId(host, typelists.items[index]));
            }
            break;
        case "extends_enum":
        case "extends_enum_multi":
            item.descendanIdList.push(item.content.typeof);
            var index = typelists.getIndex(item.content.typeof);
            if (index < 0) return item.descendanIdList;
            item.descendanIdList = item.descendanIdList.concat(contentModule.getDescendantsId(host, typelists.items[index]));
            break;
        case "extends_structure":
            item.descendanIdList.push(item.content.typeof);
            var index = typelists.getIndex(item.content.typeof);
            if (index < 0) return item.descendanIdList;
            item.descendanIdList = item.descendanIdList.concat(contentModule.getDescendantsId(host, typelists.items[index]));
            for (var i = 0; i < item.content.details.length; i++){
                item.descendanIdList.push(item.content.details[i].type);
                index = typelists.getIndex(item.content.details[i].type);
                if (index < 0) continue;
                item.descendanIdList = item.descendanIdList.concat(contentModule.getDescendantsId(host, typelists.items[index]));
            }
            break;
        default:
            break;
    }
    return item.descendanIdList;
};

contentModule.makeDescendantsIdListDataType = function(host){
    for (var i = 0; i < host.database.typelists.items.length; i++){
        delete host.database.typelists.items[i].descendanIdList;
        contentModule.getDescendantsId(host, host.database.typelists.items[i]);
    }
};

contentModule.makeDataTypeDecode = function(item){
    if (item.extrainfo && item.extrainfo != ""){
        if (EncodingClass.type.isString(item.extrainfo)){
            item.extrainfo = EncodingClass.string.toVariable(item.extrainfo);
        }
        else {
            item.extrainfo = {
                decpre: 2,
                comment: ""
            };
        }
    }
    else item.extrainfo = {
        decpre: 2,
        comment: ""
    };
    if (contentModule.datatypeAdvanced.indexOf(item.type) >= 0 && EncodingClass.type.isString(item.content)) {
        item.content = EncodingClass.string.toVariable(item.content);
    }
};

contentModule.getLeave_policy_groupsListPri = function(){
    return [
        {id: -1, name: LanguageModule.text("txt_annual_leave"), description: "", symbol: "P", available: 1, extrainfo: {}, ver: 1},
        {id: -2, name: LanguageModule.text("txt_business_trip"), description: "", symbol: "CT", available: 1, extrainfo: {}, ver: 1}
    ];
};

contentModule.getAllowance_policy_groupsListPri = function(){
    return [
        {id: -1, name: LanguageModule.text("txt_general"), description: "", available: 1, extrainfo: {}, ver: 1},
        {id: -2, name: LanguageModule.text("txt_meals"), description: "", available: 1, extrainfo: {}, ver: 1}
    ];
};

contentModule.getEmployment_contract_typesListPri = function(){
    return [
        {id: -1, name: LanguageModule.text("txt_permanent"), description: "", available: 1, extrainfo: {}, ver: 1},
        {id: -2, name: LanguageModule.text("txt_temporary"), description: "", available: 1, extrainfo: {}, ver: 1},
        {id: -3, name: LanguageModule.text("txt_probationary"), description: "", available: 1, extrainfo: {}, ver: 1},
        {id: -4, name: LanguageModule.text("txt_casual"), description: "", available: 1, extrainfo: {}, ver: 1}
    ];
};

contentModule.getAdvance_payment_policy_groupsListPri = function(){
    return [
        {id: -1, name: LanguageModule.text("txt_salary_advance"), description: "", available: 1, extrainfo: {}, ver: 1}
    ];
};

contentModule.getReligionsListPri = function(){
    return [
        {id: -1, code: "N", name: LanguageModule.text("txt_none"), available: 1, extrainfo: {}, ver: 1},
        {id: -2, code: "CRIS", name: LanguageModule.text("txt_christianity"), available: 1, extrainfo: {}, ver: 1},
        {id: -3, code: "MUSM", name: LanguageModule.text("txt_muslim"), available: 1, extrainfo: {}, ver: 1},
        {id: -4, code: "BUDD", name: LanguageModule.text("txt_buddist"), available: 1, extrainfo: {}, ver: 1},
        {id: -5, code: "CATH", name: LanguageModule.text("txt_catholic"), available: 1, extrainfo: {}, ver: 1}
    ];
};

contentModule.getPayPercentageListPri = function(){
    return [
        {id: -1, name: "RT100", percentage: 100, available: 1, extrainfo: {}, ver: 1, comment: "Regular time"},
        {id: -8, name: "HT100", percentage: 100, available: 1, extrainfo: {}, ver: 1, comment: "Holiday time"},
        {id: -9, name: "LT100", percentage: 100, available: 1, extrainfo: {}, ver: 1, comment: "Leave time"},
        {id: -2, name: "OT150", percentage: 150, available: 1, extrainfo: {}, ver: 1, comment: "Overtime"},
        {id: -3, name: "OT200", percentage: 200, available: 1, extrainfo: {}, ver: 1, comment: "Overtime"},
        {id: -4, name: "OT250", percentage: 250, available: 1, extrainfo: {}, ver: 1, comment: "Overtime"},
        {id: -5, name: "OT300", percentage: 300, available: 1, extrainfo: {}, ver: 1, comment: "Overtime"},
        {id: -6, name: "OT350", percentage: 350, available: 1, extrainfo: {}, ver: 1, comment: "Overtime"},
        {id: -7, name: "OT400", percentage: 400, available: 1, extrainfo: {}, ver: 1, comment: "Overtime"}
    ];
};

contentModule.getOffboardingTypesListPri = function(){
    return [
        {id: -1, name: LanguageModule.text("txt_resignation"), available: 1, extrainfo: {}, ver: 1},
        {id: -2, name: LanguageModule.text("txt_layoff"), available: 1, extrainfo: {}, ver: 1},
        {id: -3, name: LanguageModule.text("txt_retirement"), available: 1, extrainfo: {}, ver: 1},
        {id: -4, name: LanguageModule.text("txt_end_of_contract"), available: 1, extrainfo: {}, ver: 1}
    ];
};

contentModule.preventNotNumberInput = function(elt) {
    function getCaretPosition(oField) {
        var iCaretPos = 0;
        if (document.selection) {
            oField.focus();
            var oSel = document.selection.createRange();
            oSel.moveStart('character', -oField.value.length);
            iCaretPos = oSel.text.length;
        }
        else if (oField.selectionStart || oField.selectionStart == '0')
            iCaretPos = oField.selectionDirection == 'backward' ? oField.selectionStart : oField.selectionEnd;
        return iCaretPos;
    }

    elt.addEventListener("paste", function (e) {
        e.preventDefault();
        var text = "";
        if (e.clipboardData && e.clipboardData.getData) {
            text = e.clipboardData.getData("text/plain");

        } else if (window.clipboardData && window.clipboardData.getData) {
            text = window.clipboardData.getData("Text");
        }
        var matched = text.match(/[+-]?([0-9,]*[.])?[0-9,]+/);
        if (matched) {
            this.value = matched[0];
        }
    });
    elt.addEventListener('keydown', function (event) {
        var key = event.key;
        if (key && key.length == 1 && !event.ctrlKey && !event.altKey) {
            if (key.match(/[0-9,.\-\+]/)) {
                if (key == '.' && this.value.indexOf('.') >= 0) event.preventDefault();
                if ((key == '+' || key == '-') && (this.value.indexOf('+') >= 0 || this.value.indexOf('-') >= 0 || getCaretPosition(this) > 0)) event.preventDefault();
            }
            else event.preventDefault();
        }
    });
    return elt;
};

contentModule.makeCitiesIndex = function(host){
    var k, t = [];
    var nData;
    var holderForSort = host.database.nations.items.map(function(item){
        nData = data_module.getContent("nations", item.id);
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(nData.shortname.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });

    host.database.nations.items = holderForSort.map(function(holder){
        return holder.item;
    });
    holderForSort = host.database.cities.items.map(function(item){
        nData = data_module.getContent("cities", item.id);
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(nData.name.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });

    host.database.cities.items = holderForSort.map(function(holder){
        return holder.item;
    });
    holderForSort = null;
    for (var i = 0; i < host.database.nations.items.length; i++){
        host.database.nations.items[i].cityIndexList = [];
    }
    var nationsDic = contentModule.makeDictionaryIndex(host.database.nations.items);
    for (var i = 0; i < host.database.cities.items.length; i++){
        host.database.cities.items[i].nationIndex = k = nationsDic[host.database.cities.items[i].nationid];
        if (k !== undefined){
            host.database.nations.items[k].cityIndexList.push(t.length);
            t.push(host.database.cities.items[i]);
        }
    }
    nationsDic = null;
    host.database.cities.items = t;
};

contentModule.preventNotPhoneNumberInput = function(elt) {
    elt.addEventListener("paste", function (e) {
        e.preventDefault();
        var text = "";
        if (e.clipboardData && e.clipboardData.getData) {
            text = e.clipboardData.getData("text/plain");

        } else if (window.clipboardData && window.clipboardData.getData) {
            text = window.clipboardData.getData("Text");
        }
        text = text.replace(/[^0-9\-+\s\.]/g, '');
        var slstart = elt.selectionStart;
        var slend = elt.selectionEnd;
        var value = this.value +'';
        value = value.substr(0, slstart)+ text+ value.substr(slend);
        this.value = value;
        elt.setSelectionRange(slstart + text.length, slstart+ text.length);
    });
    elt.addEventListener('keydown', function (event) {
        var key = event.key;
        if (key && key.length == 1 && !event.ctrlKey && !event.altKey) {
            if (key.match(/[^0-9\-+\s\.]/)) {
               event.preventDefault();
            }
        }
    });
    return elt;
};

contentModule.getPayPercentageListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.pay_percentage.items.length; i++){
        list.push({
            value: host.database.pay_percentage.items[i].id,
            text: host.database.pay_percentage.items[i].name + " - " + host.database.pay_percentage.items[i].percentage + "%"
        });
    }
    return list;
};

contentModule.getNationsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    if (host){
        for (var i = 0; i < host.database.nations.items.length; i++){
            list.push({
                value: host.database.nations.items[i].id,
                text: host.database.nations.items[i].shortname + " - " + host.database.nations.items[i].fullname
            });
        }
    }
    else {
        var idList = data_module.getIDList("nations");
        var nData;
        for (var i = 0; i < idList.length; i++){
            nData = data_module.getContent("nations", idList[i]);
            list.push({
                value: nData.id,
                text: nData.shortname + " - " + nData.fullname
            });
        }
    }
    return list;
};

contentModule.getLanguageListSelectMenu = function(){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < data_module.languages.items.length; i++){
        list.push({
            value: data_module.languages.items[i].id,
            text: data_module.languages.items[i].name,
            key: data_module.languages.items[i].key
        });
    }
    return list;
};

contentModule.getCitiesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.cities.items.length; i++){
        list.push({
            value: host.database.cities.items[i].id,
            text: host.database.cities.items[i].name
        });
    }
    return list;
};

contentModule.getEthnicsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.ethnics.items.length; i++){
        list.push({
            value: host.database.ethnics.items[i].id,
            text: host.database.ethnics.items[i].name
        });
    }
    return list;
};

contentModule.getReligionsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.religions.items.length; i++){
        list.push({
            value: host.database.religions.items[i].id,
            text: host.database.religions.items[i].name
        });
    }
    return list;
};

contentModule.getUsersListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.users.items.length; i++){
        list.push({
            value: host.database.users.items[i].homeid,
            text: host.database.users.items[i].username + " - " + host.database.users.items[i].fullname
        });
    }
    return list;
};

contentModule.getUsersListSelectBox = function(host){
    var list = [];
    for (var i = 0; i < host.database.users.items.length; i++){
        list.push({
            value: host.database.users.items[i].homeid,
            text: host.database.users.items[i].username + " - " + host.database.users.items[i].fullname
        });
    }
    return list;
};

contentModule.getPositionsListSelectBox = function(host){
    var list = [];
    for (var i = 0; i < host.database.positions.items.length; i++){
        list.push({
            value: host.database.positions.items[i].id,
            text: host.database.positions.items[i].name
        });
    }
    return list;
};

contentModule.getGeoposListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.geopos.items.length; i++){
        list.push({
            value: host.database.geopos.items[i].id,
            text: host.database.geopos.items[i].name
        });
    }
    return list;
};

contentModule.getGeoposListSelectBox = function(host){
    var list = [];
    for (var i = 0; i < host.database.geopos.items.length; i++){
        list.push({
            value: host.database.geopos.items[i].id,
            text: host.database.geopos.items[i].name
        });
    }
    return list;
};

contentModule.getPositionsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.positions.items.length; i++){
        list.push({
            value: host.database.positions.items[i].id,
            text: host.database.positions.items[i].name
        });
    }
    return list;
};

contentModule.getEmployeesListSelectMenu = function(host){
    var pDict = {};
    host.database.peoples.items.forEach(function(elt){
        pDict[elt.id] = elt;
    });
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.employees.items.length; i++){
        if (!host.database.employees.items[i].available) continue;
        list.push({
            value: host.database.employees.items[i].id,
            text: pDict[host.database.employees.items[i].peopleid].fullname
        });
    }
    return list;
};

contentModule.getEmployeesListMultiSelectMenu = function(host){
    var pDict = {};
    host.database.peoples.items.forEach(function(elt){
        pDict[elt.id] = elt;
    });
    var list = [];
    for (var i = 0; i < host.database.employees.items.length; i++){
        if (!host.database.employees.items[i].available) continue;
        list.push({
            value: host.database.employees.items[i].id,
            text: pDict[host.database.employees.items[i].peopleid].fullname
        });
    }
    return list;
};

contentModule.getDepartmentLink = function(host, departmentid){
    var dict = {};
    for (var i = 0; i < host.database.orgs.items.length; i++){
        dict[host.database.orgs.items[i].id] = host.database.orgs.items[i];
    }
    var str = "";
    if (!dict[departmentid]) return "";
    while (dict[departmentid].parentid != 0){
        if (str == "") str = dict[departmentid].name;
        else {
            str = dict[departmentid].name + "/" + str;
        }
        departmentid = dict[departmentid].parentid;
    }
    if (str == "") str = dict[departmentid].name;
    else str = dict[departmentid].name + "/" + str;
    return str;
};

contentModule.makeOrgsIndex = function(host){
    var k, t = [];
    var holderForSort = host.database.orgs.items.map(function(item){
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.name.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });
    host.database.orgs.items = holderForSort.map(function(holder){
        return holder.item;
    });

    for (var i = 0; i < host.database.orgs.items.length; i++){
        host.database.orgs.items[i].childIndexList = [];
    }
    var orgDic = contentModule.makeDictionaryIndex(host.database.orgs.items);
    var k;
    for (var i = 0; i < host.database.orgs.items.length; i++){
        if (host.database.orgs.items[i].parentid == 0) continue;
        k = orgDic[host.database.orgs.items[i].parentid];
        if (k !== undefined) host.database.orgs.items[k].childIndexList.push(i);
    }
};

contentModule.makePositionsIndex = function(host){
    var k, t = [];
    var holderForSort = host.database.positions.items.map(function(item){
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.name.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });
    host.database.positions.items = holderForSort.map(function(holder){
        return holder.item;
    });

    for (var i = 0; i < host.database.orgs.items.length; i++){
        host.database.orgs.items[i].positionIndexList = [];
    }
    var orgDic = contentModule.makeDictionaryIndex(host.database.orgs.items);
    var k;
    for (var i = 0; i < host.database.positions.items.length; i++){
        k = orgDic[host.database.positions.items[i].orgid];
        if (k !== undefined) host.database.orgs.items[k].positionIndexList.push(i);
    }
};

contentModule.makeEmployeesIndex = function(host){
    var k, t = [];
    var holderForSort = host.database.employees.items.map(function(item){
        if (!item.fullname || !EncodingClass.type.isString(item.fullname)){
            contentModule.reportBug({
                filename: "employee not fullname",
                data: EncodingClass.string.fromVariable({
                    fullname: item.fullname,
                    peopleid: item.peopleid,
                    peopleData: data_module.getContent("peoples", item.peopleid)
                })
            });
            item.orgid = 0;
            return {
                item: item,
                value: ""
            };
        }
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.fullname.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });
    host.database.employees.items = holderForSort.map(function(holder){
        return holder.item;
    });

    for (var i = 0; i < host.database.orgs.items.length; i++){
        host.database.orgs.items[i].employeeIndexList = [];
        host.database.orgs.items[i].employeeIdList = [];
    }
    var orgDic = contentModule.makeDictionaryIndex(host.database.orgs.items);
    var k;
    var t = [];
    for (var i = 0; i < host.database.employees.items.length; i++){
        k = orgDic[host.database.employees.items[i].orgid];
        host.database.employees.items[i].orgIndex = k;
        if (k !== undefined){
            host.database.orgs.items[k].employeeIndexList.push(t.length);
            host.database.orgs.items[k].employeeIdList.push(host.database.employees.items[i].id);
            t.push(host.database.employees.items[i]);
        }
    }
    host.database.employees.items = t;
};

contentModule.getOrgsListSelectTreeMenu = function(host, ps = {}){
    var noSelectDic = {};
    if (ps.noSelectDic) noSelectDic = ps.noSelectDic;
    function getOrgItem(index){
        var items = [], ni;
        for (var i = 0; i < host.database.orgs.items[index].childIndexList.length; i++){
            ni = host.database.orgs.items[index].childIndexList[i];
            if (host.orgViewDic && !host.orgViewDic[host.database.orgs.items[ni].id]) continue;
            items.push(getOrgItem(ni));
        }
        var res = {
            value: host.database.orgs.items[index].id,
            text: host.database.orgs.items[index].name,
            noSelect: (host.orgEditDic && !host.orgEditDic[host.database.orgs.items[index].id]) || noSelectDic[host.database.orgs.items[index].id],
            icon: {tag:'span', class: (host.database.orgs.items[index].parentid == 0)? ['mdi', 'mdi-home-variant'] : ['mdi', 'mdi-folder-account']},
            items: items
        };
        if (ps.disabledCompany && host.database.orgs.items[index].parentid == 0) res.noSelect = true;
        return res;
    };
    var items = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    for (var i = 0; i < host.database.orgs.items.length; i++){
        if (host.database.orgs.items[i].parentid != 0) continue;
        if (host.orgViewDic && !host.orgViewDic[host.database.orgs.items[i].id]) continue;
        if (ps.onlyCompanyViewId && ps.onlyCompanyViewId != host.database.orgs.items[i].id) continue;
        items.push(getOrgItem(i));
    }
    return items;
};

contentModule.getNationCityDualSelectMenu = function(host){
    var items = [];
    var cityItems;
    var cid, cData, nData;
    for (var i = 0; i < host.database.nations.items.length; i++){
        cityItems = [];
        for (var j = 0; j < host.database.nations.items[i].cityIndexList.length; j++){
            cid = host.database.cities.items[host.database.nations.items[i].cityIndexList[j]].id;
            cData = data_module.getContent("cities", cid);
            if (!cData) continue;
            cityItems.push({
                value: cid,
                text: cData.name,
                sortText: absol.string.nonAccentVietnamese(cData.name).toLowerCase()
            });
        }
        cityItems.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });
        nData = data_module.getContent("nations", host.database.nations.items[i].id);
        if (!nData) continue;
        items.push({
            value: host.database.nations.items[i].id,
            text: nData.shortname +  " - " + nData.fullname,
            sortText: absol.string.nonAccentVietnamese(nData.shortname).toLowerCase(),
            items: cityItems
        });
    }
    items.sort(function(a, b){
        if (a.sortText > b.sortText) return 1;
        if (a.sortText < b.sortText) return -1;
        return 0;
    });
    return items;
};

contentModule.getMemberOfEmployeeSelectMenu = function(host, params = {}){
    var noSelectDic = {};
    if (params.noSelectDic) noSelectDic = params.noSelectDic;
    function getOrgItem(index){
        var items = [], ni;
        for (var i = 0; i < host.database.orgs.items[index].childIndexList.length; i++){
            ni = host.database.orgs.items[index].childIndexList[i];
            if (host.orgViewDic && !host.orgViewDic[host.database.orgs.items[ni].id]) continue;
            items.push(getOrgItem(ni));
        }
        items.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });
        var e_items = [], ni, noSelect;
        for (var i = 0; i < host.database.orgs.items[index].employeeIndexList.length; i++){
            ni = host.database.orgs.items[index].employeeIndexList[i];
            noSelect = noSelectDic[host.database.employees.items[ni].id];
            if (host.employeeEditDic && !host.employeeEditDic[host.database.employees.items[ni].id]) noSelect = true;
            e_items.push({
                value: host.database.employees.items[ni].id,
                text: host.database.employees.items[ni].fullname,
                code: host.database.employees.items[ni].code,
                isLeaf: true,
                icon: {tag:'span', class:['mdi', 'mdi-account']},
                sortText: absol.string.nonAccentVietnamese(host.database.employees.items[host.database.orgs.items[index].employeeIndexList[i]].fullname).toLowerCase(),
                noView: !host.database.employees.items[ni].available,
                noSelect: noSelect
            });
        }
        e_items.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });
        var res = {
            value: -host.database.orgs.items[index].id,
            text: host.database.orgs.items[index].name,
            icon: {tag:'span', class: (host.database.orgs.items[index].parentid == 0)? ['mdi', 'mdi-home-variant'] : ['mdi', 'mdi-folder-account']},
            items: e_items.concat(items),
            sortText: absol.string.nonAccentVietnamese(host.database.orgs.items[index].name).toLowerCase()
        };
        return res;
    };
    var items = [{value: 0, text: LanguageModule.text("txt_select_value"), isLeaf: true}];
    for (var i = 0; i < host.database.orgs.items.length; i++){
        if (host.database.orgs.items[i].parentid != 0) continue;
        items.push(getOrgItem(i));
    }
    items.sort(function(a, b){
        if (a.sortText > b.sortText) return 1;
        if (a.sortText < b.sortText) return -1;
        return 0;
    });
    return items;
};

contentModule.getMemberOfPositionSelectMenu = function(host){
    function getOrgItem(index){
        var items = [];
        for (var i = 0; i < host.database.orgs.items[index].childIndexList.length; i++){
            items.push(getOrgItem(host.database.orgs.items[index].childIndexList[i]));
        }
        items.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });
        var e_items = [];
        for (var i = 0; i < host.database.orgs.items[index].positionIndexList.length; i++){
            e_items.push({
                value: host.database.positions.items[host.database.orgs.items[index].positionIndexList[i]].id,
                text: host.database.positions.items[host.database.orgs.items[index].positionIndexList[i]].name,
                isLeaf: true,
                icon: {tag:'span', class: ['mdi', 'mdi-account']},
                sortText: absol.string.nonAccentVietnamese(host.database.positions.items[host.database.orgs.items[index].positionIndexList[i]].name).toLowerCase()
            });
        }
        e_items.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });
        var res = {
            value: -host.database.orgs.items[index].id,
            text: host.database.orgs.items[index].name,
            icon: {tag:'span', class: (host.database.orgs.items[index].parentid == 0)? ['mdi', 'mdi-home-variant'] : ['mdi', 'mdi-folder-account']},
            items: e_items.concat(items),
            sortText: absol.string.nonAccentVietnamese(host.database.orgs.items[index].name).toLowerCase()
        };
        return res;
    };
    var items = [];
    for (var i = 0; i < host.database.orgs.items.length; i++){
        if (host.database.orgs.items[i].parentid != 0) continue;
        items.push(getOrgItem(i));
    }
    items.sort(function(a, b){
        if (a.sortText > b.sortText) return 1;
        if (a.sortText < b.sortText) return -1;
        return 0;
    });
    return items;
};

contentModule.getOrgsAndEmployeesListSelectTreeMenu = function(host, params = {}){
    var noSelectDic = {};
    if (params.noSelectDic) noSelectDic = params.noSelectDic;
    var employee_type = "active";
    if (params.employee_type) employee_type = params.employee_type;
    function getOrgItem(index){
        var items = [], ni;
        for (var i = 0; i < host.database.orgs.items[index].childIndexList.length; i++){
            ni = host.database.orgs.items[index].childIndexList[i];
            if (host.orgViewDic && !host.orgViewDic[host.database.orgs.items[ni].id]) continue;
            items.push(getOrgItem(ni));
        }
        items.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });
        var e_items = [], ni;
        for (var i = 0; i < host.database.orgs.items[index].employeeIndexList.length; i++){
            ni = host.database.orgs.items[index].employeeIndexList[i];
            if (host.employeeEditDic && !host.employeeEditDic[host.database.employees.items[ni].id]) continue;
            if ((employee_type == "active") && !host.database.employees.items[ni].available) continue;
            if ((employee_type == "inactive") && host.database.employees.items[ni].available) continue;
            e_items.push({
                value: -host.database.employees.items[ni].id,
                text: host.database.employees.items[ni].fullname,
                icon: {tag:'span', class:['mdi', 'mdi-account']},
                sortText: absol.string.nonAccentVietnamese(host.database.employees.items[ni].fullname).toLowerCase(),
                noSelect: noSelectDic[-host.database.employees.items[ni].id],
                isLeaf: true
            });
        }
        e_items.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });
        var res = {
            value: host.database.orgs.items[index].id,
            text: host.database.orgs.items[index].name,
            icon: {tag:'span', class: (host.database.orgs.items[index].parentid == 0)? ['mdi', 'mdi-home-variant'] : ['mdi', 'mdi-folder-account']},
            items: e_items.concat(items),
            sortText: absol.string.nonAccentVietnamese(host.database.orgs.items[index].name).toLowerCase(),
            noSelect: noSelectDic[host.database.orgs.items[index].id]
        };
        if (host.orgEditDic && !host.orgEditDic[host.database.orgs.items[index].id]) res.noSelect = true;
        return res;
    };
    var items = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    for (var i = 0; i < host.database.orgs.items.length; i++){
        if (host.database.orgs.items[i].parentid != 0) continue;
        if (host.orgViewDic && !host.orgViewDic[host.database.orgs.items[i].id]) continue;
        items.push(getOrgItem(i));
    }
    items.sort(function(a, b){
        if (a.sortText > b.sortText) return 1;
        if (a.sortText < b.sortText) return -1;
        return 0;
    });
    return items;
};

contentModule.getOrgsAndEmployeesListSelectTreeMenuLeaf = function(host, userNone, params = {}){
    var noSelectDic = {};
    if (params.noSelectDic) noSelectDic = params.noSelectDic;
    function getOrgItem(index){
        var items = [], ni;
        for (var i = 0; i < host.database.orgs.items[index].childIndexList.length; i++){
            ni = host.database.orgs.items[index].childIndexList[i];
            if (host.orgViewDic && !host.orgViewDic[host.database.orgs.items[ni].id]) continue;
            items.push(getOrgItem(ni));
        }
        items.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });
        var e_items = [], ni;
        for (var i = 0; i < host.database.orgs.items[index].employeeIndexList.length; i++){
            ni = host.database.orgs.items[index].employeeIndexList[i];
            if (userNone && (userNone[host.database.employees.items[ni].userid] || host.database.employees.items[ni].userid == 0)) continue;
            if (host.employeeEditDic && !host.employeeEditDic[host.database.employees.items[ni].id]) continue;
            if (host.employeeNotViewDic && host.employeeNotViewDic[host.database.employees.items[ni].id]) continue;
            if (!host.database.employees.items[ni].available) continue;
            e_items.push({
                value: host.database.employees.items[ni].id,
                text: host.database.employees.items[ni].fullname,
                icon: {tag:'span', class:['mdi', 'mdi-account']},
                sortText: absol.string.nonAccentVietnamese(host.database.employees.items[ni].fullname).toLowerCase(),
                isLeaf: true,
                noSelect: noSelectDic[host.database.employees.items[ni].id]
            });
        }
        e_items.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });
        var res = {
            value: -host.database.orgs.items[index].id,
            text: host.database.orgs.items[index].name,
            icon: {tag:'span', class: (host.database.orgs.items[index].parentid == 0)? ['mdi', 'mdi-home-variant'] : ['mdi', 'mdi-folder-account']},
            items: e_items.concat(items),
            sortText: absol.string.nonAccentVietnamese(host.database.orgs.items[index].name).toLowerCase()
        };
        return res;
    };
    var items = [];
    for (var i = 0; i < host.database.orgs.items.length; i++){
        if (host.database.orgs.items[i].parentid != 0) continue;
        if (host.orgViewDic && !host.orgViewDic[host.database.orgs.items[i].id]) continue;
        items.push(getOrgItem(i));
    }
    items.sort(function(a, b){
        if (a.sortText > b.sortText) return 1;
        if (a.sortText < b.sortText) return -1;
        return 0;
    });
    return items;
};

contentModule.getCompanyListSelectTreeMenu = function(host){
    function getOrgItem(index){
        var items = [];
        for (var i = 0; i < host.database.orgs.items[index].childIndexList.length; i++){
            items.push(getOrgItem(host.database.orgs.items[index].childIndexList[i]));
        }
        var res = {
            value: host.database.orgs.items[index].id,
            text: host.database.orgs.items[index].name,
            icon: {tag:'span', class: (host.database.orgs.items[index].parentid == 0)? ['mdi', 'mdi-home-variant'] : ['mdi', 'mdi-folder-account']},
            sortText: absol.string.nonAccentVietnamese(host.database.orgs.items[index].name).toLowerCase(),
            items: items
        };
        return res;
    };
    var items = [];
    for (var i = 0; i < host.database.orgs.items.length; i++){
        if (host.database.orgs.items[i].parentid != 0) continue;
        items.push(getOrgItem(i));
    }
    items.sort(function(a, b){
        if (a.sortText > b.sortText) return 1;
        if (a.sortText < b.sortText) return -1;
        return 0;
    });
    return items;
};

contentModule.getDepartmentListSelectTreeMenu = function(host, companyId){
    function getOrgItem(index){
        var items = [];
        for (var i = 0; i < host.database.orgs.items[index].childIndexList.length; i++){
            items.push(getOrgItem(host.database.orgs.items[index].childIndexList[i]));
        }
        var res = {
            value: host.database.orgs.items[index].id,
            text: host.database.orgs.items[index].name,
            items: items
        };
        return res;
    };
    var items = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    for (var i = 0; i < host.database.orgs.items.length; i++){
        if (host.database.orgs.items[i].parentid != companyId) continue;
        items.push(getOrgItem(i));
    }
    return items;
};

contentModule.getDepartmentListSelectTreeMenuFilter = function(host, companyId){
    function getOrgItem(index){
        var items = [];
        for (var i = 0; i < host.database.orgs.items[index].childIndexList.length; i++){
            items.push(getOrgItem(host.database.orgs.items[index].childIndexList[i]));
        }
        var res = {
            value: host.database.orgs.items[index].id,
            text: host.database.orgs.items[index].name,
            items: items
        };
        return res;
    };
    var items = [];
    if (companyId != 0) items.push({value: 0, text: LanguageModule.text("txt_all_department")});
    for (var i = 0; i < host.database.orgs.items.length; i++){
        if (host.database.orgs.items[i].parentid != companyId) continue;
        items.push(getOrgItem(i));
    }
    return items;
};

contentModule.getDetailsEnumPri = function(type){
    var res = [];
    switch (type) {
        case "language":
            for (var i = 0; i < data_module.languages.items.length; i++){
                res.push({
                    localid: data_module.languages.items[i].id,
                    text: data_module.languages.items[i].name,
                    value: data_module.languages .items[i].id
                });
            }
            break;
        case "member_of_leave_policy_groups":
            var x = contentModule.getLeave_policy_groupsListPri();
            for (var i = 0; i < x.length; i++){
                res.push({
                    localid: x[i].id,
                    text: x[i].name,
                    value: x[i].id
                });
            }
            break;
        case "member_of_allowance_policy_groups":
            var x = contentModule.getAllowance_policy_groupsListPri();
            for (var i = 0; i < x.length; i++){
                res.push({
                    localid: x[i].id,
                    text: x[i].name,
                    value: x[i].id
                });
            }
            break;
        case "member_of_employment_contract_types":
            var x = contentModule.getEmployment_contract_typesListPri();
            for (var i = 0; i < x.length; i++){
                res.push({
                    localid: x[i].id,
                    text: x[i].name,
                    value: x[i].id
                });
            }
            break;

    }
    return res;
};

contentModule.viewPeopleInputForm = function(host, inputFormId, valueContent){
    var AssemblerInstance = absol.form.AssemblerInstance;
    var mPeopleFrag = AssemblerInstance.buildFragment({class: "" + inputFormId});
    // if (!mPeopleFrag.domElt.hasClass("as-relative-layout")){
    //     mPeopleFrag.domElt.addStyle({
    //         width: '100%',
    //         height:'100%',
    //         display: 'block'
    //     });
    // }
    if (valueContent){
        mPeopleFrag.props = valueContent;
    }
    return mPeopleFrag;
};

contentModule.decodeContent = function (cList, callbackfunc) {
    var index = 0, imax = 10, keys = Object.keys(cList);
    var decodeThread = function () {
        var stime = (new Date()).getTime();
        var xtime = stime, ttime, key;
        var i, ilen;
        while (index < keys.length) {
            ilen = cList.length - index;
            if (ilen > imax) ilen = imax;
            for (i = 0; i < ilen; i++) {
                key = keys[index++]
                cList[key].content = EncodingClass.string.toVariable(cList[key].content);
            }
            ttime = (new Date()).getTime();
            if (ttime - stime > 40) break;
            if (ttime - xtime < 5) {
                imax = ~~(imax * 1.1);
            }
            else {
                imax = ~~(imax * 0.9);
                if (imax < 10) imax = 10;
            }
            xtime = ttime;
        }
        if (index < cList.length) {
            Thread.setTimeout({func: decodeThread});
        }
        else {
            Thread.setTimeout({func: callbackfunc});
        }
    }
    Thread.setTimeout({func: decodeThread});
}

contentModule.makeInputFormDecode = function(input_forms){
    input_forms.forEach(function(elt){
        elt.content = EncodingClass.string.toVariable(elt.content);
    });
};

contentModule.makeOutputFormDecode = function(output_forms){
    output_forms.forEach(function(elt){
        elt.content = EncodingClass.string.toVariable(elt.content);
    });
};

contentModule.makeTasksDecode = function(tasks){
    tasks.forEach(function(elt){
        elt.extrainfo = EncodingClass.string.toVariable(elt.extrainfo);
    });
};

contentModule.makeMeetingsDecode = function(tasks){
    tasks.forEach(function(elt){
        elt.extrainfo = EncodingClass.string.toVariable(elt.extrainfo);
    });
};

contentModule.makeExtraInfoDecode = function(items){
    items.forEach(function(elt){
        if (elt.extrainfo == ""){
            elt.extrainfo = {};
        }
        else if (EncodingClass.type.isString(elt.extrainfo)){
            elt.extrainfo = EncodingClass.string.toVariable(elt.extrainfo);
        }
    });
};

contentModule.makeExtendTypeData = function(host, typeid){
    var data = [];
    var index = data_module.typelists.getIndex(typeid);
    while (data_module.typelists.items[index].type == "extends_structure") {
        data = data_module.typelists.items[index].content.details.concat(data);
        index = data_module.typelists.getIndex(data_module.typelists.items[index].content.typeof);
    }
    data = data_module.typelists.items[index].content.details.concat(data);
    return data;
};

contentModule.getEmployeesList = function(host, orgid){
    var data = [];
    for (var i = 0; i < host.database.employees.items.length; i++){
        if (!host.database.employees.items[i].available) continue;
        if (host.database.employees.items[i].orgid == orgid) data.push({
            value: host.database.employees.items[i].id,
            text: host.database.employees.items[i].fullname,
            sortText: absol.string.nonAccentVietnamese(host.database.employees.items[i].fullname.toLowerCase())
        });
    }
    data.sort(function(a, b){
        if (a.sortText > b.sortText) return 1;
        if (a.sortText < b.sortText) return -1;
        return 0;
    });
    data.unshift({value: 0, text: LanguageModule.text("txt_select_value")});
    return data;
};

contentModule.getPositionsList = function(host, orgid){
    var data = [];
    for (var i = 0; i < host.database.positions.items.length; i++){
        if (host.database.positions.items[i].id == orgid) data.push({
            value: host.database.positions.items[i].id,
            text: host.database.positions.items[i].name
        });
    }
    data.sort(function(a, b){
        if (a.text > b.text) return 1;
        if (a.text < b.text) return -1;
        return 0;
    });
    data.unshift({value: 0, text: LanguageModule.text("txt_select_value")});
    return data;
};

contentModule.isChanged = function(oldData, newData, listFieldCheck){
    var item;
    for (var i = 0; i < listFieldCheck.length; i++){
        item = listFieldCheck[i];
        if (EncodingClass.string.compare(oldData[item], newData[item]) != 0) {
            console.log(oldData[item], newData[item], item);
            return true;
        }
    }
    return false;
};

contentModule.makeEmploymentContractData = function(host){
    var pIndex;
    for (var i = 0; i < host.database.employment_contracts.items.length; i++){
        if (host.dictionary.employees[host.database.employment_contracts.items[i].employeeid]) {
            host.dictionary.employees[host.database.employment_contracts.items[i].employeeid].contract = host.database.employment_contracts.items[i];
        }
    }
};

contentModule.makeEmploymentSalaryDecisionData = function(host){
    var pIndex;
    for (var i = 0; i < host.database.employee_salary_decisions.items.length; i++){
        if (host.database.employee_salary_decisions.items[i].available == 0) continue;
        if (host.dictionary.employees[host.database.employee_salary_decisions.items[i].employeeid]) {
            host.dictionary.employees[host.database.employee_salary_decisions.items[i].employeeid].salary_decision = host.database.employee_salary_decisions.items[i];
        }
    }
};

contentModule.makeEmployeeData = function(host){
    var peoplesDic = {};
    if (host.database.peoples){
        peoplesDic = contentModule.makeDictionaryIndex(host.database.peoples.items);
    }
    var pData, pIndex;
    for (var i = 0; i < host.database.employees.items.length; i++){
        pData = data_module.getContent("peoples", host.database.employees.items[i].peopleid);
        if (pData){
            host.database.employees.items[i].fullname = pData.fullname;
        }
        else {
            if (host.database.peoples){
                pIndex = peoplesDic[host.database.employees.items[i].peopleid];
                if (pIndex >= 0){
                    host.database.employees.items[i].fullname = host.database.peoples.items[pIndex].fullname;
                }
                else {
                    console.log(host.database.employees.items[i].peopleid);
                    host.database.employees.items[i].fullname = "";
                }
            }
            else {
                console.log(host.database.employees.items[i].peopleid);
                host.database.employees.items[i].fullname = "";
            }
        }
    }
};

contentModule.makeEmployeeAllData = function(host){
    var peoplesDic = {};
    if (host.database.peoples){
        peoplesDic = contentModule.makeDictionaryIndex(host.database.peoples.items);
    }
    var pData, pIndex;
    for (var i = 0; i < host.database.employees.items.length; i++){
        pData = data_module.getContent("peoples", host.database.employees.items[i].peopleid);
        if (pData){
            if (EncodingClass.type.isString(pData.content)){
                pData.content = EncodingClass.string.toVariable(pData.content);
            }
            for (var j = 0; j < contentModule.getPeopleContentField.length; j++){
                pData[contentModule.getPeopleContentField[j]] = pData.content[contentModule.getPeopleContentField[j]];
            }
            for (var param in pData) {
                if (param == "extraid") {
                    host.database.employees.items[i]["p_extraid"] = pData[param];
                }
                else if (param != "id" && param != "userid" && param != "available"){
                    host.database.employees.items[i][param] = pData[param];
                }
            }
        }
        else {
            if (host.database.peoples){
                pIndex = peoplesDic[host.database.employees.items[i].peopleid];
                if (pIndex >= 0){
                    if (EncodingClass.type.isString(host.database.peoples.items[pIndex].content)){
                        host.database.peoples.items[pIndex].content = EncodingClass.string.toVariable(host.database.peoples.items[pIndex].content);
                    }
                    for (var j = 0; j < contentModule.getPeopleContentField.length; j++){
                        host.database.peoples.items[pIndex][contentModule.getPeopleContentField[j]] = host.database.peoples.items[pIndex].content[contentModule.getPeopleContentField[j]];
                    }
                    for (var param in host.database.peoples.items[pIndex]) {
                        if (param == "extraid") {
                            host.database.employees.items[i]["p_extraid"] = host.database.peoples.items[pIndex][param];
                        }
                        else if (param != "id" && param != "userid" && param != "available"){
                            host.database.employees.items[i][param] = host.database.peoples.items[pIndex][param];
                        }
                    }
                }
                else {
                    console.log(host.database.employees.items[i].peopleid);
                    host.database.employees.items[i].fullname = "";
                }
            }
            else {
                console.log(host.database.employees.items[i].peopleid);
                host.database.employees.items[i].fullname = "";
            }
        }
    }
};

contentModule.getValueOfForm = function(formView, typeid, typelists, mainData, no_alert){
    var typeDict = {};
    var dict2 = {};
    typelists.forEach(function(elt, index){
        typeDict[elt.id] = index;
        dict2[elt.id] = elt;
    });
    var primitiveTypeList = form_module.primitiveTypeList;
    var getType = function(index){
        var type = typelists[index].type;
        if (
            form_module.primitiveTypeList.indexOf(type) != -1
        ){
            type = typelists[index].type2;
        }
        return type;
    }
    var generateData = function(valueContent, typeid, elt){
        var data;
        var type;
        if (isNaN(parseInt(typeid, 10))) type = typeid;
        else type = getType(typeDict[typeid]);
        if (valueContent && valueContent.constructor === Object && valueContent[typeid]) valueContent = valueContent[typeid];
        switch (type) {
            case "nation_city":
                if (elt && elt.require && (!valueContent.value || valueContent.value.length < 2)) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent.value;
                break;
            case "position_list":
                if (elt && elt.require && valueContent.values.length == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent.values;
                break;
            case "employee_list":
                if (elt && elt.require && valueContent.values.length == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent.values;
                break;
            case "number":
            case "currency":
                if (elt && elt.require && valueContent === "") {
                    if (!no_alert) ModalElement.alert({message: "Chưa nhập " + elt.name});
                    return undefined;
                }
                if (valueContent === "") valueContent = 0;
                data = valueContent;
                break;
            case "string":
            case "phonenumber":
            case "website":
            case "gps":
            case "note":
            case "html":
            case "variable_input":
            case "variable_textarea":
            case "email_address":
                if (!valueContent) valueContent = "";
                valueContent = valueContent.trim();
                if (elt && elt.require && valueContent == "") {
                    absol.form.traversal(formView, function(path){
                        if (path.node["$" + elt.localid]) {
                            if (!no_alert) ModalElement.alert({
                                message: "Chưa nhập " + elt.name,
                                func: function(){
                                    path.node["$" + elt.localid].domElt.focus();
                                }
                            });
                            path.stop();
                        }
                    });
                    return undefined;
                }
                data = valueContent;
                break;
            case "date":
            case "year":
            case "month":
            case "week":
            case "datetime":
                if (elt && elt.require && valueContent === null) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                if (!valueContent) valueContent = new Date(TIME_NULL_MILLISECOND);
                data = valueContent;
                break;
            case "datemonth":
                if (elt && elt.require && valueContent === null) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                if (!valueContent) valueContent = "";
                data = valueContent;
                break;
            case "boolean":
                if (elt && elt.require && valueContent === null) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent;
                break;
            case "date_level":
                if (elt && elt.require) {
                    if (!valueContent || !valueContent.value) {
                        if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                        return undefined;
                    }
                }
                if (!valueContent) {
                    valueContent = {
                        level: "date",
                        value: new Date(TIME_NULL_MILLISECOND)
                    }
                }
                if (!valueContent.value) valueContent.value = new Date(TIME_NULL_MILLISECOND);
                data = valueContent;
                break;
            case "hour_period":
                if (elt && elt.require && valueContent === null) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = {
                    dayOffset: valueContent.dayOffset,
                    duration: valueContent.duration
                };
                break;
            case "time":
                if (elt && elt.require && valueContent === null) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                if (!valueContent) valueContent = new Date(TIME_NULL_MILLISECOND);
                data = valueContent;
                break;
            case "user":
            case "geopos":
            case "member_of_position_2":
            case "member_of_employee":
            case "member_of_worktime_machines":
            case "member_of_assets":
            case "member_of_instruments_and_tools":
            case "member_of_warehouses":
            case "member_of_assets_instruments_and_tools":
            case "member_of_allowance_policy_groups":
            case "member_of_training_program_groups":
            case "member_of_leave_policy_groups":
            case "member_of_insurance_policy_groups":
            case "member_of_benefit_policy_groups":
            case "member_of_tax_policy_groups":
            case "member_of_bonus_policy_groups":
            case "member_of_piece_wage_policy_groups":
            case "member_of_attendance_clock_policy_groups":
            case "member_of_standard_workday_policy_groups":
            case "member_of_overtime_policy_groups":
            case "member_of_offboarding_types":
            case "member_of_offboarding_reasons":
            case "member_of_work_flow_groups":
            case "member_of_work_flows":
            case "member_of_objects":
            case "member_of_lesson_categories":
            case "member_of_payroll_cycle":
            case "member_of_task":
            case "member_of_meeting":
            case "member_of_typelists":
            case "member_of_input_forms":
            case "member_of_output_forms":
            case "member_of_mobile_input_forms":
            case "member_of_mobile_output_forms":
            case "member_of_partner_class":
            case "member_of_partner":
            case "member_of_contact":
            case "member_of_trade_union_policy_groups":
            case "member_of_salary_policy_groups":
            case "member_of_other_liability_policy_groups":
            case "member_of_other_policy_groups":
            case "member_of_policies":
            case "member_of_late_early_checkin_policy_groups":
            case "member_of_advance_payment_policy_groups":
            case "member_of_punishment_policy_groups":
            case "member_of_asset_category":
            case "member_of_instruments_and_tools_category":
            case "member_of_projects":
            case "member_of_insurance_policies":
            case "member_of_tax_policies":
            case "member_of_trade_union_policies":
            case "member_of_leave_policies":
            case "member_of_benefit_policies":
            case "member_of_allowance_policies":
            case "member_of_bonus_policies":
            case "member_of_standard_workday_policies":
            case "member_of_overtime_policies":
            case "member_of_punishment_policies":
            case "member_of_advance_payment_policies":
            case "member_of_late_early_checkin_policies":
            case "member_of_salary_policies":
            case "member_of_other_liability_policies":
            case "member_of_employment_contract_types":
            case "member_of_nations":
            case "member_of_cities":
            case "member_of_religions":
            case "member_of_shifts":
            case "member_of_timesheets":
            case "member_of_pay_percentage":
            case "member_of_ethnics":
            case "member_of_document_types":
            case "member_of_document_groups":
            case "member_of_document_folders":
            case "member_of_orgs":
            case "member_of_template_groups":
            case "member_of_welcome_templates":
            case "member_of_product_groups":
            case "member_of_product_list":
            case "member_of_piece_wage_policies":
            case "member_of_attendance_clock_policies":
            case "member_of_position_groups":
            case "language":
                if (elt && elt.require && valueContent.value == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent.value;
                break;
            case "color_picker":
                if (elt && elt.require && valueContent == "") {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent;
                break;
            case "member_of_department":
                data = valueContent.value;
                break;
            case "files":
                data = valueContent.map(function(elt){
                    if (elt.id) return elt.id;
                    else {
                        return {
                            filename: elt.filename,
                            old_cd: elt.old_cd,
                            content_type: elt.content_type
                        };
                    }
                });
                break;
            case "enum":
            case "extends_enum":
                if (elt && elt.require && valueContent.value == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                if (valueContent.value === undefined) data = "";
                else data = valueContent.value.toString();
                break;
            case "enum_multi":
            case "extends_enum_multi":
                if (elt && elt.require && valueContent.values.length == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent.values;
                break;
            case "userlist":
            case "members_of_shifts":
            case "members_of_locations":
            case "members_of_partner_class":
            case "multiselect_offboarding_reasons":
                if (elt && elt.require && valueContent.values.length == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent.values;
                break;
            case "select_department_employee":
                if (elt && elt.require && valueContent.values.length == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent.values;
                break;
            case "any_file":
                if (elt && elt.require && valueContent === null) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent ? valueContent.id : 0;
                break;
            case "image_file":
                if (!valueContent) {
                    data = null;
                }
                else if (valueContent instanceof File) {
                    if (valueContent.type.startsWith("image") || valueContent.type.startsWith("http")){
                        data = valueContent;
                    }
                }
                else {
                    data = valueContent.id;
                }
                break;
            case "structure":
                var t_value;
                var index = typeDict[typeid];
                var typeContent = typelists[index].content.details;
                data = {};
                for (var i = 0; i < typeContent.length; i++){
                    t_value = generateData(valueContent[typeContent[i].localid], typeContent[i].type, typeContent[i]);
                    if (t_value === undefined) return undefined;
                    if (t_value && t_value.detailUnion){
                        data[typeContent[i].localid] = t_value.value;
                        Object.assign(data, t_value.detailUnion);
                    }
                    else data[typeContent[i].localid] = t_value;
                }
                break;
            case "extends_structure":
                var t_value;
                var index = typeDict[typeid];
                var typeContent = typelists[index].content;
                var t_id = typeContent.typeof;
                var content = typelists[typeDict[t_id]].content.details.concat(typeContent.details);
                while (typelists[typeDict[t_id]].type == "extends_structure"){
                    t_id = typelists[typeDict[t_id]].content.typeof;
                    content = typelists[typeDict[t_id]].content.details.concat(content)
                }
                data = {};
                for (var i = 0; i < content.length; i++){
                    t_value = generateData(valueContent[content[i].localid], content[i].type, content[i]);
                    if (t_value === undefined) return undefined;
                    if (t_value && t_value.detailUnion){
                        data[content[i].localid] = t_value.value;
                        Object.assign(data, t_value.detailUnion);
                    }
                    else data[content[i].localid] = t_value;
                }
                break;
            case "array":
                data = [];
                var index = typeDict[typeid];
                var typeContent = typelists[index].content;
                var t_id = typeContent.typeof;
                var dataTypeOfArray = contentModule.checkDatatypeOfArray(typelists, t_id);
                if (dataTypeOfArray == "advanced"){
                    var type = getType(typeDict[t_id]);
                    if (type == "structure" || type == "extends_structure"){
                        for (i = 0; i < valueContent.length; i++){
                            var x = generateData(valueContent[i], t_id);
                            if (x === undefined) return undefined;
                            if (x !== null) data.push(x);
                        }
                    }
                    else {
                        for (i = 0; i < valueContent.length; i++){
                            var x = generateData(valueContent[i][t_id], t_id);
                            if (x === undefined) return undefined;
                            if (x !== null) data.push(x);
                        }
                    }
                }
                else {
                    var type = getType(typeDict[t_id]);
                    if (type == "structure" || type == "extends_structure"){
                        var typeofarray = dict2[typeid].content.typeof;
                        var mainData = contentModule.getMainData(typeofarray, dict2);
                        if (!mainData) data = valueContent.records;
                        else {
                            var keys = Object.keys(mainData);
                            valueContent.records.forEach(function(record){
                                var x = EncodingClass.string.duplicate(record);
                                var cur = {};
                                keys.forEach(function(localid){
                                    cur[mainData[localid]] = x[localid];
                                    delete(x[localid]);
                                });
                                cur.extrainfo = x;
                                data.push(cur);
                            });
                        }
                    }
                    else {
                        for (i = 0; i < valueContent.records.length; i++){
                            data.push(valueContent.records[i][t_id]);
                        }
                    }
                }
                break;
            case "union":
                if (elt && elt.require && valueContent.value == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = {
                    value: valueContent.value,
                    detailUnion: {}
                };
                if (elt.detailUnion[data.value]){
                    for (var i = 0; i < elt.detailUnion[data.value].length; i++){
                        data.detailUnion[elt.detailUnion[data.value][i].localid] = generateData(formView.props[elt.detailUnion[data.value][i].localid], elt.detailUnion[data.value][i].type, elt.detailUnion[data.value][i]);
                        if (data.detailUnion[elt.detailUnion[data.value][i].localid] === undefined) return undefined;
                    }
                }
                break;
            default:

        }
        return data;
    };

    var verifyInfo = formView.verify();

    if (!verifyInfo.completed && !no_alert) {
        contentModule.handleIncomletedForm(formView, verifyInfo);
        return undefined;
    }

    var data = generateData(formView.props, typeid);

    if (data === undefined) return undefined;

    var returnValue = {
        extrainfo: {},
        files: []
    };
    var typeDataContent = [];
    var index = typeDict[typeid];
    while (typelists[index].type == "extends_structure") {
        typeDataContent = typelists[index].content.details.concat(typeDataContent);
        index = typeDict[typelists[index].content.typeof];
    }
    typeDataContent = typelists[index].content.details.concat(typeDataContent);
    typeDataContent.forEach(function(elt){
        var type;
        if (isNaN(parseInt(elt.type))) type = elt.type;
        else type = getType(typeDict[elt.type])
        if (type == "image_file") returnValue.files.push(data[elt.localid]);
        if (type == "any_file") returnValue.files.push(data[elt.localid]);
        if (elt.type == -64) returnValue.files = returnValue.files.concat(data[elt.localid]);
        returnValue.files = returnValue.files.filter(function(elt){
            return elt > 0;
        });
        if (mainData[elt.localid]){
            returnValue[mainData[elt.localid]] = data[elt.localid];
        }
        else {
            returnValue.extrainfo[elt.localid] = data[elt.localid];
        }
        if (type == "union") {
            if (elt.detailUnion[data[elt.localid]]){
                elt.detailUnion[data[elt.localid]].forEach(function(cur){
                    if (mainData[cur.localid]) {
                        returnValue[mainData[cur.localid]] = data[cur.localid];
                    }
                    else {
                        returnValue.extrainfo[cur.localid] = data[cur.localid];
                    }
                });
            }
        }
    });
    return returnValue;
};

contentModule.getValueOfUserForm = function(formView, typeid, typelists, no_alert){
    var typeDict = {};
    var dict2 = {};
    typelists.forEach(function(elt, index){
        typeDict[elt.id] = index;
        dict2[elt.id] = elt;
    });
    var primitiveTypeList = form_module.primitiveTypeList;
    var getType = function(index){
        var type = typelists[index].type;
        if (
            form_module.primitiveTypeList.indexOf(type) != -1
        ){
            type = typelists[index].type2;
        }
        return type;
    }
    var generateData = function(valueContent, typeid, elt){
        var data;
        var type;
        if (isNaN(parseInt(typeid, 10))) type = typeid;
        else type = getType(typeDict[typeid]);
        if (valueContent && valueContent.constructor === Object && valueContent[typeid]) valueContent = valueContent[typeid];
        switch (type) {
            case "nation_city":
                if (elt && elt.require && (!valueContent.value || valueContent.value.length < 2)) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                if (valueContent.value === undefined) data = [];
                else data = valueContent.value;
                break;
            case "position_list":
                if (elt && elt.require && valueContent.values.length == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                if (valueContent.values === undefined) data = [];
                else data = valueContent.values;
                break;
            case "employee_list":
                if (elt && elt.require && valueContent.values.length == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                if (valueContent.values === undefined) data = [];
                else data = valueContent.values;
                break;
            case "number":
            case "currency":
                if (elt && elt.require && valueContent === "") {
                    if (!no_alert) ModalElement.alert({message: "Chưa nhập " + elt.name});
                    return undefined;
                }
                if (valueContent === "") valueContent = 0;
                data = valueContent;
                break;
            case "string":
            case "phonenumber":
            case "website":
            case "gps":
            case "note":
            case "html":
            case "variable_input":
            case "variable_textarea":
            case "email_address":
                if (!valueContent) valueContent = "";
                valueContent = valueContent.trim();
                if (elt && elt.require && valueContent == "") {
                    absol.form.traversal(formView, function(path){
                        if (path.node["$" + elt.localid]) {
                            if (!no_alert) ModalElement.alert({
                                message: "Chưa nhập " + elt.name,
                                func: function(){
                                    path.node["$" + elt.localid].domElt.focus();
                                }
                            });
                            path.stop();
                        }
                    });
                    return undefined;
                }
                data = valueContent;
                break;
            case "date":
            case "datetime":
            case "year":
            case "month":
            case "week":
                if (elt && elt.require && valueContent === null) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                if (!valueContent) valueContent = new Date(TIME_NULL_MILLISECOND);
                data = valueContent;
                break;
            case "datemonth":
                if (elt && elt.require && valueContent === null) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                if (!valueContent) valueContent = "";
                data = valueContent;
                break;
            case "boolean":
                if (elt && elt.require && valueContent === null) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent;
                break;
            case "date_level":
                if (elt && elt.require) {
                    if (!valueContent || !valueContent.value) {
                        if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                        return undefined;
                    }
                }
                if (!valueContent) {
                    valueContent = {
                        level: "date",
                        value: new Date(TIME_NULL_MILLISECOND)
                    }
                }
                if (!valueContent.value) valueContent.value = new Date(TIME_NULL_MILLISECOND);
                data = valueContent;
                break;
            case "hour_period":
                if (elt && elt.require && valueContent === null) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = {
                    dayOffset: valueContent.dayOffset,
                    duration: valueContent.duration
                };
                break;
            case "time":
                if (elt && elt.require && valueContent === null) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                if (!valueContent) valueContent = new Date(TIME_NULL_MILLISECOND);
                data = valueContent;
                break;
            case "user":
            case "geopos":
            case "member_of_position_2":
            case "member_of_employee":
            case "member_of_worktime_machines":
            case "member_of_assets":
            case "member_of_instruments_and_tools":
            case "member_of_warehouses":
            case "member_of_assets_instruments_and_tools":
            case "member_of_allowance_policy_groups":
            case "member_of_training_program_groups":
            case "member_of_leave_policy_groups":
            case "member_of_insurance_policy_groups":
            case "member_of_benefit_policy_groups":
            case "member_of_tax_policy_groups":
            case "member_of_bonus_policy_groups":
            case "member_of_piece_wage_policy_groups":
            case "member_of_attendance_clock_policy_groups":
            case "member_of_standard_workday_policy_groups":
            case "member_of_overtime_policy_groups":
            case "member_of_offboarding_types":
            case "member_of_offboarding_reasons":
            case "member_of_work_flow_groups":
            case "member_of_work_flows":
            case "member_of_objects":
            case "member_of_lesson_categories":
            case "member_of_payroll_cycle":
            case "member_of_task":
            case "member_of_meeting":
            case "member_of_typelists":
            case "member_of_input_forms":
            case "member_of_output_forms":
            case "member_of_mobile_input_forms":
            case "member_of_mobile_output_forms":
            case "member_of_partner_class":
            case "member_of_partner":
            case "member_of_contact":
            case "member_of_trade_union_policy_groups":
            case "member_of_salary_policy_groups":
            case "member_of_other_liability_policy_groups":
            case "member_of_other_policy_groups":
            case "member_of_policies":
            case "member_of_late_early_checkin_policy_groups":
            case "member_of_advance_payment_policy_groups":
            case "member_of_punishment_policy_groups":
            case "member_of_asset_category":
            case "member_of_instruments_and_tools_category":
            case "member_of_projects":
            case "member_of_insurance_policies":
            case "member_of_tax_policies":
            case "member_of_trade_union_policies":
            case "member_of_leave_policies":
            case "member_of_benefit_policies":
            case "member_of_allowance_policies":
            case "member_of_bonus_policies":
            case "member_of_standard_workday_policies":
            case "member_of_overtime_policies":
            case "member_of_punishment_policies":
            case "member_of_advance_payment_policies":
            case "member_of_late_early_checkin_policies":
            case "member_of_salary_policies":
            case "member_of_other_liability_policies":
            case "member_of_employment_contract_types":
            case "member_of_nations":
            case "member_of_cities":
            case "member_of_religions":
            case "member_of_shifts":
            case "member_of_timesheets":
            case "member_of_pay_percentage":
            case "member_of_ethnics":
            case "member_of_document_types":
            case "member_of_document_groups":
            case "member_of_document_folders":
            case "member_of_orgs":
            case "member_of_template_groups":
            case "member_of_welcome_templates":
            case "member_of_product_groups":
            case "member_of_product_list":
            case "member_of_attendance_clock_policies":
            case "member_of_position_groups":
            case "language":
                if (elt && elt.require && valueContent.value == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent.value.toString();
                break;
            case "color_picker":
                if (elt && elt.require && valueContent == "") {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent;
                break;
            case "member_of_department":
                data = valueContent.value.toString;
                break;
            case "files":
                data = valueContent.map(function(elt){
                    if (elt.id) return elt.id;
                    else return {
                        filename: elt.filename,
                        old_cd: elt.old_cd,
                        content_type: elt.content_type
                    };
                });
                break;
            case "enum":
            case "extends_enum":
                if (elt && elt.require && valueContent.value == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                if (valueContent.value === undefined) data = "";
                else data = valueContent.value.toString();
                break;
            case "enum_multi":
            case "extends_enum_multi":
                if (elt && elt.require && valueContent.values.length == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                if (valueContent.values === undefined) data = [];
                else data = valueContent.values;
                break;
            case "userlist":
            case "members_of_shifts":
            case "members_of_locations":
            case "multiselect_offboarding_reasons":
            case "members_of_partner_class":
                if (elt && elt.require && valueContent.values.length == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent.values;
                break;
            case "select_department_employee":
                if (elt && elt.require && valueContent.values.length == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent.values;
                break;
            case "any_file":
                if (elt && elt.require && valueContent === null) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = valueContent ? valueContent.id : 0;
                break;
            case "image_file":
                if (!valueContent) {
                    data = null;
                }
                else if (valueContent instanceof File) {
                    if (valueContent.type.startsWith("image") || valueContent.type.startsWith("http")){
                        data = valueContent;
                    }
                }
                else {
                    data = valueContent.id;
                }
                break;
            case "structure":
                var t_value;
                var index = typeDict[typeid];
                var typeContent = typelists[index].content.details;
                data = {};
                for (var i = 0; i < typeContent.length; i++){
                    t_value = generateData(valueContent[typeContent[i].localid], typeContent[i].type, typeContent[i]);
                    if (t_value === undefined) return undefined;
                    if (t_value && t_value.detailUnion){
                        data[typeContent[i].localid] = t_value.value;
                        Object.assign(data, t_value.detailUnion);
                    }
                    else data[typeContent[i].localid] = t_value;
                }
                break;
            case "extends_structure":
                var t_value;
                var index = typeDict[typeid];
                var typeContent = typelists[index].content;
                var t_id = typeContent.typeof;
                var content = typelists[typeDict[t_id]].content.details.concat(typeContent.details);
                while (typelists[typeDict[t_id]].type == "extends_structure"){
                    t_id = typelists[typeDict[t_id]].content.typeof;
                    content = typelists[typeDict[t_id]].content.details.concat(content)
                }
                data = {};
                for (var i = 0; i < content.length; i++){
                    t_value = generateData(valueContent[content[i].localid], content[i].type, content[i]);
                    if (t_value === undefined) return undefined;
                    if (t_value && t_value.detailUnion){
                        data[content[i].localid] = t_value.value;
                        Object.assign(data, t_value.detailUnion);
                    }
                    else data[content[i].localid] = t_value;
                }
                break;
            case "array":
                data = [];
                var index = typeDict[typeid];
                var typeContent = typelists[index].content;
                var t_id = typeContent.typeof;
                var dataTypeOfArray = contentModule.checkDatatypeOfArray(typelists, t_id);
                if (dataTypeOfArray == "advanced"){
                    var type = getType(typeDict[t_id]);
                    if (type == "structure" || type == "extends_structure"){
                        for (i = 0; i < valueContent.length; i++){
                            var x = generateData(valueContent[i], t_id);
                            if (x === undefined) return undefined;
                            if (x !== null) data.push(x);
                        }
                    }
                    else {
                        for (i = 0; i < valueContent.length; i++){
                            var x = generateData(valueContent[i][t_id], t_id);
                            if (x === undefined) return undefined;
                            if (x !== null) data.push(x);
                        }
                    }
                }
                else {
                    var type = getType(typeDict[t_id]);
                    if (type == "structure" || type == "extends_structure"){
                        var typeofarray = dict2[typeid].content.typeof;
                        data = valueContent.records;
                        var t_dict = {};
                        typelists[typeDict[t_id]].content.details.forEach(function(elt){
                            t_dict[elt.localid] = elt.type;
                        });
                        var removeIndex = [];
                        if (!data) data = [];
                        data.forEach(function(elt, idx){
                            Object.keys(t_dict).forEach(function(cur){
                                if (elt[cur] === undefined) {
                                    var t_type = typelists[typeDict[t_dict[cur]]].type;
                                    switch (t_type) {
                                        case "enum":
                                        case "extends_enum":
                                            elt[cur] = "";
                                            break;
                                        case "enum_multi":
                                        case "extends_enum_multi":
                                            elt[cur] = [];
                                            break;
                                        case "datetime":
                                        case "date":
                                            removeIndex.push(idx);
                                            break;
                                        case "number":
                                        case "currency":
                                            elt[cur] = 0;
                                            break;
                                        default:
                                            if (contentModule.listTypeSelectmenu.indexOf(t_type) >= 0){
                                                elt[cur] = "";
                                            }
                                            else if (contentModule.listTypeSelectbox.indexOf(t_type) >= 0) {
                                                elt[cur] = [];
                                            }
                                            else elt[cur] = "";
                                    }
                                }
                            })
                        });
                        removeIndex.forEach(function(elt, index){
                            data.splice(elt - index, 1);
                        });
                    }
                    else {
                        for (i = 0; i < valueContent.records.length; i++){
                            data.push(valueContent.records[i][t_id]);
                        }
                    }
                }
                break;
            case "union":
                if (elt && elt.require && valueContent.value == 0) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                data = {
                    value: valueContent.value,
                    detailUnion: {}
                };
                if (elt.detailUnion[data.value]){
                    for (var i = 0; i < elt.detailUnion[data.value].length; i++){
                        data.detailUnion[elt.detailUnion[data.value][i].localid] = generateData(formView.props[elt.detailUnion[data.value][i].localid], elt.detailUnion[data.value][i].type, elt.detailUnion[data.value][i]);
                        if (data.detailUnion[elt.detailUnion[data.value][i].localid] === undefined) return undefined;
                    }
                }
                break;
            default:

        }
        return data;
    };

    var verifyInfo = formView.verify();

    if (!verifyInfo.completed && !no_alert) {
        contentModule.handleIncomletedForm(formView, verifyInfo);
        return undefined;
    }

    var data = generateData(formView.props, typeid);

    return data;
};

contentModule.getValueOfForm2 = function(valueContent, typeid, typelists, currentPath, unionValue){
    var typeDict = {};
    var dict2 = {};
    typelists.forEach(function(elt, index){
        typeDict[elt.id] = index;
        dict2[elt.id] = elt;
    });
    var mainData = contentModule.getMainData(typeid, dict2);
    var primitiveTypeList = form_module.primitiveTypeList;
    var getType = function(index){
        var type = typelists[index].type;
        if (
            form_module.primitiveTypeList.indexOf(type) != -1
        ){
            type = typelists[index].type2;
        }
        return type;
    }
    if (valueContent && valueContent.constructor === Object && valueContent[typeid]) valueContent = valueContent[typeid];
    // var generateData = function(valueContent, typeid, elt){
        var data;
        var type;
        if (isNaN(parseInt(typeid, 10))) type = typeid;
        else type = getType(typeDict[typeid]);
        switch (type) {
            case "nation_city":
                if (currentPath && currentPath.require && (!valueContent.value || valueContent.value.length < 2)) {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                data = valueContent.value;
                break;
            case "position_list":
                if (currentPath && currentPath.require && valueContent.values.length == 0) {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                data = valueContent.values;
                break;
            case "employee_list":
                if (currentPath && currentPath.require && valueContent.values.length == 0) {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                data = valueContent.values;
                break;
            case "number":
            case "currency":
                if (currentPath && currentPath.require && valueContent === "") {
                    ModalElement.alert({message: "Chưa nhập " + currentPath.name});
                    return undefined;
                }
                if (valueContent === "") valueContent = 0;
                data = valueContent;
                break;
            case "string":
            case "phonenumber":
            case "website":
            case "gps":
            case "note":
            case "html":
            case "variable_input":
            case "variable_textarea":
            case "email_address":
                if (!valueContent) valueContent = "";
                valueContent = valueContent.trim();
                if (currentPath && currentPath.require && valueContent == "") {
                    absol.form.traversal(formView, function(path){
                        if (path.node["$" + currentPath.localid]) {
                            ModalElement.alert({
                                message: "Chưa nhập " + currentPath.name,
                                func: function(){
                                    path.node["$" + currentPath.localid].domElt.focus();
                                }
                            });
                            path.stop();
                        }
                    });
                    return undefined;
                }
                data = valueContent;
                break;
            case "date":
            case "year":
            case "month":
            case "week":
            case "datetime":
                if (elt && elt.require && valueContent === null) {
                    if (!no_alert) ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return undefined;
                }
                if (!valueContent) valueContent = new Date(TIME_NULL_MILLISECOND);
                data = valueContent;
                break;
            case "datemonth":
                if (currentPath && currentPath.require && valueContent === null) {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                if (!valueContent) valueContent = "";
                data = valueContent;
                break;
            case "boolean":
                if (currentPath && currentPath.require && valueContent === null) {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                data = valueContent;
                break;
            case "date_level":
                if (currentPath && currentPath.require) {
                    if (!valueContent || !valueContent.value) {
                        if (!no_alert) ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                        return undefined;
                    }
                }
                if (!valueContent) {
                    valueContent = {
                        level: "date",
                        value: new Date(TIME_NULL_MILLISECOND)
                    }
                }
                if (!valueContent.value) valueContent.value = new Date(TIME_NULL_MILLISECOND);
                data = valueContent;
                break;
            case "hour_period":
                if (currentPath && currentPath.require && valueContent === null) {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                data = {
                    dayOffset: valueContent.dayOffset,
                    duration: valueContent.duration
                };
                break;
            case "time":
                if (currentPath && currentPath.require && valueContent === null) {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                if (!valueContent) valueContent = new Date(TIME_NULL_MILLISECOND);
                data = valueContent;
                break;
            case "user":
            case "geopos":
            case "member_of_position_2":
            case "member_of_employee":
            case "member_of_worktime_machines":
            case "member_of_assets":
            case "member_of_instruments_and_tools":
            case "member_of_warehouses":
            case "member_of_assets_instruments_and_tools":
            case "member_of_allowance_policy_groups":
            case "member_of_training_program_groups":
            case "member_of_leave_policy_groups":
            case "member_of_insurance_policy_groups":
            case "member_of_benefit_policy_groups":
            case "member_of_tax_policy_groups":
            case "member_of_bonus_policy_groups":
            case "member_of_piece_wage_policy_groups":
            case "member_of_attendance_clock_policy_groups":
            case "member_of_standard_workday_policy_groups":
            case "member_of_overtime_policy_groups":
            case "member_of_offboarding_types":
            case "member_of_offboarding_reasons":
            case "member_of_work_flow_groups":
            case "member_of_work_flows":
            case "member_of_objects":
            case "member_of_lesson_categories":
            case "member_of_payroll_cycle":
            case "member_of_task":
            case "member_of_meeting":
            case "member_of_typelists":
            case "member_of_input_forms":
            case "member_of_output_forms":
            case "member_of_mobile_input_forms":
            case "member_of_mobile_output_forms":
            case "member_of_partner_class":
            case "member_of_partner":
            case "member_of_contact":
            case "member_of_trade_union_policy_groups":
            case "member_of_salary_policy_groups":
            case "member_of_other_liability_policy_groups":
            case "member_of_other_policy_groups":
            case "member_of_policies":
            case "member_of_late_early_checkin_policy_groups":
            case "member_of_advance_payment_policy_groups":
            case "member_of_punishment_policy_groups":
            case "member_of_asset_category":
            case "member_of_instruments_and_tools_category":
            case "member_of_projects":
            case "member_of_insurance_policies":
            case "member_of_tax_policies":
            case "member_of_trade_union_policies":
            case "member_of_leave_policies":
            case "member_of_benefit_policies":
            case "member_of_allowance_policies":
            case "member_of_bonus_policies":
            case "member_of_standard_workday_policies":
            case "member_of_overtime_policies":
            case "member_of_punishment_policies":
            case "member_of_advance_payment_policies":
            case "member_of_late_early_checkin_policies":
            case "member_of_salary_policies":
            case "member_of_other_liability_policies":
            case "member_of_employment_contract_types":
            case "member_of_nations":
            case "member_of_cities":
            case "member_of_religions":
            case "member_of_shifts":
            case "member_of_timesheets":
            case "member_of_pay_percentage":
            case "member_of_ethnics":
            case "member_of_document_types":
            case "member_of_document_groups":
            case "member_of_orgs":
            case "member_of_document_folders":
            case "member_of_template_groups":
            case "member_of_welcome_templates":
            case "member_of_product_groups":
            case "member_of_product_list":
            case "member_of_piece_wage_policies":
            case "member_of_attendance_clock_policies":
            case "member_of_position_groups":
            case "language":
                if (currentPath && currentPath.require && valueContent.value == 0) {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                data = valueContent.value;
                break;
            case "color_picker":
                if (currentPath && currentPath.require && valueContent == "") {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                data = valueContent;
                break;
            case "member_of_department":
                data = valueContent.value;
                break;
            case "files":
                data = valueContent.map(function(elt){
                    if (elt.id) return elt.id;
                    else return {
                        filename: elt.filename,
                        old_cd: elt.old_cd,
                        content_type: elt.content_type
                    };
                });
                break;
            case "enum":
            case "extends_enum":
                if (currentPath && currentPath.require && valueContent.value == 0) {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                if (valueContent.value === undefined) data = "";
                else data = valueContent.value.toString();
                break;
            case "enum_multi":
            case "extends_enum_multi":
                if (currentPath && currentPath.require && valueContent.values.length == 0) {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                data = valueContent.values;
                break;
            case "userlist":
            case "members_of_shifts":
            case "members_of_locations":
            case "multiselect_offboarding_reasons":
            case "members_of_partner_class":
                if (currentPath && currentPath.require && valueContent.values.length == 0) {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                data = valueContent.values;
                break;
            case "select_department_employee":
                if (currentPath && currentPath.require && valueContent.values.length == 0) {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                data = valueContent.values;
                break;
            case "any_file":
                if (currentPath && currentPath.require && valueContent === null) {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                data = valueContent ? valueContent.id : 0;
                break;
            case "image_file":
                if (!valueContent) {
                    data = null;
                }
                else if (valueContent instanceof File) {
                    if (valueContent.type.startsWith("image") || valueContent.type.startsWith("http")){
                        data = valueContent;
                    }
                }
                else {
                    data = valueContent.id;
                }
                break;
            case "structure":
                var t_value;
                var index = typeDict[typeid];
                var typeContent = typelists[index].content.details;
                data = {};
                for (var i = 0; i < typeContent.length; i++){
                    t_value = contentModule.getValueOfForm2(valueContent[typeContent[i].localid], typeContent[i].type, typelists, typeContent[i], valueContent);
                    if (t_value === undefined) return undefined;
                    if (t_value && t_value.detailUnion){
                        data[typeContent[i].localid] = t_value.value;
                        Object.assign(data, t_value.detailUnion);
                    }
                    else data[typeContent[i].localid] = t_value;
                }
                var returnValue = {
                    extrainfo: {},
                    files: []
                };
                var typeDataContent = [];
                var index = typeDict[typeid];
                while (typelists[index].type == "extends_structure") {
                    typeDataContent = typelists[index].content.details.concat(typeDataContent);
                    index = typeDict[typelists[index].content.typeof];
                }
                typeDataContent = typelists[index].content.details.concat(typeDataContent);
                typeDataContent.forEach(function(elt){
                    var type;
                    if (isNaN(parseInt(elt.type))) type = elt.type;
                    else type = getType(typeDict[elt.type])
                    if (type == "image_file") returnValue.files.push(data[elt.localid]);
                    if (type == "any_file") returnValue.files.push(data[elt.localid]);
                    if (elt.type == -64) returnValue.files = returnValue.files.concat(data[elt.localid]);
                    returnValue.files = returnValue.files.filter(function(elt){
                        return elt > 0;
                    });
                    if (mainData[elt.localid]){
                        returnValue[mainData[elt.localid]] = data[elt.localid];
                    }
                    else {
                        returnValue.extrainfo[elt.localid] = data[elt.localid];
                    }
                    if (type == "union") {
                        if (elt.detailUnion[data[elt.localid]]){
                            elt.detailUnion[data[elt.localid]].forEach(function(cur){
                                returnValue[mainData[cur.localid]] = data[cur.localid];
                            });
                        }
                    }
                });
                data = returnValue;
                break;
            case "extends_structure":
                var t_value;
                var index = typeDict[typeid];
                var typeContent = typelists[index].content;
                var t_id = typeContent.typeof;
                var content = typelists[typeDict[t_id]].content.details.concat(typeContent.details);
                while (typelists[typeDict[t_id]].type == "extends_structure"){
                    t_id = typelists[typeDict[t_id]].content.typeof;
                    content = typelists[typeDict[t_id]].content.details.concat(content)
                }
                data = {};
                for (var i = 0; i < content.length; i++){
                    t_value = contentModule.getValueOfForm2(valueContent[content[i].localid], content[i].type, typelists, content[i], valueContent);
                    if (t_value === undefined) return undefined;
                    if (t_value && t_value.detailUnion){
                        data[content[i].localid] = t_value.value;
                        Object.assign(data, t_value.detailUnion);
                    }
                    else data[content[i].localid] = t_value;
                }
                var returnValue = {
                    extrainfo: {},
                    files: []
                };
                var typeDataContent = [];
                var index = typeDict[typeid];
                while (typelists[index].type == "extends_structure") {
                    typeDataContent = typelists[index].content.details.concat(typeDataContent);
                    index = typeDict[typelists[index].content.typeof];
                }
                typeDataContent = typelists[index].content.details.concat(typeDataContent);
                typeDataContent.forEach(function(elt){
                    var type;
                    if (isNaN(parseInt(elt.type))) type = elt.type;
                    else type = getType(typeDict[elt.type])
                    if (type == "image_file") returnValue.files.push(data[elt.localid]);
                    if (type == "any_file") returnValue.files.push(data[elt.localid]);
                    if (elt.type == -64) returnValue.files = returnValue.files.concat(data[elt.localid]);
                    returnValue.files = returnValue.files.filter(function(elt){
                        return elt > 0;
                    });
                    if (mainData[elt.localid]){
                        returnValue[mainData[elt.localid]] = data[elt.localid];
                    }
                    else {
                        returnValue.extrainfo[elt.localid] = data[elt.localid];
                    }
                    if (type == "union") {
                        if (elt.detailUnion[data[elt.localid]]){
                            elt.detailUnion[data[elt.localid]].forEach(function(cur){
                                returnValue[mainData[cur.localid]] = data[cur.localid];
                            });
                        }
                    }
                });
                data = returnValue;
                break;
            case "array":
                data = [];
                var index = typeDict[typeid];
                var typeContent = typelists[index].content;
                var t_id = typeContent.typeof;
                var dataTypeOfArray = contentModule.checkDatatypeOfArray(typelists, t_id);
                if (dataTypeOfArray == "advanced"){
                    var type = getType(typeDict[t_id]);
                    if (type == "structure" || type == "extends_structure"){
                        for (i = 0; i < valueContent.length; i++){
                            var x = contentModule.getValueOfForm2(valueContent[i], t_id, typelists);
                            if (x === undefined) return undefined;
                            if (x !== null) data.push(x);
                        }
                    }
                    else {
                        for (i = 0; i < valueContent.length; i++){
                            var x = contentModule.getValueOfForm2(valueContent[i][t_id], t_id, typelists);
                            if (x === undefined) return undefined;
                            if (x !== null) data.push(x);
                        }
                    }
                }
                else {
                    var type = getType(typeDict[t_id]);
                    if (type == "structure" || type == "extends_structure"){
                        var typeofarray = dict2[typeid].content.typeof;
                        var mainData = contentModule.getMainData(typeofarray, dict2);
                        if (!mainData) data = valueContent.records;
                        else {
                            var keys = Object.keys(mainData);
                            valueContent.records.forEach(function(record){
                                var x = EncodingClass.string.duplicate(record);
                                var cur = {};
                                keys.forEach(function(localid){
                                    cur[mainData[localid]] = x[localid];
                                    delete(x[localid]);
                                });
                                cur.extrainfo = x;
                                data.push(cur);
                            });
                        }
                    }
                    else {
                        for (i = 0; i < valueContent.records.length; i++){
                            data.push(valueContent.records[i][t_id]);
                        }
                    }
                }
                break;
            case "union":
                if (currentPath && currentPath.require && valueContent.value == 0) {
                    ModalElement.alert({message: "Chưa chọn " + currentPath.name});
                    return undefined;
                }
                data = {
                    value: valueContent.value,
                    detailUnion: {}
                };
                if (currentPath.detailUnion[data.value]){
                    for (var i = 0; i < currentPath.detailUnion[data.value].length; i++){
                        data.detailUnion[currentPath.detailUnion[data.value][i].localid] = contentModule.getValueOfForm2(unionValue[currentPath.detailUnion[data.value][i].localid], currentPath.detailUnion[data.value][i].type, typelists, currentPath.detailUnion[data.value][i]);
                        if (data.detailUnion[currentPath.detailUnion[data.value][i].localid] === undefined) return undefined;
                    }
                }
                break;
            default:

        }
        return data;
    // };
    // var data = generateData(valueContent, typeid);

    // if (data === undefined) return undefined;
};

contentModule.setValueOfForm = function(params){
    var valueContent, typeid, mainData, typelists;
    valueContent = params.valueContent;
    typeid = params.typeid;
    mainData = params.mainData;
    typelists = params.typelists;
    return new Promise(function(resolve, reject){
        valueContent = EncodingClass.string.duplicate(valueContent);
        var result;
        var typeDict = {};
        var dict2 = {};
        var primitiveTypeList = form_module.primitiveTypeList;
        var getType = function(index){
            var type = typelists[index].type;
            if (form_module.primitiveTypeList.indexOf(type) != -1){
                type = typelists[index].type2;
            }
            return type;
        }
        typelists.forEach(function(elt, index){
            typeDict[elt.id] = index;
            dict2[elt.id] = elt;
        });
        var posDict = {};
        var generateData = function(valueContent, typeid, currentPath){
            return new Promise(function(rs, rj){
                var data;
                var type;
                if (isNaN(parseInt(typeid, 10))) type = typeid;
                else type = getType(typeDict[typeid]);
                switch (type) {
                    case "nation_city":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "position_list":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "employee_list":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "string":
                    case "phonenumber":
                    case "gps":
                    case "website":
                    case "note":
                    case "html":
                    case "variable_input":
                    case "variable_textarea":
                    case "email_address":
                        data = valueContent !== undefined ? valueContent : "";
                        rs(data);
                        break;
                    case "date_level":
                        data = valueContent;
                        if (!data) data = {
                            level: "date",
                            value: new Date(TIME_NULL_MILLISECOND)
                        };
                        if (data.value && data.value.getTime() == TIME_NULL_MILLISECOND) data.value = null;
                        rs(data);
                        break;
                    case "datemonth":
                        data = valueContent;
                        rs(data);
                        break;
                    case "year":
                    case "month":
                    case "week":
                    case "time":
                        data = valueContent;
                        if (typeof(data) == "string") data = new Date(data);
                        if (data && data.getTime() == TIME_NULL_MILLISECOND) data = null;
                        rs(data);
                        break;
                    case "boolean":
                        data = (valueContent === undefined || valueContent === null) ? currentPath.default : valueContent;
                        rs(data);
                        break;
                    case "date":
                        if (!valueContent && currentPath.default){
                            if (currentPath.default[0] == "custom") data = currentPath.default[1];
                            else if (currentPath.default[0] == "today") data = new Date();
                            else {
                                data = new Date();
                                data.setDate(1);
                            }
                        }
                        else data = valueContent;
                        if (typeof(data) == "string") data = new Date(data);
                        if (data && data.getTime() == TIME_NULL_MILLISECOND) data = null;
                        rs(data);
                        break;
                    case "datetime":
                        if (!valueContent && currentPath.default){
                            if (currentPath.default[0] == "custom") data = currentPath.default[1];
                            else if (currentPath.default[0] == "today") {
                                data = new Date();
                                data.setHours(0);
                                data.setMilliseconds(0);
                                data.setSeconds(0);
                                data.setMinutes(0);
                            }
                            else {
                                data = new Date();
                                data.setDate(1);
                                data.setHours(0);
                                data.setMilliseconds(0);
                                data.setSeconds(0);
                                data.setMinutes(0);
                            }
                        }
                        else data = valueContent;
                        if (typeof(data) == "string") data = new Date(data);
                        if (data && data.getTime() == TIME_NULL_MILLISECOND) data = null;
                        rs(data);
                        break;
                    case "number":
                    case "currency":
                        data = valueContent !== undefined ? valueContent == "" ? 0 : valueContent : currentPath.default;
                        rs(data);
                        break;
                    case "hour_period":
                        data = valueContent;
                        rs(data);
                        break;
                    case "userlist":
                    case "members_of_shifts":
                    case "members_of_partner_class":
                    case "multiselect_offboarding_reasons":
                    case "members_of_locations":
                    case "select_department_employee":
                        data = {
                            values: valueContent !== undefined ? valueContent : []
                        };
                        rs(data);
                        break;
                    case "member_of_position":
                        if (!valueContent || valueContent == 0){
                            rs({
                                value: 0
                            });
                        }
                        else {
                            Promise.all([data_module.loadOrgsList(), data_module.loadPositionById2(valueContent)]).then(function(result){
                                if (result[1].length == 0){
                                    rs({
                                        value: 0
                                    });
                                }
                                else {
                                    var subHost = {
                                        database: {}
                                    };
                                    contentModule.makeDatabaseContent(subHost, {orgs: result[0]});
                                    contentModule.makeOrgsIndex(subHost);
                                    var t = subHost.database.orgs.items[subHost.database.orgs.getIndex(result[1][0].orgid)];
                                    while (t.parentid != 0){
                                        t = subHost.database.orgs.items[subHost.database.orgs.getIndex(t.parentid)];
                                    }
                                    var data = {
                                        position: {
                                            value: valueContent
                                        },
                                        department: {
                                            value: result[1][0].orgid
                                        },
                                        company: {
                                            value: t.id
                                        }
                                    };
                                    rs(data);
                                }
                            });
                        }
                        break;
                    case "user":
                    case "member_of_worktime_machines":
                    case "geopos":
                    case "member_of_department":
                    case "member_of_position_2":
                    case "member_of_employee":
                    case "member_of_template_groups":
                    case "member_of_welcome_templates":
                    case "member_of_assets":
                    case "member_of_instruments_and_tools":
                    case "member_of_assets_instruments_and_tools":
                    case "member_of_warehouses":
                    case "member_of_allowance_policy_groups":
                    case "member_of_bonus_policy_groups":
                    case "member_of_piece_wage_policy_groups":
                    case "member_of_attendance_clock_policy_groups":
                    case "member_of_standard_workday_policy_groups":
                    case "member_of_work_flow_groups":
                    case "member_of_work_flows":
                    case "member_of_payroll_cycle":
                    case "member_of_objects":
                    case "member_of_lesson_categories":
                    case "member_of_task":
                    case "member_of_meeting":
                    case "member_of_typelists":
                    case "member_of_input_forms":
                    case "member_of_output_forms":
                    case "member_of_mobile_input_forms":
                    case "member_of_mobile_output_forms":
                    case "member_of_partner_class":
                    case "member_of_partner":
                    case "member_of_contact":
                    case "member_of_trade_union_policy_groups":
                    case "member_of_overtime_policy_groups":
                    case "member_of_offboarding_types":
                    case "member_of_offboarding_reasons":
                    case "member_of_other_liability_policy_groups":
                    case "member_of_other_policy_groups":
                    case "member_of_policies":
                    case "member_of_salary_policy_groups":
                    case "member_of_punishment_policy_groups":
                    case "member_of_asset_category":
                    case "member_of_instruments_and_tools_category":
                    case "member_of_projects":
                    case "member_of_tax_policy_groups":
                    case "member_of_advance_payment_policy_groups":
                    case "member_of_late_early_checkin_policy_groups":
                    case "member_of_benefit_policy_groups":
                    case "member_of_leave_policy_groups":
                    case "member_of_insurance_policy_groups":
                    case "member_of_training_program_groups":
                    case "member_of_shifts":
                    case "member_of_timesheets":
                    case "member_of_pay_percentage":
                    case "member_of_insurance_policies":
                    case "member_of_tax_policies":
                    case "member_of_trade_union_policies":
                    case "member_of_leave_policies":
                    case "member_of_benefit_policies":
                    case "member_of_allowance_policies":
                    case "member_of_bonus_policies":
                    case "member_of_standard_workday_policies":
                    case "member_of_overtime_policies":
                    case "member_of_punishment_policies":
                    case "member_of_advance_payment_policies":
                    case "member_of_late_early_checkin_policies":
                    case "member_of_salary_policies":
                    case "member_of_other_liability_policies":
                    case "member_of_employment_contract_types":
                    case "member_of_nations":
                    case "member_of_cities":
                    case "member_of_ethnics":
                    case "member_of_religions":
                    case "member_of_document_types":
                    case "member_of_document_groups":
                    case "member_of_document_folders":
                    case "member_of_orgs":
                    case "member_of_product_groups":
                    case "member_of_product_list":
                    case "member_of_piece_wage_policies":
                    case "member_of_attendance_clock_policies":
                    case "member_of_position_groups":
                    case "language":
                        data = {
                            value: valueContent !== undefined ? valueContent : currentPath.default !== undefined ? currentPath.default : 0
                        };
                        rs(data);
                        break;
                    case "color_picker":
                        data = valueContent == "" ? "white" : valueContent;
                        rs(data);
                        break;
                    case "files":
                        if (!valueContent) rs([]);
                        else {
                            if (valueContent["-64"]) data = valueContent["-64"];
                            else data = valueContent;
                            data_module.makeFilesContent(data).then(function(result){
                                rs(result);
                            });
                        }
                        break;
                    case "any_file":
                    case "image_file":
                        // data_module.makeImageContent(valueContent).then(function(result){
                        //     rs(result);
                        // });
                        if (!valueContent) {
                            rs(valueContent);
                        }
                        else if (typeof(valueContent) == "string") {
                            if (valueContent.startsWith("http")) {
                                rs(valueContent);
                            }
                        }
                        else {
                            data_module.makeImageContent(valueContent).then(function(result){
                                rs(result);
                            });
                        }
                        break;
                    case "enum":
                    case "extends_enum":
                        var index = typeDict[typeid];
                        var typeContent = typelists[index].content.details;
                        if (currentPath.default !== undefined) {
                            for (var i = 0; i < typeContent.length; i++) {
                                if (typeContent[i].value == currentPath.default) {
                                    currentPath.default = typeContent[i].localid;
                                    break;
                                }
                            }
                        }
                        data = {
                            value: valueContent !== undefined ? valueContent : currentPath.default !== undefined ? currentPath.default : 0
                            // list: lists
                        };
                        rs(data);
                        break;
                    case "enum_multi":
                    case "extends_enum_multi":
                        data = {
                            value: valueContent !== undefined ? valueContent : []
                            // list: lists
                        };
                        rs(data);
                        break;
                    case "structure":
                        if (!valueContent) rs({});
                        else {
                            var index = typeDict[typeid];
                            var typeContent = typelists[index].content.details;
                            var t_data = {};
                            typeContent.forEach(function(elt){
                                t_data[elt.localid] = generateData(valueContent[elt.localid], elt.type, elt);
                            });
                            Promise.all(Object.values(t_data)).then(function(result){
                                data = {};
                                Object.keys(t_data).forEach(function(elt, idx){
                                    // if (result[idx] && result[idx].employee && result[idx].department && result[idx].company){
                                    //     data[elt] = result[idx].employee;
                                    //     data[elt + "_choose_department"] = result[idx].department;
                                    //     data[elt + "_choose_company"] = result[idx].company;
                                    // }
                                    // else if (result[idx] && result[idx].position && result[idx].department && result[idx].company){
                                    //     data[elt] = result[idx].position;
                                    //     data[elt + "_choose_department"] = result[idx].department;
                                    //     data[elt + "_choose_company"] = result[idx].company;
                                    // }
                                    // else
                                    if (result[idx] && result[idx].detailUnion){
                                        data[elt] = {
                                            value: result[idx].value
                                        };
                                        Object.assign(data, result[idx].detailUnion);
                                    }
                                    else data[elt] = result[idx];
                                });
                                rs(data);
                            }, function(message){rj(message);});
                        }
                        break;
                    case "extends_structure":
                        if (!valueContent) rs({});
                        else {
                            var index = typeDict[typeid];
                            var typeContent = typelists[index].content;
                            var t_id = typeContent.typeof;
                            var content = typelists[typeDict[t_id]].content.details.concat(typeContent.details);
                            while (typelists[typeDict[t_id]].type == "extends_structure"){
                                t_id = typelists[typeDict[t_id]].content.typeof;
                                content = typelists[typeDict[t_id]].content.details.concat(content)
                            }
                            var t_data = {};
                            content.forEach(function(elt){
                                if (valueContent[elt.localid] !== undefined) t_data[elt.localid] = generateData(valueContent[elt.localid], elt.type, elt);
                            });
                            Promise.all(Object.values(t_data)).then(function(result){
                                data = {};
                                Object.keys(t_data).forEach(function(elt, idx){
                                    // if (result[idx] && result[idx].employee && result[idx].department && result[idx].company){
                                    //     data[elt] = result[idx].employee;
                                    //     data[elt + "_choose_department"] = result[idx].department;
                                    //     data[elt + "_choose_company"] = result[idx].company;
                                    // }
                                    // else if (result[idx] && result[idx].position && result[idx].department && result[idx].company){
                                    //     data[elt] = result[idx].position;
                                    //     data[elt + "_choose_department"] = result[idx].department;
                                    //     data[elt + "_choose_company"] = result[idx].company;
                                    // }
                                    // else
                                    if (result[idx] && result[idx].detailUnion){
                                        data[elt] = {
                                            value: result[idx].value
                                        };
                                        Object.assign(data, result[idx].detailUnion);
                                    }
                                    else data[elt] = result[idx];
                                });
                                rs(data);
                            }, function(message){rj(message);});
                        }
                        break;
                    case "array":
                        data = {};
                        data[typeid] = [];
                        if (!valueContent) rs(data);
                        else {
                            var index = typeDict[typeid];
                            var typeContent = typelists[index].content;
                            var t_id = typeContent.typeof;
                            var dataTypeOfArray = contentModule.checkDatatypeOfArray(typelists, t_id);
                            var t;
                            if (valueContent.constructor === Object) t = valueContent[typeid];
                            else t = valueContent;
                            if (!t) t = [];
                            if (dataTypeOfArray == "advanced"){
                                var type = getType(typeDict[t_id]);
                                if (type == "structure" || type == "extends_structure"){
                                    var t_data = [];
                                    t.forEach(function(elt){
                                        t_data.push(generateData(elt, t_id));
                                        // data[typeid].push(generateData(elt, t_id));
                                    });
                                    Promise.all(t_data).then(function(result){
                                        data[typeid] = result;
                                        rs(data);
                                    }, function(message){rj(message);});
                                }
                                else {
                                    var t_data = [];
                                    t.forEach(function(elt){
                                        t_data.push(generateData(elt, t_id));
                                    });
                                    Promise.all(t_data).then(function(result){
                                        result.forEach(function(elt){
                                            var x = {};
                                            x[t_id] = elt;
                                            data[typeid].push(x);
                                        });
                                        rs(data);
                                    }, function(message){rj(message);});
                                }
                            }
                            else {
                                data[typeid] = {records: []};
                                var type = getType(typeDict[t_id]);
                                if (type == "structure" || type == "extends_structure"){
                                    var typeofarray = dict2[typeid].content.typeof;
                                    var mainData = contentModule.getMainData(typeofarray, dict2);
                                    if (!mainData) data[typeid].records = t;
                                    else {
                                        var keys = Object.keys(mainData);
                                        t.forEach(function(record){
                                            var x = EncodingClass.string.duplicate(record);
                                            var cur = {};
                                            keys.forEach(function(localid){
                                                if (mainData[localid] && x[mainData[localid]]) {
                                                    cur[localid] = x[mainData[localid]];
                                                    // if (typeof(cur[localid]) == "string") {
                                                    //     var tempDate = new Date(cur[localid]);
                                                    //     if (tempDate.toString() != "Invalid Date") {
                                                    //         cur[localid] = tempDate;
                                                    //     }
                                                    // }
                                                }
                                            });
                                            data[typeid].records.push(cur);
                                        });
                                    }
                                }
                                else {
                                    t.forEach(function(elt){
                                        var x = {};
                                        x[t_id] = elt;
                                        data[typeid].records.push(x);
                                    });
                                }
                                rs(data);
                            }
                        }
                        break;
                    case "union":
                        data = {
                            value: valueContent,
                            detailUnion: {}
                        };
                        var t_data = {};
                        if (currentPath.detailUnion[data.value]){
                            currentPath.detailUnion[data.value].forEach(function(elt){
                                t_data[elt.localid] = generateData(result[elt.localid], elt.type, elt);
                                // t_data[elt.localid] = generateData(valueContent.detailUnion[elt.localid], elt.type, elt);
                            });
                        }
                        Promise.all(Object.values(t_data)).then(function(result){
                            Object.keys(t_data).forEach(function(elt, idx){
                                data.detailUnion[elt] = result[idx];
                            });
                            rs(data);
                        }, function(message){rj(message);});
                        break;
                    default:
                        rj("undefined type: " + type);
                }
            });
        };

        var typeDataContent = [];
        var index = typeDict[typeid];
        while (typelists[index].type == "extends_structure") {
            typeDataContent = typelists[index].content.details.concat(typeDataContent);
            index = typeDict[typelists[index].content.typeof];
        }
        typeDataContent = typelists[index].content.details.concat(typeDataContent);
        ////////////
        result = valueContent.extrainfo ? valueContent.extrainfo : {};
        if (mainData) {
            typeDataContent.forEach(function(elt){
                if (mainData[elt.localid] !== undefined && valueContent[mainData[elt.localid]] !== undefined){
                    result[elt.localid] = valueContent[mainData[elt.localid]];
                    if (elt.type == "union") {
                        Object.keys(elt.detailUnion).forEach(function(cur){
                            elt.detailUnion[cur].forEach(function(ud){
                                result[ud.localid] = valueContent[mainData[ud.localid]];
                            });
                        });
                    }
                }
            });
        }

        generateData(result, typeid).then(function(result){
            resolve(result);
        }, function(message){console.log(message); reject(message);});
        ////////////
    });
};

contentModule.setValueOfUserForm = function(params){
    var valueContent, typeid, typelists;
    valueContent = params.valueContent;
    typeid = params.typeid;
    typelists = params.typelists;
    return new Promise(function(resolve, reject){
        valueContent = EncodingClass.string.duplicate(valueContent);
        var result;
        var typeDict = {};
        var dict2 = {};
        var primitiveTypeList = form_module.primitiveTypeList;
        var getType = function(index){
            var type = typelists[index].type;
            if (form_module.primitiveTypeList.indexOf(type) != -1){
                type = typelists[index].type2;
            }
            return type;
        }
        typelists.forEach(function(elt, index){
            typeDict[elt.id] = index;
            dict2[elt.id] = elt;
        });
        var posDict = {};
        var generateData = function(valueContent, typeid, currentPath){
            return new Promise(function(rs, rj){
                var data;
                var type;
                if (isNaN(parseInt(typeid, 10))) type = typeid;
                else type = getType(typeDict[typeid]);
                switch (type) {
                    case "nation_city":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "position_list":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "employee_list":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "string":
                    case "phonenumber":
                    case "gps":
                    case "website":
                    case "note":
                    case "html":
                    case "variable_input":
                    case "variable_textarea":
                    case "email_address":
                        data = valueContent !== undefined ? valueContent : "";
                        rs(data);
                        break;
                    case "date_level":
                        data = valueContent;
                        if (!data) data = {
                            level: "date",
                            value: new Date(TIME_NULL_MILLISECOND)
                        };
                        if (data.value && data.value.getTime() == TIME_NULL_MILLISECOND) data.value = null;
                        rs(data);
                        break;
                    case "datemonth":
                        data = valueContent;
                        rs(data);
                        break;
                    case "year":
                    case "month":
                    case "week":
                    case "time":
                        data = valueContent;
                        if (typeof(data) == "string") data = new Date(data);
                        if (data && data.getTime() == TIME_NULL_MILLISECOND) data = null;
                        rs(data);
                        break;
                    case "boolean":
                        data = (valueContent === undefined || valueContent === null) ? currentPath.default : valueContent;
                        rs(data);
                        break;
                    case "date":
                        if (!valueContent && currentPath.default){
                            if (currentPath.default[0] == "custom") data = currentPath.default[1];
                            else if (currentPath.default[0] == "today") data = new Date();
                            else {
                                data = new Date();
                                data.setDate(1);
                            }
                        }
                        else data = valueContent;
                        if (typeof(data) == "string") data = new Date(data);
                        if (data && data.getTime() == TIME_NULL_MILLISECOND) data = null;
                        rs(data);
                        break;
                    case "datetime":
                        if (!valueContent && currentPath.default){
                            if (currentPath.default[0] == "custom") data = currentPath.default[1];
                            else if (currentPath.default[0] == "today") {
                                data = new Date();
                                data.setHours(0);
                                data.setMilliseconds(0);
                                data.setSeconds(0);
                                data.setMinutes(0);
                            }
                            else {
                                data = new Date();
                                data.setDate(1);
                                data.setHours(0);
                                data.setMilliseconds(0);
                                data.setSeconds(0);
                                data.setMinutes(0);
                            }
                        }
                        else data = valueContent;
                        if (typeof(data) == "string") data = new Date(data);
                        if (data && data.getTime() == TIME_NULL_MILLISECOND) data = null;
                        rs(data);
                        break;
                    case "number":
                    case "currency":
                        data = valueContent !== undefined ? valueContent == "" ? 0 : valueContent : currentPath.default;
                        rs(data);
                        break;
                    case "hour_period":
                        data = valueContent;
                        rs(data);
                        break;
                    case "userlist":
                    case "members_of_shifts":
                    case "members_of_partner_class":
                    case "multiselect_offboarding_reasons":
                    case "members_of_locations":
                    case "select_department_employee":
                        data = {
                            values: valueContent !== undefined ? valueContent : []
                        };
                        rs(data);
                        break;
                    case "member_of_position":
                        if (!valueContent || valueContent == 0){
                            rs({
                                value: 0
                            });
                        }
                        else {
                            Promise.all([data_module.loadOrgsList(), data_module.loadPositionById2(valueContent)]).then(function(result){
                                if (result[1].length == 0){
                                    rs({
                                        value: 0
                                    });
                                }
                                else {
                                    var subHost = {
                                        database: {}
                                    };
                                    contentModule.makeDatabaseContent(subHost, {orgs: result[0]});
                                    contentModule.makeOrgsIndex(subHost);
                                    var t = subHost.database.orgs.items[subHost.database.orgs.getIndex(result[1][0].orgid)];
                                    while (t.parentid != 0){
                                        t = subHost.database.orgs.items[subHost.database.orgs.getIndex(t.parentid)];
                                    }
                                    var data = {
                                        position: {
                                            value: valueContent
                                        },
                                        department: {
                                            value: result[1][0].orgid
                                        },
                                        company: {
                                            value: t.id
                                        }
                                    };
                                    rs(data);
                                }
                            });
                        }
                        break;
                    case "geopos":
                    case "user":
                    case "member_of_department":
                    case "member_of_employee":
                    case "member_of_position_2":
                    case "member_of_template_groups":
                    case "member_of_welcome_templates":
                    case "member_of_worktime_machines":
                    case "member_of_assets":
                    case "member_of_instruments_and_tools":
                    case "member_of_assets_instruments_and_tools":
                    case "member_of_warehouses":
                    case "member_of_allowance_policy_groups":
                    case "member_of_bonus_policy_groups":
                    case "member_of_piece_wage_policy_groups":
                    case "member_of_attendance_clock_policy_groups":
                    case "member_of_standard_workday_policy_groups":
                    case "member_of_work_flow_groups":
                    case "member_of_work_flows":
                    case "member_of_objects":
                    case "member_of_payroll_cycle":
                    case "member_of_lesson_categories":
                    case "member_of_task":
                    case "member_of_meeting":
                    case "member_of_typelists":
                    case "member_of_input_forms":
                    case "member_of_output_forms":
                    case "member_of_mobile_input_forms":
                    case "member_of_mobile_output_forms":
                    case "member_of_partner_class":
                    case "member_of_partner":
                    case "member_of_contact":
                    case "member_of_other_liability_policy_groups":
                    case "member_of_other_policy_groups":
                    case "member_of_policies":
                    case "member_of_trade_union_policy_groups":
                    case "member_of_overtime_policy_groups":
                    case "member_of_offboarding_types":
                    case "member_of_offboarding_reasons":
                    case "member_of_salary_policy_groups":
                    case "member_of_punishment_policy_groups":
                    case "member_of_asset_category":
                    case "member_of_instruments_and_tools_category":
                    case "member_of_projects":
                    case "member_of_tax_policy_groups":
                    case "member_of_advance_payment_policy_groups":
                    case "member_of_late_early_checkin_policy_groups":
                    case "member_of_benefit_policy_groups":
                    case "member_of_leave_policy_groups":
                    case "member_of_insurance_policy_groups":
                    case "member_of_training_program_groups":
                    case "member_of_shifts":
                    case "member_of_timesheets":
                    case "member_of_pay_percentage":
                    case "member_of_insurance_policies":
                    case "member_of_tax_policies":
                    case "member_of_trade_union_policies":
                    case "member_of_leave_policies":
                    case "member_of_benefit_policies":
                    case "member_of_allowance_policies":
                    case "member_of_bonus_policies":
                    case "member_of_standard_workday_policies":
                    case "member_of_overtime_policies":
                    case "member_of_punishment_policies":
                    case "member_of_advance_payment_policies":
                    case "member_of_late_early_checkin_policies":
                    case "member_of_salary_policies":
                    case "member_of_other_liability_policies":
                    case "member_of_employment_contract_types":
                    case "member_of_nations":
                    case "member_of_cities":
                    case "member_of_ethnics":
                    case "member_of_religions":
                    case "member_of_document_types":
                    case "member_of_document_groups":
                    case "member_of_document_folders":
                    case "member_of_orgs":
                    case "member_of_product_groups":
                    case "member_of_product_list":
                    case "member_of_piece_wage_policies":
                    case "member_of_attendance_clock_policies":
                    case "member_of_position_groups":
                    case "language":
                        data = {
                            value: valueContent !== undefined ? valueContent : 0
                        };
                        rs(data);
                        break;
                    case "color_picker":
                        data = valueContent == "" ? "white" : valueContent;
                        rs(data);
                        break;
                    case "files":
                        if (!valueContent) rs([]);
                        else {
                            if (valueContent["-64"]) data = valueContent["-64"];
                            else data = valueContent;
                            data_module.makeFilesContent(data).then(function(result){
                                rs(result);
                            });
                        }
                        break;
                    case "any_file":
                    case "image_file":
                        // data_module.makeImageContent(valueContent).then(function(result){
                        //     rs(result);
                        // });
                        if (!valueContent) {
                            rs(valueContent);
                        }
                        else if (typeof(valueContent) == "string") {
                            if (valueContent.startsWith("http")) {
                                rs(valueContent);
                            }
                        }
                        else {
                            data_module.makeImageContent(valueContent).then(function(result){
                                rs(result);
                            });
                        }
                        break;
                    case "enum":
                    case "extends_enum":
                        data = {
                            value: valueContent !== undefined ? valueContent : 0,
                            // list: lists
                        };
                        rs(data);
                        break;
                    case "enum_multi":
                    case "extends_enum_multi":
                        data = {
                            values: valueContent !== undefined ? valueContent : []
                            // list: lists
                        };
                        rs(data);
                        break;
                    case "structure":
                        if (!valueContent) rs({});
                        else {
                            var index = typeDict[typeid];
                            var typeContent = typelists[index].content.details;
                            var t_data = {};
                            typeContent.forEach(function(elt){
                                t_data[elt.localid] = generateData(valueContent[elt.localid], elt.type, elt);
                            });
                            Promise.all(Object.values(t_data)).then(function(result){
                                data = {};
                                Object.keys(t_data).forEach(function(elt, idx){
                                    if (result[idx] && result[idx].detailUnion){
                                        data[elt] = {
                                            value: result[idx].value
                                        };
                                        Object.assign(data, result[idx].detailUnion);
                                    }
                                    else data[elt] = result[idx];
                                });
                                rs(data);
                            }, function(message){rj(message);});
                        }
                        break;
                    case "extends_structure":
                        if (!valueContent) rs({});
                        else {
                            var index = typeDict[typeid];
                            var typeContent = typelists[index].content;
                            var t_id = typeContent.typeof;
                            var content = typelists[typeDict[t_id]].content.details.concat(typeContent.details);
                            while (typelists[typeDict[t_id]].type == "extends_structure"){
                                t_id = typelists[typeDict[t_id]].content.typeof;
                                content = typelists[typeDict[t_id]].content.details.concat(content)
                            }
                            var t_data = {};
                            content.forEach(function(elt){
                                if (valueContent[elt.localid]) t_data[elt.localid] = generateData(valueContent[elt.localid], elt.type, elt);
                            });
                            Promise.all(Object.values(t_data)).then(function(result){
                                data = {};
                                Object.keys(t_data).forEach(function(elt, idx){
                                    if (result[idx] && result[idx].detailUnion){
                                        data[elt] = {
                                            value: result[idx].value
                                        };
                                        Object.assign(data, result[idx].detailUnion);
                                    }
                                    else data[elt] = result[idx];
                                });
                                rs(data);
                            }, function(message){rj(message);});
                        }
                        break;
                    case "array":
                        data = {};
                        data[typeid] = [];
                        if (!valueContent) rs(data);
                        else {
                            var index = typeDict[typeid];
                            var typeContent = typelists[index].content;
                            var t_id = typeContent.typeof;
                            var dataTypeOfArray = contentModule.checkDatatypeOfArray(typelists, t_id);
                            var t;
                            if (valueContent.constructor === Object) t = valueContent[typeid];
                            else t = valueContent;
                            if (!t) t  = [];
                            if (dataTypeOfArray == "advanced"){
                                var type = getType(typeDict[t_id]);
                                if (type == "structure" || type == "extends_structure"){
                                    var t_data = [];
                                    t.forEach(function(elt){
                                        t_data.push(generateData(elt, t_id));
                                    });
                                    Promise.all(t_data).then(function(result){
                                        data[typeid] = result;
                                        rs(data);
                                    }, function(message){rj(message);});
                                }
                                else {
                                    var t_data = [];
                                    t.forEach(function(elt){
                                        t_data.push(generateData(elt, t_id));
                                    });
                                    Promise.all(t_data).then(function(result){
                                        result.forEach(function(elt){
                                            var x = {};
                                            x[t_id] = elt;
                                            data[typeid].push(x);
                                        });
                                        rs(data);
                                    }, function(message){rj(message);});
                                }
                            }
                            else {
                                data[typeid] = {records: []};
                                var type = getType(typeDict[t_id]);
                                if (type == "structure" || type == "extends_structure"){
                                    var typeofarray = dict2[typeid].content.typeof;
                                    // t.forEach((item, i) => {
                                    //     var keys = Object.keys(item);
                                    //     keys.forEach(function(localid){
                                    //         if (typeof(item[localid]) == "string") {
                                    //             var tempDate = new Date(item[localid]);
                                    //             if (tempDate.toString() != "Invalid Date") {
                                    //                 item[localid] = tempDate;
                                    //             }
                                    //         }
                                    //     });
                                    // });

                                    data[typeid].records = t;
                                }
                                else {
                                    t.forEach(function(elt){
                                        var x = {};
                                        x[t_id] = elt;
                                        data[typeid].records.push(x);
                                    });
                                }
                                rs(data);
                            }
                        }
                        break;
                    case "union":
                        data = {
                            value: valueContent,
                            detailUnion: {}
                        };
                        var t_data = {};
                        if (currentPath.detailUnion[data.value]){
                            currentPath.detailUnion[data.value].forEach(function(elt){
                                t_data[elt.localid] = generateData(result[elt.localid], elt.type, elt);
                            });
                        }
                        Promise.all(Object.values(t_data)).then(function(result){
                            Object.keys(t_data).forEach(function(elt, idx){
                                data.detailUnion[elt] = result[idx];
                            });
                            rs(data);
                        }, function(message){rj(message);});
                        break;
                    default:
                        rj("undefined type: " + type);
                }
            });
        };

        // var typeDataContent = [];
        // var index = typeDict[typeid];
        // while (typelists[index].type == "extends_structure") {
        //     typeDataContent = typelists[index].content.details.concat(typeDataContent);
        //     index = typeDict[typelists[index].content.typeof];
        // }
        // typeDataContent = typelists[index].content.details.concat(typeDataContent);
        ////////////
        // result = valueContent.extrainfo ? valueContent.extrainfo : {};

        generateData(valueContent, typeid).then(function(result){
            resolve(result);
        }, function(message){console.log(message); reject(message);});
        ////////////
    });
};

contentModule.setValueOfForm2 = function(params){
    return new Promise(function(rs, rj){
        var valueContent, typeid, mainData, typelists;
        valueContent = params.valueContent;
        typeid = params.typeid;
        typelists = params.typelists;
        valueContent = EncodingClass.string.duplicate(valueContent);
        var result;
        var typeDict = {};
        var dict2 = {};
        var primitiveTypeList = form_module.primitiveTypeList;
        var getType = function(index){
            var type = typelists[index].type;
            if (
                form_module.primitiveTypeList.indexOf(type) != -1
            ){
                type = typelists[index].type2;
            }
            return type;
        }
        typelists.forEach(function(elt, index){
            typeDict[elt.id] = index;
            dict2[elt.id] = elt;
        });
        mainData = contentModule.getMainData(typeid, dict2);
        var posDict = {};
        // var generateData = function(valueContent, typeid, currentPath){
        //     return new Promise(function(rs, rj){
                var data;
                var type;
                if (isNaN(parseInt(typeid, 10))) type = typeid;
                else type = getType(typeDict[typeid]);
                switch (type) {
                    case "nation_city":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "position_list":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "employee_list":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "string":
                    case "phonenumber":
                    case "website":
                    case "gps":
                    case "note":
                    case "html":
                    case "variable_input":
                    case "variable_textarea":
                    case "email_address":
                        data = valueContent !== undefined ? valueContent : "";
                        rs(data);
                        break;
                    case "date_level":
                        data = valueContent;
                        if (!data) data = {
                            level: "date",
                            value: new Date(TIME_NULL_MILLISECOND)
                        };
                        if (data.value && data.value.getTime() == TIME_NULL_MILLISECOND) data.value = null;
                        rs(data);
                        break;
                    case "datemonth":
                        data = valueContent;
                        rs(data);
                        break;
                    case "year":
                    case "month":
                    case "time":
                        data = valueContent;
                        if (typeof(data) == "string") data = new Date(data);
                        if (data && data.getTime() == TIME_NULL_MILLISECOND) data = null;
                        rs(data);
                        break;
                    case "boolean":
                        data = (valueContent === undefined || valueContent === null) ? currentPath.default : valueContent;
                        rs(data);
                        break;
                    case "date":
                        if (!valueContent && currentPath.default){
                            if (currentPath.default[0] == "custom") data = currentPath.default[1];
                            else if (currentPath.default[0] == "today") data = new Date();
                            else {
                                data = new Date();
                                data.setDate(1);
                            }
                        }
                        else data = valueContent;
                        if (typeof(data) == "string") data = new Date(data);
                        if (data && data.getTime() == TIME_NULL_MILLISECOND) data = null;
                        rs(data);
                        break;
                    case "datetime":
                        if (!valueContent && currentPath.default){
                            if (currentPath.default[0] == "custom") data = currentPath.default[1];
                            else if (currentPath.default[0] == "today") {
                                data = new Date();
                                data.setHours(0);
                                data.setMilliseconds(0);
                                data.setSeconds(0);
                                data.setMinutes(0);
                            }
                            else {
                                data = new Date();
                                data.setDate(1);
                                data.setHours(0);
                                data.setMilliseconds(0);
                                data.setSeconds(0);
                                data.setMinutes(0);
                            }
                        }
                        else data = valueContent;
                        if (typeof(data) == "string") data = new Date(data);
                        if (data && data.getTime() == TIME_NULL_MILLISECOND) data = null;
                        rs(data);
                        break;
                    case "number":
                    case "currency":
                        data = valueContent !== undefined ? valueContent == "" ? 0 : valueContent : currentPath.default;
                        rs(data);
                        break;
                    case "hour_period":
                        data = valueContent;
                        rs(data);
                        break;
                    case "userlist":
                    case "members_of_shifts":
                    case "members_of_partner_class":
                    case "multiselect_offboarding_reasons":
                    case "members_of_locations":
                    case "select_department_employee":
                        data = {
                            values: valueContent !== undefined ? valueContent : []
                        };
                        rs(data);
                        break;
                    case "member_of_position":
                        if (!valueContent || valueContent == 0){
                            rs({
                                value: 0
                            });
                        }
                        else {
                            Promise.all([data_module.loadOrgsList(), data_module.loadPositionById2(valueContent)]).then(function(result){
                                if (result[1].length == 0){
                                    rs({
                                        value: 0
                                    });
                                }
                                else {
                                    var subHost = {
                                        database: {}
                                    };
                                    contentModule.makeDatabaseContent(subHost, {orgs: result[0]});
                                    contentModule.makeOrgsIndex(subHost);
                                    var t = subHost.database.orgs.items[subHost.database.orgs.getIndex(result[1][0].orgid)];
                                    while (t.parentid != 0){
                                        t = subHost.database.orgs.items[subHost.database.orgs.getIndex(t.parentid)];
                                    }
                                    var data = {
                                        position: {
                                            value: valueContent
                                        },
                                        department: {
                                            value: result[1][0].orgid
                                        },
                                        company: {
                                            value: t.id
                                        }
                                    };
                                    rs(data);
                                }
                            });
                        }
                        break;
                    case "member_of_employee":
                    case "user":
                    case "geopos":
                    case "member_of_department":
                    case "member_of_position_2":
                    case "member_of_template_groups":
                    case "member_of_welcome_templates":
                    case "member_of_worktime_machines":
                    case "member_of_assets":
                    case "member_of_instruments_and_tools":
                    case "member_of_assets_instruments_and_tools":
                    case "member_of_warehouses":
                    case "member_of_allowance_policy_groups":
                    case "member_of_bonus_policy_groups":
                    case "member_of_piece_wage_policy_groups":
                    case "member_of_attendance_clock_policy_groups":
                    case "member_of_standard_workday_policy_groups":
                    case "member_of_work_flow_groups":
                    case "member_of_work_flows":
                    case "member_of_objects":
                    case "member_of_payroll_cycle":
                    case "member_of_lesson_categories":
                    case "member_of_task":
                    case "member_of_meeting":
                    case "member_of_typelists":
                    case "member_of_input_forms":
                    case "member_of_output_forms":
                    case "member_of_mobile_input_forms":
                    case "member_of_mobile_output_forms":
                    case "member_of_partner_class":
                    case "member_of_partner":
                    case "member_of_contact":
                    case "member_of_other_liability_policy_groups":
                    case "member_of_other_policy_groups":
                    case "member_of_policies":
                    case "member_of_trade_union_policy_groups":
                    case "member_of_overtime_policy_groups":
                    case "member_of_offboarding_types":
                    case "member_of_offboarding_reasons":
                    case "member_of_salary_policy_groups":
                    case "member_of_punishment_policy_groups":
                    case "member_of_asset_category":
                    case "member_of_instruments_and_tools_category":
                    case "member_of_projects":
                    case "member_of_tax_policy_groups":
                    case "member_of_advance_payment_policy_groups":
                    case "member_of_late_early_checkin_policy_groups":
                    case "member_of_benefit_policy_groups":
                    case "member_of_leave_policy_groups":
                    case "member_of_insurance_policy_groups":
                    case "member_of_training_program_groups":
                    case "member_of_shifts":
                    case "member_of_timesheets":
                    case "member_of_pay_percentage":
                    case "member_of_insurance_policies":
                    case "member_of_tax_policies":
                    case "member_of_trade_union_policies":
                    case "member_of_leave_policies":
                    case "member_of_benefit_policies":
                    case "member_of_allowance_policies":
                    case "member_of_bonus_policies":
                    case "member_of_standard_workday_policies":
                    case "member_of_overtime_policies":
                    case "member_of_punishment_policies":
                    case "member_of_advance_payment_policies":
                    case "member_of_late_early_checkin_policies":
                    case "member_of_salary_policies":
                    case "member_of_other_liability_policies":
                    case "member_of_employment_contract_types":
                    case "member_of_nations":
                    case "member_of_cities":
                    case "member_of_ethnics":
                    case "member_of_religions":
                    case "member_of_document_types":
                    case "member_of_document_groups":
                    case "member_of_document_folders":
                    case "member_of_orgs":
                    case "member_of_product_groups":
                    case "member_of_product_list":
                    case "member_of_piece_wage_policies":
                    case "member_of_attendance_clock_policies":
                    case "member_of_position_groups":
                    case "language":
                        data = {
                            value: valueContent !== undefined ? valueContent : 0
                        };
                        rs(data);
                        break;
                    case "color_picker":
                        data = valueContent == "" ? "white" : valueContent;
                        rs(data);
                        break;
                    case "files":
                        if (!valueContent) rs([]);
                        else {
                            if (valueContent["-64"]) data = valueContent["-64"];
                            else data = valueContent;
                            data_module.makeFilesContent(data).then(function(result){
                                rs(result);
                            });
                        }
                        break;
                    case "any_file":
                    case "image_file":
                        // data_module.makeImageContent(valueContent).then(function(result){
                        //     rs(result);
                        // });
                        if (!valueContent) {
                            rs(valueContent);
                        }
                        else if (typeof(valueContent) == "string") {
                            if (valueContent.startsWith("http")) {
                                rs(valueContent);
                            }
                        }
                        else {
                            data_module.makeImageContent(valueContent).then(function(result){
                                rs(result);
                            });
                        }
                        break;
                    case "enum":
                    case "extends_enum":
                        data = {
                            value: valueContent !== undefined ? valueContent : 0
                        };
                        rs(data);
                        break;
                    case "enum_multi":
                    case "extends_enum_multi":
                        data = {
                            value: valueContent !== undefined ? valueContent : []
                        };
                        rs(data);
                        break;
                    case "structure":
                        if (!valueContent) rs({});
                        else {
                            var typeDataContent = [];
                            var index = typeDict[typeid];
                            while (typelists[index].type == "extends_structure") {
                                typeDataContent = typelists[index].content.details.concat(typeDataContent);
                                index = typeDict[typelists[index].content.typeof];
                            }
                            typeDataContent = typelists[index].content.details.concat(typeDataContent);
                            ////////////
                            var t_content = valueContent.extrainfo ? valueContent.extrainfo : {};
                            typeDataContent.forEach(function(elt){
                                if (mainData[elt.localid]){
                                    t_content[elt.localid] = valueContent[mainData[elt.localid]];
                                    if (elt.type == "union") {
                                        Object.keys(elt.detailUnion).forEach(function(cur){
                                            elt.detailUnion[cur].forEach(function(ud){
                                                t_content[ud.localid] = valueContent[mainData[ud.localid]];
                                            });
                                        });
                                    }
                                }
                            });
                            var index = typeDict[typeid];
                            var typeContent = typelists[index].content.details;
                            var t_data = {};
                            typeContent.forEach(function(elt){
                                var t_params = {
                                    valueContent: t_content[elt.localid],
                                    typeid: elt.type,
                                    typelists: typelists,
                                    currentPath: elt
                                };
                                if (elt.type == "union") t_params.unionValue = t_content;
                                t_data[elt.localid] = contentModule.setValueOfForm2(t_params);
                            });
                            Promise.all(Object.values(t_data)).then(function(result){
                                data = {};
                                Object.keys(t_data).forEach(function(elt, idx){
                                    // if (result[idx] && result[idx].employee && result[idx].department && result[idx].company){
                                    //     data[elt] = result[idx].employee;
                                    //     data[elt + "_choose_department"] = result[idx].department;
                                    //     data[elt + "_choose_company"] = result[idx].company;
                                    // }
                                    // else
                                    if (result[idx] && result[idx].detailUnion){
                                        data[elt] = {
                                            value: result[idx].value
                                        };
                                        var t_detailUnion = {};
                                        Object.keys(result[idx].detailUnion).forEach(function(cur){
                                            // if (result[idx].detailUnion[cur] && result[idx].detailUnion[cur].employee && result[idx].detailUnion[cur].department && result[idx].detailUnion[cur].company){
                                            //     t_detailUnion[cur] = result[idx].detailUnion[cur].employee;
                                            //     t_detailUnion[cur + "_choose_department"] = result[idx].detailUnion[cur].department;
                                            //     t_detailUnion[cur + "_choose_company"] = result[idx].detailUnion[cur].company;
                                            // }
                                            // else
                                            t_detailUnion[cur] = result[idx].detailUnion[cur];
                                        });
                                        Object.assign(data, t_detailUnion);
                                        // Object.assign(data, result[idx].detailUnion);
                                    }
                                    else data[elt] = result[idx];
                                });
                                rs(data);
                            }, function(message){rj(message);});
                        }
                        break;
                    case "extends_structure":
                        if (!valueContent) rs({});
                        else {
                            var typeDataContent = [];
                            var index = typeDict[typeid];
                            while (typelists[index].type == "extends_structure") {
                                typeDataContent = typelists[index].content.details.concat(typeDataContent);
                                index = typeDict[typelists[index].content.typeof];
                            }
                            typeDataContent = typelists[index].content.details.concat(typeDataContent);
                            ////////////
                            var t_content = valueContent.extrainfo ? valueContent.extrainfo : {};
                            typeDataContent.forEach(function(elt){
                                if (mainData[elt.localid]){
                                    t_content[elt.localid] = valueContent[mainData[elt.localid]];
                                    if (elt.type == "union") {
                                        Object.keys(elt.detailUnion).forEach(function(cur){
                                            elt.detailUnion[cur].forEach(function(ud){
                                                t_content[ud.localid] = valueContent[mainData[ud.localid]];
                                            });
                                        });
                                    }
                                }
                            });
                            var index = typeDict[typeid];
                            var typeContent = typelists[index].content;
                            var t_id = typeContent.typeof;
                            var content = typelists[typeDict[t_id]].content.details.concat(typeContent.details);
                            while (typelists[typeDict[t_id]].type == "extends_structure"){
                                t_id = typelists[typeDict[t_id]].content.typeof;
                                content = typelists[typeDict[t_id]].content.details.concat(content)
                            }
                            var t_data = {};
                            content.forEach(function(elt){
                                var t_params = {
                                    valueContent: t_content[elt.localid],
                                    typeid: elt.type,
                                    typelists: typelists,
                                    currentPath: elt
                                };
                                if (elt.type == "union") t_params.unionValue = t_content;
                                if (t_content[elt.localid]) t_data[elt.localid] = contentModule.setValueOfForm2(t_params);
                            });
                            Promise.all(Object.values(t_data)).then(function(result){
                                data = {};
                                Object.keys(t_data).forEach(function(elt, idx){
                                    // if (result[idx] && result[idx].employee && result[idx].department && result[idx].company){
                                    //     data[elt] = result[idx].employee;
                                    //     data[elt + "_choose_department"] = result[idx].department;
                                    //     data[elt + "_choose_company"] = result[idx].company;
                                    // }
                                    // else
                                    if (result[idx] && result[idx].detailUnion){
                                        data[elt] = {
                                            value: result[idx].value
                                        };
                                        var t_detailUnion = {};
                                        Object.keys(result[idx].detailUnion).forEach(function(cur){
                                            // if (result[idx].detailUnion[cur] && result[idx].detailUnion[cur].employee && result[idx].detailUnion[cur].department && result[idx].detailUnion[cur].company){
                                            //     t_detailUnion[cur] = result[idx].detailUnion[cur].employee;
                                            //     t_detailUnion[cur + "_choose_department"] = result[idx].detailUnion[cur].department;
                                            //     t_detailUnion[cur + "_choose_company"] = result[idx].detailUnion[cur].company;
                                            // }
                                            // else
                                            t_detailUnion[cur] = result[idx].detailUnion[cur];
                                        });
                                        Object.assign(data, t_detailUnion);
                                        // Object.assign(data, result[idx].detailUnion);
                                    }
                                    else data[elt] = result[idx];
                                });
                                rs(data);
                            }, function(message){rj(message);});
                        }
                        break;
                    case "array":
                        data = {};
                        data[typeid] = [];
                        if (!valueContent) rs(data);{
                            var index = typeDict[typeid];
                            var typeContent = typelists[index].content;
                            var t_id = typeContent.typeof;
                            var dataTypeOfArray = contentModule.checkDatatypeOfArray(typelists, t_id);
                            var t;
                            if (valueContent.constructor === Object) t = valueContent[typeid];
                            else t = valueContent;
                            if (dataTypeOfArray == "advanced"){
                                var type = getType(typeDict[t_id]);
                                if (type == "structure" || type == "extends_structure"){
                                    var t_data = [];
                                    t.forEach(function(elt){
                                        t_data.push(contentModule.setValueOfForm2({
                                            valueContent: elt,
                                            typeid: t_id,
                                            typelists: typelists
                                        }));
                                        // data[typeid].push(generateData(elt, t_id));
                                    });
                                    Promise.all(t_data).then(function(result){
                                        data[typeid] = result;
                                        rs(data);
                                    }, function(message){rj(message);});
                                }
                                else {
                                    var t_data = [];
                                    t.forEach(function(elt){
                                        t_data.push(contentModule.setValueOfForm2({
                                            valueContent: elt,
                                            typeid: t_id,
                                            typelists: typelists
                                        }));
                                    });
                                    Promise.all(t_data).then(function(result){
                                        result.forEach(function(elt){
                                            var x = {};
                                            x[t_id] = elt;
                                            data[typeid].push(x);
                                        });
                                        rs(data);
                                    }, function(message){rj(message);});
                                }
                            }
                            else {
                                data[typeid] = {records: []};
                                var type = getType(typeDict[t_id]);
                                if (type == "structure" || type == "extends_structure"){
                                    var typeofarray = dict2[typeid].content.typeof;
                                    var mainData = contentModule.getMainData(typeofarray, dict2);
                                    if (!mainData) data[typeid].records = t;
                                    else {
                                        var keys = Object.keys(mainData);
                                        t.forEach(function(record){
                                            var x = EncodingClass.string.duplicate(record);
                                            var cur = {};
                                            keys.forEach(function(localid){
                                                cur[localid] = x[mainData[localid]];
                                            });
                                            data[typeid].records.push(cur);
                                        });
                                    }
                                }
                                else {
                                    t.forEach(function(elt){
                                        var x = {};
                                        x[t_id] = elt;
                                        data[typeid].records.push(x);
                                    });
                                }
                                rs(data);
                            }
                        }
                        break;
                    case "union":
                        data = {
                            value: valueContent,
                            detailUnion: {}
                        };
                        var t_data = {};
                        var currentPath = params.currentPath;
                        if (currentPath.detailUnion[data.value]){
                            currentPath.detailUnion[data.value].forEach(function(elt){
                                t_data[elt.localid] = contentModule.setValueOfForm2({
                                    valueContent: params.unionValue[elt.localid],
                                    typeid: elt.type,
                                    typelists: typelists,
                                    currentPath: elt
                                });
                                // t_data[elt.localid] = generateData(valueContent.detailUnion[elt.localid], elt.type, elt);
                            });
                        }
                        Promise.all(Object.values(t_data)).then(function(result){
                            Object.keys(t_data).forEach(function(elt, idx){
                                data.detailUnion[elt] = result[idx];
                            });
                            rs(data);
                        }, function(message){rj(message);});
                        break;
                    default:
                        rj("undefined type: " + type);
                }
        //     });
        // };



        // generateData(result, typeid).then(function(result){
        //     resolve(result);
        // }, function(message){console.log(message); reject(message);});
        ////////////
    });
};

contentModule.setValueOfOutputForm = function(params){
    var valueContent, typeid, mainData, typelists, variables;
    if (params.isPrintForm) valueContent = form_module.convertKeyToLocalid(params.typeid, [params.valueContent], true)[0];
    else valueContent = params.valueContent;
    typeid = params.typeid;
    mainData = params.mainData;
    typelists = params.typelists;
    variables = params.variables;
    return new Promise(function(resolve, reject){
        valueContent = EncodingClass.string.duplicate(valueContent);
        var result;
        var typeDict = {};
        var dict2 = {};
        var primitiveTypeList = form_module.primitiveTypeList;
        var getType = function(index){
            var type = typelists[index].type;
            if (
                form_module.primitiveTypeList.indexOf(type) != -1
            ){
                type = typelists[index].type2;
            }
            return type;
        }
        typelists.forEach(function(elt, index){
            typeDict[elt.id] = index;
            dict2[elt.id] = elt;
        });
        var posDict = {};
        var generateData = function(valueContent, typeid, currentPath){
            return new Promise(function(rs, rj){
                var data;
                var type;
                if (isNaN(parseInt(typeid, 10))) type = typeid;
                else type = getType(typeDict[typeid]);
                switch (type) {
                    case "nation_city":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "position_list":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "employee_list":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "string":
                    case "phonenumber":
                    case "website":
                    case "gps":
                    case "note":
                    case "html":
                    case "variable_input":
                    case "variable_textarea":
                    case "email_address":
                    case "boolean":
                        data = valueContent;
                        rs(data);
                        break;
                    case "time":
                    case "year":
                    case "month":
                    case "week":
                        data = valueContent;
                        if (typeof(data) == "string") data = new Date(data);
                        if (data && data.getTime() == TIME_NULL_MILLISECOND) data = null;
                        rs(data);
                        break;
                    case "number":
                    case "currency":
                        data = valueContent == "" ? 0 : parseFloat(valueContent);
                        rs(data);
                        break;
                    case "date":
                    case "datetime":
                        // data = contentModule.getDateView(valueContent);
                        data = valueContent;
                        if (typeof(data) == "string") data = new Date(data);
                        if (data && data.getTime() == TIME_NULL_MILLISECOND) data = null;
                        rs(data);
                        break;
                    case "date_level":
                        // data = contentModule.getDateTimeView(valueContent);
                        data = valueContent;
                        if (!data) data = {
                            level: "date",
                            value: new Date(TIME_NULL_MILLISECOND)
                        };
                        if (data.value && data.value.getTime() == TIME_NULL_MILLISECOND) data.value = null;
                        rs(data);
                        break;
                    case "datemonth":
                        if (valueContent){
                            if (valueContent.month !== undefined && valueContent.month !== null){
                                var month = valueContent.month + 1;
                                if (month < 10) month = "0" + month;
                                var date = valueContent.date;
                                if (date < 10) date = "0" + date;
                                data = date + "/" + month;
                            }
                            else {
                                data = "";
                            }
                        }
                        else {
                            data = "";
                        }
                        rs(data);
                        break;
                    case "hour_period":
                        // data = contentModule.getDateTimeView(valueContent.dayOffset) + " - " + contentModule.getDateTimeView(valueContent.dayOffset + valueContent.duration);
                        data = valueContent;
                        rs(data);
                        break;
                    case "user":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "userlist":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "members_of_shifts":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "members_of_partner_class":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "members_of_locations":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "select_department_employee":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "geopos":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_department":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_position":
                        if (!valueContent || valueContent == 0){
                            rs({
                                value: 0
                            });
                        }
                        else {
                            Promise.all([data_module.loadOrgsList(), data_module.loadPositionById2(valueContent)]).then(function(result){
                                if (result[1].length == 0){
                                    rs({
                                        value: 0
                                    });
                                }
                                else {
                                    var subHost = {
                                        database: {}
                                    };
                                    contentModule.makeDatabaseContent(subHost, {orgs: result[0]});
                                    contentModule.makeOrgsIndex(subHost);
                                    var t = subHost.database.orgs.items[subHost.database.orgs.getIndex(result[1][0].orgid)];
                                    while (t.parentid != 0){
                                        t = subHost.database.orgs.items[subHost.database.orgs.getIndex(t.parentid)];
                                    }
                                    var data = {
                                        position: {
                                            value: valueContent
                                        },
                                        department: {
                                            value: result[1][0].orgid
                                        },
                                        company: {
                                            value: t.id
                                        }
                                    };
                                    rs(data);
                                }
                            });
                        }
                        break;
                    case "member_of_position_2":
                    case "member_of_employee":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_template_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_welcome_templates":
                    case "member_of_product_groups":
                    case "member_of_product_list":
                    case "member_of_piece_wage_policies":
                    case "member_of_attendance_clock_policies":
                    case "member_of_position_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_worktime_machines":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_assets":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_instruments_and_tools":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_assets_instruments_and_tools":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_warehouses":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_allowance_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_bonus_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_piece_wage_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_attendance_clock_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_standard_workday_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_work_flow_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_work_flows":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_objects":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_payroll_cycle":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_lesson_categories":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_task":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_meeting":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_typelists":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_input_forms":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_output_forms":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_mobile_input_forms":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_mobile_output_forms":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "color_picker":
                        data = valueContent == "" ? "white" : valueContent;
                        rs(data);
                        break;
                    case "member_of_partner_class":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_partner":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_contact":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_other_liability_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_other_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_policies":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_trade_union_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_overtime_policy_groups":
                    case "member_of_offboarding_types":
                    case "member_of_offboarding_reasons":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "multiselect_offboarding_reasons":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_salary_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_punishment_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_asset_category":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_instruments_and_tools_category":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_projects":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_tax_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_advance_payment_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_late_early_checkin_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_benefit_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_leave_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_insurance_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_training_program_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_shifts":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_insurance_policies":
                    case "member_of_tax_policies":
                    case "member_of_trade_union_policies":
                    case "member_of_leave_policies":
                    case "member_of_benefit_policies":
                    case "member_of_allowance_policies":
                    case "member_of_bonus_policies":
                    case "member_of_standard_workday_policies":
                    case "member_of_overtime_policies":
                    case "member_of_punishment_policies":
                    case "member_of_advance_payment_policies":
                    case "member_of_late_early_checkin_policies":
                    case "member_of_salary_policies":
                    case "member_of_other_liability_policies":
                    case "member_of_employment_contract_types":
                    case "member_of_nations":
                    case "member_of_cities":
                    case "member_of_ethnics":
                    case "member_of_religions":
                    case "member_of_document_types":
                    case "member_of_document_groups":
                    case "member_of_document_folders":
                    case "member_of_orgs":
                    case "member_of_timesheets":
                    case "member_of_pay_percentage":
                    case "language":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "files":
                        if (!valueContent) rs([]);
                        else {
                            if (valueContent["-64"]) data = valueContent["-64"];
                            else data = valueContent;
                            data_module.makeFilesContent(data).then(function(result){
                                rs(result);
                            });
                        }
                        break;
                    case "any_file":
                    case "image_file":
                        if (!valueContent) {
                            rs(valueContent);
                        }
                        else if (typeof(valueContent) == "string") {
                            if (valueContent.startsWith("http")) {
                                rs(valueContent);
                            }
                        }
                        else {
                            data_module.makeImageContent(valueContent).then(function(result){
                                rs(result);
                            });
                        }
                        break;
                    case "extends_enum":
                    case "enum":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "enum_multi":
                    case "extends_enum_multi":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "structure":
                        var index = typeDict[typeid];
                        var typeContent = typelists[index].content.details;
                        var t_data = {};
                        typeContent.forEach(function(elt){
                            t_data[elt.localid] = generateData(valueContent[elt.localid], elt.type, elt);
                        });
                        Promise.all(Object.values(t_data)).then(function(result){
                            // data = {};
                            // Object.keys(t_data).forEach(function(elt, idx){
                            //     if (result[idx] && result[idx].detailUnion){
                            //         data[elt] = {
                            //             value: result[idx].value
                            //         };
                            //         Object.assign(data, result[idx].detailUnion);
                            //     }
                            //     else data[elt] = result[idx];
                            // });
                            // rs(data);
                            data = {};
                            Object.keys(t_data).forEach(function(elt, idx){
                                // if (result[idx] && result[idx].employee && result[idx].department && result[idx].company){
                                //     data[elt] = result[idx].employee;
                                //     data[elt + "_choose_department"] = result[idx].department;
                                //     data[elt + "_choose_company"] = result[idx].company;
                                // }
                                // else if (result[idx] && result[idx].position && result[idx].department && result[idx].company){
                                //     data[elt] = result[idx].position;
                                //     data[elt + "_choose_department"] = result[idx].department;
                                //     data[elt + "_choose_company"] = result[idx].company;
                                // }
                                // else
                                if (result[idx] && result[idx].detailUnion){
                                    data[elt] = {
                                        value: result[idx].value
                                    };
                                    Object.assign(data, result[idx].detailUnion);
                                }
                                else data[elt] = result[idx];
                            });
                            rs(data);
                        }, function(message){rj(message);});
                        break;
                    case "extends_structure":
                        var index = typeDict[typeid];
                        var typeContent = typelists[index].content;
                        var t_id = typeContent.typeof;
                        var content = typelists[typeDict[t_id]].content.details.concat(typeContent.details);
                        while (typelists[typeDict[t_id]].type == "extends_structure"){
                            t_id = typelists[typeDict[t_id]].content.typeof;
                            content = typelists[typeDict[t_id]].content.details.concat(content)
                        }
                        var t_data = {};
                        content.forEach(function(elt){
                            if (valueContent[elt.localid] !== undefined) t_data[elt.localid] = generateData(valueContent[elt.localid], elt.type, elt);
                        });
                        Promise.all(Object.values(t_data)).then(function(result){
                            // data = {};
                            // Object.keys(t_data).forEach(function(elt, idx){
                            //     if (result[idx] && result[idx].detailUnion){
                            //         data[elt] = {
                            //             value: result[idx].value
                            //         };
                            //         Object.assign(data, result[idx].detailUnion);
                            //     }
                            //     else data[elt] = result[idx];
                            // });
                            // rs(data);
                            data = {};
                            Object.keys(t_data).forEach(function(elt, idx){
                                // if (result[idx] && result[idx].employee && result[idx].department && result[idx].company){
                                //     data[elt] = result[idx].employee;
                                //     data[elt + "_choose_department"] = result[idx].department;
                                //     data[elt + "_choose_company"] = result[idx].company;
                                // }
                                // else if (result[idx] && result[idx].position && result[idx].department && result[idx].company){
                                //     data[elt] = result[idx].position;
                                //     data[elt + "_choose_department"] = result[idx].department;
                                //     data[elt + "_choose_company"] = result[idx].company;
                                // }
                                // else
                                if (result[idx] && result[idx].detailUnion){
                                    data[elt] = {
                                        value: result[idx].value
                                    };
                                    Object.assign(data, result[idx].detailUnion);
                                }
                                else data[elt] = result[idx];
                            });
                            rs(data);
                        }, function(message){rj(message);});
                        break;
                    case "array":
                        data = {};
                        data[typeid] = [];
                        if (!valueContent) rs(data);
                        else {
                            var index = typeDict[typeid];
                            var typeContent = typelists[index].content;
                            var t_id = typeContent.typeof;
                            var dataTypeOfArray = contentModule.checkDatatypeOfArray(typelists, t_id);
                            var t;
                            if (valueContent.constructor === Object) t = valueContent[typeid];
                            else t = valueContent;
                            if (dataTypeOfArray == "advanced"){
                                var type = getType(typeDict[t_id]);
                                if (type == "structure" || type == "extends_structure"){
                                    var t_data = [];
                                    t.forEach(function(elt){
                                        t_data.push(generateData(elt, t_id));
                                        // data[typeid].push(generateData(elt, t_id));
                                    });
                                    Promise.all(t_data).then(function(result){
                                        data[typeid] = result;
                                        rs(data);
                                    }, function(message){rj(message);});
                                }
                                else {
                                    var t_data = [];
                                    t.forEach(function(elt){
                                        t_data.push(generateData(elt, t_id));
                                    });
                                    Promise.all(t_data).then(function(result){
                                        result.forEach(function(elt){
                                            var x = {};
                                            x[t_id] = elt;
                                            data[typeid].push(x);
                                        });
                                        rs(data);
                                    }, function(message){rj(message);});
                                }
                            }
                            else {
                                data[typeid] = {records: []};
                                var type = getType(typeDict[t_id]);
                                if (type == "structure" || type == "extends_structure"){
                                    var typeofarray = dict2[typeid].content.typeof;
                                    var mainData = contentModule.getMainData(typeofarray, dict2);
                                    if (!mainData) data[typeid].records = t;
                                    else {
                                        var keys = Object.keys(mainData);
                                        t.forEach(function(record){
                                            var x = EncodingClass.string.duplicate(record);
                                            var cur = {};
                                            keys.forEach(function(localid){
                                                cur[localid] = x[mainData[localid]];
                                                // if (typeof(cur[localid]) == "string") {
                                                //     var tempDate = new Date(cur[localid]);
                                                //     if (tempDate.toString() != "Invalid Date") {
                                                //         cur[localid] = tempDate;
                                                //     }
                                                // }
                                            });
                                            data[typeid].records.push(cur);
                                        });
                                    }
                                }
                                else {
                                    t.forEach(function(elt){
                                        var x = {};
                                        x[t_id] = elt;
                                        data[typeid].records.push(x);
                                    });
                                }
                                rs(data);
                            }
                        }
                        break;
                    case "treetable":
                        data = {};
                        data[typeid] = [];
                        if (!valueContent) rs(data);
                        else {
                            var index = typeDict[typeid];
                            var typeContent = typelists[index].content;
                            var t_id = typeContent.typeof;
                            var t;
                            if (valueContent.constructor === Object) t = valueContent[typeid];
                            else t = valueContent;
                            data[typeid] = {records: []};
                            var type = getType(typeDict[t_id]);
                            var typeofarray = dict2[typeid].content.typeof;
                            var mainData = contentModule.getMainData(typeofarray, dict2);
                            if (!mainData) data[typeid].records = t;
                            else {
                                var keys = Object.keys(mainData);
                                var makeData = function(items){
                                    var t_data = [];
                                    t.forEach(function(record){
                                        var x = EncodingClass.string.duplicate(record);
                                        var cur = {};
                                        keys.forEach(function(localid){
                                            cur[localid] = x[mainData[localid]];
                                            if (typeof(cur[localid]) == "string") {
                                                var tempDate = new Date(cur[localid]);
                                                if (tempDate.toString() != "Invalid Date") {
                                                    cur[localid] = tempDate;
                                                }
                                            }
                                        });
                                        if (record.__children__) cur.__children__ = makeData(record.__children__);
                                        t_data.push(cur);
                                    });
                                    return t_data;
                                }
                                data[typeid].records = makeData(t);
                            }
                            rs(data);
                        }
                        break;
                    case "union":
                        data = {
                            value: valueContent,
                            detailUnion: {}
                        };
                        var t_data = {};
                        if (currentPath.detailUnion[data.value]){
                            currentPath.detailUnion[data.value].forEach(function(elt){
                                t_data[elt.localid] = generateData(result[elt.localid], elt.type, elt);
                                // t_data[elt.localid] = generateData(valueContent.detailUnion[elt.localid], elt.type, elt);
                            });
                        }
                        Promise.all(Object.values(t_data)).then(function(result){
                            Object.keys(t_data).forEach(function(elt, idx){
                                data.detailUnion[elt] = result[idx];
                            });
                            rs(data);
                        }, function(message){rj(message);});
                        break;
                    default:
                        rj("undefined type: " + type);
                }
            });
        };

        var typeDataContent = [];
        var index = typeDict[typeid];
        while (typelists[index].type == "extends_structure") {
            typeDataContent = typelists[index].content.details.concat(typeDataContent);
            index = typeDict[typelists[index].content.typeof];
        }
        typeDataContent = typelists[index].content.details.concat(typeDataContent);
        ////////////
        if (variables) {
            var keys = Object.keys(variables);
            keys.forEach((item, i) => {
                if (valueContent[item]) {
                    valueContent[item] = hr.sclang.executeTemplate(valueContent[item], variables[item]);
                }
            });
        }
        result = valueContent.extrainfo ? valueContent.extrainfo : {};
        if (mainData) {
            typeDataContent.forEach(function(elt){
                if (mainData[elt.localid] !== undefined){
                    result[elt.localid] = valueContent[mainData[elt.localid]];
                    if (elt.type == "union") {
                        Object.keys(elt.detailUnion).forEach(function(cur){
                            elt.detailUnion[cur].forEach(function(ud){
                                result[ud.localid] = valueContent[mainData[ud.localid]];
                            });
                        });
                    }
                }
            });
        }

        generateData(result, typeid).then(function(result){
            resolve(result);
        }, function(message){console.log(message); reject(message);});
        ////////////
    });
};

contentModule.setValueOfUserOutputForm = function(params){
    var valueContent, typeid, typelists, variables;
    valueContent = params.valueContent;
    typeid = params.typeid;
    typelists = params.typelists;
    variables = params.variables;
    return new Promise(function(resolve, reject){
        valueContent = EncodingClass.string.duplicate(valueContent);
        var result;
        var typeDict = {};
        var dict2 = {};
        var primitiveTypeList = form_module.primitiveTypeList;
        var getType = function(index){
            var type = typelists[index].type;
            if (
                form_module.primitiveTypeList.indexOf(type) != -1
            ){
                type = typelists[index].type2;
            }
            return type;
        }
        typelists.forEach(function(elt, index){
            typeDict[elt.id] = index;
            dict2[elt.id] = elt;
        });
        var posDict = {};
        var generateData = function(valueContent, typeid, currentPath){
            return new Promise(function(rs, rj){
                var data;
                var type;
                if (isNaN(parseInt(typeid, 10))) type = typeid;
                else type = getType(typeDict[typeid]);
                switch (type) {
                    case "nation_city":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "position_list":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "employee_list":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "string":
                    case "phonenumber":
                    case "website":
                    case "gps":
                    case "note":
                    case "html":
                    case "variable_input":
                    case "variable_textarea":
                    case "email_address":
                    case "boolean":
                        data = valueContent;
                        rs(data);
                        break;
                    case "time":
                    case "year":
                    case "month":
                    case "week":
                        data = valueContent;
                        if (typeof(data) == "string") data = new Date(data);
                        if (data && data.getTime() == TIME_NULL_MILLISECOND) data = null;
                        rs(data);
                        break;
                    case "number":
                    case "currency":
                        data = valueContent == "" ? 0 : parseFloat(valueContent);
                        rs(data);
                        break;
                    case "date":
                        // data = contentModule.getDateView(valueContent);
                        data = valueContent;
                        if (typeof(data) == "string") data = new Date(data);
                        if (data && data.getTime() == TIME_NULL_MILLISECOND) data = null;
                        rs(data);
                        break;
                    case "datetime":
                        // data = contentModule.getDateTimeView(valueContent);
                        data = valueContent;
                        if (typeof(data) == "string") data = new Date(data);
                        if (data && data.getTime() == TIME_NULL_MILLISECOND) data = null;
                        rs(data);
                        break;
                    case "date_level":
                        // data = contentModule.getDateTimeView(valueContent);
                        data = valueContent;
                        if (!data) data = {
                            level: "date",
                            value: new Date(TIME_NULL_MILLISECOND)
                        };
                        if (data.value && data.value.getTime() == TIME_NULL_MILLISECOND) data.value = null;
                        rs(data);
                        break;
                    case "datemonth":
                        if (valueContent){
                            if (valueContent.month !== undefined && valueContent.month !== null){
                                var month = valueContent.month + 1;
                                if (month < 10) month = "0" + month;
                                var date = valueContent.date;
                                if (date < 10) date = "0" + date;
                                data = date + "/" + month;
                            }
                            else {
                                data = "";
                            }
                        }
                        else {
                            data = "";
                        }
                        rs(data);
                        break;
                    case "hour_period":
                        // data = contentModule.getDateTimeView(valueContent.dayOffset) + " - " + contentModule.getDateTimeView(valueContent.dayOffset + valueContent.duration);
                        data = valueContent;
                        rs(data);
                        break;
                    case "user":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "userlist":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "members_of_shifts":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "members_of_partner_class":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "members_of_locations":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "select_department_employee":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "geopos":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_department":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_position":
                        if (!valueContent || valueContent == 0){
                            rs({
                                value: 0
                            });
                        }
                        else {
                            Promise.all([data_module.loadOrgsList(), data_module.loadPositionById2(valueContent)]).then(function(result){
                                if (result[1].length == 0){
                                    rs({
                                        value: 0
                                    });
                                }
                                else {
                                    var subHost = {
                                        database: {}
                                    };
                                    contentModule.makeDatabaseContent(subHost, {orgs: result[0]});
                                    contentModule.makeOrgsIndex(subHost);
                                    var t = subHost.database.orgs.items[subHost.database.orgs.getIndex(result[1][0].orgid)];
                                    while (t.parentid != 0){
                                        t = subHost.database.orgs.items[subHost.database.orgs.getIndex(t.parentid)];
                                    }
                                    var data = {
                                        position: {
                                            value: valueContent
                                        },
                                        department: {
                                            value: result[1][0].orgid
                                        },
                                        company: {
                                            value: t.id
                                        }
                                    };
                                    rs(data);
                                }
                            });
                        }
                        break;
                    case "member_of_position_2":
                    case "member_of_employee":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_template_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_welcome_templates":
                    case "member_of_product_groups":
                    case "member_of_product_list":
                    case "member_of_piece_wage_policies":
                    case "member_of_attendance_clock_policies":
                    case "member_of_position_groups":
                    case "language":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_worktime_machines":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_assets":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_instruments_and_tools":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_assets_instruments_and_tools":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_warehouses":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_allowance_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_bonus_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_piece_wage_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_attendance_clock_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_standard_workday_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_work_flow_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_work_flows":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_objects":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_payroll_cycle":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_lesson_categories":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_task":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_meeting":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_typelists":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_input_forms":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_output_forms":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_mobile_input_forms":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_mobile_output_forms":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "color_picker":
                        data = valueContent == "" ? "white" : valueContent;
                        rs(data);
                        break;
                    case "member_of_partner_class":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_partner":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_contact":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_other_liability_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_other_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_policies":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_trade_union_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_overtime_policy_groups":
                    case "member_of_offboarding_types":
                    case "member_of_offboarding_reasons":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "multiselect_offboarding_reasons":
                        data = {
                            values: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_salary_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_punishment_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_asset_category":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_instruments_and_tools_category":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_projects":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_tax_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_advance_payment_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_late_early_checkin_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_benefit_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_leave_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_insurance_policy_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_training_program_groups":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_shifts":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "member_of_insurance_policies":
                    case "member_of_tax_policies":
                    case "member_of_trade_union_policies":
                    case "member_of_leave_policies":
                    case "member_of_benefit_policies":
                    case "member_of_allowance_policies":
                    case "member_of_bonus_policies":
                    case "member_of_standard_workday_policies":
                    case "member_of_overtime_policies":
                    case "member_of_punishment_policies":
                    case "member_of_advance_payment_policies":
                    case "member_of_late_early_checkin_policies":
                    case "member_of_salary_policies":
                    case "member_of_other_liability_policies":
                    case "member_of_employment_contract_types":
                    case "member_of_nations":
                    case "member_of_cities":
                    case "member_of_ethnics":
                    case "member_of_religions":
                    case "member_of_document_types":
                    case "member_of_document_groups":
                    case "member_of_document_folders":
                    case "member_of_orgs":
                    case "member_of_timesheets":
                    case "member_of_pay_percentage":
                        data = {
                            value: valueContent
                        };
                        rs(data);
                        break;
                    case "files":
                        if (!valueContent) rs([]);
                        else {
                            if (valueContent["-64"]) data = valueContent["-64"];
                            else data = valueContent;
                            data_module.makeFilesContent(data).then(function(result){
                                rs(result);
                            });
                        }
                        break;
                    case "any_file":
                    case "image_file":
                        // data_module.makeImageContent(valueContent).then(function(result){
                        //     rs(result);
                        // });
                        if (!valueContent) {
                            rs(valueContent);
                        }
                        else if (typeof(valueContent) == "string") {
                            if (valueContent.startsWith("http")) {
                                rs(valueContent);
                            }
                        }
                        else {
                            data_module.makeImageContent(valueContent).then(function(result){
                                rs(result);
                            });
                        }
                        break;
                    case "enum":
                    case "extends_enum":
                        data = {
                            value: valueContent,
                            // list: lists
                        };
                        rs(data);
                        break;
                    case "enum_multi":
                    case "extends_enum_multi":
                        data = {
                            values: valueContent,
                            // list: lists
                        };
                        rs(data);
                        break;
                    case "structure":
                        var index = typeDict[typeid];
                        var typeContent = typelists[index].content.details;
                        var t_data = {};
                        typeContent.forEach(function(elt){
                            t_data[elt.localid] = generateData(valueContent[elt.localid], elt.type, elt);
                        });
                        Promise.all(Object.values(t_data)).then(function(result){
                            // data = {};
                            // Object.keys(t_data).forEach(function(elt, idx){
                            //     if (result[idx] && result[idx].detailUnion){
                            //         data[elt] = {
                            //             value: result[idx].value
                            //         };
                            //         Object.assign(data, result[idx].detailUnion);
                            //     }
                            //     else data[elt] = result[idx];
                            // });
                            // rs(data);
                            data = {};
                            Object.keys(t_data).forEach(function(elt, idx){
                                // if (result[idx] && result[idx].employee && result[idx].department && result[idx].company){
                                //     data[elt] = result[idx].employee;
                                //     data[elt + "_choose_department"] = result[idx].department;
                                //     data[elt + "_choose_company"] = result[idx].company;
                                // }
                                // else if (result[idx] && result[idx].position && result[idx].department && result[idx].company){
                                //     data[elt] = result[idx].position;
                                //     data[elt + "_choose_department"] = result[idx].department;
                                //     data[elt + "_choose_company"] = result[idx].company;
                                // }
                                // else
                                if (result[idx] && result[idx].detailUnion){
                                    data[elt] = {
                                        value: result[idx].value
                                    };
                                    Object.assign(data, result[idx].detailUnion);
                                }
                                else data[elt] = result[idx];
                            });
                            rs(data);
                        }, function(message){rj(message);});
                        break;
                    case "extends_structure":
                        var index = typeDict[typeid];
                        var typeContent = typelists[index].content;
                        var t_id = typeContent.typeof;
                        var content = typelists[typeDict[t_id]].content.details.concat(typeContent.details);
                        while (typelists[typeDict[t_id]].type == "extends_structure"){
                            t_id = typelists[typeDict[t_id]].content.typeof;
                            content = typelists[typeDict[t_id]].content.details.concat(content)
                        }
                        var t_data = {};
                        content.forEach(function(elt){
                            if (valueContent[elt.localid] !== undefined) t_data[elt.localid] = generateData(valueContent[elt.localid], elt.type, elt);
                        });
                        Promise.all(Object.values(t_data)).then(function(result){
                            // data = {};
                            // Object.keys(t_data).forEach(function(elt, idx){
                            //     if (result[idx] && result[idx].detailUnion){
                            //         data[elt] = {
                            //             value: result[idx].value
                            //         };
                            //         Object.assign(data, result[idx].detailUnion);
                            //     }
                            //     else data[elt] = result[idx];
                            // });
                            // rs(data);
                            data = {};
                            Object.keys(t_data).forEach(function(elt, idx){
                                // if (result[idx] && result[idx].employee && result[idx].department && result[idx].company){
                                //     data[elt] = result[idx].employee;
                                //     data[elt + "_choose_department"] = result[idx].department;
                                //     data[elt + "_choose_company"] = result[idx].company;
                                // }
                                // else if (result[idx] && result[idx].position && result[idx].department && result[idx].company){
                                //     data[elt] = result[idx].position;
                                //     data[elt + "_choose_department"] = result[idx].department;
                                //     data[elt + "_choose_company"] = result[idx].company;
                                // }
                                // else
                                if (result[idx] && result[idx].detailUnion){
                                    data[elt] = {
                                        value: result[idx].value
                                    };
                                    Object.assign(data, result[idx].detailUnion);
                                }
                                else data[elt] = result[idx];
                            });
                            rs(data);
                        }, function(message){rj(message);});
                        break;
                    case "array":
                        data = {};
                        data[typeid] = [];
                        if (!valueContent) rs(data);
                        else {
                            var index = typeDict[typeid];
                            var typeContent = typelists[index].content;
                            var t_id = typeContent.typeof;
                            var dataTypeOfArray = contentModule.checkDatatypeOfArray(typelists, t_id);
                            var t;
                            if (valueContent.constructor === Object) t = valueContent[typeid];
                            else t = valueContent;
                            if (dataTypeOfArray == "advanced"){
                                var type = getType(typeDict[t_id]);
                                if (type == "structure" || type == "extends_structure"){
                                    var t_data = [];
                                    t.forEach(function(elt){
                                        t_data.push(generateData(elt, t_id));
                                        // data[typeid].push(generateData(elt, t_id));
                                    });
                                    Promise.all(t_data).then(function(result){
                                        data[typeid] = result;
                                        rs(data);
                                    }, function(message){rj(message);});
                                }
                                else {
                                    var t_data = [];
                                    t.forEach(function(elt){
                                        t_data.push(generateData(elt, t_id));
                                    });
                                    Promise.all(t_data).then(function(result){
                                        result.forEach(function(elt){
                                            var x = {};
                                            x[t_id] = elt;
                                            data[typeid].push(x);
                                        });
                                        rs(data);
                                    }, function(message){rj(message);});
                                }
                            }
                            else {
                                data[typeid] = {records: []};
                                var type = getType(typeDict[t_id]);
                                if (type == "structure" || type == "extends_structure"){
                                    var typeofarray = dict2[typeid].content.typeof;
                                    data[typeid].records = t;
                                }
                                else {
                                    t.forEach(function(elt){
                                        var x = {};
                                        x[t_id] = elt;
                                        data[typeid].records.push(x);
                                    });
                                }
                                rs(data);
                            }
                        }
                        break;
                    case "treetable":
                        data = {};
                        data[typeid] = [];
                        if (!valueContent) rs(data);
                        else {
                            var index = typeDict[typeid];
                            var typeContent = typelists[index].content;
                            var t_id = typeContent.typeof;
                            var t;
                            if (valueContent.constructor === Object) t = valueContent[typeid];
                            else t = valueContent;
                            data[typeid] = {records: []};
                            var type = getType(typeDict[t_id]);
                            var typeofarray = dict2[typeid].content.typeof;
                            var mainData = contentModule.getMainData(typeofarray, dict2);
                            if (!mainData) data[typeid].records = t;
                            else {
                                var keys = Object.keys(mainData);
                                var makeData = function(items){
                                    var t_data = [];
                                    t.forEach(function(record){
                                        var x = EncodingClass.string.duplicate(record);
                                        var cur = {};
                                        keys.forEach(function(localid){
                                            cur[localid] = x[mainData[localid]];
                                            if (typeof(cur[localid]) == "string") {
                                                var tempDate = new Date(cur[localid]);
                                                if (tempDate.toString() != "Invalid Date") {
                                                    cur[localid] = tempDate;
                                                }
                                            }
                                        });
                                        if (record.__children__) cur.__children__ = makeData(record.__children__);
                                        t_data.push(cur);
                                    });
                                    return t_data;
                                }
                                data[typeid].records = makeData(t);
                            }
                            rs(data);
                        }
                        break;
                    case "union":
                        data = {
                            value: valueContent,
                            detailUnion: {}
                        };
                        var t_data = {};
                        if (currentPath.detailUnion[data.value]){
                            currentPath.detailUnion[data.value].forEach(function(elt){
                                t_data[elt.localid] = generateData(result[elt.localid], elt.type, elt);
                                // t_data[elt.localid] = generateData(valueContent.detailUnion[elt.localid], elt.type, elt);
                            });
                        }
                        Promise.all(Object.values(t_data)).then(function(result){
                            Object.keys(t_data).forEach(function(elt, idx){
                                data.detailUnion[elt] = result[idx];
                            });
                            rs(data);
                        }, function(message){rj(message);});
                        break;
                    default:
                        rj("undefined type: " + type);
                }
            });
        };

        var typeDataContent = [];
        var index = typeDict[typeid];
        while (typelists[index].type == "extends_structure") {
            typeDataContent = typelists[index].content.details.concat(typeDataContent);
            index = typeDict[typelists[index].content.typeof];
        }
        typeDataContent = typelists[index].content.details.concat(typeDataContent);

        if (variables) {
            var keys = Object.keys(variables);
            keys.forEach((item, i) => {
                if (valueContent[item]) {
                    valueContent[item] = hr.sclang.executeTemplate(valueContent[item], variables[item]);
                }
            });
        }

        generateData(valueContent, typeid).then(function(result){
            resolve(result);
        }, function(message){console.log(message); reject(message);});
        ////////////
    });
};

contentModule.getOrgMainData = function(){
    return {
        type_org_name: "name",
        type_org_code: "code",
        type_org_parentid: "parentid",
        type_org_geopos: "geopos"
    };
};

contentModule.getCompanyMainData = function(){
    return {
        type_company_name: "name",
        type_company_code: "code",
        type_company_geopos: "geopos"
    };
};

contentModule.getTrainingLecturerMainData = function(){
    return {
        type_training_program_lecturer: "type",
        type_training_program_internal_trainer: "peopleid",
        type_training_program_outsource_trainer: "peopleid"
    };
};

contentModule.getTrainingParticipantMainData = function(){
    return {
        type_training_program_participant: "peopleid"
    };
};

contentModule.getFamilyMemberMainData = function(){
    return {
        type_family_members_fullname: "fullname",
        type_family_members_dayofbirth: "dayofbirth",
        type_family_members_sex: "sex",
        type_family_members_relation: "relation",
        type_family_members_note: "comment"
    };
};

contentModule.getPositionMainData = function(){
    return {
        type_position_name: "name",
        type_position_code: "code",
        type_position_orgid: "orgid",
        type_position_benefits: "benefits",
        type_position_report_to: "report_to",
        type_position_job_description: "job_description",
        type_position_working_condition: "working_condition",
        type_position_prefered_ability: "prefered_ability",
        type_position_liability_and_authority: "liability_and_authority"
    };
};

contentModule.getPosition2MainData = function(){
    return {
        type_position_name: "name",
        type_position_code: "code",
        type_position_groupid: "groupid",
        type_position_benefits: "benefits",
        type_position_report_to: "report_to",
        type_position_job_description: "job_description",
        type_position_working_condition: "working_condition",
        type_position_prefered_ability: "prefered_ability",
        type_position_liability_and_authority: "liability_and_authority"
    };
};

contentModule.getEmployeeMainData = function(){
    return {
        type_employee_fullname: "fullname",
        type_employee_image: "image",
        type_employee_userid: "userid",
        type_employee_code: "code",
        type_employee_phone_1: "phone_1",
        type_employee_phone_2: "phone_2",
        type_employee_work_email: "work_email",
        type_employee_private_email: "private_email",
        type_employee_social_network: "social_network",
        type_employee_nationalidno: "nationalidno",
        type_employee_dayofbirth: "dayofbirth",
        type_employee_placeofbirth: "placeofbirth",
        type_employee_sex: "sex",
        type_employee_marital_status: "marital_status",
        type_employee_nationalidno_date: "nationalidno_date",
        type_employee_nationalidno_place: "nationalidno_place",
        type_employee_nationality: "nationality",
        type_employee_religion: "religion",
        type_employee_ethnic: "ethnic",
        type_employee_hometown: "hometown",
        type_employee_permanent_address: "permanent_address",
        type_employee_permanent_nation_city: "permanent_nation_city",
        type_employee_temporary_address: "temporary_address",
        type_employee_temporary_nation_city: "temporary_nation_city",
        type_employee_personal_tax_code: "personal_tax_code",
        type_employee_personal_income_tax_relief: "personal_income_tax_relief",
        type_employee_number_of_dependent_persons: "number_of_dependent_persons",
        type_employee_social_security_number: "social_security_number",
        type_employee_social_insurance_date: "social_insurance_date",
        type_employee_place_of_social_insurance: "place_of_social_insurance",
        type_employee_emergency_contact: "emergency_contact",
        type_employee_reference: "reference",
        type_employee_start_date: "start_date",
        type_employee_official_date: "official_date",
        type_employee_hr_support_employee: "hr_support_employee",
        type_employee_position: "position",
        type_employee_concurrent_position: "concurrent_position",
        type_employee_direct_manager: "direct_manager",
        type_employee_indirect_manager: "indirect_manager",
        type_employee_bank_account_number: "bank_account_number",
        type_employee_bank_account_holder_name: "bank_account_holder_name",
        type_employee_bank_name: "bank_name",
        type_employee_bank_agency: "bank_agency",
        type_employee_available: "available"
    };
};

contentModule.getPeopleMainData = function(){
    return {
        type_people_fullname: "fullname",
        type_people_nationalidno: "nationalidno",
        type_people_dayofbirth: "dayofbirth",
        type_people_sex: "sex",
        type_people_marital_status: "marital_status",
        type_people_nationalidno_date: "nationalidno_date",
        type_people_nationalidno_place: "nationalidno_place",
        type_people_nationality: "nationality",
        type_people_religion: "religion",
        type_people_ethnic: "ethnic",
        type_people_permanent_address: "permanent_address",
        type_people_permanent_nation_city: "permanent_nation_city",
        type_people_temporary_address: "temporary_address",
        type_people_temporary_nation_city: "temporary_nation_city",
        type_people_personal_tax_code: "personal_tax_code",
        type_people_personal_income_tax_relief: "personal_income_tax_relief",
        type_people_social_security_number: "social_security_number",
        type_people_social_insurance_date: "social_insurance_date",
        type_people_place_of_social_insurance: "place_of_social_insurance",
        type_people_emergency_contact: "emergency_contact",
        type_people_reference: "reference",
        type_people_start_date: "start_date",
        type_people_official_date: "official_date",
        type_people_available: "available"
    };
};

contentModule.getPeopleContentField = [
    "image",
    "phone_1",
    "phone_2",
    "private_email",
    "religion",
    "ethnic",
    "sex",
    "marital_status",
    "permanent_address",
    "permanent_nation_city",
    "temporary_address",
    "temporary_nation_city",
    "personal_tax_code",
    "personal_income_tax_relief",
    "social_security_number",
    "social_insurance_date",
    "place_of_social_insurance",
    "placeofbirth",
    "emergency_contact",
    "reference",
    "bank_account_number",
    "bank_account_holder_name",
    "bank_name",
    "bank_agency",
    "hometown",
    "number_of_dependent_persons"
];

contentModule.getTaskMainData = function(){
    return {
        type_task_name: "name",
        type_task_status: "status",
        type_task_start_time: "starttime",
        type_task_expire_time: "endtime",
        type_task_reminder: "reminder",
        type_task_assign_to: "assignto",
        type_task_participant: "participant",
        type_task_result: "result"
    };
};

contentModule.getMeetingMainData = function(){
    return {
        type_meeting_name: "name",
        type_meeting_location: "location",
        type_meeting_status: "status",
        type_meeting_type: "type",
        type_meeting_start_time: "starttime",
        type_meeting_end_time: "endtime",
        type_meeting_all_day: "allday",
        type_meeting_reminder: "reminder",
        type_meeting_assign_to: "assignto",
        type_meeting_participant: "participant",
        type_meeting_result: "result"
    };
};

contentModule.getHolidayMainData = function(){
    return {
        type_holiday_name: "name",
        type_holiday_timestart: "timestart",
        type_holiday_timeend: "timeend",
        type_holiday_type: "type",
        type_holiday_pay_percentage: "pay_percentageid",
        type_holiday_shifts: "shifts",
        type_holiday_available: "available"
    }
};

contentModule.getRequestAdvancePaymentMainData = function(){
    return {
        type_request_advance_payment_employeeid: "employeeid",
        type_request_advance_payment_policyid: "policyid",
        type_request_advance_payment_time_hours_needed_for_approval: "time_hours_needed_for_approval",
        type_request_advance_payment_date: "date",
        type_request_advance_payment_amount: "amount",
        type_request_advance_payment_reason: "reason",
        type_request_advance_payment_attachments: "attachments",
        type_request_advance_payment_approvers: "approvers"
    };
};

contentModule.getRequestLateEarlyCheckinMainData = function(){
    return {
        type_request_late_early_checkin_employeeid: "employeeid",
        type_request_late_early_checkin_policyid: "policyid",
        type_request_late_early_checkin_from: "fromdate",
        type_request_late_early_checkin_to: "todate",
        type_request_late_early_checkin_late: "late",
        type_request_late_early_checkin_early: "early",
        type_request_late_early_checkin_reason: "reason",
        type_request_late_early_checkin_approvers: "approvers"
    };
};

contentModule.getRequestLeaveMainData = function(){
    return {
        type_request_leave_employeeid: "employeeid",
        type_request_leave_policyid: "policyid",
        type_request_leave_remain_day_off: "remain_day_off",
        type_request_leave_fromdate: "fromdate",
        type_request_leave_todate: "todate",
        type_request_leave_days_portion: "days_portion",
        type_request_leave_time_period: "time_period",
        type_request_leave_number_of_day_off: "number_of_day_off",
        type_request_leave_reason: "reason",
        type_request_leave_substitute: "substitute",
        type_request_leave_approvers: "approvers"
    };
};

contentModule.getShiftScheduleManualMainData = function(){
    return {
        type_shift_schedule_shift: "shiftid",
        type_shift_schedule_date_from: "date_from",
        type_shift_schedule_date_to: "date_to",
        type_shift_schedule_department_employee: "department_employee",
        type_shift_schedule_substitute: "substitute",
        type_shift_schedule_substitute_employee: "substitute_employee"
    };
};

contentModule.getShiftScheduleOTMainData = function(){
    return {
        type_shift_schedule_ot_shift: "shiftid",
        type_shift_schedule_ot_date_from: "date_from",
        type_shift_schedule_ot_date_to: "date_to",
        type_shift_schedule_ot_employee: "employee",
        type_shift_schedule_ot_time_period: "time_period",
        type_shift_schedule_ot_ot_in_breaktime: "ot_in_breaktime",
        type_shift_schedule_ot_overtime_hours: "overtime_hours",
        type_shift_schedule_ot_substitute: "substitute",
        type_shift_schedule_ot_substitute_employee: "substitute_employee"
    };
};

contentModule.getDaysOffScheduleMainData = function(){
    return {
        type_days_off_schedule_time_off_type: "type",
        type_days_off_schedule_policy: "policyid",
        type_days_off_schedule_employee: "employee",
        type_days_off_schedule_date_from: "date_from",
        type_days_off_schedule_date_to: "date_to",
        type_days_off_schedule_days_portion: "days_portion",
        type_days_off_schedule_time_period: "time_period"
    };
};

contentModule.getDocumentTypesMainData = function(){
    return {
        type_document_type_name: "name",
        type_document_type_description: "description",
        type_document_type_active: "available"
    };
};

contentModule.getOffboardingTypesMainData = function(){
    return {
        type_offboarding_type_name: "name",
        type_offboarding_type_active: "available"
    };
};

contentModule.getOffboardingReasonsMainData = function(){
    return {
        type_offboarding_reason_name: "name",
        type_offboarding_reason_active: "available"
    };
};


contentModule.getApprovalResignationMainData = function(){
    return {
        type_approval_resignation_approver: "approvers",
        type_approval_resignation_the_last_working_day: "the_last_working_day",
        type_approval_resignation_interview: "interview",
        type_approval_resignation_interviewer: "interviewers",
        type_approval_resignation_interview_date: "interview_date"
    };
};

contentModule.getLeaveAssessmentMainData = function(){
    return {
        type_leave_assessment_type: "type",
        type_leave_assessment_reason: "reasons",
        type_leave_assessment_comment: "comment"
    };
};

contentModule.getDocumentGroupsMainData = function(){
    return {
        type_document_group_name: "name",
        type_document_group_parentid: "parentid",
        type_document_group_description: "description",
        type_document_group_active: "available"
    };
};

contentModule.getDocumentPropertiesMainData = function(){
    return {
        type_document_property_name: "name",
        type_document_property_description: "description",
        type_document_property_active: "available"
    };
};

contentModule.getDocumentTemplatesMainData = function(){
    return {
        type_document_template_name: "name",
        type_document_template_tag: "tag",
        type_document_template_summary_content: "summary_content",
        type_document_template_active: "available",
        type_document_template_detail_content: "detail_content"
    };
};

contentModule.getDocumentsMainData = function(){
    return {
        type_document_name: "name",
        type_document_number: "number",
        type_document_issued_date: "issued_date",
        type_document_effective_date: "effective_date",
        type_document_expired_date: "expired_date",
        type_document_tag: "tag",
        type_document_summary_content: "summary_content",
        type_document_attachments: "attachments",
        type_document_active: "available",
        type_document_detail_content: "detail_content"
    };
};

contentModule.getLessonCategoriesMainData = function(){
    return {
        type_lesson_category_name: "name",
        type_lesson_category_description: "description",
        type_lesson_category_active: "available"
    };
};

contentModule.getSampleEmployeeContractMainData = function(){
    return {
        type_sample_employment_contract_number: "number",
        type_sample_employment_contract_employee_name: "name",
        type_sample_employment_contract_employee_address: "address",
        type_sample_employment_contract_employee_sex: "sex",
        type_sample_employment_contract_employee_dayofbirth: "dayofbirth",
        type_sample_employment_contract_employee_nationalidno: "nationalidno",
        type_sample_employment_contract_employee_nationalidno_date: "nationalidno_date",
        type_sample_employment_contract_employee_nationalidno_place: "nationalidno_place",
        type_sample_employment_contract_employee_permanent_address: "permanent_address",
        type_sample_employment_contract_contract_type: "type",
        type_sample_employment_contract_contract_effective_date_from: "effective_date_from",
        type_sample_employment_contract_contract_effective_date_to: "effective_date_to",
        type_sample_employment_contract_contract_workplace: "workplace",
        type_sample_employment_contract_contract_employee_department: "department",
        type_sample_employment_contract_contract_employee_position: "position",
        type_sample_employment_contract_contract_employee_concurrent_position: "concurrent_position",
        type_sample_employment_contract_contract_employee_gross_salary: "gross_salary",
        type_sample_employment_contract_contract_employee_basic_salary: "basic_salary",
        type_sample_employment_contract_contract_employee_salary_caculated_on: "salary_caculated_on",
        type_sample_employment_contract_contract_employee_salary_grade: "salary_grade",
        type_sample_employment_contract_contract_employee_leave_policy: "leave_policy",
        type_sample_employment_contract_contract_employee_late_early_checkin_policy: "late_early_checkin_policy",
        type_sample_employment_contract_contract_employee_advance_payment_policy: "advance_payment_policy",
        type_sample_employment_contract_contract_employee_allowance_policy: "allowance_policy",
        type_sample_employment_contract_contract_employee_benefit_policy: "benefit_policy",
        type_sample_employment_contract_contract_employee_bonus_policy: "bonus_policy",
        type_sample_employment_contract_contract_employee_punishment_policy: "punishment_policy",
        type_sample_employment_contract_contract_employee_insurance_policy: "insurance_policy",
        type_sample_employment_contract_contract_employee_trade_union_policy: "trade_union_policy",
        type_sample_employment_contract_contract_employee_tax_policy: "tax_policy",
        type_sample_employment_contract_contract_employee_other_liability_policy: "other_liability_policy",
        type_sample_employment_contract_contract_employee_signature: "signature"
    };
};

contentModule.getEmployeeProfileMainData = function(){
    return {
        type_employee_profile_picture: "picture",
        type_employee_profile_name: "name",
        type_employee_profile_day_of_birth: "dayofbirth",
        type_employee_profile_day_of_place: "placeofbirth",
        type_employee_profile_sex: "sex",
        type_employee_profile_ethnic: "ethnic",
        type_employee_profile_religion: "religion",
        type_employee_profile_hometown: "hometown",
        type_employee_profile_permanent_address: "permanent_address",
        type_employee_profile_temporary_address: "temporary_address",
        type_employee_profile_recruiment_date: "recruiment_date",
        type_employee_profile_official_date: "official_date",
        type_employee_profile_position: "position",
        type_employee_profile_concurrent_position: "concurrent_position",
        type_employee_profile_education_history: "education_history",
        type_employee_profile_emulation_reward: "emulation_reward",
        type_employee_profile_discipline: "discipline",
        type_employee_profile_nationalidno: "nationalidno",
        type_employee_profile_nationalidno_date: "nationalidno_date",
        type_employee_profile_nationalidno_place: "nationalidno_place",
        type_employee_profile_social_security_number: "social_security_number",
        type_employee_profile_work_history: "work_history",
        type_employee_profile_family_members: "family_members",
        type_employee_profile_signature: "signature"
    };
};

contentModule.getProductGroupsMainData = function(){
    return {
        type_product_groups_name: "name",
        type_product_groups_code: "code"
    };
};

contentModule.getPositionGroupsMainData = function(){
    return {
        type_position_groups_name: "name",
        type_position_groups_code: "code"
    };
};

contentModule.getProductListMainData = function(){
    return {
        type_product_list_name: "name",
        type_product_list_code: "code",
        type_product_list_unit: "unit",
        type_product_list_groupid: "groupid",
        type_product_list_price: "price",
        type_product_list_description: "description"
    };
};

contentModule.getPieceWageListMainData = function(){
    return {
        type_piece_wage_list_cycle: "cycleid",
        type_piece_wage_list_payroll_date: "payroll_date",
        type_piece_wage_list_policyid: "policyid",
        type_piece_wage_list_employeeid: "employeeid",
        type_piece_wage_list_orgid: "orgid",
        type_piece_wage_list_number: "number",
        type_piece_wage_list_date: "date"
        // type_piece_wage_list_content: "content"
    };
};

contentModule.getDisciplineMainData = function(){
    return {
        type_discipline_employee_employeeid: "employeeid",
        type_discipline_reference_number: "reference_number",
        type_discipline_date: "date",
        type_discipline_company: "company",
        type_discipline_content: "content",
        type_discipline_attachments: "attachments",
    };
};

contentModule.getEmulationAndRewardMainData = function(){
    return {
        type_emulation_and_reward_employee_employeeid: "employeeid",
        type_emulation_and_reward_reference_number: "reference_number",
        type_emulation_and_reward_date: "date",
        type_emulation_and_reward_company: "company",
        type_emulation_and_reward_content: "content",
        type_emulation_and_reward_attachments: "attachments",
    };
};

contentModule.getPayPercentageMainData = function(){
    return {
        type_pay_percentage_name: "name",
        type_pay_percentage_percentage: "percentage",
        type_pay_percentage_active: "available",
        type_pay_percentage_comment: "comment"
    }
};

contentModule.getPieceWageTableFieldMainData = function(){
    return {
        type_piece_wage_table_field_code: "code",
        type_piece_wage_table_field_name: "productid",
        type_piece_wage_table_field_unit: "unit",
        type_piece_wage_table_field_unit_price: "price",
        type_piece_wage_table_field_quantity: "quantity",
        type_piece_wage_table_field_coefficient: "coefficient",
        type_piece_wage_table_field_money: "money"
    };
};

contentModule.getPayslipDetailLineMainData = function(){
    return {
        type_payslip_detail_line_name: "name",
        type_payslip_detail_line_description: "description",
        type_payslip_detail_line_amount: "amount"
    };
};

contentModule.makePathIndex = function(host){
    var holderForSort = host.database.paths.items.map(function(item){
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.name.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });

    host.database.paths.items = holderForSort.map(function(holder){
        return holder.item;
    });
    for (var i = 0; i < host.database.paths.items.length; i++){
        host.database.paths.items[i].childIndexList = [];
    }
    var pathsDic = contentModule.makeDictionaryIndex(host.database.paths.items);
    var k;
    for (var i = 0; i < host.database.paths.items.length; i++){
        if (host.database.paths.items[i].parentid == 0) continue;
        k = pathsDic[host.database.paths.items[i].parentid];
        if (k !== undefined){
            host.database.paths.items[k].childIndexList.push(i);
        }
    }
};

contentModule.makeFilesIndex = function(host){
    for (var i = 0; i < host.database.paths.items.length; i++){
        host.database.paths.items[i].filesIndexList = [];
    }
    var pathsDic = contentModule.makeDictionaryIndex(host.database.paths.items);
    var k, t = [];
    for (var i = 0; i < host.database.files.items.length; i++){
        k = pathsDic[host.database.files.items[i].pathid];
        if (k !== undefined){
            host.database.paths.items[k].filesIndexList.push(t.length);
            t.push(host.database.files.items[i]);
        }
    }
    host.database.files.items = t;
};

contentModule.getPathTreeList = function(host){
    var list = [];
    function getRow(item){
        var items = [], ni;
        for (var i = 0; i < item.childIndexList.length; i++){
            ni = item.childIndexList[i];
            items.push(getRow(host.database.paths.items[ni]));
        }
        return {
            value: item.id,
            text: item.name,
            items: items
        };
    };
    for (var i = 0; i < host.database.paths.items.length; i++){
        if (host.database.paths.items[i].parentid != 0) continue;
        list.push(getRow(host.database.paths.items[i]));
    }
    return list;
};

contentModule.listSuffFiles = ["3g2","3ga","3gp","7z","aa","aac","ac","accdb","accdt","ace","adn","ai","aif","aifc","aiff","ait","amr","ani",
    "apk","app","applescript","asax","asc","ascx","asf","ash","ashx","asm","asmx","asp","aspx","asx","au","aup","avi","axd","aze","bak","bash",
    "bat","bin","blank","bmp","bowerrc","bpg","browser","bz2","bzempty","c","cab","cad","caf","cal","cd","cdda","cer","cfg","cfm","cfml","cgi",
    "chm","class","cmd","codeworkspace","codekit","coffee","coffeelintignore","com","compile","conf","config","cpp","cptx","cr2","crdownload",
    "crt","crypt","cs","csh","cson","csproj","css","csv","cue","cur","dart","dat","data","db","dbf","deb","default","dgn","dist","diz","dll",
    "dmg","dng","doc","docb","docm","docx","dot","dotm","dotx","download","dpj","ds_store","dsn","dtd","dwg","dxf","editorconfig","el","elf",
    "eml","enc","eot","eps","epub","eslintignore","exe","f4v","fax","fb2","fla","flac","flv","fnt","folder","fon","gadget","gdp","gem","gif",
    "gitattributes","gitignore","go","gpg","gpl","gradle","gz","h","handlebars","hbs","heic","hlp","hs","hsl","htm","html","ibooks","icns","ico",
    "ics","idx","iff","ifo","image","img","iml","in","inc","indd","inf","info","ini","inv","iso","j2","jar","java","jpe","jpeg","jpg","js",
    "json","jsp","jsx","key","kf8","kmk","ksh","kt","kts","kup","less","lex","licx","lisp","lit","lnk","lock","log","lua","m","m2v","m3u","m3u8",
    "m4","m4a","m4r","m4v","map","master","mc","md","mdb","mdf","me","mi","mid","midi","mk","mkv","mm","mng","mo","mobi","mod","mov","mp2","mp3",
    "mp4","mpa","mpd","mpe","mpeg","mpg","mpga","mpp","mpt","msg","msi","msu","nef","nes","nfo","nix","npmignore","ocx","odb","ods","odt","ogg",
    "ogv","ost","otf","ott","ova","ovf","p12","p7b","pages","part","pcd","pdb","pdf","pem","pfx","pgp","ph","phar","php","pid","pkg","pl","plist",
    "pm","png","po","pom","pot","potx","pps","ppsx","ppt","pptm","pptx","prop","ps","ps1","psd","psp","pst","pub","py","pyc","qt","ra","ram",
    "rar","raw","rb","rdf","rdl","reg","resx","retry","rm","rom","rpm","rpt","rsa","rss","rst","rtf","ru","rub","sass","scss","sdf","sed","sh",
    "sit","sitemap","skin","sldm","sldx","sln","sol","sphinx","sql","sqlite","step","stl","svg","swd","swf","swift","swp","sys","tar","tax",
    "tcsh","tex","tfignore","tga","tgz","tif","tiff","tmp","tmx","torrent","tpl","ts","tsv","ttf","twig","txt","udf","vb","vbproj","vbs","vcd",
    "vcf","vcs","vdi","vdx","vmdk","vob","vox","vscodeignore","vsd","vss","vst","vsx","vtx","war","wav","wbk","webinfo","webm","webp","wma",
    "wmf","wmv","woff","woff2","wps","wsf","xaml","xcf","xfl","xlm","xls","xlsm","xlsx","xlt","xltm","xltx","xml","xpi","xps","xrb","xsd","xsl",
    "xspf","xz","yaml","yml","z","zip","zsh"
];

contentModule.getAvatarByHomeid = function(host, userid){
    var index = host.database.users.getByhomeid(userid);
    if (index < 0) return "";
    if (host.database.users.items[index].avatar !== ""){
        return window.domainUser_avatarsNew + host.database.users.items[index].homeid + "_" + host.database.users.items[index].avatar;
    }
    else {
        if (systemconfig.connectorFile){
            return window.domainUser_avatarsNew + "default.svg";
        }
        else {
            return window.domainUser_avatars + "avatar-default.png";
        }
    }
};


contentModule.checkDatatypeOfArray = function(typelists, typeid){
    var index, dict, type, content;
    dict = {};
    typelists.forEach(function(elt, index){
        dict[elt.id] = index;
    });
    index = dict[typeid];
    var getType = function(index){
        var type = typelists[index].type;
        if (
            type == "phone_type"
            || type == "personal_document_type"
            || type == "personal_document"
            || type == "org"
            || type == "company"
            || type == "employee"
            || type == "people"
            || type == "position"
            || type == "position_2"
            || type == "select_position"
            || type == "position_list"
            || type == "marital_status_type"
            || type == "sex_type"
            || type == "email_type"
            || type == "task"
            || type == "meeting"
            || type == "holidays"
            || type == "shift_general"
            || type == "shift_worktime"
            || type == "shift_timekeeping"
            || type == "worktime_checkins"
            || type == "checkin_employee_ident"
            || type == "worktime_machines"
            || type == "worktime_logs"
            || type == "training_programs"
            || type == "training_type"
            || type == "training_method"
            || type == "training_status"
            || type == "asset_category"
            || type == "assets"
            || type == "instruments_and_tools"
            || type == "warehouses"
            || type == "asset_handover_lines"
            || type == "asset_handover"
            || type == "instruments_and_tools_handover_lines"
            || type == "instruments_and_tools_handover"
            || type == "asset_recall_lines"
            || type == "asset_recall"
            || type == "allowance_policy_groups"
            || type == "lesson_categories"
            || type == "bonus_policy_groups"
            || type == "piece_wage_policy_groups"
            || type == "attendance_clock_policy_groups"
            || type == "standard_workday_policy_groups"
            || type == "work_flow_groups"
            || type == "work_flows"
            || type == "objects"
            || type == "partner_class"
            || type == "partner"
            || type == "contact"
            || type == "other_liability_policy_groups"
            || type == "other_policy_groups"
            || type == "salary_policy_groups"
            || type == "trade_union_policy_groups"
            || type == "overtime_policy_groups"
            || type == "late_early_checkin_policy_groups"
            || type == "punishment_policy_groups"
            || type == "asset_category"
            || type == "instruments_and_tools_category"
            || type == "projects"
            || type == "project_applied_to_employee"
            || type == "tax_policy_groups"
            || type == "advance_payment_policy_groups"
            || type == "allowance_policies"
            || type == "benefit_policies"
            || type == "training_program_groups"
            || type == "insurance_policies"
            || type == "bonus_policies"
            || type == "piece_wage_policies"
            || type == "attendance_clock_policies"
            || type == "standard_workday_policies"
            || type == "advance_payment_policies"
            || type == "late_early_checkin_policies"
            || type == "punishment_policies"
            || type == "leave_policy_groups"
            || type == "insurance_policy_groups"
            || type == "leave_policies"
            || type == "benefit_policy_groups"
            || type == "tax_rate_lines"
            || type == "tax_policies"
            || type == "trade_union_policies"
            || type == "overtime_policies"
            || type == "overtime_request"
            || type == "salary_policies"
            || type == "other_liability_policies"
            || type == "insurance_policies_applied_to_employee"
            || type == "overtime_policies_applied_to_employee"
            || type == "bonus_policies_applied_to_employee"
            || type == "piece_wage_policies_applied_to_employee"
            || type == "attendance_clock_policies_applied_to_employee"
            || type == "standard_workday_policies_applied_to_employee"
            || type == "punishment_policies_applied_to_employee"
            || type == "benefit_policies_applied_to_employee"
            || type == "allowance_policies_applied_to_employee"
            || type == "tax_policies_applied_to_employee"
            || type == "trade_union_policies_applied_to_employee"
            || type == "other_liability_policies_applied_to_employee"
            || type == "leave_policies_applied_to_employee"
            || type == "late_early_checkin_policies_applied_to_employee"
            || type == "advance_payment_policies_applied_to_employee"
            || type == "salary_policies_applied_to_employee"
            || type == "salary_decisions_applied_to_employee"
            || type == "employment_contracts"
            || type == "request_advance_payment"
            || type == "request_late_early_checkin"
            || type == "request_leave"
            || type == "shift_schedule"
            || type == "shift_schedule_ot"
            || type == "days_off_schedule"
            || type == "bonus_list"
            || type == "bonus_list_details"
            || type == "punishment_list_details"
            || type == "allowance_list_details"
            || type == "benefit_list_details"
            || type == "other_liability_list_details"
            || type == "advance_payment_list_details"
            || type == "punishment_list"
            || type == "allowance_list"
            || type == "benefit_list"
            || type == "other_liability_list"
            || type == "advance_payment_list"
            || type == "salary_adjustment_list"
            || type == "salary_adjustment_list_details"
            || type == "scorecard_report_line"
            || type == "scorecard_report"
            || type == "offboarding"
            || type == "family_members"
            || type == "employment_contract_types"
            || type == "social_network"
            || type == "work_history"
            || type == "education_history"
            || type == "skill"
            || type == "bank_account"
            || type == "phone"
            || type == "email"
            || type == "nations"
            || type == "cities"
            || type == "ethnics"
            || type == "religions"
            || type == "training_lecturer"
            || type == "training_participant"
            || type == "examination_session"
            || type == "examination_participant"
            || type == "examination_lecturer"
            || type == "examination_session_status"
            || type == "examination_participant_status"
            || type == "document_types"
            || type == "document_groups"
            || type == "document_properties"
            || type == "document_templates"
            || type == "documents"
            || type == "offboarding_types"
            || type == "offboarding_reasons"
            || type == "piece_wage_table_field"
            || type == "payslip_detail_line"
            || type == "payslip"
            || type == "pay_percentage"
            || type == "emulation_and_reward"
            || type == "discipline"
            || type == "employee_profile"
        ){
            type = typelists[index].type2;
        }
        return type;
    }
    type = getType(index);
    if (type == "any_file") return "advanced";
    if (type != "structure" && type != "extends_structure" && type != "array") return "primitive";
    if (type == "array") return "advanced";
    if (type == "structure") content = typelists[index].content.details;
    else if (type == "extends_structure") {
        var host = {
            database: {
                typelists: {items: typelists}
            },
            dictionary: {
                typelists: dict
            }
        };
        content = contentModule.makeExtendTypeData(host, typeid);
    }
    for (var i = 0; i < content.length; i++){
        if (content[i].type == "union") {
            var keys = Object.keys(content[i].detailUnion);
            for (var m = 0; m < keys.length; m++){
                for (var n = 0; n < content[i].detailUnion[keys[m]].length; n++) {
                    index = dict[content[i].detailUnion[keys[m]][n].type];
                    type = getType(index);
                    if (type == "structure" || type == "extends_structure" || type == "array") return "advanced";
                }
            }
        }
        else {
            index = dict[content[i].type];
            type = getType(index);
            if (type == "structure" || type == "extends_structure" || type == "array") return "advanced";
        }
    }
    return "primitive";
};

contentModule.getPathTreeRootList = function(host, id){
    var list = [];
    function getRow(item){
        var items = [], ni;
        for (var i = 0; i < item.childIndexList.length; i++){
            ni = item.childIndexList[i];
            if (host.database.paths.items[ni].id == id) continue;
            items.push(getRow(host.database.paths.items[ni]));
        }
        return {
            value: item.id,
            text: item.name,
            items: items
        };
    };
    for (var i = 0; i < host.database.paths.items.length; i++){
        if (host.database.paths.items[i].parentid != 0) continue;
        if (host.database.paths.items[i].id == id) continue;
        list.push(getRow(host.database.paths.items[i]));
    }
    return [{
        value: 0,
        text: "Root",
        items: list
    }];
};

contentModule.getDocumentFoldersSelectTreeMenuMove = function(host, id){
    var list = [];
    function getRow(item){
        var items = [], ni;
        for (var i = 0; i < item.childIndexList.length; i++){
            ni = item.childIndexList[i];
            if (host.database.document_folders.items[ni].id == id) continue;
            items.push(getRow(host.database.document_folders.items[ni]));
        }
        return {
            value: item.id,
            text: item.name,
            items: items
        };
    };
    for (var i = 0; i < host.database.document_folders.items.length; i++){
        if (host.database.document_folders.items[i].parentid != 0) continue;
        if (host.database.document_folders.items[i].id == id) continue;
        list.push(getRow(host.database.document_folders.items[i]));
    }
    return [{
        value: 0,
        text: "",
        items: list
    }];
};

contentModule.getSystemVariable = function(){
    var content = [
        {task: "company", title: LanguageModule.text("txt_company"), name: "company", tablename: "orgs", typeid: -260, input_form: -260, output_form: -1260},
        {task: "org", title: LanguageModule.text("txt_department"), name: "orgs", tablename: "orgs", typeid: -26, input_form: -26, output_form: -1026},
        {task: "employee", title: LanguageModule.text("txt_employee_work_information"), name: "employees", tablename: "employees", typeid: -27, input_form: -27, output_form: -1027},
        {task: "employee_personal_information", title: LanguageModule.text("txt_employee_personal_information"), name: "employee_personal_information", tablename: "peoples", typeid: -354, input_form: -354, output_form: -1354},
        {task: "position", title: LanguageModule.text("txt_position"), name: "positions", tablename: "positions", typeid: -28, input_form: -28, output_form: -1028},
        {task: "position_2", title: LanguageModule.text("txt_position_2"), name: "positions_2", tablename: "positions_2", typeid: -295, input_form: -295, output_form: -1295},
        {task: "holidays", title: LanguageModule.text("txt_holiday"), name: "holidays", tablename: "holidays", typeid: -50, input_form: -50, output_form: -1050},
        {task: "task", title: LanguageModule.text("txt_task"), name: "tasks", tablename: "task", typeid: -45, input_form: -45, output_form: -1045},
        {task: "meeting", title: LanguageModule.text("txt_meeting"), name: "meetings", tablename: "meeting", typeid: -46, input_form: -46, output_form: -1046},
        {task: "shift_general", title: LanguageModule.text("txt_shift_general"), name: "shift_general", tablename: "shifts", typeid: -54, input_form: -54, output_form: -1054},
        {task: "shift_worktime", title: LanguageModule.text("txt_shift_worktime"), name: "shift_worktime", tablename: "shifts", typeid: -270, input_form: -270, output_form: -1270},
        {task: "shift_timekeeping", title: LanguageModule.text("txt_shift_timekeeping"), name: "shift_timekeeping", tablename: "shifts", typeid: -271, input_form: -271, output_form: -1271},
        {task: "worktime_checkins", title: LanguageModule.text("txt_worktime_checkins"), name: "worktime_checkins", tablename: "worktime_checkins", typeid: -56, input_form: -56, output_form: -1056},
        {task: "checkin_employee_ident", title: LanguageModule.text("txt_timekeeping_code"), name: "checkin_employee_ident", tablename: "timekeeping_code", typeid: -301, input_form: -301, output_form: -1301},
        {task: "worktime_logs", title: LanguageModule.text("txt_worktime_logs"), name: "worktime_logs", tablename: "worktime_logs", typeid: -59, input_form: -59, output_form: -1059},
        {task: "worktime_machines", title: LanguageModule.text("txt_worktime_machine"), name: "worktime_machines", tablename: "worktime_machines", typeid: -57, input_form: -57, output_form: -1057},
        // {task: "training_programs", title: LanguageModule.text("txt_training_program"), name: "training_programs", tablename: "training_programs", typeid: -60, input_form: -60, output_form: -1060},
        {task: "assets", title: LanguageModule.text("txt_asset"), name: "assets", tablename: "assets", typeid: -66, input_form: -66, output_form: -1066},
        {task: "instruments_and_tools", title: LanguageModule.text("txt_instruments_and_tools"), name: "instruments_and_tools", tablename: "instruments_and_tools", typeid: -67, input_form: -67, output_form: -1067},
        {task: "warehouses", title: LanguageModule.text("txt_warehouse"), name: "warehouses", tablename: "warehouses", typeid: -68, input_form: -68, output_form: -1068},
        {task: "asset_handover", title: LanguageModule.text("txt_asset_handover"), name: "asset_handover", tablename: "asset_transactions", typeid: -73, input_form: -73, output_form: -1073},
        {task: "instruments_and_tools_handover", title: LanguageModule.text("txt_instruments_and_tools_handover"), name: "instruments_and_tools_handover", tablename: "asset_transactions", typeid: -232, input_form: -232, output_form: -1232},
        {task: "asset_recall", title: LanguageModule.text("txt_asset_recall"), name: "asset_recall", tablename: "asset_transactions", typeid: -77, input_form: -77, output_form: -1077},
        {task: "allowance_policy_groups", title: LanguageModule.text("txt_allowance_policy_group"), name: "allowance_policy_groups", tablename: "allowance_policy_groups", typeid: -80, input_form: -80, output_form: -1080},
        {task: "bonus_policy_groups", title: LanguageModule.text("txt_bonus_policy_group"), name: "bonus_policy_groups", tablename: "bonus_policy_groups", typeid: -101, input_form: -101, output_form: -1101},
        {task: "piece_wage_policy_groups", title: LanguageModule.text("txt_piece_wage_policy_group"), name: "piece_wage_policy_groups", tablename: "piece_wage_policy_groups", typeid: -308, input_form: -308, output_form: -1308},
        {task: "attendance_clock_policy_groups", title: LanguageModule.text("txt_attendance_clock_policy_group"), name: "attendance_clock_policy_groups", tablename: "attendance_clock_policy_groups", typeid: -341, input_form: -341, output_form: -1341},
        {task: "standard_workday_policy_groups", title: LanguageModule.text("txt_standard_workday_policy_group"), name: "standard_workday_policy_groups", tablename: "standard_workday_policy_groups", typeid: -302, input_form: -302, output_form: -1302},
        {task: "work_flow_groups", title: LanguageModule.text("txt_work_flow_group"), name: "work_flow_groups", tablename: "work_flow_groups", typeid: -245, input_form: -245, output_form: -1245},
        {task: "work_flows", title: LanguageModule.text("txt_work_flows"), name: "work_flows", tablename: "work_flows", typeid: -247, input_form: -247, output_form: -1247},
        {task: "objects", title: LanguageModule.text("txt_object"), name: "objects", tablename: "objects", typeid: -249, input_form: -249, output_form: -1249},
        {task: "partner_class", title: LanguageModule.text("txt_partner_class"), name: "partner_class", tablename: "partner_class", typeid: -239, input_form: -239, output_form: -1239},
        {task: "partner", title: LanguageModule.text("txt_partner"), name: "partner", tablename: "partner", typeid: -241, input_form: -241, output_form: -1241},
        {task: "contact", title: LanguageModule.text("txt_contact"), name: "contact", tablename: "contact", typeid: -243, input_form: -243, output_form: -1243},
        {task: "punishment_policy_groups", title: LanguageModule.text("txt_punishment_policy_group"), name: "punishment_policy_groups", tablename: "punishment_policy_groups", typeid: -103, input_form: -103, output_form: -1103},
        {task: "asset_category", title: LanguageModule.text("txt_asset_category"), name: "asset_category", tablename: "asset_category", typeid: -202, input_form: -202, output_form: -1202},
        {task: "instruments_and_tools_category", title: LanguageModule.text("txt_instruments_and_tools_category"), name: "instruments_and_tools_category", tablename: "instruments_and_tools_category", typeid: -204, input_form: -204, output_form: -1204},
        {task: "projects", title: LanguageModule.text("txt_projects"), name: "projects", tablename: "projects", typeid: -206, input_form: -206, output_form: -1206},
        {task: "project_applied_to_employee", title: LanguageModule.text("txt_project_applied_to_employee"), name: "project_applied_to_employee", tablename: "employee_projects", typeid: -209, input_form: -209, output_form: -1209},
        {task: "tax_policy_groups", title: LanguageModule.text("txt_tax_policy_group"), name: "tax_policy_groups", tablename: "tax_policy_groups", typeid: -105, input_form: -105, output_form: -1105},
        {task: "advance_payment_policy_groups", title: LanguageModule.text("txt_advance_payment_policy_group"), name: "advance_payment_policy_groups", tablename: "advance_payment_policy_groups", typeid: -107, input_form: -107, output_form: -1107},
        {task: "late_early_checkin_policy_groups", title: LanguageModule.text("txt_late_early_checkin_policy_group"), name: "late_early_checkin_policy_groups", tablename: "late_early_checkin_policy_groups", typeid: -109, input_form: -109, output_form: -1109},
        {task: "salary_policy_groups", title: LanguageModule.text("txt_salary_policy_group"), name: "salary_policy_groups", tablename: "salary_policy_groups", typeid: -124, input_form: -124, output_form: -1124},
        {task: "trade_union_policy_groups", title: LanguageModule.text("txt_trade_union_policy_group"), name: "trade_union_policy_groups", tablename: "trade_union_policy_groups", typeid: -126, input_form: -126, output_form: -1126},
        {task: "overtime_policy_groups", title: LanguageModule.text("txt_overtime_policy_group"), name: "overtime_policy_groups", tablename: "overtime_policy_groups", typeid: -272, input_form: -272, output_form: -1272},
        {task: "other_liability_policy_groups", title: LanguageModule.text("txt_other_liability_policy_group"), name: "other_liability_policy_groups", tablename: "other_liability_policy_groups", typeid: -128, input_form: -128, output_form: -1128},
        {task: "other_policy_groups", title: LanguageModule.text("txt_other_policy_group"), name: "other_policy_groups", tablename: "other_policy_groups", typeid: -350, input_form: -350, output_form: -1350},
        {task: "allowance_policies", title: LanguageModule.text("txt_allowance_policy"), name: "allowance_policies", tablename: "allowance_policies", typeid: -82, input_form: -82, output_form: -1082},
        {task: "benefit_policies", title: LanguageModule.text("txt_benefit_policy"), name: "benefit_policies", tablename: "benefit_policies", typeid: -100, input_form: -100, output_form: -1100},
        {task: "training_program_groups", title: LanguageModule.text("txt_training_program_group"), name: "training_program_groups", tablename: "training_program_groups", typeid: -85, input_form: -85, output_form: -1085},
        {task: "insurance_policies", title: LanguageModule.text("txt_insurance_policy"), name: "insurance_policies", tablename: "insurance_policies", typeid: -87, input_form: -87, output_form: -1087},
        {task: "bonus_policies", title: LanguageModule.text("txt_bonus_policy"), name: "bonus_policies", tablename: "bonus_policies", typeid: -111, input_form: -111, output_form: -1111},
        {task: "piece_wage_policies", title: LanguageModule.text("txt_piece_wage_policy"), name: "piece_wage_policies", tablename: "piece_wage_policies", typeid: -310, input_form: -310, output_form: -1310},
        {task: "attendance_clock_policies", title: LanguageModule.text("txt_attendance_clock_policy"), name: "attendance_clock_policies", tablename: "attendance_clock_policies", typeid: -343, input_form: -343, output_form: -1343},
        {task: "standard_workday_policies", title: LanguageModule.text("txt_bonus_policy"), name: "standard_workday_policies", tablename: "standard_workday_policies", typeid: -305, input_form: -305, output_form: -1305},
        {task: "punishment_policies", title: LanguageModule.text("txt_punishment_policy"), name: "punishment_policies", tablename: "punishment_policies", typeid: -112, input_form: -112, output_form: -1112},
        {task: "advance_payment_policies", title: LanguageModule.text("txt_advance_payment_policy"), name: "advance_payment_policies", tablename: "advance_payment_policies", typeid: -115, input_form: -115, output_form: -1115},
        {task: "late_early_checkin_policies", title: LanguageModule.text("txt_late_early_checkin_policy"), name: "late_early_checkin_policies", tablename: "late_early_checkin_policies", typeid: -119, input_form: -119, output_form: -1119},
        {task: "leave_policy_groups", title: LanguageModule.text("txt_leave_policy_group"), name: "leave_policy_groups", tablename: "leave_policy_groups", typeid: -95, input_form: -95, output_form: -1095},
        {task: "insurance_policy_groups", title: LanguageModule.text("txt_insurance_policy_group"), name: "insurance_policy_groups", tablename: "insurance_policy_groups", typeid: -96, input_form: -96, output_form: -1096},
        {task: "leave_policies", title: LanguageModule.text("txt_leave_policy"), name: "leave_policies", tablename: "leave_policies", typeid: -94, input_form: -94, output_form: -1094},
        {task: "benefit_policy_groups", title: LanguageModule.text("txt_benefit_policy_group"), name: "benefit_policy_groups", tablename: "benefit_policy_groups", typeid: -98, input_form: -98, output_form: -1098},
        {task: "tax_policies", title: LanguageModule.text("txt_tax_policy"), name: "tax_policies", tablename: "tax_policies", typeid: -122, input_form: -122, output_form: -1122},
        {task: "trade_union_policies", title: LanguageModule.text("txt_trade_union_policy"), name: "trade_union_policies", tablename: "trade_union_policies", typeid: -134, input_form: -134, output_form: -1134},
        {task: "overtime_policies", title: LanguageModule.text("txt_overtime_policy"), name: "overtime_policies", tablename: "overtime_policies", typeid: -274, input_form: -274, output_form: -1274},
        {task: "overtime_request", title: LanguageModule.text("txt_overtime_request"), name: "overtime_request", tablename: "overtime_request", typeid: -277, input_form: -277, output_form: -1277},
        {task: "other_liability_policies", title: LanguageModule.text("txt_other_liability_policy"), name: "other_liability_policies", tablename: "other_liability_policies", typeid: -135, input_form: -135, output_form: -1135},
        {task: "family_members", title: LanguageModule.text("txt_family_member"), name: "family_members", tablename: "employee_family_members", typeid: -21, input_form: -21, output_form: -1021},
        {task: "employment_contract_types", title: LanguageModule.text("txt_employment_contract_type"), name: "employment_contract_types", tablename: "employment_contract_types", typeid: -152, input_form: -152, output_form: -1152},
        {task: "social_network", title: LanguageModule.text("txt_social_network"), name: "social_network", tablename: "", typeid: -153, input_form: -153, output_form: -1153},
        {task: "work_history", title: LanguageModule.text("txt_work_history"), name: "work_history", tablename: "", typeid: -158, input_form: -158, output_form: -1158},
        {task: "education_history", title: LanguageModule.text("txt_education_history"), name: "education_history", tablename: "", typeid: -154, input_form: -154, output_form: -1154},
        {task: "skill", title: LanguageModule.text("txt_skill"), name: "skill", tablename: "", typeid: -155, input_form: -155, output_form: -1155},
        {task: "bank_account", title: LanguageModule.text("txt_bank_account"), name: "bank_account", tablename: "", typeid: -159, input_form: -159, output_form: -1159},
        {task: "phone", title: LanguageModule.text("txt_phone"), name: "phone", tablename: "phone", typeid: -18, input_form: -18, output_form: -1018},
        {task: "email", title: LanguageModule.text("txt_email"), name: "email", tablename: "email", typeid: -42, input_form: -42, output_form: -1042},
        {task: "personal_document", title: LanguageModule.text("txt_personal_document"), name: "personal_document", tablename: "personal_document", typeid: -20, input_form: -20, output_form: -1020},
        {task: "nations", title: LanguageModule.text("txt_nation"), name: "nations", tablename: "nations", typeid: -160, input_form: -160, output_form: -1160},
        {task: "cities", title: LanguageModule.text("txt_city"), name: "cities", tablename: "cities", typeid: -161, input_form: -161, output_form: -1161},
        {task: "ethnics", title: LanguageModule.text("txt_ethnic"), name: "ethnics", tablename: "ethnics", typeid: -162, input_form: -162, output_form: -1162},
        {task: "religions", title: LanguageModule.text("txt_religion"), name: "religions", tablename: "religions", typeid: -163, input_form: -163, output_form: -1163},
        {task: "insurance_policies_applied_to_employee", title: LanguageModule.text("txt_insurance_policies_applied_to_employee"), name: "insurance_policies_applied_to_employee", tablename: "employee_policies", typeid: -151, input_form: -151, output_form: -1151},//để tạm, chưa biết lưu như nào
        {task: "overtime_policies_applied_to_employee", title: LanguageModule.text("txt_overtime_policies_applied_to_employee"), name: "overtime_policies_applied_to_employee", tablename: "employee_policies", typeid: -278, input_form: -278, output_form: -1278},//để tạm, chưa biết lưu như nào
        {task: "bonus_policies_applied_to_employee", title: LanguageModule.text("txt_bonus_policies_applied_to_employee"), name: "bonus_policies_applied_to_employee", tablename: "employee_policies", typeid: -164, input_form: -164, output_form: -1164},
        {task: "piece_wage_policies_applied_to_employee", title: LanguageModule.text("txt_piece_wage_policies_applied_to_employee"), name: "piece_wage_policies_applied_to_employee", tablename: "employee_policies", typeid: -322, input_form: -322, output_form: -1322},
        {task: "attendance_clock_policies_applied_to_employee", title: LanguageModule.text("txt_attendance_clock_policies_applied_to_employee"), name: "attendance_clock_policies_applied_to_employee", tablename: "employee_policies", typeid: -345, input_form: -345, output_form: -1345},
        {task: "standard_workday_policies_applied_to_employee", title: LanguageModule.text("txt_standard_workday_policies_applied_to_employee"), name: "standard_workday_policies_applied_to_employee", tablename: "employee_policies", typeid: -307, input_form: -307, output_form: -1307},
        {task: "punishment_policies_applied_to_employee", title: LanguageModule.text("txt_punishment_policies_applied_to_employee"), name: "punishment_policies_applied_to_employee", tablename: "employee_policies", typeid: -165, input_form: -165, output_form: -1165},
        {task: "benefit_policies_applied_to_employee", title: LanguageModule.text("txt_benefit_policies_applied_to_employee"), name: "benefit_policies_applied_to_employee", tablename: "employee_policies", typeid: -166, input_form: -166, output_form: -1166},
        {task: "allowance_policies_applied_to_employee", title: LanguageModule.text("txt_allowance_policies_applied_to_employee"), name: "allowance_policies_applied_to_employee", tablename: "employee_policies", typeid: -167, input_form: -167, output_form: -1167},
        {task: "tax_policies_applied_to_employee", title: LanguageModule.text("txt_tax_policies_applied_to_employee"), name: "tax_policies_applied_to_employee", tablename: "employee_policies", typeid: -168, input_form: -168, output_form: -1168},
        {task: "trade_union_policies_applied_to_employee", title: LanguageModule.text("txt_trade_union_policies_applied_to_employee"), name: "trade_union_policies_applied_to_employee", tablename: "employee_policies", typeid: -169, input_form: -169, output_form: -1169},
        {task: "other_liability_policies_applied_to_employee", title: LanguageModule.text("txt_other_liability_policies_applied_to_employee"), name: "other_liability_policies_applied_to_employee", tablename: "employee_policies", typeid: -170, input_form: -170, output_form: -1170},
        {task: "leave_policies_applied_to_employee", title: LanguageModule.text("txt_leave_policies_applied_to_employee"), name: "leave_policies_applied_to_employee", tablename: "employee_policies", typeid: -171, input_form: -171, output_form: -1171},
        {task: "late_early_checkin_policies_applied_to_employee", title: LanguageModule.text("txt_late_early_checkin_policies_applied_to_employee"), name: "late_early_checkin_policies_applied_to_employee", tablename: "employee_policies", typeid: -172, input_form: -172, output_form: -1172},
        {task: "advance_payment_policies_applied_to_employee", title: LanguageModule.text("txt_advance_payment_policies_applied_to_employee"), name: "advance_payment_policies_applied_to_employee", tablename: "employee_policies", typeid: -173, input_form: -173, output_form: -1173},
        {task: "salary_policies_applied_to_employee", title: LanguageModule.text("txt_salary_policy_applied_to_employee"), name: "salary_policies_applied_to_employee", tablename: "employee_policies", typeid: -175, input_form: -175, output_form: -1175},
        {task: "employment_contracts", title: LanguageModule.text("txt_employee_employment_contract"), name: "employment_contracts", tablename: "employment_contracts", typeid: -176, input_form: -176, output_form: -1176},
        {task: "bonus_list", title: LanguageModule.text("txt_bonus_list"), name: "bonus_list", tablename: "employee_benefit_and_liability_list", typeid: -177, input_form: -177, output_form: -1177},
        {task: "bonus_list_details", title: LanguageModule.text("txt_bonus_list_details"), name: "bonus_list_details", tablename: "employee_benefit_and_liability_list_details", typeid: -269, input_form: -269, output_form: -1269},
        {task: "punishment_list", title: LanguageModule.text("txt_punishment_list"), name: "punishment_list", tablename: "employee_benefit_and_liability_list_details", typeid: -191, input_form: -191, output_form: -1191},
        {task: "punishment_list_details", title: LanguageModule.text("txt_punishment_list_details"), name: "punishment_list_details", tablename: "employee_benefit_and_liability_list_details", typeid: -279, input_form: -279, output_form: -1279},
        {task: "allowance_list", title: LanguageModule.text("txt_allowance_list"), name: "allowance_list", tablename: "employee_benefit_and_liability_list_details", typeid: -196, input_form: -196, output_form: -1196},
        {task: "allowance_list_details", title: LanguageModule.text("txt_allowance_list_details"), name: "allowance_list_details", tablename: "employee_benefit_and_liability_list_details", typeid: -280, input_form: -280, output_form: -1280},
        {task: "benefit_list", title: LanguageModule.text("txt_benefit_list"), name: "benefit_list", tablename: "employee_benefit_and_liability_list_details", typeid: -197, input_form: -197, output_form: -1197},
        {task: "benefit_list_details", title: LanguageModule.text("txt_benefit_list_details"), name: "benefit_list_details", tablename: "employee_benefit_and_liability_list_details", typeid: -281, input_form: -281, output_form: -1281},
        {task: "other_liability_list", title: LanguageModule.text("txt_other_liability_list"), name: "other_liability_list", tablename: "employee_benefit_and_liability_list_details", typeid: -198, input_form: -198, output_form: -1198},
        {task: "advance_payment_list", title: LanguageModule.text("txt_advance_payment_list"), name: "advance_payment_list", tablename: "employee_benefit_and_liability_list_details", typeid: -346, input_form: -346, output_form: -1346},
        {task: "other_liability_list_details", title: LanguageModule.text("txt_other_liability_list_details"), name: "other_liability_list_details", tablename: "employee_benefit_and_liability_list_details", typeid: -282, input_form: -282, output_form: -1282},
        {task: "advance_payment_list_details", title: LanguageModule.text("txt_advance_payment_list_details"), name: "advance_payment_list_details", tablename: "employee_benefit_and_liability_list_details", typeid: -347, input_form: -347, output_form: -1347},
        {task: "salary_adjustment_list", title: LanguageModule.text("txt_salary_adjustment_list"), name: "salary_adjustment_list", tablename: "employee_benefit_and_liability_list_details", typeid: -200, input_form: -200, output_form: -1200},
        {task: "salary_adjustment_list_details", title: LanguageModule.text("txt_salary_adjustment_list_details"), name: "salary_adjustment_list_details", tablename: "employee_benefit_and_liability_list_details", typeid: -283, input_form: -283, output_form: -1283},
        {task: "offboarding", title: LanguageModule.text("txt_offboarding"), name: "offboarding", tablename: "offboarding", typeid: -228, input_form: -228, output_form: -1228},
        {task: "salary_decisions_applied_to_employee", title: LanguageModule.text("txt_salary_decisions_applied_to_employee"), name: "salary_decisions_applied_to_employee", tablename: "employee_salary_decisions", typeid: -174, input_form: -174, output_form: -1174},
        // {task: "training_lecturer", title: LanguageModule.text("txt_training_lecturer"), name: "training_lecturer", tablename: "training_lecturers", typeid: -178, input_form: -178, output_form: -1178},
        {task: "people", title: LanguageModule.text("txt_people"), name: "people", tablename: "peoples", typeid: -179, input_form: -179, output_form: -1179},
        {task: "training_participant", title: LanguageModule.text("txt_training_participant"), name: "training_participant", tablename: "training_participants", typeid: -180, input_form: -180, output_form: -1180},
        {task: "request_advance_payment", title: LanguageModule.text("txt_request_advance_payment"), name: "request_advance_payment", tablename: "employee_benefit_and_liability_request", typeid: -182, input_form: -182, output_form: -1182},
        {task: "request_late_early_checkin", title: LanguageModule.text("txt_request_late_early_checkin"), name: "request_late_early_checkin", tablename: "employee_benefit_and_liability_request", typeid: -195, input_form: -195, output_form: -1195},
        {task: "request_leave", title: LanguageModule.text("txt_request_leave"), name: "request_leave", tablename: "employee_benefit_and_liability_request", typeid: -188, input_form: -188, output_form: -1188},
        {task: "shift_schedule", title: LanguageModule.text("txt_shift_schedule"), name: "shift_schedule", tablename: "assign_employee_shifts", typeid: -190, input_form: -190, output_form: -1190},
        {task: "shift_schedule_ot", title: LanguageModule.text("txt_overtime_shifts_schedule"), name: "shift_schedule_ot", tablename: "assign_employee_shifts", typeid: -294, input_form: -294, output_form: -1294},
        {task: "days_off_schedule", title: LanguageModule.text("txt_days_off_schedule"), name: "days_off_schedule", tablename: "assign_employee_shifts", typeid: -337, input_form: -337, output_form: -1337},
        // {task: "examination_session", title: LanguageModule.text("txt_training_program"), name: "examination_session", tablename: "examination_session", typeid: -183, input_form: -183, output_form: -1183},
        // {task: "examination_participant", title: LanguageModule.text("txt_training_program"), name: "examination_participant", tablename: "examination_participant", typeid: -186, input_form: -186, output_form: -1186},
        // {task: "examination_lecturer", title: LanguageModule.text("txt_training_program"), name: "examination_lecturer", tablename: "examination_lecturer", typeid: -187, input_form: -187, output_form: -1187},
        {task: "document_types", title: LanguageModule.text("txt_document_type"), name: "document_types", tablename: "document_types", typeid: -211, input_form: -211, output_form: -1211},
        {task: "document_groups", title: LanguageModule.text("txt_document_group"), name: "document_groups", tablename: "document_groups", typeid: -213, input_form: -213, output_form: -1213},
        {task: "document_properties", title: LanguageModule.text("txt_document_property"), name: "document_properties", tablename: "document_properties", typeid: -234, input_form: -234, output_form: -1234},
        {task: "document_templates", title: LanguageModule.text("txt_document_template"), name: "document_templates", tablename: "document_templates", typeid: -216, input_form: -216, output_form: -1216},
        {task: "documents", title: LanguageModule.text("txt_documents"), name: "documents", tablename: "documents", typeid: -219, input_form: -219, output_form: -1219},
        {task: "template_groups", title: LanguageModule.text("txt_template_groups"), name: "template_groups", tablename: "template_groups", typeid: -222, input_form: -222, output_form: -1222},
        {task: "task_templates", title: LanguageModule.text("txt_task_template"), name: "task_templates", tablename: "task_templates", typeid: -224, input_form: -224, output_form: -1224},
        {task: "meeting_templates", title: LanguageModule.text("txt_meeting_template"), name: "meeting_templates", tablename: "meeting_templates", typeid: -225, input_form: -225, output_form: -1225},
        {task: "email_templates", title: LanguageModule.text("txt_email_template"), name: "email_templates", tablename: "email_templates", typeid: -226, input_form: -226, output_form: -1226},
        {task: "onboarding", title: LanguageModule.text("txt_email_template"), name: "onboarding", tablename: "onboarding", typeid: -227, input_form: -227, output_form: -1227},
        {task: "geographical_positions", title: LanguageModule.text("txt_geographical_position"), name: "geographical_positions", tablename: "geopos", typeid: -229, input_form: -229, output_form: -1229},
        {task: "offboarding_types", title: LanguageModule.text("txt_offboarding_type"), name: "offboarding_types", tablename: "offboarding_types", typeid: -236, input_form: -236, output_form: -1236},
        {task: "offboarding_reasons", title: LanguageModule.text("txt_offboarding_reason"), name: "offboarding_reasons", tablename: "offboarding_reasons", typeid: -237, input_form: -237, output_form: -1237},
        {task: "lesson_categories", title: LanguageModule.text("txt_lesson_category"), name: "lesson_categories", tablename: "lesson_categories", typeid: -264, input_form: -264, output_form: -1264},
        {task: "approval_resignation", title: LanguageModule.text("txt_leave_approval"), name: "approval_resignation", tablename: "approval_resignation", typeid: -289, input_form: -289, output_form: -1289},
        {task: "leave_assessment", title: LanguageModule.text("txt_leave_review"), name: "leave_assessment", tablename: "leave_assessment", typeid: -290, input_form: -290, output_form: -1290},
        {task: "sample_employment_contract", title: LanguageModule.text("txt_sample_employment_contract"), name: "sample_employment_contract", tablename: "", typeid: -300, input_form: -300, output_form: -1300},
        {task: "payslip", title: LanguageModule.text("txt_payslip"), name: "payslip", tablename: "", typeid: -321, input_form: -321, output_form: -1321},
        {task: "product_groups", title: LanguageModule.text("txt_product_groups"), name: "product_groups", tablename: "product_groups", typeid: -311, input_form: -311, output_form: -1311},
        {task: "product_list", title: LanguageModule.text("txt_product_list"), name: "product_list", tablename: "products", typeid: -313, input_form: -313, output_form: -1313},
        {task: "piece_wage_table_field", title: LanguageModule.text("txt_piece_wage_table_field"), name: "piece_wage_table_field", tablename: "piece_wage_table", typeid: -315, input_form: -315, output_form: -1315},
        {task: "piece_wage_list", title: LanguageModule.text("txt_piece_wage_list"), name: "piece_wage_list", tablename: "piece_wage", typeid: -317, input_form: -317, output_form: -1317},
        {task: "pay_percentage", title: LanguageModule.text("txt_pay_percentage"), name: "pay_percentage", tablename: "pay_percentage", typeid: -323, input_form: -323, output_form: -1323},
        {task: "emulation_and_reward", title: LanguageModule.text("txt_emulation_and_reward"), name: "emulation_and_reward", tablename: "emulation_reward", typeid: -326, input_form: -326, output_form: -1326},
        {task: "discipline", title: LanguageModule.text("txt_discipline"), name: "discipline", tablename: "discipline", typeid: -327, input_form: -327, output_form: -1327},
        {task: "employee_profile", title: LanguageModule.text("txt_employee_profile"), name: "employee_profile", tablename: "employee_profile", typeid: -333, input_form: -333, output_form: -1333},
        {task: "position_groups", title: LanguageModule.text("txt_product_groups"), name: "position_groups", tablename: "position_groups", typeid: -339, input_form: -339, output_form: -1339},
    ];
    content.forEach(function(elt){
        elt.mobile_input_form = "m_" + elt.input_form;
        elt.mobile_output_form = "m_" + elt.output_form;
    });
    return content;
};

contentModule.configVariableDefault = function(){
    var systemVariable = contentModule.getSystemVariable();
    var dict = {};
    systemVariable.forEach(function(elt){
        dict[elt.task] = elt;
    });
    return dict;
};

contentModule.configVariable2 = function(form_configList){
    var systemVariable = contentModule.getSystemVariable();
    var dict = {};
    if (form_configList.length == 0){
        systemVariable.forEach(function(elt){
            dict[elt.task] = elt;
            if (hr.isMobile){
                dict[elt.task].input_form = dict[elt.task].mobile_input_form
                dict[elt.task].output_form = dict[elt.task].mobile_output_form
            }
        });
    }
    else {
        var form_config = EncodingClass.string.toVariable(form_configList[0].content);
        systemVariable.forEach(function(elt){
            dict[elt.task] = elt;
            if (form_config[elt.task]){
                dict[elt.task].typeid = form_config[elt.task].typeid;
                if (hr.isMobile) {
                    if (form_config[elt.task].mobile_input_form != 0) dict[elt.task].input_form = form_config[elt.task].mobile_input_form;
                    if (form_config[elt.task].mobile_output_form != 0) dict[elt.task].output_form = form_config[elt.task].mobile_output_form;
                }
                else {
                    if (form_config[elt.task].input_form != 0) dict[elt.task].input_form = form_config[elt.task].input_form;
                    if (form_config[elt.task].output_form != 0) dict[elt.task].output_form = form_config[elt.task].output_form;
                }
            }
        });
    }
    return dict;
};

contentModule.configVariable = function(host){
    return contentModule.configVariable2(host.database.form_config.items);
};

contentModule.viewInputForm = function(host, formid, valueContent){
    var AssemblerInstance = absol.form.AssemblerInstance;
    var $ = absol.$;
    var _ = absol._;
    var JSZip = absol.JSZip;
    var makeFmFragmentClass = absol.form.makeFmFragmentClass;
    var mSignUpFrag = AssemblerInstance.buildFragment({class: formid.toString()});
    // if (!mSignUpFrag.domElt.hasClass("as-relative-layout")){
    //     mSignUpFrag.domElt.addStyle({
    //         width: '100%',
    //         height:'100%',
    //         display: 'block'
    //     });
    // }
    if (valueContent){
        mSignUpFrag.props = valueContent;
    }
    return mSignUpFrag;
};
contentModule.makeTypelistsIndex = function(host){
    var typelists;
    if (host && host.database && host.database.typelists) typelists = host.database.typelists;
    else typelists = data_module.typelists;
    var typeDic = contentModule.makeDictionaryIndex(typelists.items);
    for (var i = 0; i < typelists.items.length; i++){
        typelists.items[i].extendsList = [];
    }
    var k;
    for (var i = 0; i < typelists.items.length; i++){
        if (typelists.items[i].type != "extends_enum" && typelists.items[i].type != "extends_structure" && typelists.items[i].type != "extends_enum_multi") continue;
        k = typeDic[typelists.items[i].content.typeof];
        if (k !== undefined) typelists.items[k].extendsList.push(typelists.items[i].id);
    }
};

contentModule.getListTypeExtends = function(host, list, type){
    var index = host.database.typelists.getIndex(type);
    list.push({
        value: host.database.typelists.items[index].id,
        text: host.database.typelists.items[index].name
    });
    for (var i = 0; i < host.database.typelists.items[index].extendsList.length; i++){
        contentModule.getListTypeExtends(host, list, host.database.typelists.items[index].extendsList[i]);
    }
};

contentModule.getDetailsExtendsConcat = function(list, list2){
    list2 = EncodingClass.string.duplicate(list2);
    var dic2 = {};
    list2.forEach(function(item, index){
        dic2[item.localid] = index;
    });
    var strs;
    for (var i = list.length - 1; i >= 0; i--){
        if (dic2[list[i].localid] === undefined){
            if (list[i].extend !== undefined){
                if (!list[i].extend){
                    list.splice(i , 1);
                }
                else {
                    strs = list[i].localid.split("_");
                    if (strs.length > 1 && isNaN(parseFloat(strs[1]))){
                        list.splice(i , 1);
                    }
                }
            }
        }
    }
    var dic = {};
    list.forEach(function(item, index){
        dic[item.localid] = item;
    });
    for (var i = list2.length - 1; i >= 0; i--){
        if (dic[list2[i].localid]){
            dic[list2[i].localid].noEditKey = true;
            dic[list2[i].localid].key = list2[i].key;
        }
        else {
            list2[i].oldType = list2[i].type;
            list2[i].noEditKey = true;
            list.unshift(list2[i]);
        }
    }
};

contentModule.getDetailsExtends = function(host, list, type) {
    var typelists;
    if (host && host.database && host.database.typelists) typelists = host.database.typelists;
    else typelists = data_module.typelists;
    var index = typelists.getIndex(type);
    type = typelists.items[index].type;
    var content = typelists.items[index].content;
    switch (type) {
        case "enum":
        case "enum_multi":
        case "structure":
            contentModule.getDetailsExtendsConcat(list, content.details);
            break;
        case "extends_enum":
        case "extends_structure":
        case "extends_enum_multi":
            contentModule.getDetailsExtendsConcat(list, content.details);
            contentModule.getDetailsExtends(host, list, content.typeof);
            break;
        default:
            if (contentModule.dataTypeOfExtends.indexOf(typelists.items[index].type2) >= 0){
                contentModule.getDetailsExtendsConcat(list, content.details);
            }
            break;
    }
};

contentModule.getCitiesListByID = function(host, nationid){
    var nIndex = host.database.nations.getIndex(nationid);
    var list = [
        {value: 0, text: LanguageModule.text("txt_select_value")}
    ];
    if (nIndex < 0) return list;
    var ni;
    for (var i = 0; i < host.database.nations.items[nIndex].cityIndexList.length; i++){
        ni = host.database.nations.items[nIndex].cityIndexList[i];
        list.push({
            value: host.database.cities.items[ni].id,
            text: host.database.cities.items[ni].name
        });
    }
    return list;
};

contentModule.getIncludedid = function(host, typeid){
    var st = "";
    var typeIndex = data_module.typelists.getIndex(typeid);
    if (typeIndex < 0) return st;
    if (data_module.typelists.items[typeIndex].type == "extends_enum_multi" || data_module.typelists.items[typeIndex].type == "extends_enum" || data_module.typelists.items[typeIndex].type == "extends_structure"){
        st += contentModule.getIncludedid(host, data_module.typelists.items[typeIndex].content.typeof);
    }
    st += "_" + typeid;
    return st;
};

contentModule.makeHolidaysData = function(host){
    for (var i = 0; i < host.database.holidays.items.length; i++){
        host.database.holidays.items[i].shifts = [];
    }
    var holidaysDic = contentModule.makeDictionaryIndex(host.database.holidays.items);
    var k;
    for (var i = 0; i < host.database.shift_holidays.items.length; i++){
        k = holidaysDic[host.database.shift_holidays.items[i].holidayid];
        if (k !== undefined) host.database.holidays.items[k].shifts.push(host.database.shift_holidays.items[i].shiftid);
    }
};

contentModule.makeShiftData = function(item){
    item.extrainfo = {};
    if (item.content_general == "") item.content_general = {};
    else item.content_general = EncodingClass.string.toVariable(item.content_general);
    for (var j = 0; j < contentModule.getShiftContentGeneralField.length; j++){
        if (contentModule.getShiftContentGeneralField[j] == "extrainfo"){
            for (var x in item.content_general.extrainfo){
                item.extrainfo[x] = item.content_general.extrainfo[x];
            }
        }
        else {
            item[contentModule.getShiftContentGeneralField[j]] = item.content_general[contentModule.getShiftContentGeneralField[j]];
        }
    }
    if (item.content_worktime == "") item.content_worktime = {};
    else item.content_worktime = EncodingClass.string.toVariable(item.content_worktime);
    for (var xx in item.content_worktime){
        if (xx == "extrainfo"){
            for (var x in item.content_worktime.extrainfo){
                item.extrainfo[x] = item.content_worktime.extrainfo[x];
            }
        }
        else {
            item[xx] = item.content_worktime[xx];
        }
    }
    if (item.content_timekeeping == "") item.content_timekeeping = {};
    else item.content_timekeeping = EncodingClass.string.toVariable(item.content_timekeeping);
    for (var xx in item.content_timekeeping){
        if (xx == "extrainfo"){
            for (var x in item.content_timekeeping.extrainfo){
                item.extrainfo[x] = item.content_timekeeping.extrainfo[x];
            }
        }
        else {
            item[xx] = item.content_timekeeping[xx];
        }
    }
};

contentModule.makeShiftsData = function(host){
    for (var i = 0; i < host.database.shifts.items.length; i++){
        contentModule.makeShiftData(host.database.shifts.items[i]);
    }
};

contentModule.getShiftGeneralMainData = function(){
    return {
        type_shift_name: "name",
        type_shift_description: "description",
        type_shift_symbol: "symbol",
        type_shift_color: "color",
        type_shift_available: "available"
    };
};

contentModule.getShiftWorktimeMainData = function(){
    return {
        type_shift_working_time: "working_time",
        type_shift_break_time: "break_time",
        type_shift_night_work_time: "night_work_time",
        type_shift_late_checkin_minutes: "late_checkin_minutes",
        type_shift_early_checkout_minutes: "early_checkout_minutes",
        type_shift_monday: "monday",
        type_shift_tuesday: "tuesday",
        type_shift_wednesday: "wednesday",
        type_shift_thursday: "thursday",
        type_shift_friday: "friday",
        type_shift_saturday: "saturday",
        type_shift_sunday: "sunday"
    };
};

contentModule.getShiftTimekeepingMainData = function(){
    return {
        type_shift_number_of_standard_working_hours: "number_of_standard_working_hours",
        type_shift_number_of_work_days: "number_of_work_days",
        type_shift_workdays_accumulation_method: "workdays_accumulation_method",
        type_shift_block_duration: "block_duration",
        type_shift_block_rounding_method: "block_rounding_method",
        type_shift_minimum_working_minutes_required_for_salary_calculation: "minimum_working_minutes_required_for_salary_calculation",
        type_shift_round_to_one_days_wage: "round_to_one_days_wage"
        // ,
        // type_shift_checkin_first_half_shift: "checkin_first_half_shift",
        // type_shift_time_for_checking_in_first_half_shift: "time_for_checking_in_first_half_shift",
        // type_shift_checkout_first_half_shift: "checkout_first_half_shift",
        // type_shift_time_for_checking_out_first_half_shift: "time_for_checking_out_first_half_shift",
        // type_shift_checkin_second_half_shift: "checkin_second_half_shift",
        // type_shift_time_for_checking_in_second_half_shift: "time_for_checking_in_second_half_shift",
        // type_shift_checkout_second_half_shift: "checkout_second_half_shift",
        // type_shift_time_for_checking_out_second_half_shift: "time_for_checking_out_second_half_shift"
    };
};

contentModule.getShiftContentGeneralField = [
    "color",
    "extrainfo"
];

contentModule.chooseFile = function (params) {
    return new Promise(function (resolve, reject) {
        var DEFAULT_PATH_ID = -1;
        var host = {
            database: {},

        };//host chỉ có 1, không cần return function
        function openDialog() {
            // init some module
            var iconSrc = window.location.origin + "/vivid_exticons/";


            /***** VIEW ****************************/
            var $ = absol.$;
            var buildDom = absol._;
            var _ = absol._;

            var okBtn = theme.noneIconButton({
                onclick: function () {
                    finishWithResult();

                },
                text: LanguageModule.text("txt_ok")
            });

            var cancelBtn = theme.noneIconButton({
                onclick: function () {
                    ModalElement.close();
                    resolve(null);//cancel
                },
                text: LanguageModule.text("txt_cancel")
            });


            var view = buildDom({
                class: 'kv-choose-file-dialog',
                child: [
                    {
                        class: 'kv-choose-file-dialog-body',
                        child: [
                            {
                                class: 'kv-choose-file-dialog-tree-ctn'
                            },
                            {
                                class: 'kv-choose-file-dialog-files-ctn',
                                child: [
                                    {
                                        class: 'kv-choose-file-dialog-offline-files-ctn',
                                        child: {
                                            tag: 'filelistinput',
                                            class: 'kv-choose-file-dialog-offline-files-input',
                                            props: {
                                                multiple: true,
                                            }
                                        }
                                    },
                                    {
                                        class: 'kv-choose-file-dialog-online-files-ctn',
                                        child: {
                                            tag: 'filelistinput',
                                            class: 'kv-choose-file-dialog-online-files-input',
                                            props: {
                                                readOnly: true,
                                                showCheck: true
                                            }
                                        }
                                    }
                                ]
                            }
                        ]
                    },
                    {
                        class: 'kv-choose-file-dialog-footer',

                        child: [okBtn, cancelBtn]
                    }
                ]
            });

            var pathTreeCtn = $('.kv-choose-file-dialog-tree-ctn', view);

            var files_ctn = $('.kv-choose-file-dialog-files-ctn', view);
            var offlineFilesCtn = $('.kv-choose-file-dialog-offline-files-ctn', view);
            var onlineFilesCtn = $('.kv-choose-file-dialog-online-files-ctn', view);
            var offlineFiles = $('.kv-choose-file-dialog-offline-files-input', view);
            var onlineFiles = $('.kv-choose-file-dialog-online-files-input', view);
            var activatedNode = null;
            okBtn.disabled = true;


            /********************** DRAW PATH TREE ********************************************************************/

            function createTree(id) {
                var index = host.database.paths.getIndex(id);
                var childs = [], ni;
                for (var i = 0; i < host.database.paths.items[index].childIndexList.length; i++) {
                    ni = host.database.paths.items[index].childIndexList[i];
                    childs.push(createTree(host.database.paths.items[ni].id));
                }
                var props = {
                    name: host.database.paths.items[index].name,
                    icon: {
                        tag: 'img',
                        props: {
                            src: iconSrc + 'folder.svg'
                        }
                    }
                };
                if (childs.length > 0) props.status = "close";
                return _({
                    tag: "exptree",
                    attr: {
                        'data-path-id': id + ''
                    },
                    props: props,
                    on: {
                        press: function () {
                            redrawOnlineFiles(id);
                        }
                    },
                    child: childs
                });
            }

            function redrawPathList() {
                pathTreeCtn.clearChild();
                var tree, item;
                for (var i = 0; i < host.database.paths.items.length; i++) {
                    item = host.database.paths.items[i];
                    if (item.parentid != 0) continue;
                    tree = createTree(item.id);
                    pathTreeCtn.addChild(tree);
                }
            }


            /********************** DRAW FILES ************************************************************************/

            function redrawOnlineFiles(id) {
                if (activatedNode) activatedNode.active = false;
                activatedNode = $('[data-path-id="' + id + '"]', pathTreeCtn);
                if (activatedNode) activatedNode.active = true;
                host.pathid = id;
                contentModule.makeFilesIndex(host);
                var index = host.database.paths.getIndex(id);

                onlineFiles.files = [];
                var imageSuffixes = ["jpg", "png", "gif", "jpeg", 'tif', 'bmp', 'webm'];

                var files = host.database.paths.items[index].filesIndexList.map(function (ni) {
                    var fileInfo = host.database.files.items[ni];
                    var fileName = fileInfo.name;
                    var fileid = fileInfo.id;
                    var fileType = absol.$.fileInfoOf(fileName).type;
                    if (imageSuffixes.indexOf(fileType) >= 0) {
                        return {
                            name: fileName,
                            fileid: fileid
                        }
                    }
                    else {
                        return {
                            name: fileName,
                            fileid: fileid
                        }
                    }

                });
                onlineFiles.files = files;
            }

            /********************** DATA ******************************************************************************/

            function getSelectedFileIdList() {
                return onlineFiles.getChildren().filter(function (it) {
                    return it.checked;
                }).map(function (it) {
                    return it.value.fileid;
                });
            }

            function getPendingUploadFileList() {
                return offlineFiles.getChildren().map(function (it) {
                    return it.value;
                });
            }

            function uploadPendingFiles() {
                var files = getPendingUploadFileList();
                if (files.length === 0) return Promise.resolve([]);
                return  hr.paths.addFileSubmit(host, files).then(function (st) {
                    offlineFiles.files = [];
                    return st ||[];
                }).then(function (st){
                    onlineFiles.defaultChecked = true;
                    st.slice().reverse().forEach(function (item){
                        item.url = window.domainFilesNew + item.id + "_"+ item.name + ".upload";
                        item.fileid = item.id;
                        onlineFiles.add(item, 0);
                    });
                    onlineFiles.defaultChecked = false;
                    onCheckListChange();
                    return st.map(function (item){
                        return item.id;
                    });
                });
            }

            /********************** EVENTS ************************************************************************/

            function onCheckListChange() {
                var fileIdList = getSelectedFileIdList();
                var pendingFileList = getPendingUploadFileList();
                okBtn.disabled = fileIdList.length + pendingFileList.length === 0;
            }

            onlineFiles.on('check', onCheckListChange);
            offlineFiles.on('change', uploadPendingFiles);

            function finishWithResult() {
                var fileIdList = getSelectedFileIdList();
                var fileInfoList =  fileIdList.map(function (fileid){
                    var index = host.database.files.getIndex(fileid);
                    var item = host.database.files.items[index];
                    item.url = window.domainFilesNew + item.id + "_" + item.name + ".upload";
                    return item;
                });
                ModalElement.close();
                resolve(fileInfoList);

            }

            /********************** MAIN ******************************************************************************/


            redrawPathList();
            redrawOnlineFiles(DEFAULT_PATH_ID);

            ModalElement.showWindow({
                title: "Chọn file",
                bodycontent: view
            });
        }


        ModalElement.show_loading();
        FormClass.api_call({
            url: "database_load.php",
            params: [
                { name: "task", value: "paths_load_init" }
            ],
            func: function (success, message) {
                if (success) {
                    ModalElement.close(-1);
                    if (message.substr(0, 2) == "ok") {
                        var content = EncodingClass.string.toVariable(message.substr(2));
                        contentModule.makeDatabaseContent(host, content);
                        contentModule.makePathIndex(host);
                        openDialog();
                    }
                    else {
                        ModalElement.alert({ message: message });
                    }
                }
                else {
                    ModalElement.alert({ message: message });
                }
            }
        });
    });
};

contentModule.getWorktime_checkinMainData = function(){
    return {
        type_worktime_checkins_employeeid: "employeeid",
        type_worktime_checkins_ctime: "ctime",
        type_worktime_checkins_machineid: "machineid",
        type_worktime_checkins_method: "method",
        type_worktime_checkins_gps: "checkingps",
        type_worktime_checkins_note: "comment",
        type_worktime_checkins_available: "available"
    }
};

contentModule.getTimekeepingCodeMainData = function(){
    return {
        checkin_employee_ident_employeeid: "employeeid",
        checkin_employee_ident_machineid: "machineid",
        checkin_employee_ident_code: "code",
        checkin_employee_ident_description: "description"
    }
};

contentModule.getWorktime_machineMainData = function(){
    return {
        type_worktime_machines_name: "name",
        type_worktime_machines_code: "code",
        type_worktime_machines_geoid: "geoid",
        type_worktime_machines_available: "available"
    }
};

contentModule.getWorktime_machinesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.worktime_machines.items.length; i++){
        list.push({
            value: host.database.worktime_machines.items[i].id,
            text: host.database.worktime_machines.items[i].name
        });
    }
    return list;
};

contentModule.getMemberOfTemplateGroupSelectMenu = function(host){
    var list = [
        {
            value: 0,
            text: LanguageModule.text("txt_select_value")
        },
        {
            value: -1,
            typeid: 0,
            text: LanguageModule.text("txt_onboarding")
        },
        {
            value: -3,
            typeid: 0,
            text: LanguageModule.text("txt_offboarding")
        },
        {
            value: -4,
            typeid: 0,
            text: LanguageModule.text("txt_examination")
        },
        {
            value: -2,
            typeid: 0,
            text: "Khác..."
        }
    ];
    for (var i = 0; i < host.database.template_groups.items.length; i++){
        list.push({
            value: host.database.template_groups.items[i].id,
            typeid: host.database.template_groups.items[i].typeid,
            text: host.database.template_groups.items[i].name
        });
    }
    return list;
};

contentModule.getMemberOfWelcomeTemplateSelectMenu = function(host){
    // var list = [{
    //     value: 0,
    //     text: LanguageModule.text("txt_select_value")
    // }];
    var list = [];
    for (var i = 0; i < host.database.welcome_templates.items.length; i++){
        list.push({
            value: host.database.welcome_templates.items[i].id,
            text: host.database.welcome_templates.items[i].name
        });
    }
    return list;
};

contentModule.getWorktime_logMainData = function(){
    return {
        type_worktime_logs_employeeid: "employeeid",
        type_worktime_logs_shift: "shiftid",
        type_worktime_logs_intime: "intime",
        type_worktime_logs_outtime: "outtime",
        type_worktime_logs_comment: "comment",
        type_worktime_logs_available: "available"
    }
};

contentModule.getLanguageCodeList = function(type){
    var res = [];
    if (!type || type == "display") res.push({
        value: "javascript",
        text: LanguageModule.text("txt_javascript")
    });
    res.push(
        {
            value: "simple_code",
            text: LanguageModule.text("txt_simple_code")
        }
    );
    return res;
};

contentModule.getLanguageCodeName = function(language){
    var list = contentModule.getLanguageCodeList();
    for (var i = 0; i < list.length; i++){
        if (language == list[i].value) return list[i].text;
    }
    return "-";
};

contentModule.makeDataFunctions = function(content){
    content.params = EncodingClass.string.toVariable(content.params);
    switch (content.language) {
        case "simple_code":
            content.content = EncodingClass.string.toVariable(content.content);
            break;
        default:

    }
};

contentModule.getFunctionTypeList = function(){
    return [
        {
            value: "display",
            text: LanguageModule.text("txt_display")
        },
        {
            value: "handle",
            text: LanguageModule.text("txt_handle")
        }
    ];
};

contentModule.loadListPrimaryTypeEnum = function(type, tag){
    return new Promise(function(resolve, reject){
        function makeData(st){
            var x = {
                database: {}
            };
            contentModule.makeDatabaseContent(x, st);
            var list;
            switch (type) {
                case "user":
                    list = contentModule.getUsersListSelectMenu(x);
                    break
                case "userlist":
                    list = contentModule.getUsersListSelectBox(x);
                    break;
                case "member_of_position":
                    contentModule.makeOrgsIndex(x);
                    contentModule.makePositionsIndex(x);
                    list = contentModule.getMemberOfPositionSelectMenu(x);
                    break;
                case "member_of_template_groups":
                    list = contentModule.getMemberOfTemplateGroupSelectMenu(x);
                    break;
                case "member_of_product_groups":
                    list = contentModule.getProductGroupsSelectMenu(x);
                    break;
                case "member_of_position_groups":
                    list = contentModule.getPositionGroupsSelectMenu(x);
                    break;
                case "member_of_product_list":
                    list = contentModule.getProductListSelectMenu(x);
                    break;
                case "member_of_piece_wage_policies":
                    list = contentModule.getPieceWagePoliciesSelectMenu(x);
                    break;
                case "member_of_attendance_clock_policies":
                    list = contentModule.getAttendanceClockPoliciesSelectMenu(x);
                    break;
                case "member_of_welcome_templates":
                    list = contentModule.getMemberOfWelcomeTemplateSelectMenu(x);
                    break;
                case "member_of_employee":
                    contentModule.makeOrgsIndex(x);
                    contentModule.makeEmployeeData(x);
                    contentModule.makeEmployeesIndex(x);
                    list = contentModule.getMemberOfEmployeeSelectMenu(x);
                    break;
                case "employee_list":
                    contentModule.makeOrgsIndex(x);
                    contentModule.makeEmployeeData(x);
                    contentModule.makeEmployeesIndex(x);
                    list = contentModule.getMemberOfEmployeeSelectMenu(x);
                    break;
                case "position_list":
                    contentModule.makeOrgsIndex(x);
                    contentModule.makePositionsIndex(x);
                    list = contentModule.getMemberOfPositionSelectMenu(x);
                    break;
                case "select_department_employee":
                    contentModule.makeOrgsIndex(x);
                    contentModule.makeEmployeeData(x);
                    contentModule.makeEmployeesIndex(x);
                    list = contentModule.getOrgsAndEmployeesListSelectTreeMenu(x);
                    break;
                case "member_of_worktime_machines":
                    list = contentModule.getWorktime_machinesListSelectMenu(x);
                    break;
                case "member_of_department":
                    contentModule.makeOrgsIndex(x);
                    list = contentModule.getOrgsListSelectTreeMenu(x);
                    break;
                case "member_of_assets":
                    list = contentModule.getAssetsListSelectMenu(x);
                    break;
                case "member_of_position_2":
                    list = contentModule.getPositionsListSelectMenu(x);
                    break;
                case "member_of_instruments_and_tools":
                    list = contentModule.getInstrumentAndToolsListSelectMenu(x);
                    break;
                case "member_of_warehouses":
                    list = contentModule.getWarehousesListSelectMenu(x);
                    break;
                case "member_of_assets_instruments_and_tools":
                    list = contentModule.getAssetsInstrumentAndToolsListSelectMenu(x);
                    break;
                case "member_of_allowance_policy_groups":
                    list = contentModule.getAllowancePolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_insurance_policy_groups":
                    list = contentModule.getInsurancePolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_bonus_policy_groups":
                    list = contentModule.getBonusPolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_piece_wage_policy_groups":
                    list = contentModule.getPieceWagePolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_attendance_clock_policy_groups":
                    list = contentModule.getAttendanceClockPolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_standard_workday_policy_groups":
                    list = contentModule.getStandardWorkdayPolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_work_flow_groups":
                    list = contentModule.getWorkFlowGroupsListSelectMenu(x);
                    break;
                case "member_of_work_flows":
                    list = contentModule.getWorkFlowsListSelectMenu(x);
                    break;
                case "member_of_objects":
                    list = contentModule.getObjectsListSelectMenu(x);
                    break;
                case "member_of_payroll_cycle":
                    list = contentModule.getPayrollCycleListSelectMenu(x);
                    break;
                case "member_of_lesson_categories":
                    list = contentModule.getLessonCategoriesListSelectMenu(x);
                    break;
                case "member_of_task":
                    list = contentModule.getTaskListSelectMenu(x);
                    break;
                case "member_of_meeting":
                    list = contentModule.getMeetingListSelectMenu(x);
                    break;
                case "member_of_typelists":
                    list = contentModule.getTypeListsListSelectMenu(x);
                    break;
                case "member_of_input_forms":
                    list = contentModule.getInputFormsListSelectMenu();
                    break;
                case "member_of_output_forms":
                    list = contentModule.getOutputFormsListSelectMenu();
                    break;
                case "member_of_mobile_input_forms":
                    list = contentModule.getMobileInputFormsListSelectMenu();
                    break;
                case "member_of_mobile_output_forms":
                    list = contentModule.getMobileOutputFormsListSelectMenu();
                    break;
                case "member_of_partner_class":
                    list = contentModule.getPartnerClassListSelectMenu(x);
                    break;
                case "member_of_partner":
                    list = contentModule.getPartnerListSelectMenu(x);
                    break;
                case "member_of_contact":
                    list = contentModule.getContactListSelectMenu(x);
                    break;
                case "member_of_other_liability_policy_groups":
                    list = contentModule.getOtherLiabilityPolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_other_policy_groups":
                    list = contentModule.getOtherPolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_policies":
                    list = contentModule.getPoliciesSelectMenu(x);
                    break;
                case "member_of_salary_policy_groups":
                    list = contentModule.getSalaryPolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_trade_union_policy_groups":
                    list = contentModule.getTradeUnionPolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_overtime_policy_groups":
                    list = contentModule.getOvertimePolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_offboarding_types":
                    list = contentModule.getOffboardingTypeListSelectMenu(x);
                    break;
                case "member_of_offboarding_reasons":
                    list = contentModule.getOffboardingReasonListSelectMenu(x);
                    break;
                case "multiselect_offboarding_reasons":
                    list = contentModule.getOffboardingReasonListSelectMenu(x);
                    list.splice(0, 1);
                    break;
                case "member_of_punishment_policy_groups":
                    list = contentModule.getPunishmentPolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_asset_category":
                    list = contentModule.getAssetCategoryListSelectMenu(x);
                    break;
                case "member_of_instruments_and_tools_category":
                    list = contentModule.getAssetsInstrumentAndToolsCategoryListSelectMenu(x);
                    break;
                case "member_of_projects":
                    list = contentModule.getProjectsListSelectMenu(x);
                    break;
                case "member_of_tax_policy_groups":
                    list = contentModule.getTaxPolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_advance_payment_policy_groups":
                    list = contentModule.getAdvancePaymentPolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_late_early_checkin_policy_groups":
                    list = contentModule.getLateEarlyCheckinPolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_training_program_groups":
                    list = contentModule.getTrainingProgramGroupsListSelectMenu(x);
                    break;
                case "member_of_leave_policy_groups":
                    list = contentModule.getLeavePolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_benefit_policy_groups":
                    list = contentModule.getBenefitPolicyGroupsListSelectMenu(x);
                    break;
                case "member_of_shifts":
                    list = contentModule.getShiftsListSelectMenu(x);
                    break;
                case "member_of_timesheets":
                    list = contentModule.getTimesheetsListSelectMenu(x);
                    break;
                case "member_of_pay_percentage":
                    list = contentModule.getPayPercentageListSelectMenu(x);
                    break;
                case "members_of_shifts":
                    list = contentModule.getShiftsListSelectBox(x);
                    break;
                case "members_of_partner_class":
                    list = contentModule.getPartnerClassListSelectBox(x);
                    break;
                case "members_of_locations":
                    list = contentModule.getGeoposListSelectBox(x);
                    break;
                case "member_of_insurance_policies":
                    list = contentModule.getInsurancePoliciesListSelectMenu(x);
                    break;
                case "member_of_tax_policies":
                    list = contentModule.getTaxPoliciesListSelectMenu(x);
                    break;
                case "member_of_leave_policies":
                    list = contentModule.getLeavePoliciesListSelectMenu(x);
                    break;
                case "member_of_trade_union_policies":
                    list = contentModule.getTradeUnionPoliciesListSelectMenu(x);
                    break;
                case "member_of_bonus_policies":
                    list = contentModule.getBonusPoliciesListSelectMenu(x);
                    break;
                case "member_of_standard_workday_policies":
                    list = contentModule.getStandardWorkdayPoliciesListSelectMenu(x);
                    break;
                case "member_of_overtime_policies":
                    list = contentModule.getOvertimePoliciesListSelectMenu(x);
                    break;
                case "member_of_punishment_policies":
                    list = contentModule.getPunishmentPoliciesListSelectMenu(x);
                    break;
                case "member_of_benefit_policies":
                    list = contentModule.getBenefitPoliciesListSelectMenu(x);
                    break;
                case "member_of_allowance_policies":
                    list = contentModule.getAllowancePoliciesListSelectMenu(x);
                    break;
                case "member_of_advance_payment_policies":
                    list = contentModule.getAdvancePaymentPoliciesListSelectMenu(x);
                    break;
                case "member_of_late_early_checkin_policies":
                    list = contentModule.getLateEarlyCheckinPoliciesListSelectMenu(x);
                    break;
                case "member_of_salary_policies":
                    list = contentModule.getSalaryPoliciesListSelectMenu(x);
                    break;
                case "member_of_other_liability_policies":
                    list = contentModule.getOtherLiabilityPoliciesListSelectMenu(x);
                    break;
                case "member_of_employment_contract_types":
                    list = contentModule.getEmploymentContractTypesListSelectMenu(x);
                    break;
                case "member_of_nations":
                    list = contentModule.getNationsListSelectMenu(x);
                    break;
                case "member_of_cities":
                    list = contentModule.getCitiesListSelectMenu(x);
                    break;
                case "nation_city":
                    contentModule.makeCitiesIndex(x);
                    list = contentModule.getNationCityDualSelectMenu(x);
                    break;
                case "member_of_ethnics":
                    list = contentModule.getEthnicsListSelectMenu(x);
                    break;
                case "member_of_religions":
                    list = contentModule.getReligionsListSelectMenu(x);
                    break;
                case "geopos":
                    list = contentModule.getGeoposListSelectMenu(x);
                    break;
                case "member_of_document_types":
                    list = contentModule.getDocumentTypesListSelectMenu(x);
                    break;
                case "member_of_document_groups":
                    list = contentModule.getDocumentGroupsListSelectTreeMenu(x);
                    break;
                case "member_of_orgs":
                    list = contentModule.getOrgsListSelectMenu(x);
                    break;
                case "member_of_document_folders":
                    list = contentModule.getDocumentFoldersListSelectTreeMenu(x);
                    break;
                default:
                    list = [];
            }
            resolve(list);
        };
        switch (type) {
            case "user":
            case "userlist":
                data_module.loadUsersList().then(function(content){
                    makeData({
                        users: content
                    });
                });
                break;
            case "member_of_position":
            case "position_list":
                Promise.all([data_module.loadPositionsList(), data_module.loadOrgsList(function(record){
                    return {
                        id: record.id,
                        parentid: record.parentid,
                        code: record.code,
                        name: record.name,
                        firstid: record.firstid,
                        firstparentid: record.firstparentid
                    };
                })]).then(function(content){
                    makeData({
                        positions: content[0],
                        orgs: content[1]
                    });
                });
                break;
            case "member_of_employee":
            case "employee_list":
            case "select_department_employee":
                Promise.all([data_module.loadEmployeesList(function(record){
                    return {
                        id: record.id,
                        firstid: record.firstid,
                        orgid: record.orgid,
                        peopleid: record.peopleid,
                        available: record.available,
                        code: record.code
                    };
                }), data_module.loadPeoplesList(function(record){
                    return {
                        id: record.id,
                        fullname: record.fullname
                    };
                }), data_module.loadOrgsList(function(record){
                    return {
                        id: record.id,
                        parentid: record.parentid,
                        code: record.code,
                        name: record.name,
                        firstid: record.firstid,
                        firstparentid: record.firstparentid
                    };
                })]).then(function(content){
                    makeData({
                        employees: content[0],
                        peoples: content[1],
                        orgs: content[2]
                    });
                });
                break;
            case "member_of_worktime_machines":
                data_module.loadWorktimeMachinesList().then(function(content){
                    makeData({
                        worktime_machines: content
                    });
                });
                break;
            case "member_of_position_2":
                data_module.loadPositions2List().then(function(content){
                    makeData({
                        positions: content
                    });
                });
                break;
            case "member_of_template_groups":
                data_module.loadTemplateGroupList().then(function(content){
                    makeData({
                        template_groups: content
                    });
                });
                break;
            case "member_of_welcome_templates":
                data_module.loadWelcomeTemplatesList().then(function(content){
                    makeData({
                        welcome_templates: content
                    });
                });
                break;
            case "member_of_product_groups":
                data_module.loadProductGroupList().then(function(content){
                    makeData({
                        product_groups: content
                    });
                });
                break;
            case "member_of_product_list":
                Promise.all([data_module.loadProductGroupList(), data_module.loadProductsList()]).then(function(content){
                    makeData({
                        product_groups: content[0],
                        products: content[1]
                    });
                });
                break;
            case "member_of_position_groups":
                data_module.loadPositionGroupList().then(function(content){
                    makeData({
                        position_groups: content
                    });
                });
                break;
            case "member_of_piece_wage_policies":
                Promise.all([data_module.loadPiece_wage_policy_groupsList(), data_module.loadPiece_wage_policiesList()]).then(function(content){
                    makeData({
                        piece_wage_policy_groups: content[0],
                        piece_wage_policies: content[1]
                    });
                });
                break;
            case "member_of_attendance_clock_policies":
                Promise.all([data_module.loadAttendance_clock_policy_groupsList(), data_module.loadAttendance_clock_policiesList()]).then(function(content){
                    makeData({
                        attendance_clock_policy_groups: content[0],
                        attendance_clock_policies: content[1]
                    });
                });
                break;
            case "member_of_assets":
                data_module.loadAssetsList().then(function(content){
                    makeData({
                        assets: content
                    });
                });
                break;
            case "member_of_instruments_and_tools":
                data_module.loadInstruments_and_toolsList().then(function(content){
                    makeData({
                        instruments_and_tools: content
                    });
                });
                break;
            case "member_of_assets_instruments_and_tools":
                Promise.all([data_module.loadAssetsList(), data_module.loadInstruments_and_toolsList()]).then(function(content){
                    makeData({
                        assets: content[0],
                        instruments_and_tools: content[1]
                    });
                })
                break;
            case "member_of_warehouses":
                data_module.loadWarehousesList().then(function(content){
                    makeData({
                        warehouses: content
                    });
                });
                break;
            case "member_of_department":
                data_module.loadOrgsList(function(record){
                    return {
                        id: record.id,
                        parentid: record.parentid,
                        code: record.code,
                        name: record.name,
                        firstid: record.firstid,
                        firstparentid: record.firstparentid
                    };
                }).then(function(content){
                    makeData({
                        orgs: content
                    });
                });
                break;
            case "member_of_allowance_policy_groups":
                data_module.loadAllowance_policy_groupsList().then(function(content){
                    makeData({
                        allowance_policy_groups: content
                    });
                });
                break;
            case "member_of_insurance_policy_groups":
                data_module.loadInsurance_policy_groupsList().then(function(content){
                    makeData({
                        insurance_policy_groups: content
                    });
                });
                break;
            case "member_of_bonus_policy_groups":
                data_module.loadBonus_policy_groupsList().then(function(content){
                    makeData({
                        bonus_policy_groups: content
                    });
                });
                break;
            case "member_of_piece_wage_policy_groups":
                data_module.loadPiece_wage_policy_groupsList().then(function(content){
                    makeData({
                        piece_wage_policy_groups: content
                    });
                });
                break;
            case "member_of_attendance_clock_policy_groups":
                data_module.loadAttendance_clock_policy_groupsList().then(function(content){
                    makeData({
                        attendance_clock_policy_groups: content
                    });
                });
                break;
            case "member_of_standard_workday_policy_groups":
                data_module.loadStandard_workday_policy_groupsList().then(function(content){
                    makeData({
                        standard_workday_policy_groups: content
                    });
                });
                break;
            case "member_of_work_flow_groups":
                data_module.loadWork_flow_groupsList().then(function(content){
                    makeData({
                        work_flow_groups: content
                    });
                });
                break;
            case "member_of_work_flows":
                data_module.loadWork_flowsList().then(function(content){
                    makeData({
                        work_flows: content
                    });
                });
                break;
            case "member_of_objects":
                data_module.loadObjectsList(tag).then(function(content){
                    makeData({
                        objects: content
                    });
                }, function(err){
                    console.log(tag, "load err", err);
                });
                break;
            case "member_of_payroll_cycle":
                data_module.loadPayrollCycleList().then(function(content){
                    makeData({
                        payroll_cycle: content
                    });
                });
                break;
            case "member_of_lesson_categories":
                data_module.loadLesson_categoriesList().then(function(content){
                    makeData({
                        objects: content
                    });
                });
                break;
            case "member_of_task":
                data_module.loadTaskListLazySimpleData().then(function(content){
                    makeData({
                        task: content
                    });
                });
                break;
            case "member_of_meeting":
                data_module.loadMeetingListLazySimpleData().then(function(content){
                    makeData({
                        meeting: content
                    });
                });
                break;
            case "member_of_typelists":
                data_module.loadType_listsList().then(function(content){
                    makeData({
                        typelists: content
                    });
                });
                break;
            case "member_of_input_forms":
                makeData({});
                break;
            case "member_of_output_forms":
                makeData({});
                break;
            case "member_of_mobile_input_forms":
                makeData({});
                break;
            case "member_of_mobile_output_forms":
                makeData({});
                break;
            case "member_of_partner_class":
                data_module.loadPartner_classList(function(record){
                    return {
                        id: record.id,
                        name: record.name,
                        available: record.available
                    };
                }).then(function(content){
                    makeData({
                        partner_class: content
                    });
                });
                break;
            case "member_of_partner":
                data_module.loadPartnerList().then(function(content){
                    makeData({
                        partner: content
                    });
                });
                break;
            case "member_of_contact":
                data_module.loadContactList().then(function(content){
                    makeData({
                        contact: content
                    });
                });
                break;
            case "member_of_other_liability_policy_groups":
                data_module.loadOther_liability_policy_groupsList().then(function(content){
                    makeData({
                        other_liability_policy_groups: content
                    });
                });
                break;
            case "member_of_other_policy_groups":
                data_module.loadOther_policy_groupsList().then(function(content){
                    makeData({
                        other_policy_groups: content
                    });
                });
                break;
            case "member_of_policies":
                data_module.loadPoliciesData().then(function(content){
                    makeData(content);
                });
                break;
            case "member_of_salary_policy_groups":
                data_module.loadSalary_policy_groupsList().then(function(content){
                    makeData({
                        salary_policy_groups: content
                    });
                });
                break;
            case "member_of_trade_union_policy_groups":
                data_module.loadTrade_union_policy_groupsList().then(function(content){
                    makeData({
                        trade_union_policy_groups: content
                    });
                });
                break;
            case "member_of_overtime_policy_groups":
                data_module.loadOvertime_policy_groupsList().then(function(content){
                    makeData({
                        overtime_policy_groups: content
                    });
                });
                break;
            case "member_of_offboarding_types":
                data_module.loadOffboardingTypeList().then(function(content){
                    makeData({
                        offboarding_types: content
                    });
                });
                break;
            case "member_of_offboarding_reasons":
                data_module.loadOffboardingReasonList().then(function(content){
                    makeData({
                        offboarding_reasons: content
                    });
                });
                break;
            case "multiselect_offboarding_reasons":
                data_module.loadOffboardingReasonList().then(function(content){
                    makeData({
                        offboarding_reasons: content
                    });
                });
                break;
            case "member_of_punishment_policy_groups":
                data_module.loadPunishment_policy_groupsList().then(function(content){
                    makeData({
                        punishment_policy_groups: content
                    });
                });
                break;
            case "member_of_asset_category":
                data_module.loadAssetCategoryList().then(function(content){
                    makeData({
                        asset_category: content
                    });
                });
                break;
            case "member_of_instruments_and_tools_category":
                data_module.loadInstrumentsAndToolsCategoryList().then(function(content){
                    makeData({
                        instruments_and_tools_category: content
                    });
                });
                break;
            case "member_of_projects":
                data_module.loadProjectsList().then(function(content){
                    makeData({
                        projects: content
                    });
                });
                break;
            case "member_of_tax_policy_groups":
                data_module.loadTax_policy_groupsList().then(function(content){
                    makeData({
                        tax_policy_groups: content
                    });
                });
                break;
            case "member_of_advance_payment_policy_groups":
                data_module.loadAdvance_payment_policy_groupsList().then(function(content){
                    makeData({
                        advance_payment_policy_groups: content
                    });
                });
                break;
            case "member_of_late_early_checkin_policy_groups":
                data_module.loadLate_early_checkin_policy_groupsList().then(function(content){
                    makeData({
                        late_early_checkin_policy_groups: content
                    });
                });
                break;
            case "member_of_benefit_policy_groups":
                data_module.loadBenefit_policy_groupsList().then(function(content){
                    makeData({
                        benefit_policy_groups: content
                    });
                });
                break;
            case "member_of_training_program_groups":
                data_module.loadTrainingProgram_groupsList().then(function(content){
                    makeData({
                        training_program_groups: content
                    });
                });
                break;
            case "member_of_leave_policy_groups":
                data_module.loadLeave_policy_groupsList().then(function(content){
                    makeData({
                        leave_policy_groups: content
                    });
                });
                break;
            case "member_of_shifts":
                data_module.loadShiftsList().then(function(content){
                    makeData({
                        shifts: content
                    });
                });
                break;
            case "member_of_timesheets":
                data_module.loadTimesheetsList().then(function(content){
                    makeData({
                        timesheet: content
                    });
                });
                break;
            case "member_of_pay_percentage":
                data_module.loadPayPercentageList().then(function(content){
                    makeData({
                        pay_percentage: content
                    });
                });
                break;
            case "members_of_shifts":
                data_module.loadShiftsList().then(function(content){
                    makeData({
                        shifts: content
                    });
                });
                break;
            case "members_of_partner_class":
                data_module.loadPartner_classList(function(record){
                    return {
                        id: record.id,
                        name: record.name,
                        available: record.available
                    };
                }).then(function(content){
                    makeData({
                        partner_class: content
                    });
                });
                break;
            case "members_of_locations":
                data_module.loadGeographiesList().then(function(content){
                    makeData({
                        geopos: content
                    });
                });
                break;
            case "member_of_insurance_policies":
                data_module.loadInsurance_policiesList().then(function(content){
                    makeData({
                        insurance_policies: content
                    });
                });
                break;
            case "member_of_tax_policies":
                data_module.loadTax_policiesList().then(function(content){
                    makeData({
                        tax_policies: content
                    });
                });
                break;
            case "member_of_trade_union_policies":
                data_module.loadTrade_union_policiesList().then(function(content){
                    makeData({
                        trade_union_policies: content
                    });
                });
                break;
            case "member_of_benefit_policies":
                data_module.loadBenefit_policiesList().then(function(content){
                    makeData({
                        benefit_policies: content
                    });
                });
                break;
            case "member_of_allowance_policies":
                data_module.loadAllowance_policiesList().then(function(content){
                    makeData({
                        allowance_policies: content
                    });
                });
                break;
            case "member_of_bonus_policies":
                data_module.loadBonus_policiesList().then(function(content){
                    makeData({
                        bonus_policies: content
                    });
                });
                break;
            case "member_of_standard_workday_policies":
                data_module.loadStandard_workday_policiesList().then(function(content){
                    makeData({
                        standard_workday_policies: content
                    });
                });
                break;
            case "member_of_overtime_policies":
                data_module.loadOvertime_policiesList().then(function(content){
                    makeData({
                        overtime_policies: content
                    });
                });
                break;
            case "member_of_punishment_policies":
                data_module.loadPunishment_policiesList().then(function(content){
                    makeData({
                        punishment_policies: content
                    });
                });
                break;
            case "member_of_advance_payment_policies":
                data_module.loadAdvance_payment_policiesList().then(function(content){
                    makeData({
                        advance_payment_policies: content
                    });
                });
                break;
            case "member_of_late_early_checkin_policies":
                data_module.loadLate_early_checkin_policiesList().then(function(content){
                    makeData({
                        late_early_checkin_policies: content
                    });
                });
                break;
            case "member_of_salary_policies":
                data_module.loadSalary_policiesList().then(function(content){
                    makeData({
                        salary_policies: content
                    });
                });
                break;
            case "member_of_leave_policies":
                data_module.loadLeave_policiesList().then(function(content){
                    makeData({
                        leave_policies: content
                    });
                });
                break;
            case "member_of_other_liability_policies":
                data_module.loadOther_liability_policiesList().then(function(content){
                    makeData({
                        other_liability_policies: content
                    });
                });
                break;
            case "member_of_employment_contract_types":
                data_module.loadEmployment_contract_typesList().then(function(content){
                    makeData({
                        employment_contract_types: content
                    });
                });
                break;
            case "member_of_nations":
                data_module.loadNationsList().then(function(content){
                    makeData({
                        nations: content
                    });
                });
                break;
            case "nation_city":
                Promise.all([data_module.loadNationsList(), data_module.loadCitiesList()]).then(function(content){
                    makeData({
                        nations: content[0],
                        cities: content[1]
                    });
                });
                break;
            case "member_of_cities":
                data_module.loadCitiesList().then(function(content){
                    makeData({
                        cities: content
                    });
                });
                break;
            case "member_of_ethnics":
                data_module.loadEthnicsList().then(function(content){
                    makeData({
                        ethnics: content
                    });
                });
                break;
            case "member_of_religions":
                data_module.loadReligionsList().then(function(content){
                    makeData({
                        religions: content
                    });
                });
                break;
            case "geopos":
                data_module.loadGeographiesList().then(function(content){
                    makeData({
                        geopos: content
                    });
                });
                break;
            case "member_of_document_types":
                data_module.loadDocument_typesList().then(function(content){
                    makeData({
                        document_types: content
                    });
                });
                break;
            case "member_of_document_groups":
                data_module.loadDocument_groupsList().then(function(content){
                    makeData({
                        document_groups: content
                    });
                });
                break;
            case "member_of_document_folders":
                data_module.loadDocument_foldersList().then(function(content){
                    makeData({
                        document_folders: content
                    });
                });
                break;
            case "member_of_orgs":
                data_module.loadOrgCompanysList().then(function(content){
                    makeData({
                        orgs: content
                    });
                });
                break;
            default:
                makeData({});
        }
    });
};

contentModule.getAssetMainData = function(){
    return {
        type_asset_name: "name",
        type_asset_code: "code",
        type_asset_specification: "specification",
        type_asset_warehouseid: "warehouseid",
        type_asset_input_date: "input_date",
        type_asset_purchased_price: "purchased_price",
        type_asset_expireddate: "expireddate",
        type_asset_comment: "comment",
        type_asset_attachments: "attachments"
    };
};

contentModule.getInstrumentsAndToolsMainData = function(){
    return {
        type_instruments_and_tools_name: "name",
        type_instruments_and_tools_code: "code",
        type_instruments_and_tools_warehouseid: "warehouseid",
        type_instruments_and_tools_asset_category: "categoryid",
        type_instruments_and_tools_specification: "specification",
        type_instruments_and_tools_amount: "amount",
        type_instruments_and_tools_unit: "unit",
        type_instruments_and_tools_input_date: "input_date",
        type_instruments_and_tools_purchased_price: "purchased_price",
        type_instruments_and_tools_comment: "comment",
        type_instruments_and_tools_attachments: "attachments"
    };
};

contentModule.getWarehouseMainData = function(){
    return {
        type_warehouses_name: "name",
        type_warehouses_code: "code",
        type_warehouses_storekeepers: "storekeepers",
        type_warehouses_geoid: "geoid",
        type_warehouses_available: "available"
    };
};

contentModule.getAssetHandoverLinesMainData = function(){
    return {
        type_asset_handover_lines_assetid: "assetid",
        type_asset_handover_lines_status: "status",
        type_asset_handover_lines_comment: "comment"
    };
};

contentModule.getAssetHandoverMainData = function(){
    return {
        type_asset_handover_date: "date_transaction",
        type_asset_handover_warehouseid: "warehouseid",
        type_asset_handover_receiver: "employeeid",
        type_asset_handover_comment: "comment",
        type_asset_handover_attachments: "attachments",
        type_asset_handover_details: "details"
    };
};

contentModule.getInstrumentsAndToolsHandoverLinesMainData = function(){
    return {
        type_instruments_and_tools_handover_lines_assetid: "assetid",
        type_instruments_and_tools_handover_lines_unit: "unit",
        type_instruments_and_tools_handover_lines_inventory: "inventory",
        type_instruments_and_tools_handover_lines_amount: "amount",
        type_instruments_and_tools_handover_lines_comment: "comment"
    };
};

contentModule.getInstrumentsAndToolsHandoverMainData = function(){
    return {
        type_instruments_and_tools_handover_date: "date_transaction",
        type_instruments_and_tools_handover_warehouseid: "warehouseid",
        type_instruments_and_tools_handover_receiver: "employeeid",
        type_instruments_and_tools_handover_comment: "comment",
        type_instruments_and_tools_handover_attachments: "attachments",
        type_instruments_and_tools_handover_details: "details"
    };
};

contentModule.getAssetRecallLinesMainData = function(){
    return {
        type_asset_recall_lines_assetid: "assetid",
        type_asset_recall_lines_status: "status",
        type_asset_recall_lines_comment: "comment"
    };
};

contentModule.getAssetRecallMainData = function(){
    return {
        type_asset_recall_date: "date_transaction",
        type_asset_recall_warehouseid: "warehouseid",
        type_asset_recall_employeeid: "employeeid",
        type_asset_recall_comment: "comment",
        type_asset_recall_attachments: "attachments",
        type_asset_recall_details: "details"
    };
};

contentModule.getTrainingProgramGroupsMainData = function(){
    return {
        type_training_program_group_name: "name",
        type_training_program_group_description: "description",
        type_training_program_group_active: "available"
    };
};

contentModule.getTrainingProgramMainData = function(){
    return {
        type_training_program_name: "name",
        type_training_program_status: "status",
        type_training_program_group: "groupid",
        type_training_program_stime: "stime",
        type_training_program_etime: "etime",
        type_training_program_registration_deadline: "deadline",
        type_training_program_content: "content",
        type_training_program_available: "available"
    };
};

contentModule.getAllowancePolicyGroupsMainData = function(){
    return {
        type_allowance_policy_group_name: "name",
        type_allowance_policy_group_description: "description",
        type_allowance_policy_group_active: "available"
    };
};

contentModule.getBonusPolicyGroupsMainData = function(){
    return {
        type_bonus_policy_group_name: "name",
        type_bonus_policy_group_description: "description",
        type_bonus_policy_group_active: "available"
    };
};

contentModule.getPieceWagePolicyGroupsMainData = function(){
    return {
        type_piece_wage_policy_group_name: "name",
        type_piece_wage_policy_group_description: "description",
        type_piece_wage_policy_group_active: "available"
    };
};

contentModule.getAttendanceClockPolicyGroupsMainData = function(){
    return {
        type_attendance_clock_policy_group_name: "name",
        type_attendance_clock_policy_group_description: "description",
        type_attendance_clock_policy_group_active: "available"
    };
};

contentModule.getStandardWorkdayPolicyGroupsMainData = function(){
    return {
        type_standard_workday_policy_group_name: "name",
        type_standard_workday_policy_group_description: "description",
        type_standard_workday_policy_group_active: "available"
    };
};

contentModule.getWorkFlowGroupsMainData = function(){
    return {
        type_work_flow_group_name: "name",
        type_work_flow_group_description: "description",
        type_work_flow_group_active: "available"
    };
};

contentModule.getWorkFlowsMainData = function(){
    return {
        type_work_flow_name: "name",
        type_work_flow_groupid: "groupid",
        type_work_flow_description: "description",
        type_work_flow_type_extra_of_object: "type_extra_of_object",
        type_work_flow_input_form_extra_of_object: "input_form_extra_of_object",
        type_work_flow_output_form_extra_of_object: "output_form_extra_of_object",
        type_work_flow_mobile_input_form_extra_of_object: "mobile_input_form_extra_of_object",
        type_work_flow_mobile_output_form_extra_of_object: "mobile_output_form_extra_of_object",
        type_work_flow_active: "available"
    };
};

contentModule.getObjectsMainData = function(){
    return {
        type_object_name: "name",
        type_object_work_flowid: "work_flowid",
        type_object_period: "period",
        type_object_priority: "priority",
        type_object_attachments: "attachments",
        type_object_description: "description"
    };
};

contentModule.getPartnerClassMainData = function(){
    return {
        type_partner_class_name: "name",
        type_partner_class_color: "color",
        type_partner_class_description: "description",
        type_partner_class_type_extra: "type_extra",
        type_partner_class_input_form_extra: "input_form_extra",
        type_partner_class_output_form_extra: "output_form_extra",
        type_partner_class_mobile_input_form_extra: "mobile_input_form_extra",
        type_partner_class_mobile_output_form_extra: "mobile_output_form_extra",
        type_partner_class_active: "available"
    };
};

contentModule.getPartnerMainData = function(){
    return {
        type_partner_fullname: "fullname",
        type_partner_name: "name",
        type_partner_class: "class",
        type_partner_address: "address",
        type_partner_nation_city: "nation_city",
        type_partner_phone: "phone",
        type_partner_email: "email",
        type_partner_website: "website",
        type_partner_fax: "fax",
        type_partner_taxcode: "taxcode",
        type_partner_description: "description",
        type_partner_active: "available",
        type_partner_gps: "gps"
    };
};

contentModule.getContactMainData = function(){
    return {
        type_contact_name: "name",
        type_contact_position: "position",
        type_contact_department: "department",
        type_contact_partnerid: "partnerid",
        type_contact_phone_1: "phone_1",
        type_contact_phone_2: "phone_2",
        type_contact_email_1: "email_1",
        type_contact_email_2: "email_2",
        type_contact_owner: "owner",
        type_contact_active: "available"
    };
};


contentModule.getSalaryPolicyGroupsMainData = function(){
    return {
        type_salary_policy_group_name: "name",
        type_salary_policy_group_description: "description",
        type_salary_policy_group_active: "available"
    };
};

contentModule.getTradeUnionPolicyGroupsMainData = function(){
    return {
        type_trade_union_policy_group_name: "name",
        type_trade_union_policy_group_description: "description",
        type_trade_union_policy_group_active: "available"
    };
};

contentModule.getOvertimePolicyGroupsMainData = function(){
    return {
        type_overtime_policy_group_name: "name",
        type_overtime_policy_group_description: "description",
        type_overtime_policy_group_active: "available"
    };
};

contentModule.getOtherLiabilityPolicyGroupsMainData = function(){
    return {
        type_other_liability_policy_group_name: "name",
        type_other_liability_policy_group_description: "description",
        type_other_liability_policy_group_active: "available"
    };
};

contentModule.getOtherPolicyGroupsMainData = function(){
    return {
        type_other_policy_group_name: "name",
        type_other_policy_group_description: "description",
        type_other_policy_group_active: "available"
    };
};

contentModule.getPunishmentPolicyGroupsMainData = function(){
    return {
        type_punishment_policy_group_name: "name",
        type_punishment_policy_group_description: "description",
        type_punishment_policy_group_active: "available"
    };
};

contentModule.getAssetCategoryMainData = function(){
    return {
        type_asset_category_name: "name",
        type_asset_category_code: "code",
        type_asset_category_description: "description",
        type_asset_category_typeid: "typeid",
        type_asset_category_input_formid: "input_formid",
        type_asset_category_output_formid: "output_formid",
        type_asset_category_active: "available"
    };
};

contentModule.getInstrumentsAndToolsCategoryMainData = function(){
    return {
        type_instruments_and_tools_category_name: "name",
        type_instruments_and_tools_category_code: "code",
        type_instruments_and_tools_category_description: "description",
        type_instruments_and_tools_category_active: "available"
    };
};

contentModule.getProjectsMainData = function(){
    return {
        type_projects_name: "name",
        type_projects_shortname: "shortname",
        type_projects_geoid: "geoid",
        type_projects_timestart: "timestart",
        type_projects_timeend: "timeend",
        type_projects_comment: "comment",
        type_projects_active: "available"
    };
};

contentModule.getProjectAppliedToEmployeeMainData = function(){
    return {
        type_project_applied_to_employee_employeeid: "employeeid",
        type_project_applied_to_employee_projectid: "projectid",
        type_project_applied_to_employee_timestart: "timestart",
        type_project_applied_to_employee_timeend: "timeend",
        type_project_applied_to_employee_available: "available"
    };
};

contentModule.getTaxPolicyGroupsMainData = function(){
    return {
        type_tax_policy_group_name: "name",
        type_tax_policy_group_description: "description",
        type_tax_policy_group_active: "available"
    };
};

contentModule.getAdvancePaymentPolicyGroupsMainData = function(){
    return {
        type_advance_payment_policy_group_name: "name",
        type_advance_payment_policy_group_description: "description",
        type_advance_payment_policy_group_active: "available"
    };
};

contentModule.getLateEarlyCheckinPolicyGroupsMainData = function(){
    return {
        type_late_early_checkin_policy_group_name: "name",
        type_late_early_checkin_policy_group_description: "description",
        type_late_early_checkin_policy_group_active: "available"
    };
};

contentModule.getBenefitPolicyGroupsMainData = function(){
    return {
        type_benefit_policy_group_name: "name",
        type_benefit_policy_group_description: "description",
        type_benefit_policy_group_active: "available"
    };
};

contentModule.getAllowancePoliciesMainData = function(){
    return {
        type_allowance_policy_name: "name",
        type_allowance_policy_description: "description",
        type_allowance_policy_groupid: "groupid",
        type_allowance_policy_allowance_type: "allowance_type",
        type_allowance_policy_value: "value",
        type_allowance_policy_meal_value: "meal_value",
        type_allowance_policy_active: "available"
    };
};

contentModule.getBenefitPoliciesMainData = function(){
    return {
        type_benefit_policy_name: "name",
        type_benefit_policy_description: "description",
        type_benefit_policy_groupid: "groupid",
        type_benefit_policy_taxable_income: "taxable_income",
        type_benefit_policy_income_subject_to_insurance_contribution: "income_subject_to_insurance_contribution",
        type_benefit_policy_benefit_type: "benefit_type",
        type_benefit_policy_value: "value",
        type_benefit_policy_frequency: "frequency",
        type_benefit_policy_active: "available"
    };
};

contentModule.getLeavePoliciesMainData = function(){
    return {
        type_leave_policy_name: "name",
        type_leave_policy_symbol: "symbol",
        type_leave_policy_description: "description",
        type_leave_policy_groupid: "groupid",
        type_leave_policy_leave_days_per_year: "leave_days_per_year",
        type_leave_policy_maximum_leave_days_per_year: "maximum_leave_days_per_year",
        type_leave_policy_maximal_day_calculation: "maximal_day_calculation",
        type_leave_policy_number_of_working_months_to_increase_one_day_leave: "number_of_working_months_to_increase_one_day_leave",
        type_leave_policy_carried_forward_leave: "carried_forward_leave",
        type_leave_policy_accumulated_leave_expired_before: "accumulated_leave_expired_before",
        type_leave_policy_proposal_submitted_before: "proposal_submitted_before",
        type_leave_policy_work_paid: "work_paid",
        type_leave_policy_pay_percentage: "pay_percentage",
        type_leave_policy_active: "available"
    };
};

contentModule.getInsurancePoliciesMainData = function(){
    return {
        type_insurance_policy_name: "name",
        type_insurance_policy_description: "description",
        type_insurance_policy_groupid: "groupid",
        type_insurance_policy_calculated_on: "calculated_on",
        type_insurance_policy_contributed_by_company: "contributed_by_company",
        type_insurance_policy_contributed_by_employee: "contributed_by_employee",
        type_insurance_policy_active: "available"
    };
};

contentModule.getBonusPoliciesMainData = function(){
    return {
        type_bonus_policy_name: "name",
        type_bonus_policy_description: "description",
        type_bonus_policy_groupid: "groupid",
        type_bonus_policy_taxable_income: "taxable_income",
        type_bonus_policy_income_subject_to_insurance_contribution: "income_subject_to_insurance_contribution",
        type_bonus_policy_active: "available"
    };
};

contentModule.getPieceWagePoliciesMainData = function(){
    return {
        type_piece_wage_policy_name: "name",
        type_piece_wage_policy_description: "description",
        type_piece_wage_policy_groupid: "groupid",
        type_piece_wage_policy_active: "available"
    };
};

contentModule.getAttendanceClockPoliciesMainData = function(){
    return {
        type_attendance_clock_policy_name: "name",
        type_attendance_clock_policy_description: "description",
        type_attendance_clock_policy_groupid: "groupid",
        type_attendance_clock_policy_active: "available"
    };
};

contentModule.getStandardWorkdayPoliciesMainData = function(){
    return {
        type_standard_workday_policy_name: "name",
        type_standard_workday_policy_description: "description",
        type_standard_workday_policy_groupid: "groupid",
        type_standard_workday_policy_calculation: "calculation",
        type_standard_workday_policy_excluded_days: "excluded_days",
        type_standard_workday_policy_fixed_days: "fixed_days",
        type_standard_workday_policy_active: "available"
    };
};

contentModule.getPunishmentPoliciesMainData = function(){
    return {
        type_punishment_policy_name: "name",
        type_punishment_policy_description: "description",
        type_punishment_policy_groupid: "groupid",
        type_punishment_policy_tax_relief: "tax_relief",
        type_punishment_policy_insurance_contribution_relief: "insurance_contribution_relief",
        type_punishment_policy_active: "available"
    };
};

contentModule.getLeavePolicyGroupsMainData = function(){
    return {
        type_leave_policy_group_name: "name",
        type_leave_policy_group_description: "description",
        type_leave_policy_group_symbol: "symbol",
        type_leave_policy_group_active: "available"
    };
};

contentModule.getInsurancePolicyGroupsMainData = function(){
    return {
        type_insurance_policy_group_name: "name",
        type_insurance_policy_group_description: "description",
        type_insurance_policy_group_active: "available"
    };
};

contentModule.getEmploymentContractTypesMainData = function(){
    return {
        type_employment_contract_type_name: "name",
        type_employment_contract_type_description: "description",
        type_employment_contract_type_active: "available"
    };
};

contentModule.getSocialNetworkMainData = function(){
    return {
        type_social_network_name: "name",
        type_social_network_account: "account"
    };
};

contentModule.getWorkHistoryMainData = function(){
    return {
        type_work_history_position: "position",
        type_work_history_organization: "organization",
        type_work_history_from_month: "from_month",
        type_work_history_to_month: "to_month",
        type_work_history_comment: "comment"
    };
};

contentModule.getEducationHistoryMainData = function(){
    return {
        type_education_history_major: "major",
        type_education_history_school: "school",
        type_education_history_degree: "degree",
        type_education_history_from_month: "from_month",
        type_education_history_to_month: "to_month",
        type_education_history_comment: "comment",
        type_education_history_top_level: "top_level",
        type_education_history_attachments: "attachments"
    };
};

contentModule.getSkillMainData = function(){
    return {
        type_skill_skill: "skill",
        type_skill_level: "level",
        type_skill_comment: "comment"
    };
};

contentModule.getBankAccountMainData = function(){
    return {
        type_bank_account_number: "account_number",
        type_bank_account_holder_name: "account_holder_name",
        type_bank_account_bank_name: "bank_name",
        type_bank_account_agency: "agency"
    };
};

contentModule.getPersonalDocumentMainData = function(){
    return {
        type_personal_document_type: "type",
        type_personal_document_number: "number",
        type_personal_document_place: "place_of_issue",
        type_personal_document_date: "date_of_issue",
        type_personal_document_expire_time: "expire_time"
    };
};

contentModule.getPhoneMainData = function(){
    return {
        type_phone_type: "type",
        type_phone_number: "number"
    };
};

contentModule.getEmailMainData = function(){
    return {
        type_email_type: "type",
        type_email_address: "address"
    };
};

contentModule.getAdvancePaymentPoliciesMainData = function(){
    return {
        type_advance_payment_policy_name: "name",
        type_advance_payment_policy_description: "description",
        type_advance_payment_policy_groupid: "groupid",
        type_advance_payment_policy_advance_payment_on: "advance_payment_on",
        type_advance_payment_policy_maximum_percentage: "maximum_percentage",
        type_advance_payment_policy_maximum_amount: "maximum_amount",
        type_advance_payment_policy_calculated_on: "calculated_on",
        type_advance_payment_policy_salary_advance: "salary_advance",
        type_advance_payment_policy_active: "available"
    };
};

contentModule.getLateEarlyCheckinPoliciesMainData = function(){
    return {
        type_late_early_checkin_policy_name: "name",
        type_late_early_checkin_policy_description: "description",
        type_late_early_checkin_policy_groupid: "groupid",
        type_late_early_checkin_policy_late: "late",
        type_late_early_checkin_policy_early: "early",
        type_late_early_checkin_policy_proposal_submitted_before: "proposal_submitted_before",
        type_late_early_checkin_policy_active: "available"
    };
};

contentModule.getTaxPoliciesMainData = function(){
    return {
        type_tax_policy_name: "name",
        type_tax_policy_description: "description",
        type_tax_policy_groupid: "groupid",
        type_tax_policy_tax_type: "tax_type",
        type_tax_policy_tax_rate_progressive_tax: "tax_rate_progressive_tax",
        type_tax_policy_tax_rate_fixed_percentage: "tax_rate_fixed_percentage",
        type_tax_policy_active: "available"
    };
};

contentModule.getSalaryPoliciesMainData = function(){
    return {
        type_salary_policy_name: "name",
        type_salary_policy_description: "description",
        type_salary_policy_groupid: "groupid",
        type_salary_policy_payment_method: "payment_method",
        type_salary_policy_minimum_salary_amount: "minimum_salary_amount",
        type_salary_policy_maximum_salary_amount: "maximum_salary_amount",
        type_salary_policy_active: "available"
    };
};

contentModule.getTradeUnionPoliciesMainData = function(){
    return {
        type_trade_union_policy_name: "name",
        type_trade_union_policy_description: "description",
        type_trade_union_policy_groupid: "groupid",
        type_trade_union_policy_tax_relief: "tax_relief",
        type_trade_union_policy_insurance_contribution_relief: "insurance_contribution_relief",
        type_trade_union_policy_fee_type: "fee_type",
        type_trade_union_policy_rate: "rate",
        type_trade_union_policy_amount: "amount",
        type_trade_union_policy_limit_on_maximum_trade_union_fee: "limit_on_maximum_trade_union_fee",
        type_trade_union_policy_maximum_trade_union_fee: "maximum_trade_union_fee",
        type_trade_union_policy_active: "available"
    };
};

contentModule.getOvertimePoliciesMainData = function(){
    return {
        type_overtime_policy_name: "name",
        type_overtime_policy_description: "description",
        type_overtime_policy_groupid: "groupid",
        type_overtime_policy_maximum_overtime_hours_per_day: "maximum_overtime_hours_per_day",
        type_overtime_policy_maximum_overtime_hours_per_month: "maximum_overtime_hours_per_month",
        type_overtime_policy_proposal_submitted_before: "proposal_submitted_before",
        type_overtime_policy_active: "available"
    };
};

contentModule.getOvertimeRequestMainData = function(){
    return {
        type_overtime_request_employeeid: "employeeid",
        // type_overtime_request_policyid: "policyid",
        type_overtime_request_shiftid: "shiftid",
        type_overtime_request_fromdate: "fromdate",
        type_overtime_request_todate: "todate",
        type_overtime_request_time_period: "time_period",
        type_overtime_request_overtime_hours: "overtime_hours",
        type_overtime_request_reason: "reason"
    };
};

contentModule.getOtherLiabilityPoliciesMainData = function(){
    return {
        type_other_liability_policy_name: "name",
        type_other_liability_policy_description: "description",
        type_other_liability_policy_groupid: "groupid",
        type_other_liability_policy_tax_relief: "tax_relief",
        type_other_liability_policy_insurance_contribution_relief: "insurance_contribution_relief",
        type_other_liability_policy_other_liability_type: "other_liability_type",
        type_other_liability_policy_value: "value",
        type_other_liability_policy_frequency: "frequency",
        type_other_liability_policy_active: "available"
    };
};

contentModule.getInsurancePoliciesAppliedToEmployeeMainData = function(){
    return {
        type_insurance_policies_applied_to_employee_employeeid: "employeeid",
        type_insurance_policies_applied_to_employee_policyid: "policyid",
        type_insurance_policies_applied_to_employee_description: "description",
        type_insurance_policies_applied_to_employee_calculated_on: "calculated_on",
        type_insurance_policies_applied_to_employee_value: "value"
    };
};

contentModule.getOvertimePoliciesAppliedToEmployeeMainData = function(){
    return {
        type_overtime_policies_applied_to_employee_employeeid: "employeeid",
        type_overtime_policies_applied_to_employee_policyid: "policyid",
        type_overtime_policies_applied_to_employee_description: "description"
    };
};

contentModule.getBonusPoliciesAppliedToEmployeeMainData = function(){
    return {
        type_bonus_policies_applied_to_employee_employeeid: "employeeid",
        type_bonus_policies_applied_to_employee_policyid: "policyid",
        type_bonus_policies_applied_to_employee_description: "description"
    };
};

contentModule.getPieceWagePoliciesAppliedToEmployeeMainData = function(){
    return {
        type_piece_wage_policies_applied_to_employee_employeeid: "employeeid",
        type_piece_wage_policies_applied_to_employee_policyid: "policyid",
        type_piece_wage_policies_applied_to_employee_description: "description"
    };
};

contentModule.getAttendanceClockPoliciesAppliedToEmployeeMainData = function(){
    return {
        type_attendance_clock_policies_applied_to_employee_employeeid: "employeeid",
        type_attendance_clock_policies_applied_to_employee_policyid: "policyid",
        type_attendance_clock_policies_applied_to_employee_description: "description"
    };
};

contentModule.getStandardWorkdayPoliciesAppliedToEmployeeMainData = function(){
    return {
        type_standard_workday_policies_applied_to_employee_employeeid: "employeeid",
        type_standard_workday_policies_applied_to_employee_policyid: "policyid",
        type_standard_workday_policies_applied_to_employee_description: "description"
    };
};

contentModule.getPunishmentPoliciesAppliedToEmployeeMainData = function(){
    return {
        type_punishment_policies_applied_to_employee_employeeid: "employeeid",
        type_punishment_policies_applied_to_employee_policyid: "policyid",
        type_punishment_policies_applied_to_employee_description: "description"
    };
};

contentModule.getBenefitPoliciesAppliedToEmployeeMainData = function(){
    return {
        type_benefit_policies_applied_to_employee_employeeid: "employeeid",
        type_benefit_policies_applied_to_employee_policyid: "policyid",
        type_benefit_policies_applied_to_employee_description: "description",
        type_benefit_policies_applied_to_employee_attachments: "attachments"
    };
};

contentModule.getAllowancePoliciesAppliedToEmployeeMainData = function(){
    return {
        type_allowance_policies_applied_to_employee_employeeid: "employeeid",
        type_allowance_policies_applied_to_employee_policyid: "policyid",
        type_allowance_policies_applied_to_employee_description: "description",
        type_allowance_policies_applied_to_employee_attachments: "attachments"
    };
};

contentModule.getTaxPoliciesAppliedToEmployeeMainData = function(){
    return {
        type_tax_policies_applied_to_employee_employeeid: "employeeid",
        type_tax_policies_applied_to_employee_policyid: "policyid",
        type_tax_policies_applied_to_employee_description: "description",
        type_tax_policies_applied_to_employee_tax_type: "tax_type",
        type_tax_policies_applied_to_employee_attachments: "attachments"
    };
};

contentModule.getTradeUnionPoliciesAppliedToEmployeeMainData = function(){
    return {
        type_trade_union_policies_applied_to_employee_employeeid: "employeeid",
        type_trade_union_policies_applied_to_employee_policyid: "policyid",
        type_trade_union_policies_applied_to_employee_description: "description",
        type_trade_union_policies_applied_to_employee_attachments: "attachments"
    };
};

contentModule.getOtherLiabilityPoliciesAppliedToEmployeeMainData = function(){
    return {
        type_other_liability_policies_applied_to_employee_employeeid: "employeeid",
        type_other_liability_policies_applied_to_employee_policyid: "policyid",
        type_other_liability_policies_applied_to_employee_description: "description",
        type_other_liability_policies_applied_to_employee_tax_relief: "tax_relief",
        type_other_liability_policies_applied_to_employee_insurance_contribution_relief: "insurance_contribution_relief",
        type_other_liability_policies_applied_to_employee_other_liability_type: "other_liability_type",
        type_other_liability_policies_applied_to_employee_frequency: "frequency",
        type_other_liability_policies_applied_to_employee_attachments: "attachments"
    };
};

contentModule.getLeavePoliciesAppliedToEmployeeMainData = function(){
    return {
        type_leave_policies_applied_to_employee_employeeid: "employeeid",
        type_leave_policies_applied_to_employee_policyid: "policyid",
        type_leave_policies_applied_to_employee_description: "description",
        type_leave_policies_applied_to_employee_attachments: "attachments"
    };
};

contentModule.getLateEarlyCheckinPoliciesAppliedToEmployeeMainData = function(){
    return {
        type_late_early_checkin_policies_applied_to_employee_employeeid: "employeeid",
        type_late_early_checkin_policies_applied_to_employee_policyid: "policyid",
        type_late_early_checkin_policies_applied_to_employee_description: "description",
        type_late_early_checkin_policies_applied_to_employee_attachments: "attachments"
    };
};

contentModule.getAdvancePaymentPoliciesAppliedToEmployeeMainData = function(){
    return {
        type_advance_payment_policies_applied_to_employee_employeeid: "employeeid",
        type_advance_payment_policies_applied_to_employee_policyid: "policyid",
        type_advance_payment_policies_applied_to_employee_description: "description",
        type_advance_payment_policies_applied_to_employee_attachments: "attachments"
    };
};

contentModule.getSalaryDecisionsAppliedToEmployeeMainData = function(){
    return {
        type_salary_decisions_applied_to_employee_employeeid: "employeeid",
        type_salary_decisions_applied_to_employee_note: "note",
        type_salary_decisions_applied_to_employee_salary_grade: "salary_grade",
        type_salary_decisions_applied_to_employee_salary_coefficient: "salary_coefficient",
        type_salary_decisions_applied_to_employee_basic_salary_amount: "basic_salary_amount",
        type_salary_decisions_applied_to_employee_gross_salary_amount: "gross_salary_amount",
        type_salary_decisions_applied_to_employee_calculated_on: "calculated_on",
        type_salary_decisions_applied_to_employee_effective_date: "effective_date",
        type_salary_decisions_applied_to_employee_reference_number: "reference_number",
        type_salary_decisions_applied_to_employee_decision_date: "decision_date",
        type_salary_decisions_applied_to_employee_salary_review_period: "salary_review_period",
        type_salary_decisions_applied_to_employee_attachments: "attachments",
        type_salary_decisions_applied_to_employee_available: "available",
        type_salary_decisions_applied_to_employee_attachments: "attachments"
    };
};

contentModule.getSalaryPoliciesAppliedToEmployeeMainData = function(){
    return {
        type_salary_policies_applied_to_employee_employeeid: "employeeid",
        type_salary_policies_applied_to_employee_position: "position",
        type_salary_policies_applied_to_employee_policyid: "policyid",
        type_salary_policies_applied_to_employee_description: "description",
        type_salary_policies_applied_to_employee_attachments: "attachments"
    };
};

contentModule.getEmploymentContractsMainData = function(){
    return {
        type_employee_employment_contract_employeeid: "employeeid",
        type_employee_employment_contract_number: "contract_number",
        type_employee_employment_contract_signing_date: "signing_date",
        type_employee_employment_contract_contractid: "contractid",
        type_employee_employment_contract_description: "description",
        type_employee_employment_contract_effective_date_from: "effective_date_from",
        type_employee_employment_contract_effective_date_to: "effective_date_to",
        type_employee_employment_contract_attachments: "attachments",
        type_employee_employment_contract_available: "available"
    };
};

contentModule.getBonusListMainData = function(){
    return {
        type_bonus_list_cycleid: "cycleid",
        type_bonus_list_payroll_date_month: "payroll_date_month",
        type_bonus_list_payroll_date_week: "payroll_date_week",
        type_bonus_list_name: "name",
        type_bonus_list_reference_number: "reference_number",
        type_bonus_list_reference_date: "reference_date",
        type_bonus_list_policyid: "policyid"
    };
};

contentModule.getBonusListDetailsMainData = function(){
    return {
        type_bonus_list_details_employeeid: "employeeid",
        type_bonus_list_details_amount: "amount",
        type_bonus_list_details_comment: "comment"
    };
};

contentModule.getPunishmentListDetailsMainData = function(){
    return {
        type_punishment_list_details_employeeid: "employeeid",
        type_punishment_list_details_amount: "amount",
        type_punishment_list_details_comment: "comment"
    };
};

contentModule.getBenefitListDetailsMainData = function(){
    return {
        type_benefit_list_details_employeeid: "employeeid",
        type_benefit_list_details_amount: "amount",
        type_benefit_list_details_comment: "comment"
    };
};

contentModule.getOtherLiabilityListDetailsMainData = function(){
    return {
        type_other_liability_list_details_employeeid: "employeeid",
        type_other_liability_list_details_amount: "amount",
        type_other_liability_list_details_comment: "comment"
    };
};

contentModule.getAdvancePaymentListDetailsMainData = function(){
    return {
        type_advance_payment_list_details_employeeid: "employeeid",
        type_advance_payment_list_details_amount: "amount",
        type_advance_payment_list_details_comment: "comment"
    };
};

contentModule.getScoreCardReportLineMainData = function(){
    return {
        type_scorecard_report_line_name: "name",
        type_scorecard_report_line_measurement_unit: "unit",
        type_scorecard_report_line_weight: "weight",
        type_scorecard_report_line_goal: "goal",
        type_scorecard_report_line_low_threshold: "min",
        type_scorecard_report_line_high_threshold: "max",
        type_scorecard_report_line_result: "result",
        type_scorecard_report_line_performance: "performance",
        type_scorecard_report_line_chart: "chart"
    };
};

contentModule.getSalaryAdjustmentListDetailsMainData = function(){
    return {
        type_salary_adjustment_list_details_employeeid: "employeeid",
        type_salary_adjustment_list_details_amount: "amount",
        type_salary_adjustment_list_details_tax_exempt: "tax_exempt",
        type_salary_adjustment_list_details_insurance_exempt: "insurance_exempt",
        type_salary_adjustment_list_details_comment: "comment"
    };
};

contentModule.getOffboardingMainData = function(){
    return {
        type_offboarding_employee_id: "employeeid",
        type_offboarding_status: "status",
        type_offboarding_user: "username",
        type_offboarding_employee_code: "code",
        type_offboarding_direct_manager: "direct_manager",
        type_offboarding_indirect_manager: "indirect_manager",
        type_offboarding_hr_support_employee: "hr_support_employee",
        type_offboarding_application_recipients: "application_recipients",
        type_offboarding_expected_day_off: "expected_day_off",
        type_offboarding_handover_recipients: "handover_recipients",
        type_offboarding_resignation_letter: "letter",
        type_offboarding_active: "available",
    };
};

contentModule.getAllowanceListDetailsMainData = function(){
    return {
        type_allowance_list_details_employeeid: "employeeid",
        type_allowance_list_details_amount: "amount",
        type_allowance_list_details_comment: "comment"
    };
};

contentModule.getPunishmentListMainData = function(){
    return {
        type_punishment_list_cycleid: "cycleid",
        type_punishment_list_payroll_date_month: "payroll_date_month",
        type_punishment_list_payroll_date_week: "payroll_date_week",
        type_punishment_list_name: "name",
        type_punishment_list_reference_number: "reference_number",
        type_punishment_list_reference_date: "reference_date",
        type_punishment_list_policyid: "policyid"
    };
};

contentModule.getAllowanceListMainData = function(){
    return {
        type_allowance_list_cycleid: "cycleid",
        type_allowance_list_payroll_date_month: "payroll_date_month",
        type_allowance_list_payroll_date_week: "payroll_date_week",
        type_allowance_list_name: "name",
        type_allowance_list_reference_number: "reference_number",
        type_allowance_list_reference_date: "reference_date",
        type_allowance_list_policyid: "policyid"
    };
};

contentModule.getBenefitListMainData = function(){
    return {
        type_benefit_list_cycleid: "cycleid",
        type_benefit_list_payroll_date_month: "payroll_date_month",
        type_benefit_list_payroll_date_week: "payroll_date_week",
        type_benefit_list_name: "name",
        type_benefit_list_reference_number: "reference_number",
        type_benefit_list_reference_date: "reference_date",
        type_benefit_list_policyid: "policyid"
    };
};

contentModule.getOtherLiabilityListMainData = function(){
    return {
        type_other_liability_list_cycleid: "cycleid",
        type_other_liability_list_payroll_date_month: "payroll_date_month",
        type_other_liability_list_payroll_date_week: "payroll_date_week",
        type_other_liability_list_name: "name",
        type_other_liability_list_reference_number: "reference_number",
        type_other_liability_list_reference_date: "reference_date",
        type_other_liability_list_policyid: "policyid"
    };
};

contentModule.getAdvancePaymentListMainData = function(){
    return {
        type_advance_payment_list_cycleid: "cycleid",
        type_advance_payment_list_payroll_date_month: "payroll_date_month",
        type_advance_payment_list_payroll_date_week: "payroll_date_week",
        type_advance_payment_list_name: "name",
        type_advance_payment_list_reference_number: "reference_number",
        type_advance_payment_list_reference_date: "reference_date",
        type_advance_payment_list_policyid: "policyid"
    };
};

contentModule.getSalaryAdjustmentListMainData = function(){
    return {
        type_salary_adjustment_list_cycleid: "cycleid",
        type_salary_adjustment_list_payroll_date_month: "payroll_date_month",
        type_salary_adjustment_list_payroll_date_week: "payroll_date_week",
        type_salary_adjustment_list_name: "name",
        type_salary_adjustment_list_reference_number: "reference_number",
        type_salary_adjustment_list_reference_date: "reference_date"
    };
};

contentModule.getNationsMainData = function(){
    return {
        type_nation_short_name: "shortname",
        type_nation_name: "fullname",
        type_nation_phonecode: "phonecode",
        type_nation_active: "available"
    };
};

contentModule.getCitiesMainData = function(){
    return {
        type_city_name: "name",
        type_city_code: "code",
        type_city_nationid: "nationid",
        type_city_postalcode: "postalcode",
        type_city_phonecode: "phonecode",
        type_city_active: "available"
    };
};

contentModule.getEthnicsMainData = function(){
    return {
        type_ethnic_name: "name",
        type_ethnic_code: "code",
        type_ethnic_active: "available"
    };
};

contentModule.getReligionsMainData = function(){
    return {
        type_religion_name: "name",
        type_religion_code: "code",
        type_religion_active: "available"
    };
};

contentModule.getExaminationSessionMainData = function(){
    return {
        type_examination_session_name: "name",
        type_examination_session_status: "status",
        type_examination_session_stime: "stime",
        type_examination_session_content: "content",
        type_examination_session_available: "available"
    };
};

contentModule.getExaminationLectureMainData = function(){
    return {
        type_examination_session_lecturer: "type",
        type_examination_session_internal_trainer: "peopleid",
        type_examination_session_outsource_trainer: "peopleid"
    };
};

contentModule.getExaminationParticipantMainData = function(){
    return {
        type_examination_session_participant: "peopleid"
    };
};

contentModule.getTaskTemplateMainData = function(){
    return {
        type_task_template_name: "name",
        // type_task_template_groupid: "groupid",
        type_task_template_language: "languageid",
        type_task_template_comment: "comment",
        type_task_template_active: "available",
        type_task_template_task_name: "task_name",
        type_task_template_task_status: "task_status",
        type_task_template_task_expire_time: "task_expire_time",
        type_task_template_task_reminder: "task_reminder",
        type_task_template_task_assign_to: "task_assign_to",
        type_task_template_task_participant: "task_participant",
        type_task_template_task_result: "task_result"
    };
};

contentModule.getMeetingTemplateMainData = function(){
    return {
        type_meeting_template_name: "name",
        // type_meeting_template_groupid: "groupid",
        type_meeting_template_language: "languageid",
        type_meeting_template_comment: "comment",
        type_meeting_template_active: "available",
        type_meeting_template_meeting_name: "meeting_name",
        type_meeting_template_meeting_type: "meeting_type",
        type_meeting_template_meeting_location: "meeting_location",
        type_meeting_template_meeting_status: "meeting_status",
        type_meeting_template_meeting_start_time: "meeting_start_time",
        type_meeting_template_meeting_end_time: "meeting_end_time",
        type_meeting_template_meeting_all_day: "meeting_all_day",
        type_meeting_template_meeting_reminder: "meeting_reminder",
        type_meeting_template_meeting_assign_to: "meeting_assign_to",
        type_meeting_template_meeting_participant: "meeting_participant",
        type_meeting_template_meeting_result: "meeting_result"
    };
};

contentModule.getEmailTemplateMainData = function(){
    return {
        type_email_template_name: "name",
        // type_email_template_groupid: "groupid",
        type_email_template_language: "languageid",
        type_email_template_comment: "comment",
        type_email_template_active: "available",
        type_email_template_receiver: "receiver",
        type_email_template_carbon_copy: "carbon_copy",
        type_email_template_blind_carbon_copy: "blind_carbon_copy",
        type_email_template_subject: "subject",
        type_email_template_content: "email_content"
    };
};

contentModule.getOnboardingMainData = function(){
    return {
        type_onboarding_employee_id: "employeeid",
        type_onboarding_employee_code: "code",
        type_onboarding_status: "status",
        type_onboarding_employee_start_date: "start_date",
        type_onboarding_employee_official_date: "official_date",
        type_onboarding_welcome_templateid: "welcome_templateid",
        type_onboarding_comment: "comment",
        type_onboarding_active: "available"
    };
};

contentModule.getGeographicalPositionMainData = function(){
    return {
        type_geographical_position_name: "name",
        type_geographical_position_location: "location",
        type_geographical_position_nation_city: "nation_city",
        type_geographical_position_address: "address",
        type_geographical_position_phone: "phone",
        type_geographical_position_post_code: "post_code",
        type_geographical_position_comment: "comment",
        type_geographical_position_active: "available"
    };
};

contentModule.getTemplateGroupMainData = function(){
    return {
        type_template_groups_name: "name",
        type_template_groups_typeid: "typeid",
        type_template_groups_comment: "comment",
        type_template_groups_active: "available"
    };
};

contentModule.getMainData = function(typeid, dict){
    var mainData, t_id;
    if (!dict[typeid]) return null;
    var type = dict[typeid].type;
    while (type == "extends_structure"){
        t_id = typeid;
        type = dict[dict[typeid].content.typeof].type;
        typeid = dict[typeid].content.typeof;
    }
    mainData = {};
    if (!dict[typeid].content.details) return mainData;
    dict[typeid].content.details.forEach((cur) => {
        mainData[cur.localid] = cur.key;
    });

    return mainData;
    switch (type) {
        case "company":
            mainData = contentModule.getCompanyMainData();
            break;
        case "org":
            mainData = contentModule.getOrgMainData();
            break;
        case "employee":
            mainData = contentModule.getEmployeeMainData();
            break;
        case "people":
            mainData = contentModule.getPeopleMainData();
            break;
        case "position":
            mainData = contentModule.getPositionMainData();
            break;
        case "position_2":
            mainData = contentModule.getPosition2MainData();
            break;
        case "task":
            mainData = contentModule.getTaskMainData();
            break;
        case "meeting":
            mainData = contentModule.getMeetingMainData();
            break;
        case "holidays":
            mainData = contentModule.getHolidayMainData();
            break;
        case "shift_general":
            mainData = contentModule.getShiftGeneralMainData();
            break;
        case "shift_worktime":
            mainData = contentModule.getShiftWorktimeMainData();
            break;
        case "shift_timekeeping":
            mainData = contentModule.getShiftTimekeepingMainData();
            break;
        case "worktime_checkins":
            mainData = contentModule.getWorktime_checkinMainData();
            break;
        case "checkin_employee_ident":
            mainData = contentModule.getTimekeepingCodeMainData();
            break;
        case "worktime_machines":
            mainData = contentModule.getWorktime_machineMainData();
            break;
        case "worktime_logs":
            mainData = contentModule.getWorktime_logMainData();
            break;
        case "training_programs":
            mainData = contentModule.getTrainingProgramMainData();
            break;
        case "assets":
            mainData = contentModule.getAssetMainData();
            break;
        case "instruments_and_tools":
            mainData = contentModule.getInstrumentsAndToolsMainData();
            break;
        case "warehouses":
            mainData = contentModule.getWarehouseMainData();
            break;
        case "asset_handover_lines":
            mainData = contentModule.getAssetHandoverLinesMainData();
            break;
        case "asset_handover":
            mainData = contentModule.getAssetHandoverMainData();
            break;
        case "instruments_and_tools_handover_lines":
            mainData = contentModule.getInstrumentsAndToolsHandoverLinesMainData();
            break;
        case "instruments_and_tools_handover":
            mainData = contentModule.getInstrumentsAndToolsHandoverMainData();
            break;
        case "asset_recall_lines":
            mainData = contentModule.getAssetRecallLinesMainData();
            break;
        case "asset_recall":
            mainData = contentModule.getAssetRecallMainData();
            break;
        case "allowance_policy_groups":
            mainData = contentModule.getAllowancePolicyGroupsMainData();
            break;
        case "bonus_policy_groups":
            mainData = contentModule.getBonusPolicyGroupsMainData();
            break;
        case "piece_wage_policy_groups":
            mainData = contentModule.getPieceWagePolicyGroupsMainData();
            break;
        case "attendance_clock_policy_groups":
            mainData = contentModule.getAttendanceClockPolicyGroupsMainData();
            break;
        case "standard_workday_policy_groups":
            mainData = contentModule.getStandardWorkdayPolicyGroupsMainData();
            break;
        case "work_flow_groups":
            mainData = contentModule.getWorkFlowGroupsMainData();
            break;
        case "work_flows":
            mainData = contentModule.getWorkFlowsMainData();
            break;
        case "objects":
            mainData = contentModule.getObjectsMainData();
            break;
        case "partner_class":
            mainData = contentModule.getPartnerClassMainData();
            break;
        case "partner":
            mainData = contentModule.getPartnerMainData();
            break;
        case "contact":
            mainData = contentModule.getContactMainData();
            break;
        case "other_liability_policy_groups":
            mainData = contentModule.getOtherLiabilityPolicyGroupsMainData();
            break;
        case "other_policy_groups":
            mainData = contentModule.getOtherPolicyGroupsMainData();
            break;
        case "trade_union_policy_groups":
            mainData = contentModule.getTradeUnionPolicyGroupsMainData();
            break;
        case "overtime_policy_groups":
            mainData = contentModule.getOvertimePolicyGroupsMainData();
            break;
        case "salary_policy_groups":
            mainData = contentModule.getSalaryPolicyGroupsMainData();
            break;
        case "punishment_policy_groups":
            mainData = contentModule.getPunishmentPolicyGroupsMainData();
            break;
        case "asset_category":
            mainData = contentModule.getAssetCategoryMainData();
            break;
        case "instruments_and_tools_category":
            mainData = contentModule.getInstrumentsAndToolsCategoryMainData();
            break;
        case "projects":
            mainData = contentModule.getProjectsMainData();
            break;
        case "project_applied_to_employee":
            mainData = contentModule.getProjectAppliedToEmployeeMainData();
            break;
        case "tax_policy_groups":
            mainData = contentModule.getTaxPolicyGroupsMainData();
            break;
        case "advance_payment_policy_groups":
            mainData = contentModule.getAdvancePaymentPolicyGroupsMainData();
            break;
        case "late_early_checkin_policy_groups":
            mainData = contentModule.getLateEarlyCheckinPolicyGroupsMainData();
            break;
        case "benefit_policy_groups":
            mainData = contentModule.getBenefitPolicyGroupsMainData();
            break;
        case "allowance_policies":
            mainData = contentModule.getAllowancePoliciesMainData();
            break;
        case "benefit_policies":
            mainData = contentModule.getBenefitPoliciesMainData();
            break;
        case "training_program_groups":
            mainData = contentModule.getTrainingProgramGroupsMainData();
            break;
        case "insurance_policies":
            mainData = contentModule.getInsurancePoliciesMainData();
            break;
        case "leave_policy_groups":
            mainData = contentModule.getLeavePolicyGroupsMainData();
            break;
        case "leave_policies":
            mainData = contentModule.getLeavePoliciesMainData();
            break;
        case "insurance_policy_groups":
            mainData = contentModule.getInsurancePolicyGroupsMainData();
            break;
        case "bonus_policies":
            mainData = contentModule.getBonusPoliciesMainData();
            break;
        case "piece_wage_policies":
            mainData = contentModule.getPieceWagePoliciesMainData();
            break;
        case "attendance_clock_policies":
            mainData = contentModule.getAttendanceClockPoliciesMainData();
            break;
        case "standard_workday_policies":
            mainData = contentModule.getStandardWorkdayPoliciesMainData();
            break;
        case "punishment_policies":
            mainData = contentModule.getPunishmentPoliciesMainData();
            break;
        case "advance_payment_policies":
            mainData = contentModule.getAdvancePaymentPoliciesMainData();
            break;
        case "late_early_checkin_policies":
            mainData = contentModule.getLateEarlyCheckinPoliciesMainData();
            break;
        case "tax_policies":
            mainData = contentModule.getTaxPoliciesMainData();
            break;
        case "salary_policies":
            mainData = contentModule.getSalaryPoliciesMainData();
            break;
        case "trade_union_policies":
            mainData = contentModule.getTradeUnionPoliciesMainData();
            break;
        case "overtime_policies":
            mainData = contentModule.getOvertimePoliciesMainData();
            break;
        case "overtime_request":
            mainData = contentModule.getOvertimeRequestMainData();
            break;
        case "other_liability_policies":
            mainData = contentModule.getOtherLiabilityPoliciesMainData();
            break;
        case "insurance_policies_applied_to_employee":
            mainData = contentModule.getInsurancePoliciesAppliedToEmployeeMainData();
            break;
        case "overtime_policies_applied_to_employee":
            mainData = contentModule.getOvertimePoliciesAppliedToEmployeeMainData();
            break;
        case "bonus_policies_applied_to_employee":
            mainData = contentModule.getBonusPoliciesAppliedToEmployeeMainData();
            break;
        case "piece_wage_policies_applied_to_employee":
            mainData = contentModule.getPieceWagePoliciesAppliedToEmployeeMainData();
            break;
        case "attendance_clock_policies_applied_to_employee":
            mainData = contentModule.getAttendanceClockPoliciesAppliedToEmployeeMainData();
            break;
        case "standard_workday_policies_applied_to_employee":
            mainData = contentModule.getStandardWorkdayPoliciesAppliedToEmployeeMainData();
            break;
        case "punishment_policies_applied_to_employee":
            mainData = contentModule.getPunishmentPoliciesAppliedToEmployeeMainData();
            break;
        case "benefit_policies_applied_to_employee":
            mainData = contentModule.getBenefitPoliciesAppliedToEmployeeMainData();
            break;
        case "allowance_policies_applied_to_employee":
            mainData = contentModule.getAllowancePoliciesAppliedToEmployeeMainData();
            break;
        case "tax_policies_applied_to_employee":
            mainData = contentModule.getTaxPoliciesAppliedToEmployeeMainData();
            break;
        case "trade_union_policies_applied_to_employee":
            mainData = contentModule.getTradeUnionPoliciesAppliedToEmployeeMainData();
            break;
        case "other_liability_policies_applied_to_employee":
            mainData = contentModule.getOtherLiabilityPoliciesAppliedToEmployeeMainData();
            break;
        case "leave_policies_applied_to_employee":
            mainData = contentModule.getLeavePoliciesAppliedToEmployeeMainData();
            break;
        case "late_early_checkin_policies_applied_to_employee":
            mainData = contentModule.getLateEarlyCheckinPoliciesAppliedToEmployeeMainData();
            break;
        case "advance_payment_policies_applied_to_employee":
            mainData = contentModule.getAdvancePaymentPoliciesAppliedToEmployeeMainData();
            break;
        case "salary_decisions_applied_to_employee":
            mainData = contentModule.getSalaryDecisionsAppliedToEmployeeMainData();
            break;
        case "salary_policies_applied_to_employee":
            mainData = contentModule.getSalaryPoliciesAppliedToEmployeeMainData();
            break;
        case "employment_contracts":
            mainData = contentModule.getEmploymentContractsMainData();
            break;
        case "bonus_list":
            mainData = contentModule.getBonusListMainData();
            break;
        case "bonus_list_details":
            mainData = contentModule.getBonusListDetailsMainData();
            break;
        case "punishment_list":
            mainData = contentModule.getPunishmentListMainData();
            break;
        case "punishment_list_details":
            mainData = contentModule.getPunishmentListDetailsMainData();
            break;
        case "allowance_list_details":
            mainData = contentModule.getAllowanceListDetailsMainData();
            break;
        case "allowance_list":
            mainData = contentModule.getAllowanceListMainData();
            break;
        case "benefit_list":
            mainData = contentModule.getBenefitListMainData();
            break;
        case "benefit_list_details":
            mainData = contentModule.getBenefitListDetailsMainData();
            break;
        case "other_liability_list":
            mainData = contentModule.getOtherLiabilityListMainData();
            break;
        case "other_liability_list_details":
            mainData = contentModule.getOtherLiabilityListDetailsMainData();
            break;
        case "advance_payment_list":
            mainData = contentModule.getAdvancePaymentListMainData();
            break;
        case "advance_payment_list_details":
            mainData = contentModule.getAdvancePaymentListDetailsMainData();
            break;
        case "scorecard_report_line":
            mainData = contentModule.getScoreCardReportLineMainData();
            break;
        case "salary_adjustment_list":
            mainData = contentModule.getSalaryAdjustmentListMainData();
            break;
        case "salary_adjustment_list_details":
            mainData = contentModule.getSalaryAdjustmentListDetailsMainData();
            break;
        case "family_members":
            mainData = contentModule.getFamilyMemberMainData();
            break;
        case "employment_contract_types":
            mainData = contentModule.getEmploymentContractTypesMainData();
            break;
        case "social_network":
            mainData = contentModule.getSocialNetworkMainData();
            break;
        case "work_history":
            mainData = contentModule.getWorkHistoryMainData();
            break;
        case "education_history":
            mainData = contentModule.getEducationHistoryMainData();
            break;
        case "skill":
            mainData = contentModule.getSkillMainData();
            break;
        case "bank_account":
            mainData = contentModule.getBankAccountMainData();
            break;
        case "phone":
            mainData = contentModule.getPhoneMainData();
            break;
        case "email":
            mainData = contentModule.getEmailMainData();
            break;
        case "personal_document":
            mainData = contentModule.getPersonalDocumentMainData();
            break;
        case "nations":
            mainData = contentModule.getNationsMainData();
            break;
        case "cities":
            mainData = contentModule.getCitiesMainData();
            break;
        case "ethnics":
            mainData = contentModule.getEthnicsMainData();
            break;
        case "religions":
            mainData = contentModule.getReligionsMainData();
            break;
        case "training_lecturer":
            mainData = contentModule.getTrainingLecturerMainData();
            break;
        case "training_participant":
            mainData = contentModule.getTrainingParticipantMainData();
            break;
        case "request_advance_payment":
            mainData = contentModule.getRequestAdvancePaymentMainData();
            break;
        case "request_late_early_checkin":
            mainData = contentModule.getRequestLateEarlyCheckinMainData();
            break;
        case "examination_session":
            mainData = contentModule.getExaminationSessionMainData();
            break;
        case "examination_lecturer":
            mainData = contentModule.getExaminationLectureMainData();
            break;
        case "examination_participant":
            mainData = contentModule.getExaminationParticipantMainData();
            break;
        case "request_leave":
            mainData = contentModule.getRequestLeaveMainData();
            break;
        case "shift_schedule":
            mainData = contentModule.getShiftScheduleManualMainData();
            break;
        case "shift_schedule_ot":
            mainData = contentModule.getShiftScheduleOTMainData();
            break;
        case "days_off_schedule":
            mainData = contentModule.getDaysOffScheduleMainData();
            break;
        case "document_types":
            mainData = contentModule.getDocumentTypesMainData();
            break;
        case "document_groups":
            mainData = contentModule.getDocumentGroupsMainData();
            break;
        case "document_properties":
            mainData = contentModule.getDocumentPropertiesMainData();
            break;
        case "document_templates":
            mainData = contentModule.getDocumentTemplatesMainData();
            break;
        case "documents":
            mainData = contentModule.getDocumentsMainData();
            break;
        case "template_groups":
            mainData = contentModule.getTemplateGroupMainData();
            break;
        case "task_templates":
            mainData = contentModule.getTaskTemplateMainData();
            break;
        case "meeting_templates":
            mainData = contentModule.getMeetingTemplateMainData();
            break;
        case "email_templates":
            mainData = contentModule.getEmailTemplateMainData();
            break;
        case "onboarding":
            mainData = contentModule.getOnboardingMainData();
            break;
        case "offboarding":
            mainData = contentModule.getOffboardingMainData();
            break;
        case "geographical_positions":
            mainData = contentModule.getGeographicalPositionMainData();
            break;
        case "offboarding_types":
            mainData = contentModule.getOffboardingTypesMainData();
            break;
        case "leave_assessment":
            mainData = contentModule.getLeaveAssessmentMainData();
            break;
        case "approval_resignation":
            mainData = contentModule.getApprovalResignationMainData();
            break;
        case "offboarding_reasons":
            mainData = contentModule.getOffboardingReasonsMainData();
            break;
        case "lesson_categories":
            mainData = contentModule.getLessonCategoriesMainData();
            break;
        case "sample_employment_contract":
            mainData = contentModule.getSampleEmployeeContractMainData();
            break;
        case "product_groups":
            mainData = contentModule.getProductGroupsMainData();
            break;
        case "position_groups":
            mainData = contentModule.getPositionGroupsMainData();
            break;
        case "product_list":
            mainData = contentModule.getProductListMainData();
            break;
        case "piece_wage_list":
            mainData = contentModule.getPieceWageListMainData();
            break;
        case "piece_wage_table_field":
            mainData = contentModule.getPieceWageTableFieldMainData();
            break;
        case "payslip_detail_line":
            mainData = contentModule.getPayslipDetailLineMainData();
            break;
        case "pay_percentage":
            mainData = contentModule.getPayPercentageMainData();
            break;
        case "emulation_and_reward":
            mainData = contentModule.getEmulationAndRewardMainData();
            break;
        case "discipline":
            mainData = contentModule.getDisciplineMainData();
            break;
        case "employee_profile":
            mainData = contentModule.getEmployeeProfileMainData();
            break;
        default:
            mainData = null;
    }
    return mainData;
};

/*

contentModule.makeFormData({
    variableType: "system" hoặc "userdefined",
    typeid: typeid,
    formid: nếu form đã được vẽ thì truyền vào formid,
    formContent: nếu form chưa được vẽ thì truyền vào mô tả của form,
    initialValue:   nếu variableType = "system" thì truyền vào record value (ví dụ biến peoples thì truyền vào record tương ứng trong bảng peoples, không có thì không cần truyền)
                    nếu variableType = "userdefined" thì truyền vào valueid (nếu biến đã được nhập giá trị thì valueid > 0, nếu không thì valueid = 0)
    formContainer: form nhập được tạo ra sẽ được gán vào element này,
    typelists: danh sách kiểu dữ liệu
    values: nếu variableType == "userdefined" thì phải truyền vào mảng các record value (trong bảng values) nếu initialValue > 0
});

Function này là promise resolve về 1 funtion getValue dùng để lấy dữ liệu của form, dữ liệu trả về có thể dùng để lưu luôn, không cần xử lý. reject về "error" nếu có lỗi.

*/

contentModule.makeOutputFormData = function(params){
    return new Promise(function(resolve, reject){
        console.log(params);
        ModalElement.show_loading();
        var callbackfunc = function(){
            if (data_module.pendingData.status == "error"){
                ModalElement.alert("Có lỗi trong quá trình khởi tạo dữ liệu");
                return;
            }
            else if (data_module.pendingData.status == "pending") {
                setTimeout(function(){
                    callbackfunc();
                }, 500);
                return;
            }
            var typeid, formid, formContent, initialValue, formContainer, typelists, values, valueDict, variableType;
            variableType = params.variableType;
            typeid = params.typeid;
            formid = params.formid;
            formContent = params.formContent;
            initialValue = params.initialValue;
            formContainer = params.formContainer;
            typelists = params.typelists;
            values = params.values;
            if (!variableType){
                ModalElement.alert({message: "Invalid params: variableType"});
                reject("error");
                return;
            }
            if (!typeid || !formContainer){
                ModalElement.alert({message: "Invalid params: typeid, formContainer"});
                reject("error");
                return;
            }
            if (!formid && formContent){
                ModalElement.alert({message: "Invalid params: formid, formContent"});
                reject("error");
                return;
            }
            var dict = {};
            typelists.forEach(function (elt, index) {
                dict[elt.id] = elt;
            });
            var AssemblerInstance = absol.form.AssemblerInstance;
            var $ = absol.$;
            var _ = absol._;
            var JSZip = absol.JSZip;
            var makeFmFragmentClass = absol.form.makeFmFragmentClass;
            if (formid) {
                var mSignUpFrag = AssemblerInstance.buildFragment({class: formid.toString()});
            }
            else {
                form_module.attachOnCreatedCb(formContent);
                var formName = (formContent.attributes && formContent.attributes.name) || "not_detected";
                var constructor = hr.input_form.fragmentClasses[formName];
                if (constructor) {//có class viết sẵn
                    constructor.prototype.tag = "TempForm" + (new Date()).getTime().toString();
                    constructor.prototype.contentViewData = formContent;
                }
                else {//chưa xác địnhh
                    constructor = absol.form.makeFmFragmentConstructor({
                        tag: "TempForm" + (new Date()).getTime().toString(),
                        contentViewData: formContent
                    });
                    if ((dict[typeid]) && (dict[typeid].type == "array" || dict[typeid].type2 == "array")) {
                        constructor.prototype.onCreated = function () {
                            var myArrayComp = this.findViewByName(typeid.toString());
                            if (!myArrayComp) {
                                var t_id = dict[typeid].content.typeof;
                                myArrayComp = this.findViewByName(t_id);
                            }
                            myArrayComp.on('cmd_insert_row', this.handleCmdInsertRow.bind(this));
                            myArrayComp.on('cmd_remove_row', this.handleCmdRemoveRow.bind(this));
                        };
                        constructor.prototype.handleCmdRemoveRow = function (event) {
                            event.accept(new Promise(function (resolve) {
                                ModalElement.question({
                                    title: LanguageModule.text("txt_warning"),
                                    message: "Bạn có muốn xóa không?",
                                    onclick: function (sel) {
                                        if (sel == 0) {
                                            resolve(true);
                                        }
                                        else {
                                            resolve(false);
                                        }
                                    }
                                });
                            }))
                        };
                        constructor.prototype.handleCmdInsertRow = function (event) {
                            var shareData = this.getContext("shareData");

                            var orgid;

                            if (shareData) {
                                orgid = shareData.orgid;
                            }

                            if (orgid && typeid == -25) event.resolve({type_select_position_orgid: {value: orgid}});
                            else event.resolve({});
                        };
                    }
                }
                absol.form.AssemblerInstance.addConstructor(constructor);
                form.FragmentClass = constructor;
                var mSignUpFrag = AssemblerInstance.buildFragment({class: "TempForm" + (new Date()).getTime().toString()});
            }
            mSignUpFrag.setContext("SHARE_PARAMS", {});
            // if (!mSignUpFrag.domElt.hasClass("as-relative-layout")){
            //     mSignUpFrag.domElt.addStyle({
            //         width: '100%',
            //         height:'100%',
            //         display: 'block'
            //     });
            // }
            DOMElement.removeAllChildren(formContainer);
            formContainer.appendChild(mSignUpFrag.domElt);
            formContainer.formFragment = mSignUpFrag;
            if (params.onPreload) params.onPreload(mSignUpFrag);
            var getValue = function(){
                if (variableType == "system"){
                    var mainData = contentModule.getMainData(typeid, dict);
                    return contentModule.getValueOfForm(mSignUpFrag, typeid, typelists, mainData);
                }
                else if (variableType == "user") {
                    var rs = {};
                    dict[typeid].content.details.forEach(function(elt){
                        rs[elt.localid] = mSignUpFrag.props[elt.localid];
                    });
                    return rs;
                }
                else {
                    return form_module.makeDataToSave(mSignUpFrag, typeid, typelists);
                }
            }
            if (variableType == "system"){
                if (!initialValue) initialValue = {};
                var mainData = contentModule.getMainData(typeid, dict);
                // ModalElement.show_loading();
                resolve(getValue);
                contentModule.setValueOfOutputForm({
                    typelists: typelists,
                    valueContent: initialValue,
                    typeid: typeid,
                    mainData: mainData,
                    isPrintForm: params.isPrintForm,
                    variables: params.variables
                }).then(function(value){
                    if (mSignUpFrag.state === "RUNNING"){
                        mSignUpFrag.props = value;
                        ModalElement.close(-1);
                    }
                    else {
                        mSignUpFrag.onReady = function(){
                            this.props = value;
                            this.onReady = null;
                            ModalElement.close(-1);
                        }
                    }

                });
            }
            else {
                if (!initialValue) initialValue = {};
                resolve(getValue);
                contentModule.setValueOfUserOutputForm({
                    typelists: typelists,
                    valueContent: initialValue,
                    variables: params.variables,
                    typeid: typeid
                }).then(function(value){
                    ModalElement.close(-1);
                    if (mSignUpFrag.state === "RUNNING"){
                        mSignUpFrag.props = value;
                        ModalElement.close(-1);
                    }
                    else {
                        mSignUpFrag.onReady = function(){
                            this.props = value;
                            this.onReady = null;
                            ModalElement.close(-1);
                        }
                    }

                });
            }
        };
        callbackfunc();
    });
};

contentModule.makeFormData = function(params){
    return new Promise(function(resolve, reject){
        console.log(params);
        ModalElement.show_loading();
        var callbackfunc = function(){
            if (data_module.pendingData.status == "error"){
                ModalElement.alert("Có lỗi trong quá trình khởi tạo dữ liệu");
                return;
            }
            else if (data_module.pendingData.status == "pending") {
                setTimeout(function(){
                    callbackfunc();
                }, 500);
                return;
            }
            var typeid, formid, formContent, initialValue, formContainer, typelists, values, valueDict, variableType;
            variableType = params.variableType;
            typeid = params.typeid;
            formid = params.formid;
            formContent = params.formContent;
            initialValue = params.initialValue;
            formContainer = params.formContainer;
            typelists = params.typelists ? params.typelists : data_module.typelists.items;
            values = params.values;
            if (!variableType){
                ModalElement.alert({message: "Invalid params: variableType"});
                reject("error");
                return;
            }
            if (!typeid || !formContainer){
                ModalElement.alert({message: "Invalid params: typeid, formContainer"});
                reject("error");
                return;
            }
            if (!formid && formContent){
                ModalElement.alert({message: "Invalid params: formid, formContent"});
                reject("error");
                return;
            }
            var dict = {};
            typelists.forEach(function (elt, index) {
                dict[elt.id] = elt;
            });
            var AssemblerInstance = absol.form.AssemblerInstance;
            var $ = absol.$;
            var _ = absol._;
            var JSZip = absol.JSZip;
            var makeFmFragmentClass = absol.form.makeFmFragmentClass;
            if (formid) {
                var mSignUpFrag = AssemblerInstance.buildFragment({class: formid.toString()});
            }
            else {
                form_module.attachOnCreatedCb(formContent);
                var formName = (formContent.attributes && formContent.attributes.name) || "not_detected";
                var constructor = hr.input_form.fragmentClasses[formName];
                if (constructor) {//có class viết sẵn
                    constructor.prototype.tag = "TempForm" + (new Date()).getTime().toString();
                    constructor.prototype.contentViewData = formContent;
                }
                else {//chưa xác địnhh
                    constructor = absol.form.makeFmFragmentConstructor({
                        tag: "TempForm" + (new Date()).getTime().toString(),
                        contentViewData: formContent
                    });
                    if ((dict[typeid]) && (dict[typeid].type == "array" || dict[typeid].type2 == "array")) {
                        constructor.prototype.onCreated = function () {
                            var myArrayComp = this.findViewByName(typeid.toString());
                            if (!myArrayComp) {
                                var t_id = dict[typeid].content.typeof;
                                myArrayComp = this.findViewByName(t_id);
                            }
                            myArrayComp.on('cmd_insert_row', this.handleCmdInsertRow.bind(this));
                            myArrayComp.on('cmd_remove_row', this.handleCmdRemoveRow.bind(this));
                        };
                        constructor.prototype.handleCmdRemoveRow = function (event) {
                            event.accept(new Promise(function (resolve) {
                                ModalElement.question({
                                    title: LanguageModule.text("txt_warning"),
                                    message: "Bạn có muốn xóa không?",
                                    onclick: function (sel) {
                                        if (sel == 0) {
                                            resolve(true);
                                        }
                                        else {
                                            resolve(false);
                                        }
                                    }
                                });
                            }))
                        };
                        constructor.prototype.handleCmdInsertRow = function (event) {
                            var shareData = this.getContext("shareData");

                            var orgid;

                            if (shareData) {
                                orgid = shareData.orgid;
                            }

                            if (orgid && typeid == -25) event.resolve({type_select_position_orgid: {value: orgid}});
                            else event.resolve({});
                        };
                    }
                }
                absol.form.AssemblerInstance.addConstructor(constructor);
                form.FragmentClass = constructor;
                var mSignUpFrag = AssemblerInstance.buildFragment({class: "TempForm" + (new Date()).getTime().toString()});
            }
            mSignUpFrag.setContext("SHARE_PARAMS", {});
            // if (!mSignUpFrag.domElt.hasClass("as-relative-layout")){
            //     mSignUpFrag.domElt.addStyle({
            //         width: '100%',
            //         height:'100%',
            //         display: 'block'
            //     });
            // }
            DOMElement.removeAllChildren(formContainer);
            formContainer.appendChild(mSignUpFrag.domElt);
            formContainer.formFragment = mSignUpFrag;
            if (params.onPreload) params.onPreload(mSignUpFrag);
            var getValue = function(alert_value){
                if (variableType == "system") {
                    var mainData = contentModule.getMainData(typeid, dict);
                    return contentModule.getValueOfForm(mSignUpFrag, typeid, typelists, mainData, alert_value == "no_alert" ? true : false);
                }
                else if (variableType == "user") {
                    return contentModule.getValueOfUserForm(mSignUpFrag, typeid, typelists, alert_value == "no_alert" ? true : false);
                    // var rs = {};
                    // dict[typeid].content.details.forEach(function(elt){
                    //     rs[elt.localid] = mSignUpFrag.props[elt.localid];
                    // });
                    // return rs;
                }
                else {
                    return form_module.makeDataToSave(mSignUpFrag, typeid, typelists);
                }
            }
            if (variableType == "system"){
                if (!initialValue) initialValue = {};
                if (initialValue){
                    var mainData = contentModule.getMainData(typeid, dict);
                    // ModalElement.show_loading();
                    resolve(getValue);
                    contentModule.setValueOfForm({
                        typelists: typelists,
                        valueContent: initialValue,
                        typeid: typeid,
                        mainData: mainData
                    }).then(function(value){
                        if (mSignUpFrag.state === "RUNNING"){
                            mSignUpFrag.props = value;
                            ModalElement.close(-1);
                        }
                        else {
                            mSignUpFrag.onReady = function(){
                                this.props = value;
                                this.onReady = null;
                                ModalElement.close(-1);
                            }
                        }

                    });
                }
            }
            else if (variableType == "user") {
                if (!initialValue) initialValue = {};
                // ModalElement.show_loading();
                resolve(getValue);
                contentModule.setValueOfUserForm({
                    typelists: typelists,
                    valueContent: initialValue,
                    typeid: typeid
                }).then(function(value){
                    if (mSignUpFrag.state === "RUNNING"){
                        mSignUpFrag.props = value;
                        ModalElement.close(-1);
                    }
                    else {
                        mSignUpFrag.onReady = function(){
                            this.props = value;
                            this.onReady = null;
                            ModalElement.close(-1);
                        }
                    }
                });
                // mSignUpFrag.props = initialValue;
                // resolve(getValue);
            }
        }
        callbackfunc();
    });
};

contentModule.makeFormData2 = function(params){
    return new Promise(function(resolve, reject){
        var typeid, formid, formContent, initialValue, formContainer, typelists, values, valueDict, variableType;
        variableType = params.variableType;
        typeid = params.typeid;
        formid = params.formid;
        formContent = params.formContent;
        initialValue = params.initialValue;
        formContainer = params.formContainer;
        typelists = params.typelists;
        values = params.values;
        if (!variableType){
            ModalElement.alert({message: "Invalid params: variableType"});
            reject("error");
            return;
        }
        if (!typeid || !formContainer){
            ModalElement.alert({message: "Invalid params: typeid, formContainer"});
            reject("error");
            return;
        }
        if (!formid && formContent){
            ModalElement.alert({message: "Invalid params: formid, formContent"});
            reject("error");
            return;
        }
        var dict = {};
        typelists.forEach(function (elt, index) {
            dict[elt.id] = elt;
        });
        var AssemblerInstance = absol.form.AssemblerInstance;
        var $ = absol.$;
        var _ = absol._;
        var JSZip = absol.JSZip;
        var makeFmFragmentClass = absol.form.makeFmFragmentClass;
        if (formid) {
            var mSignUpFrag = AssemblerInstance.buildFragment({class: formid.toString()});
        }
        else {
            form_module.attachOnCreatedCb(formContent);
            var formName = (formContent.attributes && formContent.attributes.name) || "not_detected";
            var constructor = hr.input_form.fragmentClasses[formName];
            if (constructor) {//có class viết sẵn
                constructor.prototype.tag = "TempForm" + (new Date()).getTime().toString();
                constructor.prototype.contentViewData = formContent;
            }
            else {//chưa xác địnhh
                constructor = absol.form.makeFmFragmentConstructor({
                    tag: "TempForm" + (new Date()).getTime().toString(),
                    contentViewData: formContent
                });
                if ((dict[typeid]) && (dict[typeid].type == "array" || dict[typeid].type2 == "array")) {
                    constructor.prototype.onCreated = function () {
                        var myArrayComp = this.findViewByName(typeid.toString());
                        if (!myArrayComp) {
                            var t_id = dict[typeid].content.typeof;
                            myArrayComp = this.findViewByName(t_id);
                        }
                        myArrayComp.on('cmd_insert_row', this.handleCmdInsertRow.bind(this));
                        myArrayComp.on('cmd_remove_row', this.handleCmdRemoveRow.bind(this));
                    };
                    constructor.prototype.handleCmdRemoveRow = function (event) {
                        event.accept(new Promise(function (resolve) {
                            ModalElement.question({
                                title: LanguageModule.text("txt_warning"),
                                message: "Bạn có muốn xóa không?",
                                onclick: function (sel) {
                                    if (sel == 0) {
                                        resolve(true);
                                    }
                                    else {
                                        resolve(false);
                                    }
                                }
                            });
                        }))
                    };
                    constructor.prototype.handleCmdInsertRow = function (event) {
                        var shareData = this.getContext("shareData");

                        var orgid;

                        if (shareData) {
                            orgid = shareData.orgid;
                        }

                        if (orgid && typeid == -25) event.resolve({type_select_position_orgid: {value: orgid}});
                        else event.resolve({});
                    };
                }
            }
            absol.form.AssemblerInstance.addConstructor(constructor);
            form.FragmentClass = constructor;
            var mSignUpFrag = AssemblerInstance.buildFragment({class: "TempForm" + (new Date()).getTime().toString()});
        }
        // if (!mSignUpFrag.domElt.hasClass("as-relative-layout")){
        //     mSignUpFrag.domElt.addStyle({
        //         width: '100%',
        //         height:'100%',
        //         display: 'block'
        //     });
        // }
        DOMElement.removeAllChildren(formContainer);
        formContainer.appendChild(mSignUpFrag.domElt);
        formContainer.formFragment = mSignUpFrag;
        var getValue = function(){
            if (variableType != "system"){
                return form_module.makeDataToSave(mSignUpFrag, typeid, typelists);
            }
            else {
                // var mainData = contentModule.getMainData(typeid, dict);
                return contentModule.getValueOfForm2(mSignUpFrag.props, typeid, typelists);
            }
        }
        if (variableType != "system"){
            if (!isNaN(initialValue) && initialValue > 0){
                ModalElement.show_loading();
                form_module.makeDataToSet({
                    typelists: typelists,
                    values: values,
                    typeid: typeid,
                    valueid: initialValue
                }).then(function(value){
                    ModalElement.close(-1);
                    mSignUpFrag.props = value;
                    resolve(getValue);
                });
            }
            resolve(getValue);
        }
        else {
            if (!initialValue) initialValue = {};
            if (initialValue){
                ModalElement.show_loading();
                contentModule.setValueOfForm2({
                    typelists: typelists,
                    valueContent: initialValue,
                    typeid: typeid
                }).then(function(value){
                    ModalElement.close(-1);
                    if (mSignUpFrag.state === "RUNNING"){
                        mSignUpFrag.props = value;
                    }
                    else {
                        mSignUpFrag.onReady = function(){
                            this.props = value;
                            this.onReady = null;
                        }
                    }

                    resolve(getValue);
                });
            }
            resolve(getValue);
        }
    });
};

contentModule.getAssetsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    var nameText;
    for (var i = 0; i < host.database.assets.items.length; i++){
        nameText = host.database.assets.items[i].name;
        if (host.database.assets.items[i].specification.length > 0) nameText += " - " + host.database.assets.items[i].specification;
        list.push({
            value: host.database.assets.items[i].id,
            text: nameText
        });
    }
    return list;
};

contentModule.getInstrumentAndToolsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    var nameText;
    for (var i = 0; i < host.database.instruments_and_tools.items.length; i++){
        nameText = host.database.instruments_and_tools.items[i].name;
        if (host.database.instruments_and_tools.items[i].specification.length > 0) nameText += " - " + host.database.instruments_and_tools.items[i].specification;
        list.push({
            value: host.database.instruments_and_tools.items[i].id,
            text: nameText
        });
    }
    return list;
};

contentModule.getAssetsInstrumentAndToolsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    var nameText;
    for (var i = 0; i < host.database.assets.items.length; i++){
        nameText = host.database.assets.items[i].name;
        if (host.database.assets.items[i].specification.length > 0) nameText += " - " + host.database.assets.items[i].specification;
        list.push({
            value: host.database.assets.items[i].id,
            text: nameText
        });
    }
    for (var i = 0; i < host.database.instruments_and_tools.items.length; i++){
        nameText = host.database.instruments_and_tools.items[i].name;
        if (host.database.instruments_and_tools.items[i].specification.length > 0) nameText += " - " + host.database.instruments_and_tools.items[i].specification;
        list.push({
            value: - host.database.instruments_and_tools.items[i].id,
            text: nameText
        });
    }
    var holderForSort = list.map(function(item){
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.text.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });

    list = holderForSort.map(function(holder){
        return holder.item;
    });
    return list;
};

contentModule.getAssetsInstrumentsAndToolsHandoverListSelectMenu = function(host, warehouseid, asset_transactionid){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    var assetsDic = {};
    var instruments_and_toolsDic = {};
    if (asset_transactionid > 0){
        for (var i = 0; i < host.asset_transaction_details.length; i++){
            if (host.asset_transaction_details[i].assetid > 0){
                assetsDic[host.asset_transaction_details[i].assetid] = true;
            }
            else {
                instruments_and_toolsDic[-host.asset_transaction_details[i].assetid] = true;
            }
        }
    }
    var nameText;
    for (var i = 0; i < host.database.assets.items.length; i++){
        if (assetsDic[host.database.assets.items[i].id] || (host.database.assets.items[i].status == "good" && host.database.assets.items[i].location == "" && host.database.assets.items[i].warehouseid == warehouseid)){
            nameText = host.database.assets.items[i].name;
            if (host.database.assets.items[i].specification.length > 0) nameText += " - " + host.database.assets.items[i].specification;
            list.push({
                value: host.database.assets.items[i].id,
                text: nameText
            });
        }
    }
    for (var i = 0; i < host.database.instruments_and_tools.items.length; i++){
        if (host.database.instruments_and_tools.items[i].warehouseid != warehouseid) continue;
        if (instruments_and_toolsDic[host.database.instruments_and_tools.items[i].id] || host.database.instruments_and_tools.items[i].inventory > 0){
            nameText = host.database.instruments_and_tools.items[i].name;
            if (host.database.instruments_and_tools.items[i].specification.length > 0) nameText += " - " + host.database.instruments_and_tools.items[i].specification;
            list.push({
                value: - host.database.instruments_and_tools.items[i].id,
                text: nameText
            });
        }
    }
    var holderForSort = list.map(function(item){
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.text.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });

    list = holderForSort.map(function(holder){
        return holder.item;
    });
    return list;
};

contentModule.getAssetsHandoverListSelectMenu = function(host, warehouseid, asset_transactionid){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    var assetsDic = {};
    if (asset_transactionid > 0){
        for (var i = 0; i < host.asset_transaction_details.length; i++){
            assetsDic[host.asset_transaction_details[i].assetid] = true;
        }
    }
    var nameText;
    for (var i = 0; i < host.database.assets.items.length; i++){
        if ((assetsDic[host.database.assets.items[i].id] && host.database.assets.items[i].warehouseid == warehouseid) || (host.database.assets.items[i].status == "good" && host.database.assets.items[i].location == "" && host.database.assets.items[i].warehouseid == warehouseid)){
            nameText = host.database.assets.items[i].name;
            if (host.database.assets.items[i].specification.length > 0) nameText += " - " + host.database.assets.items[i].specification;
            list.push({
                value: host.database.assets.items[i].id,
                text: nameText
            });
        }
    }
    var holderForSort = list.map(function(item){
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.text.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });

    list = holderForSort.map(function(holder){
        return holder.item;
    });
    return list;
};

contentModule.getAssetsListSelectMenuForProcedure = function(assets){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    var nameText;
    for (var i = 0; i < assets.length; i++){
        if (assets[i].status == "good" && assets[i].location == ""){
            nameText = assets[i].name;
            if (assets[i].specification.length > 0) nameText += " - " + assets[i].specification;
            list.push({
                value: assets[i].id,
                text: nameText
            });
        }
    }
    var holderForSort = list.map(function(item){
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.text.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });

    list = holderForSort.map(function(holder){
        return holder.item;
    });
    return list;
};

contentModule.getInstrumentAndToolsHandoverListSelectMenu = function(host, warehouseid, asset_transactionid){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    var instruments_and_toolsDic = {};
    if (asset_transactionid > 0){
        for (var i = 0; i < host.asset_transaction_details.length; i++){
            instruments_and_toolsDic[host.asset_transaction_details[i].assetid] = true;
        }
    }
    var nameText;
    for (var i = 0; i < host.database.instruments_and_tools.items.length; i++){
        if (host.database.instruments_and_tools.items[i].warehouseid != warehouseid) continue;
        if (instruments_and_toolsDic[host.database.instruments_and_tools.items[i].id] || host.database.instruments_and_tools.items[i].inventory > 0){
            nameText = host.database.instruments_and_tools.items[i].name;
            if (host.database.instruments_and_tools.items[i].specification.length > 0) nameText += " - " + host.database.instruments_and_tools.items[i].specification;
            list.push({
                value: host.database.instruments_and_tools.items[i].id,
                text: nameText
            });
        }
    }
    var holderForSort = list.map(function(item){
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.text.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });

    list = holderForSort.map(function(holder){
        return holder.item;
    });
    return list;
};

contentModule.getAssetsRecallListSelectMenu = function(host, employeeid, asset_transactionid){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    var assetsDic = {};
    var instruments_and_toolsDic = {};
    if (asset_transactionid > 0){
        // for (var i = 0; i < host.asset_transaction_details.length; i++){
        //     if (host.asset_transaction_details[i].assetid > 0){
        //         assetsDic[host.asset_transaction_details[i].assetid] = true;
        //     }
        //     else {
        //         instruments_and_toolsDic[host.asset_transaction_details[i].assetid] = true;
        //     }
        // }
    }
    var nameText;
    for (var i = 0; i < host.database.assets.items.length; i++){
        if (assetsDic[host.database.assets.items[i].id] || (host.database.assets.items[i].location == "employee" && host.database.assets.items[i].locationid == employeeid)){
            nameText = host.database.assets.items[i].name;
            if (host.database.assets.items[i].specification.length > 0) nameText += " - " + host.database.assets.items[i].specification;
            list.push({
                value: host.database.assets.items[i].id,
                text: nameText
            });
        }
    }
    var holderForSort = list.map(function(item){
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.text.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });

    list = holderForSort.map(function(holder){
        return holder.item;
    });
    return list;
};

contentModule.getWarehousesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.warehouses.items.length; i++){
        list.push({
            value: host.database.warehouses.items[i].id,
            text: host.database.warehouses.items[i].name,
            noSelect: host.database.warehouses.items[i].available == 0
        });
    }
    return list;
};

contentModule.getAllowancePolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.allowance_policy_groups.items.length; i++){
        if (!host.database.allowance_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.allowance_policy_groups.items[i].id,
            text: host.database.allowance_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getLessonCategoriesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.lesson_categories.items.length; i++){
        list.push({
            value: host.database.lesson_categories.items[i].id,
            text: host.database.lesson_categories.items[i].name,
            noView: !host.database.lesson_categories.items[i].available
        });
    }
    return list;
};

contentModule.getBonusPolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.bonus_policy_groups.items.length; i++){
        if (!host.database.bonus_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.bonus_policy_groups.items[i].id,
            text: host.database.bonus_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getPieceWagePolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.piece_wage_policy_groups.items.length; i++){
        if (!host.database.piece_wage_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.piece_wage_policy_groups.items[i].id,
            text: host.database.piece_wage_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getAttendanceClockPolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.attendance_clock_policy_groups.items.length; i++){
        if (!host.database.attendance_clock_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.attendance_clock_policy_groups.items[i].id,
            text: host.database.attendance_clock_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getStandardWorkdayPolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.standard_workday_policy_groups.items.length; i++){
        if (!host.database.standard_workday_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.standard_workday_policy_groups.items[i].id,
            text: host.database.standard_workday_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getWorkFlowGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.work_flow_groups.items.length; i++){
        if (!host.database.work_flow_groups.items[i].available) continue;
        list.push({
            value: host.database.work_flow_groups.items[i].id,
            text: host.database.work_flow_groups.items[i].name
        });
    }
    return list;
};

contentModule.getWorkFlowsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.work_flows.items.length; i++){
        if (!host.database.work_flows.items[i].available) continue;
        list.push({
            value: host.database.work_flows.items[i].id,
            text: host.database.work_flows.items[i].name
        });
    }
    return list;
};

contentModule.getObjectsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.objects.items.length; i++){
        list.push({
            value: host.database.objects.items[i].id,
            text: host.database.objects.items[i].name
        });
    }
    return list;
};

contentModule.getPayrollCycleListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.payroll_cycle.items.length; i++){
        list.push({
            value: host.database.payroll_cycle.items[i].id,
            text: host.database.payroll_cycle.items[i].name
        });
    }
    return list;
};

contentModule.getTaskListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.task.items.length; i++){
        list.push({
            value: host.database.task.items[i].id,
            text: host.database.task.items[i].name
        });
    }
    return list;
};

contentModule.getMeetingListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.meeting.items.length; i++){
        list.push({
            value: host.database.meeting.items[i].id,
            text: host.database.meeting.items[i].name
        });
    }
    return list;
};

contentModule.getPartnerClassListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.partner_class.items.length; i++){
        if (!host.database.partner_class.items[i].available) continue;
        list.push({
            value: host.database.partner_class.items[i].id,
            text: host.database.partner_class.items[i].name
        });
    }
    return list;
};

contentModule.getPartnerListSelectMenu = function(host, notSelectValue){
    var list = [];
    list.push({
        value: 0,
        text: LanguageModule.text("txt_select_value")
    });
    var item;
    for (var i = 0; i < host.database.partner.items.length; i++){
        item = {
            value: host.database.partner.items[i].id,
            text: host.database.partner.items[i].name.substr(0, 50)
        };
        list.push(item);
    }
    return list;
};

contentModule.getContactListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.contact.items.length; i++){
        if (!host.database.contact.items[i].available) continue;
        list.push({
            value: host.database.contact.items[i].id,
            text: host.database.contact.items[i].name
        });
    }
    return list;
};

contentModule.getDocumentTypesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.document_types.items.length; i++){
        if (!host.database.document_types.items[i].available) continue;
        list.push({
            value: host.database.document_types.items[i].id,
            text: host.database.document_types.items[i].name
        });
    }
    return list;
};

contentModule.getOrgsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.orgs.items.length; i++){
        list.push({
            value: host.database.orgs.items[i].id,
            text: host.database.orgs.items[i].name
        });
    }
    return list;
};

contentModule.getDocumentTypesListSelectMenuFilter = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_all_document_type")
    }];
    for (var i = 0; i < host.database.document_types.items.length; i++){
        if (!host.database.document_types.items[i].available) continue;
        list.push({
            value: host.database.document_types.items[i].id,
            text: host.database.document_types.items[i].name
        });
    }
    return list;
};

contentModule.makeDocumentGroupsIndex = function(host){
    var k, t = [];
    var holderForSort = host.database.document_groups.items.map(function(item){
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.name.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });
    host.database.document_groups.items = holderForSort.map(function(holder){
        return holder.item;
    });

    for (var i = 0; i < host.database.document_groups.items.length; i++){
        host.database.document_groups.items[i].childIndexList = [];
    }
    var documentGroupDic = contentModule.makeDictionaryIndex(host.database.document_groups.items);
    var k;
    for (var i = 0; i < host.database.document_groups.items.length; i++){
        if (host.database.document_groups.items[i].parentid == 0) continue;
        k = documentGroupDic[host.database.document_groups.items[i].parentid];
        if (k !== undefined) host.database.document_groups.items[k].childIndexList.push(i);
    }
};

contentModule.makeDocumentPropertiesIndex = function(host){
    for (var i = 0; i < host.database.document_properties.items.length; i++){
        host.database.document_properties.items[i].childIndexList = [];
    }
    var documentGroupDic = contentModule.makeDictionaryIndex(host.database.document_properties.items);
    var k;
    for (var i = 0; i < host.database.document_properties.items.length; i++){
        if (host.database.document_properties.items[i].parentid == 0) continue;
        k = documentGroupDic[host.database.document_properties.items[i].parentid];
        if (k !== undefined) host.database.document_properties.items[k].childIndexList.push(i);
    }
};

contentModule.makeDocumentFoldersIndex = function(host){
    var k, t = [];
    var holderForSort = host.database.document_folders.items.map(function(item){
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.name.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });
    host.database.document_folders.items = holderForSort.map(function(holder){
        return holder.item;
    });

    for (var i = 0; i < host.database.document_folders.items.length; i++){
        host.database.document_folders.items[i].childIndexList = [];
    }
    var documentGroupDic = contentModule.makeDictionaryIndex(host.database.document_folders.items);
    var k;
    for (var i = 0; i < host.database.document_folders.items.length; i++){
        if (host.database.document_folders.items[i].parentid == 0) continue;
        k = documentGroupDic[host.database.document_folders.items[i].parentid];
        if (k !== undefined) host.database.document_folders.items[k].childIndexList.push(i);
    }
};

contentModule.getDocumentGroupsListSelectTreeMenu = function(host){
    function getGroupItem(index){
        var items = [];
        for (var i = 0; i < host.database.document_groups.items[index].childIndexList.length; i++){
            items.push(getGroupItem(host.database.document_groups.items[index].childIndexList[i]));
        }
        var res = {
            value: host.database.document_groups.items[index].id,
            text: host.database.document_groups.items[index].name,
            items: items
        };
        return res;
    };
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.document_groups.items.length; i++){
        if (host.database.document_groups.items[i].parentid != 0) continue;
        list.push(getGroupItem(i));
    }
    return list;
};

contentModule.getDocumentGroupsListSelectTreeMenuFilter = function(host){
    function getGroupItem(index){
        var items = [];
        for (var i = 0; i < host.database.document_groups.items[index].childIndexList.length; i++){
            items.push(getGroupItem(host.database.document_groups.items[index].childIndexList[i]));
        }
        var res = {
            value: host.database.document_groups.items[index].id,
            text: host.database.document_groups.items[index].name,
            items: items
        };
        return res;
    };
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_all_document_group")
    }];
    for (var i = 0; i < host.database.document_groups.items.length; i++){
        if (host.database.document_groups.items[i].parentid != 0) continue;
        list.push(getGroupItem(i));
    }
    return list;
};

contentModule.getDocumentFoldersListSelectTreeMenu = function(host){
    function getFolderItem(index){
        var items = [];
        for (var i = 0; i < host.database.document_folders.items[index].childIndexList.length; i++){
            items.push(getFolderItem(host.database.document_folders.items[index].childIndexList[i]));
        }
        var res = {
            value: host.database.document_folders.items[index].id,
            text: host.database.document_folders.items[index].name,
            items: items
        };
        return res;
    };
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.document_folders.items.length; i++){
        if (host.database.document_folders.items[i].parentid != 0) continue;
        list.push(getFolderItem(i));
    }
    return list;
};

contentModule.getDocumentFoldersSelectTreeMenu = function(host){
    function getFolderItem(index){
        var items = [];
        for (var i = 0; i < host.database.document_folders.items[index].childIndexList.length; i++){
            items.push(getFolderItem(host.database.document_folders.items[index].childIndexList[i]));
        }
        var res = {
            value: host.database.document_folders.items[index].id,
            text: host.database.document_folders.items[index].name,
            items: items
        };
        return res;
    };
    var list = [{value: 0, text: ""}];
    for (var i = 0; i < host.database.document_folders.items.length; i++){
        if (host.database.document_folders.items[i].parentid != 0) continue;
        list.push(getFolderItem(i));
    }
    return list;
};

contentModule.getOtherLiabilityPolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.other_liability_policy_groups.items.length; i++){
        if (!host.database.other_liability_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.other_liability_policy_groups.items[i].id,
            text: host.database.other_liability_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getOtherPolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.other_policy_groups.items.length; i++){
        if (!host.database.other_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.other_policy_groups.items[i].id,
            text: host.database.other_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getPoliciesSelectMenu = function(host){
    var policiesType = {
        advance_payment_policies: 'Tạm ứng',
        allowance_policies: 'Trợ cấp',
        attendance_clock_policies: 'Chấm công',
        benefit_policies: 'Phúc lợi',
        bonus_policies: 'Thưởng',
        insurance_policies: 'Bảo hiểm',
        late_early_checkin_policies: 'Đi muộn về sớm',
        leave_policies: 'Nghỉ ngày',
        overtime_policies: 'Làm thêm',
        piece_wage_policies: 'Lương sản phẩm',
        punishment_policies: 'Phạt',
        standard_workday_policies: 'Công chuẩn',
        trade_union_policies: 'Công đoàn',
        tax_policies: 'Thuế',
        other_liability_policies: 'Nghĩa vụ khác',
        other_policies: 'Chính sách khác'
    };
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value"),
        isLeaf: true
    }];
    var keys = Object.keys(policiesType);
    keys.forEach((cur) => {
        var items = [];
        for (var i = 0; i < host.database[cur].items.length; i++){
            if (!host.database[cur].items[i].available) continue;
            list.push({
                value: host.database[cur].items[i].id + "_" + cur,
                text: host.database[cur].items[i].name,
                isLeaf: true
            });
        }
        list.push({
            value: cur,
            text: policiesType[cur],
            items: items
        });
    });

    return list;
};

contentModule.getSalaryPolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.salary_policy_groups.items.length; i++){
        if (!host.database.salary_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.salary_policy_groups.items[i].id,
            text: host.database.salary_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getTradeUnionPolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.trade_union_policy_groups.items.length; i++){
        if (!host.database.trade_union_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.trade_union_policy_groups.items[i].id,
            text: host.database.trade_union_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getOvertimePolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.overtime_policy_groups.items.length; i++){
        if (!host.database.overtime_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.overtime_policy_groups.items[i].id,
            text: host.database.overtime_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getOffboardingTypeListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.offboarding_types.items.length; i++){
        if (!host.database.offboarding_types.items[i].available) continue;
        list.push({
            value: host.database.offboarding_types.items[i].id,
            text: host.database.offboarding_types.items[i].name
        });
    }
    return list;
};

contentModule.getOffboardingReasonListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.offboarding_reasons.items.length; i++){
        if (!host.database.offboarding_reasons.items[i].available) continue;
        list.push({
            value: host.database.offboarding_reasons.items[i].id,
            text: host.database.offboarding_reasons.items[i].name
        });
    }
    return list;
};

contentModule.getPunishmentPolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.punishment_policy_groups.items.length; i++){
        if (!host.database.punishment_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.punishment_policy_groups.items[i].id,
            text: host.database.punishment_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getAssetCategoryListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.asset_category.items.length; i++){
        if (!host.database.asset_category.items[i].available) continue;
        list.push({
            value: host.database.asset_category.items[i].id,
            text: host.database.asset_category.items[i].name
        });
    }
    return list;
};

contentModule.getAssetsInstrumentAndToolsCategoryListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.instruments_and_tools_category.items.length; i++){
        if (!host.database.instruments_and_tools_category.items[i].available) continue;
        list.push({
            value: host.database.instruments_and_tools_category.items[i].id,
            text: host.database.instruments_and_tools_category.items[i].name
        });
    }
    return list;
};

contentModule.getProjectsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.projects.items.length; i++){
        if (!host.database.projects.items[i].available) continue;
        list.push({
            value: host.database.projects.items[i].id,
            text: host.database.projects.items[i].name
        });
    }
    return list;
};

contentModule.getTaxPolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.tax_policy_groups.items.length; i++){
        if (!host.database.tax_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.tax_policy_groups.items[i].id,
            text: host.database.tax_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getAdvancePaymentPolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.advance_payment_policy_groups.items.length; i++){
        if (!host.database.advance_payment_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.advance_payment_policy_groups.items[i].id,
            text: host.database.advance_payment_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getLateEarlyCheckinPolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.late_early_checkin_policy_groups.items.length; i++){
        if (!host.database.late_early_checkin_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.late_early_checkin_policy_groups.items[i].id,
            text: host.database.late_early_checkin_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getBenefitPolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.benefit_policy_groups.items.length; i++){
        if (!host.database.benefit_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.benefit_policy_groups.items[i].id,
            text: host.database.benefit_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getShiftsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    var content_worktime, timeText;
    for (var i = 0; i < host.database.shifts.items.length; i++){
        if (!host.database.shifts.items[i].available) continue;
        content_worktime = EncodingClass.string.toVariable(host.database.shifts.items[i].content_worktime);
        timeText = absol.datetime.formatTimeRange24(content_worktime.working_time);
        list.push({
            value: host.database.shifts.items[i].id,
            text: host.database.shifts.items[i].name + " (" + timeText + ")"
        });
    }
    return list;
};

contentModule.getTimesheetsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    var content_worktime, timeText;
    for (var i = 0; i < host.database.timesheet.items.length; i++){
        list.push({
            value: host.database.timesheet.items[i].id,
            text: host.database.timesheet.items[i].name
        });
    }
    return list;
};

contentModule.getShiftsListSelectBox = function(host){
    var list = [{value: 0, text: LanguageModule.text("txt_all_shift")}];
    for (var i = 0; i < host.database.shifts.items.length; i++){
        if (!host.database.shifts.items[i].available) continue;
        list.push({
            value: host.database.shifts.items[i].id,
            text: host.database.shifts.items[i].name
        });
    }
    return list;
};

contentModule.getPartnerClassListSelectBox = function(host){
    var list = [];
    for (var i = 0; i < host.database.partner_class.items.length; i++){
        if (!host.database.partner_class.items[i].available) continue;
        list.push({
            value: host.database.partner_class.items[i].id,
            text: host.database.partner_class.items[i].name
        });
    }
    return list;
};

contentModule.getLeavePolicyGroupsListSelectMenu = function(host){
    var holderForSort = host.database.leave_policy_groups.items.map(function(item){
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.name.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });

    host.database.leave_policy_groups.items = holderForSort.map(function(holder){
        return holder.item;
    });
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.leave_policy_groups.items.length; i++){
        if (!host.database.leave_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.leave_policy_groups.items[i].id,
            text: host.database.leave_policy_groups.items[i].name,
            key: host.database.leave_policy_groups.items[i].key
        });
    }
    return list;
};

contentModule.getInsurancePolicyGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.insurance_policy_groups.items.length; i++){
        if (!host.database.insurance_policy_groups.items[i].available) continue;
        list.push({
            value: host.database.insurance_policy_groups.items[i].id,
            text: host.database.insurance_policy_groups.items[i].name
        });
    }
    return list;
};

contentModule.getTrainingProgramGroupsListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.training_program_groups.items.length; i++){
        if (!host.database.training_program_groups.items[i].available) continue;
        list.push({
            value: host.database.training_program_groups.items[i].id,
            text: host.database.training_program_groups.items[i].name
        });
    }
    return list;
};

contentModule.makeAsset_handoverData = function(host){
    for (var i = 0; i < host.database.asset_transactions.items.length; i++){
        host.database.asset_transactions.items[i].details = [];
    }
    var asset_transactionsDic = contentModule.makeDictionaryIndex(host.database.asset_transactions.items);
    var k;
    for (var i = 0; i < host.database.asset_transaction_details.items.length; i++){
        k = asset_transactionsDic[host.database.asset_transaction_details.items[i].asset_transactionid];
        if (k === undefined) continue;
        host.database.asset_transactions.items[k].details.push({
            assetid: host.database.asset_transaction_details.items[i].assetid,
            status: host.database.asset_transaction_details.items[i].status,
            amount: host.database.asset_transaction_details.items[i].amount,
            comment: host.database.asset_transaction_details.items[i].comment
        });
    }
};

contentModule.makeInstruments_and_tools_handoverData = function(host){
    for (var i = 0; i < host.database.asset_transactions.items.length; i++){
        host.database.asset_transactions.items[i].details = [];
    }
    var asset_transactionsDic = contentModule.makeDictionaryIndex(host.database.asset_transactions.items);
    var k;
    for (var i = 0; i < host.database.asset_transaction_details.items.length; i++){
        k = asset_transactionsDic[host.database.asset_transaction_details.items[i].asset_transactionid];
        if (k === undefined) continue;
        host.database.asset_transactions.items[k].details.push({
            assetid: host.database.asset_transaction_details.items[i].assetid,
            amount: host.database.asset_transaction_details.items[i].amount,
            comment: host.database.asset_transaction_details.items[i].comment
        });
    }
};

contentModule.makeAsset_recallData = function(host){
    for (var i = 0; i < host.database.asset_transactions.items.length; i++){
        host.database.asset_transactions.items[i].details = [];
    }
    var asset_transactionsDic = contentModule.makeDictionaryIndex(host.database.asset_transactions.items);
    var k;
    for (var i = 0; i < host.database.asset_transaction_details.items.length; i++){
        k = asset_transactionsDic[host.database.asset_transaction_details.items[i].asset_transactionid];
        if (k === undefined) continue;
        host.database.asset_transactions.items[k].details.push({
            assetid: host.database.asset_transaction_details.items[i].assetid,
            status: host.database.asset_transaction_details.items[i].status,
            comment: host.database.asset_transaction_details.items[i].comment
        });
    }
};

contentModule.getInsurancePoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.insurance_policies.items.length; i++){
        if (!host.database.insurance_policies.items[i].available) continue;
        list.push({
            value: host.database.insurance_policies.items[i].id,
            text: host.database.insurance_policies.items[i].name
        });
    }
    return list;
};

contentModule.getTaxPoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.tax_policies.items.length; i++){
        if (!host.database.tax_policies.items[i].available) continue;
        list.push({
            value: host.database.tax_policies.items[i].id,
            text: host.database.tax_policies.items[i].name
        });
    }
    return list;
};

contentModule.getTradeUnionPoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.trade_union_policies.items.length; i++){
        if (!host.database.trade_union_policies.items[i].available) continue;
        list.push({
            value: host.database.trade_union_policies.items[i].id,
            text: host.database.trade_union_policies.items[i].name
        });
    }
    return list;
};

contentModule.getLeavePoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.leave_policies.items.length; i++){
        if (!host.database.leave_policies.items[i].available) continue;
        list.push({
            value: host.database.leave_policies.items[i].id,
            text: host.database.leave_policies.items[i].name
        });
    }
    return list;
};

contentModule.getBenefitPoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.benefit_policies.items.length; i++){
        if (!host.database.benefit_policies.items[i].available) continue;
        list.push({
            value: host.database.benefit_policies.items[i].id,
            text: host.database.benefit_policies.items[i].name
        });
    }
    return list;
};

contentModule.getAllowancePoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.allowance_policies.items.length; i++){
        if (!host.database.allowance_policies.items[i].available) continue;
        list.push({
            value: host.database.allowance_policies.items[i].id,
            text: host.database.allowance_policies.items[i].name
        });
    }
    return list;
};

contentModule.getBonusPoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.bonus_policies.items.length; i++){
        if (!host.database.bonus_policies.items[i].available) continue;
        list.push({
            value: host.database.bonus_policies.items[i].id,
            text: host.database.bonus_policies.items[i].name
        });
    }
    return list;
};

contentModule.getPieceWagePoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.piece_wage_policies.items.length; i++){
        if (!host.database.piece_wage_policies.items[i].available) continue;
        list.push({
            value: host.database.piece_wage_policies.items[i].id,
            text: host.database.piece_wage_policies.items[i].name
        });
    }
    return list;
};

contentModule.getAttendanceClockPoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.attendance_clock_policies.items.length; i++){
        if (!host.database.attendance_clock_policies.items[i].available) continue;
        list.push({
            value: host.database.attendance_clock_policies.items[i].id,
            text: host.database.attendance_clock_policies.items[i].name
        });
    }
    return list;
};

contentModule.getPieceWagePoliciesSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value"),
        isLeaf: true
    }];
    var dict = {};
    for (var i = 0; i < host.database.piece_wage_policy_groups.items.length; i++){
        // if (!host.database.product_groups.items[i].available) continue;
        dict[host.database.piece_wage_policy_groups.items[i].id] = list.length;
        list.push({
            value: "g_" + host.database.piece_wage_policy_groups.items[i].id,
            text: host.database.piece_wage_policy_groups.items[i].name,
            items: []
        });
    }
    for (var i = 0; i < host.database.piece_wage_policies.items.length; i++){
        if (dict[host.database.piece_wage_policies.items[i].groupid] === undefined) continue;
        list[dict[host.database.piece_wage_policies.items[i].groupid]].items.push({
            value: host.database.piece_wage_policies.items[i].id,
            text: host.database.piece_wage_policies.items[i].name,
            isLeaf: true
        });
    }
    return list;
};

contentModule.getAttendanceClockPoliciesSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value"),
        isLeaf: true
    }];
    var dict = {};
    for (var i = 0; i < host.database.attendance_clock_policy_groups.items.length; i++){
        // if (!host.database.product_groups.items[i].available) continue;
        dict[host.database.attendance_clock_policy_groups.items[i].id] = list.length;
        list.push({
            value: "g_" + host.database.attendance_clock_policy_groups.items[i].id,
            text: host.database.attendance_clock_policy_groups.items[i].name,
            items: []
        });
    }
    for (var i = 0; i < host.database.attendance_clock_policies.items.length; i++){
        if (dict[host.database.attendance_clock_policies.items[i].groupid] === undefined) continue;
        list[dict[host.database.attendance_clock_policies.items[i].groupid]].items.push({
            value: host.database.attendance_clock_policies.items[i].id,
            text: host.database.attendance_clock_policies.items[i].name,
            isLeaf: true
        });
    }
    return list;
};

contentModule.getProductGroupsSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.product_groups.items.length; i++){
        // if (!host.database.product_groups.items[i].available) continue;
        list.push({
            value: host.database.product_groups.items[i].id,
            text: host.database.product_groups.items[i].name
        });
    }
    return list;
};

contentModule.getPositionGroupsSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.position_groups.items.length; i++){
        // if (!host.database.product_groups.items[i].available) continue;
        list.push({
            value: host.database.position_groups.items[i].id,
            text: host.database.position_groups.items[i].name
        });
    }
    return list;
};

contentModule.getProductListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value"),
        isLeaf: true
    }];
    var dict = {};
    for (var i = 0; i < host.database.product_groups.items.length; i++){
        // if (!host.database.product_groups.items[i].available) continue;
        dict[host.database.product_groups.items[i].id] = list.length;
        list.push({
            value: "g_" + host.database.product_groups.items[i].id,
            text: host.database.product_groups.items[i].name,
            items: []
        });
    }
    for (var i = 0; i < host.database.products.items.length; i++){
        if (dict[host.database.products.items[i].groupid] === undefined) continue;
        list[dict[host.database.products.items[i].groupid]].items.push({
            value: host.database.products.items[i].id,
            text: host.database.products.items[i].name,
            isLeaf: true
        });
    }

    return list;
};

contentModule.getStandardWorkdayPoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.standard_workday_policies.items.length; i++){
        if (!host.database.standard_workday_policies.items[i].available) continue;
        list.push({
            value: host.database.standard_workday_policies.items[i].id,
            text: host.database.standard_workday_policies.items[i].name
        });
    }
    return list;
};

contentModule.getOvertimePoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.overtime_policies.items.length; i++){
        if (!host.database.overtime_policies.items[i].available) continue;
        list.push({
            value: host.database.overtime_policies.items[i].id,
            text: host.database.overtime_policies.items[i].name
        });
    }
    return list;
};

contentModule.getPunishmentPoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.punishment_policies.items.length; i++){
        if (!host.database.punishment_policies.items[i].available) continue;
        list.push({
            value: host.database.punishment_policies.items[i].id,
            text: host.database.punishment_policies.items[i].name
        });
    }
    return list;
};

contentModule.getAdvancePaymentPoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.advance_payment_policies.items.length; i++){
        if (!host.database.advance_payment_policies.items[i].available) continue;
        list.push({
            value: host.database.advance_payment_policies.items[i].id,
            text: host.database.advance_payment_policies.items[i].name
        });
    }
    return list;
};

contentModule.getLateEarlyCheckinPoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.late_early_checkin_policies.items.length; i++){
        if (!host.database.late_early_checkin_policies.items[i].available) continue;
        list.push({
            value: host.database.late_early_checkin_policies.items[i].id,
            text: host.database.late_early_checkin_policies.items[i].name
        });
    }
    return list;
};

contentModule.getSalaryPoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.salary_policies.items.length; i++){
        if (!host.database.salary_policies.items[i].available) continue;
        list.push({
            value: host.database.salary_policies.items[i].id,
            text: host.database.salary_policies.items[i].name
        });
    }
    return list;
};

contentModule.getOtherLiabilityPoliciesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.other_liability_policies.items.length; i++){
        if (!host.database.other_liability_policies.items[i].available) continue;
        list.push({
            value: host.database.other_liability_policies.items[i].id,
            text: host.database.other_liability_policies.items[i].name
        });
    }
    return list;
};

contentModule.getEmploymentContractTypesListSelectMenu = function(host){
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.employment_contract_types.items.length; i++){
        if (!host.database.employment_contract_types.items[i].available) continue;
        list.push({
            value: host.database.employment_contract_types.items[i].id,
            key: host.database.employment_contract_types.items[i].key,
            text: host.database.employment_contract_types.items[i].name
        });
    }
    return list;
};
contentModule.getAssetStatusList = function(){
    return [
        {value: "good", text: LanguageModule.text("txt_good")},
        {value: "liquidate", text: LanguageModule.text("txt_liquidated")},
        {value: "missing", text: LanguageModule.text("txt_missing")},
        {value: "broken", text: LanguageModule.text("txt_broken")}
    ];
};



contentModule.getAssetStatusName = function(status){
    var res = contentModule.getAssetStatusList();
    for (var i = 0; i < res.length; i++){
        if (res[i].value == status){
            return res[i].text;
        }
    }
    return "";
};

// contentModule.getDependentPersonSex = function(host, sex, typeid){
contentModule.getFamilyMemberSex = function(host, sex, typeid){
    var list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == "type_family_members_sex"){
            typeid = list[i].type;
            break;
        }
    }
    list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == sex) return list[i].text;
    }
    return "-";
};

contentModule.getSalary_payment_methodName = function(host, payment_method, typeid){
    var list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == "type_salary_policy_payment_method"){
            typeid = list[i].type;
            break;
        }
    }
    list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == payment_method) return list[i].text;
    }
    return "-";
};

contentModule.getEducationHistoryDegree = function(host, degree, typeid){
    var list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == "type_education_history_degree"){
            typeid = list[i].type;
            break;
        }
    }
    list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == degree) return list[i].text;
    }
    return "-";
};

contentModule.getSkillLevel = function(host, level, typeid){
    var list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == "type_skill_level"){
            typeid = list[i].type;
            break;
        }
    }
    list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == level) return list[i].text;
    }
    return "-";
};

contentModule.getPhoneType = function(host, type, typeid){
    var list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == "type_phone_type"){
            typeid = list[i].type;
            break;
        }
    }
    list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == type) return list[i].text;
    }
    return "-";
};

contentModule.getEmailType = function(host, type, typeid){
    var list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == "type_email_type"){
            typeid = list[i].type;
            break;
        }
    }
    list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == type) return list[i].text;
    }
    return "-";
};

contentModule.getPersonalDocumentType = function(host, type, typeid){
    var list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == "type_personal_document_type"){
            typeid = list[i].type;
            break;
        }
    }
    list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == type) return list[i].text;
    }
    return "-";
};

contentModule.getTaxType = function(host, tax_type, typeid){
    var list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == "type_tax_policy_tax_type"){
            typeid = list[i].type;
            if (typeid == "union") typeid = list[i].typeOfUnion;
            break;
        }
    }
    list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == tax_type) return list[i].text;
    }
    return "-";
};


contentModule.getPositionNameByEmployee = function(host, id){
    var index = host.database.employees.getIndex(id);
    if (index < 0) return "";
    return host.database.employees.items[index].positionName;
};


contentModule.getConcurrentPositionNameByEmployee = function(host, id){
    var index = host.database.employees.getIndex(id);
    if (index < 0) return "";
    return host.database.employees.items[index].concurrent_positionName;
};

contentModule.getNoteOfDecicionsSalaryByEmployee = function(host, id){
    var index = host.database.employees.getIndex(id);
    if (index < 0) return "";
    var res = LanguageModule.text("txt_department") + ": ";
    var oIndex = host.database.orgs.getIndex(host.database.employees.items[index].orgid);
    if (oIndex < 0) return "";
    res += host.database.orgs.items[oIndex].name;
    if (host.database.employees.items[index].positionName != ""){
        res += ", " + LanguageModule.text("txt_position") + ": " + host.database.employees.items[index].positionName;
    }
    if (host.database.employees.items[index].concurrent_positionName != ""){
        res += ", " + LanguageModule.text("txt_concurrent_position") + ": " + host.database.employees.items[index].concurrent_positionName;
    }
    return res;
};

contentModule.getApproversTextOfPolicy = function(host, type, policyid, employeeid, number_of_day_off){
    return new Promise(function(resolve, reject){
        var pIndex = host.database[type + "_policies"].getIndex(policyid);
        if (pIndex < 0){
            resolve("");
            return;
        }
        if (!employeeid){
            resolve("");
            return;
        }
        var f1 = function(){
            var eEx = {};
            var getText = function(employeeid){
                if (eEx[employeeid]) return;
                var tIndex, uid, uIndex;
                tIndex = employeeDic[employeeid];
                if (tIndex >= 0){
                    res += ", " + host.database.employees.items[tIndex].fullname;
                }
                eEx[employeeid] = true;
            };
            var employeeDic = contentModule.makeDictionaryIndex(host.database.employees.items);
            var res = "";
            if (host.database[type + "_policies"].items[pIndex].direct_manager_approves_first){
                if (host.employeeOfMe.indexOf(employeeid) < 0){
                    for (var i = 0; i < direct_manageOfYou.length; i++){
                        getText(direct_manageOfYou[i]);
                    }
                }
                else {
                    for (var i = 0; i < host.directManageOfMe.length; i++){
                        getText(host.directManageOfMe[i]);
                    }
                }
            }
            if (host.database[type + "_policies"].items[pIndex].indirect_manager_approves_first){
                if (host.employeeOfMe.indexOf(employeeid) < 0){
                    for (var i = 0; i < indirect_manageOfYou.length; i++){
                        getText(indirect_manageOfYou[i]);
                    }
                }
                else {
                    for (var i = 0; i < host.indirectManageOfMe.length; i++){
                        getText(host.indirectManageOfMe[i]);
                    }
                }
            }
            for (var i = 0; i < host.database[type + "_policies"].items[pIndex].approvers.length; i++){
                getText(host.database[type + "_policies"].items[pIndex].approvers[i].employeeid);
            }
            if (type == "leave" && host.database[type + "_policies"].items[pIndex].long_leave_approval && number_of_day_off > host.database[type + "_policies"].items[pIndex].long_leave_threshold){
                for (var i = 0; i < host.database[type + "_policies"].items[pIndex].long_approvers.length; i++){
                    getText(host.database[type + "_policies"].items[pIndex].long_approvers[i].employeeid);
                }
            }
            if (res.length > 0) res = res.substr(2);
            resolve(res);
        };
        if (host.employeeOfMe.indexOf(employeeid) < 0 && (host.database[type + "_policies"].items[pIndex].direct_manager_approves_first ||  host.database[type + "_policies"].items[pIndex].indirect_manager_approves_first)){
            var direct_manageOfYou = [], indirect_manageOfYou = [];
            ModalElement.show_loading();
            FormClass.api_call({
                url: "database_load.php",
                params: [
                    {name: "task", value: "employee_load_manager"},
                    {name: "employeeid", value: employeeid}
                ],
                func: function(success, message){
                    ModalElement.close(-1);
                    if (success){
                        if (message.substr(0, 2) == "ok"){
                            var st = EncodingClass.string.toVariable(message.substr(2));
                            for (var i = 0; i < st.length; i++){
                                if (st[i].type == "direct") direct_manageOfYou.push(st[i].managerid);
                                else indirect_manageOfYou.push(st[i].managerid);
                            }
                            f1();
                        }
                        else {
                            ModalElement.alert({message: message});
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
            });
        }
        else {
            f1();
        }
    });
};

contentModule.getPoliciesListOfEmployee = function(host, type, id){
    return new Promise(function(resolve, reject){
        var index = host.database.employees.getIndex(id);
        var list = [{value: 0, text: LanguageModule.text("txt_select_value")}];
        if (index < 0) resolve(list);
        ModalElement.show_loading();
        FormClass.api_call({
            url: "database_load.php",
            params: [
                {name: "task", value: "load_employee_policies"},
                {name: "employeeid", value: id},
                {name: "type", value: type}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var st = EncodingClass.string.toVariable(message.substr(2));
                        if (id == 0) resolve(list);
                        var dic = contentModule.makeDictionaryIndex(host.database[type + "_policies"].items);
                        var pIndex;
                        var listDic = {};
                        for (var i = 0; i < st.length; i++){
                            if (st[i].type != type) continue;
                            if (st[i].employeeid != host.database.employees.items[index].id) continue;
                            pIndex = dic[st[i].policyid];
                            if (pIndex != undefined){
                                if (listDic[host.database[type + "_policies"].items[pIndex].id]) continue;
                                list.push({
                                    value: host.database[type + "_policies"].items[pIndex].id,
                                    text: host.database[type + "_policies"].items[pIndex].name
                                });
                                listDic[host.database[type + "_policies"].items[pIndex].id] = true;
                            }
                        }
                        resolve(list);
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

contentModule.getDisplayRemainDayOffByLeavePolicy = function(host, id){
    var index = host.database.leave_policies.getIndex(id);
    if (index < 0) return false;
    var groupid = host.database.leave_policies.items[index].groupid;
    return groupid == -1;
};

contentModule.getNumberOfDayOffLeavePolicy = function(host, fromdate, todate, days_portion){
    if (!fromdate || !todate) return 0;
    var numberOfDay = contentModule.getDateFrom1970(todate) - contentModule.getDateFrom1970(fromdate) + 1;
    var res;
    var typeid = data_module.form_config.request_leave.typeid;
    var tIndex = data_module.typelists.getIndex(typeid);
    if (tIndex < 0) return 0;
    var details = data_module.typelists.items[tIndex].content.details;
    for (var i = 0; i < details.length; i++){
        if (details[i].key == "days_portion"){
            var k = data_module.typelists.getIndex(details[i].type);
            if (k >= 0){
                for (var j = 0; j < data_module.typelists.items[k].content.details.length; j++){
                    if (data_module.typelists.items[k].content.details[j].localid == days_portion){
                        res = numberOfDay*data_module.typelists.items[k].content.details[j].value;
                        return res;
                    }
                }
            }
            break;
        }
    }
    return 0;
};

contentModule.getRemainDayOffByLeavePolicy = function(host, policyid, employeeid, fromdate){//chưa có đề xuất cho năm cũ, năm tiếp theo
    return new Promise(function(resolve, reject){
        var pIndex = host.database.leave_policies.getIndex(policyid);
        if (pIndex < 0){
            resolve(0);
            return;
        }
        var eIndex = host.database.employees.getIndex(employeeid);
        if (eIndex < 0){
            resolve(0);
            return;
        }
        var groupid = host.database.leave_policies.items[pIndex].groupid;
        if (groupid != -1){
            resolve(0);
            return;
        }
        if (fromdate == null){
            resolve(0);
            return;
        }
        var f = function(){
            console.log(host.contentGetRemainDayOffByLeavePolicy);
            var start_date = host.database.employees.items[eIndex].start_date;
            var request_date = fromdate;
            if (!request_date){
                resolve(0);
                return;
            }
            var sM = 0;
            var uL = 0;
            var tC, ac, annual_leaveContent;
            var tY = new Date().getFullYear();
            if (start_date.getFullYear() == tY){
                var c = absol.datetime.compareDate(absol.datetime.nextMonth(start_date), start_date);
                if (c >= 15) sM++;
                var s = start_date.getMonth();
                var r = request_date.getMonth();
                if (request_date) sM = sM +(r - s) - 1;
                tC = host.database.leave_policies.items[pIndex].leave_days_per_year/12*sM;
            }
            else {
                if (host.contentGetRemainDayOffByLeavePolicy.annual_leave.length > 0){
                    annual_leaveContent = EncodingClass.string.toVariable(host.contentGetRemainDayOffByLeavePolicy.annual_leave[0].content);
                    uL = parseFloat(annual_leaveContent.last_year_remain);
                    uL = uL - parseFloat(annual_leaveContent.leave_day_use_last_year);
                }
                else {
                    if (host.contentGetRemainDayOffByLeavePolicy.employee_year.length > 0){
                        var x = EncodingClass.string.toVariable(host.contentGetRemainDayOffByLeavePolicy.employee_year[0].content);
                        if (x.unused_leave) uL = x.unused_leave;
                    }
                }
                if (uL > host.database.leave_policies.items[pIndex].carried_forward_leave) uL = host.database.leave_policies.items[pIndex].carried_forward_leave;
                var accumulated_leave_expired_before = host.database.leave_policies.items[pIndex].accumulated_leave_expired_before;
                if (accumulated_leave_expired_before){
                    ac = new Date(new Date().setDate(accumulated_leave_expired_before.date)).setMonth(accumulated_leave_expired_before.month);
                    ac = new Date(ac).setHours(0, 0, 0, 0);
                }
                sM = request_date.getMonth();
                var dPY = host.database.leave_policies.items[pIndex].leave_days_per_year;
                if (host.database.leave_policies.items[pIndex].maximal_day_calculation == "monthly_incresmental"){
                    var d = ((request_date.getFullYear()*12 + request_date.getMonth()) - (start_date.getFullYear()*12 + start_date.getMonth()));
                    var lo = parseInt(d/host.database.leave_policies.items[pIndex].number_of_working_months_to_increase_one_day_leave);
                    dPY+= lo;
                    if (dPY > host.database.leave_policies.items[pIndex].maximum_leave_days_per_year){
                        dPY = host.database.leave_policies.items[pIndex].maximum_leave_days_per_year;
                    }
                }
                tC = dPY/12*sM;
            }
            if (annual_leaveContent){
                tC = tC - parseFloat(annual_leaveContent.leave_day_use_this_year);
            }
            var nb;
            var assign_employee_shifts = host.contentGetRemainDayOffByLeavePolicy.assign_employee_shifts;
            var days_portionValue = 0;
            var typeid = data_module.form_config.days_off_schedule.typeid;
            var tIndex = data_module.typelists.getIndex(typeid);
            if (tIndex < 0){
                ModalElement.alert({message: "Failed_type"});
                return;
            }
            var days_portionDic = {};
            var details = data_module.typelists.items[tIndex].content.details;
            for (var i = 0; i < details.length; i++){
                if (details[i].key == "days_portion"){
                    var k = data_module.typelists.getIndex(details[i].type);
                    if (k >= 0){
                        for (var j = 0; j < data_module.typelists.items[k].content.details.length; j++){
                            days_portionDic[data_module.typelists.items[k].content.details[j].localid] = data_module.typelists.items[k].content.details[j].value;
                        }
                    }
                    break;
                }
            }
            for (var i = 0; i < assign_employee_shifts.length; i++){
                if (days_portionDic[assign_employee_shifts[i].days_portion]) nb = days_portionDic[assign_employee_shifts[i].days_portion];
                else nb = 0;
                if (uL > 0){
                    if (ac){
                        if (assign_employee_shifts[i].date*86400000 > ac) tC = tC - nb;
                        else uL = uL - nb;
                    }
                    else {
                        uL = uL - nb;
                    }
                }
                else {
                    tC = tC - nb;
                }
            }
            if (ac && request_date.getTime() > ac) uL = 0;
            tC = tC + uL;
            resolve(tC);
        };
        if (host.contentGetRemainDayOffByLeavePolicy){
            f();
            return;
        }
        var startdate = contentModule.getDateFrom1970(absol.datetime.beginOfYear(new Date()));
        var enddate = contentModule.getDateFrom1970(absol.datetime.nextYear(new Date()));
        var loadDataFromDB = new Promise(function(rs, rj){
            FormClass.api_call({
                url: "database_load.php",
                params: [
                    {name: "task", value: "load_day_off_by_leave_policy_and_employee"},
                    {name: "policyid", value: policyid},
                    {name: "employeeid", value: employeeid},
                    {name: "startdate", value: startdate},
                    {name: "enddate", value: enddate}
                ],
                func: function(success, message){
                    if (success){
                        if (message.substr(0, 2) == "ok"){
                            var content = EncodingClass.string.toVariable(message.substr(2));
                            rs(content);
                        }
                        else {
                            resolve(0);
                            console.log(message);
                        }
                    }
                    else {
                        resolve(0);
                        console.log(message);
                    }
                }
            });
        });
        var loadDataFromCache = new Promise(function(rs, rj){
            data_module.loadTables("assign_employee_shifts", function(){
                var res = data_module.getDataTablesFromCache("assign_employee_shifts");
                var assign_employee_shifts = [];
                for (var i = 0; i < res.length; i++){
                    if (res[i].employeeid != employeeid) continue;
                    if (res[i].policyid != policyid) continue;
                    if (res[i].type != "hrp") continue;
                    if (res[i].date < startdate) continue;
                    if (res[i].date > $enddate) continue;
                    assign_employee_shifts.push(res[i]);
                }
                rs(assign_employee_shifts);
            });
        });
        Promise.all([loadDataFromDB, loadDataFromCache]).then(function(values){
            host.contentGetRemainDayOffByLeavePolicy = values[0];
            host.contentGetRemainDayOffByLeavePolicy.assign_employee_shifts = values[1];
            f();
        });
    });
};

contentModule.getDisabledAmountAllowanceList = function(host, id){
    var index = host.database.allowance_policies.getIndex(id);
    if (index < 0) return false;
    return host.database.allowance_policies.items[index].allowance_type == "fixed_amount";
};

contentModule.getAmountAllowanceList = function(host, id){
    var index = host.database.allowance_policies.getIndex(id);
    if (index < 0) return false;
    if (host.database.allowance_policies.items[index].allowance_type == "fixed_amount"){
        return host.database.allowance_policies.items[index].value;
    }
    else {
        return Promise.reject();
    }
};

contentModule.getDisabledAmountBenefitList = function(host, id){
    var index = host.database.benefit_policies.getIndex(id);
    if (index < 0) return false;
    return host.database.benefit_policies.items[index].benefit_type == "fixed_amount";
};

contentModule.getAmountBenefitList = function(host, id){
    var index = host.database.benefit_policies.getIndex(id);
    if (index < 0) return false;
    if (host.database.benefit_policies.items[index].benefit_type == "fixed_amount"){
        return host.database.benefit_policies.items[index].value;
    }
    else {
        return Promise.reject();
    }
};

contentModule.getDisabledAmountOther_liabilityList = function(host, id){
    var index = host.database.other_liability_policies.getIndex(id);
    if (index < 0) return false;
    return host.database.other_liability_policies.items[index].other_liability_type == "fixed_amount";
};

contentModule.getAmountOther_liabilityList = function(host, id){
    var index = host.database.other_liability_policies.getIndex(id);
    if (index < 0) return false;
    if (host.database.other_liability_policies.items[index].other_liability_type == "fixed_amount"){
        return host.database.other_liability_policies.items[index].value;
    }
    else {
        return Promise.reject();
    }
};

contentModule.getTimestartOfProject = function(host, id){
    var index = host.database.projects.getIndex(id);
    if (index < 0) return "";
    return host.database.projects.items[index].timestart;
};

contentModule.getTimeendOfProject = function(host, id){
    var index = host.database.projects.getIndex(id);
    if (index < 0) return "";
    return host.database.projects.items[index].timeend;
};

contentModule.getDescriptionByContract = function(host, id){
    var index = host.database.employment_contract_types.getIndex(id);
    if (index < 0) return "";
    return host.database.employment_contract_types.items[index].description;
};

contentModule.getDescriptionByPolicy = function(host, policy, id){
    var index = host.database[policy].getIndex(id);
    if (index < 0) return "";
    return host.database[policy].items[index].description;
};

contentModule.getTime_hours_needed_for_approvalByPolicy = function(host, type, id){
    var index = host.database[type + "_policies"].getIndex(id);
    if (index < 0) return "";
    return host.database[type + "_policies"].items[index].time_hours_needed_for_approval;
};

contentModule.getCalculated_onByPolicy = function(host, policy, id){
    var index = host.database[policy].getIndex(id);
    if (index < 0) return 0;
    return host.database[policy].items[index].calculated_on;
};

contentModule.getAttachmentsByPolicy = function(host, policy, id){
    var index = host.database[policy].getIndex(id);
    if (index < 0) return [];
    if (host.database[policy].items[index].attachments === "") return [];
    else if (EncodingClass.type.isString(host.database[policy].items[index].attachments)){
        return EncodingClass.string.toVariable(host.database[policy].items[index].attachments);
    }
    else return host.database[policy].items[index].attachments;
};

contentModule.getTax_typeByPolicy = function(host, policy, id){
    var index = host.database[policy].getIndex(id);
    if (index < 0) return 0;
    return host.database[policy].items[index].tax_type;
};

contentModule.getContributed_by_companyByPolicy = function(host, policy, id){
    var index = host.database[policy].getIndex(id);
    if (index < 0) return 0;
    return host.database[policy].items[index].contributed_by_company;
};

contentModule.getOtherLiabilityTypeByPolicy = function(host, policy, id){
    var index = host.database[policy].getIndex(id);
    if (index < 0) return 0;
    return host.database[policy].items[index].other_liability_type;
};

contentModule.getContributed_by_employeeByPolicy = function(host, policy, id){
    var index = host.database[policy].getIndex(id);
    if (index < 0) return 0;
    return host.database[policy].items[index].contributed_by_employee;
};

contentModule.getTax_reliefByPolicy = function(host, policy, id){
    var index = host.database[policy].getIndex(id);
    if (index < 0) return false;
    return host.database[policy].items[index].tax_relief;
};

contentModule.getInsurance_contribution_reliefByPolicy = function(host, policy, id){
    var index = host.database[policy].getIndex(id);
    if (index < 0) return false;
    return host.database[policy].items[index].insurance_contribution_relief;
};

contentModule.getFrequencyByPolicy = function(host, policy, id){
    var index = host.database[policy].getIndex(id);
    if (index < 0) return 0;
    return host.database[policy].items[index].frequency;
};

contentModule.getDepartmentIDList = function(host, index){
    if (index < 0) return [];
    var list = [host.database.orgs.items[index].id];
    for (var i = 0; i < host.database.orgs.items[index].childIndexList.length; i++){
        list = list.concat(contentModule.getDepartmentIDList(host, host.database.orgs.items[index].childIndexList[i]));
    }
    return list;
};

contentModule.makeEmployeePositionData = function(host){
    for (var i = 0; i < host.database.employees.items.length; i++){
        host.database.employees.items[i].positionName = "";
        host.database.employees.items[i].positions = [];
        host.database.employees.items[i].position = 0;
        host.database.employees.items[i].concurrent_positionName = "";
        host.database.employees.items[i].concurrent_positions = [];
        host.database.employees.items[i].concurrent_position = 0;
    }
    var employeeDic = contentModule.makeDictionaryIndex(host.database.employees.items);
    var positionDic = contentModule.makeDictionaryIndex(host.database.positions.items);
    var eIndex, pIndex;
    for (var i = 0; i < host.database.employee_positions.items.length; i++){
        eIndex = employeeDic[host.database.employee_positions.items[i].employeeid];
        pIndex = positionDic[host.database.employee_positions.items[i].positionid];
        if (eIndex !== undefined && pIndex !== undefined){
            if (host.database.employee_positions.items[i].type == "position"){
                host.database.employees.items[eIndex].positionName += ", " + host.database.positions.items[pIndex].name;
                host.database.employees.items[eIndex].positions.push(host.database.positions.items[pIndex].id);
                host.database.employees.items[eIndex].position = host.database.positions.items[pIndex].id;
            }
            else {
                host.database.employees.items[eIndex].concurrent_positionName += ", " + host.database.positions.items[pIndex].name;
                host.database.employees.items[eIndex].concurrent_positions.push(host.database.positions.items[pIndex].id);
                host.database.employees.items[eIndex].concurrent_position = host.database.positions.items[pIndex].id;
            }

        }
    }
    for (var i = 0; i < host.database.employees.items.length; i++){
        host.database.employees.items[i].positionName = host.database.employees.items[i].positionName.substr(2);
        host.database.employees.items[i].concurrent_positionName = host.database.employees.items[i].concurrent_positionName.substr(2);
    }
};

contentModule.makeEmployeePosition2Data = function(host){
    for (var i = 0; i < host.database.employees.items.length; i++){
        host.database.employees.items[i].positionName = "";
        host.database.employees.items[i].position = 0;
        host.database.employees.items[i].concurrent_positionName = "";
        host.database.employees.items[i].concurrent_position = 0;
    }
    var employeeDic = contentModule.makeDictionaryIndex(host.database.employees.items);
    var positionDic = contentModule.makeDictionaryIndex(host.database.positions.items);
    var eIndex, pIndex;
    for (var i = 0; i < host.database.employee_positions.items.length; i++){
        eIndex = employeeDic[host.database.employee_positions.items[i].employeeid];
        pIndex = positionDic[host.database.employee_positions.items[i].positionid];
        if (eIndex !== undefined && pIndex !== undefined){
            if (host.database.employee_positions.items[i].type == "concurrent_position"){
                host.database.employees.items[eIndex].concurrent_positionName = host.database.positions.items[pIndex].name;
                host.database.employees.items[eIndex].concurrent_position = host.database.positions.items[pIndex].id;
            }
            else {
                host.database.employees.items[eIndex].positionName = host.database.positions.items[pIndex].name;
                host.database.employees.items[eIndex].position = host.database.positions.items[pIndex].id;
            }
        }
    }
};

contentModule.makeGeoposOrgsData = function(host){
    for (var i = 0; i < host.database.orgs.items.length; i++){
        host.database.orgs.items[i].geopos = [];
    }
    var orgDic = contentModule.makeDictionaryIndex(host.database.orgs.items);
    var oIndex;
    for (var i = 0; i < host.database.geopos_orgs.items.length; i++){
        oIndex = orgDic[host.database.geopos_orgs.items[i].orgid];
        if (oIndex !== undefined){
            host.database.orgs.items[oIndex].geopos.push(host.database.geopos_orgs.items[i].geoid);
        }
    }
};

contentModule.makeGeoposCompaniesData = function(host){
    for (var i = 0; i < host.database.companies.items.length; i++){
        host.database.companies.items[i].geopos = [];
    }
    var orgDic = contentModule.makeDictionaryIndex(host.database.companies.items);
    var oIndex;
    for (var i = 0; i < host.database.geopos_orgs.items.length; i++){
        oIndex = orgDic[host.database.geopos_orgs.items[i].orgid];
        if (oIndex !== undefined){
            host.database.companies.items[oIndex].geopos.push(host.database.geopos_orgs.items[i].geoid);
        }
    }
};

contentModule.makeEmployeeManagerData = function(host){
    for (var i = 0; i < host.database.employees.items.length; i++){
        host.database.employees.items[i].direct_manager = 0;
        host.database.employees.items[i].indirect_manager = 0;
    }
    var employeeDic = contentModule.makeDictionaryIndex(host.database.employees.items);
    var eIndex;
    for (var i = 0; i < host.database.employee_managers.items.length; i++){
        eIndex = employeeDic[host.database.employee_managers.items[i].employeeid];
        if (eIndex !== undefined){
            if (host.database.employee_managers.items[i].type == "direct") host.database.employees.items[eIndex].direct_manager = host.database.employee_managers.items[i].managerid;
            if (host.database.employee_managers.items[i].type == "indirect") host.database.employees.items[eIndex].indirect_manager = host.database.employee_managers.items[i].managerid;
        }
    }
};

contentModule.getCalculated_onText = function(host, calculated_on, typeid){
    var list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == "type_salary_decisions_applied_to_employee_calculated_on"){
            typeid = list[i].type;
            if (typeid == "union") typeid = list[i].typeOfUnion;
            break;
        }
    }
    list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    for (var i = 0; i < list.length; i++){
        if (list[i].localid == calculated_on) return list[i].text;
    }
    return "-";
};

contentModule.moneyFormat = function(num, minF, maxF) {
    var i, k, x;
    var st = "";
    if (minF === undefined) {
        minF = 0;
        maxF = -1;
    }
    if (maxF === undefined) {
        maxF = -1;
    }
    num = parseFloat(num);
    if (num < 0) return "-" + contentModule.moneyFormat(-num, minF, maxF);
    if (maxF != -1) {
        x = 0.01;
        k = maxF;
        for (i = 0; i <= k; i++) {
            x /= 10;
        }
    }
    else {
        x = 0;
    }
    num = "" + (num + x);
    if (num.length == 0) {
        if (minF > 0) {
            st = ".";
            for (i = 0; i < minF; i++) st += "0";
        }
        return "0" + st;
    }
    if (num.substr(0, 1) == ".") num = "0" + num;
    k = num.indexOf(".");
    if (k != -1) {
        x = num.substr(0, k);
        num = num.substr(k+1);
        for (k = x.length; k > 3; k -= 3) {
            if (st != "") {
                st = x.substr(k - 3) + "," + st;
            }
            else {
                st = x.substr(k - 3);
            }
            x = x.substr(0, k - 3);
        }
        if (st != "") {
            st = x + "," + st;
        }
        else {
            st = x;
        }
        k = strlen(num);
        if ((maxF != -1) && (maxF < k)) k = maxF;
        if (k > 0) {
            st += ".";
            for (i = 0; i < k; i++) st += num.substr(i, 1);
        }
        return st;
    }

    for (k = num.length; k > 3; k -= 3) {
        st = num.substr(k - 3) + "," + st;
        num = num.substr(0, k - 3);
    }
    st = num + "," + st;
    return st.substr(0, st.length - 1);
};

contentModule.copyToClipboard = function(str){
    var el = document.createElement('textarea');
    el.value = str;
    document.body.appendChild(el);
    el.select();
    document.execCommand('copy');
    document.body.removeChild(el);
};

contentModule.getFrom_ToDateByFrequency = function(frequency, date){
    date = EncodingClass.string.duplicate(date);
    var fromdate, todate;
    switch (frequency) {
        case 'week':
            fromdate = absol.datetime.beginOfWeek(date, false, 1);
            todate = new Date(absol.datetime.beginOfWeek(date).getTime() + 7*24*60*60*1000);
            break;
        case 'month':
            fromdate = absol.datetime.beginOfMonth(date);
            todate = absol.datetime.nextMonth(date);
            break;
        case 'year':
            fromdate = absol.datetime.beginOfYear(date);
            todate = new Date(absol.datetime.beginOfYear(date).setFullYear(date.getFullYear() + 1));
            break
        case 'quarter':
            var m = date.getMonth();
            var mod = m%3;
            fromdate = new Date(date.setMonth(m - mod));
            fromdate = absol.datetime.beginOfMonth(fromdate);
            todate = absol.datetime.nextMonth(absol.datetime.nextMonth(absol.datetime.nextMonth(fromdate)));
            break
        case "six_months":
            var m = date.getMonth();
            fromdate = new Date(date.setDate(1));
            if (m >= 6){
                fromdate = new Date(date.setMonth(6));
                todate = new Date(date.setMonth(0));
                todate = new Date(date.setFullYear(date.getFullYear() + 1));
            }
            else {
                fromdate = new Date(date.setMonth(0));
                todate = new Date(date.setMonth(6));
            }
            break;
        default:
            fromdate = new Date();
            todate = new Date();
            break;
    }
    return {
        fromdate: fromdate,
        todate: todate
    };
};

contentModule.drawEmployeeApplyPolcies = function(host, params){
    var orgEmpItems;
    var temp = {database: {}};
    var drawEmployeeApply = function(){
        FormClass.api_call({
            url: "database_load.php",
            params: [
                {name: "task", value: "load_employee_policies_active_by_policy"},
                {name: "type", value: params.type},
                {name: "policyid", value: params.policyid}
            ],
            func: function(success, message){
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var st = EncodingClass.string.toVariable(message.substr(2));
                        var values = [];
                        for (var i = 0; i < st.length; i++){
                            if (values.indexOf(st[i].employeeid) >= 0) continue;
                            values.push(st[i].employeeid);
                        }
                        var f = function(){
                            DOMElement.removeAllChildren(employee_apply_ctn);
                            employee_apply_ctn.appendChild(absol.buildDom({
                                tag: "multichecktreemenu",
                                props: {
                                    items: orgEmpItems,
                                    values: values,
                                    disabled: true,
                                    leafOnly: true
                                }
                            }));
                        };
                        var promiseList = [];
                        if (!orgEmpItems){
                            promiseList.push(data_module.loadOrgsList(function(record){
                                return {
                                    id: record.id,
                                    parentid: record.parentid,
                                    code: record.code,
                                    name: record.name,
                                    firstid: record.firstid,
                                    firstparentid: record.firstparentid
                                };
                            }), data_module.loadEmployeesList(function(record){
                                return {
                                    id: record.id,
                                    firstid: record.firstid,
                                    orgid: record.orgid,
                                    peopleid: record.peopleid,
                                    available: record.available,
                                    code: record.code
                                };
                            }), data_module.loadPeoplesList(function(record){
                                return {
                                    id: record.id,
                                    fullname: record.fullname
                                };
                            }));
                        }
                        var noSelectDic = {};
                        // promiseList.push(new Promise(function(rs, rj){
                        //     FormClass.api_call({
                        //         url: "database_load.php",
                        //         params: [
                        //             {name: "task", value: "load_employee_policies_by_type"},
                        //             {name: "type", value: params.type}
                        //         ],
                        //         func: function(success, message){
                        //             if (success){
                        //                 if (message.substr(0,2) == "ok"){
                        //                     var st = EncodingClass.string.toVariable(message.substr(2));
                        //                     st.forEach(function(item){
                        //                         if (item.policyid != params.policyid) noSelectDic[item.employeeid] = true;
                        //                     });
                        //                     rs();
                        //                 }
                        //                 else {
                        //                     ModalElement.alert({message: message});
                        //                 }
                        //             }
                        //             else {
                        //                 ModalElement.alert({message: message});
                        //             }
                        //         }
                        //     });
                        // }));
                        Promise.all(promiseList).then(function(value){
                            if (value.length > 1){
                                contentModule.makeDatabaseContent(temp, {orgs: value[0], employees: value[1], peoples: value[2]});
                                var pDict = {};
                                temp.database.peoples.items.forEach(function(elt){
                                    pDict[elt.id] = elt;
                                });
                                temp.database.employees.items.forEach(function(elt){
                                    elt.fullname = pDict[elt.peopleid].fullname;
                                });
                                contentModule.makeOrgsIndex(temp);
                                contentModule.makeEmployeesIndex(temp);
                            }
                            orgEmpItems = contentModule.getOrgsAndEmployeesListSelectTreeMenuLeaf(temp, undefined, {noSelectDic: noSelectDic});
                            f();
                        });
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    };
    var employee_apply_ctn = DOMElement.div({
        attrs: {
            style: {
                paddingLeft: "var(--control-verticle-distance-2)",
                paddingTop: "var(--control-verticle-distance-2)"
            }
        }
    });
    var childs = [
        {
            class: 'mk-section-header-name',
            child: { text: LanguageModule.text("txt_employee_apply") },
        }
    ];
    if (systemconfig.privSystem >= 2 || data_module.admin_rights_of_me.human_resource_policy){
        childs.push({
            class: 'mk-section-header-right',
            child: [
                DOMElement.a({
                    attrs: {
                        onclick: function(){
                            contentModule.formApplyToPolicies({
                                type: params.type,
                                policyid: params.policyid,
                                calculated_on: host.dataPolicyEdit.calculated_on,
                                groupid: host.dataPolicyEdit.groupid
                            }).then(function(){
                                drawEmployeeApply();
                            });
                        }
                    },
                    text: LanguageModule.text("txt_edit")
                })
            ]
        });
    }
    var res = absol.buildDom({
        attr: {
            "data-sectionid": "employee_apply"
        },
        child: [
            absol.buildDom({
                class: 'mk-section-header',
                child: childs
            }),
            employee_apply_ctn
        ]
    });
    drawEmployeeApply();
    return res;
};

contentModule.drawGeneralInformationPolicy = function(host, params){
    var viewGeneralInformation = DOMElement.div({
        attrs: {
            style: {
                paddingLeft: "var(--control-verticle-distance-2)",
                paddingTop: "var(--control-verticle-distance-2)"
            }
        }
    });
    host.drawGeneralInforFunc = function(){
        var fParams = {
            typeid: data_module.form_config[params.type + "_policies"].typeid,
            formid: data_module.form_config[params.type + "_policies"].output_form,
            initialValue: host.dataPolicyEdit,
            formContainer: viewGeneralInformation,
            typelists: data_module.typelists.items,
            variableType: "system"
        };
        if (params.variables) fParams.variables = params.variables;
        contentModule.makeOutputFormData(fParams).then(function(getValue){});
    };
    host.drawGeneralInforFunc();
    var childs = [
        {
            class: 'mk-section-header-name',
            child: { text: LanguageModule.text("txt_general_information") },
        }
    ];
    if (systemconfig.privSystem >= 2 || data_module.admin_rights_of_me.human_resource_policy){
        childs.push({
            class: 'mk-section-header-right',
            child: [
                DOMElement.a({
                    attrs: {
                        onclick: function(){
                            params.editInforFunc();
                        }
                    },
                    text: LanguageModule.text("txt_edit")
                })
            ]
        });
    }
    var res = absol.buildDom({
        attr: {
            "data-sectionid": "general_information"
        },
        child: [
            absol.buildDom({
                class: 'mk-section-header',
                child: childs
            }),
            viewGeneralInformation
        ]
    });
    return res;
};

contentModule.drawApprovalPolicyNoDirect = function(host, params){
    var drawApprovalFunc = function(){
        FormClass.api_call({
            url: "database_load.php",
            params: [
                {name: "task", value: "policy_load_approval_no_direct"},
                {name: "type", value: params.type},
                {name: "id", value: host.dataPolicyEdit.id}
            ],
            func: function(success, message){
                if (success){
                    if (message. substr(0, 2) == "ok"){
                        var st = EncodingClass.string.toVariable(message.substr(2));
                        DOMElement.removeAllChildren(approval_ctn);
                        approval_ctn.appendChild(contentModule.getApprovalPolicyNoDirect(host, st, "view"));
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    };
    var saveFunc = function(data){
        return new Promise(function(rs, rj){
            data.id = host.dataPolicyEdit.id;
            data.type = params.type;
            ModalElement.show_loading();
            FormClass.api_call({
                url: "policies_save_approval_nodirect.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 index = host.database[params.type + "_policies"].getIndex(host.dataPolicyEdit.id);
                            if (index >= 0){
                                host.database[params.type + "_policies"].items[index].approval_method = data.approval_method;
                            }
                            rs();
                        }
                        else {
                            ModalElement.alert({message: message});
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
            });
        });
    };
    var editFunc = function(){
        ModalElement.show_loading();
        FormClass.api_call({
            url: "database_load.php",
            params: [
                {name: "task", value: "policy_load_approval_no_direct"},
                {name: "type", value: params.type},
                {name: "id", value: host.dataPolicyEdit.id}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message. substr(0, 2) == "ok"){
                        var st = EncodingClass.string.toVariable(message.substr(2));
                        var res = contentModule.getApprovalPolicyNoDirect(host, st);
                        ModalElement.showWindow({
                            title: LanguageModule.text("txt_approval"),
                            bodycontent: res,
                            buttonlist: [
                                {
                                    text: LanguageModule.text("txt_save"),
                                    onclick: function(){
                                        var data = res.getValue();
                                        if (!data) return;
                                        saveFunc(data).then(function(){
                                            drawApprovalFunc();
                                            ModalElement.close();
                                        });
                                    }
                                },
                                {
                                    text: LanguageModule.text("txt_cancel"),
                                    onclick: function(){
                                        ModalElement.close();
                                    }
                                }
                            ]
                        });
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    };
    var approval_ctn = DOMElement.div({
        attrs: {
            style: {
                paddingLeft: "var(--control-verticle-distance-2)",
                paddingTop: "var(--control-verticle-distance-2)"
            }
        }
    });
    var res = absol.buildDom({
        attr: {
            "data-sectionid": "approval"
        },
        child: [
            absol.buildDom({
                class: 'mk-section-header',
                child: [
                    {
                        class: 'mk-section-header-name',
                        child: { text: LanguageModule.text("txt_approval") },
                    },
                    {
                        class: 'mk-section-header-right',
                        child: [
                            DOMElement.a({
                                attrs: {
                                    onclick: function(){
                                        editFunc();
                                    }
                                },
                                text: LanguageModule.text("txt_edit")
                            })
                        ]
                    }
                ]
            }),
            approval_ctn
        ]
    });
    drawApprovalFunc();
    return res;
};

contentModule.drawAdvancePaymentaAproveProposalList = function(host, params){
    var drawApprovalFunc = function(){
        FormClass.api_call({
            url: "database_load.php",
            params: [
                {name: "task", value: "advance_payment_policy_load_approve_proposal_list"},
                {name: "id", value: host.dataPolicyEdit.id}
            ],
            func: function(success, message){
                if (success){
                    if (message. substr(0, 2) == "ok"){
                        var st = EncodingClass.string.toVariable(message.substr(2));
                        DOMElement.removeAllChildren(approval_ctn);
                        approval_ctn.appendChild(contentModule.getAdvancePaymentaAproveProposalList(host, st, "view"));
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    };
    var saveFunc = function(data){
        return new Promise(function(rs, rj){
            data.id = host.dataPolicyEdit.id;
            data.type = params.type;
            ModalElement.show_loading();
            FormClass.api_call({
                url: "advance_payment_policy_save_approve_proposal_list.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 index = host.database[params.type + "_policies"].getIndex(host.dataPolicyEdit.id);
                            if (index >= 0){
                                host.database[params.type + "_policies"].items[index].time_hours_needed_for_approval_list = data.time_hours_needed_for_approval_list;
                                host.database[params.type + "_policies"].items[index].approval_method_list = data.approval_method_list;
                            }
                            rs();
                        }
                        else {
                            ModalElement.alert({message: message});
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
            });
        });
    };
    var editFunc = function(){
        ModalElement.show_loading();
        FormClass.api_call({
            url: "database_load.php",
            params: [
                {name: "task", value: "advance_payment_policy_load_approve_proposal_list"},
                {name: "id", value: host.dataPolicyEdit.id}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message. substr(0, 2) == "ok"){
                        var st = EncodingClass.string.toVariable(message.substr(2));
                        var res = contentModule.getAdvancePaymentaAproveProposalList(host, st);
                        ModalElement.showWindow({
                            title: LanguageModule.text("txt_approve_proposal_list"),
                            bodycontent: res,
                            buttonlist: [
                                {
                                    text: LanguageModule.text("txt_save"),
                                    onclick: function(){
                                        var data = res.getValue();
                                        if (!data) return;
                                        saveFunc(data).then(function(){
                                            drawApprovalFunc();
                                            ModalElement.close();
                                        });
                                    }
                                },
                                {
                                    text: LanguageModule.text("txt_cancel"),
                                    onclick: function(){
                                        ModalElement.close();
                                    }
                                }
                            ]
                        });
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    };
    var approval_ctn = DOMElement.div({
        attrs: {
            style: {
                paddingLeft: "var(--control-verticle-distance-2)",
                paddingTop: "var(--control-verticle-distance-2)"
            }
        }
    });
    var res = absol.buildDom({
        attr: {
            "data-sectionid": "approval_list"
        },
        child: [
            absol.buildDom({
                class: 'mk-section-header',
                child: [
                    {
                        class: 'mk-section-header-name',
                        child: { text: LanguageModule.text("txt_approve_proposal_list") },
                    },
                    {
                        class: 'mk-section-header-right',
                        child: [
                            DOMElement.a({
                                attrs: {
                                    onclick: function(){
                                        editFunc();
                                    }
                                },
                                text: LanguageModule.text("txt_edit")
                            })
                        ]
                    }
                ]
            }),
            approval_ctn
        ]
    });
    drawApprovalFunc();
    return res;
};

contentModule.showPolicyHasApprovalNoDirect = function(host, params){
    hr.menu.changeCurrentUrlTab(host, params.type + "_policies/" + params.policyid);
    var nav = absol.buildDom({
        tag:'mknav',
        class: 'mk-nav',
        props: {
            items: [
                {text: LanguageModule.text("txt_general_information"), value: "general_information"},
                {text: LanguageModule.text("txt_employee_apply"), value: "employee_apply"},
                {text: LanguageModule.text("txt_approval"), value: "approval"},
                {text: LanguageModule.text("txt_comment"), value: "comment"}
            ],
            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 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)"
        },
        on: {
            scroll: scrollRightFunc
        }
    });
    rightCtn.appendChild(contentModule.drawGeneralInformationPolicy(host, params));
    rightCtn.appendChild(contentModule.drawEmployeeApplyPolcies(host, params));
    rightCtn.appendChild(contentModule.drawApprovalPolicyNoDirect(host, params));
    rightCtn.appendChild(contentModule.drawComment({taskid: params.policyid, tablename: params.type + "_policies"}));
    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: [
            DOMElement.div({
                attrs: {className: 'button-panel-header absol-single-page-header'},
                children: [
                    DOMElement.div({
                        attrs: {className: "single-button-header"},
                        children: [theme.backButton({
                            onclick: function(){
                                host.frameList.removeLast();
                                hr.menu.changeCurrentUrlTab(host, "human_resource_policies");
                            }
                        })]
                    })
                ]
            }),
            data_ctn
        ]
    });
    host.frameList.addChild(singlePage);
    singlePage.requestActive();
};

contentModule.showPolicyNoApproval = function(host, params){
    hr.menu.changeCurrentUrlTab(host, params.type + "_policies/" + params.policyid);
    var nav = absol.buildDom({
        tag:'mknav',
        class: 'mk-nav',
        props: {
            items: [
                {text: LanguageModule.text("txt_general_information"), value: "general_information"},
                {text: LanguageModule.text("txt_employee_apply"), value: "employee_apply"},
                {text: LanguageModule.text("txt_comment"), value: "comment"}
            ],
            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 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)"
        },
        on: {
            scroll: scrollRightFunc
        }
    });
    rightCtn.appendChild(contentModule.drawGeneralInformationPolicy(host, params));
    rightCtn.appendChild(contentModule.drawEmployeeApplyPolcies(host, params));
    rightCtn.appendChild(contentModule.drawComment({taskid: params.policyid, tablename: params.type + "_policies"}));
    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: [
            DOMElement.div({
                attrs: {className: 'button-panel-header absol-single-page-header'},
                children: [
                    DOMElement.div({
                        attrs: {className: "single-button-header"},
                        children: [theme.backButton({
                            onclick: function(){
                                host.frameList.removeLast();
                                hr.menu.changeCurrentUrlTab(host, "human_resource_policies");
                            }
                        })]
                    })
                ]
            }),
            data_ctn
        ]
    });
    host.frameList.addChild(singlePage);
    singlePage.requestActive();
};

contentModule.drawApprovalPolicy = function(host, params){
    var viewApproval = DOMElement.div({
        attrs: {
            style: {
                paddingLeft: "var(--control-verticle-distance-2)",
                paddingTop: "var(--control-verticle-distance-2)"
            }
        }
    });
    var getApprovalMethod = function(value){
        var list = contentModule.getListApprovalMethod();
        for (var i = 0; i < list.length; i++){
            if (list[i].value == value) return list[i].text;
        }
        return "";
    };
    host.drawApprovalFunc = function(){
        var employeesDic = contentModule.makeDictionaryIndex(host.database.employees.items);
        var getRowApproverView = function(employeeid){
            var res = [];
            var eIndex = employeesDic[employeeid];
            if (eIndex === undefined) return null;
            var dIndex = host.database.employees.items[eIndex].orgIndex;
            res.push({
                text: host.database.orgs.items[dIndex].name
            });
            res.push({
                text: host.database.employees.items[eIndex].fullname
            });
            return res;
        };
        var approval_method = getApprovalMethod(host.dataPolicyEdit.approval_method);
        var direct_manager_approves_first = host.dataPolicyEdit.direct_manager_approves_first? LanguageModule.text("txt_yes") : LanguageModule.text("txt_no");
        var indirect_manager_approves_first = host.dataPolicyEdit.indirect_manager_approves_first? LanguageModule.text("txt_yes") : LanguageModule.text("txt_no");
        var time_hours_needed_for_approval = host.dataPolicyEdit.time_hours_needed_for_approval;
        var approvers = host.dataPolicyEdit.approvers;
        var header = [];
        header.push(
            {text: LanguageModule.text("txt_department")},
            {text: LanguageModule.text("txt_employee")}
        );
        var data = [], row;
        for (var i = 0; i < approvers.length; i++){
            row = getRowApproverView(approvers[i].employeeid);
            if (!row) continue;
            data.push(row);
        }
        var tableView = DOMElement.table({
            header: header,
            data: data
        });
        DOMElement.removeAllChildren(viewApproval);
        var approvalElt = DOMElement.div({
            children: [
                DOMElement.table({
                    data: [
                        [
                            {
                                attrs: {style: {lineHeight: "var(--control-height)"}},
                                text: LanguageModule.text("txt_time_hours_needed_for_approval")
                            },
                            {attrs: {style: {width: "var(--distance-between-title-value)"}}},
                            {text: time_hours_needed_for_approval}
                        ],
                        [{attrs: {style: {height: "var(--control-verticle-distance-2)"}}}],
                        [
                            {
                                attrs: {style: {lineHeight: "var(--control-height)"}},
                                text: LanguageModule.text("txt_direct_manager_approves")
                            },
                            {attrs: {style: {width: "var(--distance-between-title-value)"}}},
                            {text: direct_manager_approves_first}
                        ],
                        [{attrs: {style: {height: "var(--control-verticle-distance-2)"}}}],
                        [
                            {
                                attrs: {style: {lineHeight: "var(--control-height)"}},
                                text: LanguageModule.text("txt_indirect_manager_approves")
                            },
                            {attrs: {style: {width: "var(--distance-between-title-value)"}}},
                            {text: indirect_manager_approves_first}
                        ],
                        [{attrs: {style: {height: "var(--control-verticle-distance-2)"}}}],
                        [
                            {
                                attrs: {style: {lineHeight: "var(--control-height)"}},
                                text: LanguageModule.text("txt_approval_method")
                            },
                            {attrs: {style: {width: "var(--distance-between-title-value)"}}},
                            {text: approval_method}
                        ]
                    ]
                }),
                DOMElement.div({attrs: {style: {height: "var(--control-verticle-distance-2)"}}}),
                DOMElement.div({
                    children: [
                        DOMElement.span({text: LanguageModule.text("txt_approvers")})
                    ]
                }),
                DOMElement.div({attrs: {style: {height: "var(--control-verticle-distance-2)"}}}),
                DOMElement.div({
                    attrs: {className: "cardsimpletableclass"},
                    children: [tableView]
                })
            ]
        });
        viewApproval.appendChild(approvalElt);
    };
    host.drawApprovalFunc();
    var childs = [
        {
            class: 'mk-section-header-name',
            child: { text: (params.type == "advance_payment")? LanguageModule.text("txt_approve_individual_proposal") : LanguageModule.text("txt_approval") },
        }
    ];
    if (systemconfig.privSystem >= 2 || data_module.admin_rights_of_me.human_resource_policy){
        childs.push({
            class: 'mk-section-header-right',
            child: [
                DOMElement.a({
                    attrs: {
                        onclick: function(){
                            params.editApprovalFunc();
                        }
                    },
                    text: LanguageModule.text("txt_edit")
                })
            ]
        });
    }
    var res = absol.buildDom({
        attr: {
            "data-sectionid": "approval"
        },
        child: [
            absol.buildDom({
                class: 'mk-section-header',
                child: childs
            }),
            viewApproval
        ]
    });
    return res;
};

contentModule.showPolicyApprover = function(host, params){
    hr.menu.changeCurrentUrlTab(host, params.type + "_policies/" + params.policyid);
    var navItems = [
        {text: LanguageModule.text("txt_general_information"), value: "general_information"},
        {text: LanguageModule.text("txt_employee_apply"), value: "employee_apply"}
    ];
    if (params.type == "advance_payment"){
        navItems.push(
            {text: LanguageModule.text("txt_approve_individual_proposal"), value: "approval"},
            {text: LanguageModule.text("txt_approve_proposal_list"), value: "approval_list"}
        );
    }
    else {
        navItems.push({text: LanguageModule.text("txt_approval"), value: "approval"});
    }
    navItems.push({text: LanguageModule.text("txt_comment"), value: "comment"});
    var nav = absol.buildDom({
        tag:'mknav',
        class: 'mk-nav',
        props: {
            items: navItems,
            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 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)"
        },
        on: {
            scroll: scrollRightFunc
        }
    });

    rightCtn.appendChild(contentModule.drawGeneralInformationPolicy(host, params));
    rightCtn.appendChild(contentModule.drawEmployeeApplyPolcies(host, params));
    if (params.type == "leave"){
        rightCtn.appendChild(hr.leave_policies.drawApprovalPolicy(host, params.policyid));
    }
    else {
        rightCtn.appendChild(contentModule.drawApprovalPolicy(host, params));
    }
    if (params.type == "advance_payment"){
        rightCtn.appendChild(contentModule.drawAdvancePaymentaAproveProposalList(host, params));
    }
    rightCtn.appendChild(contentModule.drawComment({taskid: params.policyid, tablename: params.type + "_policies"}));
    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: [
            DOMElement.div({
                attrs: {className: 'button-panel-header absol-single-page-header'},
                children: [
                    DOMElement.div({
                        attrs: {className: "single-button-header"},
                        children: [theme.backButton({
                            onclick: function(){
                                host.frameList.removeLast();
                                hr.menu.changeCurrentUrlTab(host, "human_resource_policies");
                            }
                        })]
                    })
                ]
            }),
            data_ctn
        ]
    });
    host.frameList.addChild(singlePage);
    singlePage.requestActive();
};

contentModule.getUnitByInstrumentsAndToolsId = function(host, id){
    if (id == 0) return "";
    var iIndex = host.database.instruments_and_tools.getIndex(id);
    return host.database.instruments_and_tools.items[iIndex].unit;
};

contentModule.getInventoryByByInstrumentsAndToolsId = function(host, id){
    if (id == 0) return "";
    var iIndex = host.database.instruments_and_tools.getIndex(id);
    return host.database.instruments_and_tools.items[iIndex].inventory;
};

contentModule.getStatusByAssetId = function(host, assetid){
    if (assetid > 0){
        var aIndex = host.database.assets.getIndex(assetid);
        return host.database.assets.items[aIndex].status;
    }
    else {
        return "good";
    }
};

contentModule.listTypeSelectmenu = [
    "member_of_position_2",
    "member_of_employee",
    "member_of_worktime_machines",
    "member_of_assets",
    "member_of_instruments_and_tools",
    "member_of_warehouses",
    "member_of_assets_instruments_and_tools",
    "member_of_allowance_policy_groups",
    "member_of_training_program_groups",
    "member_of_leave_policy_groups",
    "member_of_insurance_policy_groups",
    "member_of_benefit_policy_groups",
    "member_of_tax_policy_groups",
    "member_of_bonus_policy_groups",
    "member_of_piece_wage_policy_groups",
    "member_of_attendance_clock_policy_groups",
    "member_of_standard_workday_policy_groups",
    "member_of_work_flow_groups",
    "member_of_work_flows",
    "member_of_objects",
    "member_of_payroll_cycle",
    "member_of_lesson_categories",
    "member_of_task",
    "member_of_meeting",
    "member_of_typelists",
    "member_of_input_forms",
    "member_of_output_forms",
    "member_of_mobile_input_forms",
    "member_of_mobile_output_forms",
    "member_of_partner_class",
    "member_of_partner",
    "member_of_contact",
    "member_of_trade_union_policy_groups",
    "member_of_overtime_policy_groups",
    "member_of_offboarding_types",
    "member_of_offboarding_reasons",
    "member_of_salary_policy_groups",
    "member_of_other_liability_policy_groups",
    "member_of_other_policy_groups",
    "member_of_policies",
    "member_of_late_early_checkin_policy_groups",
    "member_of_advance_payment_policy_groups",
    "member_of_punishment_policy_groups",
    "member_of_asset_category",
    "member_of_instruments_and_tools_category",
    "member_of_projects",
    "member_of_insurance_policies",
    "member_of_tax_policies",
    "member_of_trade_union_policies",
    "member_of_leave_policies",
    "member_of_benefit_policies",
    "member_of_allowance_policies",
    "member_of_bonus_policies",
    "member_of_standard_workday_policies",
    "member_of_overtime_policies",
    "member_of_punishment_policies",
    "member_of_advance_payment_policies",
    "member_of_late_early_checkin_policies",
    "member_of_salary_policies",
    "member_of_other_liability_policies",
    "member_of_employment_contract_types",
    "member_of_nations",
    "member_of_cities",
    "member_of_religions",
    "member_of_shifts",
    "member_of_timesheets",
    "member_of_pay_percentage",
    "member_of_ethnics",
    "member_of_department",
    "geopos",
    "user",
    "member_of_document_types",
    "member_of_orgs",
    "member_of_document_groups",
    "member_of_document_folders",
    "member_of_template_groups",
    "member_of_welcome_templates",
    "member_of_product_groups",
    "member_of_position_groups",
    "member_of_product_list",
    "member_of_piece_wage_policies",
    "member_of_attendance_clock_policies",
    "nation_city"
];

contentModule.listTypeSelectbox = [
    "select_department_employee",
    "userlist",
    "members_of_shifts",
    "members_of_partner_class",
    "multiselect_offboarding_reasons",
    "members_of_locations",
    "employee_list",
    "position_list"
];

contentModule.listPurposeHasActivities = function(){
    return [
        {name: LanguageModule.text("txt_partner"), tablename: "partner", tablenameCache: "partners", datatype: "member_of_partner"},
        {name: LanguageModule.text("txt_contact"), tablename: "contact", tablenameCache: "contacts", datatype: "member_of_contact"},
        {name: LanguageModule.text("txt_object"), tablename: "objects", tablenameCache: "objects", datatype: "member_of_objects"},
        {name: LanguageModule.text("txt_onboarding"), tablename: "onboarding"},
        {name: LanguageModule.text("txt_offboarding"), tablename: "offboarding"}
    ]
};

contentModule.getColumnListConfig = function(host, user_column_configsDic, columnList, tabletype){
    var typelists;
    if (host && host.database && host.database.typelists) typelists = host.database.typelists;
    else typelists = data_module.typelists;
    var tag = "getColumnListConfig" + Math.random();
    var ret = new Promise(function(resolve, reject){
        var res = EncodingClass.string.duplicate(columnList);
        if (user_column_configsDic && user_column_configsDic[tabletype] !== undefined){
            var dic = {};
            for (var i = 0; i < user_column_configsDic[tabletype].length; i++){
                dic[user_column_configsDic[tabletype][i].value] = i + 1;
            }
            for (var i = 0; i < res.length; i++){
                if (dic[res[i].value]){
                    res[i].stt = dic[res[i].value];
                    res[i].display = user_column_configsDic[tabletype][dic[res[i].value] - 1].display;
                }
                else {
                    res[i].stt = 1000;
                }
            }
            res.sort(function(a, b){
                return a.stt - b.stt;
            });
        }
        res = res.filter(function(item){
            return item.display;
        });
        if (!host){
            resolve(res);
            return;
        }
        var listPromise = [];
        var typeDic = contentModule.makeDictionaryIndex(typelists.items);
        listPromise = res.map(function(item, idx){
            var did = "";
            if (!item.type) return;
            var res1;
            var tIndex, type;
            if (item.type == "purpose"){
                var listPurpose = contentModule.listPurposeHasActivities();
                var res2 = [];
                item.itemsDic = {};
                listPurpose.forEach(function(itemPurpose, i){
                    if (itemPurpose.datatype){
                        if ((itemPurpose.datatype == "member_of_partner") || (itemPurpose.datatype == "member_of_contact") || (itemPurpose.datatype == "member_of_objects")){
                            res2.push(new Promise(function(rs1){
                                data_module.loadTables([itemPurpose.tablenameCache], function(){
                                    item.itemsDic[itemPurpose.tablename] = {
                                         type: itemPurpose.datatype,
                                         name: itemPurpose.name
                                    };
                                    rs1();
                                })
                            }));
                        }
                        else {
                            res2.push(contentModule.loadListPrimaryTypeEnum(itemPurpose.datatype, tag).then(function(list){
                                if (list.length > 0) list[0].text = "";
                                item.itemsDic[itemPurpose.tablename] = {
                                     type: itemPurpose.datatype,
                                     listItems: list,
                                     listItemsDic: new absol.ListDictionary(list),
                                     name: itemPurpose.name
                                };
                            }));
                        }
                    }
                    else {
                        item.itemsDic[itemPurpose.tablename] = {
                             name: itemPurpose.name
                        };
                    }
                });
                console.log(res2);
                res1 = new Promise(function(rs, rj){
                    Promise.all(res2).then(function(){
                        item.type = "purpose";
                        rs();
                    });
                });
                did = "Promise.all";
            }
            else if (item.type == "marked"){
                // TODO:
            }
            else {
                tIndex = typeDic[item.type];
                type = typelists.items[tIndex].type;
                if (contentModule.listTypeSelectmenu.indexOf(type) >= 0){
                    if (type == "member_of_partner"){
                        res1 = new Promise(function(rs1){
                            data_module.loadTables(["partners"], function(){
                                rs1();
                            });
                        });
                    }
                    else if (type == "member_of_contact"){
                        res1 = new Promise(function(rs1){
                            data_module.loadTables(["contacts"], function(){
                                rs1();
                            });
                        });
                    }
                    else if (type == "member_of_objects"){
                        res1 = new Promise(function(rs1){
                            data_module.loadTables(["objects"], function(){
                                rs1();
                            });
                        });
                    }
                    else {
                        res1 = contentModule.loadListPrimaryTypeEnum(type).then(function(list){
                            item.listItems = list;
                            if (type == "nation_city"){
                                item.listItems.forEach(function(nationItem){
                                    nationItem.listItemsDic = new absol.ListDictionary(nationItem.items);
                                });
                                item.listItemsDic = new absol.ListDictionary(item.listItems, {depth: false});
                            }
                            else {
                                if (item.listItems.length > 0) item.listItems[0].text = "";
                                item.listItemsDic = new absol.ListDictionary(item.listItems);
                            }
                        });
                        did = "contentModule.loadListPrimaryTypeEnum";
                    }
                    item.type = type;
                }
                else if (contentModule.listTypeSelectbox.indexOf(type) >= 0){
                    res1 = contentModule.loadListPrimaryTypeEnum(type).then(function(list){
                        item.listItems = list;
                        item.listItemsDic = new absol.ListDictionary(list);
                    });
                    did = "contentModule.loadListPrimaryTypeEnum.box";
                    item.type = type;
                }
                else if (type == "enum" || type == "extends_enum" || typelists.items[tIndex].type2 == "enum"){
                    var list = [];
                    contentModule.getDetailsExtends(host, list, item.type);
                    item.listItems = [];
                    for (var i = 0; i < list.length; i++){
                        item.listItems.push({value: list[i].localid, text: list[i].text});
                    }
                    item.listItemsDic = new absol.ListDictionary(item.listItems);
                    item.type = "enum";
                }
                else if (type == "enum_multi" || type == "extends_enum_multi" || typelists.items[tIndex].type2 == "enum_multi"){
                    var list = [];
                    contentModule.getDetailsExtends(host, list, item.type);
                    item.listItems = [];
                    for (var i = 0; i < list.length; i++){
                        item.listItems.push({value: list[i].localid, text: list[i].text});
                    }
                    item.listItemsDic = new absol.ListDictionary(item.listItems);
                    item.type = "enum_multi";
                }
                else {
                    item.type = type;
                }
            }
            if (res1) res1.did = did;
            return res1;
        }).filter(function(res1){return !!res1;});
        Promise.all(listPromise).then(function(){
            resolve(res);
        }, function(err){
            console.log("err" + tag);
            reject(err);
        });
    });

    ret.tag = tag;
    return ret;
};

contentModule.userColumnConfigForm = function(params){
    return new Promise(function(resolve, reject){
        var saveFunc = function(){
            var countDisplay = 0;
            var dataSave = [], value;
            var data = tableView.requireRows();
            var rowData;
            for (var i = 0; i < data.length; i++){
                rowData = data[i];
                value = rowData.data.getValue();
                if (value.display) countDisplay++;
                dataSave.push(value);
            }
            if (countDisplay == 0){
                ModalElement.alert({message: "Phải chọn ít nhất 1 cột"});
                return;
            }
            ModalElement.show_loading();
            FormClass.api_call({
                url: "user_column_configs_save.php",
                params: [
                    {name: "config", value: EncodingClass.string.fromVariable(dataSave)},
                    {name: "type", value: params.type}
                ],
                func: function(success, message){
                    ModalElement.close(-1);
                    if (success){
                        if (message.substr(0, 2) == "ok"){
                            resolve(dataSave);
                            ModalElement.close();
                        }
                        else {
                            ModalElement.alert({message: message});
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
            });
        };
        var tableView;
        var drawFunc = function(){
            var getRow = function(content){
                var display_checkbox = absol.buildDom({
                    tag: "switch",
                    style: {
                        font: "var(--switch-fontsize)",
                        margin: "auto"
                    },
                    props: {
                        checked: content.display
                    }
                });
                var cells = [
                    {
                        style: {
                            textAlign: 'center',
                            fontSize: '25px'
                        },
                        class:'as-drag-zone',
                        child: 'span.mdi.mdi-drag'
                    },
                    {
                        child: DOMElement.span({
                            text: content.text
                        })
                    },
                    {
                        style: {textAlign: "center"},
                        child: display_checkbox
                    }
                ];
                var rowData = {
                   cells: cells
               };
               rowData.getValue = function(){
                   return {
                       value: content.value,
                       display: display_checkbox.checked
                   };
               };
               return rowData;
            };
            var data = [];
            for (var i = 0; i < config.length; i++){
                data.push(getRow(config[i]));
            }
            tableView = absol.buildDom({
                tag: "dynamictable",
                style: {
                    minWidth: "400px"
                },
                props: {
                    id: "table_list_config_columns",
                    adapter: {
                       data: {
                           head: {
                               rows: [
                                   {
                                       cells: [
                                           {
                                               style: {
                                                   width: '40px'
                                               }
                                           },
                                           {
                                               child:  absol.buildDom({text: LanguageModule.text("txt_column_name")})
                                           },
                                           {
                                               child:  absol.buildDom({text: LanguageModule.text("txt_display")})
                                           }
                                       ]
                                   }
                               ]
                           },
                           body: {
                               rows: data
                           }
                       }
                   }
                }
            });
            ModalElement.showWindow({
                title: LanguageModule.text("txt_show_columns"),
                bodycontent: tableView,
                buttonlist: [
                    {
                        text: LanguageModule.text("txt_save"),
                        onclick: function(){
                            saveFunc();
                        }
                    },
                    {
                        text: LanguageModule.text("txt_cancel"),
                        onclick: function(){
                            ModalElement.close();
                        }
                    }
                ]
            });
        };
        var config = params.columnList;
        ModalElement.show_loading();
        FormClass.api_call({
            url: "database_load.php",
            params: [
                {name: "task", value: "user_column_configs"},
                {name: "type", value: params.type}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var st = EncodingClass.string.toVariable(message.substr(2));
                        if (st.length > 0){
                            st[0].config = EncodingClass.string.toVariable(st[0].config);
                            var dic = {};
                            for (var i = 0; i < st[0].config.length; i++){
                                dic[st[0].config[i].value] = i + 1;
                            }
                            for (var i = 0; i < config.length; i++){
                                if (dic[config[i].value]){
                                    config[i].stt = dic[config[i].value];
                                    config[i].display = st[0].config[dic[config[i].value] - 1].display;
                                }
                                else {
                                    config[i].stt = 1000;
                                }
                            }
                            config.sort(function(a, b){
                                return a.stt - b.stt;
                            });
                        }
                        drawFunc();
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

contentModule.getUser_column_configsDic = function(host){
    var dic = {};
    host.database.user_column_configs.items.forEach(function(item){
        dic[item.type] = EncodingClass.string.toVariable(item.config);
    });
    return dic;
};

contentModule.getColumnListFromTypeid = function(host, typeid, displayDic, extra, ps = {}){
    var typeIndex = data_module.typelists.getIndex(typeid);
    var content = data_module.typelists.items[typeIndex].content;
    if (contentModule.datatypeAdvanced.indexOf(data_module.typelists.items[typeIndex].type) >= 0 && EncodingClass.type.isString(content)){
        content = EncodingClass.string.toVariable(content);
    }
    var list = [];
    contentModule.getDetailsExtends(host, list, typeid);
    var dict = {};
    data_module.typelists.items.forEach(function (elt, index) {
        dict[elt.id] = elt;
    });
    var columnList = [], colItem;
    if (!extra) var mainData = contentModule.getMainData(typeid, dict);
    var type, tIndex;
    for (var i = 0; i < list.length; i++){
        type = list[i].type;
        if (type == "union") type = list[i].typeOfUnion;
        tIndex = data_module.typelists.getIndex(type);
        if (!ps.all){
            if (data_module.typelists.items[tIndex].type == "structure") continue;
            if (data_module.typelists.items[tIndex].type == "extends_structure") continue;
            if (data_module.typelists.items[tIndex].type2 == "structure") continue;
            if (data_module.typelists.items[tIndex].type == "files") continue;
            if (data_module.typelists.items[tIndex].type == "image_file") continue;
            if (data_module.typelists.items[tIndex].type == "any_file") continue;
        }
        if (!extra && mainData[list[i].localid]){
            colItem = {
                value: mainData[list[i].localid],
                display: displayDic[mainData[list[i].localid]],
                main: true
            };
        }
        else {
            if (ps.noExtra) continue;
            if (!ps.all) if (data_module.typelists.items[tIndex].type == "array") continue;
            colItem = {
                value: list[i].localid,
                display: false
            }
            if (ps.all && data_module.typelists.items[tIndex].type == "array") colItem.notView = true;
        }
        if (list[i].type == "union") colItem.type = list[i].typeOfUnion;
        else colItem.type = list[i].type;
        colItem.text = list[i].name;
        if (ps.all){
            if (data_module.typelists.items[tIndex].type == "structure") colItem.notView = true;
            if (data_module.typelists.items[tIndex].type == "extends_structure") colItem.notView = true;
            if (data_module.typelists.items[tIndex].type2 == "structure") colItem.notView = true;
            if (data_module.typelists.items[tIndex].type == "files") colItem.notView = true;
            if (data_module.typelists.items[tIndex].type == "image_file") colItem.notView = true;
            if (data_module.typelists.items[tIndex].type == "any_file") colItem.notView = true;
        }
        columnList.push(colItem);
    }
    return columnList;
};

contentModule.getColumnListFromDatatype = function(host, type, displayDic, extra, ps){
    var typeid = data_module.form_config[type].typeid;
    return contentModule.getColumnListFromTypeid(host, typeid, displayDic, extra, ps);
};
contentModule.getMarkIcon = function(marked, func){
    if (marked){
        return DOMElement.div({
            attrs: {
                className: "card-icon-cover",
                onclick: function(event, me){
                    func(false).then(function(){
                        var pa = me.parentNode;
                        DOMElement.removeAllChildren(pa);
                        pa.appendChild(contentModule.getMarkIcon(false, func));
                    });
                }
            },
            children: [DOMElement.i({
                attrs: {
                    className: "material-icons ",
                    style: {
                        cursor: "pointer",
                        color: "#ffa834",
                        fontSize: "var(--icon-fontsize)"
                    }
                },
                text: "star"
            })]
        });
    }
    else {
        return DOMElement.div({
            attrs: {
                className: "card-icon-cover",
                onclick: function(event, me){
                    func(true).then(function(){
                        var pa = me.parentNode;
                        DOMElement.removeAllChildren(pa);
                        pa.appendChild(contentModule.getMarkIcon(true, func));
                    });
                }
            },
            children: [
                DOMElement.i({
                    attrs: {
                        className: "material-icons",
                        style: {
                            cursor: "pointer",
                            color: "#7a7a7a",
                            fontSize: "var(--icon-fontsize)"
                        }
                    },
                    text: "star_border"
                })
            ]
        });
    }
};

contentModule.getstarIconView = function(){
    return DOMElement.span({
        attrs: {
            className: "material-icons",
            style: {
                color: "#ffa834",
                fontSize: "var(--icon-fontsize)",
                marginLeft: "5px",
                verticalAlign: "middle"
            }
        },
        text: "star"
    });
};

contentModule.getCellEfficientTable = function(content, value, paramsFunc = {}){
    var res;
    switch (content.type){
        case "color_picker":
            res = {
                element: absol.buildDom({
                    tag: "colorpickerbutton",
                    props: {
                        mode: 'HEX6',
                        value: value == "" ? "white" : value,
                        disabled: true
                    }
                }),
                style: {textAlign: "center"},
                keySort: value == "" ? "white" : value
            };
            break;
        case "marked":
            var markIcon = contentModule.getMarkIcon(value, paramsFunc.markedFunc);
            res = {
                element: contentModule.getMarkIcon(value, paramsFunc.markedFunc),
                style: {textAlign: "center"},
                keySort: ""
            };
            break;
        case "string":
        case "email_address":
        case "website":
        case "phonenumber":
            res = {
                innerText: value,
                keySort: value
            };
            break;
        case "gps":
            res = {
                innerText: value,
                keySort: value
            };
            break;
        case "note":
            if (!value) value = "";
            var valueText = value + "";
            if (paramsExtra && paramsExtra.variables && paramsExtra.variables[content.value]){
                valueText = hr.sclang.executeTemplate(value, paramsExtra.variables[content.value]) + "";
            }
            valueText = valueText? valueText.substr(0, 200) : "";
            res = {
                innerText: value,
                keySort: value
            };
            break;
        case "number":
            res = {
                innerText: (value === "" || value === undefined)? "" : absol.$.formatLocalFloat(value),
                style: {
                    textAlign: "right"
                },
                keySort: value
            };
            break;
        case "currency":
            res = {
                innerText: (value === "" || value === undefined)? "" : absol.$.formatLocalFloat(value),
                style: {
                    textAlign: "right"
                },
                keySort: value
            };
            break;
        case "date":
            res = {
                innerText: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getDateView(value) : "",
                style: {
                    textAlign: "center"
                },
                keySort: value
            };
            break;
        case "datemonth":
            var textView = "";
            if (value){
                var month = value.month + 1;
                if (month < 10) month = "0" + month;
                var date = value.date;
                if (date < 10) date = "0" + date;
                textView = date + "/" + month;
            }
            res = {
                innerText: textView,
                style: {
                    textAlign: "center"
                },
                keySort: value
            };
            break;
        case "datetime":
            res = {
                innerText: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getDateTimeView(value) : "",
                style: {
                    textAlign: "center"
                },
                keySort: value
            };
            break;
        case "time":
            res = {
                innerText: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getTimeView(value) : "",
                style: {
                    textAlign: "center"
                },
                keySort: value
            };
            break;
        case "year":
            res = {
                innerText: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getYearView(value) : "",
                style: {
                    textAlign: "center"
                },
                keySort: value
            };
            break;
        case "month":
            res = {
                innerText: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getMonthView(value) : "",
                style: {
                    textAlign: "center"
                },
                keySort: value
            };
            break;
        case "week":
            res = {
                innerText: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getWeekView(value) : "",
                style: {
                    textAlign: "center"
                },
                keySort: value
            };
            break;
        case "date_level":
            var valueText = "";
            if (value && value.value && value.value.getTime() != TIME_NULL_MILLISECOND){
                switch (value.level) {
                    case "date":
                        valueText = contentModule.getDateView(value.value);
                        break;
                    case "week":
                        valueText = contentModule.getWeekView(value.value);
                        break;
                    case "month":
                        valueText = contentModule.getMonthView(value.value);
                        break;
                    case "quarter":
                        valueText = contentModule.getQuaterView(value.value);
                        break;
                    case "year":
                        valueText = contentModule.getYearView(value.value);
                        break;
                    default:

                }
            }
            res = {
                innerText: valueText,
                style: {
                    textAlign: "center"
                },
                keySort: valueText
            };
            break;
        case "boolean":
            var t;
            if (content.notLink){
                t = absol.buildDom({
                    tag: "switch",
                    style: {
                        font: "var(--switch-fontsize)"
                    },
                    props: {
                        checked: value,
                        disabled: !content.notDisabled
                    },
                    on: {
                        change: function(){
                            if (paramsFunc.changeStatus) paramsFunc.changeStatus(this.checked);
                        }
                    }
                });
            }
            else {
                t = absol.buildDom({
                    tag: "switch",
                    style: {
                        font: "var(--switch-fontsize)"
                    },
                    props: {
                        checked: value,
                        disabled: !content.notDisabled
                    }
                });
            }
            res = {
                element: t,
                style: {
                    textAlign: "center"
                },
                keySort: value
            };
            break;
        case "hour_period":
            var text = "";
            if (value) text = absol.datetime.formatTimeRange24(value);
            res = {
                innerText: text,
                style: {whiteSpace: "nowrap"},
                keySort: text
            };
            break;
        case "html":
            var xt = DOMElement.div({
                innerHTML: value? value: ""
            });
            var valueText = xt.innerText.substr(0, 200);
            res = {
                innerText: valueText,
                keySort: value? value: ""
            };
            break;
        case "nation_city":
            var text = "", nation;
            if (value){
                var item = content.listItemsDic.getItemByValue(value[0]);
                if (item){
                    nation = item.text;
                    item = item.listItemsDic.getItemByValue(value[1]);
                    if (item) text += item.text + ", ";
                    text += nation;
                }
            }
            res = {
                innerText: text,
                style: {whiteSpace: "nowrap"},
                keySort: text
            };
            break;
        default:
            if (contentModule.listTypeSelectmenu.indexOf(content.type) >= 0 || content.type == "enum" || content.type == "extends_enum"){
                var text = "";
                if (content.type == "member_of_partner"){
                    if (value){
                        var pData = data_module.getContent("partners", value);
                        if (pData) text = pData.name;
                    }
                    else {
                        text = "";
                    }
                }
                else if (content.type == "member_of_objects"){
                    if (value){
                        var oData = data_module.getContent("objects", value);
                        if (oData) text = oData.name;
                    }
                    else {
                        text = "";
                    }
                }
                else if (content.type == "member_of_contact"){
                    if (value){
                        var cData = data_module.getContent("contacts", value);
                        if (cData) text = cData.name;
                    }
                    else {
                        text = "";
                    }
                }
                else {
                    if (content.type == "member_of_employee"){
                        if (data_module.all_employeesDic && data_module.all_employeesDic[value]) value = data_module.all_employeesDic[value];
                    }
                    var item = content.listItemsDic.getItemByValue(value);
                    if (!item) text = "";
                    else text = item.text;
                }
                res = {
                    innerText: text,
                    keySort: text
                };
            }
            else if (contentModule.listTypeSelectbox.indexOf(content.type) >= 0 || content.type == "enum_multi") {
                var text = "";
                var item;
                if (value){
                    for (var i = 0; i < value.length; i++){
                        if (content.type == "employee_list"){
                            if (data_module.all_employeesDic[value[i]]) value[i] = data_module.all_employeesDic[value[i]];
                        }
                        else if (content.type == "select_department_employee"){
                            if (-value[i] < 0){
                                if (data_module.all_employeesDic[-value[i]]) value[i] = -data_module.all_employeesDic[-value[i]];
                            }
                        }
                        item = content.listItemsDic.getItemByValue(value[i]);
                        if (item) text += ", " + item.text
                    }
                    text = text.substr(2);
                }
                res = {
                    innerText: text,
                    keySort: text
                };
            }
            else if (content.type == "purpose"){
                var text = "";
                if (value){
                    if (content.itemsDic[value.tablename]){
                        text = content.itemsDic[value.tablename].name;
                        if (value.tablename == "objects"){
                            var oData = data_module.getContent("objects", value.instanceid);
                            if (oData) text += ": " + oData.name;
                            else text += ":";
                        }
                        else if (value.tablename == "partner"){
                            var pData = data_module.getContent("partners", value.instanceid);
                            if (pData) text += ": " + pData.name;
                            else text += ":";
                        }
                        else if (value.tablename == "contact"){
                            var cData = data_module.getContent("contacts", value.instanceid);
                            if (cData) text += ": " + cData.name;
                            else text += ":";
                        }
                        else if (content.itemsDic[value.tablename].listItems){
                            var item = content.itemsDic[value.tablename].listItemsDic.getItemByValue(value.instanceid);
                            if (item) text += ": " + item.text;
                            else text += ":";
                        }
                    }
                }
                res = {
                    innerText: text,
                    keySort: text
                };
            }
            else {
                res = {
                    innerText: value,
                    keySort: value
                };
            }

    }
    return res;
};

contentModule.getCellDynamicTable = function(content, value, paramsFunc = {}, paramsExtra = {}){
    var res;
    function applyParam(elt){
        if (paramsFunc.onclick){
            elt.classList.add("hr-table-cell-link");
            elt.onclick = paramsFunc.onclick;
        }
        return elt;
    }
    switch (content.type){
        case "color_picker":
            res = {
                style: {textAlign: "center"},
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(absol.buildDom({
                            tag: "colorpickerbutton",
                            props: {
                                mode: 'HEX6',
                                value: value == "" ? "white" : value,
                                disabled: true
                            }
                        }));
                    }
                    else {
                        tdElt.addChild(DOMElement.div({
                            children: [
                                absol.buildDom({
                                    tag: "colorpickerbutton",
                                    style: {
                                        display: "inline-block"
                                    },
                                    props: {
                                        mode: 'HEX6',
                                        value: value == "" ? "white" : value,
                                        disabled: true
                                    }
                                }),
                                contentModule.getstarIconView()
                            ]
                        }));
                    }
                },
                keySort: value == "" ? "white" : value
            };
            break;
        case "marked":
            var markIcon = contentModule.getMarkIcon(value, paramsFunc.markedFunc);
            res = {
                style: {textAlign: "center"},
                render: function(tdElt){
                    tdElt.addChild(DOMElement.div({
                        children: [markIcon]
                    }));
                },
                keySort: ""
            };
            break;
        case "string":
        case "email_address":
        case "website":
        case "phonenumber":
            res = {
                innerText: value,
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            text: value
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            children: [
                                DOMElement.span({text: value}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: value
            };
            break;
        case "gps":
            res = {
                innerText: value,
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            text: value.length > 10? value.substr(0, 10) + "..." : value
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            children: [
                                DOMElement.span({text: value.length > 10? value.substr(0, 10) + "..." : value}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: value
            };
            break;
        case "note":
            if (!value) value = "";
            var valueText = value + "";
            if (paramsExtra && paramsExtra.variables && paramsExtra.variables[content.value]){
                valueText = hr.sclang.executeTemplate(value, paramsExtra.variables[content.value]) + "";
            }
            valueText = valueText? valueText.substr(0, 200) : "";
            res = {
                innerText: value,
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            attrs: {
                                className: "hr-table-desc-ctn"
                            },
                            text: valueText
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            attrs: {
                                className: "hr-table-desc-ctn"
                            },
                            children: [
                                DOMElement.span({text: valueText}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: value
            };
            break;
        case "number":
            res = {
                innerText: (value === "" || value === undefined)? "" : absol.$.formatLocalFloat(value),
                style: {
                    textAlign: "right"
                },
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            text: (value === "" || value === undefined)? "" : absol.$.formatLocalFloat(value)
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            children: [
                                DOMElement.span({text: (value === "" || value === undefined)? "" : absol.$.formatLocalFloat(value)}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: value
            };
            break;
        case "currency":
            res = {
                innerText: (value === "" || value === undefined)? "" : absol.$.formatLocalFloat(value),
                style: {
                    textAlign: "right"
                },
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            text: (value === "" || value === undefined)? "" : absol.$.formatLocalFloat(value)
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            children: [
                                DOMElement.span({text: (value === "" || value === undefined)? "" : absol.$.formatLocalFloat(value)}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: value
            };
            break;
        case "date":
            res = {
                innerText: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getDateView(value) : "",
                style: {
                    textAlign: "center"
                },
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getDateView(value) : ""
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            children: [
                                DOMElement.span({text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getDateView(value) : ""}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: value
            };
            break;
        case "datemonth":
            var textView = "";
            if (value){
                var month = value.month + 1;
                if (month < 10) month = "0" + month;
                var date = value.date;
                if (date < 10) date = "0" + date;
                textView = date + "/" + month;
            }
            res = {
                innerText: textView,
                style: {
                    textAlign: "center"
                },
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            text: textView
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            children: [
                                DOMElement.span({text: textView}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: value
            };
            break;
        case "datetime":
            res = {
                innerText: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getDateTimeView(value) : "",
                style: {
                    textAlign: "center"
                },
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getDateTimeView(value) : ""
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            children: [
                                DOMElement.span({text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getDateTimeView(value) : ""}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: value
            };
            break;
        case "time":
            res = {
                innerText: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getTimeView(value) : "",
                style: {
                    textAlign: "center"
                },
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getTimeView(value) : ""
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            children: [
                                DOMElement.span({text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getTimeView(value) : ""}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: value
            };
            break;
        case "year":
            res = {
                innerText: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getYearView(value) : "",
                style: {
                    textAlign: "center"
                },
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getYearView(value) : ""
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            children: [
                                DOMElement.span({text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getYearView(value) : ""}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: value
            };
            break;
        case "month":
            res = {
                innerText: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getMonthView(value) : "",
                style: {
                    textAlign: "center"
                },
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getMonthView(value) : ""
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            children: [
                                DOMElement.span({text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getMonthView(value) : ""}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: value
            };
            break;
        case "week":
            res = {
                innerText: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getWeekView(value) : "",
                style: {
                    textAlign: "center"
                },
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getWeekView(value) : ""
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            children: [
                                DOMElement.span({text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getWeekView(value) : ""}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: value
            };
            break;
        case "date_level":
            var valueText = "";
            if (value && value.value && value.value.getTime() != TIME_NULL_MILLISECOND){
                switch (value.level) {
                    case "date":
                        valueText = contentModule.getDateView(value.value);
                        break;
                    case "week":
                        valueText = contentModule.getWeekView(value.value);
                        break;
                    case "month":
                        valueText = contentModule.getMonthView(value.value);
                        break;
                    case "quarter":
                        valueText = contentModule.getQuaterView(value.value);
                        break;
                    case "year":
                        valueText = contentModule.getYearView(value.value);
                        break;
                    default:

                }
            }
            res = {
                innerText: valueText,
                style: {
                    textAlign: "center"
                },
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            text: valueText
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            children: [
                                DOMElement.span({text: valueText}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: valueText
            };
            break;
        case "boolean":
            res = {
                innerText: value? LanguageModule.text("txt_yes") : LanguageModule.text("txt_no"),
                style: {
                    textAlign: "center"
                },
                render: function(tdElt){
                    if (content.notLink){
                        tdElt.addChild(absol.buildDom({
                            tag: "switch",
                            style: {
                                font: "var(--switch-fontsize)"
                            },
                            props: {
                                checked: value,
                                disabled: !content.notDisabled
                            },
                            on: {
                                change: function(){
                                    if (paramsFunc.changeStatus) paramsFunc.changeStatus(this.checked);
                                }
                            }
                        }));
                    }
                    else {
                        tdElt.addChild(absol.buildDom({
                            tag: "switch",
                            style: {
                                font: "var(--switch-fontsize)"
                            },
                            props: {
                                checked: value,
                                disabled: !content.notDisabled
                            }
                        }));
                    }
                },
                keySort: value
            };
            break;
        case "hour_period":
            var text = "";
            if (value) text = absol.datetime.formatTimeRange24(value);
            res = {
                innerText: text,
                style: {whiteSpace: "nowrap"},
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            attrs: {
                                align: "center"
                            },
                            text: text
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            attrs: {
                                align: "center"
                            },
                            children: [
                                DOMElement.span({text: text}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: text
            };
            break;
        case "html":
            var xt = DOMElement.div({
                innerHTML: value? value: ""
            });
            var valueText = xt.innerText.substr(0, 200);
            res = {
                innerText: valueText,
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            text: valueText
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            children: [
                                DOMElement.span({text: valueText}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: value? value: ""
            };
            break;
        case "nation_city":
            var text = "", nation;
            if (value){
                var item = content.listItemsDic.getItemByValue(value[0]);
                if (item){
                    nation = item.text;
                    item = item.listItemsDic.getItemByValue(value[1]);
                    if (item) text += item.text + ", ";
                    text += nation;
                }
            }
            res = {
                innerText: text,
                style: {whiteSpace: "nowrap"},
                render: function(tdElt){
                    if (!paramsExtra.marked){
                        tdElt.addChild(applyParam(DOMElement.div({
                            text: text
                        })));
                    }
                    else {
                        tdElt.addChild(applyParam(DOMElement.div({
                            children: [
                                DOMElement.span({text: text}),
                                contentModule.getstarIconView()
                            ]
                        })));
                    }
                },
                keySort: text
            };
            break;
        default:
            if (contentModule.listTypeSelectmenu.indexOf(content.type) >= 0 || content.type == "enum" || content.type == "extends_enum"){
                var text = "";
                if (content.type == "member_of_partner"){
                    if (value){
                        var pData = data_module.getContent("partners", value);
                        if (pData) text = pData.name;
                    }
                    else {
                        text = "";
                    }
                }
                else if (content.type == "member_of_objects"){
                    if (value){
                        var oData = data_module.getContent("objects", value);
                        if (oData) text = oData.name;
                    }
                    else {
                        text = "";
                    }
                }
                else if (content.type == "member_of_contact"){
                    if (value){
                        var cData = data_module.getContent("contacts", value);
                        if (cData) text = cData.name;
                    }
                    else {
                        text = "";
                    }
                }
                else {
                    if (content.type == "member_of_employee"){
                        if (data_module.all_employeesDic && data_module.all_employeesDic[value]) value = data_module.all_employeesDic[value];
                    }
                    var item = content.listItemsDic.getItemByValue(value);
                    if (!item) text = "";
                    else text = item.text;
                }
                res = {
                    innerText: text,
                    render: function(tdElt){
                        if (!paramsExtra.marked){
                            tdElt.addChild(applyParam(DOMElement.div({
                                text: text
                            })));
                        }
                        else {
                            tdElt.addChild(applyParam(DOMElement.div({
                                children: [
                                    DOMElement.span({text: text}),
                                    contentModule.getstarIconView()
                                ]
                            })));
                        }
                    },
                    keySort: text
                };
            }
            else if (contentModule.listTypeSelectbox.indexOf(content.type) >= 0 || content.type == "enum_multi") {
                var text = "";
                var item;
                if (value){
                    for (var i = 0; i < value.length; i++){
                        if (content.type == "employee_list"){
                            if (data_module.all_employeesDic[value[i]]) value[i] = data_module.all_employeesDic[value[i]];
                        }
                        else if (content.type == "select_department_employee"){
                            if (-value[i] < 0){
                                if (data_module.all_employeesDic[-value[i]]) value[i] = -data_module.all_employeesDic[-value[i]];
                            }
                        }
                        item = content.listItemsDic.getItemByValue(value[i]);
                        if (item) text += ", " + item.text
                    }
                    text = text.substr(2);
                }
                res = {
                    innerText: text,
                    render: function(tdElt){
                        if (!paramsExtra.marked){
                            tdElt.addChild(applyParam(DOMElement.div({
                                text: text
                            })));
                        }
                        else {
                            tdElt.addChild(applyParam(DOMElement.div({
                                children: [
                                    DOMElement.span({text: text}),
                                    contentModule.getstarIconView()
                                ]
                            })));
                        }
                    },
                    keySort: text
                };
            }
            else if (content.type == "purpose"){
                var text = "";
                if (value){
                    if (content.itemsDic[value.tablename]){
                        text = content.itemsDic[value.tablename].name;
                        if (value.tablename == "objects"){
                            var oData = data_module.getContent("objects", value.instanceid);
                            if (oData) text += ": " + oData.name;
                            else text += ":";
                        }
                        else if (value.tablename == "partner"){
                            var pData = data_module.getContent("partners", value.instanceid);
                            if (pData) text += ": " + pData.name;
                            else text += ":";
                        }
                        else if (value.tablename == "contact"){
                            var cData = data_module.getContent("contacts", value.instanceid);
                            if (cData) text += ": " + cData.name;
                            else text += ":";
                        }
                        else if (content.itemsDic[value.tablename].listItems){
                            var item = content.itemsDic[value.tablename].listItemsDic.getItemByValue(value.instanceid);
                            if (item) text += ": " + item.text;
                            else text += ":";
                        }
                    }
                }
                res = {
                    innerText: text,
                    render: function(tdElt){
                        if (!paramsExtra.marked){
                            tdElt.addChild(applyParam(DOMElement.div({
                                text: text
                            })));
                        }
                        else {
                            tdElt.addChild(applyParam(DOMElement.div({
                                children: [
                                    DOMElement.span({text: text}),
                                    contentModule.getstarIconView()
                                ]
                            })));
                        }
                    },
                    keySort: text
                };
            }
            else {
                res = {
                    innerText: value,
                    render: function(tdElt){
                        if (!paramsExtra.marked){
                            tdElt.addChild(applyParam(DOMElement.div({
                                text: text
                            })));
                        }
                        else {
                            tdElt.addChild(applyParam(DOMElement.div({
                                children: [
                                    DOMElement.span({text: text}),
                                    contentModule.getstarIconView()
                                ]
                            })));
                        }
                    },
                    keySort: value
                };
            }

    }
    return res;
};

contentModule.getCellTableView = function(content, value, func){
    var res;
    switch (content.type) {
        case "color_picker":
            res = {
                value: "color_picker___",
                style: {
                    textAlign: "center"
                },
                element: absol.buildDom({
                    tag: "colorpickerbutton",
                    props: {
                        mode: 'HEX6',
                        value: value == "" ? "white" : value,
                        disabled: true
                    }
                })
            };
            break;
        case "marked":
            var markIcon = contentModule.getMarkIcon(value, func.markedFunc);
            res = {
                value: "marked___",
                style: {
                    textAlign: "center"
                },
                element: DOMElement.div({
                    children: [markIcon]
                })
            };
            break;
        case "string":
        case "email_address":
        case "gps":
        case "website":
        case "phonenumber":
            res = {
                value: value,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view"
                    },
                    text: value
                })
            };
            break;
        case "note":
            var valueText = value? value.substr(0, 200) : "";
            res = {
                value: value,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view hr-table-desc-ctn"
                    },
                    text: value
                })
            };
            break;
        case "number":
            res = {
                style: {
                    textAlign: "right"
                },
                value: value,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                    },
                    text: (value === "")? "" : absol.$.formatLocalFloat(value)
                })
            };
            break;
        case "currency":
            res = {
                style: {
                    textAlign: "right"
                },
                value: value,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                    },
                    text: (value === "")? "" : absol.$.formatLocalFloat(value)
                })
            };
            break;
        case "date":
            res = {
                style: {
                    textAlign: "center"
                },
                value: (value)? value.getTime() : 0,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                    },
                    text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getDateView(value) : ""
                })
            };
            break;
        case "datetime":
            res = {
                style: {
                    textAlign: "center"
                },
                value: (value)? value.getTime() : 0,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                    },
                    text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getDateTimeView(value) : ""
                })
            };
            break;
        case "time":
            res = {
                style: {
                    textAlign: "center"
                },
                value: (value)? value.getTime() : 0,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                    },
                    text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getTimeView(value) : ""
                })
            };
            break;
        case "month":
            res = {
                style: {
                    textAlign: "center"
                },
                value: (value)? value.getTime() : 0,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                    },
                    text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getMonthView(value) : ""
                })
            };
            break;
        case "week":
            res = {
                style: {
                    textAlign: "center"
                },
                value: (value)? value.getTime() : 0,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                    },
                    text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getWeekView(value) : ""
                })
            };
            break;
        case "boolean":
            res = {
                value: value,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                        align: "center"
                    },
                    children: [absol.buildDom({
                        tag: "switch",
                        style: {
                            font: "var(--switch-fontsize)"
                        },
                        props: {
                            checked: value,
                            disabled: true
                        }
                    })]
                })
            };
            break;
        case "hour_period":
            var text = "";
            if (value && value.dayOffset) text = absol.datetime.formatTimeRange24(value);
            res = {
                style: {whiteSpace: "nowrap"},
                value: text,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                        align: "center"
                    },
                    text: text
                })
            };
            break;
        case "html":
            var xt = DOMElement.div({
                innerHTML: value? value: ""
            });
            var valueText = xt.innerText.substr(0, 200);
            res = {
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view hr-table-desc-ctn"
                    },
                    text: valueText
                })
            };
            break;
        case "nation_city":
            var text = "";
            if (value){
                var item = content.listItemsDic.getItemByValue(value[0]);
                if (item) text = item.text;
                var ld = new absol.ListDictionary(item.items);
                item = ld.getItemByValue(value[1]);
                if (item) text += " - " +  item.text;
            }
            res = {
                style: {whiteSpace: "nowrap"},
                value: text,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view"
                    },
                    text: text
                })
            };
            break;
        default:
            if (contentModule.listTypeSelectmenu.indexOf(content.type) >= 0 || content.type == "enum" || content.type == "extends_enum"){
                if (content.type == "member_of_employee"){
                    if (data_module.all_employeesDic[value]) value = data_module.all_employeesDic[value];
                }
                var item = content.listItemsDic.getItemByValue(value);
                var text;
                if (!item) text = "";
                else text = item.text;
                res = {
                    value: text,
                    element: DOMElement.div({
                        attrs: {
                            className: "sortTable-cell-view"
                        },
                        text: text
                    })
                };
            }
            else if (contentModule.listTypeSelectbox.indexOf(content.type) >= 0) {
                var text = "";
                var item;
                if (value){
                    for (var i = 0; i < value.length; i++){
                        if (content.type == "employee_list"){
                            if (data_module.all_employeesDic[value[i]]) value[i] = data_module.all_employeesDic[value[i]];
                        }
                        else if (content.type == "select_department_employee"){
                            if (-value[i] < 0){
                                if (data_module.all_employeesDic[-value[i]]) value[i] = -data_module.all_employeesDic[-value[i]];
                            }
                        }
                        item = content.listItemsDic.getItemByValue(value[i]);
                        if (item) text += ", " + item.text
                    }
                    text = text.substr(2);
                }
                res = {
                    value: text,
                    element: DOMElement.div({
                        attrs: {
                            className: "sortTable-cell-view"
                        },
                        text: text
                    })
                };
            }
            else if (content.type == "purpose"){
                var text = "";
                if (value){
                    if (content.itemsDic[value.tablename]){
                        text = content.itemsDic[value.tablename].name;
                        if (content.itemsDic[value.tablename].listItems){
                            var item = content.itemsDic[value.tablename].listItemsDic.getItemByValue(value.instanceid);
                            if (item) text += ": " + item.text;
                            else text += ":";
                        }
                    }
                }
                res = {
                    value: text,
                    element: DOMElement.div({
                        attrs: {
                            className: "sortTable-cell-view"
                        },
                        text: text
                    })
                };
            }
            else {
                res = {
                    value: value,
                    element: DOMElement.div({
                        attrs: {
                            className: "sortTable-cell-view"
                        },
                        text: value
                    })
                };
            }

    }
    return res;
};

contentModule.getFilterColumnIcon = function(params){
    return DOMElement.i({
        attrs: {
            className: "bsc-icon-hover-black mdi mdi-table-settings",
            onclick: params.func
        }
    });
};

contentModule.getCellHeaderTableView = function(content){
    return {value: content.text};
};

contentModule.getCellHeaderDynamicTable = function(content, paramsExtra = {}){
    var res = {
        style: {
            whiteSpace: "nowrap"
        },
        id: content.value,
        innerText: content.text,
        child: absol.buildDom({text: content.text})
    };
    if (paramsExtra.sort) res.sortKey = content.value;
    return res;
};

contentModule.makeEmailTemplateIndex = function(host){
    var k;
    for (var i = 0; i < host.database.template_groups.items.length; i++){
        host.database.template_groups.items[i].email_templates_index_list = [];
    }
    var data = [];
    for (var i = 0; i < host.database.email_templates.items.length; i++){
        if (host.database.email_templates.items[i].content == "") host.database.email_templates.items[i].content = {};
        else host.database.email_templates.items[i].content = EncodingClass.string.toVariable(host.database.email_templates.items[i].content);
        k = host.database.template_groups.getIndex(host.database.email_templates.items[i].typeid);
        if (k != -1) {
            host.database.email_templates.items[i].typeIndex = k;
            host.database.template_groups.items[k].email_templates_index_list.push(i);
            data.push(host.database.email_templates.items[i]);
        }
    }
    host.database.email_templates.items = data;
};

contentModule.makeTaskTemplateIndex = function(host){
    var k;
    for (var i = 0; i < host.database.template_groups.items.length; i++){
        host.database.template_groups.items[i].task_templates_index_list = [];
    }
    var data = [];
    for (var i = 0; i < host.database.task_templates.items.length; i++){
        if (host.database.task_templates.items[i].content == "") host.database.task_templates.items[i].content = {};
        else host.database.task_templates.items[i].content = EncodingClass.string.toVariable(host.database.task_templates.items[i].content);
        k = host.database.template_groups.getIndex(host.database.task_templates.items[i].typeid);
        if (k != -1) {
            host.database.task_templates.items[i].typeIndex = k;
            host.database.template_groups.items[k].task_templates_index_list.push(i);
            data.push(host.database.task_templates.items[i]);
        }
    }
    host.database.task_templates.items = data;
};

contentModule.makeMeetingTemplateIndex = function(host){
    var k;
    for (var i = 0; i < host.database.template_groups.items.length; i++){
        host.database.template_groups.items[i].meeting_templates_index_list = [];
    }
    var data = [];
    for (var i = 0; i < host.database.meeting_templates.items.length; i++){
        if (host.database.meeting_templates.items[i].content == "") host.database.meeting_templates.items[i].content = {};
        else host.database.meeting_templates.items[i].content = EncodingClass.string.toVariable(host.database.meeting_templates.items[i].content);
        k = host.database.template_groups.getIndex(host.database.meeting_templates.items[i].typeid);
        if (k != -1) {
            host.database.meeting_templates.items[i].typeIndex = k;
            host.database.template_groups.items[k].meeting_templates_index_list.push(i);
            data.push(host.database.meeting_templates.items[i]);
        }
    }
    host.database.meeting_templates.items = data;
};

contentModule.makeDocumentsIndex = function(host){
    for (var i = 0; i < host.database.document_folders.items.length; i++){
        host.database.document_folders.items[i].documentIndexList = [];
    }
    var folderDic = contentModule.makeDictionaryIndex(host.database.document_folders.items);
    var k;
    for (var i = 0; i < host.database.documents.items.length; i++){
        k = folderDic[host.database.documents.items[i].folderid];
        if (k !== undefined) host.database.document_folders.items[k].documentIndexList.push(i);
    }
};

contentModule.getVariableForTemplate = function(typeid, currentExpression){
    if (typeid === undefined) {
        ModalElement.alert({message: LanguageModule.text("txt_no_template_group_is_selected_yet")});
        return;
    };
    var examinationPluginVariable = [
        {text: "Tên bài kiểm tra", value: "name_of_examination"},
        {text: "Mô tả", value: "description_of_examination"},
        {text: "Giai đoạn", value: "stage_of_examination"},
        {text: "Thời gian chấm điểm (giờ)", value: "duration_of_examination_scoring"},
        {text: "Thời gian bắt đầu kiểm tra", value: "start_time_of_examination"},
        {text: "Thời lượng (phút)", value: "duration_of_examination"},
        {text: "Được phép bắt đầu trễ (phút)", value: "late_start_duration_of_examination"}
    ];
    var generalVariable = [
        {text: LanguageModule.text("txt_today"), value: "today"},
        {text: LanguageModule.text("txt_software_link"), value: "software_link"},
        {text: LanguageModule.text("txt_company_name_of_employee"), value: "company_name_of_employee"},
        {text: LanguageModule.text("txt_company_address_of_employee"), value: "company_address_of_employee"},
        {text: LanguageModule.text("txt_company_phonenumber_of_employee"), value: "company_phonenumber_of_employee"},
        {text: LanguageModule.text("txt_username"), value: "username"},
        {text: LanguageModule.text("txt_employee_name"), value: "employee_name"},
        {text: LanguageModule.text("txt_email_of_employee"), value: "email_of_employee"},
        {text: LanguageModule.text("txt_phonenumber_of_employee"), value: "phonenumber_of_employee"},
        {text: LanguageModule.text("txt_permanent_address"), value: "permanent_address"},
        {text: LanguageModule.text("txt_probation_start_date"), value: "probation_start_date"},
        {text: LanguageModule.text("txt_start_date_of_work"), value: "start_date_of_work"},
        {text: LanguageModule.text("txt_position_of_employee"), value: "position_of_employee"},
        {text: LanguageModule.text("txt_department_of_employee"), value: "department_of_employee"},
        {text: LanguageModule.text("txt_workplace_address_of_employee"), value: "workplace_address_of_employee"},
        {text: LanguageModule.text("txt_workplace_name_of_employee"), value: "workplace_name_of_employee"},
        {text: LanguageModule.text("txt_workplace_gps_address_of_employee"), value: "workplace_gps_address_of_employee"},
        {text: LanguageModule.text("txt_name_of_support_staff_hr"), value: "name_of_support_staff_hr"},
        {text: LanguageModule.text("txt_phonenumber_of_support_staff_hr"), value: "phonenumber_of_support_staff_hr"},
        {text: LanguageModule.text("txt_email_of_support_staff_hr"), value: "email_of_support_staff_hr"},
        {text: LanguageModule.text("txt_position_of_support_staff_hr"), value: "position_of_support_staff_hr"},
        {text: LanguageModule.text("txt_department_of_support_staff_hr"), value: "department_of_support_staff_hr"},
        {text: LanguageModule.text("txt_name_of_direct_manager"), value: "name_of_direct_manager"},
        {text: LanguageModule.text("txt_phonenumber_of_direct_manager"), value: "phonenumber_of_direct_manager"},
        {text: LanguageModule.text("txt_email_of_direct_manager"), value: "email_of_direct_manager"},
        {text: LanguageModule.text("txt_position_of_direct_manager"), value: "position_of_direct_manager"},
        {text: LanguageModule.text("txt_department_of_direct_manager"), value: "department_of_direct_manager"},
        {text: LanguageModule.text("txt_person_in_charge_of_labor_contract"), value: "person_in_charge_of_labor_contract"},
        {text: LanguageModule.text("txt_storekeeper"), value: "storekeeper"},
        {text: LanguageModule.text("txt_email_of_person_in_charge_of_labor_contract"), value: "email_of_person_in_charge_of_labor_contract"},
        {text: LanguageModule.text("txt_email_of_storekeeper"), value: "email_of_storekeeper"},
        {text: LanguageModule.text("txt_list_of_labor_contract_is_about_to_expire"), value: "list_of_labor_contract_is_about_to_expire"},
        {text: LanguageModule.text("txt_list_of_asset_is_about_to_expire"), value: "list_of_asset_is_about_to_expire"},
        {text: LanguageModule.text("txt_contract_number"), value: "contract_number"},
        {text: LanguageModule.text("txt_contract_effective_date_from"), value: "effective_date_from"},
        {text: LanguageModule.text("txt_contract_effective_date_to"), value: "effective_date_to"},
        {text: LanguageModule.text("txt_asset_name"), value: "asset_name"},
        {text: LanguageModule.text("txt_asset_code"), value: "asset_code"},
        {text: LanguageModule.text("txt_period_of_scorecard"), value: "period_of_scorecard"},
        {text: LanguageModule.text("txt_list_of_low_performance_kpis"), value: "list_of_low_performance_kpis"}
    ];
    var accordingToDataType = {};
    accordingToDataType[-227] = [
        {text: LanguageModule.text("txt_link_to_open_form"), value: "link_to_open_form"}
    ];
    accordingToDataType[-228] = [
        {text: LanguageModule.text("txt_link_to_open_form"), value: "link_to_open_form"},
        {text: LanguageModule.text("txt_end_date_of_work"), value: "end_date_of_work"}
    ];
    return new Promise(function (resolve) {
        var is_expression;
        if (currentExpression) {
            var pattern = /[+,\-,*,/]/;
            var rs = currentExpression.match(pattern);
            if (rs) is_expression = true;
            else is_expression = false;
        }
        else is_expression = false;
        var switchBtn = absol._({
            tag: "switch",
            style: {
                font: "var(--switch-fontsize)"
            },
            props: {
                checked: is_expression
            },
            on: {
                change: function(){
                    if (this.checked) {
                        absol.$(".hr-meeting-template-choose-variable", table, function(elt){
                            elt.style.display = "none";
                        });
                        absol.$(".hr-meeting-template-write-expression", table, function(elt){
                            elt.style.display = null;
                        });
                    }
                    else {
                        absol.$(".hr-meeting-template-choose-variable", table, function(elt){
                            elt.style.display = null;
                        });
                        absol.$(".hr-meeting-template-write-expression", table, function(elt){
                            elt.style.display = "none";
                        });
                    }
                }
            }
        });
        var variableList = generalVariable;
        if (accordingToDataType[typeid]) variableList = variableList.concat(accordingToDataType[typeid]);
        variableList.forEach(function(elt){
            elt.isLeaf = true;
            elt.sortText = absol.string.nonAccentVietnamese(elt.text.toLowerCase());
        });
        variableList.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });

        examinationPluginVariable.forEach(function(elt){
            elt.isLeaf = true;
            elt.sortText = absol.string.nonAccentVietnamese(elt.text.toLowerCase());
        });
        examinationPluginVariable.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });

        var cbbItems = [
            {value: "hr", text: "HR", items: variableList},
            {value: "plugin", text: "Bài kiểm tra (plugin)", items: examinationPluginVariable}
        ]

        var selectMenu = absol._({
            tag: 'selecttreeleafmenu',
            props: {
                items: cbbItems,
                value: currentExpression || variableList[0].value,
                enableSearch: true
            },
            style: {
                width: "400px"
            },
        });
        var user_chose_variable = function(currentExpression){
            return new Promise(function (resolve) {
                var selectMenu = absol._({
                    tag: 'selecttreeleafmenu',
                    props: {
                        items: cbbItems,
                        value: currentExpression || variableList[0].value,
                        enableSearch: true
                    },
                    style: {
                        width: "400px"
                    },
                });
                var table = DOMElement.table({
                    data: [
                        [
                            {
                                text: "Biến"},
                            {
                                attrs: {style: {paddingLeft: "10px"}},
                                children: [selectMenu]
                            }
                        ]
                    ]
                });
                ModalElement.showWindow({
                    index: 3,
                    title: "Chọn biến",
                    bodycontent: DOMElement.div({
                        style: {
                            padding: "10px"
                        },
                        children: [
                            DOMElement.div({
                                children: [table]
                            }),
                            DOMElement.div({
                                attrs: {
                                    style: {
                                        paddingTop: "20px",
                                        textAlign: "center"
                                    }
                                },
                                children: [
                                    DOMElement.div({
                                        attrs: {style: {
                                            display: "inline-block"
                                        }},
                                        children: [theme.okButton({
                                            onclick: function () {
                                                resolve(selectMenu.value);
                                                ModalElement.close(3);
                                            }
                                        })]
                                    }),
                                    DOMElement.div({
                                        attrs: {style: {
                                            display: "inline-block",
                                            paddingLeft: "10px"
                                        }},
                                        children: [theme.cancelButton({
                                            onclick: function () {
                                                resolve(null);
                                                ModalElement.close(3);
                                            }
                                        })]
                                    })
                                ]
                            })
                        ]
                    })
                });
            });
        };
        var variableForExpresstionInput = {};
        variableList.forEach(function(elt){
            variableForExpresstionInput[elt.value] = {text: elt.text};
        });
        examinationPluginVariable.forEach(function(elt){
            variableForExpresstionInput[elt.value] = {text: elt.text};
        });
        var shortExpressionInput = absol._({
            tag: 'ckinlineshorttext',
            props: {
                extensions: ['variable'],
                variables: variableForExpresstionInput
            },
            style: {
                minWidth: "400px"
            },
            on: {
                focus: function () {
                    // lastFocusHolder = this;
                    // bt.disabled = false;
                },
                change: function () {
                    absol.require('snackbar').show(this.data);
                },
                command: function (event) {
                    var ck = this;//ckplaceholder
                    switch (event.command) {
                        case 'insert_variable':
                            user_chose_variable(this.getSelectedVariable()).then(function (result) {
                                if (result) {
                                    ck.insertVariable(result);//expression
                                }
                            });
                            break;
                    }
                }
            }
        });
        shortExpressionInput.data = currentExpression || "";
        var table = DOMElement.table({
            data: [
                [
                    {text: "Thêm biểu thức"},
                    {
                        attrs: {style: {paddingLeft: "10px"}},
                        children: [switchBtn]
                    }
                ],
                [{attrs: {style: {paddingTop: "10px", display: is_expression ? "none" : null}, className: "hr-meeting-template-choose-variable"}}],
                [
                    {
                        attrs: {style: {display: is_expression ? "none" : null}, className: "hr-meeting-template-choose-variable"},
                        text: "Biến"},
                    {
                        attrs: {style: {paddingLeft: "10px", display: is_expression ? "none" : null}, className: "hr-meeting-template-choose-variable"},
                        children: [selectMenu]
                    }
                ],
                [{attrs: {style: {paddingTop: "10px", display: is_expression ? null : "none"}, className: "hr-meeting-template-write-expression"}}],
                [
                    {
                        attrs: {className: "hr-meeting-template-write-expression", style: {display: is_expression ? null : "none"}},
                        text: "Biểu thức"
                    },
                    {
                        attrs: {style: {paddingLeft: "10px", display: is_expression ? null : "none"}, className: "hr-meeting-template-write-expression"},
                        children: [shortExpressionInput]
                    }
                ]
            ]
        });
        ModalElement.showWindow({
            index: 2,
            title: "Chọn biến, biểu thức",
            bodycontent: DOMElement.div({
                style: {
                    padding: "10px"
                },
                children: [
                    DOMElement.div({
                        children: [table]
                    }),
                    DOMElement.div({
                        attrs: {
                            style: {
                                paddingTop: "20px",
                                textAlign: "center"
                            }
                        },
                        children: [
                            DOMElement.div({
                                attrs: {style: {
                                    display: "inline-block"
                                }},
                                children: [theme.okButton({
                                    onclick: function () {
                                        if (switchBtn.checked) {
                                            if (shortExpressionInput.data.trim().length == 0) {
                                                ModalElement.alert({message: "Chưa nhập biểu thức"});
                                            }
                                            else {
                                                resolve(shortExpressionInput.data.trim());
                                                ModalElement.close(2);
                                            }
                                        }
                                        else {
                                            resolve(selectMenu.value);
                                            ModalElement.close(2);
                                        }
                                    }
                                })]
                            }),
                            DOMElement.div({
                                attrs: {style: {
                                    display: "inline-block",
                                    paddingLeft: "10px"
                                }},
                                children: [theme.cancelButton({
                                    onclick: function () {
                                        resolve(null);
                                        ModalElement.close(2);
                                    }
                                })]
                            })
                        ]
                    })
                ]
            })
        });
    });
};

contentModule.makeEmployeePoliciesData = function(host){
    var k, t = [];
    host.database.employee_policies.items.forEach(function(item){
        if (!host.database[item.type + "_policies"]) return;
        k = host.database[item.type + "_policies"].getIndex(item.policyid);
        if (k < 0) return;
        item.description = host.database[item.type + "_policies"].items[k].description;
        if (item.type == "insurance"){
            item.calculated_on = host.database[item.type + "_policies"].items[k].calculated_on;
        }
        else if (item.type == "tax"){
            item.tax_type = host.database[item.type + "_policies"].items[k].tax_type;
        }
        else if(item.type == 'other_liability'){
            item.tax_relief = host.database[item.type + "_policies"].items[k].tax_relief;
            item.insurance_contribution_relief = host.database[item.type + "_policies"].items[k].insurance_contribution_relief;
            item.other_liability_type = host.database[item.type + "_policies"].items[k].other_liability_type;
            item.frequency = host.database[item.type + "_policies"].items[k].frequency;
        }
        t.push(item);
    });
    host.database.employee_policies.items = t;
};

contentModule.getDocumentPropertiesListPri = function(){
    return [
        {id: -87, name: "Văn bản nội bộ", parentid: -99, description: "", available: 1, extrainfo: {}, ver: 1},
        {id: -88, name: "Văn bản đi", parentid: -99, description: "", available: 1, extrainfo: {}, ver: 1},
        {id: -89, name: "Văn bản đến", parentid: -99, description: "", available: 1, extrainfo: {}, ver: 1},
        {id: -97, name: LanguageModule.text("txt_storage"), parentid: 0, description: "", available: 1, extrainfo: {}, ver: 1},
        {id: -98, name: LanguageModule.text("txt_document_category"), parentid: 0, description: "", available: 1, extrainfo: {}, ver: 1},
        {id: -99, name: LanguageModule.text("txt_document_type"), parentid: 0, description: "", available: 1, extrainfo: {}, ver: 1}
    ];
};

contentModule.makeDocument_propertiesSelectItems = function(host, id, listPropsPriv){
    var index = host.database.document_properties.getIndex(id);
    var items = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    var ni;
    for (var i = 0; i < host.database.document_properties.items[index].childIndexList.length; i++){
        ni = host.database.document_properties.items[index].childIndexList[i];
        if (!host.database.document_properties.items[ni].available) continue;
        if (listPropsPriv.indexOf(0) < 0 && listPropsPriv.indexOf(host.database.document_properties.items[ni].id) < 0) continue;
        items.push({
            value: host.database.document_properties.items[ni].id,
            text: host.database.document_properties.items[ni].name
        });
    }
    return items;
};

contentModule.makeDocument_propertiesSelectFilterItems = function(host, id){
    var index = host.database.document_properties.getIndex(id);
    var items = [];
    if (hr.isMobile){
        items.push({value: 0, text: LanguageModule.text("txt_all")});
    }
    else {
        items.push({value: 0, text: LanguageModule.text("txt_all") + " - " + host.database.document_properties.items[index].name});
    }
    var ni;
    for (var i = 0; i < host.database.document_properties.items[index].childIndexList.length; i++){
        ni = host.database.document_properties.items[index].childIndexList[i];
        if (!host.database.document_properties.items[ni].available) continue;
        items.push({
            value: host.database.document_properties.items[ni].id,
            text: host.database.document_properties.items[ni].name
        });
    }
    return items;
};

contentModule.makeDocumentsProperties = function(host){
    var documentDic = contentModule.makeDictionaryIndex(host.database.documents.items);
    for (var i = 0; i < host.database.documents.items.length; i++){
        host.database.documents.items[i].properties = {};
    }
    var k, item;
    for (var i = 0; i < host.database.document_properties_links.items.length; i++){
        item = host.database.document_properties_links.items[i];
        k = documentDic[item.documentid];
        if (k !== undefined){
            host.database.documents.items[k].properties[item.property_groupid] = item.propertyid;
        }
    }
};

contentModule.makeEmployeeGroupMemberIndex = function(host){
    for (var i = 0; i < host.database.employee_groups.items.length; i++){
        host.database.employee_groups.items[i].members = [];
    }
    var gDic = contentModule.makeDictionaryIndex(host.database.employee_groups.items);
    var k;
    for (var i = 0; i < host.database.employee_group_members.items.length; i++){
        k = gDic[host.database.employee_group_members.items[i].groupid];
        if (k >= 0) host.database.employee_groups.items[k].members.push(host.database.employee_group_members.items[i].employeeid);
    }
    if (host.employeeOfMe){
        host.groupOfMe = [];
        if (host.employeeOfMe.length == 0) return;
        host.database.employee_groups.items.forEach(function(item){
            if (item.members.indexOf(host.employeeOfMe[0]) >= 0){
                host.groupOfMe.push(item.id);
            }
        });
    }
};

contentModule.makePrivilegeDocumentConfigs = function(host){
    host.listConfigPrivilegeOfMe = [];
    if (systemconfig.privSystem >= 2) return;
    if (host.employeeOfMe.length == 0) return;
    host.database.configs_document_privileges.items.forEach(function(item){
        if (item.content.employees.indexOf(0) >= 0 || item.content.employees.indexOf(host.employeeOfMe[0]) >= 0){
            host.listConfigPrivilegeOfMe.push(item);
        }
        else {
            if (item.content.employee_groups.indexOf(0) >= 0){
                if (host.groupOfMe.length > 0) host.listConfigPrivilegeOfMe.push(item);
            }
            else {
                for (var i = 0; i < item.content.employee_groups.length; i++){
                    if (host.groupOfMe.indexOf(item.content.employee_groups[i]) >= 0){
                        host.listConfigPrivilegeOfMe.push(item);
                        break;
                    }
                }
            }
        }
    });
    var getFolderList = function(folderList, fIndex){
        folderList.push(host.database.document_folders.items[fIndex].id);
        for (var i = 0; i < host.database.document_folders.items[fIndex].childIndexList.length; i++){
            getFolderList(folderList, host.database.document_folders.items[fIndex].childIndexList[i]);
        }
    };
    for (var i = 0; i < host.listConfigPrivilegeOfMe.length; i++){
        host.listConfigPrivilegeOfMe[i].folderList = [];
        if (host.listConfigPrivilegeOfMe[i].taskdetails == 1){
            host.listConfigPrivilegeOfMe[i].folderList.push(host.listConfigPrivilegeOfMe[i].taskid);
        }
        else {
            var fIndex = host.database.document_folders.getIndex(host.listConfigPrivilegeOfMe[i].taskid);
            if (fIndex >= 0) getFolderList(host.listConfigPrivilegeOfMe[i].folderList, fIndex);
        }
    }
};

contentModule.getPrivDocument = function(host, item, typePriv){
    for (var i = 0; i < host.listConfigPrivilegeOfMe.length; i++){
        if (host.listConfigPrivilegeOfMe[i].folderList.indexOf(item.folderid) < 0) continue;
        if (typePriv == "edit"){
            if (!host.listConfigPrivilegeOfMe[i].content.edit) continue;
        }
        else if (!host.listConfigPrivilegeOfMe[i].content.edit && !host.listConfigPrivilegeOfMe[i].content.view) continue;
        var propertiesPriv = host.listConfigPrivilegeOfMe[i].content.properties;
        var listAccept = [];
        host.listPropertiesRoot.forEach(function(propsItem){
            if (!item.properties[propsItem.id] || item.properties[propsItem.id] == 0){
                listAccept.push(true);
            }
            else {
                if (propertiesPriv[propsItem.id]){
                    if (propertiesPriv[propsItem.id].indexOf(0) >= 0){
                        listAccept.push(true);
                    }
                    else {
                        if (propertiesPriv[propsItem.id].indexOf(item.properties[propsItem.id]) >= 0){
                            listAccept.push(true);
                        }
                    }
                }
            }
        });
        if (listAccept.length == host.listPropertiesRoot.length){
            return true;
        }
    }
    return false;
};

contentModule.makeDocument_foldersSelectItems = function(host, folderList){
    function getFolderItem(index){
        var items = [];
        for (var i = 0; i < host.database.document_folders.items[index].childIndexList.length; i++){
            items.push(getFolderItem(host.database.document_folders.items[index].childIndexList[i]));
        }
        var res = {
            value: host.database.document_folders.items[index].id,
            text: host.database.document_folders.items[index].name,
            items: items
        };
        if (folderList.indexOf(0) < 0 && folderList.indexOf(host.database.document_folders.items[index].id) < 0) res.disabled = true;
        return res;
    };
    var list = [{
        value: 0,
        text: LanguageModule.text("txt_select_value")
    }];
    for (var i = 0; i < host.database.document_folders.items.length; i++){
        if (host.database.document_folders.items[i].parentid != 0) continue;
        list.push(getFolderItem(i));
    }
    return list;
};

contentModule.makePrivilegeOrgConfigs = function(host){
    host.listConfigPrivilegeOfMe = [];
    host.orgViewDic = {};
    host.orgEditDic = {};
    host.employeeViewDic = {};
    host.employeeEditDic = {};
    if (systemconfig.privSystem >= 2) {
        for (var i = 0; i < host.database.orgs.items.length; i++){
            host.orgViewDic[host.database.orgs.items[i].id] = true;
            host.orgEditDic[host.database.orgs.items[i].id] = true;
        }
        for (var i = 0; i < host.database.employees.items.length; i++){
            host.employeeViewDic[host.database.employees.items[i].id] = true;
            host.employeeEditDic[host.database.employees.items[i].id] = true;
        }
        return;
    };
    if (host.employeeOfMe.length == 0) return;
    host.database.configs_org_privileges.items.forEach(function(item){
        if (item.content.employees.indexOf(0) >= 0 || item.content.employees.indexOf(host.employeeOfMe[0]) >= 0){
            host.listConfigPrivilegeOfMe.push(item);
        }
        else {
            if (item.content.employee_groups.indexOf(0) >= 0){
                if (host.groupOfMe.length > 0) host.listConfigPrivilegeOfMe.push(item);
            }
            else {
                for (var i = 0; i < item.content.employee_groups.length; i++){
                    if (host.groupOfMe.indexOf(item.content.employee_groups[i]) >= 0){
                        host.listConfigPrivilegeOfMe.push(item);
                        break;
                    }
                }
            }
        }
    });
    var getDepartmentList = function(departmentList, dIndex){
        departmentList.push(host.database.orgs.items[dIndex].id);
        for (var i = 0; i < host.database.orgs.items[dIndex].childIndexList.length; i++){
            getDepartmentList(departmentList, host.database.orgs.items[dIndex].childIndexList[i]);
        }
    };
    for (var i = 0; i < host.listConfigPrivilegeOfMe.length; i++){
        host.listConfigPrivilegeOfMe[i].departmentList = [];
        if (host.listConfigPrivilegeOfMe[i].taskdetails == 1){
            host.listConfigPrivilegeOfMe[i].departmentList.push(host.listConfigPrivilegeOfMe[i].taskid);
        }
        else {
            var dIndex = host.database.orgs.getIndex(host.listConfigPrivilegeOfMe[i].taskid);
            if (dIndex >= 0) getDepartmentList(host.listConfigPrivilegeOfMe[i].departmentList, dIndex);
        }
    }
    var orgsDic = contentModule.makeDictionaryIndex(host.database.orgs.items);
    var listAuthorityViewOrgEmp = [
        "view_employee_profiles",
        "edit_general_information_abilities_contact_communications",
        "edit_employment_contracts_salary_decisions_bank_accounts",
        "edit_hr_policies",
        "edit_organization_and_employee",
        "handle_onboarding",
        "handle_offboarding",
        "project_setting"
    ];
    var k, ex, ex2;
    for (var i = 0; i < host.listConfigPrivilegeOfMe.length; i++){
        ex2 = false;
        if (host.listConfigPrivilegeOfMe[i].content.edit_organization_and_employee) ex2 = true;
        ex = false;
        for (var j = 0; j < listAuthorityViewOrgEmp.length; j++){
            if (host.listConfigPrivilegeOfMe[i].content[listAuthorityViewOrgEmp[j]]){
                ex = true;
                break;
            }
        }
        if (!ex) continue;
        for (var j = 0; j < host.listConfigPrivilegeOfMe[i].departmentList.length; j++){
            host.orgViewDic[host.listConfigPrivilegeOfMe[i].departmentList[j]] = true;
            if (ex2) host.orgEditDic[host.listConfigPrivilegeOfMe[i].departmentList[j]] = true;
            k = orgsDic[host.listConfigPrivilegeOfMe[i].departmentList[j]];
            if (k >= 0){
                host.database.orgs.items[k].employeeIdList.forEach(function(eid){
                    host.employeeViewDic[eid] = true;
                    if (ex2) host.employeeEditDic[eid] = true;
                });
            }
        }
        k = orgsDic[host.listConfigPrivilegeOfMe[i].taskid];
        if (k >= 0){
            while (host.database.orgs.items[k].parentid > 0){
                host.orgViewDic[host.database.orgs.items[k].parentid] = true;
                k = orgsDic[host.database.orgs.items[k].parentid];
            }
        }
    }
    if (host.employeeOfMe.length > 0){
        host.employeeViewDic[host.employeeOfMe[0]] = true;
        var eIndex = host.database.employees.getIndex(host.employeeOfMe[0]);
        var pid = host.database.employees.items[eIndex].orgid;
        host.orgViewDic[pid] = true;
        var oIndex = host.database.orgs.getIndex(pid);
        while (host.database.orgs.items[oIndex].parentid > 0) {
            pid = host.database.orgs.items[oIndex].parentid;
            host.orgViewDic[pid] = true;
            oIndex = host.database.orgs.getIndex(pid);
        }
    }
};

contentModule.makeStorekeepersData = function(host){
    for (var i = 0; i < host.database.warehouses.items.length; i++){
        host.database.warehouses.items[i].storekeepers = [];
    }
    var warehousesDic = contentModule.makeDictionaryIndex(host.database.warehouses.items);
    var k;
    for (var i = 0; i < host.database.storekeepers.items.length; i++){
        k = warehousesDic[host.database.storekeepers.items[i].warehouseid];
        if (k >= 0){
            host.database.warehouses.items[k].storekeepers.push(host.database.storekeepers.items[i].employeeid);
        }
    }
};


contentModule.getNationsFilterList = function(host){
    var res = [{value: 0, text: LanguageModule.text("txt_all_nation")}];
    for (var i = 0; i < host.database.nations.items.length; i++){
        if (!host.database.nations.items[i].available) continue;
        res.push({
            value: host.database.nations.items[i].id,
            text: host.database.nations.items[i].fullname
        });
    }
    return res;
};

contentModule.getCitiesFilterList = function(host, nationid){
    var res = [{value: 0, text: LanguageModule.text("txt_all_city")}];
    var nIndex = host.database.nations.getIndex(nationid);
    if (nIndex >= 0){
        var ni;
        for (var i = 0; i < host.database.nations.items[nIndex].cityIndexList.length; i++){
            ni = host.database.nations.items[nIndex].cityIndexList[i];
            if (!host.database.cities.items[ni].available) continue;
            res.push({
                value: host.database.cities.items[ni].id,
                text: host.database.cities.items[ni].name
            });
        }
    }
    return res;
};

contentModule.getPartnerClassFilterList = function(){
    var res = [];
    var idList = data_module.getIDList("partner_class");
    var cData;
    for (var i = 0; i < idList.length; i++){
        cData = data_module.getContent("partner_class", idList[i]);
        if (!cData.available) continue;
        res.push({
            value: cData.id,
            text: cData.name
        });
    }
    var k, t = [];
    var holderForSort = res.map(function(item){
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.text.toLowerCase())
        }
    });
    holderForSort.sort(function(a, b){
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });
    res = holderForSort.map(function(holder){
        return holder.item;
    });
    res.unshift({value: 0, text: LanguageModule.text("txt_all_partner_class")});
    return res;
};

contentModule.makePartnerData = function(host){
    for (var i = 0; i < host.database.partner.items.length; i++){
        var res = data_module.getContent("partners", host.database.partner.items[i].id);
        if ((res.nationid != 0) && (res.cityid != 0)){
            host.database.partner.items[i].nation_city = [res.nationid, res.cityid];
        }
        else {
            host.database.partner.items[i].nation_city = null;
        }
    }
};

contentModule.getPartnerFilterList = function(host){
    var res = [{value: 0, text: LanguageModule.text("txt_all_partner")}];
    for (var i = 0; i < host.database.partner.items.length; i++){
        if (!host.database.partner.items[i].available) continue;
        res.push({
            value: host.database.partner.items[i].id,
            text: host.database.partner.items[i].name.substr(0, 50),
            desc: host.database.partner.items[i].className + ", " + host.database.partner.items[i].fullname.substr(0, 50)
        });
    }
    return res;
};

contentModule.getEmployeeFilterList = function(host){
    function getOrgItem(index){
        var items = [], ni;
        for (var i = 0; i < host.database.orgs.items[index].childIndexList.length; i++){
            ni = host.database.orgs.items[index].childIndexList[i];
            if (host.orgViewDic && !host.orgViewDic[host.database.orgs.items[ni].id]) continue;
            items.push(getOrgItem(ni));
        }
        items.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });
        var e_items = [], ni;
        for (var i = 0; i < host.database.orgs.items[index].employeeIndexList.length; i++){
            ni = host.database.orgs.items[index].employeeIndexList[i];
            if (!host.database.employees.items[ni].available) continue;
            if (host.employeeViewDic && !host.employeeViewDic[host.database.employees.items[ni].id]) continue;
            e_items.push({
                value: host.database.employees.items[ni].id,
                text: host.database.employees.items[ni].fullname,
                code: host.database.employees.items[ni].code,
                isLeaf: true,
                icon: {tag:'span', class:['mdi', 'mdi-account']},
                sortText: absol.string.nonAccentVietnamese(host.database.employees.items[host.database.orgs.items[index].employeeIndexList[i]].fullname).toLowerCase()
            });
        }
        e_items.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });
        var res = {
            value: -host.database.orgs.items[index].id,
            text: host.database.orgs.items[index].name,
            icon: {tag:'span', class: (host.database.orgs.items[index].parentid == 0)? ['mdi', 'mdi-home-variant'] : ['mdi', 'mdi-folder-account']},
            items: e_items.concat(items),
            sortText: absol.string.nonAccentVietnamese(host.database.orgs.items[index].name).toLowerCase()
        };
        return res;
    };
    var items = [{value: 0, text: LanguageModule.text("txt_all_employee"), isLeaf: true}];
    for (var i = 0; i < host.database.orgs.items.length; i++){
        if (host.database.orgs.items[i].parentid != 0) continue;
        if (host.orgViewDic && !host.orgViewDic[host.database.orgs.items[i].id]) continue;
        items.push(getOrgItem(i));
    }
    items.sort(function(a, b){
        if (a.sortText > b.sortText) return 1;
        if (a.sortText < b.sortText) return -1;
        return 0;
    });
    return items;
};
contentModule.calcCrow = function(lat1, lon1, lat2, lon2){
    var toRad = function(value){
        return value * Math.PI / 180;
    };
    var R = 6371000;
    var dLat = toRad(lat2-lat1);
    var dLon = toRad(lon2-lon1);
    var lat1 = toRad(lat1);
    var lat2 = toRad(lat2);

    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = R * c;
    return d;
};

contentModule.makeParnerCheckinData = function(host){
    var partnerData, t = [], k1, cityData;
    var check_in_lat, check_in_lng, partner_lat, partner_lng, x;
    for (var i = 0; i < host.database.partner_checkin.items.length; i++){
        partnerData = data_module.getContent("partners", host.database.partner_checkin.items[i].partnerid);
        if (partnerData){
            host.database.partner_checkin.items[i].gps = partnerData.gps;
            host.database.partner_checkin.items[i].partner = partnerData.name;
            host.database.partner_checkin.items[i].address = partnerData.address;
            host.database.partner_checkin.items[i].cityid = partnerData.cityid;
            cityData = data_module.getContent("cities", partnerData.cityid);
            if (cityData){
                host.database.partner_checkin.items[i].cityName = cityData.name;
            }
            else {
                host.database.partner_checkin.items[i].cityName = "";
            }
            x = host.database.partner_checkin.items[i].checkingps.indexOf(",");
            if (x > 0){
                check_in_lat = parseFloat(host.database.partner_checkin.items[i].checkingps.substr(0, x));
                check_in_lng = parseFloat(host.database.partner_checkin.items[i].checkingps.substr(x + 1));
            }
            else {
                check_in_lat = 0;
                check_in_lng = 0;
            }
            x = partnerData.gps.indexOf(",");
            if (x > 0){
                partner_lat = parseFloat(partnerData.gps.substr(0, x));
                partner_lng = parseFloat(partnerData.gps.substr(x + 1));
            }
            else {
                partner_lat = 0;
                partner_lng = 0;
            }
            if (check_in_lat && check_in_lng && partner_lat && partner_lng){
                host.database.partner_checkin.items[i].distance = absol.$.formatLocalFloat(Math.round(contentModule.calcCrow(check_in_lat, check_in_lng, partner_lat, partner_lng)));
            }
            else {
                host.database.partner_checkin.items[i].distance = "";
            }
            t.push(host.database.partner_checkin.items[i]);
        }
    }
    host.database.partner_checkin.items = t;
};

contentModule.getWork_flowGroupsFilterList  = function(host){
    var res = [{value: 0, text: LanguageModule.text("txt_all_work_flow_group")}];
    for (var i = 0; i < host.database.work_flow_groups.items.length; i++){
        if (!host.database.work_flow_groups.items[i].available) continue;
        res.push({
            value: host.database.work_flow_groups.items[i].id,
            text: host.database.work_flow_groups.items[i].name
        });
    }
    return res;
};

contentModule.getTypeListsListSelectMenu = function(host){
    var res = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    for (var i = 0; i < data_module.typelists.items.length; i++){
        if (!data_module.typelists.items[i].available) continue;
        res.push({
            value: data_module.typelists.items[i].id,
            text: data_module.typelists.items[i].name
        });
    }
    return res;
};

contentModule.getInputFormsListSelectMenu = function(){
    var res = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    for (var i = 0; i < data_module.input_forms.items.length; i++){
        if (!data_module.input_forms.items[i].available) continue;
        res.push({
            value: data_module.input_forms.items[i].id,
            text: data_module.input_forms.items[i].name
        });
    }
    return res;
};

contentModule.getMobileInputFormsListSelectMenu = function(){
    var res = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    for (var i = 0; i < data_module.mobile_input_forms.items.length; i++){
        if (!data_module.mobile_input_forms.items[i].available) continue;
        res.push({
            value: data_module.mobile_input_forms.items[i].id,
            text: data_module.mobile_input_forms.items[i].name
        });
    }
    return res;
};

contentModule.getOutputFormsListSelectMenu = function(){
    var res = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    for (var i = 0; i < data_module.output_forms.items.length; i++){
        if (!data_module.output_forms.items[i].available) continue;
        res.push({
            value: data_module.output_forms.items[i].id,
            text: data_module.output_forms.items[i].name
        });
    }
    return res;
};

contentModule.getMobileOutputFormsListSelectMenu = function(){
    var res = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    for (var i = 0; i < data_module.mobile_output_forms.items.length; i++){
        if (!data_module.mobile_output_forms.items[i].available) continue;
        res.push({
            value: data_module.mobile_output_forms.items[i].id,
            text: data_module.mobile_output_forms.items[i].name
        });
    }
    return res;
};

contentModule.getObjectPeriodSystemList = function(){
    return [
        {id: -1, name: LanguageModule.text("txt_success"), color: "rgb(146,211,110)", isSystem: true},
        {id: -2, name: LanguageModule.text("txt_failed"), color: "rgb(230,22,16)", isSystem: true},
        {id: -3, name: "Hủy thực hiện", color: "rgb(230,146,248)", isSystem: true}
    ]
};

contentModule.getInputFormsOfTypeId = function(host, typeid){
    var res = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    for (var i = 0; i < data_module.input_forms.items.length; i++){
        if (!data_module.input_forms.items[i].available) continue;
        if (data_module.input_forms.items[i].typeid != typeid) continue;
        res.push({
            value: data_module.input_forms.items[i].id,
            text: data_module.input_forms.items[i].name
        });
    }
    return res;
};

contentModule.getOutputFormsOfTypeId = function(host, typeid){
    var res = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    for (var i = 0; i < data_module.output_forms.items.length; i++){
        if (!data_module.output_forms.items[i].available) continue;
        if (data_module.output_forms.items[i].typeid != typeid) continue;
        res.push({
            value: data_module.output_forms.items[i].id,
            text: data_module.output_forms.items[i].name
        });
    }
    return res;
};

contentModule.getMobileInputFormsOfTypeId = function(host, typeid){
    var res = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    for (var i = 0; i < data_module.mobile_input_forms.items.length; i++){
        if (!data_module.mobile_input_forms.items[i].available) continue;
        if (data_module.mobile_input_forms.items[i].typeid != typeid) continue;
        res.push({
            value: data_module.mobile_input_forms.items[i].id,
            text: data_module.mobile_input_forms.items[i].name
        });
    }
    return res;
};

contentModule.getMobileOutputFormsOfTypeId = function(host, typeid){
    var res = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    for (var i = 0; i < data_module.mobile_output_forms.items.length; i++){
        if (!data_module.mobile_output_forms.items[i].available) continue;
        if (data_module.mobile_output_forms.items[i].typeid != typeid) continue;
        res.push({
            value: data_module.mobile_output_forms.items[i].id,
            text: data_module.mobile_output_forms.items[i].name
        });
    }
    return res;
};

contentModule.getPeriodsListByWorkFlowId = function(host, work_flowid, form){
    var periodsList = [];
    if (form == "output"){
        periodsList.push({value: 0, text: ""});
    }
    else {
        periodsList.push({value: 0, text: LanguageModule.text("txt_select_value")});
    }
    for (var i = 0; i < host.database.work_flow_periods.items.length; i++){
        periodsList.push({
            value: host.database.work_flow_periods.items[i].id,
            text: host.database.work_flow_periods.items[i].name
        });
    }
    var x = contentModule.getObjectPeriodSystemList();
    for (var i = 0; i < x.length; i++){
        periodsList.push({
            value: x[i].id,
            text: x[i].name
        });
    }
    return periodsList;
};

contentModule.makeOrgEmpDicPrivilegesWorkFlow = function(host, listOrgPriv){
    host.employeeEditDic = {};
    host.orgViewDic = {};
    host.orgEditDic = {};
    var orgsDic = contentModule.makeDictionaryIndex(host.database.orgs.items);
    var employeesDic = contentModule.makeDictionaryIndex(host.database.employees.items);
    var getDepartmentList = function(departmentList, dIndex){
        departmentList.push(host.database.orgs.items[dIndex].id);
        for (var i = 0; i < host.database.orgs.items[dIndex].childIndexList.length; i++){
            getDepartmentList(departmentList, host.database.orgs.items[dIndex].childIndexList[i]);
        }
    };
    var k, departmentList, orgid, oIndex;
    for (var i = 0; i < listOrgPriv.length; i++){
        if (listOrgPriv[i] > 0){
            k = orgsDic[listOrgPriv[i]];
            if (k === undefined) continue;
            departmentList = [];
            getDepartmentList(departmentList, k);
            for (var j = 0; j < departmentList.length; j++){
                host.orgEditDic[departmentList[j]] = true;
                host.orgViewDic[departmentList[j]] = true;
                oIndex = orgsDic[departmentList[j]];
                if (oIndex >= 0){
                    host.database.orgs.items[oIndex].employeeIdList.forEach(function(eid){
                        host.employeeEditDic[eid] = true;
                    });
                }
            }
            orgid = listOrgPriv[i];
        }
        else {
            host.employeeEditDic[-listOrgPriv[i]] = true;
            k = employeesDic[-listOrgPriv[i]];
            if (k === undefined) continue;
            orgid = host.database.employees.items[k].orgid;
        }
        host.orgViewDic[orgid] = true;
        k = host.database.orgs.getIndex(orgid);
        while (host.database.orgs.items[k].parentid > 0) {
            orgid = host.database.orgs.items[k].parentid;
            host.orgViewDic[orgid] = true;
            k = host.database.orgs.getIndex(orgid);
        }
    }
};

contentModule.activitiesInformation = function(params){
    var host = {
        database: {}
    };
    return new Promise(function(rs, rj){
        var run = function(content){
            host.employeeOfMe = content.employeeOfMe;
            var meeting_link_dict = {};
            content.meeting_links.forEach(function(elt){
                meeting_link_dict[elt.meetingid] = elt;
            });
            host.chartContent = {
                count: 0,
                success: 0,
                unsuccess: 0,
                pending: 0
            };

            var task_link_dict = {};
            content.task_links.forEach(function(elt){
                task_link_dict[elt.taskid] = elt;
            });
            content.activities = [];
            content.meetings.forEach(function(elt){
                if (elt.participant.indexOf("_") != -1) {
                    var participantStr = elt.participant.split("_");
                    var participant = [];
                    for (var i = 0; i < participantStr.length; i++) {
                        if (participantStr[i] == "") continue;
                        participant.push(parseInt(participantStr[i], 10));
                    }
                    elt.participant = participant;
                }
                else if (elt.participant == "") elt.participant = [];
                else elt.participant = EncodingClass.string.toVariable(elt.participant);
                if (meeting_link_dict[elt.id]){
                    elt.tablename = meeting_link_dict[elt.id].tablename;
                    elt.instanceid = meeting_link_dict[elt.id].instanceid;
                }
                elt.meetingid = elt.id;
                elt.id = "meeting_" + elt.id;
                elt.activityType = "type_meeting";
                content.activities.push(elt);
            });
            content.tasks.forEach(function(elt){
                if (elt.participant.indexOf("_") != -1) {
                    var participantStr = elt.participant.split("_");
                    var participant = [];
                    for (var i = 0; i < participantStr.length; i++) {
                        if (participantStr[i] == "") continue;
                        participant.push(parseInt(participantStr[i], 10));
                    }
                    elt.participant = participant;
                }
                else if (elt.participant == "") elt.participant = [];
                else elt.participant = EncodingClass.string.toVariable(elt.participant);
                if (task_link_dict[elt.id]) {
                    elt.tablename = task_link_dict[elt.id].tablename;
                    elt.instanceid = task_link_dict[elt.id].instanceid;
                }
                elt.taskid = elt.id;
                elt.id = "task_" + elt.id;
                elt.activityType = "type_task";
                content.activities.push(elt);
            });
            contentModule.makeDatabaseContent(host, content);
            host.user_column_configsDic = contentModule.getUser_column_configsDic(host);
            if (!params.employeeid) params.employeeid = content.employeeOfMe[0];
            host.form_config = contentModule.configVariable(host);
            contentModule.makeOrgsIndex(host);
            contentModule.makeEmployeeData(host);
            contentModule.makeEmployeesIndex(host);
            contentModule.makeEmployeeGroupMemberIndex(host);
            contentModule.makePrivilegesActivitiesConfigs(host);
            host.task_user_column_configsDic = contentModule.getUser_column_configsDic({database: {user_column_configs: host.database.task_user_column_configs}});
            host.meeting_user_column_configsDic = contentModule.getUser_column_configsDic({database: {user_column_configs: host.database.meeting_user_column_configs}});
            params.host = host;
            // params.chartContainer = absol._({});
            params.meeting = absol._({});
            params.task = absol._({});
            params.activities = absol._({});
            params.addTaskByTemplate = function(){
                hr.onboarding.addTaskByTemplate(host, params.instanceid, params);
            };
            params.addMeetingByTemplate = function(){
                hr.onboarding.addMeetingByTemplate(host, params.instanceid, params);
            };

            // params.chartContainer.addChild(hr.onboarding.drawEmployeeInformationChart(host, params));

            var promiseArray = [];

            if (params.workSelected == "meeting" || params.workSelected == "both") promiseArray.push(hr.onboarding.drawMeetingInformation(host, params.instanceid, params));
            if (params.workSelected == "task" || params.workSelected == "both") promiseArray.push(hr.onboarding.drawTaskInformation(host, params.instanceid, params));
            promiseArray.push(hr.onboarding.drawActivitiesInformation(host, params.instanceid, params));
            var retval = {
                chart: params.chart,
                meeting: params.meeting,
                task: params.task,
                activities: params.activities,
                getMeetingContent: function(){
                    return params.meeting;
                },
                getTaskContent: function(){
                    return params.activities;
                },
                getActivitiesContent: function(){
                    return params.activities;
                },
                getChartContent: function (host, params) {
                    return function(){
                        return absol._({
                            child: hr.onboarding.drawEmployeeInformationChart(host, params)
                        })
                        // return params.chartContainer;
                    }
                }(host, params)
            };
            Promise.all(promiseArray).then(function(){
                rs(retval);
            }, function(err){
                console.log(err);
                rj(err);
            })
        }
        var tableNameArray = [
            "configs",
            "orgs",
            "employees",
            "peoples",
            "employee_groups",
            "employee_group_members"
        ];
        if (params.workSelected == "task" || params.workSelected == "both"){
            tableNameArray.push("tasks");
            tableNameArray.push("task_links");
        }
        if (params.workSelected == "meeting" || params.workSelected == "both"){
            tableNameArray.push("meetings");
            tableNameArray.push("meeting_links");
        }
        data_module.loadTables(tableNameArray, function(){
            data_module.getEmpsFromCacheWorker(false, ["id", "firstid", "orgid", "peopleid", "available", "code"]).then(function(content){
                data_module.getPeoplesFromCacheByEmployeesWorker(false, ["id", "fullname"], content.employees).then(function(peoples){
                    data_module.loadConfigsByNameWorker("form_config").then(function(form_config){
                        var employees = content.employees;
                        var employeeOfMe = content.employeeOfMe;
                        var orgs = data_module.getOrgsFromCache();
                        var configs_privileges = data_module.getConfigs_privilegesFromCache("activity_privileges");
                        var employee_groups = data_module.getDataTablesFromCache("employee_groups");
                        var employee_group_members = data_module.getDataTablesFromCache("employee_group_members");
                        var retval = {
                            form_config: form_config,
                            orgs: orgs,
                            employees: employees,
                            peoples: peoples,
                            employeeOfMe: employeeOfMe,
                            configs_privileges: configs_privileges,
                            employee_groups: employee_groups,
                            employee_group_members: employee_group_members,
                            activities: []
                        };
                        var task_links, meeting_links, taskids = [], meetingids = [], p1 = false, p2 = false;
                        if (params.workSelected == "task" || params.workSelected == "both") {
                            data_module.cacheContent_task_links.psearch({
                                extraParams: {
                                    tablename: params.tableName,
                                    instanceid: params.instanceid
                                },
                                searchFunc: function (record) {
                                    if ((record.tablename == extraParams.tablename) && (record.instanceid == extraParams.instanceid)) return record;
                                    return null;
                                },
                                postFunc: function (record) {
                                    taskids[record.taskid] = true;
                                    return record;
                                },
                                callbackfunc: function (values) {
                                    var i;
                                    retval.task_links = values;
                                    taskids = Object.keys(taskids);
                                    for (i = 0; i < taskids.length; i++) {
                                        taskids[i] = parseInt(taskids[i]);
                                    }
                                    taskids.sort((a, b) => (a - b));
                                    data_module.cacheContent_tasks.reads(taskids, function (values) {
                                        retval.tasks = values;
                                        p1 = true;
                                    });
                                }
                            });
                        }
                        if (params.workSelected == "meeting" || params.workSelected == "both") {
                            data_module.cacheContent_meeting_links.psearch({
                                extraParams: {
                                    tablename: params.tableName,
                                    instanceid: params.instanceid
                                },
                                searchFunc: function (record) {
                                    if ((record.tablename == extraParams.tablename) && (record.instanceid == extraParams.instanceid)) return record;
                                    return null;
                                },
                                postFunc: function (record) {
                                    meetingids[record.meetingid] = true;
                                    return record;
                                },
                                callbackfunc: function (values) {
                                    var i;
                                    retval.meeting_links = values;
                                    meetingids = Object.keys(meetingids);
                                    for (i = 0; i < meetingids.length; i++) {
                                        meetingids[i] = parseInt(meetingids[i]);
                                    }
                                    meetingids.sort((a, b) => (a - b));
                                    data_module.cacheContent_meetings.reads(meetingids, function (values) {
                                        retval.meetings = values;
                                        p2 = true;
                                    });
                                }
                            });
                        }
                        else {
                            p2 = true;
                        }
                        Thread.wait(
                            function () {
                                return p1 && p2;
                            },
                            function () {
                                FormClass.api_call({
                                    url: "database_load.php",
                                    params: [
                                        {name: "task", value: "activities_load"},
                                        {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));
                                                Object.assign(retval, content);
                                                run(retval);
                                            }
                                            else {
                                                ModalElement.alert({message: message});
                                                rj(message)
                                            }
                                        }
                                        else {
                                            ModalElement.alert({message: message});
                                            rj(message)
                                        }
                                    }
                                });
                            }
                        );
                    })
                });
            });
        });
    });
};

contentModule.makePartnerClassLinksData = function(host){
    var partnerDic = contentModule.makeDictionaryIndex(host.database.partner.items);
    for (var i = 0; i < host.database.partner.items.length; i++){
        host.database.partner.items[i].class = [];
    }
    var k;
    for (var i = 0; i < host.database.partner_class_links.items.length; i++){
        k = partnerDic[host.database.partner_class_links.items[i].partnerid];
        if (k >= 0 && host.database.partner_class_links.items[i].classid > 0){
            host.database.partner.items[k].class.push(host.database.partner_class_links.items[i].classid);
        }
    }
};

contentModule.makePartnerClassLinksDataText = function(host){
    var classDic = contentModule.makeDictionaryIndex(host.database.partner_class.items);
    var ni, cIndex;
    for (var i = 0; i < host.database.partner.items.length; i++){
        host.database.partner.items[i].className = "";
        for (var j = 0; j < host.database.partner.items[i].class.length; j++){
            ni = host.database.partner.items[i].class[j];
            cIndex = classDic[ni];
            if (cIndex >= 0){
                host.database.partner.items[i].className += ", " + host.database.partner_class.items[cIndex].name;
            }
        }
        if (host.database.partner.items[i].class.length > 0){
            host.database.partner.items[i].className = host.database.partner.items[i].className.substr(2);
        }
    }
};

contentModule.loadWorkFlowObjectPrivView = function(){
    return new Promise(function(resolve, reject){
        var host = {database: {}};
        var loadDataFromDB = new Promise(function(rs, rj){
            FormClass.api_call({
                url: "database_load.php",
                params: [{name: "task", value: "load_work_flow_object_priv"}],
                func: function(success, message){
                    if (success){
                        if (message.substr(0, 2) == "ok"){
                            var st = EncodingClass.string.toVariable(message.substr(2));
                            rs(st);
                        }
                        else {
                            ModalElement.alert({message: message});
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
            });
        });
        var loadDataFromCache = new Promise(function(rs, rj){
            data_module.loadTables(["orgs", "employees", "peoples", "object_permissions"], function(){
                data_module.getEmpsFromCacheWorker(false, ["id", "firstid", "orgid", "peopleid", "available", "code"]).then(function(content){
                    data_module.getPeoplesFromCacheByEmployeesWorker(false, ["id", "fullname"], content.employees).then(function(peoples){
                        rs({
                            object_permissions: data_module.getDataTablesFromCache("object_permissions"),
                            orgs: data_module.getOrgsFromCache(),
                            employees: content.employees,
                            peoples: peoples,
                            employeeOfMe: content.employeeOfMe
                        });
                    });
                });
            });
        });
        Promise.all([loadDataFromDB, loadDataFromCache]).then(function(values){
            var st = values[0];
            for (var x in values[1]){
                st[x] = values[1][x];
            }
            host.employeeOfMe = st.employeeOfMe;
            delete st.employeeOfMe;
            contentModule.makeDatabaseContent(host, st);
            contentModule.makeOrgsIndex(host);
            contentModule.makeEmployeeData(host);
            contentModule.makeEmployeesIndex(host);
            var orgDict = {};
            var root;
            host.database.orgs.items.forEach((item, i) => {
                orgDict[item.id] = i;
                if (item.parentid == 0) root = item.id;
            });
            var createAllEmployeeInOrg = function(orgid){
                var index = orgDict[orgid];
                host.database.orgs.items[index].allEmployeeIdList = host.database.orgs.items[index].employeeIdList;
                host.database.orgs.items[index].childIndexList.forEach((item, i) => {
                    createAllEmployeeInOrg(host.database.orgs.items[item].id);
                    host.database.orgs.items[index].allEmployeeIdList = host.database.orgs.items[index].allEmployeeIdList.concat(
                        host.database.orgs.items[item].allEmployeeIdList
                    );
                });
            };
            createAllEmployeeInOrg(root);
            var work_flowsViewList = contentModule.stageReportMakePrivilegeViewWorkFlow(host);
            var objectsList = contentModule.stageReportMakePrivilegeObjects(host);
            var work_flow_admin_privileges_dict = {};
            var editAllObject = [];
            st.work_flow_admin_privileges.forEach(function(elt){
                if (!work_flow_admin_privileges_dict[elt.work_flowid]) work_flow_admin_privileges_dict[elt.work_flowid] = [];
                work_flow_admin_privileges_dict[elt.work_flowid].push(elt.employeeid);
                if (elt.employeeid == host.employeeOfMe[0]) editAllObject.push(elt.work_flowid);
            });
            resolve({
                work_flowsViewList: work_flowsViewList,
                objectsViewList: objectsList.viewList,
                objectsEditList: objectsList.editList,
                objPermission: objectsList.objPermission,
                editAllObject: editAllObject,
                work_flow_admin_privileges_dict: work_flow_admin_privileges_dict
            });
        });
    });
};

contentModule.stageReportMakePrivilegeViewWorkFlow = function(host){
    if (host.employeeOfMe.length == 0) return [];
    contentModule.makeOrgsIndex(host);
    contentModule.makeEmployeeData(host);
    contentModule.makeEmployeesIndex(host);
    var orgsDic = contentModule.makeDictionaryIndex(host.database.orgs.items);
    var empOrgMeDic = {};
    empOrgMeDic[-host.employeeOfMe[0]] = true;
    var eIndex = host.database.employees.getIndex(host.employeeOfMe[0]);
    var orgid = host.database.employees.items[eIndex].orgid;
    while (orgid > 0) {
        empOrgMeDic[orgid] = true;
        var oIndex = orgsDic[orgid];
        if (oIndex >= 0){
            orgid = host.database.orgs.items[oIndex].parentid;
        }
        else {
            break;
        }
    }
    var list = [];
    for (var i = 0; i < host.database.work_flow_members.items.length; i++){
        if (empOrgMeDic[host.database.work_flow_members.items[i].orgid]){
            list.push(host.database.work_flow_members.items[i].work_flowid);
        }
    }
    return list;
};

contentModule.stageReportMakePrivilegeObjects = function(host){
    if (host.employeeOfMe.length == 0) return {editList: [], viewList: []};
    var orgsDic = contentModule.makeDictionaryIndex(host.database.orgs.items);
    host.empOrgMeDic = {};
    host.empOrgMeDic[host.employeeOfMe[0]];
    var eIndex = host.database.employees.getIndex(host.employeeOfMe[0]);
    var orgid = host.database.employees.items[eIndex].orgid;
    while (orgid > 0) {
        host.empOrgMeDic[orgid] = true;
        var oIndex = orgsDic[orgid];
        if (oIndex >= 0){
            orgid = host.database.orgs.items[oIndex].parentid;
        }
        else {
            break;
        }
    }
    var viewList = [];
    var editList = [];
    var dict = {};
    for (var i = 0; i < host.database.object_permissions.items.length; i++){
        if (host.database.object_permissions.items[i].orgid > 0) {
            if (host.empOrgMeDic[host.database.object_permissions.items[i].orgid]){
                viewList.push(host.database.object_permissions.items[i].objectid);
                if (host.database.object_permissions.items[i].priv == "edit"){
                    editList.push(host.database.object_permissions.items[i].objectid);
                }
            }
        }
        else {
            if (-host.database.object_permissions.items[i].orgid == host.employeeOfMe[0]){
                viewList.push(host.database.object_permissions.items[i].objectid);
                if (host.database.object_permissions.items[i].priv == "edit"){
                    editList.push(host.database.object_permissions.items[i].objectid);
                }
            }
        }
        if (!dict[host.database.object_permissions.items[i].objectid]) dict[host.database.object_permissions.items[i].objectid] = {
            edit: [],
            view: []
        };
        if (host.database.object_permissions.items[i].orgid < 0) {
            dict[host.database.object_permissions.items[i].objectid][host.database.object_permissions.items[i].priv].push(-host.database.object_permissions.items[i].orgid);
        }
        else {
            dict[host.database.object_permissions.items[i].objectid][host.database.object_permissions.items[i].priv] = dict[host.database.object_permissions.items[i].objectid][host.database.object_permissions.items[i].priv].concat(
                host.database.orgs.items[orgsDic[host.database.object_permissions.items[i].orgid]].allEmployeeIdList
            )
        }
    }
    return {
        viewList: viewList,
        editList: editList,
        objPermission: dict
    };
};

contentModule.reportTimeModule = function(params){
    var timeClass = params.class;
    var timeItems = [
        {value: 1, text: LanguageModule.text("txt_yesterday")},
        {value: 2, text: LanguageModule.text("txt_today")},
        {value: 3, text: LanguageModule.text("txt_last_week")},
        {value: 4, text: LanguageModule.text("txt_this_week")},
        {value: 5, text: LanguageModule.text("txt_last_7_days")},
        {value: 13, text: LanguageModule.text("txt_7_days_before_after")},
        {value: 15, text: LanguageModule.text("txt_30_days_before_after")},
        {value: 6, text: LanguageModule.text("txt_last_month")},
        {value: 7, text: LanguageModule.text("txt_this_month")},
        {value: 8, text: LanguageModule.text("txt_last_30_days")},
        {value: 9, text: LanguageModule.text("txt_last_quarter")},
        {value: 10, text: LanguageModule.text("txt_this_quarter")},
        {value: 11, text: LanguageModule.text("txt_last_90_days")},
        {value: 12, text: LanguageModule.text("txt_last_year")},
        {value: 14, text: LanguageModule.text("txt_this_year")},
        {value: 0, text: LanguageModule.text("txt_option")}
    ];
    var props;
    if (params.props) {
        props = params.props;
    }
    else {
        props = {};
    }
    props.items = timeItems;
    props.value = params.value.relativeTime ? params.value.relativeTime: 0;
    var displayFunc = function(value){
        if (value == 0) {
            absol.$("." + timeClass, params.container, function(elt){
                elt.style.display = null;
            });
        }
        else {
            absol.$("." + timeClass, params.container, function(elt){
                elt.style.display = "none";
            });
        }
    };
    var cbb = absol._({
        tag: "selectmenu",
        props: {
            items: timeItems,
            value: params.value.relativeTime ? params.value.relativeTime: 0
        },
        on: {
            change: function(){
                displayFunc(cbb.value);
                start.disabled = cbb.value != 0;
                end.disabled = cbb.value != 0;
                if (params.change) params.change();
            }
        }
    });

    var start = absol._({
        tag: 'dateinput',
        props: {
            value: params.value.start,
            disabled: cbb.value != 0
        },
        on: {
            change: function(){
                if (params.change) params.change();
            }
        }
    });

    var end = absol._({
        tag: 'dateinput',
        props: {
            value: params.value.end,
            disabled: cbb.value != 0
        },
        on: {
            change: function(){
                if (params.change) params.change();
            }
        }
    });

    var retval = {
        timeElt: cbb,
        startElt: start,
        endElt: end,
        getValue: function(){
            var timeValue, startValue, endValue;
            timeValue = cbb.value;
            startValue = start.value;
            endValue = end.value;
            var rs = contentModule.generateRelativeTime({value: timeValue, from: startValue, to: endValue});
            return {
                originValue: {
                    relativeTime: timeValue,
                    start: startValue,
                    end: endValue
                },
                specificValue: {
                    start: rs.start,
                    end: rs.end
                }
            };
        }
    };

    return retval;

};

contentModule.getMillisecondsWithoutTime = function(date){
    var y, m, d, t;
    y = date.getFullYear();
    m = date.getMonth();
    d = date.getDate();
    t = new Date(y, m, d);
    return t.getTime();
};

contentModule.getMillisecondsWithoutSecond = function(date){
    var y, m, d, h, mt, t;
    y = date.getFullYear();
    m = date.getMonth();
    d = date.getDate();
    h = date.getHours();
    mt = date.getMinutes();
    t = new Date(y, m, d, h, mt);
    return t.getTime();
};

contentModule.getTime = function(date){
    var start, end;
    start = contentModule.getMillisecondsWithoutTime(date);
    date.setDate(date.getDate() + 1);
    end = contentModule.getMillisecondsWithoutTime(date);
    return {
        start: start,
        end: end
    };
};

contentModule.getWeekTime = function(firstDayOfWeek){
    var start, end;
    start = contentModule.getMillisecondsWithoutTime(firstDayOfWeek);
    firstDayOfWeek.setDate(firstDayOfWeek.getDate() + 7);
    end = contentModule.getMillisecondsWithoutTime(firstDayOfWeek);
    return {
        start: start,
        end: end
    };
};

contentModule.getMonthTime = function(firstDayOfMonth){
    var start, end;
    start = contentModule.getMillisecondsWithoutTime(firstDayOfMonth);
    firstDayOfMonth.setMonth(firstDayOfMonth.getMonth() + 1);
    end = contentModule.getMillisecondsWithoutTime(firstDayOfMonth);
    return {
        start: start,
        end: end
    };
};

contentModule.getQuaterTime = function(firstDayOfQuater){
    var start, end;
    start = contentModule.getMillisecondsWithoutTime(firstDayOfQuater);
    firstDayOfQuater.setMonth(firstDayOfQuater.getMonth() + 3);
    end = contentModule.getMillisecondsWithoutTime(firstDayOfQuater);
    return {
        start: start,
        end: end
    };
};

contentModule.getYearTime = function(firstDayOfYear){
    var start, end;
    start = contentModule.getMillisecondsWithoutTime(firstDayOfYear);
    firstDayOfYear.setFullYear(firstDayOfYear.getFullYear() + 1);
    end = contentModule.getMillisecondsWithoutTime(firstDayOfYear);
    return {
        start: start,
        end: end
    };
};

contentModule.getLastXDayTime = function(firstDay){
    var start, end;
    start = contentModule.getMillisecondsWithoutTime(firstDay);
    end = contentModule.getMillisecondsWithoutTime(new Date());
    return {
        start: start,
        end: end
    };
};

contentModule.generateRelativeTime = function(condition){
    /*
    condition: {
        value:
        from:
        to:
    }
    */
    // giá trị trả về là miliseconds
    var time, temp;
    var date = new Date();
    switch (condition.value) {
        case 0:
            if (condition.from && condition.to) {
                var from = contentModule.getMillisecondsWithoutTime(condition.from);
                from = new Date(from);
                var to = contentModule.getMillisecondsWithoutTime(condition.to);
                to = new Date(to);
                to.setDate(to.getDate() + 1);
                time = {
                    start: from.getTime(),
                    end: to.getTime()
                };
            }
            else {
                time = {
                    start: 0,
                    end: 0
                };
            }
            break;
        case 1:
            date.setDate(date.getDate() - 1);
            time = contentModule.getTime(date);
            break;
        case 2:
            time = contentModule.getTime(date);
            break;
        case 3:
            temp = date.getDay() - 1;
            date.setDate(date.getDate() - temp - 7);
            time = contentModule.getWeekTime(date);
            break;
        case 4:
            temp = date.getDay() - 1;
            date.setDate(date.getDate() - temp);
            time = contentModule.getWeekTime(date);
            break;
        case 5:
            date.setDate(date.getDate() - 7);
            time = contentModule.getLastXDayTime(date);
            break;
        case 6:
            date.setMonth(date.getMonth() - 1);
            date.setDate(1);
            time = contentModule.getMonthTime(date);
            break;
        case 7:
            date.setDate(1);
            time = contentModule.getMonthTime(date);
            break;
        case 8:
            date.setDate(date.getDate() - 30);
            time = contentModule.getLastXDayTime(date);
            break;
        case 9:
            temp = Math.floor(date.getMonth() / 3) * 3;
            date.setMonth(temp - 3, 1);
            // date.setDate(1);
            time = contentModule.getQuaterTime(date);
            break;
        case 10:
            temp = Math.floor(date.getMonth() / 3) * 3;
            date.setMonth(temp, 1);
            // date.setDate(1);
            time = contentModule.getQuaterTime(date);
            break;
        case 11:
            date.setDate(date.getDate() - 90);
            time = contentModule.getLastXDayTime(date);
            break;
        case 12:
            date.setDate(1);
            date.setMonth(0);
            date.setFullYear(date.getFullYear() - 1);
            time = contentModule.getYearTime(date);
            break;
        case 13:
            date.setDate(date.getDate() - 6);
            time = {
                start: contentModule.getTime(date).start
            };
            date.setDate(date.getDate() + 12);
            time.end = contentModule.getTime(date).end;
            break;
        case 15:
            date.setDate(date.getDate() - 29);
            time = {
                start: contentModule.getTime(date).start
            };
            date.setDate(date.getDate() + 58);
            time.end = contentModule.getTime(date).end;
            break;
        case 14:
            time = {
                end: contentModule.getTime(date).end
            }
            date.setDate(1);
            date.setMonth(0);
            time.start = contentModule.getYearTime(date).start;
            break;
    }
    return time;
};

contentModule.makeTableRow = function(content, value){
    var res;
    switch (content.type) {
        case "string":
        case "email_address":
        case "gps":
        case "website":
        case "phonenumber":
            res = DOMElement.td({
                attrs: {
                    style: {whiteSpace: "nowrap"},
                }
            })
            res = {
                style: {whiteSpace: "nowrap"},
                value: value,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view"
                    },
                    text: value
                })
            };
            break;
        case "note":
            var valueText = value? value.substr(0, 200) : "";
            res = {
                value: value,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view hr-table-desc-ctn"
                    },
                    text: value
                })
            };
            break;
        case "number":
            res = {
                style: {
                    textAlign: "right"
                },
                value: value,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                    },
                    text: value
                })
            };
            break;
        case "currency":
            res = {
                style: {
                    textAlign: "right"
                },
                value: value,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                    },
                    text: (value === "")? "" : absol.$.formatLocalFloat(value)
                })
            };
            break;
        case "date":
            res = {
                style: {
                    textAlign: "center"
                },
                value: (value)? value.getTime() : 0,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                    },
                    text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getDateView(value) : ""
                })
            };
            break;
        case "datetime":
            res = {
                style: {
                    textAlign: "center"
                },
                value: (value)? value.getTime() : 0,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                    },
                    text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getDateTimeView(value) : ""
                })
            };
            break;
        case "time":
            res = {
                style: {
                    textAlign: "center"
                },
                value: (value)? value.getTime() : 0,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                    },
                    text: (value && value.getTime() != TIME_NULL_MILLISECOND)? contentModule.getTimeView(value) : ""
                })
            };
            break;
        case "boolean":
            res = {
                value: value,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                        align: "center"
                    },
                    children: [absol.buildDom({
                        tag: "switch",
                        style: {
                            font: "var(--switch-fontsize)"
                        },
                        props: {
                            checked: value,
                            disabled: true
                        }
                    })]
                })
            };
            break;
        case "hour_period":
            var text = "";
            if (value && value.dayOffset) text = absol.datetime.formatTimeRange24(value);
            res = {
                style: {whiteSpace: "nowrap"},
                value: text,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view",
                        align: "center"
                    },
                    text: text
                })
            };
            break;
        case "html":
            var xt = DOMElement.div({
                innerHTML: value? value: ""
            });
            var valueText = xt.innerText.substr(0, 200);
            res = {
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view hr-table-desc-ctn"
                    },
                    text: valueText
                })
            };
            break;
        case "nation_city":
            var text = "";
            if (value){
                var item = content.listItemsDic.getItemByValue(value[0]);
                if (item) text = item.text;
                var ld = new absol.ListDictionary(item.itemsDic);
                item = ld.getItemByValue(value[1]);
                if (item) text += " - " +  item.text;
            }
            res = {
                style: {whiteSpace: "nowrap"},
                value: text,
                element: DOMElement.div({
                    attrs: {
                        className: "sortTable-cell-view"
                    },
                    text: text
                })
            };
            break;
        default:
            if (contentModule.listTypeSelectmenu.indexOf(content.type) >= 0 || content.type == "enum" || content.type == "extends_enum"){
                var item = content.listItemsDic.getItemByValue(value);
                var text;
                if (!item) text = "";
                else text = item.text;
                res = {
                    value: text,
                    element: DOMElement.div({
                        attrs: {
                            className: "sortTable-cell-view"
                        },
                        text: text
                    })
                };
            }
            else if (contentModule.listTypeSelectbox.indexOf(content.type) >= 0) {
                var text = "";
                var item;
                if (value){
                    for (var i = 0; i < value.length; i++){
                        item = content.listItemsDic.getItemByValue(value[i]);
                        if (item) text += ", " + item.text
                    }
                    text = text.substr(2);
                }
                res = {
                    value: text,
                    element: DOMElement.div({
                        attrs: {
                            className: "sortTable-cell-view"
                        },
                        text: text
                    })
                };
            }
            else if (content.type == "purpose"){
                var text = "";
                if (value){
                    text = content.itemsDic[value.tablename].name;
                    if (content.itemsDic[value.tablename].listItems){
                        var item = content.itemsDic[value.tablename].listItemsDic.getItemByValue(value.instanceid);
                        if (item) text += ": " + item.text;
                        else text += ":";
                    }
                }
                res = {
                    value: text,
                    element: DOMElement.div({
                        attrs: {
                            className: "sortTable-cell-view"
                        },
                        text: text
                    })
                };
            }
            else {
                res = {
                    value: value,
                    element: DOMElement.div({
                        attrs: {
                            className: "sortTable-cell-view"
                        },
                        text: value
                    })
                };
            }

    }
    return res;
};

contentModule.fixObjectExtraDataTPN = function(){

    data_module.loadObjectsList().then(function(temp1){
        var length = temp1.length;
        var count = 0;
        temp1.forEach(function(elt){
            var pattern = {
                type: "struct",
                cond: "and",
                children: {
                    objectid: {
                        type: "number",
                        cond: "eq",
                        value: parseInt(elt.id, 10)
                    },
                    extraid: {
                        type: "number",
                        cond: "true"
                    }
                }
            };

            fconnector.search("extradata_objects_links", pattern, function(value1) {
                if (value1 && value1.length > 0){
                    fconnector.read("extradata_objects_links", value1[0], function (success2, value2){
                        if (success2){
                            fconnector.read("extradata_objects", value2.extraid, function (success3, value3){
                                var isChanged = false;
                                if (success3){
                                    if (value3["type_3_1653099260843"]){
                                        if (value3["type_3_1653099260843"][6]) {
                                            if (value3["type_3_1653099260843"][6].constructor === Array) value3["type_3_1653099260843"] = value3["type_3_1653099260843"][6];
                                            else value3["type_3_1653099260843"] = [value3["type_3_1653099260843"][6]];
                                            isChanged = true;
                                        }
                                    }
                                    else {
                                        isChanged = true;
                                        value3["type_3_1653099260843"] = [];
                                    }
                                    if (!value3["type_3_1653097703606"]) {
                                        isChanged = true;
                                        value3["type_3_1653097703606"] = "";
                                    }
                                    if (!value3["type_3_1653097707826"]) {
                                        isChanged = true;
                                        value3["type_3_1653097707826"] = "";
                                    }
                                    if (!value3["type_3_1653097725528"]) {
                                        isChanged = true;
                                        value3["type_3_1653097725528"] = [];
                                    }
                                    if (!value3["type_3_1653099033232"]) {
                                        isChanged = true;
                                        value3["type_3_1653099033232"] = [];
                                    }
                                    if (!value3["type_3_1653099200511"]) {
                                        isChanged = true;
                                        value3["type_3_1653099200511"] = 0;
                                    }
                                    if (!value3["type_3_1653099230071"]) {
                                        isChanged = true;
                                        value3["type_3_1653099230071"] = false;
                                    }
                                    if (isChanged) {
                                        FormClass.api_call({
                                            url: "fix_extra_data_save.php",
                                            params: [
                                                {name: "task", value: "object"},
                                                {name: "data", value: EncodingClass.string.fromVariable({
                                                    id: value2.extraid,
                                                    data: value3
                                                })}
                                            ],
                                            func: function(success, message) {
                                                if (success) {
                                                    if (message.substr(0, 2) == "ok") {
                                                        console.log("ok", ++count + "/" + length);
                                                    }
                                                    else {
                                                        console.log(message, ++count + "/" + length);
                                                    }
                                                }
                                                else {
                                                    console.log(message, ++count + "/" + length);
                                                }
                                            }
                                        })
                                    }
                                    else {
                                        console.log(++count + "/" + length);
                                        // rs(null);
                                    }
                                }
                                else {
                                    console.log(++count + "/" + length);
                                    // rs(null);
                                }
                            });
                        }
                        else {
                            console.log(++count + "/" + length);
                            // rs(null);
                        }
                    });
                }
                else {
                    console.log(++count + "/" + length);
                    // rs(null);
                }
            });

        });
    });

};

contentModule.fixNullValue = function(){
    FormClass.api_call({
        url: "fix_extra_data_save.php",
        params: [
            {name: "task", value: "object"},
            {name: "data", value: EncodingClass.string.fromVariable({
                id: 1560,
                data: {
                    type_1_1651637311687: "",
                    type_1_1651637330931: "",
                    type_1_1651637347745: [],
                    type_1_1651637421042: [],
                    type_1_1651637500250: 0,
                    type_1_1651637508822: "type_1_1651637008324",
                    type_1_1651637536756: false,
                    type_1_1651641280821: "",
                    type_1_1652771680413: [],
                    type_1_1652771693302: []
                }
            })}
        ],
        func: function(success, message) {
            if (success) {
                if (message.substr(0, 2) == "ok") {
                    console.log("ok-" + 1560);
                }
                else {
                    console.log(message);
                }
            }
            else {
                console.log(message);
            }
        }
    });
    FormClass.api_call({
        url: "fix_extra_data_save.php",
        params: [
            {name: "task", value: "object"},
            {name: "data", value: EncodingClass.string.fromVariable({
                id: 1561,
                data: {
                    type_1_1651637311687: "",
                    type_1_1651637330931: "",
                    type_1_1651637347745: [],
                    type_1_1651637421042: [],
                    type_1_1651637500250: 0,
                    type_1_1651637508822: "type_1_1651637008324",
                    type_1_1651637536756: false,
                    type_1_1651641280821: "",
                    type_1_1652771680413: [],
                    type_1_1652771693302: []
                }
            })}
        ],
        func: function(success, message) {
            if (success) {
                if (message.substr(0, 2) == "ok") {
                    console.log("ok-" + 1561);
                }
                else {
                    console.log(message);
                }
            }
            else {
                console.log(message);
            }
        }
    });
    FormClass.api_call({
        url: "fix_extra_data_save.php",
        params: [
            {name: "task", value: "object"},
            {name: "data", value: EncodingClass.string.fromVariable({
                id: 1562,
                data: {
                    type_1_1651637311687: "",
                    type_1_1651637330931: "",
                    type_1_1651637347745: [],
                    type_1_1651637421042: [],
                    type_1_1651637500250: 0,
                    type_1_1651637508822: "type_1_1651637008324",
                    type_1_1651637536756: false,
                    type_1_1651641280821: "",
                    type_1_1652771680413: [],
                    type_1_1652771693302: []
                }
            })}
        ],
        func: function(success, message) {
            if (success) {
                if (message.substr(0, 2) == "ok") {
                    console.log("ok-" + 1562);
                }
                else {
                    console.log(message);
                }
            }
            else {
                console.log(message);
            }
        }
    });
    FormClass.api_call({
        url: "fix_extra_data_save.php",
        params: [
            {name: "task", value: "object"},
            {name: "data", value: EncodingClass.string.fromVariable({
                id: 1565,
                data: {
                    type_1_1651637311687: "",
                    type_1_1651637330931: "",
                    type_1_1651637347745: [],
                    type_1_1651637421042: [],
                    type_1_1651637500250: 0,
                    type_1_1651637508822: "type_1_1651637008324",
                    type_1_1651637536756: false,
                    type_1_1651641280821: "",
                    type_1_1652771680413: [],
                    type_1_1652771693302: []
                }
            })}
        ],
        func: function(success, message) {
            if (success) {
                if (message.substr(0, 2) == "ok") {
                    console.log("ok-" + 1565);
                }
                else {
                    console.log(message);
                }
            }
            else {
                console.log(message);
            }
        }
    });
}

contentModule.getApprovalPoliciesElt = function(params){
    var getRowApprover = function(employeeid){
        var employee_select = absol.buildDom({
            tag: "selecttreeleafmenu",
            style: {
                display: "block",
                width: "100%"
            },
            props: {
                items: params.employeeViewItems,
                enableSearch: true,
                value: employeeid
            }
        });
        var cells = [
            {
                style: {
                    width: '30px',
                    textAlign: 'center',
                    fontSize: '25px'
                },
                class: 'as-drag-zone',
                child: 'span.mdi.mdi-drag'
            },
            {
                child: employee_select
            }
        ];
        var deleteIcon = DOMElement.div({
            attrs: {
                className: "card-icon-remove-cover",
                onclick: function(){
                    var x = tableView.rowOf(row)
                    x.remove();
                }
            },
            children: [DOMElement.i({
                attrs: {
                    className: "material-icons card-icon-remove"
                },
                text: "remove_circle"
            })]
        });
        cells.push({
            child: deleteIcon
        });
        var row = {cells: cells};
        row.getValue = function(){
            var x = employee_select.value;
            if (x == 0){
                ModalElement.alert({
                    message: LanguageModule.text("txt_employee_is_null")
                });
                return;
            }
            return x;
        };
        return row;
    };
    var approval_method_select = absol.buildDom({
        tag: "selectmenu",
        style: {
            display: "block",
            width: "100%"
        },
        props: {
            items: contentModule.getListApprovalMethod()
        }
    });
    if (params.dataPolicyEdit.approval_method != "") approval_method_select.value = params.dataPolicyEdit.approval_method;
    var direct_manager_approves_first_checkbox = absol.buildDom({
        tag: "checkbox",
        props: {
             checked: params.dataPolicyEdit.direct_manager_approves_first
        }
    });
    var indirect_manager_approves_first_checkbox = absol.buildDom({
        tag: "checkbox",
        props: {
             checked: params.dataPolicyEdit.indirect_manager_approves_first
        }
    });
    var time_hours_needed_for_approval_input = theme.input({
        type: "number",
        min: 0,
        style: {
            textAlign: "right"
        },
        value: params.dataPolicyEdit.time_hours_needed_for_approval
    });
    var data = [];
    for (var i = 0; i < params.dataPolicyEdit.approvers.length; i++){
        data.push(getRowApprover(params.dataPolicyEdit.approvers[i].employeeid));
    }
    var tableView = absol.buildDom({
        tag: "dynamictable",
        props: {
            adapter: {
               rowsPerPage: Infinity,
               data: {
                   head: {
                       rows: [
                           {
                               cells: [
                                   {},
                                   {
                                       child:  absol.buildDom({text: LanguageModule.text("txt_employee")})
                                   },
                                   {}
                               ]
                           }
                       ]
                   },
                   body: {
                       rows: data
                   }
               }
           }
        }
    });
    var editApprovalForm = DOMElement.div({
        children: [
            DOMElement.table({
                data: [
                    [
                        {text: LanguageModule.text("txt_time_hours_needed_for_approval")},
                        {attrs: {style: {width: "var(--control-horizontal-distance-2)"}}},
                        time_hours_needed_for_approval_input
                    ],
                    [{attrs: {style: {height: "var(--control-verticle-distance-2)"}}}],
                    [
                        {text: LanguageModule.text("txt_direct_manager_approves")},
                        {attrs: {style: {width: "var(--control-horizontal-distance-2)"}}},
                        direct_manager_approves_first_checkbox
                    ],
                    [{attrs: {style: {height: "var(--control-verticle-distance-2)"}}}],
                    [
                        {text: LanguageModule.text("txt_indirect_manager_approves")},
                        {attrs: {style: {width: "var(--control-horizontal-distance-2)"}}},
                        indirect_manager_approves_first_checkbox
                    ],
                    [{attrs: {style: {height: "var(--control-verticle-distance-2)"}}}],
                    [
                        {text: LanguageModule.text("txt_approval_method")},
                        {attrs: {style: {width: "var(--control-horizontal-distance-2)"}}},
                        approval_method_select
                    ]
                ]
            }),
            DOMElement.div({attrs: {style: {height: "var(--control-verticle-distance-2)"}}}),
            DOMElement.div({
                children: [
                    DOMElement.span({text: LanguageModule.text("txt_approvers")}),
                    DOMElement.div({
                        attrs: {
                            className: "mk-table-wrapper-header-cmd",
                            onclick: function(){
                                tableView.addRow(getRowApprover(0));
                            }
                        },
                        text: LanguageModule.text("txt_add")
                    })
                ]
            }),
            DOMElement.div({attrs: {style: {height: "var(--control-verticle-distance-2)"}}}),
            tableView
        ]
    });
    editApprovalForm.getValue = function(){
        var time_hours_needed_for_approval = parseFloat(time_hours_needed_for_approval_input.value);
        var direct_manager_approves_first = direct_manager_approves_first_checkbox.checked? 1 : 0;
        var indirect_manager_approves_first = indirect_manager_approves_first_checkbox.checked? 1 : 0;
        var approvers = [], value;
        var data = tableView.requireRows();
        var rowData;
        for (var i = 0; i < data.length; i++){
            rowData = data[i];
            value = rowData.data.getValue();
            if (!value) return;
            approvers.push(value);
        }
        if (!direct_manager_approves_first && !indirect_manager_approves_first && approvers.length == 0){
            ModalElement.alert({
                message: LanguageModule.text("txt_approvers_is_null")
            });
            return;
        }
        var res = {
            direct_manager_approves_first: direct_manager_approves_first,
            indirect_manager_approves_first: indirect_manager_approves_first,
            time_hours_needed_for_approval: time_hours_needed_for_approval,
            approval_method: approval_method_select.value,
            approvers: approvers
        };
        return res;
    };
    return editApprovalForm;
};


contentModule.formEditApprovalPolicies = function(params){
    var editApprovalForm = contentModule.getApprovalPoliciesElt(params);
    ModalElement.showWindow({
        title: LanguageModule.text("txt_approval"),
        bodycontent: editApprovalForm,
        buttonlist: [
            {
                text: LanguageModule.text("txt_save"),
                onclick: function(){
                    var data = editApprovalForm.getValue();
                    if (!data) return;
                    params.func.save(data);
                }
            },
            {
                text: LanguageModule.text("txt_cancel"),
                onclick: function(){
                    ModalElement.close();
                }
            }
        ]
    });
};

contentModule.getPolicyHasApplyToEmployee = function(host, id, type, employeeid){
    var res = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    if (employeeid == 0) return res;
    var dic = {};
    for (var i = 0; i < host.database.employee_policies.items.length; i++){
        if (host.database.employee_policies.items[i].employeeid != employeeid) continue;
        if (host.database.employee_policies.items[i].id == id) continue;
        if (host.database.employee_policies.items[i].type != type) continue;
        dic[host.database.employee_policies.items[i].policyid] = true;
    }
    for (var i = 0; i < host.database[type + "_policies"].items.length; i++){
        if (dic[host.database[type + "_policies"].items[i].id]) continue;
        res.push({
            value: host.database[type + "_policies"].items[i].id,
            text: host.database[type + "_policies"].items[i].name
        });
    }
    return res;
};

contentModule.getLeavePolicyHasApplyToEmployee = function(host, id, employeeid){
    var res = [{value: 0, text: LanguageModule.text("txt_select_value")}];
    if (employeeid == 0) return res;
    var pIndex;
    var dic = {};
    for (var i = 0; i < host.database.employee_policies.items.length; i++){
        if (host.database.employee_policies.items[i].employeeid != employeeid) continue;
        if (host.database.employee_policies.items[i].id == id) continue;
        if (host.database.employee_policies.items[i].type != "leave") continue;
        pIndex = host.database.leave_policies.getIndex(host.database.employee_policies.items[i].policyid);
        if (pIndex >= 0) dic[host.database.leave_policies.items[pIndex].groupid] = true;
    }
    for (var i = 0; i < host.database.leave_policies.items.length; i++){
        if (dic[host.database.leave_policies.items[i].groupid]) continue;
        res.push({
            value: host.database.leave_policies.items[i].id,
            text: host.database.leave_policies.items[i].name
        });
    }
    return res;
};

contentModule.getGeneralDefault = function(){
    return {id: -1, name: LanguageModule.text("txt_general"), code: "C", typeid: 0, input_formid: 0, output_formid: 0, description: "", available: 1, extrainfo: {}, ver: 1};
};


contentModule.handleIncomletedForm = function(formView, verifyInfo){
    var mess = "";
    var comp = verifyInfo.comp;
    if (verifyInfo.comp.tag == "TableInput") {
        mess = comp.attributes.inpcompletedMessage || "Lỗi nhập thiếu trường $fieldName";
        mess = mess.replace("$fieldName", verifyInfo.incompleteCell.descriptor.text);
        ModalElement.alert({
            message: mess,
            func: function(){
                comp.focusIncompleteCell();
            }
        });
    }
};

contentModule.getCalOrderList = function (calList, variablesSystemList) {
    var i, j, k, m, n = calList.length;
    var indexList = {};
    var paths = [], varList;
    for (var i = 0; i < n; i++){
        calList[i].code = calList[i].code.toLowerCase();
    }
    for (var i = 0; i < variablesSystemList.length; i++){
        variablesSystemList[i].name = variablesSystemList[i].name.toLowerCase();
    }
    var getVarList = function (parsedExpression) {
        var host = {
            marked: {},
            retval: []
        }
        parsedExpression.check(function (host) {
            return function (name) {
                if (host.marked[name] === undefined) {
                    host.marked[name] = true;
                    host.retval.push(name);
                }
                return true;
            }
        } (host));
        return host.retval;
    }
    variablesSystemList.forEach(function(item){
        indexList[item.name] = 1000000;
    });
    for (i = 0; i < n; i++) {
        if (indexList[calList[i].code] === undefined) {
            indexList[calList[i].code] = i;
        }
        else {
            console.log(LanguageModule.text2("txt_duplicated_code", [calList[i].code]));
            return {
                status: false,
                content: {
                    type: "duplicate_code",
                    value: calList[i].code
                }
            };
        }
    }
    for (i = 0; i < n; i++) {
        paths[i] = [];
        if (calList[i].setting){
            if (calList[i].setting.data == "formula") {
                varList = getVarList(calList[i].setting.formula);
                m = varList.length;
                for (j = 0; j < m; j++) {
                    k = indexList[varList[j]];
                    if (k === undefined) {
                        console.log("variable not found (" + varList[j] + ")!", calList[i].setting.formula.content);
                        return {
                            status: false,
                            content: {
                                type: "variable_not_found",
                                value: varList[j]
                            }
                        };
                    }
                    if (k != 1000000) paths[i].push(k);
                }
            }
            else if (calList[i].setting.data == "function") {
                m = calList[i].setting.function.args.length;
                for (j = 0; j < m; j++) {
                    if (calList[i].setting.function.args[j].type == "code_of_column") {
                        var column_code = calList[i].setting.function.args[j].value.toLowerCase();
                        k = indexList[column_code];
                        if (k === undefined) {
                            console.log("code_of_column not found (" + calList[i].setting.function.args[j].value + "/" + i + ")!");
                            return {
                                status: false,
                                content: {
                                    type: "code_of_column_not_found",
                                    value: calList[i].setting.function.args[j].value
                                }
                            };
                        }
                        paths[i].push(k);
                    }
                }
            }
        }
    }
    var host = {
        exported: {},
        paths: paths,
        inqueue: {},
        result: []
    };
    host.genExportOrder = function (host) {
        return function (index) {
            var i, k, n = host.paths[index].length;
            host.inqueue[index] = true;
            for (i = 0; i < n; i++) {
                k = host.paths[index][i];
                if (host.exported[k] === true) continue;
                if (host.inqueue[k] === true) {
                    console.log("circle reference found!");
                    return false;
                }
                if (!host.genExportOrder(k)) return false;
            }
            host.exported[index] = true;
            host.result.push(index);
            return true;
        }
    } (host);
    for (i = 0; i < n; i++) {
        if (host.exported[i] !== true) {
            if (!host.genExportOrder(i)) return {
                status: false,
                content: {
                    type: "circle reference found!"
                }
            };
        }
    }
    return {
        status: true,
        content: host.result
    };
}

contentModule.testCalOrderList = function () {
    var tobj = [];
    tobj.push({
        name: "name " + tobj.length,
        code: "col0",
        setting: {
            data: "direct_input"
        }
    });
    tobj.push({
        name: "name " + tobj.length,
        code: "col1",
        setting: {
            data: "formula",
            formula: MathClass.Expression.parse("col0 + 10 + col2")
        }
    });
    tobj.push({
        name: "name " + tobj.length,
        code: "col2",
        setting: {
            data: "formula",
            formula: MathClass.Expression.parse("lg(col4 + 150)")
        }
    });
    tobj.push({
        name: "name " + tobj.length,
        code: "col3",
        setting: {
            data: "direct_input"
        }
    });
    tobj.push({
        name: "name " + tobj.length,
        code: "col4",
        setting: {
            data: "formula",
            formula: MathClass.Expression.parse("col3 + col5")
        }
    });
    tobj.push({
        name: "name " + tobj.length,
        code: "col5",
        setting: {
            data: "function",
            function: {
                functionid: 0,
                args: [
                    {type: "number", value: 100},
                    {type: "string", value: "asdf"},
                    {type: "code_of_column", value: "col6"},
                ]
            }
        }
    });
    tobj.push({
        name: "name " + tobj.length,
        code: "col6",
        setting: {
            data: "direct_input"
        }
    });
    return contentModule.getCalOrderList(tobj);
}

if (hr.systemFunctions === undefined) hr.systemFunctions = {};
/****
 * hàm gọi form trong modal
 * @param {number|string} typeId
 * @param {number|string|null} formId

 * @param {any=}initValue - có thể null, undefined, có thể lỗi dữ liệu do user truyền sai
 * @param {boolean=}cancelable - mặc định là false, nếu cancelable= true, thì mới có nút cancel
 * @returns {Promise<any>} hàm resolve về kết quả của form trong promise sau khi người ta nhấn ok, nếu nhấn cancel, resolve null
 */
hr.systemFunctions.openInputForm = function (typeId, formId, initValue, cancelable, title) {
    return new Promise(function(rs, rj){
        var formContainer = absol._({});
        var buttonlist = [
            {
                text: LanguageModule.text("txt_ok"),
                onclick: function(){
                    var value = formContainer.getValue();
                    if (value !== undefined) {
                        rs(value);
                        ModalElement.close();
                    }
                    else rj(value);
                }
            }
        ];
        if (cancelable) buttonlist.push({
            text: LanguageModule.text("txt_cancel"),
            onclick: function(){
                ModalElement.close();
                rj("close");
            }
        });
        ModalElement.showWindow({
            title: title ? title : "Input",
            bodycontent: formContainer,
            buttonlist: buttonlist
        })
        var callbackfunc = function(){
            if (data_module.pendingData.status == "error"){
                ModalElement.alert("Có lỗi trong quá trình khởi tạo dữ liệu");
                return;
            }
            else if (data_module.pendingData.status == "pending") {
                setTimeout(function(){
                    callbackfunc();
                }, 500);
                return;
            }
            var typelists = data_module.typelists.items;
            var dict = {};
            typelists.forEach(function (elt, index) {
                dict[elt.id] = elt;
            });
            var AssemblerInstance = absol.form.AssemblerInstance;
            var $ = absol.$;
            var _ = absol._;
            var JSZip = absol.JSZip;
            var makeFmFragmentClass = absol.form.makeFmFragmentClass;
            var mSignUpFrag = AssemblerInstance.buildFragment({class: formId.toString()});
            mSignUpFrag.setContext("SHARE_PARAMS", {});
            // if (!mSignUpFrag.domElt.hasClass("as-relative-layout")){
            //     mSignUpFrag.domElt.addStyle({
            //         width: '100%',
            //         height:'100%',
            //         display: 'block'
            //     });
            // }
            DOMElement.removeAllChildren(formContainer);
            formContainer.appendChild(mSignUpFrag.domElt);
            formContainer.formFragment = mSignUpFrag;
            formContainer.getValue = function(alert_value){
                return contentModule.getValueOfUserForm(mSignUpFrag, typeId, typelists, alert_value == "no_alert" ? true : false);
            }
            if (!initValue) initValue = {};
            contentModule.setValueOfUserForm({
                typelists: typelists,
                valueContent: initValue,
                typeid: typeId
            }).then(function(value){
                if (mSignUpFrag.state === "RUNNING"){
                    mSignUpFrag.props = value;
                    ModalElement.close(-1);
                }
                else {
                    mSignUpFrag.onReady = function(){
                        this.props = value;
                        this.onReady = null;
                        ModalElement.close(-1);
                    }
                }
            });
        }
        if (formId === undefined) {
            var typeDict = {};
            var dict2 = {};
            data_module.typelists.items.forEach(function(elt, index){
                typeDict[elt.id] = index;
                dict2[elt.id] = elt;
            });
            var getType = function(index){
                var type = data_module.typelists.items[index].type;
                if (
                    form_module.primitiveTypeList.indexOf(type) != -1
                ){
                    type = data_module.typelists.items[index].type2;
                }
                return type;
            }
            var type = getType(typeDict[typeId]);
            // var datatypePrimitiveList = contentModule.getDatatypePrimitiveList();
            if (type == "array" || type == "structure" || type == "extends_structure"){
                if (data_module.form_config[dict2[typeId].type]) {
                    formId = data_module.form_config[dict2[typeId].type].input_form;
                }
                else {
                    for(var i = 0; i < data_module.input_forms.items.length; i++){
                        if (data_module.input_forms.items[i].typeid == typeId){
                            formId = data_module.input_forms.items[i].id;
                            break;
                        }
                    }
                }
                callbackfunc();
            }
            else {
                var t;
                if (type == "enum" || type == "extends_enum" || type == "enum_multi" || type == "extends_enum_multi"){
                    t = hr.systemFunctions.makePrimitiveForm[type](typeId, initValue);
                }
                else t = hr.systemFunctions.makePrimitiveForm[type](initValue);
                DOMElement.removeAllChildren(formContainer);
                formContainer.appendChild(t);
                formContainer.getValue = t.getValue;
            }
            // FormClass.api_call({
            //     url: "database_load.php",
            //     params: [{name: "task", value: "load_form_config"}],
            //     func: function(success, message) {
            //         if (success) {
            //             if (message.substr(0, 2) == "ok"){
            //                 var x = {
            //                     database: {
            //                         form_config: {items: EncodingClass.string.toVariable(message.substr(2))}
            //                     }
            //                 };
            //                 var typeDict = {};
            //                 var dict2 = {};
            //                 data_module.typelists.items.forEach(function(elt, index){
            //                     typeDict[elt.id] = index;
            //                     dict2[elt.id] = elt;
            //                 });
            //                 var getType = function(index){
            //                     var type = data_module.typelists.items[index].type;
            //                     if (
            //                         form_module.primitiveTypeList.indexOf(type) != -1
            //                     ){
            //                         type = data_module.typelists.items[index].type2;
            //                     }
            //                     return type;
            //                 }
            //                 var type = getType(typeDict[typeId]);
            //                 var form_config = contentModule.configVariable(x);
            //                 // var datatypePrimitiveList = contentModule.getDatatypePrimitiveList();
            //                 if (type == "array" || type == "structure" || type == "extends_structure"){
            //                     if (form_config[dict2[typeId].type]) {
            //                         formId = form_config[dict2[typeId].type].input_form;
            //                     }
            //                     else {
            //                         for(var i = 0; i < data_module.input_forms.items.length; i++){
            //                             if (data_module.input_forms.items[i].typeid == typeId){
            //                                 formId = data_module.input_forms.items[i].id;
            //                                 break;
            //                             }
            //                         }
            //                     }
            //
            //                     callbackfunc();
            //                 }
            //                 else {
            //                     var t;
            //                     if (type == "enum" || type == "extends_enum" || type == "enum_multi" || type == "extends_enum_multi"){
            //                         t = hr.systemFunctions.makePrimitiveForm[type](typeId, initValue);
            //                     }
            //                     else t = hr.systemFunctions.makePrimitiveForm[type](initValue);
            //                     DOMElement.removeAllChildren(formContainer);
            //                     formContainer.appendChild(t);
            //                     formContainer.getValue = t.getValue;
            //                 }
            //             }
            //         }
            //     }
            // })
        }

        // callbackfunc();
    })
};





/****
 * hàm gọi form trong modal
 * @param {Array<{formId:number|string, typeId: number|string, initValue: any, displayName: string}>} formParamsArray
 * @param {boolean=}cancelable - mặc định là false, nếu cancelable= true, thì mới có nút cancel
 * @returns {Promise<Array<any>>} hàm resolve về mảng kết quả của form trong promise sau khi người ta nhấn ok, nếu nhấn cancel, resolve null
 */
hr.systemFunctions.openInputFormArray = function (formParamsArray, cancelable) {
    ModalElement.show_loading();
    // ModalElement.close = function(){
    //     console.trace();
    // }
    return new Promise(function(rs, rj){
        var getConfig = function(){
            return new Promise(function(ok, cancel){
                FormClass.api_call({
                    url: "database_load.php",
                    params: [{name: "task", value: "load_form_config"}],
                    func: function(success, message) {
                        if (success) {
                            if (message.substr(0, 2) == "ok"){
                                var x = {
                                    database: {
                                        form_config: {items: EncodingClass.string.toVariable(message.substr(2))}
                                    }
                                };
                                var form_config = contentModule.configVariable(x);

                                ok(form_config);
                            }
                        }
                    }
                })
            })
        };
        getConfig().then(function(form_config){
            var run = function(){
                if (data_module.pendingData.status == "error"){
                    ModalElement.alert("Có lỗi trong quá trình khởi tạo dữ liệu");
                    return;
                }
                else if (data_module.pendingData.status == "pending") {
                    setTimeout(function(){
                        run();
                    }, 500);
                    return;
                }
                var typeDict = {};
                var dict = {};
                var getType = function(index){
                    var type = data_module.typelists.items[index].type;
                    if (
                        form_module.primitiveTypeList.indexOf(type) != -1
                    ){
                        type = data_module.typelists.items[index].type2;
                    }
                    return type;
                }
                var typelists = data_module.typelists.items;
                typelists.forEach(function (elt, index) {
                    typeDict[elt.id] = index;
                    dict[elt.id] = elt;
                });
                var callbackfunc = function(typeId, formId, initValue){
                    return new Promise(function(rs, rj) {
                        var AssemblerInstance = absol.form.AssemblerInstance;
                        var $ = absol.$;
                        var _ = absol._;
                        var JSZip = absol.JSZip;
                        var makeFmFragmentClass = absol.form.makeFmFragmentClass;
                        var mSignUpFrag = AssemblerInstance.buildFragment({class: formId.toString()});
                        mSignUpFrag.setContext("SHARE_PARAMS", {});
                        // if (!mSignUpFrag.domElt.hasClass("as-relative-layout")){
                        //     mSignUpFrag.domElt.addStyle({
                        //         width: '100%',
                        //         height:'100%',
                        //         display: 'block'
                        //     });
                        // }
                        var x = mSignUpFrag.domElt;
                        x.getValue = function(alert_value){
                            return contentModule.getValueOfUserForm(mSignUpFrag, typeId, typelists);
                        }
                        if (!initValue) initValue = {};
                        contentModule.setValueOfUserForm({
                            typelists: typelists,
                            valueContent: initValue,
                            typeid: typeId
                        }).then(function(value){
                            if (mSignUpFrag.state === "RUNNING"){
                                mSignUpFrag.props = value;
                            }
                            else {
                                mSignUpFrag.onReady = function(){
                                    this.props = value;
                                    this.onReady = null;
                                }
                            }
                            rs (x);
                        });
                    })
                }

                var promiseArray = [];
                var cbbItems = formParamsArray.forEach(function(elt, idx){
                    if (!elt.formId) {
                        var type = getType(typeDict[elt.typeId]);
                        // var datatypePrimitiveList = contentModule.getDatatypePrimitiveList();
                        if (type == "array" || type == "structure" || type == "extends_structure"){
                            if (form_config[dict[elt.typeId].type]) {
                                elt.formId = form_config[dict[elt.typeId].type].input_form;
                            }
                            else {
                                for(var i = 0; i < data_module.input_forms.items.length; i++){
                                    if (data_module.input_forms.items[i].typeid == elt.typeId){
                                        elt.formId = data_module.input_forms.items[i].id;
                                        break;
                                    }
                                }
                            }
                            promiseArray.push(callbackfunc(elt.typeId, elt.formId, elt.initValue));
                        }
                        else {
                            var t;
                            if (type == "enum" || type == "extends_enum" || type == "enum_multi" || type == "extends_enum_multi"){
                                t = hr.systemFunctions.makePrimitiveForm[type](elt.typeId, elt.initValue);
                            }
                            else t = hr.systemFunctions.makePrimitiveForm[type](elt.initValue);
                            promiseArray.push(Promise.resolve(t));
                            // DOMElement.removeAllChildren(formContainer);
                            // formContainer.appendChild(t);
                            // formContainer.getValue = t.getValue;
                        }
                    }
                    else promiseArray.push(callbackfunc(elt.typeId, elt.formId, elt.initValue));
                    // return {value: idx, text: elt.displayName};
                });
                Promise.all(promiseArray).then(function(formArray){
                    // ModalElement.close(-1);
                    var data = [];
                    formParamsArray.forEach((item, i) => {
                        if (data.length > 0) {
                            data.push([
                                {
                                    attrs: {
                                        colSpan: 3,
                                        style: {
                                            paddingTop: "10px",
                                            paddingBottom: "10px"
                                        }
                                    },
                                    children: [absol._({
                                        style: {
                                            height: "1px",
                                            border: "1px solid grey"
                                        }
                                    })]
                                }
                            ]);
                        }
                        data.push([
                            {
                                text: item.displayName
                            },
                            {attrs: {style: {width: "20px"}}},
                            {
                                children: [formArray[i]]
                            }
                        ])
                    });

                    var syncArray = formArray.map(function(cur){
                        if (cur.fmComponent) return cur.fmComponent.fragment.afterEntryCompleted();
                        else if (cur.dataSync) return cur.dataSync;
                    });

                    var formContainer = absol._({
                        child: DOMElement.table({
                            data: data
                        })
                        // child: formArray[0]
                    });
                    var buttonlist = [
                        {
                            text: LanguageModule.text("txt_ok"),
                            onclick: function(){
                                var value = [];
                                for (var i = 0; i < formArray.length; i++){
                                    var t = formArray[i].getValue();
                                    if (t !== undefined) value.push(t);
                                    else {
                                        rj();
                                        return;
                                    }
                                }
                                rs(value);
                                ModalElement.close();
                            }
                        }
                    ];
                    if (cancelable) buttonlist.push({
                        text: LanguageModule.text("txt_cancel"),
                        onclick: function(){
                            ModalElement.close();
                            rj("close");
                        }
                    });
                    Promise.all(syncArray).then(function(){
                        ModalElement.close(-1);
                        ModalElement.showWindow({
                            title: "Input",
                            bodycontent: absol._({
                                child: [
                                    formContainer
                                ]
                            }),
                            buttonlist: buttonlist
                        });
                    });
                });
            }
            run();
        })
    });
};

hr.systemFunctions.makePrimitiveForm = {};

hr.systemFunctions.makePrimitiveForm.files = function(value){
    var element = absol._({
        tag: "filelistinput",
        props: {
            files: value ? value : []
        }
    });
    element.getValue = function(){
        return element.files;
    };
    return element;
};

hr.systemFunctions.makePrimitiveForm.nation_city = function(value){
    var element = absol._({
        tag: "dualselectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = Promise.all([
        data_module.loadNationsList(),
        data_module.loadCitiesList()
    ]).then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {nations: rs[0], cities: rs[1]});
        contentModule.makeCitiesIndex(host);
        var items = contentModule.getNationCityDualSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.position_list = function(value){
    var element = absol._({
        tag: "multichecktreeleafmenu",
        props: {
            values: value,
            leafOnly: true
        }
    });
    element.getValue = function(){
        return element.values;
    };
    // ModalElement.show_loading();
    element.dataSync = Promise.all([
        data_module.loadOrgsList(),
        data_module.loadPositionsList()
    ]).then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {orgs: rs[0], positions: rs[1]});
        contentModule.makeOrgsIndex(host);
        contentModule.makePositionsIndex(host);
        var items = contentModule.getMemberOfPositionSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.employee_list = function(value){
    var element = absol._({
        tag: "multichecktreemenu",
        props: {
            values: value,
            leafOnly: true,
            enableSearch: true
        }
    });
    element.getValue = function(){
        return element.values;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadEmployeeItemsPrivView().then(function(host){
        var items = contentModule.getMemberOfEmployeeSelectMenu(host);
        items.splice(0, 1);
        element.items = items;

        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.string = function(value){
    var element = absol._({
        tag: "input",
        class: "cardsimpleInput",
        style: {
            width: "400px"
        },
        props: {
            type: "text",
            value: value ? value : ""
        }
    });
    element.getValue = function(){
        var value = element.value.trim();
        if (value == "") {
            ModalElement.alert({
                message: "Chưa nhập đủ dữ liệu",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return value;
    };
    return element;
};

hr.systemFunctions.makePrimitiveForm.phonenumber = hr.systemFunctions.makePrimitiveForm.string;
hr.systemFunctions.makePrimitiveForm.website = hr.systemFunctions.makePrimitiveForm.string;

hr.systemFunctions.makePrimitiveForm.gps = function(value){
    var element = absol._({
        tag: "locationinput",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        var value = element.value.trim();
        if (value == "") {
            ModalElement.alert({
                message: "Chưa nhập đủ dữ liệu",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return value;
    };
    return element;
};

hr.systemFunctions.makePrimitiveForm.note = function(value){
    var element = absol._({
        tag: "textarea",
        class: "cardsimpleTextarea",
        style: {
            height: "100px",
            width: "400px"
        },
        props: {
            value: value ? value : ""
        }
    });
    element.getValue = function(){
        var value = element.value.trim();
        if (value == "") {
            ModalElement.alert({
                message: "Chưa nhập đủ dữ liệu",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return value;
    };
    return element;
};
hr.systemFunctions.makePrimitiveForm.html = hr.systemFunctions.makePrimitiveForm.string;
hr.systemFunctions.makePrimitiveForm.email_address = hr.systemFunctions.makePrimitiveForm.string;

hr.systemFunctions.makePrimitiveForm.time = function(value){
    var element = absol._({
        tag: "timeinput",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (!element.value) {
            ModalElement.alert({
                message: "Chưa nhập đủ dữ liệu",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    return element;
};

hr.systemFunctions.makePrimitiveForm.boolean = function(value){
    var element = absol._({
        tag: "checkbox",
        props: {
            checked: value
        }
    });
    element.getValue = function(){
        return element.checked;
    };
    return element;
};

hr.systemFunctions.makePrimitiveForm.date = function(value){
    var element = absol._({
        tag: "dateinput",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (!element.value) {
            ModalElement.alert({
                message: "Chưa nhập đủ dữ liệu",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    return element;
};

hr.systemFunctions.makePrimitiveForm.datetime = function(value){
    var element = absol._({
        tag: "datetimeinput",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (!element.value) {
            ModalElement.alert({
                message: "Chưa nhập đủ dữ liệu",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    return element;
};

hr.systemFunctions.makePrimitiveForm.number = function(value){
    var element = absol._({
        tag: "numberinput",
        style: {
            width: "400px"
        },
        props: {
            value: value
        }
    });
    element.getValue = function(){
        return element.value;
    };
    return element;
};

hr.systemFunctions.makePrimitiveForm.currency = hr.systemFunctions.makePrimitiveForm.number;

hr.systemFunctions.makePrimitiveForm.hour_period = function(value){
    var element = absol._({
        tag: "timerange24input",
        props: {
            dayOffset: 0,
            duration: 0
        }
    });
    element.getValue = function(){
        return {
            dayOffset: element.dayOffset,
            duration: element.duration
        };
    };
    return element;
};

hr.systemFunctions.makePrimitiveForm.userlist = function(value){
    var element = absol._({
        tag: "multiselectmenu",
        props: {
            values: value
        }
    });
    element.getValue = function(){
        return element.values;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadUsersList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {users: rs});
        var items = contentModule.getUsersListSelectMenu(host);
        items.splice(0, 1);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.members_of_shifts = function(value){
    var element = absol._({
        tag: "multiselectmenu",
        props: {
            values: value
        }
    });
    element.getValue = function(){
        return element.values;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadShiftsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {shifts: rs});
        var items = contentModule.getShiftsListSelectBox(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.members_of_partner_class = function(value){
    var element = absol._({
        tag: "multiselectmenu",
        props: {
            values: value
        }
    });
    element.getValue = function(){
        return element.values;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadPartner_classList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {partner_class: rs});
        var items = contentModule.getPartnerClassListSelectBox(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.members_of_locations = function(value){
    var element = absol._({
        tag: "multiselectmenu",
        props: {
            values: value
        }
    });
    element.getValue = function(){
        return element.values;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadGeographiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {geopos: rs});
        var items = contentModule.getGeoposListSelectBox(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.select_department_employee = function(value){
    var element = absol._({
        tag: "multichecktreemenu",
        props: {
            values: value
        }
    });
    element.getValue = function(){
        return element.values;
    };
    // ModalElement.show_loading();
    element.dataSync = Promise.all([data_module.loadOrgsList(), data_module.loadEmployeesList(), data_module.loadPeoplesList()]).then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {orgs: rs[0], employees: rs[1], peoples: rs[2]});
        var pDict = {};
        host.database.peoples.items.forEach(function(elt){
            pDict[elt.id] = elt;
        });
        host.database.employees.items.forEach(function(elt){
            elt.fullname = pDict[elt.peopleid].fullname;
        });
        contentModule.makeOrgsIndex(host);
        contentModule.makeEmployeesIndex(host);
        var items = contentModule.getOrgsAndEmployeesListSelectTreeMenu(host);
        items.splice(0, 1);
        element.items = items;
        console.log(Date.now(), "load data");
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_position = function(value){
    var element = absol._({
        tag: "selecttreeleafmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = Promise.all([
        data_module.loadOrgsList(),
        data_module.loadPositionsList()
    ]).then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {orgs: rs[0], positions: rs[1]});
        contentModule.makeOrgsIndex(host);
        contentModule.makePositionsIndex(host);
        var items = contentModule.getMemberOfPositionSelectMenu(host);
        items.unshift({text: LanguageModule.text("txt_select_value"), value: 0});
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.user = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadUsersList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {users: rs});
        var items = contentModule.getUsersListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_worktime_machines = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadWorktimeMachinesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {worktime_machines: rs});
        var items = contentModule.getWorktime_machinesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_position_2 = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadPositions2List().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {positions: rs});
        var items = contentModule.getPositionsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.geopos = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadGeographiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {geopos: rs});
        var items = contentModule.getGeoposListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_department = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadOrgsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {orgs: rs});
        contentModule.makeOrgsIndex(host);
        var items = contentModule.getOrgsListSelectTreeMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_employee = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadEmployeeItemsPrivView().then(function(host){
        var items = contentModule.getMemberOfEmployeeSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_template_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadTemplateGroupList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {template_groups: rs});
        var items = contentModule.getMemberOfTemplateGroupSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_template_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadWelcomeTemplatesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {welcome_templates: rs});
        var items = contentModule.getMemberOfWelcomeTemplateSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_assets = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadAssetsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {assets: rs});
        var items = contentModule.getAssetsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_instruments_and_tools = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadInstruments_and_toolsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {instruments_and_tools: rs});
        var items = contentModule.getInstrumentAndToolsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_assets_instruments_and_tools = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    var host = {database: {}};
    element.dataSync = Promise.all([data_module.loadAssetsList(), data_module.loadInstruments_and_toolsList()]).then(function(content){
        contentModule.makeDatabaseContent(host, {assets: content[0], instruments_and_tools: content[1]});
        var items = contentModule.getAssetsInstrumentAndToolsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    });
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_warehouses = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadWarehousesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {warehouses: rs});
        var items = contentModule.getWarehousesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_allowance_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadAllowance_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {allowance_policy_groups: rs});
        var items = contentModule.getAllowancePolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_bonus_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadBonus_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {bonus_policy_groups: rs});
        var items = contentModule.getBonusPolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_piece_wage_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadPiece_wage_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {piece_wage_policy_groups: rs});
        var items = contentModule.getPieceWagePolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_attendance_clock_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadAttendance_clock_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {attendance_clock_policy_groups: rs});
        var items = contentModule.getAttendanceClockPolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_standard_workday_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadStandard_workday_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {standard_workday_policy_groups: rs});
        var items = contentModule.getStandardWorkdayPolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_work_flow_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadWork_flow_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {work_flow_groups: rs});
        var items = contentModule.getWorkFlowGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_work_flows = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadWork_flowsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {work_flows: rs});
        var items = contentModule.getWorkFlowsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_payroll_cycle = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadPayrollCycleList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {payroll_cycle: rs});
        var items = contentModule.getPayrollCycleListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_objects = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadObjectsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {objects: rs});
        var items = contentModule.getObjectsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_lesson_categories = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadLesson_categoriesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {lesson_categories: rs});
        var items = contentModule.getLessonCategoriesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_task = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadType_listsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {typelists: rs});
        var items = contentModule.getTypeListsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_input_forms = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    var items = contentModule.getMobileInputFormsListSelectMenu();
    element.items = items;
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_output_forms = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    var items = contentModule.getOutputFormsListSelectMenu();
    element.items = items;
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_mobile_input_forms = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    var items = contentModule.getMobileInputFormsListSelectMenu();
    element.items = items;
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_mobile_input_forms = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    var items = contentModule.getMobileInputFormsListSelectMenu();
    element.items = items;
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_partner_class = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadPartner_classList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {partner_class: rs});
        var items = contentModule.getPartnerClassListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_partner = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadPartnerList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {partner: rs});
        var items = contentModule.getPartnerListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_contact = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadContactList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {contact: rs});
        var items = contentModule.getContactListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_trade_union_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadTrade_union_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {trade_union_policy_groups: rs});
        var items = contentModule.getTradeUnionPolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_overtime_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadOvertime_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {overtime_policy_groups: rs});
        var items = contentModule.getOvertimePolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_offboarding_types = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadOffboardingTypeList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {overtime_policy_groups: rs});
        var items = contentModule.getOffboardingTypeListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_offboarding_reasons = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadOffboardingReasonList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {overtime_policy_groups: rs});
        var items = contentModule.getOffboardingReasonListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_offboarding_reasons = function(value){
    var element = absol._({
        tag: "multiselectmenu",
        props: {
            values: value
        }
    });
    element.getValue = function(){
        return element.values;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadOffboardingReasonList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {overtime_policy_groups: rs});
        var items = contentModule.getOffboardingReasonListSelectMenu(host);
        items.splice(0, 1);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_other_liability_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadOther_liability_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {other_liability_policy_groups: rs});
        var items = contentModule.getOtherLiabilityPolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_other_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadOther_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {other_policy_groups: rs});
        var items = contentModule.getOtherPolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadPoliciesData().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, rs);
        var items = contentModule.getPoliciesSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_salary_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadSalary_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {salary_policy_groups: rs});
        var items = contentModule.getSalaryPolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_punishment_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadPunishment_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {punishment_policy_groups: rs});
        var items = contentModule.getPunishmentPolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_asset_category = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadAssetCategoryList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {asset_category: rs});
        var items = contentModule.getAssetCategoryListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_instruments_and_tools_category = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadInstrumentsAndToolsCategoryList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {instruments_and_tools_category: rs});
        var items = contentModule.getAssetsInstrumentAndToolsCategoryListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_projects = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadProjectsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {projects: rs});
        var items = contentModule.getProjectsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_tax_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadTax_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {tax_policy_groups: rs});
        var items = contentModule.getTaxPolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_advance_payment_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadAdvance_payment_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {advance_payment_policy_groups: rs});
        var items = contentModule.getAdvancePaymentPolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_late_early_checkin_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadLate_early_checkin_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {late_early_checkin_policy_groups: rs});
        var items = contentModule.getLateEarlyCheckinPolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_benefit_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadBenefit_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {benefit_policy_groups: rs});
        var items = contentModule.getBenefitPolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_leave_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadLeave_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {leave_policy_groups: rs});
        var items = contentModule.getLeavePolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_insurance_policy_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadInsurance_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {insurance_policy_groups: rs});
        var items = contentModule.getInsurancePolicyGroupsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_shifts = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadShiftsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {shifts: rs});
        var items = contentModule.getShiftsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_timesheets = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadTimesheetsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {timesheet: rs});
        var items = contentModule.getTimesheetsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_pay_percentage = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadPayPercentageList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {pay_percentage: rs});
        var items = contentModule.getPayPercentageListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_insurance_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadInsurance_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {insurance_policies: rs});
        var items = contentModule.getInsurancePoliciesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_tax_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadTax_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {tax_policies: rs});
        var items = contentModule.getTaxPoliciesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_trade_union_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadTrade_union_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {trade_union_policies: rs});
        var items = contentModule.getTradeUnionPoliciesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_leave_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadLeave_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {leave_policies: rs});
        var items = contentModule.getLeavePoliciesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_benefit_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadBenefit_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {benefit_policies: rs});
        var items = contentModule.getBenefitPoliciesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_allowance_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadAllowance_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {allowance_policies: rs});
        var items = contentModule.getAllowancePoliciesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_bonus_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadBonus_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {bonus_policies: rs});
        var items = contentModule.getBonusPoliciesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_standard_workday_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadStandard_workday_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {standard_workday_policies: rs});
        var items = contentModule.getStandardWorkdayPoliciesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_overtime_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadOvertime_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {overtime_policies: rs});
        var items = contentModule.getOvertimePoliciesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_punishment_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadPunishment_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {punishment_policies: rs});
        var items = contentModule.getPunishmentPoliciesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_advance_payment_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadAdvance_payment_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {advance_payment_policies: rs});
        var items = contentModule.getAdvancePaymentPoliciesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_late_early_checkin_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadLate_early_checkin_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {late_early_checkin_policies: rs});
        var items = contentModule.getLateEarlyCheckinPoliciesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_salary_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadSalary_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {salary_policies: rs});
        var items = contentModule.getSalaryPoliciesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_other_liability_policies = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadOther_liability_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {other_liability_policies: rs});
        var items = contentModule.getOtherLiabilityPoliciesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_employment_contract_types = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadEmployment_contract_typesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {employment_contract_types: rs});
        var items = contentModule.getEmploymentContractTypesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_nations = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadNationsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {nations: rs});
        var items = contentModule.getNationsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_cities = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadCitiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {cities: rs});
        var items = contentModule.getCitiesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_ethnics = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadEthnicsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {ethnics: rs});
        var items = contentModule.getEthnicsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_religions = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadReligionsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {religions: rs});
        var items = contentModule.getReligionsListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_document_types = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadDocument_typesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {document_types: rs});
        var items = contentModule.getDocumentTypesListSelectMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_document_groups = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadDocument_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {document_groups: rs});
        var items = contentModule.getDocumentGroupsListSelectTreeMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};


hr.systemFunctions.makePrimitiveForm.member_of_document_folders = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadDocument_foldersList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {document_folders: rs});
        var items = contentModule.getDocumentFoldersListSelectTreeMenu(host);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.member_of_orgs = function(value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadOrgCompanysList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {orgs: rs});
        var items = contentModule.getOrgsListSelectMenu(host);
        items.splice(0, 1);
        element.items = items;
        // ModalElement.close(-1);
    }, function(rj){console.log(rj);});
    return element;
};

hr.systemFunctions.makePrimitiveForm.enum = function(t_id, value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        var details = data_module.typelists.items[data_module.typelists.getIndex(t_id)].content.details;
        for (var i = 0; i < details.length; i++) {
            if (details[i].localid == element.value) {
                return details[i].key;
            }
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = Promise.all([
        data_module.loadLeave_policy_groupsList(),
        data_module.loadEmployment_contract_typesList()
    ]).then(function(values){
        var host = {
            database: {}
        };
        contentModule.makeDatabaseContent(host, {leave_policy_groups: values[0], employment_contract_types: values[1]});
        var typeDict = {};
        data_module.typelists.items.forEach(function (elt, index) {
            typeDict[elt.id] = elt;
        });
        var type = typeDict[t_id].type;
        var items;
        switch (type) {
            case 'language':
                items = contentModule.getLanguageListSelectMenu(task);
                break;
            case 'member_of_leave_policy_groups':
                items = contentModule.getLeavePolicyGroupsListSelectMenu(host, task);
                break;
            case 'member_of_employment_contract_types':
                items = contentModule.getEmploymentContractTypesListSelectMenu(host, task);
                break;
            default:
                var content = typeDict[t_id].content;
                var lists = content.details.map(function(elt){
                    if (value == elt.key) element.value = elt.localid;
                    return {
                        text: elt.text,
                        value: elt.localid
                    };
                });
                lists.unshift({text: LanguageModule.text("txt_select_value"), value: 0});
                items = lists;
        }
        element.items = items;
        // ModalElement.close(-1);
    });
    return element;
};

hr.systemFunctions.makePrimitiveForm.extends_enum = function(t_id, value){
    var element = absol._({
        tag: "selectmenu",
        props: {
            value: value
        }
    });
    element.getValue = function(){
        if (element.value == 0) {
            ModalElement.alert({
                message: "Chưa chọn giá trị",
                func: function(){
                    element.focus();
                }
            });
            return;
        }
        return element.value;
    };
    // ModalElement.show_loading();
    element.dataSync = Promise.all([
        data_module.loadLeave_policy_groupsList(),
        data_module.loadEmployment_contract_typesList()
    ]).then(function(values){
        var host = {
            database: {}
        };
        contentModule.makeDatabaseContent(host, {leave_policy_groups: values[0], employment_contract_types: values[1]});
        var typeDict = {};
        data_module.typelists.items.forEach(function (elt, index) {
            typeDict[elt.id] = elt;
        });
        var type = typeDict[t_id].type;
        var items;
        switch (type) {
            case 'language':
                items = contentModule.getLanguageListSelectMenu(task);
                break;
            case 'member_of_leave_policy_groups':
                items = contentModule.getLeavePolicyGroupsListSelectMenu(host, task);
                break;
            case 'member_of_employment_contract_types':
                items = contentModule.getEmploymentContractTypesListSelectMenu(host, task);
                break;
            default:
                var content = typeDict[t_id].content;
                var lists = content.details.map(function(elt){
                    if (value == elt.key) element.value = elt.localid;
                    return {
                        text: elt.text,
                        value: elt.localid
                    };
                });
                lists.unshift({text: LanguageModule.text("txt_select_value"), value: 0});
                items = lists;
        }
        element.items = items;
        // ModalElement.close(-1);
    });
    return element;
};

hr.systemFunctions.makePrimitiveForm.enum_multi = function(t_id, value){
    var element = absol._({
        tag: "multiselectmenu",
        props: {
            values: value
        }
    });
    element.getValue = function(){
        return element.values;
    };
    // ModalElement.show_loading();
    element.dataSync = Promise.all([
        data_module.loadLeave_policy_groupsList(),
        data_module.loadEmployment_contract_typesList()
    ]).then(function(values){
        var host = {
            database: {}
        };
        contentModule.makeDatabaseContent(host, {leave_policy_groups: values[0], employment_contract_types: values[1]});
        var typeDict = {};
        data_module.typelists.items.forEach(function (elt, index) {
            typeDict[elt.id] = elt;
        });
        var type = typeDict[t_id].type;
        var items;
        switch (type) {
            case 'language':
                items = contentModule.getLanguageListSelectMenu(task);
                break;
            case 'member_of_leave_policy_groups':
                items = contentModule.getLeavePolicyGroupsListSelectMenu(host, task);
                break;
            case 'member_of_employment_contract_types':
                items = contentModule.getEmploymentContractTypesListSelectMenu(host, task);
                break;
            default:
                var content = typeDict[t_id].content;
                var lists = content.details.map(function(elt){
                    var t_idx = value.indexOf(elt.key)
                    if (t_idx) {
                        value[t_idx] = elt.localid;
                    }
                    return {
                        text: elt.text,
                        value: elt.localid
                    };
                });
                element.values = value;
                lists.unshift({text: LanguageModule.text("txt_select_value"), value: 0});
                items = lists;
        }
        items.splice(0, 1);
        element.items = items;
        // ModalElement.close(-1);
    });
    return element;
};

hr.systemFunctions.makePrimitiveForm.extends_enum_multi = function(t_id, value){
    var element = absol._({
        tag: "multiselectmenu",
        props: {
            values: value
        }
    });
    element.getValue = function(){
        return element.values;
    };
    // ModalElement.show_loading();
    element.dataSync = data_module.loadTypeList().then(function(typelists){
        var host = {
            database: {}
        };
        contentModule.makeDatabaseContent(host, {typelists: typelists});
        var typeDict = {};
        host.database.typelists.items.forEach(function (elt, index) {
            contentModule.makeDataTypeDecode(elt);
            typeDict[elt.id] = elt;
        });
        var t_id = typeDict[typeid].content.typeof;
        var content = typeDict[typeid].content.details;
        while (typeDict[t_id].type == "extends_enum_multi"){
            content = typeDict[t_id].content.details.concat(content)
            t_id = typeDict[t_id].content.typeof;
        }
        var type = typeDict[t_id].type;
        var lists;
        switch (type) {
            case 'language':
                lists = contentModule.getLanguageListSelectMenu();
                break;
            default:
                lists = typeDict[t_id].content.details.map(function(elt){
                    var t_idx = value.indexOf(elt.key)
                    if (t_idx) {
                        value[t_idx] = elt.localid;
                    }
                    return {
                        text: elt.text,
                        value: elt.localid
                    };
                });
                lists.unshift({text: LanguageModule.text("txt_select_value"), value: 0});
        }
        content.forEach(function(elt){
            var t_idx = value.indexOf(elt.key)
            if (t_idx) {
                value[t_idx] = elt.localid;
            }
            lists.push({
                text: elt.text,
                value: elt.localid
            });
        });
        lists.splice(0, 1);
        element.values = value;
        element.items = lists;
        // ModalElement.close(-1);
    });
    return element;
};

contentModule.splitRange = function(target, operate){//target chia operate
    var remain = [], union = [];
    if (operate.end <= target.start || operate.start >= target.end){
        remain = [{
            start: target.start,
            end: target.end
        }];
    }
    else if (operate.start < target.end){
        if (operate.end < target.end){
            if (operate.start > target.start){
                union = [{
                    start: operate.start,
                    end: operate.end
                }];
                remain = [{
                    start: target.start,
                    end: operate.start
                }];
            }
            else {
                union = [{
                    start: target.start,
                    end: operate.end
                }];
            }
            remain.push({
                start: operate.end,
                end: target.end
            });
        }
        else {
            if (operate.start > target.start){
                union = [{
                    start: operate.start,
                    end: target.end
                }];
                remain = [{
                    start: target.start,
                    end: operate.start
                }];
            }
            else {
                union = [{
                    start: target.start,
                    end: target.end
                }];
            }
        }
    }
    else if (operate.end < target.start){
        if (target.end > operate.end){
            remain = [
                {
                    start: operate.end,
                    end: target.end
                }
            ];
            union = [{
                start: target.start,
                end: operate.end
            }];
        }
        else {
            union = [{
                start: target.start,
                end: target.end
            }];
        }
    }
    return {
        union: union,
        remain: remain
    };
};

contentModule.getPositionGroupsSystem = function() {
    return [
        {id: -1, code: "staff", name: LanguageModule.text("txt_staff")},
        {id: -2, code: "manager", name: LanguageModule.text("txt_manager")}
    ];
}

contentModule.getDetailsSystemOfMemberOf = function(type){
    var tablename = type.substr("member_of_".length);
    var host = {database: {}};
    var st = {};
    st[tablename] = [];
    contentModule.makeDatabaseContent(host, st);
    var details = [];
    host.database[tablename].items.forEach(function(item){
        details.push({
            value: item.id,
            key: item.id,
            localid: item.id + "",
            text: item.name
        });
    });
    return details;
};

VaKeR 2022