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

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/html/keeview_app/html/partner.js

hr.partner.searchDataFunc = function(filter, host){
    return new Promise(function(resolve, reject){
        var func1 = function(){
            var searchValue = filter.searchValue.toLowerCase();
            var nvnText = absol.string.nonAccentVietnamese(searchValue);
            var words = searchValue.split(/[\s,\\.]+/);
            var wordDict = words.reduce(function(ac, cr){
                ac[cr] = true;
                return ac;
            }, {})
            var extraParams = {
                partnerDic: partnerDic,
                words: words,
                nvnWords: nvnText.split(/[\s,\\.]+/),
                text: searchValue,
                nvnText: nvnText,
                wordDict: wordDict,
                filter: {
                    nationid: filter.nation_city? filter.nation_city[0] : 0,
                    cityid: filter.nation_city? filter.nation_city[1] : 0,
                    classid: filter.classid,
                    marked_value: filter.marked_value
                },
                markedDic: filter.markedDic
            };
            data_module.cacheContent_partners.psearch({
                searchFunc: function (record){
                    if (extraParams.filter.marked_value && !extraParams.markedDic[record.id]) return null;
                    if (extraParams.filter.classid){
                        if (!extraParams.partnerDic[record.id]) return null;
                    }
                    if (extraParams.filter.nationid && record.nationid != extraParams.filter.nationid) return null;
                    if (extraParams.filter.cityid && record.cityid != extraParams.filter.cityid) return null;
                    if (extraParams.text === "") return {
                        id: record.id,
                        icld: true,
                        name: record.name
                    };
                    function harmonicMean(a, b) {
                        return 2 / (1 / a + 1 / b);
                    }
                    function wordLike(a, b) {
                        var m = a.length;
                        var n = b.length;

                        function map(i, j) {
                            return i * (n + 1) + j;
                        }

                        var Q = Array((m + 1) * (n + 1)).fill(0);

                        for (var i = 0; i < m; ++i)
                            for (var j = 0; j < n; ++j)
                                if (a.charAt(i) === b.charAt(j)) {
                                    if (Q[map(i + 1, j + 1)]) {
                                        if (Q[map(i + 1, j + 1)] < Q[map(i, j)] + 1)
                                            Q[map(i + 1, j + 1)] = Q[map(i, j)] + 1;
                                    }
                                    else
                                        Q[map(i + 1, j + 1)] = Q[map(i, j)] + 1;
                                }
                                else
                                    Q[map(i + 1, j + 1)] = Math.max(Q[map(i + 1, j)], Q[map(i, j + 1)]);

                        return Q[map(m, n)] / harmonicMean(m, n);
                    }


                    function wordsMatch(sq1, sq2, matchWordPow) {
                        matchWordPow = matchWordPow === undefined ? 1 : matchWordPow;

                        var m = sq1.length;
                        var n = sq2.length;

                        function map(i, j) {
                            return i * (n + 1) + j;
                        }

                        var Q = Array((m + 1) * (n + 1)).fill(0);
                        var e = 0.0;
                        for (var i = 0; i < m; ++i)
                            for (var j = 0; j < n; ++j) {
                                e = Math.pow(wordLike(sq1[i], sq2[j]), matchWordPow);

                                if (Q[map(i + 1, j + 1)]) {
                                    if (Q[map(i + 1, j + 1)] < Q[map(i, j)] + e)
                                        Q[map(i + 1, j + 1)] = Q[map(i, j)] + e;

                                }
                                else
                                    Q[map(i + 1, j + 1)] = Q[map(i, j)] + e;

                                e = Math.max(Q[map(i + 1, j)], Q[map(i, j + 1)]);
                                if (e > Q[map(i + 1, j + 1)]) Q[map(i + 1, j + 1)] = e;

                            }

                        return Q[map(m, n)]/Math.max(harmonicMean(m, n), 1);
                    }

                    function nonAccentVietnamese(s) {
                        return s.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, "a")
                            .replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, "A")
                            .replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, "e")
                            .replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, "E")
                            .replace(/ì|í|ị|ỉ|ĩ/g, "i")
                            .replace(/Ì|Í|Ị|Ỉ|Ĩ/g, "I")
                            .replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, "o")
                            .replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, "O")
                            .replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, "u")
                            .replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, "U")
                            .replace(/ỳ|ý|ỵ|ỷ|ỹ/g, "y")
                            .replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, "Y")
                            .replace(/đ/g, "d")
                            .replace(/Đ/g, "D")
                            .replace(/\u0300|\u0301|\u0303|\u0309|\u0323/g, "")
                            .replace(/\u02C6|\u0306|\u031B/g, "");
                    }

                    var text = record.id + ' ' + record.name + ' ' + record.fullname + ' ' + record.address + ' ' + record.email + ' ' + record.fax;
                    text += ' ' + record.website + ' ' + record.taxcode + ' ' + record.gps + ' ' + record.description;
                    text = text.toLowerCase();
                    var nvnText = nonAccentVietnamese(text);
                    var words = text.trim().split(/[\s,\\.]+/);
                    var nvnWords = nvnText.trim().split(/[\s,\\.]+/);
                    var wordDict = {};
                    for (var i = 0; i < words.length; i++) {
                        wordDict[words[i]] = true;
                    }

                    var score = 0;
                    var mustIncluded = true;
                    for (var key in extraParams.wordDict) {
                        if (!wordDict[key]) {
                            mustIncluded = false;
                            break;
                        }
                    }
                    if (mustIncluded) score += 1e4;

                    var idx = text.indexOf(extraParams.text);
                    if (idx >= 0) {
                        mustIncluded = true;
                        score += 1e3 / (idx + 1);
                    }
                    else  {
                        idx = nvnText.indexOf(extraParams.nvnText);
                        if (idx >= 0) {
                            mustIncluded = true;
                            score += 1e3 / (idx + 1e3);
                        }
                    }
                    if (mustIncluded) return {
                        id: record.id,
                        icld: true,
                        name: record.name,
                        score: score
                    };
                    score = wordsMatch(nvnWords, extraParams.nvnWords)
                        + wordsMatch(words, extraParams.words);
                    if (score > 0.2)
                        return {
                            id: record.id,
                            score: score
                        };
                    return null;
                },
                extraParams: extraParams,
                callbackfunc: function (values) {
                    var newFilter = {
                        searchValue: host.inputsearchbox.value.trim(),
                        classid: host.partner_class_select.value,
                        nation_city: host.nation_cities_select.value,
                        marked_value: host.marked_view_elt? host.marked_view_elt.value : false,
                        markedDic: host.markedDic
                    };
                    if (host && EncodingClass.string.compare(newFilter, filter)){
                        console.log("cancel");
                        return;
                    }
                    var forSortingArr = [];
                    var icldArr = [];
                    var maxScore = 0;
                    for (var i = 0; i < values.length; ++i) {
                        if (values[i].icld) {
                            values[i].name = absol.string.nonAccentVietnamese(values[i].name);
                            icldArr.push(values[i]);
                        }
                        else {
                            forSortingArr.push(values[i]);
                        }
                    }

                    if (filter.searchValue === ""){
                        icldArr.sort(function(a, b){
                            if (a.name < b.name) return -1;
                            return 1;
                        });
                    }

                    icldArr.sort(function(a, b) {
                        return b.score - a.score;
                    });
                    var idArr = [];
                    for (var i = 0; i < icldArr.length; i++){
                        idArr.push(icldArr[i].id);
                    }
                    forSortingArr.sort(function(a, b) {
                        return b.score - a.score;
                    });
                    var maxScore;
                    if (forSortingArr.length > 0){
                        maxScore = forSortingArr[0].score;
                        for (var i = 0; i < forSortingArr.length; i++){
                            if (forSortingArr[i].score > (maxScore*0.8)) idArr.push(forSortingArr[i].id);
                        }
                    }
                    if (filter && filter.searchValue != ""){
                        if (idArr.length > 500) idArr = idArr.splice(0, 500);
                    }
                    resolve(idArr);
                }
            });
        };
        var partnerDic = {};
        if (filter.classid != 0){
            data_module.cacheContent_partner_class_links.psearch({
                searchFunc: function(record){
                    if (record.classid == extraParams.classid) return record;
                    return null;
                },
                extraParams: {
                    classid: filter.classid
                },
                callbackfunc: function(values){
                    for (var i = 0; i < values.length; i++){
                        partnerDic[values[i].partnerid] = true;
                    }
                    func1();
                }
            });
        }
        else {
            func1();
        }
    });
};

hr.partner.updateRowById = function(host, id, data){
    var t = host.inputidboxes[id];
    if (t){
        while (t.tagName.toLowerCase() != "tr"){
            t = t.parentNode;
        }
        var oldRows = [t];
        for (var i = 0; i < host.design.rows.length - 1; i++){
            t = t.nextSibling;
            if (t) oldRows.push(t);
        }
        var newRows = hr.partner.getCellPartner(host, id, 1, data);
        for (var i = 0; i < oldRows.length; i++){
            var j = 0;
            if (i == 0){
                j = 1;
            }
            for (var m = oldRows[i].childNodes.length - 1; m >= j ; m--){
                oldRows[i].replaceChild(newRows[i].childNodes[m], oldRows[i].childNodes[m]);
            }
        }
    }
};

hr.partner.deleteRowById = function(host, id){
    var index = host.allPartnerIDList.indexOf(id);
    if (index >= 0) host.allPartnerIDList.splice(index, 1);
    index = host.idListView.indexOf(id);
    var t;
    if (index >= 0){
        for (var i = index + 1; i < host.countView; i++){
            t = host.inputidboxes[host.idListView[i]];
            if (t){
                while (t.tagName.toLowerCase() != "tr"){
                    t = t.parentNode;
                }
                t.firstChild.innerText = i;
            }
        }
        host.idListView.splice(index, 1);
    }
    t = host.inputidboxes[id];
    if (t){
        while (t.tagName.toLowerCase() != "tr"){
            t = t.parentNode;
        }
        var l = [t];
        for (var i = 0; i < host.design.rows.length; i++){
            t = t.nextSibling;
            if (t) l.push(t);
        }
        for (var i = 0; i < l.length; i++){
            l[i].remove();
        }
        host.countView--;
        delete l;
        delete host.inputidboxes[id];
    }
};

hr.partner.deletePartner = function(host, id, adminDelete = false){
    return new Promise(function(resolve, reject){
        console.log(adminDelete);
        ModalElement.show_loading();
        FormClass.api_call({
            url: "partner_delete.php",
            params: [
                {name: "id", value: id},
                {name: "adminDelete", value: adminDelete? 1 : 0}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        hr.partner.deleteRowById(host, id);
                        resolve();
                    }
                    else if (message == "lock_system"){
                        ModalElement.alert({message: LanguageModule.text("war_txt_system_lock")});
                    }
                    else if (message.startsWith("failed_has_data")){
                        if (systemconfig.privSystem >= 2){
                            ModalElement.alert({
                                message: LanguageModule.text("war_txt_failed_has_data_admin"),
                                func: function(){
                                    hr.partner.deletePartner(host, id, true).then(function(){
                                        resolve();
                                    });
                                }
                            });
                        }
                        else {
                            ModalElement.alert({message: LanguageModule.text("war_txt_failed_has_data_no_admin")});
                        }
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

hr.partner.deletePartnerConfirm = function(host, id){
    return new Promise(function(resolve, reject){
        var partnerData = data_module.getContent("partners", id);
        ModalElement.show_loading();
        var adminDelete = false;
        data_module.cacheContent_partner_class_links.psearch({
            searchFunc: function(record){
                if (extraParams.id == record.partnerid) return record;
                return null;
            },
            extraParams: {
                id: id
            },
            callbackfunc: function(partner_class_links){
                var listPromise = [];
                var cData, hasExtra = false;
                for (var i = 0; i < partner_class_links.length; i++){
                    if (partner_class_links[i].classid == 0) continue;
                    cData = data_module.getContent("partner_class", partner_class_links[i].classid);
                    if (cData.type_extra != 0){
                        listPromise.push(new Promise(function(rs, rj){
                            hr.partner.loadExtraDataByTypeid(host, id, cData.type_extra).then(function(value){
                                if (value.id > 0){
                                    hasExtra = true;
                                    rs();
                                }
                                else {
                                    rs();
                                }
                            });
                        }));
                    }
                }
                var func = function(){
                    ModalElement.close(-1);
                    ModalElement.question({
                        title: LanguageModule.text("war_title_delete_partner"),
                        message: LanguageModule.text2("war_txt_detele", [partnerData.name]),
                        onclick: function(sel){
                            if (sel == 0){
                                hr.partner.deletePartner(host, id, adminDelete).then(function(value){
                                    resolve(value);
                                });
                            }
                        }
                    });
                };
                if (listPromise.length == 0){
                    func();
                }
                else {
                    Promise.all(listPromise).then(function(values){
                        if (hasExtra){
                            if (systemconfig.privSystem >= 2){
                                ModalElement.alert({
                                    message: LanguageModule.text("war_txt_failed_has_data_admin"),
                                    func: function(){
                                        hr.partner.deletePartner(host, id, true).then(function(value){
                                            resolve(value);
                                        });
                                    }
                                });
                            }
                            else {
                                ModalElement.alert({message: LanguageModule.text("war_txt_failed_has_data_no_admin")});
                            }
                        }
                        else {
                            func();
                        }
                    });
                }
            }
        });
    });
};

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){
            data.ver = host.dataPartnerEdit.ver;
        }
        else {
            data.ver = 1;
        }
        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);
                    }
                    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"){
                        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;
                }
                host.dataPartnerEdit = st;
                host.drawPartnerViewFunc(host.viewPartner);
                if (ex){
                    host.drawPartnerExtraDataFunc();
                }
                if (host.redraw_history_func){
                    host.redraw_history_func();
                }
                if (!host.quick_open){
                    hr.partner.updateRowById(host, id, st);
                }
            }
            else {
                host.idListView.push(id);
                host.allPartnerIDList.push(id);
                host.countView++;
                id = st.id;
                hr.partner.showPartnerPre(host, id);
                var rows = hr.partner.getCellPartner(host, id, host.countView, st);
                for (var j = 0; j < rows.length; j++){
                    host.tableView.appendChild(rows[j]);
                }
            }
        });
    });
};

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: data_module.form_config.partner.typeid,
            formid: data_module.form_config.partner.input_form,
            initialValue: value,
            formContainer: formContainer,
            typelists: data_module.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.loadPartnerById = function(host, id){
    return new Promise(function(resolve, reject){
        var t, i, idlist;
        data_module.loadTables(["partners", "partner_class_links"], function(){
            ModalElement.close(-1);
            if (!data_module.cacheContent_partners.exists(id)){
                ModalElement.alert({
                    message: LanguageModule.text("war_txt_failed_data"),
                    func: function(){
                        hr.partner.init(host);
                    }
                });
                return;
            }
            var dataPartnerEdit = data_module.getContent("partners", id);
            if (!EncodingClass.type.isString(dataPartnerEdit.extrainfo)){
                contentModule.reportBug({
                    filename: "partner extrainfo not string",
                    data: EncodingClass.string.fromVariable(dataPartnerEdit)
                });
                dataPartnerEdit.extrainfo = {};
            }
            else {
                if (dataPartnerEdit.extrainfo == "") dataPartnerEdit.extrainfo = {};
                else dataPartnerEdit.extrainfo = EncodingClass.string.toVariable(dataPartnerEdit.extrainfo);
            }
            if ((dataPartnerEdit.nationid != 0) && (dataPartnerEdit.cityid != 0)){
                dataPartnerEdit.nation_city = [dataPartnerEdit.nationid, dataPartnerEdit.cityid];
            }
            else {
                dataPartnerEdit.nation_city = null;
            }
            dataPartnerEdit.class = [];
            data_module.cacheContent_partner_class_links.psearch({
                searchFunc: function(record){
                    if (record.partnerid == extraParams.partnerid){
                        return record.classid;
                    }
                    return null;
                },
                extraParams: {
                    partnerid: id
                },
                callbackfunc: function(classidList){
                    dataPartnerEdit.class = classidList;
                    resolve(dataPartnerEdit);
                }
            });
        });
    });
};

hr.partner.addPartner = function(host, id){
    if (id == 0){
        hr.partner.redrawDetails(host, id);
    }
    else {
        ModalElement.show_loading();
        hr.partner.loadPartnerById(host, id).then(function(dataPartnerEdit){
            host.dataPartnerEdit = dataPartnerEdit;
            hr.partner.redrawDetails(host, id);
        });
    }
};

hr.partner.checkin = function(host, partnerid, partnerGPS){
    return new Promise(function(resolve, reject){
        if (!host.employeeOfMe) host.employeeOfMe = data_module.employeeOfMe;
        if (host.employeeOfMe.length == 0){
            ModalElement.alert({message: LanguageModule.text("war_user_not_link_employee")});
            return;
        }
        if (host.checkintime && ((new Date().getTime() - host.checkintime.getTime()) > 60000)) return;
        host.checkintime = new Date();
        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();
        data_module.loadWorkflows_and_crmPrivileges().then(function(st){
            ModalElement.close(-1);
            host.employeeOfMe = st.employeeOfMe;
            delete st.employeeOfMe;
            contentModule.makeDatabaseContent(host, st);
            contentModule.makeOrgsIndex(host);
            contentModule.makeEmployeeData(host);
            contentModule.makeEmployeesIndex(host);
            if (st.configs_privileges){
                contentModule.makeEmployeeGroupMemberIndex(host);
                contentModule.makeConfigPrivileges(host);
            }
            host.usersDic = {};
            host.database.employees.items.forEach(function(item){
                host.usersDic[item.userid] = item.peopleid;
            });
            host.privilegesLoaded = true;
            resolve();
        });
    });
};

hr.partner.mergeExtraData = function(host, data){
    return new Promise(function(resolve, reject){
        FormClass.api_call({
            url: "partner_merge_extra.php",
            params: [{name: "data", value: EncodingClass.string.fromVariable(data)}],
            func: function(success, message){
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        data_module.refreshFlexDB("extradata_partner_links");
                        data_module.refreshFlexDB("extradata_partner", function(){

                        });
                        resolve();
                    }
                    else {
                        console.log(message);
                    }
                }
                else {
                    console.log(message);
                }
            }
        });
    });
};

hr.partner.loadExtraDataByTypeid = function(host, partnerid, typeid){
    return new Promise(function(resolve, reject){
        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"
                }
            }
        };
        console.log(pattern);
        fconnector.search("extradata_partner_links", pattern, function(value1) {
            console.log("11111", new Date().getTime());
            if (value1 && value1.length > 0){
                fconnector.read("extradata_partner_links", value1, function (success2, value2){
                    console.log("22222", new Date().getTime());
                    if (success2){
                        console.log(value2);
                        var extraIdList = [];
                        for (var i = 0; i < value2.length; i++){
                            extraIdList.push(value2[i].value.extraid);
                        }
                        extraIdList.sort(function(a, b){
                            return a - b;
                        });
                        console.log(extraIdList);
                        fconnector.read("extradata_partner", extraIdList, function (success3, value3){
                            console.log("33333", new Date().getTime());
                            if (success3){
                                console.log("value3", value3);
                                if (value3.length > 1){
                                    console.log(value3);
                                    var dataExtra = value3[value3.length - 1].value;
                                    for (var i = value3.length - 2; i >= 0; i--){
                                        for (var localid in dataExtra){
                                            console.log(localid, 1);
                                            console.log(value3[i].value[localid], 2);
                                            if (value3[i].value[localid] && EncodingClass.type.isArray(value3[i].value[localid])){
                                                 dataExtra[localid] = dataExtra[localid].concat(value3[i].value[localid]);
                                            }
                                        }
                                    }
                                    var links = [];
                                    for (var i = 1; i < value2.length; i++){
                                        links.push(value2[i]);
                                    }
                                    hr.partner.mergeExtraData(host, {
                                        links: links,
                                        dataExtra: {
                                            data: dataExtra,
                                            id: extraIdList[0]
                                        }
                                    }).then(function(){
                                        resolve({
                                            id: extraIdList[0],
                                            data: dataExtra
                                        });
                                    });
                                }
                                else {
                                    resolve({
                                        id: extraIdList[0],
                                        data: value3[0].value
                                    });
                                }
                            }
                            else {
                                resolve({id: 0});
                            }
                        });
                    }
                    else {
                        console.log("success2_", success2, "value2_", value2);
                        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 = {};
            data_module.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"){
                        resolve();
                        data_module.refreshFlexDB("extradata_partner_links");
                        data_module.refreshFlexDB("extradata_partner");
                        host.drawPartnerExtraDataSingle(host.partner_class_dataEdit, {data: data});
                        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: data_module.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: data_module.form_config.partner.typeid,
            formid: data_module.form_config.partner.output_form,
            initialValue: host.dataPartnerEdit,
            formContainer: viewPartner,
            typelists: data_module.typelists.items,
            variableType: "system"
        }).then(function(getValue){});
    };
    contentModule.makeDatabaseContent(host, {contact: []});
    host.drawContactListFunc = function(){
        var f1 = function(){
            var redraw = function(allContactIDList){
                host.hostContact.fromPartner = true;
                host.hostContact.partnerid = host.partnerid;
                host.hostContact.data_container = host.viewContact;
                host.hostContact.allContactIDList = allContactIDList;
                DOMElement.removeAllChildren(host.viewContact);
                hr.contact.init2(host.hostContact);
            };
            data_module.loadTables(["contacts"], function(){
                data_module.cacheContent_contacts.psearch({
                    searchFunc: function(record){
                        if (extraParams.partnerid == record.partnerid) return record.id;
                        return null;
                    },
                    extraParams: {
                        partnerid: id
                    },
                    callbackfunc: function(allContactIDList){
                        redraw(allContactIDList);
                    }
                });
            });
        };
        if (host.hostContact){
            f1();
        }
        else {
            host.hostContact = {
                database: {},
                holder: host.holder,
                frameList: host.frameList
            };
            data_module.loadContactsInit(host.hostContact).then(function(){
                f1();
            });
        }
    };
    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);
                        contentModule.makeParnerCheckinData(host);
                        hr.partner_checkin.redraw({
                            holder: host.holder,
                            user_column_configsDic: host.user_column_configsDic,
                            form_config: data_module.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;
                            });
                            console.log(st);
                            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(host.hostContact, 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){// TODO:
    var loadData = function(){
        ModalElement.show_loading();
        hr.partner.loadPartnerById(host, id).then(function(dataPartnerEdit){
            host.dataPartnerEdit = dataPartnerEdit;
            hr.partner.showPartner(host, id);
        });
    };
    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")});
                        hr.partner.deleteRowById(host, id);
                        resolve();
                    }
                    else if (message == "deleted"){
                        ModalElement.close();
                        ModalElement.alert({
                            message: "Đối tác không tồn tại",
                            func: function(){
                                resolve();
                            }
                        });
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

hr.partner.convertToContact = function(host, id){
    return new Promise(function(resolve, reject){
        var partnerData = data_module.getContent("partners", id);
        data_module.cacheContent_partner_class_links.psearch({
            searchFunc: function(record){
                if (record.partnerid == extraParams.id) return record.classid;
                return null;
            },
            extraParams: {
                id: id
            },
            callbackfunc: function(classList){
                var listPromise = [];
                var ni;
                for (var i = 0; i < classList.length; i++){
                    ni = classList[i];
                    var classData = data_module.getContent("partner_class", ni);
                    listPromise.push(new Promise(function(rs, rj){
                        hr.partner.loadExtraDataByTypeid(host, id, classData.type_extra).then(function(value){
                            if (value.id > 0){
                                ModalElement.alert({
                                    message: LanguageModule.text("war_txt_failed_has_data_not_convert")
                                });
                                return;
                            }
                            else {
                                rs();
                            }
                        });
                    }));
                }
                Promise.all(listPromise).then(function(values){
                    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(){
                        data_module.loadTables(["contacts"], function () {
                            var i, t, idlist;
                            data_module.cacheContent_contacts.psearch({
                                searchFunc: function(record){
                                    if (record.partnerid == extraParams.partnerid) return record.id;
                                    return null;
                                },
                                extraParams: {
                                    partnerid: id
                                },
                                callbackfunc: function(values){
                                    if (values.length > 0){
                                        ModalElement.alert({message: LanguageModule.text("war_txt_partner_has_contact")});
                                    }
                                    else {
                                        redraw();
                                    }
                                }
                            });
                        });
                    };
                    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.getExcelData = function(host){
    return new Promise(function(resolve, reject){
        hr.partner.makePartnerLinkData(host, host.idListView).then(function(){
            var pData;
            var exportContent = {
                row: 0,
                col: 0,
                data: [
                    {
                        row: 0,
                        col: 0,
                        colSpan: 5,
                        value: LanguageModule.text("txt_partner"),
                        bold: true,
                        horizontal: "center",
                        vertical: "middle"
                    }
                ]
            };
            exportContent.row = 2;
            exportContent.data.push({
                row: exportContent.row,
                col: exportContent.col++,
                value: LanguageModule.text("txt_index"),
                bold: true,
                backgroundcolor: "FFEBEBEB",
                horizontal: "center",
                vertical: "middle"
            });
            for (var i = 0; i < host.configColumnPartner.length; i++){
                exportContent.data.push({
                    row: exportContent.row,
                    col: exportContent.col++,
                    value: host.configColumnPartner[i].text,
                    bold: true,
                    backgroundcolor: "FFEBEBEB",
                    horizontal: "center",
                    vertical: "middle"
                });
            }
            for (var i = 0; i < host.idListView.length; i++){
                pData = data_module.getContent("partners", host.idListView[i]);
                if (!pData) continue;
                if (!pData) return [];
                if (pData.extrainfo != "") pData.extrainfo = EncodingClass.string.toVariable(pData.extrainfo);
                else pData = {};
                pData.class = host.partnerDataLinkDic[pData.id];
                if ((pData.nationid != 0) && (pData.cityid != 0)){
                    pData.nation_city = [pData.nationid, pData.cityid];
                }
                else {
                    pData.nation_city = null;
                }
                exportContent.row++;
                exportContent.col = 0;
                exportContent.data.push({
                    row: exportContent.row,
                    col: exportContent.col++,
                    value: i + 1,
                    horizontal: "center"
                });
                for (var j = 0; j < host.configColumnPartner.length; j++){
                    if (host.configColumnPartner[j].main) textValue = contentModule.getCellDynamicTable(host.configColumnPartner[j], pData[host.configColumnPartner[j].value]).innerText;
                    else textValue = contentModule.getCellDynamicTable(host.configColumnPartner[j], pData.extrainfo[host.configColumnPartner[j].value]).innerText;
                    exportContent.data.push({
                        row: exportContent.row,
                        col: exportContent.col++,
                        value: textValue
                    });
                }
            }
            for (var i = 1; i < exportContent.data.length; i++){
                exportContent.data[i].border = {
                    top: {style: 'thin', color: {argb: 'FF000000'}},
                    left: { style: 'thin', color: {argb: 'FF000000'}},
                    bottom: { style: 'thin', color: {argb: 'FF000000'}},
                    right: { style: 'thin', color: {argb: 'FF000000'}}
                };
            }
            var excelData = {
                sheets: [
                    {
                        name: LanguageModule.text("txt_partner"),
                        data: exportContent.data
                    }
                ]
            };
            resolve(excelData);
        });
    });
};

hr.partner.export = function(host){
    ModalElement.alert({message: LanguageModule.text("txt_export_notification")});
    hr.partner.getExcelData(host).then(function(excelData){
        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 + "js/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.viewMaps = function(host){
    theme.formPartnerViewMaps({
        idListView: host.idListView,
        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.extrainfo = EncodingClass.string.toVariable(st.extrainfo);
                    st.class = value.class;
                    st.nation_city = value.nation_city;
                    var t = data_module.getContent("partners", idList[0]);
                    st.userid = t.userid;
                    hr.partner.toggleMerge(host, false);
                    hr.partner.updateRowById(host, idList[0], st, true);
                    for (var i = 1; i < idList.length; i++){
                        hr.partner.deleteRowById(host, idList[i]);
                    }
                    host.frameList.removeLast();
                    hr.partner.toggleMerge(host, true);
                    window.backLayoutFunc.pop();
                    host.listPartnerMerge = {};
                    data_module.refreshFlexDB("extradata_partner_links");
                    data_module.refreshFlexDB("extradata_partner");
                }
                else if (message == "deleted"){
                    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 = {};
    data_module.typelists.items.forEach(function (elt, index) {
        dict[elt.id] = elt;
    });
    var mainData = contentModule.getMainData(data_module.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 = [];
        console.log(classValue);
        if (classValue.length == 0) ModalElement.close(-1);
        var listP = [];
        classValue.forEach(function(classid){
            listP.push(new Promise(function(rs, rj){
                var tid, dataExtra;
                var partner_class_data = data_module.getContent("partner_class", classid);
                if (partner_class_data){
                    dataExtra = [];
                    tid = partner_class_data.type_extra;
                    var promiseList = [];
                    for (var j = 0; j < list.length; j++){
                        if (list[j].class.indexOf(classid) >= 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, partner_class_data.type_extra).then(function(descriptor){
                                    descriptor.displayName = LanguageModule.text("txt_data_extra") + " (" + partner_class_data.name + ")";
                                    var x = absol.buildDom({
                                        tag: 'objectmergetool',
                                        props: {
                                            objects: dataExtra,
                                            descriptor: descriptor
                                        }
                                    });
                                    extra_infor_ctn.appendChild(x);
                                    extraList.push({
                                        typeid: partner_class_data.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(data_module.typelists.items);
    host.change_partner_class_func = function(classValue){
        ModalElement.show_loading();
        drawExtraInforFunc(classValue);
    };
    ModalElement.show_loading();
    contentModule.getFieldsMergeByTypeID(host, data_module.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();
                                window.backLayoutFunc.pop();
                            }
                        })]
                    }),
                    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();
    window.backLayoutFunc.push({
        func: function(){
            host.frameList.removeLast();
            window.backLayoutFunc.pop();
        }
    });
};

hr.partner.toggleCheckbox = function(host){
    var idList = [];
    for (var id in host.listPartnerMerge){
        if (host.listPartnerMerge[id]){
            idList.push(parseInt(id, 10));
        }
    }
    if (idList == 0){
        var t;
        for (var id in host.inputidboxes){
            t = host.inputidboxes[id];
            while (t.tagName.toLowerCase() != "tr"){
                t = t.parentNode;
            }
            t.childNodes[1].firstChild.style.display = "";
        }
        return;
    }
    var classList = [];
    for (var i = 0; i < idList.length; i++){
        if (host.partnerDataLinkDic[idList[i]].length == 1){
            classList.push(host.partnerDataLinkDic[idList[i]][0]);
            break;
        }
        else {
            if (params.classList.length == 0){
                for (var j = 0; j < host.partnerDataLinkDic[idList[i]].length; j++){
                    classList.push(host.partnerDataLinkDic[idList[i]][j]);
                }
            }
            else {
                for (var j = params.classList.length - 1; j >= 0; j--){
                    if (host.partnerDataLinkDic[idList[i]].indexOf(params.classList[j]) < 0){
                        classList.splice(j, 1);
                    }
                }
            }
        }
    }
    if (classList == 0){
        for (var id in host.inputidboxes){
            t = host.inputidboxes[id];
            while (t.tagName.toLowerCase() != "tr"){
                t = t.parentNode;
            }
            t.childNodes[1].firstChild.style.display = "";
        }
        return;
    }
    for (var id in host.inputidboxes){
        var ex = false;
        for (var i = 0; i < classList.length; i++){
            if (host.partnerDataLinkDic[id].indexOf(classList[i]) >= 0){
                ex = true;
                break;
            }
        }
        t = host.inputidboxes[id];
        while (t.tagName.toLowerCase() != "tr"){
            t = t.parentNode;
        }
        if (ex) t.childNodes[1].firstChild.style.display = "";
        else t.childNodes[1].firstChild.style.display = "none";
    }
};

hr.partner.getCheckboxElt = function(host, id){
    return absol.buildDom({
        tag: "checkbox",
        props: {
            checked: host.listPartnerMerge[id]
        },
        on: {
            change: function(){
                host.listPartnerMerge[id] = this.checked;
                hr.partner.toggleCheckbox(host);
            }
        }
    });
};

hr.partner.toggleMerge = function(host, merge_ing){
    var t;
    for (var id in host.inputidboxes){
        t = host.inputidboxes[id];
        if (merge_ing) t.parentNode.style.display = "none";
        else t.parentNode.style.display = "";
        while (t.tagName.toLowerCase() != "tr"){
            t = t.parentNode;
        }
        if (!merge_ing) t.removeChild(t.childNodes[1]);
        else t.insertBefore(DOMElement.td({
            attrs: {
                align: "center",
                colSpan: host.design.rows.length
            },
            children: [hr.partner.getCheckboxElt(host, id)]
        }), t.childNodes[1]);
    }
};

hr.partner.merge = function(host, save){
    if (save){
        var idList = [];
        for (var x in host.listPartnerMerge){
            if (host.listPartnerMerge[x]) idList.push(parseInt(x, 10));
        }
        if (idList.length < 2){
            ModalElement.alert({message: "Bạn phải chọn ít nhất 2 đối tác để trộn"});
            return;
        }
        var list = [];
        var res;
        for (var i = 0; i < idList.length; i++){
            res = data_module.getContent("partners", idList[i]);
            if (res.extrainfo == "") res.extrainfo = {};
            else res.extrainfo = EncodingClass.string.toVariable(res.extrainfo);
            res.nation_city = [res.nationid, res.cityid];
            res.class = host.partnerDataLinkDic[res.id];
            list.push(res);
        }
        hr.partner.redrawMerge(host, list);
    }
    else {
        host.merge_ing = true;
        host.listPartnerMerge = {};
        hr.partner.toggleMerge(host, true);
        host.back_btn_ctn.classList.remove("hidden");
        host.merge_save_btn_ctn.classList.remove("hidden");
        host.close_btn_ctn.classList.add("hidden");
        host.add_btn_ctn.classList.add("hidden");
        host.quickmenu_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 pData = data_module.getContent("partner_class", partner_classid);
        var data_ctn = DOMElement.div({});
        var typeDic = contentModule.makeDictionaryIndex(data_module.typelists.items);
        var items = [{value: 0, text: LanguageModule.text("txt_select_value")}];
        if (pData.type_extra != 0){
            var columnList = contentModule.getColumnListFromTypeid(host, pData.type_extra, {}, true);
            columnList.forEach(function(item){
                var tIndex = typeDic[item.type];
                var type = data_module.typelists.items[tIndex].type;
                if (type == "enum" || type == "extends_enum" || data_module.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(){
                                        var nation_city = nation_cities_select.value;
                                        var classid = partner_class_select.value;
                                        var filter = {
                                            classid: classid,
                                            nation_city: nation_city,
                                            searchValue: ""
                                        };
                                        hr.partner.searchDataFunc(filter).then(function(partnerIDList){
                                            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 pData = data_module.getContent("partner_class", classid);
                                            var data = {
                                                partnerIDList: partnerIDList,
                                                input_data: input_data.input,
                                                field: input_data.field,
                                                typeid: pData.type_extra
                                            };
                                            if (pData.type_extra != 0){
                                                var typeDict = {};
                                                data_module.typelists.items.forEach(function(elt){
                                                    typeDict[elt.id] = elt;
                                                });
                                                data.defaultData = contentModule.makeDefaultData(host, pData.type_extra, typeDict[pData.type_extra], typeDict);
                                                data.defaultData[input_data.field] = input_data.value;
                                            }
                                            var pattern;
                                            if (partnerIDList.length > 0){
                                                var minID, maxID;
                                                for (var i = 0; i < partnerIDList.length; i++){
                                                    if (i == 0){
                                                        minID = partnerIDList[i];
                                                        maxID = partnerIDList[i];
                                                    }
                                                    else {
                                                        if (minID > partnerIDList[i]) minID = partnerIDList[i];
                                                        if (maxID < partnerIDList[i]) maxID = partnerIDList[i];
                                                    }
                                                }
                                                pattern = {
                                                    type: "struct",
                                                    cond: "and",
                                                    children: {
                                                        partnerid: {
                                                            type: "number",
                                                            cond: "[range]",
                                                            minval: minID,
                                                            maxval: maxID
                                                        },
                                                        typeid: {
                                                            type: "number",
                                                            cond: "eq",
                                                            value: pData.type_extra
                                                        },
                                                        extraid: {
                                                            type: "number",
                                                            cond: "true"
                                                        }
                                                    }
                                                };
                                            }
                                            else {
                                                pattern = {
                                                    type: "struct",
                                                    cond: "and",
                                                    children: {
                                                        partnerid: {
                                                            type: "number",
                                                            cond: "eq",
                                                            value: partnerIDList[0]
                                                        },
                                                        typeid: {
                                                            type: "number",
                                                            cond: "eq",
                                                            value: pData.type_extra
                                                        },
                                                        extraid: {
                                                            type: "number",
                                                            cond: "true"
                                                        }
                                                    }
                                                };
                                            }
                                            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: pData.type_extra
                                            };
                                            fconnector.search("extradata_partner_links", pattern, function(linkIdList){
                                                data.linkIdList = linkIdList;
                                                console.log(data);
                                                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 = "";
                                                            }
                                                            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.getDisplayDicFromDesign = function(design){
    var res = {};
    if (!design.rows) return res;
    for (var i = 0; i < design.rows.length; i++){
        if (design.rows[i].cells){
            for (var j = 0; j < design.rows[i].cells.length; j++){
                if (design.rows[i].cells[j].variables){
                    for (var k = 0; k < design.rows[i].cells[j].variables.length; k++){
                        res[design.rows[i].cells[j].variables[k].name] = true;
                    }
                }
            }
        }
    }
    return res;
};

hr.partner.getCellPartner = function(host, id, stt, res){
    if (!res){
        res = data_module.getContent("partners", id);
        if (!res) return [];
        if (res.extrainfo != "") res.extrainfo = EncodingClass.string.toVariable(res.extrainfo);
        else res = {};
        res.class = host.partnerDataLinkDic[res.id];
        if ((res.nationid != 0) && (res.cityid != 0)){
            res.nation_city = [res.nationid, res.cityid];
        }
        else {
            res.nation_city = null;
        }
    }
    if (host.workFlowViewPartner){
        var func = host.func;
    }
    else if (host.objectSelectPartner){
        if (host.partnerNotViewDic[res.id]) return null;
        var func = {
            view: function(){
                checkboxElt.checked = !checkboxElt.checked;
                host.checked_dic[res.id] = checkboxElt.checked;
            }
        };
    }
    else if (host.selectOnePartner){
        var func = {
            view: function(){
                radioElt.checked = true;
                host.valueChecked = res.id;
            }
        };
    }
    else {
        var func = {
            view: function(){
                if (!host.merge_ing) hr.partner.showPartnerPre(host, res.id);
            },
            markedFunc: function(id, marked){
                return contentModule.markedFunc(null, {
                    id: id,
                    marked: marked,
                    task: "partner",
                    tablename: "partner"
                });
            }
        };
        func.delete = function(){
            return new Promise(function(resolve, reject){
                hr.partner.deletePartnerConfirm(host, res.id);
            });
        };
        func.checkin = function(){
            hr.partner.checkin(host, res.id, res.gps);
        };
        func.convert_to_contact = function(){
            return new Promise(function(resolve, reject){
                hr.partner.convertToContact(host, res.id).then(function(value){
                    resolve(value);
                });
            });
        };
    }
    res.created_user = res.userid;
    var pData = data_module.getContent("peoples", host.usersDic[res.userid]);
    if (pData) res.created_user = pData.fullname;
    else res.created_user = res.userid;
    var rows = contentModule.getCellNewTable(host.design, host.configColumnPartnerDic, res, 3, function(){
        if (func.view) func.view(res.id);
    });
    if (host.markedDic[res.id]){
        starElt = contentModule.getstarIconView();
        rows[0].children[0].appendChild(starElt);
    }
    if (host.objectSelectPartner){
        var checkboxElt = absol.buildDom({
            tag: "checkbox",
            props: {
                checked: host.checked_dic[res.id]
            },
            on: {
                change: function(){
                    host.checked_dic[res.id] = this.checked;
                }
            }
        });
        host.checkboxBoxes[res.id] = checkboxElt;
        rows[0].insertBefore(DOMElement.td({
            attrs: {
                rowSpan: host.design.rows.length, style: {width: "40px", textAlign: "center"}
            },
            children: [checkboxElt]
        }), rows[0].firstChild);
    }
    else if (host.selectOnePartner){
        var radioElt = absol.buildDom({
            tag: "radio",
            props: {
                name: "radio_" + host.randomId,
                checked: res.id == host.valueChecked
            },
            on: {
                change: function(){
                    host.valueChecked = res.id;
                }
            }
        });
        rows[0].insertBefore(DOMElement.td({
            attrs: {
                rowSpan: host.design.rows.length, style: {width: "40px", textAlign: "center"}
            },
            children: [radioElt]
        }), rows[0].firstChild);
    }
    if (!host.selectOnePartner) rows[0].insertBefore(DOMElement.td({
        attrs: {
            rowSpan: host.design.rows.length, style: {width: "40px", textAlign: "center", cursor: "pointer", color: "burlywood"},
            onclick: function(){
                if (func.view) func.view(res.id);
            }
        },
        text: stt
    }), rows[0].firstChild);
    var starElt;
    if (!host.objectSelectPartner && !host.selectOnePartner) {
        var qmenuButton = DOMElement.div({
            attrs: {
                className: "card-icon-cover"
            },
            children: [DOMElement.i({
                attrs: {
                    className: "material-icons bsc-icon-hover-black",
                    style: {color: "burlywood"}
                },
                text: "more_vert"
            })]
        });
        host.inputidboxes[res.id] = qmenuButton;
        absol.QuickMenu.toggleWhenClick(qmenuButton, {
            getMenuProps: function(){
                var quickMenuItems = [];
                if (func.view) quickMenuItems.push({
                    text: LanguageModule.text("txt_view"),
                    extendClasses: "bsc-quickmenu",
                    icon: DOMElement.i({
                        attrs: {
                            className: "material-icons"
                        },
                        text: "visibility"
                    }),
                    cmd: function(){
                        func.view(res.id);
                    }
                });
                if (func.checkin) quickMenuItems.push({
                    text: LanguageModule.text("txt_checkin"),
                    extendClasses: ["bsc-quickmenu"],
                    icon: DOMElement.i({
                        attrs: {
                            className: "mdi mdi-store-marker-outline"
                        }
                    }),
                    cmd: function(){
                        func.checkin();
                    }
                });
                if (func.markedFunc){
                    if (host.markedDic[res.id]){
                        quickMenuItems.push({
                            text: LanguageModule.text("txt_remove_marked"),
                            extendClasses: ["bsc-quickmenu"],
                            icon: DOMElement.i({
                                attrs: {
                                    className: "material-icons",
                                    style: {
                                        color: "#ffa834"
                                    }
                                },
                                text: "star_border"
                            }),
                            cmd: function(){
                                func.markedFunc(res.id, false).then(function(){
                                    host.markedDic[res.id] = false;
                                    starElt.remove();
                                });
                            }
                        });
                    }
                    else {
                        quickMenuItems.push({
                            text: LanguageModule.text("txt_add_to_marked"),
                            extendClasses: ["bsc-quickmenu"],
                            icon: DOMElement.i({
                                attrs: {
                                    className: "material-icons",
                                    style: {
                                        color: "#ffa834"
                                    }
                                },
                                text: "star"
                            }),
                            cmd: function(){
                                func.markedFunc(res.id, true).then(function(){
                                    host.markedDic[res.id] = true;
                                    starElt = contentModule.getstarIconView();
                                    rows[0].children[1].appendChild(starElt);
                                });
                            }
                        });
                    }
                }
                if (func.convert_to_contact) quickMenuItems.push({
                    text: LanguageModule.text("txt_convert_to_contact"),
                    extendClasses: ["bsc-quickmenu"],
                    icon: DOMElement.i({
                        attrs: {
                            className: "mdi mdi-account-convert"
                        }
                    }),
                    cmd: function(){
                        func.convert_to_contact();
                    }
                });
                if (func.delete) quickMenuItems.push({
                    text: LanguageModule.text("txt_delete"),
                    extendClasses: ["bsc-quickmenu", "red"],
                    icon: DOMElement.i({
                        attrs: {
                            className: "material-icons"
                        },
                        text: "delete"
                    }),
                    cmd: function(){
                        func.delete(res.id);
                    }
                });
                return {items: quickMenuItems};
            },
            onSelect: function (item){
                item.cmd();
            }
        }, [3, 4]);
        rows[0].appendChild(DOMElement.td({
            attrs: {rowSpan: host.design.rows.length, style: {width: "40px", textAlign: "center"}},
            children: [qmenuButton]
        }));
    }
    return rows;
};

hr.partner.makePartnerLinkData = function(host, idList, filter){
    return new Promise(function(resolve, reject){
        var dic = {};
        for (var i = 0; i < idList.length; i++){
            dic[idList[i]] = true;
        }
        data_module.cacheContent_partner_class_links.psearch({
            searchFunc: function(record){
                if (extraParams.dic[record.partnerid]) return record;
                return null;
            },
            extraParams: {
                dic: dic
            },
            callbackfunc: function(values){
                if (filter){
                    var isSearchNew = false;
                    if (host.inputsearchbox.value.trim() !== "") isSearchNew = true;
                    if (host.nation_cities_select.value[0] !== 0) isSearchNew = true;
                    if (host.partner_class_select.value !== 0) isSearchNew = true;
                    var newFilter;
                    if (isSearchNew){
                        newFilter = {
                            searchValue: host.inputsearchbox.value.trim(),
                            classid: host.partner_class_select.value,
                            nation_city: host.nation_cities_select.value,
                            marked_value: host.marked_view_elt? host.marked_view_elt.value : false,
                            markedDic: host.markedDic
                        };
                    }
                    else {
                        newFilter = {};
                    }
                    if (EncodingClass.string.compare(filter, newFilter)){
                        console.log("cancel");;
                        return;
                    }
                }
                for (var i = 0; i < idList.length; i++){
                    host.partnerDataLinkDic[idList[i]] = [];
                }
                for (var i = 0; i < values.length; i++){
                    if (host.partnerDataLinkDic[values[i].partnerid]) host.partnerDataLinkDic[values[i].partnerid].push(values[i].classid);
                }
                resolve();
            }
        });
    });
};

hr.partner.redraw = function(host){
    if (!host) return;
    host.inputidboxes = {};
    host.partnerDataLinkDic = {};
    var func = function(filter){
        host.countView = 0;
        var startView = 0;
        host.done = false;
        var getIDList = function(){
            startView = host.countView;
            var idList = [];
            for (var i = host.countView; i < host.countView + 30; i++){
                if (i >= host.idListView.length){
                    host.countView = i;
                    host.done = true;
                    break;
                }
                idList.push(host.idListView[i]);
            }
            if (!host.done) host.countView = host.countView + 30;
            return idList;
        };
        var idList = getIDList();
        hr.partner.makePartnerLinkData(host, idList, filter).then(function(){
            ModalElement.close(-1);
            var data = [], rows;
            if (host.selectOnePartner){
                if (host.allValue || host.selectValue){
                    var radioElt = absol.buildDom({
                        tag: "radio",
                        props: {
                            name: "radio_" + host.randomId,
                            checked: host.valueChecked == 0
                        },
                        on: {
                            change: function(){
                                host.valueChecked = 0;
                            }
                        }
                    });
                    data.push([
                        {
                            attrs: {align: "center"},
                            children: [radioElt]
                        },
                        {
                            attrs: {
                                colSpan: 100,
                                onclick: function(){
                                    radioElt.checked = true;
                                    host.valueChecked = 0;
                                }
                            },
                            text: host.allValue? LanguageModule.text("txt_all_partner") : LanguageModule.text("txt_select_value")
                        }
                    ]);
                }
            }
            for (var i = 0; i < idList.length; i++){
                rows = hr.partner.getCellPartner(host, idList[i], i + 1);
                if (rows === null) continue;
                for (var j = 0; j < rows.length; j++){
                    data.push(rows[j]);
                }
            }
            host.tableView = DOMElement.table({
                attrs: {style: {backgroundColor: "white"}},
                data: data
            });
            if (host.merge_ing){
                hr.partner.toggleMerge(host, true);
                var ex = false;
                for (var k in host.listPartnerMerge){
                    if (host.listPartnerMerge[k]){
                        ex = true;
                    }
                }
                if (ex) hr.partner.toggleCheckbox(host);
            }
            if (hr.isMobile) host.tableView.style.width = "100%";
            DOMElement.removeAllChildren(host.data_container);
            var table_ctn = DOMElement.table({
                data: [[{
                    attrs: {
                        className: "hrnewtableclass"
                    },
                    children: [host.tableView]
                }]]
            });
            if (hr.isMobile) table_ctn.style.width = "100%";
            host.data_container.appendChild(table_ctn);
            if (!host.done){
                host.see_more_ctn = DOMElement.div({
                    attrs: {style: {paddingTop: "20px", textAlign: "center"}},
                    children: [DOMElement.span({
                        attrs: {
                            style: {
                                color: "var(--a-color)",
                                cursor: "pointer"
                            },
                            onclick: function(){
                                var idList = getIDList();
                                if (host.done) DOMElement.removeAllChildren(host.see_more_ctn);
                                ModalElement.show_loading();
                                hr.partner.makePartnerLinkData(host, idList).then(function(){
                                    ModalElement.close(-1);
                                    var rows;
                                    for (var i = 0; i < idList.length; i++){
                                        rows = hr.partner.getCellPartner(host, idList[i], startView + i + 1);
                                        if (rows === null) continue;
                                        for (var j = 0; j < rows.length; j++){
                                            host.tableView.appendChild(rows[j]);
                                        }
                                    }
                                    if (host.merge_ing){
                                        hr.partner.toggleMerge(host, true);
                                        var ex = false;
                                        for (var k in host.listPartnerMerge){
                                            if (host.listPartnerMerge[k]){
                                                ex = true;
                                            }
                                        }
                                        if (ex) hr.partner.toggleCheckbox(host);
                                    }
                                });
                            }
                        },
                        text: LanguageModule.text("txt_see_more")
                    })]
                });
                table_ctn.appendChild(host.see_more_ctn);
            }
            if (!host.workFlowViewPartner) host.data_container.appendChild(DOMElement.div({attrs: {style: {height: "var(--footer-margin)"}}}));
        });
    };
    var isSearch = false;
    if (host.inputsearchbox.value.trim() !== "") isSearch = true;
    if (!host.nation_cities_select.value) console.log(host.nation_cities_select);
    if (host.nation_cities_select.value && (host.nation_cities_select.value[0] !== 0)) isSearch = true;
    if (host.partner_class_select.value !== 0) isSearch = true;
    if (!host.workFlowViewPartner) ModalElement.show_loading();
    var filter;
    if (isSearch){
        filter = {
            searchValue: host.inputsearchbox.value.trim(),
            classid: host.partner_class_select.value,
            nation_city: host.nation_cities_select.value,
            marked_value: host.marked_view_elt? host.marked_view_elt.value : false,
            markedDic: host.markedDic
        };
        hr.partner.searchDataFunc(filter, host).then(function(idList){
            host.idListView = idList;
            if (host.idListView.length == 0){
                ModalElement.close(-1);
                DOMElement.removeAllChildren(host.data_container);
                host.data_container.appendChild(DOMElement.div({
                    attrs: {align: "center", style: {paddingTop: "20px", color: "red"}},
                    text: "Không tìm thấy kết quả phù hợp"
                }));
                return;
            }
            func(filter);
        }, function(value){
            if (value == "cancel"){
                // TODO:
            }
        });
    }
    else {
        filter = {};
        if (host.marked_view_elt && host.marked_view_elt.value){
            host.idListView = [];
            for (var x in host.markedDic){
                if (host.markedDic[x]) host.idListView.push(x);
            }
            if (host.idListView.length == 0){
                ModalElement.close(-1);
                DOMElement.removeAllChildren(host.data_container);
                host.data_container.appendChild(DOMElement.div({
                    attrs: {align: "center", style: {paddingTop: "20px", color: "red"}},
                    text: "Không tìm thấy kết quả phù hợp"
                }));
                return;
            }
        }
        else {
            host.idListView = EncodingClass.string.duplicate(host.allPartnerIDList);
            if (host.workFlowViewPartner && host.idListView.length == 0){
                ModalElement.close(-1);
                return;
            }
        }
        func(filter);
    }
};

hr.partner.init2 = function(host){
    host.design = contentModule.getDesign(host, "partner", hr.isMobile);
    var displayDic = hr.partner.getDisplayDicFromDesign(host.design);
    var columnList = contentModule.getColumnListFromDatatype(host, "partner", displayDic);
    if (displayDic.id) columnList.unshift({value: "id", display: true, main: true, type: -1, text: "ID"});
    if (displayDic.created_user) columnList.push({value: "created_user", display: true, main: true, type: -1, text: LanguageModule.text("txt_created_user")});
    if (displayDic.createdtime) columnList.push({value: "createdtime", display: true, main: true, type: -5, text: LanguageModule.text("txt_created_time")});
    host.columnList = columnList;
    contentModule.getColumnListConfig(host, undefined, columnList).then(function(values){
        host.configColumnPartner = values;
        host.configColumnPartnerDic = {};
        for (var i = 0; i < values.length; i++){
            host.configColumnPartnerDic[values[i].value] = values[i];
        }
        // ModalElement.close(-1);
        hr.partner.redraw(host);
    });
};

hr.partner.init = function(host){
    return new Promise(function(resolveMn, rejectMn){
        hr.menu.changeCurrentUrlTab(host, "partner");
        host.database = {};
        host.merge_ing = false;
        ModalElement.show_loading();
        data_module.loadPartnersInit(host).then(function(content){
            var cmdbutton = {
                close: function () {
                    if (hr.isMobile) {
                        host.holder.selfRemove();
                        theme.mobileInitBack();
                    }
                    else {
                        hr.menu.tabPanel.removeTab(host.holder.id);
                    }
                },
                add: function (event, me) {
                    hr.partner.addPartner(host, 0);
                },
                view_maps: function(){
                    hr.partner.viewMaps(host);
                },
                merge: function(){
                    hr.partner.merge(host, false);
                },
                merge_save: function(){
                    hr.partner.merge(host, true);
                },
                back: function(){
                    hr.partner.toggleMerge(host, false);
                    host.merge_ing = false;
                    host.back_btn_ctn.classList.add("hidden");
                    host.merge_save_btn_ctn.classList.add("hidden");
                    host.close_btn_ctn.classList.remove("hidden");
                    host.add_btn_ctn.classList.remove("hidden");
                    host.quickmenu_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,
                data_container: host.data_container,
                database: host.database,
                func: {
                    export: function(){
                        hr.partner.export(host);
                    },
                    filter_change_func: function(){
                        hr.partner.redraw(host);
                    },
                    display_setting: function(){
                        contentModule.display_setting(host, "partner", function(){
                            hr.partner.init2(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.merge_save_btn_ctn = singlePage.merge_save_btn_ctn;
            host.add_btn_ctn = singlePage.add_btn_ctn;
            host.quickmenu_btn_ctn = singlePage.quickmenu_btn_ctn;
            host.frameList.addChild(singlePage);
            singlePage.requestActive();
            hr.partner.init2(host);
            resolveMn(host);
        });
    });
};

VaKeR 2022