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/tech_preview/hr/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //var/www/html/tech_preview/hr/form_module.js
var form_module = {};

// Hàm vẽ form default khi tạo form mới

form_module.formVersion = 2;

form_module.generateDefaultOutputForm = function(host, typeid, items){
    var data, type, t_id;

    type = host.typeDict[typeid].type;

    if (form_module.primitiveTypeList.indexOf(type) != -1){
        type = host.typeDict[typeid].type2;
    }

    switch (type) {
        case "string":
        case "phonenumber":
        case "website":
        case "gps":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "number":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id,
                    decimalSeparator: ".",
                    floatFixed: -1,
                    max: Infinity,
                    min: -Infinity,
                    thousandsSeparator: ""
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "currency":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id,
                    decimalSeparator: ".",
                    floatFixed: -1,
                    max: Infinity,
                    min: -Infinity,
                    thousandsSeparator: ""
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "note":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 100,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "date":
        case "datetime":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "time":
            data = {
                tag: "TimeInput",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "hour_period":
            data = {
                tag: "TimeRange24Input",
                attributes: {
                    name: items.localid ? items.localid : items.id,
                    dayOffset: 0,
                    duration: 0
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400,
                    displayHidden: false
                }
            };
            break;
        case "boolean":
            data = {
                tag: "CheckBox",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    left: 5,
                    height: 18,
                    width: 18
                }
            };
            break;
        case "email_address":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "user":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "userlist":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "member_of_nations":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "member_of_cities":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "member_of_ethnics":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "member_of_religions":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "language":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "geopos":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "member_of_department":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "member_of_document_groups":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "member_of_document_folders":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "member_of_position":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "member_of_people":
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid ? items.localid : items.id
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "enum":
            var content = host.typeDict[items.type].content;
            var lists = content.details.map(function(elt){
                return {
                    text: elt.text,
                    value: elt.localid
                };
            });
            lists.unshift({text: LanguageModule.text("txt_select_value"), value: 0});
            data = {
                tag: "Text",
                attributes: {
                    name: items.localid
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "structure":
            var content = items.content;
            data = [];
            for (var j = 0; j < content.details.length; j++){
                var elt = content.details[j];
                var type = host.typeDict[elt.type].type;
                var title, st;
                var rs;
                title = {
                    tag: "Label",
                    attributes: {
                        text: elt.name,
                        dataBinding: false
                    },
                    style: {
                        height: 30,
                        width: 200,
                        boxAlign: "leftcenter"
                    }
                };
                if (form_module.requireFormType.indexOf(type) != -1){
                    for (var i = 0; i < host.database.input_forms.items.length; i++) {
                        if (host.database.input_forms.items[i].typeid == elt.type){
                            rs = host.database.input_forms.items[i];
                            break;
                        }
                    }
                    if (!rs){
                        ModalElement.alert({message: "Chưa vẽ form cho kiểu dữ liệu " + host.typeDict[elt.type].name});
                        return false;
                    }
                    else {
                        st = {
                            tag: "LinearLayout",
                            attributes: {
                                name: elt.localid
                            },
                            children: [
                                {
                                    class: rs.id + "",
                                    attributes: {
                                        name: elt.localid
                                    }
                                }
                            ],
                            style: {
                                height: 30,
                                width: "auto",
                                left: 5
                            }
                        };
                        data.push({
                            tag: "ChainLayout",
                            style: {
                                height: 30,
                                width: "auto",
                                overflowY: "visible",
                                left: 20,
                                top: 10
                            },
                            children: [
                                title, st
                            ]
                        });
                    }
                }
                else {
                    st = form_module.generateDefaultOutputForm(host, elt.type, elt);
                    data.push({
                        tag: "ChainLayout",
                        style: {
                            height: 30,
                            width: "auto",
                            overflowY: "visible",
                            left: 20,
                            top: 10
                        },
                        children: [
                            title, st
                        ]
                    });
                }
            }
            break;
        case "extends_structure":
            t_id = items.content.typeof;
            var content = {
                details: host.typeDict[t_id].content.details.concat(items.content.details)
            };
            while (host.typeDict[t_id].type == "extends_structure"){
                t_id = host.typeDict[t_id].content.typeof;
                content.details = host.typeDict[t_id].content.details.concat(content.details)
            }
            data = [];
            for (var j = 0; j < content.details.length; j++){
                var elt = content.details[j];
                var type = host.typeDict[elt.type].type;
                var title, st;
                var rs;
                title = {
                    tag: "Label",
                    attributes: {
                        text: elt.name,
                        dataBinding: false
                    },
                    style: {
                        height: 30,
                        width: 200,
                        boxAlign: "leftcenter"
                    }
                };
                if (form_module.requireFormType.indexOf(type) != -1){
                    for (var i = 0; i < host.database.input_forms.items.length; i++){
                        if (host.database.input_forms.items[i].typeid == elt.type){
                            rs = host.database.input_forms.items[i];
                            break;
                        }
                    }
                    if (!rs){
                        ModalElement.alert({message: "Chưa vẽ form cho kiểu dữ liệu " + host.typeDict[elt.type].name});
                        return false;
                    }
                    else {
                        st = {
                            tag: "LinearLayout",
                            attributes: {
                                name: elt.localid
                            },
                            children: [
                                {
                                    class: rs.id + "",
                                    attributes: {
                                        name: elt.localid
                                    }
                                }
                            ],
                            style: {
                                height: 30,
                                width: "auto",
                                left: 5
                            }
                        };
                        data.push({
                            tag: "ChainLayout",
                            style: {
                                height: 30,
                                width: "auto",
                                overflowY: "visible",
                                left: 20,
                                top: 10
                            },
                            children: [
                                title, st
                            ]
                        });
                    }
                }
                else {
                    st = form_module.generateDefaultOutputForm(host, elt.type, elt);
                    data.push({
                        tag: "ChainLayout",
                        style: {
                            height: 30,
                            width: "auto",
                            overflowY: "visible",
                            left: 20,
                            top: 10
                        },
                        children: [
                            title, st
                        ]
                    });
                }
            }
            break;
        case "extends_enum":
            t_id = host.typeDict[items.type].content.typeof;
            var content = host.typeDict[items.type].content.details;
            content = host.typeDict[t_id].content.details.concat(content);

            while (host.typeDict[t_id].type == "extends_enum"){
                t_id = host.typeDict[t_id].content.typeof;
                content = host.typeDict[t_id].content.details.concat(content)
            }

            var lists = content.details.map(function(elt){
                return {
                    text: elt.text,
                    value: elt.localid
                };
            });
            lists.unshift({text: LanguageModule.text("txt_select_value"), value: 0});
            data = {
                tag: "ComboBox",
                attributes: {
                    name: items.localid,
                    list: lists,
                    target: items.localid,
                    value: items.default,
                    enableSearch: true
                },
                style: {
                    height: 30,
                    left: 5,
                    width: 400
                }
            };
            break;
        case "array":
            t_id = items.content.typeof;
            // var dataTypeOfArray = contentModule.checkDatatypeOfArray(host.database.typelists.items, t_id);
            // if (dataTypeOfArray == "advanced"){
                if (
                    host.typeDict[t_id].type == "structure"
                    || host.typeDict[t_id].type == "extends_structure"
                    || host.typeDict[t_id].type == "array"
                    || host.typeDict[t_id].type2 == "structure"
                    || host.typeDict[t_id].type2 == "array"
                    || t_id > 0
                ) {
                    var rs;
                    for (var i = 0; i < host.database.input_forms.items.length; i++){
                        if (host.database.input_forms.items[i].typeid == t_id){
                            rs = host.database.input_forms.items[i];
                            break;
                        }
                    }
                    if (!rs){
                        ModalElement.alert({message: "Chưa vẽ form cho kiểu dữ liệu " + host.typeDict[t_id].name});
                        return false;
                    }
                    data = {
                        tag: "EditableArrayOfFragment",
                        attributes: {
                            name: items.id.toString(),
                            itemFragmentClass: "" + rs.id
                        },
                        style: {
                            height: "auto",
                            width: "auto",
                        }
                    };
                }
                else {
                    var st = form_module.generateDefaultOutputForm(host, t_id, host.typeDict[t_id]);
                    constructor = absol.form.makeFmFragmentConstructor({
                        tag: t_id + "_output",
                        contentViewData: st
                    });
                    absol.form.AssemblerInstance.addConstructor(constructor);
                    data = {
                        tag: "EditableArrayOfFragment",
                        attributes: {
                            name: items.id.toString(),
                            itemFragmentClass: t_id + '_output'
                        },
                        style: {
                            height: "auto",
                            width: "auto",
                        }
                    };
                }
            // }
            // else {
            //     data = {
            //         tag: "TableInput",
            //         attributes: {
            //             name: items.id.toString(),
            //             itemFragmentClass: "" + rs.id
            //         },
            //         style: {
            //             height: 30,
            //             width: "auto",
            //             left: 5
            //         },
            //         onCreated: function(){
            //             this.setAttribute("propertyNames", []);
            //             this.setAttribute("propertyDescriptors", {});
            //             var 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);
            //                             }
            //                         }
            //                     });
            //                 }));
            //             };
            //             var handleCmdInsertRow = function (event) {
            //                 event.resolve(new Promise(function (resolve) {
            //                     resolve({});
            //                 }));
            //             };
            //             this.editor.on('cmd_remove_row', handleCmdRemoveRow);
            //             this.editor.on('cmd_insert_row', handleCmdInsertRow);
            //         }
            //     };
            // }
            // break;

        default:

    }

    return data;
};

form_module.generateDefaultLinearInputForm = function(host, typeid, items, baseFormId){
    var data, type, t_id;

    if (typeid == "union"){
        data = form_module.type2inputform[typeid](host, items);
    }
    else {
        type = host.typeDict[typeid].type;
        if (form_module.primitiveTypeList.indexOf(type) != -1){
            type = host.typeDict[typeid].type2;
        }

        data = (form_module.type2inputform[type] || form_module.type2inputform.notSupport)(host, type, items, baseFormId);
        if(data){
            data.attributes = data.attributes ||{};
            data.attributes.inputType = type;
            data.attributes.formVersion = form_module.formVersion;
        }
    }

    return data;
};

form_module.setAttributeOfTreeTableInput = function(t_id, t_name){
    data_module.loadTypeList().then(function(typelists){
        var host = {
            database: {}
        };
        contentModule.makeDatabaseContent(host, {typelists: typelists});
        var dict = {};
        host.database.typelists.items.forEach(function (elt, index) {
            contentModule.makeDataTypeDecode(elt);
            dict[elt.id] = index;
        });
        var getType = function(index){
            var type = host.database.typelists.items[index].type;
            if (form_module.primitiveTypeList.indexOf(type) != -1){
                type = host.database.typelists.items[index].type2;
            }
            return type;
        }
        var type = getType(dict[t_id]);
        var header;
        var self = this;
        form_module.makeHeaderOfTable(host, t_id).then(function(result){
            header = result;
            if (
                type != "structure"
                && type != "extends_structure"
            ) {
                header.descriptions[t_id].text = t_name;
            }
            // TODO:
            var preloadDescriptors = self.attributes.propertyDescriptors.__preloaded__;
            if (preloadDescriptors){
                for (var pName in preloadDescriptors){
                    if(header.descriptions[pName])
                        Object.assign(header.descriptions[pName], preloadDescriptors[pName]);
                }
            }
            console.log("set attributes for treetable");
            self.setAttribute("propertyNames", header.names);
            self.setAttribute("propertyDescriptors", header.descriptions);
            setTimeout(function(){
                 self.attributes.propertyDescriptors.__completeLoad__ = true;
            }, 1500);
        }, function(rj){});
    }.bind(this))
};

form_module.setAttributeOfTableInput = function(t_id, t_name){
    data_module.loadTypeList().then(function(typelists){
        var host = {
            database: {}
        };
        contentModule.makeDatabaseContent(host, {typelists: typelists});
        var dict = {};
        host.database.typelists.items.forEach(function (elt, index) {
            contentModule.makeDataTypeDecode(elt);
            dict[elt.id] = index;
        });
        var getType = function(index){
            var type = host.database.typelists.items[index].type;
            if (form_module.primitiveTypeList.indexOf(type) != -1){
                type = host.database.typelists.items[index].type2;
            }
            return type;
        }
        var type = getType(dict[t_id]);
        var header;
        var self = this;
        form_module.makeHeaderOfTable(host, t_id).then(function(result){
            header = result;
            if (
                type != "structure"
                && type != "extends_structure"
            ) {
                header.descriptions[t_id].text = t_name;
            }
            // TODO:
            var preloadDescriptors = self.attributes.propertyDescriptors.__preloaded__;
            if (preloadDescriptors){
                for (var pName in preloadDescriptors){
                    if(header.descriptions[pName])
                        Object.assign(header.descriptions[pName], preloadDescriptors[pName]);
                }
            }
            self.setAttribute("propertyNames", header.names);
            self.setAttribute("propertyDescriptors", header.descriptions);
            setTimeout(function(){
                 self.attributes.propertyDescriptors.__completeLoad__ = true;
            }, 1500);

            // self.setAttribute("records", []);
            var 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);
                            }
                        }
                    });
                }));
            };
            var handleCmdInsertRow = function (event) {
                event.resolve(new Promise(function (resolve) {
                    resolve({});
                }));
            };
            self.editor.on('cmd_remove_row', handleCmdRemoveRow);
            self.editor.on('cmd_insert_row', handleCmdInsertRow);
        }, function(rj){});
    }.bind(this))
};

// Hàm đổi tên form

form_module.renameForm = function(taskName, id, name){
    return new Promise(function(rs, rj){
        FormClass.api_call({
            url: "input_form_rename.php",
            params: [
                {name: "id", value: id},
                {name: "name", value: name},
                {name: "taskName", value: taskName}
            ],
            func: function(success, message){
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        rs();
                    }
                    else {
                        rj();
                    }
                }
                else rj();
            }
        });
    });
};

// Hàm xóa form

form_module.deleteForm = function(host, id){
    var formContent;
    if (host.taskName == "input" || host.taskName == "m_input") formContent = host.database.input_forms;
    else formContent = host.database.output_forms;
    return new Promise(function(resolve, reject){
        ModalElement.show_loading();
        FormClass.api_call({
            url: 'input_form_delete.php',
            params: [
                {name: "id", value: id},
                {name: "task", value: host.taskName}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success) {
                    if (message.substr(0, 2) == "ok"){
                        formContent.items = formContent.items.filter(function(elt){
                            return elt.id != id;
                        });
                        resolve();
                    }
                    else {
                        reject(message);
                    }
                }
                else {
                    reject(message);
                }
            }
        })
    });
};

// Hàm lưu thêm form mới

form_module.saveForm = function(host, params){
    params.available = 1;
    params.ver = 1;
    params.task = host.taskName;
    params.content = EncodingClass.string.fromVariable(params.content);
    var formContent, FM_form_content;
    if (host.taskName == "input") {
        formContent = host.database.input_forms;
        FM_form_content = data_module.input_forms;
    }
    else if (host.taskName == "m_input") {
        formContent = host.database.input_forms;
        FM_form_content = data_module.mobile_input_forms;
    }
    else if (host.taskName == "m_output") {
        formContent = host.database.output_forms;
        FM_form_content = data_module.mobile_output_forms;
    }
    else {
        formContent = host.database.output_forms;
        FM_form_content = data_module.output_forms;
    }
    return new Promise(function(resolve, reject){
        ModalElement.show_loading();
        FormClass.api_call({
            url: 'input_form_add_new_save.php',
            params: [
                {name: "data", value: EncodingClass.string.fromVariable(params)}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success) {
                    if (message.substr(0, 2) == "ok"){
                        params.id = parseInt(EncodingClass.string.toVariable(message.substr(2)), 10);
                        params.content = EncodingClass.string.toVariable(params.content);
                        formContent.items.push(params);
                        FM_form_content.items.push(params);
                        form_module.attachOnCreatedCb(params.content);
                        if (host.taskName == "input") hr.input_form.loadFormConstructorToAssembler(formContent.items, host.database.typelists.items, 1);
                        else if (host.taskName == "m_input") hr.input_form_mobile.loadFormConstructorToAssembler(formContent.items, host.database.typelists.items, 1);
                        else if (host.taskName == "m_output") hr.output_form_mobile.loadFormConstructorToAssembler(formContent.items, host.database.typelists.items, 1);
                        else hr.output_form.loadFormConstructorToAssembler(formContent.items, host.database.typelists.items, 1);
                        // hr.input_form.loadFormConstructorToAssembler(formContent.items, host.database.typelists.items);
                        formContent.items.sort(function(a, b){
                            if (absol.string.nonAccentVietnamese(a.name) < absol.string.nonAccentVietnamese(b.name)) return -1;
                            if (absol.string.nonAccentVietnamese(a.name) > absol.string.nonAccentVietnamese(b.name)) return 1;
                            return 0;
                        });
                        resolve(params);
                    }
                    else {
                        if (message == "nameerror"){
                            ModalElement.alert({message: "Tên form đã được sử dụng"});
                        }
                        reject(message);
                    }
                }
                else {
                    reject(message);
                }
            }
        })
    });
}

// Hàm vẽ giao diện thêm form mới

form_module.showNewFormDialog = function(host){
    return new Promise(function(accept, deny){
        var formContent;
        if (host.taskName == "input" || host.taskName == "m_input") formContent = host.database.input_forms;
        else formContent = host.database.output_forms;
        var formName = absol._({
            tag: 'input',
            class: "cardsimpleInput",
            style: {
                width: "400px"
            },
            props: {
                type: 'text'
            }
        });
        var initForm = absol._({
            tag: 'selectmenu',
            style: {
                width: "400px"
            },
            props: {
                items: [
                    {text: "LinearLayout", value: "LinearLayout"},
                    {text: "RelativeLayout", value: "RelativeLayout"}
                ]
            }
        });
        var items = [];
        var dict = {};
        for (var i = 0; i < host.database.typelists.items.length; i++){
            if (
                host.database.typelists.items[i].type == "structure"
                || host.database.typelists.items[i].type == "extends_structure"
                || host.database.typelists.items[i].type == "array"
                || host.database.typelists.items[i].type == "treetable"
                || host.database.typelists.items[i].type2 == "structure"
                || host.database.typelists.items[i].type2 == "array"
                || host.database.typelists.items[i].type2 == "treetable"
                || host.database.typelists.items[i].id > 0
            ) items.push({
                value: host.database.typelists.items[i].id,
                text: host.database.typelists.items[i].name,
                sortText: absol.string.nonAccentVietnamese(host.database.typelists.items[i].name).toLowerCase()
            });
            dict[host.database.typelists.items[i].id] = host.database.typelists.items[i];
        }
        items.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });
        items.unshift({text: LanguageModule.text("txt_select_datatype"), value: 0});
        host.typeDict = dict;
        host.formDict = {};
        formContent.items.forEach(function(elt){
            host.formDict[elt.id] = elt;
        });
        var type = absol._({
            tag: "selectmenu",
            style: {
                width: "400px"
            },
            props: {
                enableSearch: true,
                items: items
            },
            on: {
                change: function(){
                    if (dict[this.value].type == "extends_structure") {
                        // var baseTypeId = dict[this.value].content.typeof;
                        var baseTypeId = [];
                        var formItems = [];
                        var strIndex = 0;
                        while (strIndex < dict[this.value].includedid.length - 1) {
                            var t_index = dict[this.value].includedid.indexOf("_", strIndex + 1);
                            baseTypeId.push(parseInt(dict[this.value].includedid.substr(strIndex + 1, t_index - strIndex - 1)));
                            strIndex = t_index;
                        }
                        formContent.items.forEach(function(elt){
                            if (baseTypeId.indexOf(elt.typeid) != -1) formItems.push({
                                value: elt.id,
                                text: elt.name,
                                sortText: absol.string.nonAccentVietnamese(elt.name).toLowerCase()
                            });
                        });
                        if (formItems.length > 0){
                            formItems.sort(function(a, b){
                                if (a.sortText > b.sortText) return 1;
                                if (a.sortText < b.sortText) return -1;
                                return 0;
                            });
                            formItems.unshift({value: 0, text: LanguageModule.text("txt_select_value")});
                            absol.$(".create-new-form-base-form", tDiv, function(elt){
                                elt.style.display = null;
                            });
                            form.items = formItems;
                            form.value = 0;
                        }
                    }
                    else {
                        absol.$(".create-new-form-base-form", tDiv, function(elt){
                            elt.style.display = "none";
                        });
                        form.value = 0;
                    }
                    if (formName.value.trim() == ""){
                        formName.value = this.textContent;
                        formName.focus();
                    }
                }
            }
        });
        var form = absol._({
            tag: "selectmenu",
            style: {
                width: "400px"
            },
            props: {
                enableSearch: true,
                items: [],
                value: 0
            }
        });
        var tDiv = DOMElement.div({
            children: [DOMElement.table({
                data: [
                    [
                        {text: "Tên form"},
                        {
                            attrs: {style: {paddingLeft: "10px"}},
                            children: [formName]
                        }
                    ],
                    [{attrs: {style: {paddingTop: "10px"}}}],
                    [
                        {text: "Kiểu dữ liệu"},
                        {
                            attrs: {style: {paddingLeft: "10px"}},
                            children: [type]
                        }
                    ],
                    [{attrs: {className: "create-new-form-base-form", style: {display: "none", paddingTop: "10px"}}}],
                    [
                        {attrs: {style: {display: "none"}, className: "create-new-form-base-form"}, text: "Chọn form cơ sở"},
                        {
                            attrs: {className: "create-new-form-base-form", style: {display: "none", paddingLeft: "10px"}},
                            children: [form]
                        }
                    ],
                    [{attrs: {style: {paddingTop: "10px"}}}],
                    [
                        {text: "Init form"},
                        {
                            attrs: {style: {paddingLeft: "10px"}},
                            children: [initForm]
                        }
                    ]
                ]
            })]
        });
        ModalElement.showWindow({
            index: 1,
            title: "Tạo form mới",
            bodycontent: DOMElement.div({
                style: {
                    padding: "10px"
                },
                children: [
                    tDiv,
                    DOMElement.div({
                        attrs: {
                            style: {
                                paddingTop: "20px",
                                textAlign: "center"
                            }
                        },
                        children: [
                            DOMElement.div({
                                attrs: {style: {
                                    display: "inline-block"
                                }},
                                children: [theme.okButton({
                                    onclick: function () {
                                        var name = formName.value.trim();
                                        if (name == ""){
                                            ModalElement.alert({message: LanguageModule.text("txt_no_name")});
                                            return;
                                        }
                                        var params = {
                                            typeid: parseInt(type.value, 10),
                                            name: name
                                        };
                                        var baseFormId = form.value;
                                        if (params.typeid == 0) {
                                            ModalElement.alert({message: LanguageModule.text("txt_no_datatype_is_selected_yet")});
                                            return;
                                        }
                                        for (var i = 0; i < formContent.items.length; i++){
                                            if (formContent.items[i].name == name) {
                                                ModalElement.alert({message: "Tên form đã được sử dụng"});
                                                return;
                                            }
                                        }
                                        var form_content;
                                        if (host.taskName == "input" || host.taskName == "m_input") {
                                            if (initForm.value == "LinearLayout") {
                                                if (!host.isMobile) form_content = form_module.generateDefaultLinearInputForm(host, params.typeid, host.typeDict[params.typeid], baseFormId);
                                                else form_content = form_module.generateDefaultLinearMobileInputForm(host, params.typeid, host.typeDict[params.typeid], baseFormId);
                                                params.content = {
                                                    layout: {
                                                        tag: "LinearLayout",
                                                        style: {
                                                            overflowY: "visible",
                                                            height: "auto",
                                                            width: host.isMobile ? 350 : "auto"
                                                        },
                                                        attributes: {}
                                                    },
                                                    circuit: {}
                                                };
                                            }
                                            else {
                                                var size = {
                                                    h: 10,
                                                    w: 20
                                                };
                                                form_content = form_module.generateDefaultRelativeInputForm(host, params.typeid, host.typeDict[params.typeid], size);
                                                params.content = {
                                                    layout: {
                                                        tag: "RelativeLayout",
                                                        style: {
                                                            hAlign: "left",
                                                            vAlign: "top",
                                                            left: 0,
                                                            right: 0,
                                                            top: 0,
                                                            bottom: 0,
                                                            height: size.h,
                                                            width: size.w
                                                        }
                                                    },
                                                    circuit: {}
                                                };
                                            }
                                        }
                                        else {
                                            if (!host.isMobile) form_content = form_module.generateDefaultLinearOutputForm(host, params.typeid, host.typeDict[params.typeid], baseFormId);
                                            else form_content = form_module.generateDefaultLinearMobileOutputForm(host, params.typeid, host.typeDict[params.typeid], baseFormId);
                                            params.content = {
                                                layout: {
                                                    tag: "LinearLayout",
                                                    style: {
                                                        overflowY: "visible",
                                                        height: "auto",
                                                        width: host.isMobile ? 350 : "auto"
                                                    },
                                                    attributes: {}
                                                },
                                                circuit: {}
                                            };
                                        }
                                        if (!form_content) {
                                            return;
                                        }
                                        var childrenid = "";
                                        if (dict[params.typeid].type == "shifts") params.content.layout.attributes.name = "ValidTimeShift";
                                        else if (dict[params.typeid].includedid) {
                                            if (dict[params.typeid].includedid.indexOf("_-54_") != -1) params.content.layout.attributes.name = "ValidTimeShift";
                                        }
                                        if (dict[params.typeid].type == "array" || dict[params.typeid].type2 == "array"){
                                            params.content.layout.style.width = "auto";
                                            params.content.layout.children = [form_content];
                                            // params.content.layout.children = [form_content.layout];
                                            // params.content.circuit = form_content.circuit;
                                            if (form_content.tag != "TableInput") childrenid = "_" + form_content.attributes.itemFragmentClass;
                                        }
                                        else if (dict[params.typeid].type == "treetable" || dict[params.typeid].type2 == "treetable"){
                                            params.content.layout.style.width = "auto";
                                            params.content.layout.children = [form_content];
                                        }
                                        else if (
                                            dict[params.typeid].type == "structure"
                                            || dict[params.typeid].type == "extends_structure"
                                            || dict[params.typeid].type2 == "structure"
                                        ) {
                                            var getChildrenIdList = function(cur){
                                                if (cur.class && !isNaN(parseInt(cur.class))){
                                                    childrenid += "_" + parseInt(cur.class);
                                                }
                                                else if (cur.children && cur.children.length > 0){
                                                    cur.children.forEach(function(elt){
                                                        getChildrenIdList(elt);
                                                    })
                                                }
                                            }
                                            params.content.layout.children = form_content.layout;
                                            form_content.layout.forEach(function(elt){
                                                getChildrenIdList(elt);
                                            });
                                            params.content.circuit = form_content.circuit;
                                        }
                                        else {
                                            params.content.layout.children = [form_content.layout];
                                            params.content.circuit = form_content.circuit;
                                        }
                                        if (childrenid != "") childrenid += "_";
                                        params.childrenid = childrenid;
                                        params.typedescendantid = "";
                                        contentModule.getDescendantsId(host, dict[params.typeid]).forEach(function(elt){
                                            params.typedescendantid += "_" + elt;
                                        });
                                        if (params.typedescendantid != "") params.typedescendantid += "_";
                                        params.isMobile = host.isMobile;
                                        accept(params);
                                        ModalElement.close(1);
                                    }
                                })]
                            }),
                            DOMElement.div({
                                attrs: {style: {
                                    display: "inline-block",
                                    paddingLeft: "10px"
                                }},
                                children: [theme.cancelButton({
                                    onclick: function () {
                                        deny("cancel");
                                        ModalElement.close(1);
                                    }
                                })]
                            })
                        ]
                    })
                ]
            })
        });
        setTimeout(function(){
            formName.focus();
        }, 50);
    });
};

// Hàm thêm form mới

// form_module.addNewForm = function(host){
//     return form_module.showNewFormDialog(host).then(function(result){
//         return form_module.saveForm(host, result)
//     });
// };

// Hàm lưu sửa đổi form cũ

form_module.formSaveContent = function(data){
    var st = {
        id: data.id,
        content: data.content,
        childrenid: data.childrenid,
        typedescendantid: data.typedescendantid,
        ver: data.ver + 1
    };
    return new Promise(function(rs, rj){
        FormClass.api_call({
            url: "input_form_edit_save.php",
            params: [
                {name: "data", value: EncodingClass.string.fromVariable(st)}
            ],
            func: function(success, message){
                if (success){
                    if (message.substr(0, 2) == 'ok'){
                        var formContent = EncodingClass.string.toVariable(message.substr(2));
                        formContent.content = EncodingClass.string.toVariable(formContent.content);
                        rs(formContent);
                    }
                    else {
                        rj(message);
                    }
                }
                else {
                    rj(message);
                }
            }
        });
    });
};


form_module.generateDefaultLinearOutputForm = function(host, typeid, items, baseFormId){
    var data, type, t_id;
    if (typeid == "union"){
        data = form_module.type2outputform[typeid](host, items);
    }
    else {
        type = host.typeDict[typeid].type;
        if (form_module.primitiveTypeList.indexOf(type) != -1){
            type = host.typeDict[typeid].type2;
        }

        data = (form_module.type2outputform[type] || form_module.type2outputform.notSupport)(host, type, items, baseFormId);
        if(data){
            data.attributes = data.attributes ||{};
            data.attributes.inputType = type;
            data.attributes.formVersion = form_module.formVersion;
        }
    }

    return data;
};

form_module.attachOnCreatedCb = function attachOnCreatedCb(compData){
    var type = compData.attributes && compData.attributes.inputType;
    if (type && form_module.tag2OnCreated[type]){
        compData.onCreated = form_module.tag2OnCreated[type];
    }
    if (compData.children && compData.children.length > 0)
        compData.children.forEach(attachOnCreatedCb);
}

form_module.tag2OnCreated = {};

form_module.tag2OnCreated.array = function(){
    var tag = this.tag;
    if (tag !== "TableInput") return;
    var t_id = this.attributes.typeIdOfArray;
    var t_name = this.attributes.nameOfArray;
    form_module.setAttributeOfTableInput.call(this, t_id, t_name);
};


form_module.tag2OnCreated.treetable = function(){
    var t_id = this.attributes.typeIdOfTreeTable;
    var t_name = this.attributes.nameOfTreeTable;
    form_module.setAttributeOfTreeTableInput.call(this, t_id, t_name);
};

form_module.tag2OnCreated.user = function(task){
    return data_module.loadUsersList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {users: rs});
        var items = contentModule.getUsersListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.userlist = function(task){
    return data_module.loadUsersList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {users: rs});
        var items = contentModule.getUsersListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.geopos = function(task){
    return data_module.loadGeographiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {geopos: rs});
        var items = contentModule.getGeoposListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_department = function(task){
    return data_module.loadOrgsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {orgs: rs});
        contentModule.makeOrgsIndex(host);
        var items = contentModule.getOrgsListSelectTreeMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_document_groups = function(task){
    return data_module.loadDocument_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {document_groups: rs});
        var items = contentModule.getDocumentGroupsListSelectTreeMenu(host);
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_document_folders = function(task){
    return data_module.loadDocument_foldersList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {document_folders: rs});
        var items = contentModule.getDocumentFoldersListSelectTreeMenu(host);
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.select_department_employee = function(task){
    return 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);
        // var items = contentModule.getOrgsListSelectTreeMenu(host);
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_position = function(departmentid){
    // var self  = this;
    // return data_module.loadPositionsList().then(function(rs){
    //     if (departmentid !== undefined) {
    //         rs = rs.filter(function(elt){
    //             return elt.orgid == departmentid;
    //         });
    //     }
    //     var host = {database: {}};
    //     contentModule.makeDatabaseContent(host, {positions: rs});
    //     return contentModule.getPositionsListSelectMenu(host);
    //     // self.domElt.items = contentModule.getPositionsListSelectMenu(host);
    // }, function(rj){console.log(rj);});
    return 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);
        if (!task) items.unshift({value: 0, text: LanguageModule.text("txt_select_value"), isLeaf: true});
        else items.unshift({value: 0, text: ""});
        return items;
        // return contentModule.getEmployeesListSelectMenu(host);
    }, function(rj){console.log(rj);});
};

// form_module.tag2OnCreated.member_of_people = function(){
//     // var self  = this;
//     return data_module.loadPeoplesList().then(function(rs){
//         var host = {database: {}};
//         contentModule.makeDatabaseContent(host, {peoples: rs});
//         return contentModule.getPeoplesListSelectMenu(host);
//         // self.domElt.items = contentModule.getPeoplesListSelectMenu(host);
//     }, function(rj){console.log(rj);});
// };

form_module.tag2OnCreated.member_of_employee = function(fragment, task){
    return data_module.loadEmployeeItemsPrivView().then(function(host){
        var items = contentModule.getMemberOfEmployeeSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
        // return contentModule.getEmployeesListSelectMenu(host);
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_template_groups = function(task){
    return data_module.loadTemplateGroupList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {template_groups: rs});
        host.database.template_groups.items.unshift({
            id: -1,
            name: LanguageModule.text("txt_onboarding"),
            comment: "",
            extrainfo: "obj#0#",
            available: 1,
            ver: 1
        });
        host.database.template_groups.items.unshift({
            id: -3,
            name: LanguageModule.text("txt_offboarding"),
            comment: "",
            extrainfo: "obj#0#",
            available: 1,
            ver: 1
        });
        host.database.template_groups.items.unshift({
            id: -4,
            name: LanguageModule.text("txt_examination"),
            comment: "",
            extrainfo: "obj#0#",
            available: 1,
            ver: 1
        });
        host.database.template_groups.items.unshift({
            id: -2,
            name: "Khác...",
            comment: "",
            extrainfo: "obj#0#",
            available: 1,
            ver: 1
        });
        var items = contentModule.getMemberOfTemplateGroupSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.employee_list = function(task){
    return data_module.loadEmployeeItemsPrivView().then(function(host){
        var items = contentModule.getMemberOfEmployeeSelectMenu(host);
        items.splice(0, 1);
        return items;
        // return contentModule.getEmployeesListSelectMenu(host);
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.nation_city = function(task){
    return 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);
        return items;
        // return contentModule.getEmployeesListSelectMenu(host);
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.position_list = function(task){
    return 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);
        return items;
        // return contentModule.getEmployeesListSelectMenu(host);
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_employee_choose_company = function(host, task){
    if (!host.companyLoad) {
        host.companyLoad = {
            database: {}
        };
        host.companyLoad.resultAsync = data_module.loadOrgsList().then(function(rs){
            contentModule.makeDatabaseContent(host.companyLoad, {orgs: rs});
            contentModule.makeOrgsIndex(host.companyLoad);
            var items = [];
            var items = [{value: 0, text: task == "output" ? "" : LanguageModule.text("txt_select_value")}];
            host.companyLoad.database.orgs.items.forEach(function(elt){
                if (elt.parentid == 0) items.push({
                    value: elt.id,
                    text: elt.name,
                    sortText: absol.string.nonAccentVietnamese(elt.name).toLowerCase()
                });
            });
            items.sort(function(a, b){
                if (a.sortText > b.sortText) return 1;
                if (a.sortText < b.sortText) return -1;
                return 0;
            });
            host.companyItems = items;
            return items;
        }).catch(function(err){console.log(err);});
    }
    return host.companyLoad.resultAsync;
};

form_module.tag2OnCreated.member_of_employee_choose_department = function(host, companyid, task){
    if (!host.companyLoad){
        form_module.tag2OnCreated.member_of_employee_choose_company(host, task);
    }
    return host.companyLoad.resultAsync.then(function(rs){
        var items;
        if (!companyid) return [];
        items = contentModule.getDepartmentListSelectTreeMenu(host.companyLoad, companyid);
        return items;
    });
};

form_module.tag2OnCreated.member_of_employee_by_departmentid = function(departmentid){
    return data_module.loadEmployeesListByOrgid(departmentid).then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, rs);
        return contentModule.getEmployeesListSelectMenu(host);
    }, function(rj){console.log(rj);});
};


form_module.tag2OnCreated.member_of_position_by_departmentid = function(departmentid, task){
    return data_module.loadPositionsListByOrgid(departmentid).then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {positions: rs});
        var items = contentModule.getPositionsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};


form_module.tag2OnCreated.member_of_assets = function(task){
    // var self  = this;
    return data_module.loadAssetsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {assets: rs});
        var items = contentModule.getAssetsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};


form_module.tag2OnCreated.member_of_instruments_and_tools = function(task){
    // var self  = this;
    return data_module.loadInstruments_and_toolsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {instruments_and_tools: rs});
        var items = contentModule.getInstrumentAndToolsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_assets_instruments_and_tools = function(task){
    var host = {database: {}};
    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);
        if (task == "output") items[0].text = "";
        return items;
    });
};

form_module.tag2OnCreated.member_of_warehouses = function(fragment, task){
    return data_module.loadWarehousesList().then(function(rs){
        var host = {database: {}};
        if (fragment && fragment.getContext){
            var shareParams = fragment.getContext("SHARE_PARAMS");
            host.listWarehousePriv = shareParams.listWarehousePriv;
        }
        contentModule.makeDatabaseContent(host, {warehouses: rs});
        var items = contentModule.getWarehousesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_welcome_templates = function(task){
    return data_module.loadWelcomeTemplatesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {welcome_templates: rs});
        var items = contentModule.getMemberOfWelcomeTemplateSelectMenu(host);
        // if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_allowance_policy_groups = function(task){
    return data_module.loadAllowance_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {allowance_policy_groups: rs});
        var items = contentModule.getAllowancePolicyGroupsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_bonus_policy_groups = function(task){
    return data_module.loadBonus_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {bonus_policy_groups: rs});
        var items = contentModule.getBonusPolicyGroupsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_work_flow_groups = function(task){
    return data_module.loadWork_flow_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {work_flow_groups: rs});
        var items = contentModule.getWorkFlowGroupsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_work_flows = function(task){
    return data_module.loadWork_flowsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {work_flows: rs});
        var items = contentModule.getWorkFlowsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_payroll_cycle = function(task){
    return data_module.loadPayrollCycleList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {payroll_cycle: rs});
        var items = contentModule.getPayrollCycleListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_objects = function(task){
    return data_module.loadObjectsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {objects: rs});
        var items = contentModule.getObjectsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_lesson_categories = function(task){
    return data_module.loadLesson_categoriesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {lesson_categories: rs});
        var items = contentModule.getLessonCategoriesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_typelists = function(task){
    return data_module.loadType_listsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {typelists: rs});
        var items = contentModule.getTypeListsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_input_forms = function(task){
    var items = contentModule.getInputFormsListSelectMenu();
    if (task == "output") items[0].text = "";
    return items;
};

form_module.tag2OnCreated.member_of_mobile_input_forms = function(task){
    var items = contentModule.getMobileInputFormsListSelectMenu();
    if (task == "output") items[0].text = "";
    return items;
};

form_module.tag2OnCreated.member_of_output_forms = function(task){
    var items = contentModule.getOutputFormsListSelectMenu();
    if (task == "output") items[0].text = "";
    return items;
};

form_module.tag2OnCreated.member_of_mobile_output_forms = function(task){
    var items = contentModule.getMobileOutputFormsListSelectMenu();
    if (task == "output") items[0].text = "";
    return items;
};


form_module.tag2OnCreated.member_of_typelists = function(task){
    return data_module.loadType_listsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {typelists: rs});
        var items = contentModule.getTypeListsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};


form_module.tag2OnCreated.member_of_partner_class = function(task){
    return data_module.loadPartner_classList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {partner_class: rs});
        var items = contentModule.getPartnerClassListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_partner = function(task){
    return data_module.loadPartnerList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {partner: rs});
        var items = contentModule.getPartnerListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_contact = function(task){
    return data_module.loadContactList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {contact: rs});
        var items = contentModule.getContactListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_document_types = function(task){
    return data_module.loadDocument_typesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {document_types: rs});
        var items = contentModule.getDocumentTypesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_orgs = function(task){
    return data_module.loadOrgCompanysList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {orgs: rs});
        var items = contentModule.getOrgsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_other_liability_policy_groups = function(task){
    return 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);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_insurance_policies = function(task){
    return data_module.loadInsurance_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {insurance_policies: rs});
        var items = contentModule.getInsurancePoliciesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_tax_policies = function(task){
    return data_module.loadTax_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {tax_policies: rs});
        var items = contentModule.getTaxPoliciesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_trade_union_policies = function(task){
    return data_module.loadTrade_union_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {trade_union_policies: rs});
        var items = contentModule.getTradeUnionPoliciesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_leave_policies = function(task){
    return data_module.loadLeave_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {leave_policies: rs});
        var items = contentModule.getLeavePoliciesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_benefit_policies = function(task){
    return data_module.loadBenefit_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {benefit_policies: rs});
        var items = contentModule.getBenefitPoliciesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_allowance_policies = function(task){
    return data_module.loadAllowance_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {allowance_policies: rs});
        var items = contentModule.getAllowancePoliciesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_bonus_policies = function(task){
    return data_module.loadBonus_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {bonus_policies: rs});
        var items = contentModule.getBonusPoliciesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_overtime_policies = function(task){
    return data_module.loadOvertime_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {overtime_policies: rs});
        var items = contentModule.getOvertimePoliciesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_punishment_policies = function(task){
    return data_module.loadPunishment_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {punishment_policies: rs});
        var items = contentModule.getPunishmentPoliciesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_advance_payment_policies = function(task){
    return data_module.loadAdvance_payment_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {advance_payment_policies: rs});
        var items = contentModule.getAdvancePaymentPoliciesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_late_early_checkin_policies = function(task){
    return 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);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_salary_policies = function(task){
    return data_module.loadSalary_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {salary_policies: rs});
        var items = contentModule.getSalaryPoliciesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_other_liability_policies = function(task){
    return data_module.loadOther_liability_policiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {other_liability_policies: rs});
        var items = contentModule.getOtherLiabilityPoliciesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_nations = function(task){
    return data_module.loadNationsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {nations: rs});
        var items = contentModule.getNationsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_cities = function(task){
    return data_module.loadCitiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {cities: rs});
        var items = contentModule.getCitiesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_ethnics = function(task){
    return data_module.loadEthnicsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {ethnics: rs});
        var items = contentModule.getEthnicsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_religions = function(task){
    return data_module.loadReligionsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {religions: rs});
        var items = contentModule.getReligionsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_salary_policy_groups = function(task){
    return data_module.loadSalary_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {salary_policy_groups: rs});
        var items = contentModule.getSalaryPolicyGroupsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_trade_union_policy_groups = function(task){
    return 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);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_overtime_policy_groups = function(task){
    return data_module.loadOvertime_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {overtime_policy_groups: rs});
        var items = contentModule.getOvertimePolicyGroupsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_offboarding_reasons = function(task){
    return data_module.loadOffboardingReasonList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {offboarding_reasons: rs});
        var items = contentModule.getOffboardingReasonListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.multiselect_offboarding_reasons = function(task){
    return data_module.loadOffboardingReasonList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {offboarding_reasons: rs});
        var items = contentModule.getOffboardingReasonListSelectMenu(host);
        items.splice(0, 1);
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_offboarding_types = function(task){
    return data_module.loadOffboardingTypeList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {offboarding_types: rs});
        var items = contentModule.getOffboardingTypeListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_punishment_policy_groups = function(task){
    return data_module.loadPunishment_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {punishment_policy_groups: rs});
        var items = contentModule.getPunishmentPolicyGroupsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_asset_category = function(task){
    return data_module.loadAssetCategoryList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {asset_category: rs});
        var items = contentModule.getAssetCategoryListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_instruments_and_tools_category = function(task){
    return data_module.loadInstrumentsAndToolsCategoryList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {instruments_and_tools_category: rs});
        var items = contentModule.getAssetsInstrumentAndToolsCategoryListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_projects = function(task){
    return data_module.loadProjectsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {projects: rs});
        var items = contentModule.getProjectsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_tax_policy_groups = function(task){
    return data_module.loadTax_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {tax_policy_groups: rs});
        var items = contentModule.getTaxPolicyGroupsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_advance_payment_policy_groups = function(task){
    return 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);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_late_early_checkin_policy_groups = function(task){
    return 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);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_benefit_policy_groups = function(task){
    return data_module.loadBenefit_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {benefit_policy_groups: rs});
        var items = contentModule.getBenefitPolicyGroupsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_shifts = function(task){
    return data_module.loadShiftsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {shifts: rs});
        var items = contentModule.getShiftsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.members_of_shifts = function(task){
    return data_module.loadShiftsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {shifts: rs});
        var items = contentModule.getShiftsListSelectBox(host);
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.members_of_partner_class = function(task){
    return data_module.loadPartner_classList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {partner_class: rs});
        var items = contentModule.getPartnerClassListSelectBox(host);
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.members_of_locations = function(task){
    return data_module.loadGeographiesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {geopos: rs});
        var items = contentModule.getGeoposListSelectBox(host);
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_leave_policy_groups = function(task){
    return data_module.loadLeave_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {leave_policy_groups: rs});
        var items = contentModule.getLeavePolicyGroupsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_employment_contract_types = function(task){
    return data_module.loadEmployment_contract_typesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {employment_contract_types: rs});
        var items = contentModule.getEmploymentContractTypesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_insurance_policy_groups = function(task){
    return data_module.loadInsurance_policy_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {insurance_policy_groups: rs});
        var items = contentModule.getInsurancePolicyGroupsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.member_of_training_program_groups = function(task){
    return data_module.loadTrainingProgram_groupsList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {training_program_groups: rs});
        var items = contentModule.getTrainingProgramGroupsListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.fx = form_module.fx ||{};//todo: gom ham

form_module.fx.load_warehouse_items = function(){
    var self  = this;
    return data_module.loadWarehousesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {warehouses: rs});
        return contentModule.getWarehousesListSelectMenu(host);
    }, function(rj){console.log(rj);});
};

form_module.fx.member_of_assets = function(host, warehouseid, asset_transactionid){
    var self  = this;
    var c = contentModule.getAssetsHandoverListSelectMenu(host, warehouseid, asset_transactionid);
    return c;
};

form_module.fx.change_table_asset_handover_assetid_propertyDescriptors = function(oldProps, newItems){
    if (!oldProps['-72'].propertyDescriptors.type_asset_handover_lines_assetid) {
        oldProps['-72'].propertyDescriptors.__preloaded__ = {
            type_asset_handover_lines_assetid:{
                items: newItems,
                onchange: '{{'
                + 'type_asset_handover_lines_status = contentModule.getStatusByAssetId(this.fragment.getContext("host"), type_asset_handover_lines_assetid);'
                +'}}'
            }
        };
        return oldProps;
    }
    //// TODO: prevent load in onCreated
    oldProps['-72'].propertyDescriptors.type_asset_handover_lines_assetid.items = newItems;
    if (oldProps['-72'].propertyDescriptors.__completeLoad__)
        oldProps['-72'].records = [];
    oldProps['-72'].propertyDescriptors.type_asset_handover_lines_assetid.onchange = '{{'
    + 'type_asset_handover_lines_status = contentModule.getStatusByAssetId(this.fragment.getContext("host"), type_asset_handover_lines_assetid);'
    +'}}';
    oldProps['-72'].propertyDescriptors.type_asset_handover_lines_status.readOnly = true;

    return oldProps;
};

form_module.fx.member_of_instruments_and_tools = function(host, warehouseid, asset_transactionid){
    var self  = this;
    var c = contentModule.getInstrumentAndToolsHandoverListSelectMenu(host, warehouseid, asset_transactionid);
    return c;
};

form_module.fx.change_table_instruments_and_tools_handover_assetid_propertyDescriptors = function(oldProps, newItems){
    if (!oldProps['-231'].propertyDescriptors.type_instruments_and_tools_handover_lines_assetid) {
        oldProps['-231'].propertyDescriptors.__preloaded__ = {
            type_instruments_and_tools_handover_lines_assetid:{
                items: newItems,
                onchange: '{{'
                +'if (type_instruments_and_tools_handover_lines_assetid == 0) return; type_instruments_and_tools_handover_lines_amount = 1;'
                +'type_instruments_and_tools_handover_lines_unit = contentModule.getUnitByInstrumentsAndToolsId(this.fragment.getContext("host"), type_instruments_and_tools_handover_lines_assetid);'
                + 'type_instruments_and_tools_handover_lines_inventory = contentModule.getInventoryByByInstrumentsAndToolsId(this.fragment.getContext("host"), type_instruments_and_tools_handover_lines_assetid);'
                +'}}'
            }
        };
        return oldProps;
    }
    //// TODO: prevent load in onCreated
    oldProps['-231'].propertyDescriptors.type_instruments_and_tools_handover_lines_assetid.items = newItems;
    if (oldProps['-231'].propertyDescriptors.__completeLoad__)
        oldProps['-231'].records = [];
    oldProps['-231'].propertyDescriptors.type_instruments_and_tools_handover_lines_assetid.onchange = '{{'
    +'type_instruments_and_tools_handover_lines_amount = 1;'
    +'type_instruments_and_tools_handover_lines_unit = contentModule.getUnitByInstrumentsAndToolsId(this.fragment.getContext("host"), type_instruments_and_tools_handover_lines_assetid);'
    + 'type_instruments_and_tools_handover_lines_inventory = contentModule.getInventoryByByInstrumentsAndToolsId(this.fragment.getContext("host"), type_instruments_and_tools_handover_lines_assetid);'
    +'}}';
    oldProps['-231'].propertyDescriptors.type_instruments_and_tools_handover_lines_unit.readOnly = true;
    oldProps['-231'].propertyDescriptors.type_instruments_and_tools_handover_lines_inventory.readOnly = true;
    oldProps['-231'].propertyDescriptors.type_instruments_and_tools_handover_lines_amount.max = '= type_instruments_and_tools_handover_lines_inventory';

    return oldProps;
};

form_module.fx.member_of_assets_recall = function(host, employeeid, asset_transactionid){
    var self  = this;
    var c = contentModule.getAssetsRecallListSelectMenu(host, employeeid, asset_transactionid);
    return c;
};

form_module.fx.change_table_recall_asetid_propertyDescriptors = function(oldProps, newItems){
    if (!oldProps['-76'].propertyDescriptors.type_asset_recall_lines_assetid) {
        oldProps['-76'].propertyDescriptors.__preloaded__ = {
            type_asset_recall_lines_assetid:{
                items: newItems,
                onchange: '{{'
                + 'type_asset_recall_lines_status = contentModule.getStatusByAssetId(this.fragment.getContext("host"), type_asset_recall_lines_assetid);'
                +'}}'
            }
        };
        return oldProps;
    }
    //// TODO: prevent load in onCreated
    oldProps['-76'].propertyDescriptors.type_asset_recall_lines_assetid.items = newItems;
    if (oldProps['-76'].propertyDescriptors.__completeLoad__)
        oldProps['-76'].records = [];
    oldProps['-76'].propertyDescriptors.type_asset_recall_lines_assetid.onchange = '{{'
    + 'type_asset_recall_lines_status = contentModule.getStatusByAssetId(this.fragment.getContext("host"), type_asset_recall_lines_assetid);'
    +'}}';
    oldProps['-76'].propertyDescriptors.type_asset_recall_lines_status.readOnly = true;
    return oldProps;
};

form_module.tag2OnCreated.member_of_worktime_machines = function(task){
    return data_module.loadWorktimeMachinesList().then(function(rs){
        var host = {database: {}};
        contentModule.makeDatabaseContent(host, {worktime_machines: rs});
        var items = contentModule.getWorktime_machinesListSelectMenu(host);
        if (task == "output") items[0].text = "";
        return items;
    }, function(rj){console.log(rj);});
};

form_module.tag2OnCreated.enum = function(t_id, task){
    // var t_id = this.attributes.typeid
    // var self = this;
    return Promise.all([
        data_module.loadTypeList(),
        data_module.loadLeave_policy_groupsList(),
        data_module.loadEmployment_contract_typesList()
    ]).then(function(values){
        var host = {
            database: {}
        };
        contentModule.makeDatabaseContent(host, {typelists: values[0], leave_policy_groups: values[1], employment_contract_types: values[2]});
        var typeDict = {};
        host.database.typelists.items.forEach(function (elt, index) {
            contentModule.makeDataTypeDecode(elt);
            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){
                    return {
                        text: elt.text,
                        value: elt.localid
                    };
                });
                lists.unshift({text: LanguageModule.text("txt_select_value"), value: 0});
                items = lists;
        }
        if (task == "output") items[0].text = "";
        return items;
    });
};

form_module.tag2OnCreated.enum_multi = function(t_id, task){
    // var t_id = this.attributes.typeid
    // var self = this;
    return Promise.all([
        data_module.loadTypeList(),
        data_module.loadLeave_policy_groupsList(),
        data_module.loadEmployment_contract_typesList()
    ]).then(function(values){
        var host = {
            database: {}
        };
        contentModule.makeDatabaseContent(host, {typelists: values[0], leave_policy_groups: values[1], employment_contract_types: values[2]});
        var typeDict = {};
        host.database.typelists.items.forEach(function (elt, index) {
            contentModule.makeDataTypeDecode(elt);
            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){
                    return {
                        text: elt.text,
                        value: elt.localid
                    };
                });
                lists.unshift({text: LanguageModule.text("txt_select_value"), value: 0});
                items = lists;
        }
        if (task == "output") items[0].text = "";
        return items;
    });
};

form_module.tag2OnCreated.extends_enum = function(typeid, task){
    // var typeid = this.attributes.typeid;
    // var self = this;
    return 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"){
            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){
                    return {
                        text: elt.text,
                        value: elt.localid
                    };
                });
                lists.unshift({text: LanguageModule.text("txt_select_value"), value: 0});
        }
        content.forEach(function(elt){
            lists.push({
                text: elt.text,
                value: elt.localid
            });
        });
        lists[0].text = "";
        return lists;
        // self.domElt.items = lists;
    });
};

form_module.tag2OnCreated.extends_enum_multi = function(typeid, task){
    // var typeid = this.attributes.typeid;
    // var self = this;
    return 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){
                    return {
                        text: elt.text,
                        value: elt.localid
                    };
                });
                lists.unshift({text: LanguageModule.text("txt_select_value"), value: 0});
        }
        content.forEach(function(elt){
            lists.push({
                text: elt.text,
                value: elt.localid
            });
        });
        lists[0].text = "";
        return lists;
        // self.domElt.items = lists;
    });
};

form_module.makeHeaderOfTable = function(host, typeid){
    var index, dict, type, content;
    dict = {};
    host.database.typelists.items.forEach(function(elt, index){
        dict[elt.id] = index;
    });
    index = dict[typeid];
    var getType = function(index){
        var type = host.database.typelists.items[index].type;
        if (form_module.primitiveTypeList.indexOf(type) != -1){
            type = host.database.typelists.items[index].type2;
        }
        return type;
    }
    type = getType(index);
    if (type == "structure") content = host.database.typelists.items[index].content.details;
    else if (type == "extends_structure"){
        content = contentModule.makeExtendTypeData(host, typeid);
    }
    else {
        content = [{
            type: typeid,
            localid: typeid
        }];
    }
    var names, descriptions;
    names = [];
    descriptions = {};
    var keys = [];
    var promiseList = [];
    content.forEach(function(elt){
        var index, type;
        index = dict[elt.type];
        type = getType(index);
        names.push(elt.localid);
        keys.push(elt.localid);
        promiseList.push((form_module.makeDataOfHeader[type] || form_module.makeDataOfHeader.notSupport)(host, elt, index));
    });
    return new Promise(function(rs, rj){
        Promise.all(promiseList).then(function(result){
            result.forEach(function(elt, index){
                descriptions[keys[index]] = elt;
            });
            rs({
                names: names,
                descriptions: descriptions
            });
        }, function(){
            rj();
        });
    });
};

form_module.makeDataOfHeader = {};

form_module.makeDataOfHeader.notSupport = function(host, item){
    //todo: log ra coi loi
}

form_module.makeDataOfHeader.string = function(host, item){
    return new Promise(function(rs, rj){
        rs({
            type: "text",
            text: item.name,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.performance_chart = function(host, item){
    var colorMapping = [
        {value: 0},
        {value: 0.5},
        {value: 1},
        {value: 1.2}
    ];
    systemconfig.thresholdcolor.forEach(function(elt, idx){
        colorMapping[idx].color = elt;
    });
    return new Promise(function(rs, rj){
        rs({
            type: "performance",
            text: item.name,
            colorMapping: colorMapping,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.note = function(host, item){
    return new Promise(function(rs, rj){
        rs({
            type: "text",
            text: item.name,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.number = function(host, item){
    return new Promise(function(rs, rj){
        rs({
            type: "number",
            text: item.name,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.currency = function(host, item){
    return new Promise(function(rs, rj){
        rs({
            type: "number",
            text: item.name,
            required: item.require
        });
    });
};


form_module.makeDataOfHeader.date = function(host, item){
    return new Promise(function(rs, rj){
        rs({
            type: "Date",
            text: item.name,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.datetime = function(host, item){
    return new Promise(function(rs, rj){
        rs({
            type: "Date",
            text: item.name,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.datemonth = function(host, item){
    return new Promise(function(rs, rj){
        rs({
            type: "Date",
            text: item.name,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.boolean = function(host, item){
    return new Promise(function(rs, rj){
        rs({
            type: "boolean",
            text: item.name,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.email_address = function(host, item){
    return new Promise(function(rs, rj){
        rs({
            type: "text",
            text: item.name,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.user = function(host, item){
    var items = data_module.users.items.map(function(elt){
        return {
            text: elt.username + " - " + elt.fullname,
            value: elt.id
        };
    });
    return new Promise(function(rs, rj){
        rs({
            type: "enum",
            emptyValue: '0',
            text: item.name,
            items: items,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.userlist = function(host, item){
    var items = data_module.users.items.map(function(elt){
        return {
            text: elt.username + " - " + elt.fullname,
            value: elt.id
        };
    });
    return new Promise(function(rs, rj){
        rs({
            type: "{enum}",
            text: item.name,
            items: items,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.phonenumber = function(host, item){
    return new Promise(function(rs, rj){
        rs({
            type: "text",
            text: item.name,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.website = function(host, item){
    return new Promise(function(rs, rj){
        rs({
            type: "text",
            text: item.name,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.gps = function(host, item){
    return new Promise(function(rs, rj){
        rs({
            type: "text",
            text: item.name,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.geopos = function(host, item){
    return new Promise(function(rs, rj){
        rs({
            type: "enum",
            emptyValue: '0',
            text: item.name,
            items: contentModule.getGeoposListSelectMenu(),
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.member_of_department = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadOrgsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {orgs: rs});
            contentModule.makeOrgsIndex(host);
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getOrgsListSelectTreeMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_document_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadDocument_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {document_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getDocumentGroupsListSelectTreeMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_document_folders = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadDocument_foldersList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {document_folders: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getDocumentFoldersListSelectTreeMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_position = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadPositionsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {positions: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getPositionsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_people = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadPeoplesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {peoples: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getPeoplesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_employee = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadEmployeesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {employees: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getMemberOfEmployeeSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_template_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadTemplateGroupList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {template_groups: rs});
            host.database.template_groups.items.unshift({
                id: -1,
                name: LanguageModule.text("txt_onboarding"),
                comment: "",
                extrainfo: "obj#0#",
                available: 1,
                ver: 1
            });
            host.database.template_groups.items.unshift({
                id: -3,
                name: LanguageModule.text("txt_offboarding"),
                comment: "",
                extrainfo: "obj#0#",
                available: 1,
                ver: 1
            });
            host.database.template_groups.items.unshift({
                id: -4,
                name: LanguageModule.text("txt_examination"),
                comment: "",
                extrainfo: "obj#0#",
                available: 1,
                ver: 1
            });
            host.database.template_groups.items.unshift({
                id: -2,
                name: "Khác...",
                comment: "",
                extrainfo: "obj#0#",
                available: 1,
                ver: 1
            });
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getMemberOfTemplateGroupSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_worktime_machines = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadWorktimeMachinesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {worktime_machines: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getWorktime_machinesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_assets = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadAssetsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {assets: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getAssetsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_instruments_and_tools = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadInstruments_and_toolsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {instruments_and_tools: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getInstrumentAndToolsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_assets_instruments_and_tools = function(host, item){
    return new Promise(function(resolve, reject){
        var host = {database: {}};
        Promise.all([data_module.loadAssetsList(), data_module.loadInstruments_and_toolsList()]).then(function(content){
            contentModule.makeDatabaseContent(host, {assets: content[0], instruments_and_tools: content[1]});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getAssetsInstrumentAndToolsListSelectMenu(host),
                required: item.require
            });
        });
    });
};

form_module.makeDataOfHeader.member_of_warehouses = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadWarehousesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {warehouses: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getWarehousesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_welcome_templates = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadWarehousesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {welcome_templates: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getMemberOfWelcomeTemplateSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_allowance_policy_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadAllowance_policy_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {allowance_policy_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getAllowancePolicyGroupsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_bonus_policy_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadBonus_policy_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {bonus_policy_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getBonusPolicyGroupsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_work_flow_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadWork_flow_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {work_flow_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getWorkFlowGroupsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_work_flows = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadWork_flowsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {work_flows: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getWorkFlowsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_payroll_cycle = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadPayrollCycleList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {payroll_cycle: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getPayrollCycleListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_objects = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadObjectsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {objects: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getObjectsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_lesson_categories = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadLesson_categoriesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {lesson_categories: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getLessonCategoriesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_typelists = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadType_listsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {typelists: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getTypeListsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_input_forms = function(host, item){
    return new Promise(function(resolve, reject){
        resolve({
            type: "enum",
            emptyValue: '0',
            text: item.name,
            items: contentModule.getInputFormsListSelectMenu(),
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.member_of_mobile_input_forms = function(host, item){
    return new Promise(function(resolve, reject){
        resolve({
            type: "enum",
            emptyValue: '0',
            text: item.name,
            items: contentModule.getMobileInputFormsListSelectMenu(),
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.member_of_output_forms = function(host, item){
    return new Promise(function(resolve, reject){
        resolve({
            type: "enum",
            emptyValue: '0',
            text: item.name,
            items: contentModule.getOutputFormsListSelectMenu(),
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.member_of_mobile_output_forms = function(host, item){
    return new Promise(function(resolve, reject){
        resolve({
            type: "enum",
            emptyValue: '0',
            text: item.name,
            items: contentModule.getMobileOutputFormsListSelectMenu(),
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.member_of_partner_class = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadPartner_classList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {partner_class: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getPartnerClassListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_partner = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadPartnerList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {partner: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getPartnerListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_contact = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadContactList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {contact: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getContactListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_document_types = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadDocument_typesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {document_types: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getDocumentTypesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_orgs = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadOrgCompanysList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {orgs: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getOrgsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_other_liability_policy_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadOther_liability_policy_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {other_liability_policy_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getOtherLiabilityPolicyGroupsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_insurance_policies = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadInsurance_policiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {insurance_policies: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getInsurancePoliciesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_tax_policies = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadTax_policiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {tax_policies: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getTaxPoliciesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_trade_union_policies = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadTrade_union_policiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {trade_union_policies: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getTradeUnionPoliciesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_leave_policies = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadLeave_policiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {leave_policies: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getLeavePoliciesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_benefit_policies = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadBenefit_policiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {benefit_policies: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getBenefitPoliciesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_allowance_policies = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadAllowance_policiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {allowance_policies: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getAllowancePoliciesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_bonus_policies = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadBonus_policiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {bonus_policies: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getBonusPoliciesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_overtime_policies = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadOvertime_policiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {overtime_policies: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getOvertimePoliciesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_punishment_policies = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadPunishment_policiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {punishment_policies: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getPunishmentPoliciesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_advance_payment_policies = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadAdvance_payment_policiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {advance_payment_policies: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getAdvancePaymentPoliciesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_late_early_checkin_policies = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadLate_early_checkin_policiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {late_early_checkin_policies: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getLateEarlyCheckinPoliciesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_salary_policies = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadSalary_policiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {salary_policies: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getSalaryPoliciesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_other_liability_policies = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadOther_liability_policiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {other_liability_policies: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getOtherLiabilityPoliciesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_nations = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadNationsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {nations: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getNationsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_cities = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadCitiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {cities: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getCitiesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_ethnics = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadEthnicsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {ethnics: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getEthnicsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_religions = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadReligionsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {religions: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getReligionsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_salary_policy_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadSalary_policy_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {salary_policy_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getSalaryPolicyGroupsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_salary_policy_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadSalary_policy_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {salary_policy_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getSalaryPolicyGroupsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_punishment_policy_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadPunishment_policy_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {punishment_policy_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getPunishmentPolicyGroupsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_asset_category = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadAssetCategoryList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {asset_category: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getAssetCategoryListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_instruments_and_tools_category = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadInstrumentsAndToolsCategoryList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {instruments_and_tools_category: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getAssetsInstrumentAndToolsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_projects = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadProjectsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {projects: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getProjectsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_tax_policy_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadTax_policy_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {tax_policy_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getTaxPolicyGroupsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_advance_payment_policy_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadAdvance_payment_policy_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {advance_payment_policy_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getAdvancePaymentPolicyGroupsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_late_early_checkin_policy_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadLate_early_checkin_policy_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {late_early_checkin_policy_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getLateEarlyCheckinPolicyGroupsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_benefit_policy_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadBenefit_policy_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {benefit_policy_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getBenefitPolicyGroupsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_shifts = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadShiftsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {shifts: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getShiftsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.members_of_shifts = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadShiftsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {shifts: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getShiftsListSelectBox(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.members_of_partner_class = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadPartner_classList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {partner_class: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getPartnerClassListSelectBox(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.members_of_locations = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadGeographiesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {geopos: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getGeoposListSelectBox(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_leave_policy_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadLeave_policy_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {leave_policy_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getLeavePolicyGroupsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_employment_contract_types = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadEmployment_contract_typesList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {employment_contract_types: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getEmploymentContractTypesListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_insurance_policy_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadInsurance_policy_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {insurance_policy_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getInsurancePolicyGroupsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.member_of_training_program_groups = function(host, item){
    return new Promise(function(resolve, reject){
        data_module.loadTrainingProgram_groupsList().then(function(rs){
            var host = {database: {}};
            contentModule.makeDatabaseContent(host, {training_program_groups: rs});
            resolve({
                type: "enum",
                emptyValue: '0',
                text: item.name,
                items: contentModule.getTrainingProgramGroupsListSelectMenu(host),
                required: item.require
            });
        }, function(rj){reject(rj);});
    });
};

form_module.makeDataOfHeader.time = function(host, item){
    return new Promise(function(rs, rj){
        rs({
            type: "TimeInput",
            text: item.name,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.enum = function(host, item, index){
    var items;
    var type = host.database.typelists.items[index].type;
    switch (type) {
        case 'language':
            items = contentModule.getLanguageListSelectMenu();
            break;
        default:
            var content = host.database.typelists.items[index].content;
            items = content.details.map(function(elt){
                return {
                    text: elt.text,
                    value: elt.localid
                };
            });
            items.unshift({text: LanguageModule.text("txt_select_value"), value: "0"});
    }
    return new Promise(function(rs, rj){
        rs({
            type: "enum",
            emptyValue: '0',
            text: item.name,
            items: items,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.enum_multi = function(host, item, index){
    var items;
    var type = host.database.typelists.items[index].type;
    switch (type) {
        case 'language':
            items = contentModule.getLanguageListSelectMenu();
            break;
        default:
            var content = host.database.typelists.items[index].content;
            items = content.details.map(function(elt){
                return {
                    text: elt.text,
                    value: elt.localid
                };
            });
            items.unshift({text: LanguageModule.text("txt_select_value"), value: 0});
    }
    return new Promise(function(rs, rj){
        rs({
            type: "{enum}",
            text: item.name,
            items: items,
            required: item.require
        });
    });
};

form_module.makeDataOfHeader.extends_enum_multi = function(host, item, index){
    var getType = function(index){
        var type = host.database.typelists.items[index].type;
        if (form_module.primitiveTypeList.indexOf(type) != -1){
            type = host.database.typelists.items[index].type2;
        }
        return type;
    }
    var dict = contentModule.makeDictionaryIndex(host.database.typelists.items);
    var details = host.database.typelists.items[index].content.details;
    var t_id = host.database.typelists.items[index].content.typeof;
    var t_type = getType(dict[t_id]);
    while(t_type == "extends_enum_multi"){
        details = host.database.typelists.items[dict[t_id]].content.details.concat(details);
        t_id = host.database.typelists.items[dict[t_id]].content.typeof;
        t_type = getType(dict[t_id]);
    }
    var items, type;
    type = host.database.typelists.items[dict[t_id]].type;
    switch (type) {
        case 'language':
            items = contentModule.getLanguageListSelectMenu();
            break;
        default:
            items = host.database.typelists.items[dict[t_id]].content.details.map(function(elt){
                return {
                    text: elt.text,
                    value: elt.localid
                };
            });
            items.unshift({text: LanguageModule.text("txt_select_value"), value: 0});
    }
    details.forEach(function(elt){
        items.push({
            text: elt.text,
            value: elt.localid
        });
    });
    return new Promise(function(rs, rj){
        rs({
            type: "{enum}",
            text: item.name,
            items: items,
            required: item.require
        });
    });
};

form_module.makeDataToSet = function(params){
    var typeid, valueid;
    typeid = params.typeid;
    valueid = params.valueid;
    return new Promise(function(resolve, reject){
        var typeDict = contentModule.makeDictionaryIndex(params.typelists);
        var valueDict = contentModule.makeDictionaryIndex(params.values);
        var primitiveTypeList = form_module.primitiveTypeList;
        var getType = function(index){
            var type = params.typelists[index].type;
            if (
                form_module.primitiveTypeList.indexOf(type) != -1
            ){
                type = params.typelists[index].type2;
            }
            return type;
        }
        var localDatabase = {};
        var generateData = function(typeid, valueid, currentPath){
            return new Promise(function(rs, rj){
                var value, index, typeContent, t_id, dataTypeOfArray, content;
                var type;
                if (isNaN(parseInt(typeid))) type = typeid;
                else type = getType(typeDict[typeid]);
                var data;
                switch (type) {
                    case "nation_city":
                        if (valueid) data = {
                            values: params.values[valueDict[valueid]].content
                        };
                        else data = {};
                        rs(data);
                        break;
                    case "position_list":
                        data = {};
                        data[typeid] = [];
                        if (valueid){
                            var index = typeDict[typeid];
                            var typeContent = params.typelists[index].content;
                            var t_id = typeContent.typeof;
                            var valueContent = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                            valueContent.forEach(function(elt){
                                data[typeid].push(generateData(t_id, elt));
                            });
                        }
                        rs(data);
                        break;
                    case "employee_list":
                        if (valueid) data = {
                            values: params.values[valueDict[valueid]].content
                        };
                        else data = {};
                        rs(data);
                        // data = {};
                        // data[typeid] = [];
                        // if (valueid){
                        //     var index = typeDict[typeid];
                        //     var typeContent = params.typelists[index].content;
                        //     var t_id = typeContent.typeof;
                        //     var valueContent = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                        //     valueContent.forEach(function(elt){
                        //         data[typeid].push(generateData(t_id, elt));
                        //     });
                        // }
                        // rs(data);
                        break;
                    case "number":
                        if (valueid) data = parseInt(params.values[valueDict[valueid]].content, 10);
                        else data = 0;
                        rs(data);
                        break;
                    case "currency":
                        if (valueid) data = parseInt(params.values[valueDict[valueid]].content, 10);
                        else data = 0;
                        rs(data);
                        break;
                    case "string":
                    case "phonenumber":
                    case "website":
                    case "gps":
                    case "note":
                    case "html":
                    case "variable_input":
                    case "variable_textarea":
                    case "email_address":
                        if (valueid) data = params.values[valueDict[valueid]].content;
                        else data = "";
                        rs(data);
                        break;
                    case "date":
                    case "datetime":
                    case "datemonth":
                    case "boolean":
                        if (valueid) data = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                        else data = "";
                        rs(data);
                        break;
                    case "hour_period":
                        if (valueid) data = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                        else data = "";
                        rs(data);
                        break;
                    case "time":
                        data = params.values[valueDict[valueid]].content;
                        rs(data);
                        break;
                    case "user":
                    // case "language":
                    case "geopos":
                    case "member_of_position":
                    case "member_of_people":
                    case "member_of_employee":
                    case "member_of_worktime_machines":
                    case "member_of_department":
                    case "member_of_assets":
                    case "member_of_instruments_and_tools":
                    case "member_of_assets_instruments_and_tools":
                    case "member_of_warehouses":
                    case "member_of_welcome_templates":
                    case "member_of_allowance_policy_groups":
                    case "member_of_bonus_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_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_salary_policy_groups":
                    case "member_of_trade_union_policy_groups":
                    case "member_of_overtime_policy_groups":
                    case "member_of_offboarding_types":
                    case "member_of_offboarding_reasons":
                    case "multiselect_offboarding_reasons":
                    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_employment_contract_types":
                    case "member_of_insurance_policy_groups":
                    case "member_of_training_program_groups":
                    case "member_of_shifts":
                    case "member_of_insurance_policies":
                    case "member_of_tax_policies":
                    case "member_of_trade_union_policies":
                    case "member_of_benefit_policies":
                    case "member_of_allowance_policies":
                    case "member_of_bonus_policies":
                    case "member_of_overtime_policies":
                    case "member_of_punishment_policies":
                    case "member_of_leave_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_nations":
                    case "member_of_cities":
                    case "member_of_ethnics":
                    case "member_of_religions":
                    case "member_of_document_types":
                    case "member_of_orgs":
                    case "member_of_document_groups":
                    case "member_of_document_folders":
                    case "member_of_template_groups":
                        if (valueid) data = {
                            value: params.values[valueDict[valueid]].content
                        };
                        else data = {};
                        rs(data);
                        break;
                    case "any_file":
                    case "image_file":
                        data_module.makeImageContent(EncodingClass.string.toVariable(params.values[valueDict[valueid]].content)).then(function(result){
                            rs(result);
                        });
                        break;
                    case "enum":
                        if (valueid) data = {
                            value: params.values[valueDict[valueid]].content
                        };
                        else data = {};
                        rs(data);
                        break;
                    case "userlist":
                    case "members_of_shifts":
                    case "members_of_locations":
                    case "members_of_partner_class":
                        if (valueid) data = {
                            values: EncodingClass.string.toVariable(params.values[valueDict[valueid]].content)
                        };
                        else data = {};
                        rs(data);
                        break;
                    case "structure":
                        index = typeDict[typeid];
                        typeContent = params.typelists[index].content.details;
                        data = {};
                        if (valueid) {
                            var t_values = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                            var dict_values = {};
                            t_values.forEach(function(elt){
                                dict_values[elt.localid] = elt.valueid;
                            });
                            var t_data = {};
                            for (var i = 0; i < typeContent.length; i++){
                                value = generateData(typeContent[i].type, dict_values[typeContent[i].localid], typeContent[i]);
                                // if (value === null) return null;
                                t_data[typeContent[i].localid] = value;
                            }
                            Promise.all(Object.values(t_data)).then(function(result){
                                var a = Object.keys(t_data);
                                for (var i = 0; i < a.length; i++){
                                    if (result[i] === null){
                                        rs(null);
                                        break;
                                    }
                                    if (result[i] && result[i].detailUnion){
                                        data[a[i]] = {
                                            value: result[i].value
                                        }
                                        Object.assign(data, result[i].detailUnion);
                                    }
                                    else data[a[i]] = result[i];
                                }
                                rs(data);
                            }, function(message){rj(message);});
                        }
                        break;
                    case "extends_structure":
                        index = typeDict[typeid];
                        typeContent = params.typelists[index].content;
                        t_id = typeContent.typeof;
                        content = params.typelists[typeDict[t_id]].content.details.concat(typeContent.details);
                        while (params.typelists[typeDict[t_id]].type == "extends_structure"){
                            t_id = params.typelists[typeDict[t_id]].content.typeof;
                            content = params.typelists[typeDict[t_id]].content.details.concat(content)
                        }
                        data = {};
                        if (valueid) {
                            var t_values = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                            var dict_values = {};
                            t_values.forEach(function(elt){
                                dict_values[elt.localid] = elt.valueid;
                            });
                            var t_data = {};
                            for (var i = 0; i < content.length; i++){
                                value = generateData(content[i].type, dict_values[content[i].localid], content[i]);
                                // if (value === null) return null;
                                t_data[content[i].localid] = value;
                            }
                            Promise.all(Object.values(t_data)).then(function(result){
                                var a = Object.keys(t_data);
                                for (var i = 0; i < a.length; i++){
                                    if (result[i] === null){
                                        rs(null);
                                        break;
                                    }
                                    if (result[i] && result[i].detailUnion){
                                        data[a[i]] = {
                                            value: result[i].value
                                        }
                                        Object.assign(data, result[i].detailUnion);
                                    }
                                    else data[a[i]] = result[i];
                                }
                                rs(data);
                            }, function(message){rj(message);})
                        }
                        break;
                    case "extends_enum":
                        if (valueid) data = {
                            value: params.values[valueDict[valueid]].content
                        };
                        else data = {};
                        rs(data);
                        break;
                    case "array":
                        index = typeDict[typeid];
                        typeContent = params.typelists[index].content;
                        t_id = typeContent.typeof;
                        data = {};
                        if (valueid) {
                            var valueContent = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                            dataTypeOfArray = contentModule.checkDatatypeOfArray(params.typelists, t_id);
                            if (dataTypeOfArray == "advanced"){
                                data[typeid] = [];
                                t_type = getType(typeDict[t_id]);
                                if (t_type == "structure" || t_type == "extends_structure"){
                                    var t_data = [];
                                    for (i = 0; i < valueContent.length; i++){
                                        var x = generateData(t_id, valueContent[i]);
                                        t_data.push(x);
                                    }
                                    Promise.all(t_data).then(function(result){
                                        data[typeid] = result;
                                        rs(data);
                                    }, function(message){rj(message);});
                                }
                                else {
                                    var t_data = [];
                                    for (i = 0; i < valueContent.length; i++){
                                        t_data.push(generateData(t_id, valueContent[i]));
                                    }
                                    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: []};
                                t_type = getType(typeDict[t_id]);
                                if (t_type == "structure" || t_type == "extends_structure"){
                                    content = params.typelists[typeDict[t_id]].content.details;
                                    var t_dict = {};
                                    content.forEach(function(elt){
                                        t_dict[elt.localid] = elt.type;
                                    });
                                    var t_data = [];
                                    for (i = 0; i < valueContent.length; i++){
                                        t_data.push(generateData(t_id, valueContent[i]));
                                    }
                                    Promise.all(t_data).then(function(result){
                                        result.forEach(function(x){
                                            var keys = Object.keys(x);
                                            keys.forEach(function(elt){
                                                if (x[elt] instanceof Object) x[elt] = x[elt].value;
                                            })
                                            data[typeid].records.push(x);
                                        });
                                        rs(data);
                                    }, function(message){rj(message);})
                                }
                                else {
                                    var t_data = [];
                                    for (i = 0; i < valueContent.length; i++){
                                        t_data.push(generateData(t_id, valueContent[i]));
                                    }
                                    Promise.all(t_data).then(function(result){
                                        result.forEach(function(x){
                                            if (x instanceof Object) x = x.value;
                                            var st = {};
                                            st[t_id] = x;
                                            data[typeid].records.push(st);
                                        });
                                        rs(data);
                                    }, function(message){rj(message);})
                                }
                            }
                        }
                        else {
                            rs([])
                        }
                        break;
                    case "union":
                        if (valueid) {
                            var t_values = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                            data = {
                                value: t_values.value,
                                detailUnion: {}
                            };
                            var detailUnion = {};
                            t_values.detailUnion.forEach(function(elt){
                                detailUnion[elt.localid] = elt.valueid;
                            });
                            var t_data = {};
                            if (currentPath.detailUnion[data.value]){
                                currentPath.detailUnion[data.value].forEach(function(elt){
                                    t_data[elt.localid] = generateData(elt.type, detailUnion[elt.localid], elt);
                                });
                            }
                            Promise.all(Object.values(t_data)).then(function(result){
                                var a = Object.keys(t_data);
                                for (var i = 0; i < a.length; i++){
                                    if (result[i] === null){
                                        rs(null);
                                        break;
                                    }
                                    data.detailUnion[a[i]] = result[i];
                                }
                                rs(data);
                            }, function(message){rj(message);});
                        }
                        else rs({});
                        break;
                    default:
                        rj("undefined type: " + type);
                }
            });
        };
        generateData(typeid, valueid).then(function(result){
            if (result === null) resolve(null);
            resolve(result)
        }, function(message){console.log(message); reject(message);});
    });
};

form_module.makeDataToSave = function(formView, typeid, typelists){
    var typeDict = {};
    typelists.forEach(function(elt, index){
        typeDict[elt.id] = index;
    });
    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 value, index, typeContent, t_id, dataTypeOfArray, content;
        var type;
        if (isNaN(parseInt(typeid, 10))) type = typeid;
        else type = getType(typeDict[typeid]);
        switch (type) {
            case "nation_city":
                if (elt && elt.require && valueContent.value.length < 2) {
                    ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return null;
                }
                data = {
                    values: valueContent.value,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "position_list":
                data = [];
                index = typeDict[typeid];
                typeContent = typelists[index].content;
                t_id = typeContent.typeof;
                for (var i = 0; i < valueContent[typeid].length; i++){
                    var x = generateData(valueContent[typeid][i], t_id);
                    if (x === null) return null;
                    data.push(x);
                }
                data = {
                    value: data,
                    typeid: typeid,
                    // localid: elt ? elt.localid : undefined,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "employee_list":
                if (elt && elt.require && valueContent.values.length == 0) {
                    ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return null;
                }
                data = {
                    values: valueContent.values,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
                // data = [];
                // index = typeDict[typeid];
                // typeContent = typelists[index].content;
                // t_id = typeContent.typeof;
                // for (var i = 0; i < valueContent[typeid].length; i++){
                //     var x = generateData(valueContent[typeid][i], t_id);
                //     if (x === null) return null;
                //     data.push(x);
                // }
                // data = {
                //     value: data,
                //     typeid: typeid,
                //     // localid: elt ? elt.localid : undefined,
                //     privtype: type
                // };
                // if (elt) data.localid = elt.localid;
                // break;
            case "number":
                if (elt && elt.require && valueContent == "") {
                    ModalElement.alert({message: "Chưa nhập " + elt.name});
                    return null;
                }
                data = {
                    value: valueContent,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "currency":
                if (elt && elt.require && valueContent == "") {
                    ModalElement.alert({message: "Chưa nhập " + elt.name});
                    return null;
                }
                data = {
                    value: valueContent,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "string":
            case "phonenumber":
            case "website":
            case "gps":
            case "note":
            case "html":
            case "variable_input":
            case "variable_textarea":
            case "email_address":
                valueContent = valueContent.trim();
                if (elt && elt.require && valueContent == "") {
                    absol.form.traversal(formView, function(path){
                        if (path.node["$" + elt.localid]) {
                            ModalElement.alert({
                                message: "Chưa nhập " + elt.name,
                                func: function(){
                                    path.node["$" + elt.localid].domElt.focus();
                                }
                            });
                            path.stop();
                        }
                    });
                    return null;
                }
                data = {
                    value: valueContent,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "date":
            case "datetime":
            case "datemonth":
            case "time":
            case "boolean":
                data = {
                    value: valueContent,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "hour_period":
                data = {
                    value: valueContent,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "user":
            // case "language":
            case "geopos":
            case "member_of_position":
            case "member_of_people":
            case "member_of_employee":
            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_welcome_templates":
            case "member_of_allowance_policy_groups":
            case "member_of_bonus_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_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_salary_policy_groups":
            case "member_of_trade_union_policy_groups":
            case "member_of_overtime_policy_groups":
            case "member_of_offboarding_types":
            case "member_of_offboarding_reasons":
            case "multiselect_offboarding_reasons":
            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_employment_contract_types":
            case "member_of_insurance_policy_groups":
            case "member_of_training_program_groups":
            case "member_of_shifts":
            case "member_of_insurance_policies":
            case "member_of_tax_policies":
            case "member_of_trade_union_policies":
            case "member_of_benefit_policies":
            case "member_of_allowance_policies":
            case "member_of_bonus_policies":
            case "member_of_overtime_policies":
            case "member_of_punishment_policies":
            case "member_of_leave_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_nations":
            case "member_of_cities":
            case "member_of_ethnics":
            case "member_of_religions":
            case "member_of_document_types":
            case "member_of_orgs":
            case "member_of_template_groups":
                if (elt && elt.require && valueContent.value == 0) {
                    ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return null;
                }
                data = {
                    value: valueContent.value,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "member_of_department":
                data = {
                    value: valueContent.value,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "member_of_document_groups":
                data = {
                    value: valueContent.value,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "member_of_document_folders":
                data = {
                    value: valueContent.value,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "image_file":
                data = {
                    value: valueContent ? valueContent.id : null,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "any_file":
                data = {
                    value: valueContent ? valueContent.id : null,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "enum":
                if (elt && elt.require && valueContent.value == 0) {
                    ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return null;
                }
                var t_type = typelists[typeDict[typeid]].type;
                data = {
                    value: valueContent.value,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: t_type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "userlist":
            case "members_of_shifts":
            case "members_of_locations":
            case "members_of_partner_class":
                if (elt && elt.require && valueContent.values.length == 0) {
                    ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return null;
                }
                data = {
                    value: valueContent.values,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "structure":
                index = typeDict[typeid];
                typeContent = typelists[index].content.details;
                data = [];
                for (var i = 0; i < typeContent.length; i++){
                    value = generateData(valueContent[typeContent[i].localid], typeContent[i].type, typeContent[i]);
                    if (value === null) return null;
                    data.push(value);
                }
                data = {
                    value: data,
                    typeid: typeid,
                    // localid: elt ? elt.localid : undefined,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "extends_structure":
                index = typeDict[typeid];
                typeContent = typelists[index].content;
                t_id = typeContent.typeof;
                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++){
                    value = generateData(valueContent[content[i].localid], content[i].type, content[i]);
                    if (value === null) return null;
                    data.push(value);
                }
                data = {
                    value: data,
                    typeid: typeid,
                    // localid: elt ? elt.localid : undefined,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "extends_enum":
                if (elt && elt.require && valueContent.value == 0) {
                    ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return null;
                }
                data = {
                    value: valueContent.value,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "array":
                index = typeDict[typeid];
                typeContent = typelists[index].content;
                t_id = typeContent.typeof;
                data = [];
                dataTypeOfArray = contentModule.checkDatatypeOfArray(typelists, t_id);
                if (dataTypeOfArray == "advanced"){
                    t_type = getType(typeDict[t_id]);
                    if (t_type == "structure" || t_type == "extends_structure"){
                        for (i = 0; i < valueContent[typeid].length; i++){
                            var x = generateData(valueContent[typeid][i], t_id);
                            if (x === null) return null;
                            // var subdata = {
                            //     value: x,
                            //     privtype: t_type,
                            //     typeid: t_id
                            // };
                            data.push(x);
                        }
                    }
                    else {
                        for (i = 0; i < valueContent[typeid].length; i++){
                            var x = generateData(valueContent[typeid][i][t_id], t_id);
                            if (x === null) return null;
                            // var subdata = {
                            //     value: x,
                            //     privtype: t_type,
                            //     typeid: t_id
                            // };
                            data.push(x);
                        }
                    }
                }
                else {
                    t_type = getType(typeDict[t_id]);
                    if (t_type == "structure" || t_type == "extends_structure"){
                        content = typelists[typeDict[t_id]].content.details;
                        var t_dict = {};
                        content.forEach(function(elt){
                            t_dict[elt.localid] = elt.type;
                        })
                        for (i = 0; i < valueContent[typeid].records.length; i++){
                            var keys = Object.keys(valueContent[typeid].records[i]);
                            var subdata = {
                                value: [],
                                privtype: t_type,
                                typeid: t_id
                            };
                            keys.forEach(function(elt){
                                subdata.value.push({
                                    value: valueContent[typeid].records[i][elt],
                                    localid: elt,
                                    typeid: t_dict[elt],
                                    privtype: typelists[typeDict[t_dict[elt]]].type
                                });
                            })
                            data.push(subdata);
                        }
                    }
                    else {
                        for (i = 0; i < valueContent[typeid].records.length; i++){
                            var x = generateData(valueContent[typeid].records[i][t_id], t_id);
                            if (x === null) return null;
                            data.push(x);
                        }
                    }
                }
                data = {
                    value: data,
                    typeid: typeid,
                    // localid: elt.localid,
                    privtype: type
                };
                if (elt) data.localid = elt.localid;
                break;
            case "union":
                if (elt && elt.require && valueContent.value == 0) {
                    ModalElement.alert({message: "Chưa chọn " + elt.name});
                    return null;
                }
                data = {
                    value: valueContent.value,
                    detailUnion: [],
                    typeid: elt.typeOfUnion,
                    // localid: elt ? elt.localid : undefined,
                    privtype: type
                };
                if (elt.detailUnion[data.value]){
                    for (var i = 0; i < elt.detailUnion[data.value].length; i++){
                        value = generateData(formView.props[elt.detailUnion[data.value][i].localid], elt.detailUnion[data.value][i].type, elt.detailUnion[data.value][i]);
                        if (value === null) return null;
                        data.detailUnion.push(value);
                    }
                }
                if (elt) data.localid = elt.localid;
                break;
            default:

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

    if (data === null) return null;

    return data;
};

form_module.convertOutputFormToNewVersion = function(params){
    var typeid, valueid;
    typeid = params.typeid;
    valueid = params.valueid;
    return new Promise(function(resolve, reject){
        var typeDict = contentModule.makeDictionaryIndex(params.typelists);
        var valueDict = contentModule.makeDictionaryIndex(params.values);
        var primitiveTypeList = form_module.primitiveTypeList;
        var getType = function(index){
            var type = params.typelists[index].type;
            if (
                form_module.primitiveTypeList.indexOf(type) != -1
            ){
                type = params.typelists[index].type2;
            }
            return type;
        }
        var localDatabase = {};
        var generateData = function(typeid, valueid, currentPath){
            return new Promise(function(rs, rj){
                var value, index, typeContent, t_id, dataTypeOfArray, content;
                var type;
                if (isNaN(parseInt(typeid))) type = typeid;
                else type = getType(typeDict[typeid]);
                var data;
                switch (type) {
                    case "nation_city":
                        if (valueid) data = {
                            values: params.values[valueDict[valueid]].content
                        };
                        else data = {};
                        rs(data);
                        break;
                    case "position_list":
                        data = {};
                        data[typeid] = [];
                        if (valueid){
                            var index = typeDict[typeid];
                            var typeContent = params.typelists[index].content;
                            var t_id = typeContent.typeof;
                            var valueContent = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                            valueContent.forEach(function(elt){
                                data[typeid].push(generateData(t_id, elt));
                            });
                        }
                        rs(data);
                        break;
                    case "employee_list":
                        if (valueid) data = {
                            values: params.values[valueDict[valueid]].content
                        };
                        else data = {};
                        rs(data);
                        // data = {};
                        // data[typeid] = [];
                        // if (valueid){
                        //     var index = typeDict[typeid];
                        //     var typeContent = params.typelists[index].content;
                        //     var t_id = typeContent.typeof;
                        //     var valueContent = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                        //     valueContent.forEach(function(elt){
                        //         data[typeid].push(generateData(t_id, elt));
                        //     });
                        // }
                        // rs(data);
                        break;
                    case "number":
                        if (valueid) data = parseInt(params.values[valueDict[valueid]].content, 10);
                        else data = 0;
                        rs(data);
                        break;
                    case "currency":
                        if (valueid) data = parseInt(params.values[valueDict[valueid]].content, 10);
                        else data = 0;
                        rs(data);
                        break;
                    case "string":
                    case "phonenumber":
                    case "website":
                    case "gps":
                    case "html":
                    case "variable_input":
                    case "variable_textarea":
                    case "email_address":
                        if (valueid) data = params.values[valueDict[valueid]].content;
                        else data = "";
                        rs(data);
                        break;
                    case "date":
                    case "datetime":
                    case "datemonth":
                    case "boolean":
                        if (valueid) data = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                        else data = "";
                        rs(data);
                        break;
                    case "hour_period":
                        if (valueid) data = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                        else data = "";
                        rs(data);
                        break;
                    case "time":
                        data = params.values[valueDict[valueid]].content;
                        rs(data);
                        break;
                    case "user":
                    // case "language":
                    case "geopos":
                    case "member_of_position":
                    case "member_of_people":
                    case "member_of_employee":
                    case "member_of_worktime_machines":
                    case "member_of_department":
                    case "member_of_assets":
                    case "member_of_instruments_and_tools":
                    case "member_of_assets_instruments_and_tools":
                    case "member_of_warehouses":
                    case "member_of_welcome_templates":
                    case "member_of_allowance_policy_groups":
                    case "member_of_bonus_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_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_salary_policy_groups":
                    case "member_of_trade_union_policy_groups":
                    case "member_of_overtime_policy_groups":
                    case "member_of_offboarding_types":
                    case "member_of_offboarding_reasons":
                    case "multiselect_offboarding_reasons":
                    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_employment_contract_types":
                    case "member_of_insurance_policy_groups":
                    case "member_of_training_program_groups":
                    case "member_of_shifts":
                    case "member_of_insurance_policies":
                    case "member_of_tax_policies":
                    case "member_of_trade_union_policies":
                    case "member_of_benefit_policies":
                    case "member_of_allowance_policies":
                    case "member_of_bonus_policies":
                    case "member_of_overtime_policies":
                    case "member_of_punishment_policies":
                    case "member_of_leave_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_nations":
                    case "member_of_cities":
                    case "member_of_ethnics":
                    case "member_of_religions":
                    case "member_of_document_types":
                    case "member_of_orgs":
                    case "member_of_document_groups":
                    case "member_of_document_folders":
                    case "member_of_template_groups":
                        if (valueid) data = {
                            value: params.values[valueDict[valueid]].content
                        };
                        else data = {};
                        rs(data);
                        break;
                    case "any_file":
                    case "image_file":
                        data_module.makeImageContent(EncodingClass.string.toVariable(params.values[valueDict[valueid]].content)).then(function(result){
                            rs(result);
                        });
                        break;
                    case "enum":
                        if (valueid) data = {
                            value: params.values[valueDict[valueid]].content
                        };
                        else data = {};
                        rs(data);
                        break;
                    case "userlist":
                    case "members_of_shifts":
                    case "members_of_locations":
                    case "members_of_partner_class":
                        if (valueid) data = {
                            values: EncodingClass.string.toVariable(params.values[valueDict[valueid]].content)
                        };
                        else data = {};
                        rs(data);
                        break;
                    case "structure":
                        index = typeDict[typeid];
                        typeContent = params.typelists[index].content.details;
                        data = {};
                        if (valueid) {
                            var t_values = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                            var dict_values = {};
                            t_values.forEach(function(elt){
                                dict_values[elt.localid] = elt.valueid;
                            });
                            var t_data = {};
                            for (var i = 0; i < typeContent.length; i++){
                                value = generateData(typeContent[i].type, dict_values[typeContent[i].localid], typeContent[i]);
                                // if (value === null) return null;
                                t_data[typeContent[i].localid] = value;
                            }
                            Promise.all(Object.values(t_data)).then(function(result){
                                var a = Object.keys(t_data);
                                for (var i = 0; i < a.length; i++){
                                    if (result[i] === null){
                                        rs(null);
                                        break;
                                    }
                                    if (result[i] && result[i].detailUnion){
                                        data[a[i]] = {
                                            value: result[i].value
                                        }
                                        Object.assign(data, result[i].detailUnion);
                                    }
                                    else data[a[i]] = result[i];
                                }
                                rs(data);
                            }, function(message){rj(message);});
                        }
                        break;
                    case "extends_structure":
                        index = typeDict[typeid];
                        typeContent = params.typelists[index].content;
                        t_id = typeContent.typeof;
                        content = params.typelists[typeDict[t_id]].content.details.concat(typeContent.details);
                        while (params.typelists[typeDict[t_id]].type == "extends_structure"){
                            t_id = params.typelists[typeDict[t_id]].content.typeof;
                            content = params.typelists[typeDict[t_id]].content.details.concat(content)
                        }
                        data = {};
                        if (valueid) {
                            var t_values = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                            var dict_values = {};
                            t_values.forEach(function(elt){
                                dict_values[elt.localid] = elt.valueid;
                            });
                            var t_data = {};
                            for (var i = 0; i < content.length; i++){
                                value = generateData(content[i].type, dict_values[content[i].localid], content[i]);
                                // if (value === null) return null;
                                t_data[content[i].localid] = value;
                            }
                            Promise.all(Object.values(t_data)).then(function(result){
                                var a = Object.keys(t_data);
                                for (var i = 0; i < a.length; i++){
                                    if (result[i] === null){
                                        rs(null);
                                        break;
                                    }
                                    if (result[i] && result[i].detailUnion){
                                        data[a[i]] = {
                                            value: result[i].value
                                        }
                                        Object.assign(data, result[i].detailUnion);
                                    }
                                    else data[a[i]] = result[i];
                                }
                                rs(data);
                            }, function(message){rj(message);})
                        }
                        break;
                    case "extends_enum":
                        if (valueid) data = {
                            value: params.values[valueDict[valueid]].content
                        };
                        else data = {};
                        rs(data);
                        break;
                    case "array":
                        index = typeDict[typeid];
                        typeContent = params.typelists[index].content;
                        t_id = typeContent.typeof;
                        data = {};
                        if (valueid) {
                            var valueContent = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                            dataTypeOfArray = contentModule.checkDatatypeOfArray(params.typelists, t_id);
                            if (dataTypeOfArray == "advanced"){
                                data[typeid] = [];
                                t_type = getType(typeDict[t_id]);
                                if (t_type == "structure" || t_type == "extends_structure"){
                                    var t_data = [];
                                    for (i = 0; i < valueContent.length; i++){
                                        var x = generateData(t_id, valueContent[i]);
                                        t_data.push(x);
                                    }
                                    Promise.all(t_data).then(function(result){
                                        data[typeid] = result;
                                        rs(data);
                                    }, function(message){rj(message);});
                                }
                                else {
                                    var t_data = [];
                                    for (i = 0; i < valueContent.length; i++){
                                        t_data.push(generateData(t_id, valueContent[i]));
                                    }
                                    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: []};
                                t_type = getType(typeDict[t_id]);
                                if (t_type == "structure" || t_type == "extends_structure"){
                                    content = params.typelists[typeDict[t_id]].content.details;
                                    var t_dict = {};
                                    content.forEach(function(elt){
                                        t_dict[elt.localid] = elt.type;
                                    });
                                    var t_data = [];
                                    for (i = 0; i < valueContent.length; i++){
                                        t_data.push(generateData(t_id, valueContent[i]));
                                    }
                                    Promise.all(t_data).then(function(result){
                                        result.forEach(function(x){
                                            var keys = Object.keys(x);
                                            keys.forEach(function(elt){
                                                if (x[elt] instanceof Object) x[elt] = x[elt].value;
                                            })
                                            data[typeid].records.push(x);
                                        });
                                        rs(data);
                                    }, function(message){rj(message);})
                                }
                                else {
                                    var t_data = [];
                                    for (i = 0; i < valueContent.length; i++){
                                        t_data.push(generateData(t_id, valueContent[i]));
                                    }
                                    Promise.all(t_data).then(function(result){
                                        result.forEach(function(x){
                                            if (x instanceof Object) x = x.value;
                                            var st = {};
                                            st[t_id] = x;
                                            data[typeid].records.push(st);
                                        });
                                        rs(data);
                                    }, function(message){rj(message);})
                                }
                            }
                        }
                        else {
                            rs([])
                        }
                        break;
                    case "union":
                        if (valueid) {
                            var t_values = EncodingClass.string.toVariable(params.values[valueDict[valueid]].content);
                            data = {
                                value: t_values.value,
                                detailUnion: {}
                            };
                            var detailUnion = {};
                            t_values.detailUnion.forEach(function(elt){
                                detailUnion[elt.localid] = elt.valueid;
                            });
                            var t_data = {};
                            if (currentPath.detailUnion[data.value]){
                                currentPath.detailUnion[data.value].forEach(function(elt){
                                    t_data[elt.localid] = generateData(elt.type, detailUnion[elt.localid], elt);
                                });
                            }
                            Promise.all(Object.values(t_data)).then(function(result){
                                var a = Object.keys(t_data);
                                for (var i = 0; i < a.length; i++){
                                    if (result[i] === null){
                                        rs(null);
                                        break;
                                    }
                                    data.detailUnion[a[i]] = result[i];
                                }
                                rs(data);
                            }, function(message){rj(message);});
                        }
                        else rs({});
                        break;
                    default:
                        rj("undefined type: " + type);
                }
            });
        };
        generateData(typeid, valueid).then(function(result){
            if (result === null) resolve(null);
            resolve(result)
        }, function(message){console.log(message); reject(message);});
    });
};

form_module.getNameDictOfTypelist = function(content, dict){
    for (var i = 0; i < content.details.length; i++){
        dict[content.details[i].localid] = 1;
        if (content.details[i].localid.type == "union"){
            var keys = Object.keys(content.details[i].detailUnion);
            for (var j = 0; j < keys.length; j++){
                form_module.getNameDictOfTypelist(content.details[i].detailUnion[keys[j]], dict);
            }
        }
    }
};

form_module.makeLayoutFormDictionary = function(form, nameDict, dictionary){
    for (var i = 0; i < form.length; i++){
        if (nameDict[form[i].attributes.name]) {
            dictionary.layout[form[i].attributes.name] = form[i];
        }
        else if (form[i].children){
            form_module.makeLayoutFormDictionary(form[i].children, nameDict, dictionary);
        }
    }
};

form_module.makeCircuitFormDictionary = function(circuit, dictionary){
    for (var i = 0; i < circuit.blocks.length; i++){
        dictionary.circuit.blocks[circuit.blocks[i].attributes.ident] = circuit.blocks[i];
    }
    for (var i = 0; i < circuit.lines.length; i++){
        dictionary.circuit.lines[circuit.lines[i].attributes.ident] = circuit.lines[i];
    }
};

form_module.convertLayoutInputFormToNewVersion = function(content, dictionary){
    var temp, t_name;
    for (var i = 0; i < content.length; i++){
        if (content[i].attributes && content[i].attributes.name){
            if (content[i].attributes.name.indexOf("_employeeid_container") != -1) {
                if (content[i].children[0].attributes && content[i].children[0].attributes.name && content[i].children[0].attributes.name.indexOf("_choose_company") != -1) {
                    t_name = content[i].attributes.name;
                    content[i] = content[i].children[2];
                    content[i].attributes.name = t_name;
                    content[i].children[1].tag = "TreeLeafComboBox";
                }
            }
            else if (content[i].attributes.name.indexOf("_positionid_container") != -1) {
                if (content[i].children[0].attributes && content[i].children[0].attributes.name && content[i].children[0].attributes.name.indexOf("_choose_company") != -1) {
                    t_name = content[i].attributes.name;
                    content[i] = content[i].children[2];
                    content[i].attributes.name = t_name;
                    content[i].children[1].tag = "TreeLeafComboBox";
                }
            }
            // else if (content[i].attributes.name.indexOf("_attachments_container") != -1) {
            //     if (dictionary.layout[content[i].children[1].attributes.name]){
            //         temp = EncodingClass.string.duplicate(dictionary.layout[content[i].children[1].attributes.name]);
            //         content[i] = temp;
            //     }
            //     // content[i] = content[i].children[1];
            // }
            else if (dictionary.layout[content[i].attributes.name]){
                if (
                    !(content[i].tag && dictionary.layout[content[i].attributes.name].tag)
                    || (content[i].tag && !dictionary.layout[content[i].attributes.name].tag)
                    || (content[i].tag && dictionary.layout[content[i].attributes.name].tag && (content[i].tag != dictionary.layout[content[i].attributes.name].tag))
                ){
                    temp = EncodingClass.string.duplicate(dictionary.layout[content[i].attributes.name]);
                    content[i] = temp;
                }
            }
            if (content[i].children) {
                form_module.convertLayoutInputFormToNewVersion(content[i].children, dictionary);
            }
        }
        else if (content[i].children) {
            form_module.convertLayoutInputFormToNewVersion(content[i].children, dictionary);
        }
    }
};

form_module.convertCircuitInputFormToNewVersion = function(circuit, dictionary){
    var blockDict = {};
    var count = circuit.blocks.length;
    var isEmp = false;
    var isPos = false;
    for (var i = 0; i < count; i++){
        if (circuit.blocks[i].attributes.ident && dictionary.circuit.blocks[circuit.blocks[i].attributes.ident]) {
            if (!circuit.blocks[i].attributes.isModified) {
                circuit.blocks[i] = dictionary.circuit.blocks[circuit.blocks[i].attributes.ident];
                blockDict[circuit.blocks[i].attributes.ident] = 1;
            }
        }
        if (!circuit.blocks[i].attributes.ident && dictionary.circuit.blocks[circuit.blocks[i].attributes.id]) {
            circuit.blocks[i] = dictionary.circuit.blocks[circuit.blocks[i].attributes.id];
            blockDict[circuit.blocks[i].attributes.id] = 1;
        }
        if (circuit.blocks[i].attributes.ident == "load_member_of_employee_items" && circuit.blocks[i].attributes.args && circuit.blocks[i].attributes.args.length == 1 && circuit.blocks[i].attributes.args[0] == "departmentid"){
            isEmp = true;
            circuit.blocks[i].attributes.body = "console.log(form_module.tag2OnCreated.member_of_employee(this.fragment));return form_module.tag2OnCreated.member_of_employee(this.fragment);";
            circuit.blocks[i].attributes.args = [];
            circuit.blocks.push({
                attributes: {
                    id: "member_of_employee_frag_created",
                    ident: "member_of_employee_frag_created"
                },
                tag: "CBEntry"
            });
            var t_line = {
                u: "member_of_employee_frag_created",
                uPin: "signal",
                v: "load_member_of_employee_items",
                vPin: "exec"
            };
            t_line.attributes = {
                ident: t_line.u + t_line.uPin + t_line.v + t_line.vPin
            };
            circuit.lines.push(t_line);
        }
        if (circuit.blocks[i].attributes.ident == "load_member_of_position_items" && circuit.blocks[i].attributes.args && circuit.blocks[i].attributes.args.length == 1 && circuit.blocks[i].attributes.args[0] == "departmentid"){
            isPos = true;
            circuit.blocks[i].attributes.body = "return form_module.tag2OnCreated.member_of_position();";
            circuit.blocks[i].attributes.args = [];
            circuit.blocks.push({
                attributes: {
                    id: "member_of_position_frag_created",
                    ident: "member_of_position_frag_created"
                },
                tag: "CBEntry"
            });
            var t_line = {
                u: "member_of_position_frag_created",
                uPin: "signal",
                v: "load_member_of_position_items",
                vPin: "exec"
            };
            t_line.attributes = {
                ident: t_line.u + t_line.uPin + t_line.v + t_line.vPin
            };
            circuit.lines.push(t_line);
        }
    }
    var keys = Object.keys(dictionary.circuit.blocks);
    keys.forEach(function(elt){
        if (!blockDict[elt]) circuit.blocks.push(dictionary.circuit.blocks[elt]);
    });
    var lineDict = {};
    for (var i = 0; i < circuit.lines.length; i++){
        if (circuit.lines[i].attributes && circuit.lines[i].attributes.ident && dictionary.circuit.lines[circuit.lines[i].attributes.ident]) {
            if (!circuit.lines[i].attributes.isModified) {
                circuit.lines[i] = dictionary.circuit.lines[circuit.lines[i].attributes.ident];
                lineDict[circuit.lines[i].attributes.ident] = 1;
            }
        }
        if ((!circuit.lines[i].attributes || !circuit.lines[i].attributes.ident) && dictionary.circuit.lines[circuit.lines[i].u + circuit.lines[i].uPin + circuit.lines[i].v + circuit.lines[i].vPin]) {
            circuit.lines[i] = dictionary.circuit.lines[circuit.lines[i].u + circuit.lines[i].uPin + circuit.lines[i].v + circuit.lines[i].vPin];
            lineDict[circuit.lines[i].u + circuit.lines[i].uPin + circuit.lines[i].v + circuit.lines[i].vPin] = 1;
        }
    }
    keys = Object.keys(dictionary.circuit.lines);
    keys.forEach(function(elt){
        if (!lineDict[elt]) circuit.lines.push(dictionary.circuit.lines[elt]);
    });
    if (isEmp) {
        count = circuit.blocks.length;
        for (var i = 0; i < count; i++){
            if (
                circuit.blocks[i].attributes.ident == "member_of_employee_choose_company_frag_created"
                || circuit.blocks[i].attributes.ident == "load_member_of_employee_choose_company_items"
                || circuit.blocks[i].attributes.ident == "load_member_of_employee_choose_department_items"
                || circuit.blocks[i].attributes.ident == "load_member_of_employee_check_company_length"
            ){
                circuit.blocks.splice(i, 1);
                i--;
                count = circuit.blocks.length;
            }
        }
        count = circuit.lines.length;
        for (var i = 0; i < count; i++){
            if (
                circuit.lines[i].u == "load_member_of_employee_choose_company_items"
                || circuit.lines[i].v == "load_member_of_employee_choose_company_items"
                || circuit.lines[i].u == "load_member_of_employee_choose_department_items"
                || circuit.lines[i].v == "load_member_of_employee_choose_department_items"
                || circuit.lines[i].u == "load_member_of_employee_check_company_length"
                || circuit.lines[i].v == "load_member_of_employee_check_company_length"
            ){
                circuit.lines.splice(i, 1);
                i--;
                count = circuit.lines.length;
            }
        }
    }
    if (isPos) {
        count = circuit.blocks.length;
        for (var i = 0; i < count; i++){
            if (
                circuit.blocks[i].attributes.ident == "member_of_position_choose_company_frag_created"
                || circuit.blocks[i].attributes.ident == "load_member_of_position_choose_company_items"
                || circuit.blocks[i].attributes.ident == "load_member_of_position_choose_department_items"
            ){
                circuit.blocks.splice(i, 1);
                i--;
                count = circuit.blocks.length;
            }
        }
        count = circuit.lines.length;
        for (var i = 0; i < count; i++){
            if (
                circuit.lines[i].u == "load_member_of_position_choose_company_items"
                || circuit.lines[i].v == "load_member_of_position_choose_company_items"
                || circuit.lines[i].u == "load_member_of_position_choose_department_items"
                || circuit.lines[i].v == "load_member_of_position_choose_department_items"
            ){
                circuit.lines.splice(i, 1);
                i--;
                count = circuit.lines.length;
            }
        }
    }
};

form_module.defaultMobileInputFormForPrimitiveType = function(){
    var resolveFunc = function (content, rs) {
        content = EncodingClass.string.duplicate(content);
        content.forEach(function(elt){
            elt.name = elt.name + " (" + LanguageModule.text("txt_system") + ")"
            elt.id = "m_" + elt.formid;
        });
        rs(content);
    };
    var waitFunc = function (resolveFunc) {
        return function (rs, waitFunc, varname) {
            if (window[varname] == "ready") {
                resolveFunc(cache_forms_data.input_form_mobile_system_load, rs);
            }
            else {
                setTimeout(function (rs, waitFunc, varname) {
                    return function () {
                        waitFunc(rs, waitFunc, varname);
                    }
                } (rs, waitFunc, varname), 10);
            }
        }
    } (resolveFunc);
    switch (cache_forms_status) {
        case "none":
            return new Promise(function (resolveFunc) {
                return function(rs, rj) {
                    FormClass.api_call({
                        url: "database_load.php",
                        params: [
                            {name: "task", value: "input_form_mobile_system_load"}
                        ],
                        func: function(success, message) {
                            if (success) {
                                if (message.substr(0, 2) == "ok"){
                                    var content = EncodingClass.string.toVariable(message.substr(2));
                                    resolveFunc(content, rs);
                                }
                                else {
                                    console.log(message);
                                    rj(message)
                                }
                            }
                            else {
                                console.log(message);
                                rj(message)
                            }
                        }
                    })
                }
            } (resolveFunc));
        case "ready":
            return new Promise(function (resolveFunc, content) {
                return function(resolve, reject) {
                    resolveFunc(content, resolve);
                }
            } (resolveFunc, cache_forms_data.input_form_mobile_system_load));
        case "pending":
            return new Promise(function (waitFunc, varname) {
                return function(resolve, reject) {
                    waitFunc(resolve, waitFunc, varname);
                }
            } (waitFunc, "cache_forms_status"));
    }
};

form_module.defaultMobileOutputFormForPrimitiveType = function(){
    var resolveFunc = function (content, rs) {
        content = EncodingClass.string.duplicate(content);
        content.forEach(function(elt){
            elt.name = elt.name + " (" + LanguageModule.text("txt_system") + ")"
            elt.id = "m_" + elt.formid;
        });
        rs(content);
    };
    var waitFunc = function (resolveFunc) {
        return function (rs, waitFunc, varname) {
            if (window[varname] == "ready") {
                resolveFunc(cache_forms_data.output_form_mobile_system_load, rs);
            }
            else {
                setTimeout(function (rs, waitFunc, varname) {
                    return function () {
                        waitFunc(rs, waitFunc, varname);
                    }
                } (rs, waitFunc, varname), 10);
            }
        }
    } (resolveFunc);
    switch (cache_forms_status) {
        case "none":
            return new Promise(function (resolveFunc) {
                return function(rs, rj) {
                    FormClass.api_call({
                        url: "database_load.php",
                        params: [
                            {name: "task", value: "output_form_mobile_system_load"}
                        ],
                        func: function(success, message) {
                            if (success) {
                                if (message.substr(0, 2) == "ok"){
                                    var content = EncodingClass.string.toVariable(message.substr(2));
                                    resolveFunc(content, rs);
                                }
                                else {
                                    console.log(message);
                                    rj(message)
                                }
                            }
                            else {
                                console.log(message);
                                rj(message)
                            }
                        }
                    })
                }
            } (resolveFunc));
        case "ready":
            return new Promise(function (resolveFunc, content) {
                return function(resolve, reject) {
                    resolveFunc(content, resolve);
                }
            } (resolveFunc, cache_forms_data.output_form_mobile_system_load));
        case "pending":
        default:
            return new Promise(function (waitFunc, varname) {
                return function(resolve, reject) {
                    waitFunc(resolve, waitFunc, varname);
                }
            } (waitFunc, "cache_forms_status"));
    }
};

form_module.makeMobileDefaultForm = function(){
    var host = {
        taskName: "m_input",
        isMobile: true,
        database: {}
    };
    var typelists = contentModule.getDatatypePrimitiveList();
    host.formDict = {};
    form_module.defaultMobileInputFormForPrimitiveType().then(function(formContent){
        contentModule.makeDatabaseContent(host, {typelists: [], input_forms: formContent});
        host.database.input_forms.items.forEach(function(elt){
            elt.content = EncodingClass.string.toVariable(elt.content);
            host.formDict[elt.id] = elt;
        });
        host.database.typelists.items = host.database.typelists.items.concat(typelists);
        var dict = {};
        host.database.typelists.items.forEach(function (elt, index) {
            dict[elt.id] = elt;
        });
        host.typeDict = dict;
        var makeFormFunc = function(typeid){
            return new Promise(function(rs, rj){
                var form_content = form_module.generateDefaultLinearMobileInputForm(host, typeid, host.typeDict[typeid]);
                if (form_content.typeid) {
                    makeFormFunc(form_content.typeid).then(function(){
                        makeFormFunc(typeid);
                    });
                    return;
                }
                else {
                    var content = {
                        layout: {
                            tag: "LinearLayout",
                            style: {
                                overflowY: "visible",
                                height: "auto",
                                width: host.isMobile ? 350 : "auto"
                            },
                            attributes: {}
                        },
                        circuit: {}
                    };
                    var params = {
                        typeid: parseInt(typeid, 10),
                        name: dict[typeid].name,
                        content: content
                    };
                    var childrenid = "";
                    if (dict[params.typeid].type == "shift_worktime") params.content.layout.attributes.name = "ValidTimeShift";
                    else if (dict[params.typeid].includedid) {
                        if (dict[params.typeid].includedid.indexOf("_-270_") != -1) params.content.layout.attributes.name = "ValidTimeShift";
                    }
                    if (dict[params.typeid].type == "array" || dict[params.typeid].type2 == "array"){
                        params.content.layout.style.width = "auto";
                        params.content.layout.children = [form_content];
                        if (form_content.tag != "TableInput") childrenid = "_" + form_content.attributes.itemFragmentClass;
                    }
                    else if (
                        dict[params.typeid].type == "structure"
                        || dict[params.typeid].type == "extends_structure"
                        || dict[params.typeid].type2 == "structure"
                    ) {
                        var getChildrenIdList = function(cur){
                            if (cur.class && !isNaN(parseInt(cur.class))){
                                childrenid += "_" + parseInt(cur.class);
                            }
                            else if (cur.children && cur.children.length > 0){
                                cur.children.forEach(function(elt){
                                    getChildrenIdList(elt);
                                })
                            }
                        }
                        params.content.layout.children = form_content.layout;
                        form_content.layout.forEach(function(elt){
                            getChildrenIdList(elt);
                        });
                        params.content.circuit = form_content.circuit;
                    }
                    else {
                        params.content.layout.children = [form_content.layout];
                        params.content.circuit = form_content.circuit;
                    }
                    if (childrenid != "") childrenid += "_";
                    params.childrenid = childrenid;
                    params.typedescendantid = "";
                    contentModule.getDescendantsId(host, dict[params.typeid]).forEach(function(elt){
                        params.typedescendantid += "_" + elt;
                    });
                    if (params.typedescendantid != "") params.typedescendantid += "_";
                    params.task = "m_input";
                    params.id = typeid;
                    uploadFormSystem.upload(params).then(function(result){
                        result.id = "m_" + result.formid;
                        result.content = EncodingClass.string.toVariable(result.content);
                        host.database.input_forms.items.push(result);
                        host.formDict[result.id] = result;
                        rs();
                    }, function(message){
                        rj(message);
                    });
                }
            });
        }
        typelists.forEach(function(elt){
            if (elt.type2 == "structure" || elt.type2 == "array"){
                if (host.formDict["m_" + elt.id]) return;
                var form_content = makeFormFunc(elt.id);
            }
        });
    });
}


//# sourceURL=hr:///src/form_module.php.js?

VaKeR 2022