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

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/html/keeview_app/html/form_config.js
'use strict';

hr.form_config.deleteVariable = function(host, id){
    return new Promise(function(rs, rj){
        ModalElement.show_loading();
        FormClass.api_call({
            url: "variable_delete_save.php",
            params: [
                {name: "id", value: id}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success) {
                    if (message.substr(0, 2) == "ok"){
                        host.database.variables.items = host.database.variables.items.filter(function(elt){
                            return elt.id != id;
                        });
                        rs();
                    }
                    else {
                        rj(message)
                    }
                }
                else {
                    rj(message)
                }
            }
        });
    });
};

hr.form_config.saveVariable = function(host, variableValue){
    return new Promise(function(rs, rj){
        for (var i = 0; i < host.database.variables.items.length; i++){
            if (variableValue.id && host.database.variables.items[i].id == variableValue.id) continue;
            if (host.database.variables.items[i].name == variableValue.name){
                rj("nameerror");
                return;
            }
        }
        ModalElement.show_loading();
        FormClass.api_call({
            url: "variable_add_new_save.php",
            params: [
                {name: "content", value: EncodingClass.string.fromVariable(variableValue)}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success) {
                    if (message.substr(0, 2) == "ok"){
                        rs(parseInt(message.substr(2)));
                    }
                    else {
                        rj(message)
                    }
                }
                else {
                    rj(message)
                }
            }
        });
    });
};

hr.form_config.addNewVariableRow = function(host, tableView, content){
    var typelists = function(self, value){
        var data = [];
        host.database.typelists.items.forEach(function(elt){
            data.push({value: elt.id, text: elt.name});
        });
        data.unshift({value: 0, text: LanguageModule.text("txt_select_datatype")});
        var props = {
            items: data
        };
        if (value) {
            props.value = value;
            props.oldValue = value;
        }
        return absol._({
            tag: "selectmenu",
            style: {
                width: "100%"
            },
            props: props,
            on: {
                change: function(self) {
                    return function(){
                        if (this.value != this.oldValue){
                            this.oldValue = this.value;
                            var inputForm = input_form(self);
                            inputForm.disabled = false;
                            self.input_form.clearChild();
                            self.input_form.addChild(inputForm);
                            self.input_form.element = inputForm;
                            var outputForm = output_form(self);
                            outputForm.disabled = false;
                            self.output_form.clearChild();
                            self.output_form.addChild(outputForm);
                            self.output_form.element = outputForm;
                        }
                    }
                }(self)
            }
        });
    };
    var input_form = function(self, value){
        var items = [];
        if (self.typeid){
            host.database.input_forms.items.forEach(function(elt){
                if (
                    elt.typeid == self.typeid.value
                )
                items.push({value: elt.id, text: elt.name});
            });
        }
        items.unshift({value: 0, text: LanguageModule.text("txt_select_input_form")});
        var props = {
            items: items
        };
        if (value) props.value = value;
        var Cbb = absol._({
            tag: "selectmenu",
            style: {
                width: "100%"
            },
            props: props
        });
        return Cbb;
    };
    var output_form = function(self, value){
        var items = [];
        if (self.typeid){
            host.database.output_forms.items.forEach(function(elt){
                if (
                    elt.typeid == self.typeid.value
                )
                items.push({value: elt.id, text: elt.name});
            });
        }
        items.unshift({value: 0, text: LanguageModule.text("txt_select_output_form")});
        var props = {
            items: items
        };
        if (value) props.value = value;
        var Cbb = absol._({
            tag: "selectmenu",
            style: {
                width: "100%"
            },
            props: props
        });
        return Cbb;
    };
    var mobile_input_form = function(self, value){
        var items = [];
        if (self.typeid){
            host.database.mobile_input_forms.items.forEach(function(elt){
                if (
                    elt.typeid == self.typeid.value
                )
                items.push({value: elt.id, text: elt.name});
            });
        }
        items.unshift({value: 0, text: LanguageModule.text("txt_select_input_form")});
        var props = {
            items: items
        };
        if (value) props.value = value;
        var Cbb = absol._({
            tag: "selectmenu",
            style: {
                width: "100%"
            },
            props: props
        });
        return Cbb;
    };
    var mobile_output_form = function(self, value){
        var items = [];
        if (self.typeid){
            host.database.mobile_output_forms.items.forEach(function(elt){
                if (
                    elt.typeid == self.typeid.value
                )
                items.push({value: elt.id, text: elt.name});
            });
        }
        items.unshift({value: 0, text: LanguageModule.text("txt_select_output_form")});
        var props = {
            items: items
        };
        if (value) props.value = value;
        var Cbb = absol._({
            tag: "selectmenu",
            style: {
                width: "100%"
            },
            props: props
        });
        return Cbb;
    };
    var name_input = function(self, value){
        var props = {
            type: "text"
        };
        if (value) props.value = value;
        return absol._({
            tag: "input",
            class: "cardsimpleInput",
            props: value
        });
    };
    var title_input = function(self, value){
        var props = {
            type: "text"
        };
        if (value) props.value = value;
        return absol._({
            tag: "input",
            class: "cardsimpleInput",
            props: value
        });
    };
    var variableContent = {};
    var name = name_input(variableContent);
    variableContent.name = absol._({
        child: name
    });
    variableContent.name.element = name;
    variableContent.name.getValue = function(name){
        return function(){
            return name.childNodes[0].value.trim();
        };
    }(variableContent.name);
    var title = title_input(variableContent);
    variableContent.title = absol._({
        child: title
    });
    variableContent.title.element = title;
    variableContent.title.getValue = function(title){
        return function(){
            return title.childNodes[0].value.trim();
        };
    }(variableContent.title);
    variableContent.typeid = typelists(variableContent);
    var inputForm = input_form(variableContent);
    variableContent.input_form = absol._({
        child: inputForm
    });
    variableContent.input_form.element = inputForm;
    variableContent.input_form.getValue = function(input_form){
        return function(){
            return input_form.childNodes[0].value;
        }
    }(variableContent.input_form);
    var outputForm = output_form(variableContent);
    variableContent.output_form = absol._({
        child: outputForm
    });
    variableContent.output_form.element = outputForm;
    variableContent.output_form.getValue = function(output_form){
        return function(){
            return output_form.childNodes[0].value;
        };
    }(variableContent.output_form);

    ////////////////////////////////


    var mobileInputForm = mobile_input_form(variableContent);
    variableContent.mobile_input_form = absol._({
        child: mobileInputForm
    });
    variableContent.mobile_input_form.element = mobileInputForm;
    variableContent.mobile_input_form.getValue = function(input_form){
        return function(){
            return input_form.childNodes[0].value;
        }
    }(variableContent.mobile_input_form);
    var mobileOutputForm = mobile_output_form(variableContent);
    variableContent.mobile_output_form = absol._({
        child: mobileOutputForm
    });
    variableContent.mobile_output_form.element = mobileOutputForm;
    variableContent.mobile_output_form.getValue = function(output_form){
        return function(){
            return output_form.childNodes[0].value;
        };
    }(variableContent.mobile_output_form);


    var iconBtn = absol._({});
    var saveBtn = absol._({
        class: "card-icon-cover",
        child: absol._({
            tag: "i",
            class: ["material-icons",  "bsc-icon-hover-black"],
            child: {text: "save"},
            on: {
                click: function(){
                    var variableValue = {
                        name: variableContent.name.getValue(),
                        title: variableContent.title.getValue(),
                        typeid: variableContent.typeid.value,
                        inputformid: variableContent.input_form.getValue(),
                        outputformid: variableContent.output_form.getValue(),
                        mobileinputformid: variableContent.mobile_input_form.getValue(),
                        mobileoutputformid: variableContent.mobile_output_form.getValue(),
                        ver: 1
                    };
                    if (variableValue.name == "") {
                        ModalElement.alert({
                            message: "Chưa nhập tên",
                            func: function(input){
                                return function(){
                                    input.childNodes[0].focus();
                                }
                            }(variableContent.name)
                        });
                        return;
                    }
                    if (variableValue.title == "") {
                        ModalElement.alert({
                            message: "Chưa nhập tiêu đề",
                            func: function(input){
                                return function(){
                                    input.childNodes[0].focus();
                                }
                            }(variableContent.title)
                        });
                        return;
                    }
                    hr.form_config.saveVariable(host, variableValue).then(function(value){
                        variableContent.name.variableId = value;
                        content[value] = variableContent
                        hr.form_config.clickIconHandler(host, {
                            container: iconBtn,
                            task: value,
                            content: content,
                            type: "user_defined",
                            mode: "save"
                        });
                    }, function(message){
                        if (message == "nameerror"){
                            ModalElement.alert({
                                message: "Tên biến đã được sử dụng",
                                func: function(){
                                    variableContent.name.element.focus();
                                }
                            });
                        }
                        console.log(message);
                    });
                }
            }
        })
    });
    var denyBtn = absol._({
        class: "card-icon-cover",
        child: absol._({
            tag: "i",
            class: ["material-icons",  "bsc-icon-hover-black"],
            child: {text: "close"},
            on: {
                click: function(){
                    tableView.dropRow(tableView.data.length - 1);
                }
            }
        })
    });
    iconBtn.addChild(saveBtn);
    iconBtn.addChild(denyBtn);
    var data = [
        {
            element: variableContent.name
        },
        {
            element: variableContent.title
        },
        {
            element: variableContent.typeid
        },
        {
            element: variableContent.input_form
        },
        {
            element: variableContent.output_form
        },
        {
            style: {textAlign: "center"},
            element: iconBtn
        }
    ];
    tableView.insertRow(data);
};

hr.form_config.getConfigContent = function(content, mode){
    var keys;
    if (mode == "close") keys = Object.keys(content);
    else keys = contentModule.getSystemVariable().map(function(elt){return elt.task;});
    var data = {};
    var formid = "";
    var typeid = "";
    keys.forEach(function(elt){
        data[elt] = {};
        data[elt].typeid = parseInt(content[elt].typeid.value, 10);
        data[elt].input_form = parseInt(content[elt].input_form.getValue(), 10);
        data[elt].output_form = parseInt(content[elt].output_form.getValue(), 10);
        data[elt].mobile_input_form = content[elt].mobile_input_form.getValue();
        data[elt].mobile_output_form = content[elt].mobile_output_form.getValue();
        if(data[elt].typeid > 0) typeid += "_" + data[elt].typeid;
        if(data[elt].input_form > 0) formid += "_" + data[elt].input_form;
        if(data[elt].output_form > 0) formid += "_" + data[elt].output_form;
        if(data[elt].mobile_input_form > 0) formid += "_" + data[elt].mobile_input_form;
        if(data[elt].mobile_output_form > 0) formid += "_" + data[elt].mobile_output_form;
    });
    if (formid != "") formid += "_";
    if (typeid != "") typeid += "_";
    return {
        data: data,
        formid: formid,
        typeid: typeid
    };
};

hr.form_config.validateContent = function(host, content){
    var st = hr.form_config.getConfigContent(content, "close");
    var keys = Object.keys(host.form_config);
    for (var i = 0; i < keys.length; i++){
        if (
            host.form_config[keys[i]].typeid != st.data[keys[i]].typeid
            || host.form_config[keys[i]].input_form != st.data[keys[i]].input_form
            || host.form_config[keys[i]].output_form != st.data[keys[i]].output_form
        ) {
            contentModule.questionChange({
                message: LanguageModule.text("war_close_not_save"),
                command: function(host, content){
                    return function(index){
                        switch (index) {
                            case 0:
                                hr.form_config.saveConfig(host, content, 1);
                                break;
                            case 1:
                                hr.menu.tabPanel.removeTab(host.holder.id);
                                break;
                            default:

                        }
                    }
                }(host, content)
            });
            return;
        }
    }
    hr.menu.tabPanel.removeTab(host.holder.id);
};

hr.form_config.saveConfig = function(host, content, name){
    return new Promise(function(rs, rj){
        var getType = function(typeid, typeDict){
            var type = typeDict[typeid].type;
            if (
                form_module.primitiveTypeList.indexOf(type) != -1
            ){
                type = typeDict[typeid].type2;
            }
            return type;
        }
        var makePattern = function(typeid, typeContent, typeDict, isRoot){
            var content;
            var dataType = getType(typeid, typeDict);
            switch (dataType) {
                case 'structure':
                    content = {
                        type: "struct",
                        children: {}
                    }
                    if (!isRoot) {
                        typeDict[typeid].content.details.forEach(function(elt){
                            var t_pattern = makePattern(elt.type, elt, typeDict, false);
                            content.children[elt.localid] = t_pattern;
                        });
                    }
                    break;
                case 'extends_structure':
                    content = {
                        type: "struct",
                        children: {}
                    }
                    while (host.typeDict[typeid].type == "extends_structure"){
                        typeDict[typeid].content.details.forEach(function(elt){
                            var t_pattern = makePattern(elt.type, elt, typeDict, false);
                            content.children[elt.localid] = t_pattern;
                        });
                        typeid = host.typeDict[typeid].content.typeof;
                    }
                    if (!isRoot) {
                        typeDict[typeid].content.details.forEach(function(elt){
                            var t_pattern = makePattern(elt.type, elt, typeDict, false);
                            content.children[elt.localid] = t_pattern;
                        });
                    }
                    if (Object.keys(content.children).length == 0) content = {
                        type: "struct"
                    };
                    break;
                case 'array':
                    content = {
                        type: "array",
                        children: []
                    };
                    var typeOfArray = typeDict[typeid].content.typeof;
                    var t_pattern = makePattern(typeOfArray, typeDict[typeid], typeDict, false);
                    content.children.push(t_pattern);
                    break;
                case 'treetable':
                    content = {
                        type: "treetable",
                        children: []
                    };
                    var typeOfTreetable = typeDict[typeid].content.typeof;
                    var t_pattern = makePattern(typeOfTreetable, typeDict[typeid], typeDict, false);
                    content.children.push(t_pattern);
                    break;
                case 'string':
                case 'note':
                case 'email_address':
                case 'phonenumber':
                case 'website':
                case 'gps':
                case 'time':
                    content = {
                        type: "string"
                    };
                    break;
                case 'nation_city':
                    content = {
                        type: "array",
                        children: [{type: "number"}]
                    };
                    break;
                case 'currency':
                case 'number':
                    content = {
                        type: "number"
                    };
                    break;
                case 'datetime':
                case 'date':
                case 'month':
                case 'week':
                    content = {
                        type: 'realtime'
                    };
                    break;
                case 'boolean':
                    content = {
                        type: "boolean"
                    };
                    break;
                case 'enum':
                case 'extends_enum':
                    content = {
                        type: "string"
                    };
                    break;
                case 'enum_multi':
                case 'extends_enum_multi':
                    content = {
                        type: "array",
                        children: [{type: "string"}]
                    };
                    break;
                default:
                    if (contentModule.listTypeSelectmenu.indexOf(dataType) >= 0){
                        content = {
                            type: "string"
                        };
                    }
                    else if (contentModule.listTypeSelectbox.indexOf(dataType) >= 0) {
                        content = {
                            type: "array",
                            children: [{type: "number"}]
                        };
                    }
                    else {
                        content = {
                            type: "string"
                        };
                    }
                    break;
            }
            return content;
        };
        var st = hr.form_config.getConfigContent(content, "save");
        var run = function(task, oldPattern, newPattern){
            var data = st.data;
            var formid = st.formid;
            var typeid = st.typeid;
            var id, ver;
            if (host.database.form_config.items.length > 0){
                id = host.database.form_config.items[0].id;
                ver = host.database.form_config.items[0].ver;
            }
            else {
                id = 0;
                ver = 1;
            }
            ModalElement.show_loading();
            var params = [
                {value: id, name: "id"},
                {value: ver, name: "ver"},
                {name: "task", value: "form_config"},
                {name: "content", value: EncodingClass.string.fromVariable(data)},
                {name: "formid", value: formid},
                {name: "typeid", value: typeid}
            ];
            if (task) {
                params.push({name: "instance_name", value: task});
                params.push({name: "oldPattern", value: EncodingClass.string.fromVariable(oldPattern)});
                params.push({name: "newPattern", value: EncodingClass.string.fromVariable(newPattern)});
            }
            FormClass.api_call({
                url: "form_config_save.php",
                params: params,
                func: function(success, message){
                    ModalElement.close(-1);
                    if (success) {
                        if (message.substr(0, 2) == "ok"){
                            var content = EncodingClass.string.toVariable(message.substr(2));
                            host.database.form_config.items = content;
                            host.form_config = EncodingClass.string.toVariable(content[0].content);
                            rs();
                        }
                        else {
                            ModalElement.alert({message: message});
                            console.log(message);
                            rj(message);
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                        console.log(message);
                        rj(message);
                    }
                }
            })
        }
        if (name == "employee") {
            if (host.form_config.employee.typeid != st.data.employee.typeid) {
                var newPath = form_module.getTypePath(host, st.data.employee.typeid);
                var basePath = form_module.getTypePath(host, host.form_config.employee.typeid);
                var rootId = newPath[0];
                for (var i = 1; i < newPath.length; i++){
                    if (newPath[i] == basePath[i]) rootId = newPath[i];
                    else break;
                }
                var fieldToDel = {
                    localid: [],
                    text: []
                };
                var tid = host.form_config.employee.typeid;
                while (tid != rootId) {
                    host.typeDict[tid].content.details.forEach((item, i) => {
                        fieldToDel.localid.push(item.localid);
                        fieldToDel.text.push(item.name);
                    });
                    tid = host.typeDict[tid].content.typeof;
                }
                var fieldToAdd = [];
                var tid = st.data.employee.typeid;
                while (tid != rootId) {
                    fieldToAdd = fieldToAdd.concat(host.typeDict[tid].content.details);
                    tid = host.typeDict[tid].content.typeof;
                }
                var oldPattern = makePattern(host.form_config.employee.typeid, host.typeDict[host.form_config.employee.typeid], host.typeDict, true);
                var newPattern = makePattern(st.data.employee.typeid, host.typeDict[st.data.employee.typeid], host.typeDict, true);
                console.log(oldPattern, newPattern);
                var data = [];
                fieldToDel.text.forEach((item, i) => {
                    data.push({
                        cells: [
                            {
                                style: {
                                    whiteSpace: "nowrap"
                                },
                                child: absol._({text: item})
                            }
                        ]
                    });
                });
                var tableView = absol.buildDom({
                    tag: "dynamictable",
                    props: {
                        adapter: {
                           rowsPerPage: Infinity,
                           data: {
                               head: {
                                   rows: [
                                       {
                                           cells: [
                                               {}
                                           ]
                                       }
                                   ]
                               },
                               body: {
                                   rows: data
                               }
                           }
                       }
                    }
                });
                if (fieldToDel.localid.length > 0) {
                    ModalElement.showWindow({
                        title: "Cảnh báo",
                        bodycontent: absol._({
                            child: [
                                {
                                    child: {text: "Các trường dữ liệu sau sẽ bị xóa, bạn có muốn tiếp tục"}
                                },
                                tableView
                            ]
                        }),
                        buttonlist: [
                            {
                                text: LanguageModule.text("txt_ok"),
                                onclick: function(){
                                    run("employee", oldPattern, newPattern);
                                    ModalElement.close();
                                }
                            },
                            {
                                text: LanguageModule.text("txt_cancel"),
                                onclick: function(){
                                    ModalElement.close();
                                }
                            }
                        ]
                    })
                }
                else {
                    run();
                }
            }
            else {
                run();
            }
        }
        else {
            run();
        }
    })
};

hr.form_config.clickIconHandler = function(host, params){
    var container, task, content, type, mode;
    container = params.container;
    task = params.task;
    content = params.content;
    type = params.type;
    mode = params.mode;
    var editBtn = absol._({
        class: "card-icon-cover",
        child: absol._({
            tag: "i",
            class: ["material-icons",  "bsc-icon-hover-black"],
            child: {text: "edit"},
            on: {
                click: function(container, task, type){
                    return function(){
                        if (host.addNewVariable) return;
                        if (host.lastTask){
                            hr.form_config.clickIconHandler(host, {
                                container: host.lastTask.container,
                                task: host.lastTask.task,
                                content: content,
                                type: host.lastTask.type,
                                mode: "deny"
                            });
                        }
                        hr.form_config.clickIconHandler(host, {
                            container: container,
                            task: task,
                            content: content,
                            type: type,
                            mode: "edit"
                        });
                    }
                }(container, task, type)
            }
        })
    });
    var deleteBtn = absol._({
        class: "card-icon-cover",
        child: absol._({
            tag: "i",
            class: ["material-icons",  "bsc-icon-hover-black"],
            child: {text: "delete"},
            on: {
                click: function(){
                    hr.form_config.deleteVariable(host, task).then(function(){
                        for (var i = 0; i < host.tableView.data.length; i++){
                            if (!host.tableView.data[i][0].element) continue;
                            if (host.tableView.data[i][0].element.variableId == task){
                                host.tableView.dropRow(i);
                                break;
                            }
                        }
                    });
                }
            }
        })
    });
    var saveBtn = absol._({
        class: "card-icon-cover",
        child: absol._({
            tag: "i",
            class: ["material-icons",  "bsc-icon-hover-black"],
            child: {text: "save"},
            on: {
                click: function(){
                    if (type == "system") {
                        hr.form_config.saveConfig(host, content, task).then(function(){
                            hr.form_config.clickIconHandler(host, {
                                container: container,
                                task: task,
                                content: content,
                                type: type,
                                mode: "save"
                            });
                        }, function(err){console.log(err);});
                    }
                    else {
                        var variableValue = {
                            id: task,
                            name: content[task].name.getValue(),
                            title: content[task].title.getValue(),
                            typeid: content[task].typeid.value,
                            inputformid: content[task].input_form.getValue(),
                            outputformid: content[task].output_form.getValue(),
                            mobileinputformid: content[task].mobile_input_form.getValue(),
                            mobileoutputformid: content[task].mobile_output_form.getValue()
                        };
                        var vIndex = host.database.variables.getIndex(task);
                        variableValue.ver = host.database.variables.items[vIndex].ver;
                        if (variableValue.name == "") {
                            ModalElement.alert({
                                message: "Chưa nhập tên",
                                func: function(){
                                    content[task].name.childNodes[0].focus();
                                }
                            });
                            return;
                        }
                        if (variableValue.title == "") {
                            ModalElement.alert({
                                message: "Chưa nhập tiêu đề",
                                func: function(){
                                    content[task].title.childNodes[0].focus();
                                }
                            });
                            return;
                        }
                        if (variableValue.inputformid == 0) {
                            ModalElement.alert({
                                message: "Chưa chọn form nhập"
                            });
                            return;
                        }
                        hr.form_config.saveVariable(host, variableValue).then(function(value){
                            host.database.variables.items[vIndex] = variableValue;
                            host.database.variables.items[vIndex].ver++;
                            hr.form_config.clickIconHandler(host, {
                                container: container,
                                task: task,
                                content: content,
                                type: type,
                                mode: "save"
                            });
                        }, function(message){{
                            if (message == "nameerror"){
                                ModalElement.alert({
                                    message: "Tên biến đã được sử dụng",
                                    func: function(){
                                        content[task].name.element.focus();
                                    }
                                });
                            }
                            console.log(message);
                        }});
                    }
                }
            }
        })
    });
    var denyBtn = absol._({
        class: "card-icon-cover",
        child: absol._({
            tag: "i",
            class: ["material-icons",  "bsc-icon-hover-black"],
            child: {text: "close"},
            on: {
                click: function(){
                    hr.form_config.clickIconHandler(host, {
                        container: container,
                        task: task,
                        content: content,
                        type: type,
                        mode: "deny"
                    });
                }
            }
        })
    });
    if (mode == "edit") {
        if (type != "system"){
            var name = content[task].name.getValue();
            var title = content[task].title.getValue();
            content[task].name.clearChild();
            content[task].name.addChild(absol._({
                tag: "input",
                class: "cardsimpleInput",
                props: {
                    type: "text",
                    value: name
                }
            }));
            content[task].name.getValue = function(){
                return content[task].name.childNodes[0].value.trim();
            };
            content[task].title.clearChild();
            content[task].title.addChild(absol._({
                tag: "input",
                class: "cardsimpleInput",
                props: {
                    type: "text",
                    value: title
                }
            }));
            content[task].title.getValue = function(){
                return content[task].title.childNodes[0].value.trim();
            };
        }
        content[task].typeid.disabled = false;
        content[task].input_form.element.disabled = false;
        content[task].output_form.element.disabled = false;
        content[task].mobile_input_form.element.disabled = false;
        content[task].mobile_output_form.element.disabled = false;
        container.clearChild();
        container.addChild(saveBtn);
        container.addChild(denyBtn);
        host.lastTask = {
            task: task,
            container: container,
            type: type
        };
    }
    else {
        if (type != "system"){
            var name = content[task].name.getValue();
            var title = content[task].title.getValue();
            content[task].name.clearChild();
            content[task].name.addChild(absol._({
                child: {text: name}
            }));
            content[task].name.getValue = function(){
                return content[task].name.childNodes[0].textContent;
            };
            content[task].title.clearChild();
            content[task].title.addChild(absol._({
                child: {text: title}
            }));
            content[task].title.getValue = function(){
                return content[task].title.childNodes[0].textContent;
            };
        }
        content[task].typeid.disabled = true;
        content[task].input_form.element.disabled = true;
        content[task].output_form.element.disabled = true;
        content[task].mobile_input_form.element.disabled = true;
        content[task].mobile_output_form.element.disabled = true;
        container.clearChild();
        container.addChild(editBtn);
        if (type != "system") container.addChild(deleteBtn);
        host.lastTask = null;
    }
}

hr.form_config.redraw = function(host){
    var generateDataType = function(dataType){
        var indexList = [];
        var index;
        var typeid = dataType.content.typeof;
        var type = dataType.type;
        indexList.push(host.dictionary.typelists[dataType.id]);
        while (type == "extends_structure"){
            index = host.dictionary.typelists[typeid];
            indexList.push(index);
            type = host.database.typelists.items[index].type;
            if (type == "extends_structure") typeid = host.database.typelists.items[index].content.typeof;
        }
        index = host.dictionary.typelists[typeid];
        indexList.forEach(function(elt){
            host.database.typelists.items[elt].extendOf = host.database.typelists.items[index].type;
        });
    }
    host.database.typelists.items.forEach(function(elt){
        if (elt.extendOf) return;
        if (elt.type == "extends_structure") {
            generateDataType(elt);
        }
    });
    var typelists = function(self, value, task){
        var data = [];
        host.database.typelists.items.forEach(function(elt){
            if (!task) data.push({value: elt.id, text: elt.name, sortText: absol.string.nonAccentVietnamese(elt.name).toLowerCase()});
            else {
                if (elt.type == task) data.push({value: elt.id, text: elt.name, sortText: absol.string.nonAccentVietnamese(elt.name).toLowerCase()});
                else if (elt.type == "extends_structure"){
                    if (elt.extendOf == task) data.push({value: elt.id, text: elt.name, sortText: absol.string.nonAccentVietnamese(elt.name).toLowerCase()});
                }
            }
        });
        data.sort(function(a, b){
            if (a.sortText > b.sortText) return 1;
            if (a.sortText < b.sortText) return -1;
            return 0;
        });
        // data.unshift({value: 0, text: LanguageModule.text("txt_select_datatype")});
        var props = {
            items: data,
            disabled: true,
            enableSearch: true
        };
        if (value) {
            props.value = value;
            props.oldValue = value;
        }
        return absol._({
            tag: "selectmenu",
            style: {
                width: "100%"
            },
            props: props,
            on: {
                change: function(self) {
                    return function(){
                        if (this.value != this.oldValue){
                            this.oldValue = this.value;
                            var inputForm = input_form(self);
                            inputForm.disabled = false;
                            self.input_form.clearChild();
                            self.input_form.addChild(inputForm);
                            self.input_form.element = inputForm;
                            var outputForm = output_form(self);
                            outputForm.disabled = false;
                            self.output_form.clearChild();
                            self.output_form.addChild(outputForm);
                            self.output_form.element = outputForm;
                            /////////////////////////
                            var mobileInputForm = mobile_input_form(self);
                            mobileInputForm.disabled = false;
                            self.mobile_input_form.clearChild();
                            self.mobile_input_form.addChild(mobileInputForm);
                            self.mobile_input_form.element = mobileInputForm;
                            var mobileOutputForm = mobile_output_form(self);
                            mobileOutputForm.disabled = false;
                            self.mobile_output_form.clearChild();
                            self.mobile_output_form.addChild(mobileOutputForm);
                            self.mobile_output_form.element = mobileOutputForm;
                        }
                    }
                }(self)
            }
        });
    };
    var input_form = function(self, value){
        var items = [];
        if (self.typeid){
            host.database.input_forms.items.forEach(function(elt){
                if (
                    elt.typeid == self.typeid.value
                )
                items.push({value: elt.id, text: elt.name});
            });
        }
        items.unshift({value: 0, text: LanguageModule.text("txt_select_input_form")});
        var props = {
            items: items,
            disabled: true
        };
        if (value) props.value = value;
        var Cbb = absol._({
            tag: "selectmenu",
            style: {
                width: "100%"
            },
            props: props
        });
        return Cbb;
    };
    var output_form = function(self, value){
        var items = [];
        if (self.typeid){
            host.database.output_forms.items.forEach(function(elt){
                if (
                    elt.typeid == self.typeid.value
                )
                items.push({value: elt.id, text: elt.name});
            });
        }
        items.unshift({value: 0, text: LanguageModule.text("txt_select_output_form")});
        var props = {
            items: items,
            disabled: true
        };
        if (value) props.value = value;
        var Cbb = absol._({
            tag: "selectmenu",
            style: {
                width: "100%"
            },
            props: props
        });
        return Cbb;
    };
    var mobile_input_form = function(self, value){
        var items = [];
        if (self.typeid){
            host.database.mobile_input_forms.items.forEach(function(elt){
                if (
                    elt.typeid == self.typeid.value
                )
                items.push({value: elt.id, text: elt.name});
            });
        }
        items.unshift({value: 0, text: LanguageModule.text("txt_select_input_form")});
        var props = {
            items: items,
            disabled: true
        };
        if (value) props.value = value;
        var Cbb = absol._({
            tag: "selectmenu",
            style: {
                width: "100%"
            },
            props: props
        });
        return Cbb;
    };
    var mobile_output_form = function(self, value){
        var items = [];
        if (self.typeid){
            host.database.mobile_output_forms.items.forEach(function(elt){
                if (
                    elt.typeid == self.typeid.value
                )
                items.push({value: elt.id, text: elt.name});
            });
        }
        items.unshift({value: 0, text: LanguageModule.text("txt_select_output_form")});
        var props = {
            items: items,
            disabled: true
        };
        if (value) props.value = value;
        var Cbb = absol._({
            tag: "selectmenu",
            style: {
                width: "100%"
            },
            props: props
        });
        return Cbb;
    };
    var data_container = absol._({});
    var keys = Object.keys(host.form_config);
    var content = {};
    var taskList = contentModule.getSystemVariable();
    var data = [];
    taskList.forEach(function(elt){
        content[elt.task] = {};
        content[elt.task].typeid = function(elt){
            return typelists(content[elt.task], host.form_config[elt.task] ? (host.form_config[elt.task].typeid > 0) ? host.form_config[elt.task].typeid : elt.typeid : elt.typeid, elt.task);
        }(elt);
        var inputForm = function(elt){
            return input_form(content[elt.task], host.form_config[elt.task] ? (host.form_config[elt.task].input_form > 0) ? host.form_config[elt.task].input_form : elt.input_form : elt.input_form);
        }(elt);
        content[elt.task].input_form = absol._({
            child: inputForm
        });
        content[elt.task].input_form.element = inputForm;
        content[elt.task].input_form.getValue = function(input_form){
            return function(){
                return input_form.childNodes[0].value;
            }
        }(content[elt.task].input_form);
        var outputForm = function(elt){
            return output_form(content[elt.task], host.form_config[elt.task] ? (host.form_config[elt.task].output_form > 0) ? host.form_config[elt.task].output_form : elt.output_form : elt.output_form);
        }(elt);
        content[elt.task].output_form = absol._({
            child: outputForm
        });
        content[elt.task].output_form.element = outputForm;
        content[elt.task].output_form.getValue = function(output_form){
            return function(){
                return output_form.childNodes[0].value;
            };
        }(content[elt.task].output_form);
        /////////////////////
        var mobileInputForm = function(elt){
            return mobile_input_form(content[elt.task], host.form_config[elt.task] ? (host.form_config[elt.task].mobile_input_form > 0) ? host.form_config[elt.task].mobile_input_form : elt.mobile_input_form : elt.mobile_input_form);
        }(elt);
        content[elt.task].mobile_input_form = absol._({
            child: mobileInputForm
        });
        content[elt.task].mobile_input_form.element = mobileInputForm;
        content[elt.task].mobile_input_form.getValue = function(mobile_input_form){
            return function(){
                return mobile_input_form.childNodes[0].value;
            }
        }(content[elt.task].mobile_input_form);
        var mobileOutputForm = function(elt){
            return mobile_output_form(content[elt.task], host.form_config[elt.task] ? (host.form_config[elt.task].mobile_output_form > 0) ? host.form_config[elt.task].mobile_output_form : elt.mobile_output_form : elt.mobile_output_form);
        }(elt);
        content[elt.task].mobile_output_form = absol._({
            child: mobileOutputForm
        });
        content[elt.task].mobile_output_form.element = mobileOutputForm;
        content[elt.task].mobile_output_form.getValue = function(mobile_output_form){
            return function(){
                return mobile_output_form.childNodes[0].value;
            };
        }(content[elt.task].mobile_output_form);
        //////////////////////////
        var iconBtn = absol._({style: {whiteSpace: "nowrap"}});
        var editBtn = absol._({
            class: "card-icon-cover",
            child: absol._({
                tag: "i",
                class: ["material-icons",  "bsc-icon-hover-black"],
                child: {text: "edit"},
                on: {
                    click: function(iconBtn, task){
                        return function(){
                            if (host.addNewVariable) return;
                            if (host.lastTask){
                                hr.form_config.clickIconHandler(host, {
                                    container: host.lastTask.container,
                                    task: host.lastTask.task,
                                    content: content,
                                    type: host.lastTask.type,
                                    mode: "deny"
                                });
                            }
                            hr.form_config.clickIconHandler(host, {
                                container: iconBtn,
                                task: task,
                                content: content,
                                type: "system",
                                mode: "edit",
                            });
                        }
                    }(iconBtn, elt.task)
                }
            })
        });
        iconBtn.addChild(editBtn);
        var items = [
            {
                element: absol._({child: {text: elt.name}}),
                value: elt.name
            },
            {
                element: absol._({child: {text: elt.title}}),
                value: elt.title
            },
            {
                element: content[elt.task].typeid,
                value: ""
            },
            {
                element: content[elt.task].input_form,
                value: ""
            },
            {
                element: content[elt.task].output_form,
                value: ""
            },
            {
                element: content[elt.task].mobile_input_form,
                value: ""
            },
            {
                element: content[elt.task].mobile_output_form,
                value: ""
            },
            {
                style: {textAlign: "center"},
                element: iconBtn,
                value: ""
            }
        ];
        items.sortText = absol.string.nonAccentVietnamese(elt.title).toLowerCase();
        data.push(items);
    });
    data.sort(function(a, b){
        if (a.sortText > b.sortText) return 1;
        if (a.sortText < b.sortText) return -1;
        return 0;
    });
    var name_input = function(self, value){
        return absol._({
            child: {text: value}
        });
    };
    var title_input = function(self, value){
        return absol._({
            child: {text: value}
        });
    };
    var data2 = [];
    host.database.variables.items.forEach(function(elt){
        content[elt.id] = {};
        var name = name_input(content[elt.id], elt.name);
        content[elt.id].name = absol._({
            child: name
        });
        content[elt.id].name.variableId = elt.id;
        content[elt.id].name.element = name;
        content[elt.id].name.getValue = function(){
            return content[elt.id].name.childNodes[0].textContent;
        };
        var title = title_input(content[elt.id], elt.title);
        content[elt.id].title = absol._({
            child: title
        });
        content[elt.id].title.element = title;
        content[elt.id].title.getValue = function(){
            return content[elt.id].title.childNodes[0].textContent;
        };
        content[elt.id].typeid = typelists(content[elt.id], elt.typeid != 0 ? elt.typeid : undefined);
        var inputForm = input_form(content[elt.id], elt.inputformid != 0 ? elt.inputformid : undefined);
        content[elt.id].input_form = absol._({
            child: inputForm
        });
        content[elt.id].input_form.element = inputForm;
        content[elt.id].input_form.getValue = function(){
            return content[elt.id].input_form.childNodes[0].value;
        };
        var outputForm = output_form(content[elt.id], elt.outputformid != 0 ? elt.outputformid : undefined);
        content[elt.id].output_form = absol._({
            child: outputForm
        });
        content[elt.id].output_form.element = outputForm;
        content[elt.id].output_form.getValue = function(){
            return content[elt.id].output_form.childNodes[0].value;
        };
        /////////////////////////////////////////////////
        var mobileInputForm = mobile_input_form(content[elt.id], elt.mobileinputformid != 0 ? elt.mobileinputformid : undefined);
        content[elt.id].mobile_input_form = absol._({
            child: mobileInputForm
        });
        content[elt.id].mobile_input_form.element = mobileInputForm;
        content[elt.id].mobile_input_form.getValue = function(){
            return content[elt.id].mobile_input_form.childNodes[0].value;
        };
        var mobileOutputForm = mobile_output_form(content[elt.id], elt.mobileoutputformid != 0 ? elt.mobileoutputformid : undefined);
        content[elt.id].mobile_output_form = absol._({
            child: mobileOutputForm
        });
        content[elt.id].mobile_output_form.element = mobileOutputForm;
        content[elt.id].mobile_output_form.getValue = function(){
            return content[elt.id].mobile_output_form.childNodes[0].value;
        };
        /////////////////////////////////////////////
        var iconBtn = absol._({style: {whiteSpace: "nowrap"}});
        var editBtn = absol._({
            class: "card-icon-cover",
            child: absol._({
                tag: "i",
                class: ["material-icons",  "bsc-icon-hover-black"],
                child: {text: "edit"},
                on: {
                    click: function(){
                        if (host.addNewVariable) return;
                        if (host.lastTask){
                            hr.form_config.clickIconHandler(host, {
                                container: host.lastTask.container,
                                task: host.lastTask.task,
                                content: content,
                                type: host.lastTask.type,
                                mode: "deny"
                            });
                        }
                        hr.form_config.clickIconHandler(host, {
                            container: iconBtn,
                            task: elt.id,
                            content: content,
                            type: "user_defined",
                            mode: "edit",
                        });
                    }
                }
            })
        });
        var deleteBtn = absol._({
            class: "card-icon-cover",
            child: absol._({
                tag: "i",
                class: ["material-icons",  "bsc-icon-hover-black"],
                child: {text: "delete"},
                on: {
                    click: function(id){
                        return function(){
                            hr.form_config.deleteVariable(host, id).then(function(){
                                for (var i = 0; i < tableView.data.length; i++){
                                    if (!tableView.data[i][0].element) continue;
                                    if (tableView.data[i][0].element.variableId == id){
                                        tableView.dropRow(i);
                                        break;
                                    }
                                }
                            }, function(message){console.log(message);});
                        }
                    }(elt.id)
                }
            })
        });
        iconBtn.addChild(editBtn);
        iconBtn.addChild(deleteBtn);
        var items = [
            {
                element: content[elt.id].name,
                value: ""
            },
            {
                element: content[elt.id].title,
                value: ""
            },
            {
                element: content[elt.id].typeid,
                value: ""
            },
            {
                element: content[elt.id].input_form,
                value: ""
            },
            {
                element: content[elt.id].output_form,
                value: ""
            },
            {
                element: content[elt.id].mobile_input_form,
                value: ""
            },
            {
                element: content[elt.id].mobile_output_form,
                value: ""
            },
            {
                style: {textAlign: "center"},
                element: iconBtn,
                value: ""
            }
        ];
        items.sortText = absol.string.nonAccentVietnamese(content[elt.id].title.textContent).toLowerCase();
        data2.push(items);
    });
    data2.sort(function(a, b){
        if (a.sortText > b.sortText) return 1;
        if (a.sortText < b.sortText) return -1;
        return 0;
    });
    var header = [
        {value: LanguageModule.text("txt_name"), sort: true},
        {value: LanguageModule.text("txt_title"), sort: true},
        {value: LanguageModule.text("txt_datatypes")},
        {value: LanguageModule.text("txt_input_form")},
        {value: LanguageModule.text("txt_output_form")},
        {value: LanguageModule.text("txt_input_form_mobile"), hidden: true},
        {value: LanguageModule.text("txt_output_form_mobile"), hidden: true},
        {value: ""}
    ];
    var m_header = [
        {value: LanguageModule.text("txt_name"), sort: true},
        {value: LanguageModule.text("txt_title"), sort: true},
        {value: LanguageModule.text("txt_datatypes")},
        {value: LanguageModule.text("txt_input_form"), hidden: true},
        {value: LanguageModule.text("txt_output_form"), hidden: true},
        {value: LanguageModule.text("txt_input_form_mobile")},
        {value: LanguageModule.text("txt_output_form_mobile")},
        {value: ""}
    ];
    var inputsearchbox = absol.buildDom({
        tag:'searchcrosstextinput',
        style: {
            width: "var(--searchbox-width)"
        },
        props:{
            placeholder: LanguageModule.text("txt_search")
        }
    });
    var tableView = pizo.tableView(header, data.concat(data2), false, false);
    tableView.addInputSearch(inputsearchbox);
    host.tableView = tableView;
    var configType = absol._({
        tag: "selectmenu",
        props: {
            items: [
                {text: LanguageModule.text("txt_desktop"), value: "desktop"},
                {text: LanguageModule.text("txt_mobile"), value: "mobile"}
            ],
            value: "desktop"
        },
        on: {
            change: function(){
                if (this.value == "desktop") tableView = pizo.tableView(header, tableView.data, false, false);
                else tableView = pizo.tableView(m_header, tableView.data, false, false);
                host.tableView = tableView;
                container.clearChild();
                container.addChild(host.tableView);
            }
        }
    });
    var container = absol._({
        child: host.tableView
    });
    var singlePage = absol.buildDom({
        tag: "singlepage",
        child: [
            {
                class: ['button-panel-header', 'absol-single-page-header'],
                child: [
                    {
                        class: "single-button-header",
                        child: theme.closeButton({
                            onclick: function(){
                                hr.menu.tabPanel.removeTab(host.holder.id);
                                // hr.form_config.validateContent(host, content);
                            }
                        })
                    },
                    {
                        class: "single-button-header",
                        child: theme.addButton({
                            onclick: function(){
                                if (host.lastTask || host.addNewVariable) return;
                                hr.form_config.addNewVariableRow(host, tableView, content);
                            }
                        })
                    },
                    {
                        class: "single-button-header",
                        child: configType
                    },
                    {
                        class: "single-button-header",
                        child: inputsearchbox
                    }
                ]
            },
            container
        ]
    });
    host.frameList.addChild(singlePage);
    singlePage.requestActive();
};

hr.form_config.init = function(host){
    host.database = {};
    FormClass.api_call({
        url: "database_load.php",
        params: [
            {value: "form_config", name: "task"}
        ],
        func: function(success, message){
            if (success){
                if (message.substr(0, 2) == "ok"){
                    var content = EncodingClass.string.toVariable(message.substr(2));
                    Promise.all([form_module.defaultInputFormForPrimitiveType(), form_module.defaultOutputFormForPrimitiveType(), form_module.defaultMobileInputFormForPrimitiveType(), form_module.defaultMobileOutputFormForPrimitiveType()]).then(function(retval){
                        content.input_forms = retval[0].concat(content.input_forms);
                        content.output_forms = retval[1].concat(content.output_forms);
                        content.mobile_input_forms = retval[2].concat(content.mobile_input_forms);
                        content.mobile_output_forms = retval[3].concat(content.mobile_output_forms);
                        contentModule.makeDatabaseContent(host, content);
                        for (var i = 0; i < host.database.typelists.items.length; i++){
                            contentModule.makeDataTypeDecode(host.database.typelists.items[i]);
                        }
                        host.dictionary = {
                            typelists: contentModule.makeDictionaryIndex(host.database.typelists.items)
                        };
                        host.typeDict = {};
                        data_module.typelists.items.forEach((item, i) => {
                            host.typeDict[item.id] = item;
                        });
                        if (content.form_config.length > 0){
                            host.form_config = EncodingClass.string.toVariable(content.form_config[0].content);
                        }
                        else {
                            host.form_config = contentModule.configVariableDefault();
                        }
                        host.holder.appendChild(host.frameList);
                        hr.form_config.redraw(host);
                    });
                }
                else {
                    ModalElement.alert({message: message});
                    console.log(message);
                }
            }
            else {
                ModalElement.alert({message: message});
                console.log(message);
            }
        }
    });
};

VaKeR 2022