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/activities.js
hr.activities.makeUserMarkerData = function(host){
    var idxDic = {};
    for (var i = 0; i < host.database.activities.items.length; i++){
        host.database.activities.items[i].marked = false;
        if (host.database.activities.items[i].taskid) idxDic["task_" + host.database.activities.items[i].taskid] = i;
        else idxDic["meeting_" + host.database.activities.items[i].meetingid] = i;
    }
    var k;
    for (var i = 0; i < host.database.user_marked.items.length; i++){
        if (host.database.user_marked.items[i].tablename != "activities") continue;
        k = idxDic[host.database.user_marked.items[i].taskid];
        if (k >= 0) host.database.activities.items[k].marked = true;
    }
    var holderForSort = host.database.activities.items.map(function(item){
        return {
            item: item,
            val: absol.string.nonAccentVietnamese(item.name.toLowerCase()),
            marked: item.marked
        }
    });
    holderForSort.sort(function(a, b){
        if (a.marked > b.marked) return -1;
        if (a.marked < b.marked) return 1;
        if (a.val < b.val) return -1;
        if (a.val > b.val) return 1;
        return 0;
    });
    host.database.activities.items = holderForSort.map(function(holder){
        return holder.item;
    });
};


hr.activities.deleteActivitiesTask = function(host, id){
    var end, start, employeeid, activity_type, timeValue, status;
    if (!host.quick_open) {
        activity_type = host.activity_type.value;
        // employeeid = host.employee.value;
        employeeid = host.empDict;
        status = host.status.value;
        timeValue = host.time.getValue();
        start = new Date(timeValue.specificValue.start);
        end = new Date(timeValue.specificValue.end);
    }
    var today = new Date();
    today.setHours(0,0,0,0);
    return new Promise(function(resolve,reject){
        ModalElement.show_loading();
        FormClass.api_call({
            url: "tasks_delete.php",
            params: [{name: "id", value: id}],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        data_module.loadTables(["tasks"], function(){
                            var index = host.database.activities.getIndex("task_" + id);
                            var deleteContent = host.database.activities.items[index];
                            if (deleteContent.status == "success") host.chartContent.success--;
                            else if (deleteContent.status == "pending") host.chartContent.pending--;
                            else host.chartContent.unsuccess--;
                            host.chartContent.count--;
                            host.database.activities.items.splice(index, 1);
                            host.chartContainer.clearChild();
                            host.chartContainer.addChild(theme.formOnboardingEmployeeInformationChart(host.chartContent));
                            resolve(index);
                        })
                    }
                    else if (message == "lock_system"){
                        ModalElement.alert({message: LanguageModule.text("war_txt_system_lock")});
                    }
                    else if (message == "failed_used"){
                        ModalElement.alert({
                            message: LanguageModule.text("war_txt_can_not_delete")
                        });
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

hr.activities.deleteActivitiesTaskConfirm = function(host, id, name){
    return new Promise(function(resolve,reject){
        ModalElement.question({
            title: LanguageModule.text("war_title_delete_activities_task"),
            message: LanguageModule.text2("war_txt_detele", [name]),
            onclick: function(sel){
                if (sel == 0){
                    hr.activities.deleteActivitiesTask(host, id).then(function(value){
                        resolve(value);
                    });
                }
            }
        });
    });
};

hr.activities.deleteActivitiesMeeting = function(host, id){
    var end, start, employeeid, activity_type, timeValue, status;
    if (!host.quick_open) {
        activity_type = host.activity_type.value;
        // employeeid = host.employee.value;
        employeeid = host.empDict;
        status = host.status.value;
        timeValue = host.time.getValue();
        start = new Date(timeValue.specificValue.start);
        end = new Date(timeValue.specificValue.end);
    }
    var today = new Date();
    today.setHours(0,0,0,0);
    return new Promise(function(resolve,reject){
        ModalElement.show_loading();
        FormClass.api_call({
            url: "meetings_delete.php",
            params: [{name: "id", value: id}],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        data_module.loadTables(["meetings"], function(){
                            var index = host.database.activities.getIndex("meeting_" + id);
                            var deleteContent = host.database.activities.items[index];
                            if (deleteContent.status == "success") host.chartContent.success--;
                            else if (deleteContent.status == "pending") host.chartContent.pending--;
                            else host.chartContent.unsuccess--;
                            host.chartContent.count--;
                            host.database.activities.items.splice(index, 1);
                            host.chartContainer.clearChild();
                            host.chartContainer.addChild(theme.formOnboardingEmployeeInformationChart(host.chartContent));
                            resolve(index);
                        })
                    }
                    else if (message == "lock_system"){
                        ModalElement.alert({message: LanguageModule.text("war_txt_system_lock")});
                    }
                    else if (message == "failed_used"){
                        ModalElement.alert({
                            message: LanguageModule.text("war_txt_can_not_delete")
                        });
                    }
                    else {
                        ModalElement.alert({message: message});
                    }
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
        });
    });
};

hr.activities.deleteActivitiesMeetingConfirm = function(host, id, name){
    return new Promise(function(resolve,reject){
        ModalElement.question({
            title: LanguageModule.text("war_title_delete_activities_meeting"),
            message: LanguageModule.text2("war_txt_detele", [name]),
            onclick: function(sel){
                if (sel == 0){
                    hr.activities.deleteActivitiesMeeting(host, id).then(function(value){
                        resolve(value);
                    });
                }
            }
        });
    });
};
hr.activities.showActivities = function(host, params){
    host.drawGeneralInforFunc = function(viewGeneralInformation){
        if (viewGeneralInformation) host.viewGeneralInformation = viewGeneralInformation;
        else viewGeneralInformation = host.viewGeneralInformation;
        contentModule.makeOutputFormData({
            typeid: host.form_config[params.activityType].typeid,
            formid: host.form_config[params.activityType].output_form,
            initialValue: params.activityType == "meeting" ? host.dataMeetingEdit : host.dataTaskEdit,
            formContainer: viewGeneralInformation,
            typelists: data_module.typelists.items,
            variableType: "system"
        }).then(function(getValue){});
    };
    theme.formActivitiesView(host, params);
};

hr.activities.showActivitiesTaskQuickModePre = function(host, id){
    ModalElement.show_loading();
    FormClass.api_call({
        url: "database_load.php",
        params: [
            {name: "task", value: "task_load_by_id_quick_mode"},
            {name: "id", value: id}
        ],
        func: function(success, message){
            ModalElement.close(-1);
            if (success){
                if (message.substr(0, 2) == "ok"){
                    var st = EncodingClass.string.toVariable(message.substr(2));
                    host.dataTaskEdit = st.task;
                    host.employeeOfMe = st.employeeOfMe;
                    delete st.employeeOfMe;
                    delete st.task;
                    host.dataTaskEdit.activityid = id;
                    host.dataTaskEdit.id = "task_" + id;
                    st.activities = [host.dataTaskEdit];
                    host.database = {};
                    contentModule.makeDatabaseContent(host, st);
                    host.form_config = contentModule.configVariable(host);
                    host.user_column_configsDic = contentModule.getUser_column_configsDic(host);
                    if (host.dataTaskEdit.participant.indexOf("_") != -1) {
                        var participantStr = host.dataTaskEdit.participant.split("_");
                        var participant = [];
                        for (var i = 0; i < participantStr.length; i++) {
                            if (participantStr[i] == "") continue;
                            participant.push(parseInt(participantStr[i], 10));
                        }
                        host.dataTaskEdit.participant = participant;
                    }
                    else host.dataTaskEdit.participant = EncodingClass.string.toVariable(host.dataTaskEdit.participant);
                    hr.activities.showActivities(host, {
                        activityType: "task",
                        activityid: id,
                        editInforFunc: function(){
                            hr.activities.addActivitiesTask(host, id, function(){}, function(){}, function(){});
                        }
                    });
                }
                else if (message == "war_txt_failed_data"){
                    ModalElement.alert({
                        message: LanguageModule.text("war_txt_failed_data"),
                        func: function(){
                            hr.activities.init(host);
                        }
                    });
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
            else {
                ModalElement.alert({message: message});
            }
        }
    });
};

hr.activities.showActivitiesTaskPre = function(host, id, resolve){
    host.dataTaskEdit = data_module.cacheContent_tasks.read(id);
    if (host.dataTaskEdit.extrainfo == "") host.dataTaskEdit.extrainfo = {};
    else host.dataTaskEdit.extrainfo = EncodingClass.string.toVariable(host.dataTaskEdit.extrainfo);
    if (host.dataTaskEdit.participant.indexOf("_") != -1) {
        var participantStr = host.dataTaskEdit.participant.split("_");
        var participant = [];
        for (var i = 0; i < participantStr.length; i++) {
            if (participantStr[i] == "") continue;
            participant.push(parseInt(participantStr[i], 10));
        }
        host.dataTaskEdit.participant = participant;
    }
    else host.dataTaskEdit.participant = EncodingClass.string.toVariable(host.dataTaskEdit.participant);
    hr.activities.showActivities(host, {
        activityType: "task",
        activityid: id,
        editInforFunc: function(){
            hr.activities.addActivitiesTask(host, id, resolve, function(){}, function(){});
        }
    });
};

hr.activities.showActivitiesMeetingQuickModePre = function(host, id){
    ModalElement.show_loading();
    FormClass.api_call({
        url: "database_load.php",
        params: [
            {name: "task", value: "meeting_load_by_id_quick_mode"},
            {name: "id", value: id}
        ],
        func: function(success, message){
            ModalElement.close(-1);
            if (success){
                if (message.substr(0, 2) == "ok"){
                    var st = EncodingClass.string.toVariable(message.substr(2));
                    host.dataMeetingEdit = st.meeting;
                    host.employeeOfMe = st.employeeOfMe;
                    delete st.employeeOfMe;
                    delete st.meeting;
                    host.dataMeetingEdit.activityid = id;
                    host.dataMeetingEdit.id = "meeting_" + id;
                    st.activities = [host.dataMeetingEdit];
                    host.database = {};
                    contentModule.makeDatabaseContent(host, st);
                    host.form_config = contentModule.configVariable(host);
                    host.user_column_configsDic = contentModule.getUser_column_configsDic(host);
                    if (host.dataMeetingEdit.participant.indexOf("_") != -1) {
                        var participantStr = host.dataMeetingEdit.participant.split("_");
                        var participant = [];
                        for (var i = 0; i < participantStr.length; i++) {
                            if (participantStr[i] == "") continue;
                            participant.push(parseInt(participantStr[i], 10));
                        }
                        host.dataMeetingEdit.participant = participant;
                    }
                    else host.dataMeetingEdit.participant = EncodingClass.string.toVariable(host.dataMeetingEdit.participant);
                    hr.activities.showActivities(host, {
                        activityType: "meeting",
                        activityid: id,
                        editInforFunc: function(){
                            hr.activities.addActivitiesMeeting(host, id, function(){}, function(){}, function(){});
                        }
                    });
                }
                else if (message == "war_txt_failed_data"){
                    ModalElement.alert({
                        message: LanguageModule.text("war_txt_failed_data"),
                        func: function(){
                            hr.activities.init(host);
                        }
                    });
                }
                else {
                    ModalElement.alert({message: message});
                }
            }
            else {
                ModalElement.alert({message: message});
            }
        }
    });
};

hr.activities.showActivitiesMeetingPre = function(host, id, resolve){
    host.dataMeetingEdit = data_module.cacheContent_meetings.read(id);
    if (host.dataMeetingEdit.extrainfo == "") host.dataMeetingEdit.extrainfo = {};
    else host.dataMeetingEdit.extrainfo = EncodingClass.string.toVariable(host.dataMeetingEdit.extrainfo);
    if (host.dataMeetingEdit.participant.indexOf("_") != -1) {
        var participantStr = host.dataMeetingEdit.participant.split("_");
        var participant = [];
        for (var i = 0; i < participantStr.length; i++) {
            if (participantStr[i] == "") continue;
            participant.push(parseInt(participantStr[i], 10));
        }
        host.dataMeetingEdit.participant = participant;
    }
    else host.dataMeetingEdit.participant = EncodingClass.string.toVariable(host.dataMeetingEdit.participant);
    hr.activities.showActivities(host, {
        activityType: "meeting",
        activityid: id,
        editInforFunc: function(){
            hr.activities.addActivitiesMeeting(host, id, resolve, function(){}, function(){});
        }
    });
};

hr.activities.addActivitiesMeeting = function(host, id, resolve, resolveAdd, resolveClose){
    if (id > 0) hr.menu.changeCurrentUrlTab(host, "activities_meeting/" + id);
    host.id = id;
    function redraw(value){
        var formContainer = DOMElement.div({});
        theme.addActivitiesMeetingForm({
            title: LanguageModule.text("txt_activities_meeting"),
            formContainer: formContainer,
            frameList: host.frameList,
            func: {
                save: function(){
                    if (host.id == 0){
                        return hr.activities.addActivitiesMeetingSubmit(host, host.id, getValueFunction).then(function(value){
                            if (value !== undefined) resolveAdd(value);
                        });
                    }
                    else {
                        return hr.activities.addActivitiesMeetingSubmit(host, host.id, getValueFunction).then(function(value){
                            resolve(value);
                        });
                    }
                },
                cancel: function(){
                    resolveClose();
                    return hr.activities.addActivitiesMeetingClose(host, host.id, getValueFunction, resolve, resolveAdd);
                }
            }
        });
        var getValueFunction;
        contentModule.makeFormData({
            typeid: host.form_config.meeting.typeid,
            formid: host.form_config.meeting.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(host.dataMeetingEdit);
    }
    else {
        redraw({assignto: host.employeeOfMe[0]});
    }
};

hr.activities.addActivitiesMeetingSubmit = function(host, id, getValueFunction){
    var end, start, employeeid, activity_type, timeValue, f_status;
    if (!host.quick_open) {
        activity_type = host.activity_type.value;
        // employeeid = host.employee.value;
        employeeid = host.empDict;
        f_status = host.status.value;
        timeValue = host.time.getValue();
        start = new Date(timeValue.specificValue.start);
        end = new Date(timeValue.specificValue.end);
    }
    return new Promise(function(resolve, reject){
        var today = new Date();
        today.setHours(0,0,0,0);
        var data = getValueFunction();
        if (!data) return;
        var oldData;
        if (id > 0){
            oldData = host.dataMeetingEdit;
            var ischange = contentModule.isChanged(oldData, data,
                ["name", "type", "location", "status", "starttime", "endtime", "allday", "reminder", "assignto", "participant", "result"]
            );
            if (!ischange){
                resolve("not_change");
                return;
            }
        }
        for (var i = 0; i < host.database.activities.items.length; i++){
            if (host.database.activities.items[i].id == "meeting_" + id) continue;
            if (host.database.activities.items[i].name.toLowerCase() == data.name.toLowerCase()){
                ModalElement.alert({message: LanguageModule.text("war_txt_exist_name")});
                return;
            }
        }
        data.id = id;
        data.status = data.status ? 1 : 0;
        data.allday = data.allday ? 1 : 0;
        participantStr = "";
        data.participant.forEach(function(elt){
            participantStr += "_" + elt;
        });
        if (participantStr != "") participantStr += "_";
        data.participant = participantStr;
        if (id > 0){
            data.ver = host.dataMeetingEdit.ver;
        }
        else {
            data.ver = 1;
        }
        data.extrainfo = EncodingClass.string.fromVariable(data.extrainfo);
        delete data.uts;
        ModalElement.show_loading();
        FormClass.api_call({
            url: "activities_meeting_save.php",
            params: [{name: "data", value: EncodingClass.string.fromVariable(data)}],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        data_module.loadTables(["meetings"], function(){
                            var status, endtime;
                            if (id > 0) {
                                status = host.dataMeetingEdit.status;
                                endtime = host.dataMeetingEdit.endtime;
                            }
                            host.dataMeetingEdit = EncodingClass.string.toVariable(message.substr(2));
                            if (host.dataMeetingEdit.extrainfo == "") host.dataMeetingEdit.extrainfo = {};
                            else host.dataMeetingEdit.extrainfo = EncodingClass.string.toVariable(host.dataMeetingEdit.extrainfo);
                            if (host.dataMeetingEdit.participant.indexOf("_") != -1) {
                                var participantStr = host.dataMeetingEdit.participant.split("_");
                                var participant = [];
                                for (var i = 0; i < participantStr.length; i++) {
                                    if (participantStr[i] == "") continue;
                                    participant.push(parseInt(participantStr[i], 10));
                                }
                                host.dataMeetingEdit.participant = participant;
                            }
                            else host.dataMeetingEdit.participant = EncodingClass.string.toVariable(host.dataMeetingEdit.participant);
                            host.dataMeetingEdit.meetingid = host.dataMeetingEdit.id;
                            host.dataMeetingEdit.id = "meeting_" + host.dataMeetingEdit.id;
                            host.dataMeetingEdit.activityType = "type_meeting";
                            if (id > 0){
                                if (status == 1) host.chartContent.success--;
                                else if (endtime >= today) host.chartContent.pending--;
                                else host.chartContent.unsuccess--;
                                host.chartContent.count--;
                                var index = host.database.activities.getIndex("meeting_" + id);
                                host.database.activities.items[index].name = host.dataMeetingEdit.name;
                                host.database.activities.items[index].assignto = host.dataMeetingEdit.assignto;
                                if (host.dataMeetingEdit.status == 1) host.database.activities.items[index].status = "success";
                                else if (host.dataMeetingEdit.endtime >= today) host.database.activities.items[index].status = "pending";
                                else host.database.activities.items[index].status = "unsuccess";
                                host.drawGeneralInforFunc();
                            }
                            else {
                                id = host.dataMeetingEdit.meetingid;
                                data.id = host.dataMeetingEdit.id;
                                host.id = host.dataMeetingEdit.id;
                                var t = {
                                    id: host.dataMeetingEdit.id,
                                    meetingid: parseInt(host.dataMeetingEdit.id.substr(8)),
                                    name: host.dataMeetingEdit.name,
                                    assignto: host.dataMeetingEdit.assignto
                                };
                                t.func = {
                                    view: function(host, id){
                                        return function(resolve) {
                                            hr.activities.showActivitiesMeetingPre(host, id, resolve);
                                        }
                                    }(host, t.meetingid),
                                    delete: function(host, id, name){
                                        return function() {
                                            return new Promise(function(resolve,reject){
                                                hr.activities.deleteActivitiesMeetingConfirm(host, id, name).then(function(value){
                                                    resolve(value);
                                                });
                                            });
                                        }
                                    }(host, t.meetingid, t.name),
                                    changeStatus: function(host, id){
                                        return function(value){
                                            return new Promise(function(resolve, reject){
                                                var t = data_module.cacheContent_meetings.read(id);
                                                if (t.status == 1) host.chartContent.success--;
                                                else if (t.endtime >= today) host.chartContent.pending--;
                                                else host.chartContent.unsuccess--;
                                                host.chartContent.count--;
                                                hr.activities.activitiesStatusChangeSave(host, "meeting", t, value, {chartContainer: host.chartContainer}).then(function(message){
                                                    resolve(message);
                                                });
                                            }, function(err){console.log(err);});
                                        }
                                    }(host, t.meetingid),
                                    markedFunc: function(host, id){
                                        return function(marked){
                                            return contentModule.markedFunc(host, {
                                                id: "meeting_" + id,
                                                marked: marked,
                                                task: "activities",
                                                tablename: "activities"
                                            });
                                        }
                                    }(host, t.meetingid)
                                }
                                if (host.dataMeetingEdit.status == 1) t.status = "success";
                                else if (host.dataMeetingEdit.endtime >= today) t.status = "pending";
                                else t.status = "unsuccess";
                                host.database.activities.items.unshift(t);
                                hr.menu.changeCurrentUrlTab(host, "activities");
                            }
                            if (
                                (
                                    !host.quick_open
                                ) && (
                                    f_status == "all"
                                    || (f_status == "completed" && host.dataMeetingEdit.status == 1)
                                    || (f_status == "uncompleted" && host.dataMeetingEdit.status == 0)
                                    || (f_status == "doing" && host.dataMeetingEdit.endtime >= today && host.dataMeetingEdit.status == 0)
                                    || (f_status == "overdue" && host.dataMeetingEdit.endtime <= today && host.dataMeetingEdit.status == 0)
                                ) && (
                                    activity_type == "all"
                                    || host.dataMeetingEdit.activityType == activity_type
                                ) && (
                                    employeeid[host.dataMeetingEdit.assignto]
                                    // employeeid == 0
                                    // || host.dataMeetingEdit.assignto == employeeid
                                ) && (
                                    host.dataMeetingEdit.endtime >= start
                                    && host.dataMeetingEdit.endtime < end
                                )
                            ) {
                                if (host.dataMeetingEdit.status == 1) host.chartContent.success++;
                                else if (host.dataMeetingEdit.endtime >= today) host.chartContent.pending++;
                                else host.chartContent.unsuccess++;
                                host.chartContent.count++;
                                host.chartContainer.clearChild();
                                host.chartContainer.addChild(theme.formOnboardingEmployeeInformationChart(host.chartContent));
                            }
                            resolve("");
                        })
                    }
                    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.activities.addActivitiesMeetingClose = function(host, id, getValueFunction, resolve, resolveAdd){
    return new Promise(function(rs, rj){
        var data = getValueFunction("no_alert");
        if (!data) {
            rs();
            return;
        }
        var oldData;
        if (id > 0){
            oldData = host.dataMeetingEdit;
        }
        else {
            oldData = {
                name: "",
                type: "type_visit",
                location: "",
                status: 0,
                starttime: new Date(),
                endtime: new Date(),
                allday: 0,
                reminder: "type_reminder_none",
                assignto: 0,
                participant: [],
                result: ""
            };
        }
        data.allday = data.allday ? 1 : 0;
        data.status = data.status ? 1 : 0;
        if (oldData.participant === undefined) oldData.participant = [];
        var ischange = contentModule.isChanged(oldData, data,
            ["name", "type", "location", "status", "starttime", "endtime", "allday", "reminder", "assignto", "participant", "result"]
        );
        if (!ischange){
            rs();
            return;
        }
        contentModule.questionChange({
            onclick: function(sel){
                if (sel == 0){
                    if (host.id == 0){
                        hr.activities.addActivitiesMeetingSubmit(host, host.id, getValueFunction).then(function(value){
                            if (value !== undefined) resolveAdd(value);
                            rs();
                        });
                    }
                    else {
                        hr.activities.addActivitiesMeetingSubmit(host, host.id, getValueFunction).then(function(value){
                            resolve(value);
                            rs();
                        });
                    }
                }
                else if (sel == 1){
                    rs();
                }
            }
        });
    });
};

hr.activities.addActivitiesTask = function(host, id, resolve, resolveAdd, resolveClose){
    if (id > 0) hr.menu.changeCurrentUrlTab(host, "activities_task/" + id);
    host.id = id;
    function redraw(value){
        var formContainer = DOMElement.div({});
        theme.addActivitiesTaskForm({
            title: LanguageModule.text("txt_activities_task"),
            formContainer: formContainer,
            frameList: host.frameList,
            func: {
                save: function(){
                    if (host.id == 0){
                        return hr.activities.addActivitiesTaskSubmit(host, host.id, getValueFunction).then(function(value){
                            if (value !== undefined) resolveAdd(value);
                        });
                    }
                    else {
                        return hr.activities.addActivitiesTaskSubmit(host, host.id, getValueFunction).then(function(value){
                            resolve(value);
                        });
                    }
                },
                cancel: function(){
                    resolveClose();
                    return hr.activities.addActivitiesTaskClose(host, host.id, getValueFunction, resolve, resolveAdd);
                }
            }
        });
        var getValueFunction;
        contentModule.makeFormData({
            typeid: host.form_config.task.typeid,
            formid: host.form_config.task.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(host.dataTaskEdit);
    }
    else {
        redraw({assignto: host.employeeOfMe[0]});
    }
};

hr.activities.addActivitiesTaskClose = function(host, id, getValueFunction, resolve, resolveAdd){
    return new Promise(function(rs, rj){
        var data = getValueFunction("no_alert");
        if (!data) {
            rs();
            return;
        }
        var oldData;
        if (id > 0){
            oldData = host.dataTaskEdit;
        }
        else {
            oldData = {
                name: "",
                status: 0,
                endtime: new Date(),
                reminder: "type_reminder_none",
                assignto: 0,
                participant: [],
                result: ""
            };
        }
        data.status = data.status ? 1 : 0;
        if (oldData.participant === undefined) oldData.participant = [];
        var ischange = contentModule.isChanged(oldData, data,
            ["name", "status", "endtime", "reminder", "assignto", "participant", "result"]
        );
        if (!ischange){
            rs();
            return;
        }
        contentModule.questionChange({
            onclick: function(sel){
                if (sel == 0){
                    if (host.id == 0){
                        hr.activities.addActivitiesTaskSubmit(host, host.id, getValueFunction).then(function(value){
                            if (value !== undefined) resolveAdd(value);
                            rs();
                        });
                    }
                    else {
                        hr.activities.addActivitiesTaskSubmit(host, host.id, getValueFunction).then(function(value){
                            resolve(value);
                            rs();
                        });
                    }
                }
                else if (sel == 1){
                    rs();
                }
            }
        });
    });
};

hr.activities.addActivitiesTaskSubmit = function(host, id, getValueFunction){
    var end, start, employeeid, activity_type, timeValue, f_status;
    activity_type = host.activity_type.value;
    // employeeid = host.employee.value;
    employeeid = host.empDict;
    f_status = host.status.value;
    timeValue = host.time.getValue();
    start = new Date(timeValue.specificValue.start);
    end = new Date(timeValue.specificValue.end);
    return new Promise(function(resolve, reject){
        var today = new Date();
        today.setHours(0,0,0,0);
        var data = getValueFunction();
        if (!data) return;
        var oldData;
        if (id > 0){
            oldData = host.dataTaskEdit;
            var ischange = contentModule.isChanged(oldData, data,
                ["name", "status", "endtime", "reminder", "assignto", "participant", "result"]
            );
            if (!ischange){
                resolve("not_change");
                return;
            }
        }
        for (var i = 0; i < host.database.activities.items.length; i++){
            if (host.database.activities.items[i].taskid == id) continue;
            if (host.database.activities.items[i].name.toLowerCase() == data.name.toLowerCase()){
                ModalElement.alert({message: LanguageModule.text("war_txt_exist_name")});
                return;
            }
        }
        data.id = id;
        data.status = data.status? 1 : 0;
        participantStr = "";
        data.participant.forEach(function(elt){
            participantStr += "_" + elt;
        });
        if (participantStr != "") participantStr += "_";
        data.participant = participantStr;
        if (id > 0){
            data.ver = host.dataTaskEdit.ver;
        }
        else {
            data.ver = 1;
        }
        data.extrainfo = EncodingClass.string.fromVariable(data.extrainfo);
        delete data.uts;
        console.log(data);
        ModalElement.show_loading();
        FormClass.api_call({
            url: "activities_task_save.php",
            params: [{name: "data", value: EncodingClass.string.fromVariable(data)}],
            func: function(success, message){
                ModalElement.close(-1);
                if (success){
                    if (message.substr(0, 2) == "ok"){
                        data_module.loadTables(["tasks"], function(){
                            var status, endtime;
                            if (id > 0) {
                                status = host.dataTaskEdit.status;
                                endtime = host.dataTaskEdit.endtime;
                            }
                            host.dataTaskEdit = EncodingClass.string.toVariable(message.substr(2));
                            if (host.dataTaskEdit.extrainfo == "") host.dataTaskEdit.extrainfo = {};
                            else host.dataTaskEdit.extrainfo = EncodingClass.string.toVariable(host.dataTaskEdit.extrainfo);
                            if (host.dataTaskEdit.participant.indexOf("_") != -1) {
                                var participantStr = host.dataTaskEdit.participant.split("_");
                                var participant = [];
                                for (var i = 0; i < participantStr.length; i++) {
                                    if (participantStr[i] == "") continue;
                                    participant.push(parseInt(participantStr[i], 10));
                                }
                                host.dataTaskEdit.participant = participant;
                            }
                            else host.dataTaskEdit.participant = EncodingClass.string.toVariable(host.dataTaskEdit.participant);
                            host.dataTaskEdit.taskid = host.dataTaskEdit.id;
                            host.dataTaskEdit.id = "task_" + host.dataTaskEdit.id;
                            host.dataTaskEdit.activityType = "type_task";
                            if (id > 0){
                                if (status == 1) host.chartContent.success--;
                                else if (endtime >= today) host.chartContent.pending--;
                                else host.chartContent.unsuccess--;
                                host.chartContent.count--;
                                var index = host.database.activities.getIndex("task_" + id);
                                host.database.activities.items[index].name = host.dataTaskEdit.name;
                                host.database.activities.items[index].assignto = host.dataTaskEdit.assignto;
                                if (host.dataTaskEdit.status == 1) host.database.activities.items[index].status = "success";
                                else if (host.dataTaskEdit.endtime >= today) host.database.activities.items[index].status = "pending";
                                else host.database.activities.items[index].status = "unsuccess";
                                host.drawGeneralInforFunc();
                            }
                            else {
                                id = host.dataTaskEdit.taskid;
                                data.id = host.dataTaskEdit.id;
                                host.id = host.dataTaskEdit.id;
                                var t = {
                                    id: host.dataTaskEdit.id,
                                    taskid: parseInt(host.dataTaskEdit.id.substr(5)),
                                    name: host.dataTaskEdit.name,
                                    assignto: host.dataTaskEdit.assignto,
                                };
                                t.func = {
                                    view: function(host, id){
                                        return function(resolve) {
                                            hr.activities.showActivitiesTaskPre(host, id, resolve);
                                        }
                                    }(host, t.taskid),
                                    delete: function(host, id, name){
                                        return function() {
                                            return new Promise(function(resolve,reject){
                                                hr.activities.deleteActivitiesTaskConfirm(host, id, name).then(function(value){
                                                    resolve(value);
                                                });
                                            });
                                        }
                                    }(host, t.taskid, t.name),
                                    changeStatus: function(host, id){
                                        return function(value){
                                            return new Promise(function(resolve, reject){
                                                var t = data_module.cacheContent_meetings.read(id);
                                                if (t.status == 1) host.chartContent.success--;
                                                else if (t.endtime >= today) host.chartContent.pending--;
                                                else host.chartContent.unsuccess--;
                                                host.chartContent.count--;
                                                hr.activities.activitiesStatusChangeSave(host, "meeting", t, value, {chartContainer: host.chartContainer}).then(function(message){
                                                    resolve(message);
                                                });
                                            }, function(err){console.log(err);});
                                        }
                                    }(host, t.taskid),
                                    markedFunc: function(host, id){
                                        return function(marked){
                                            return contentModule.markedFunc(host, {
                                                id: "meeting_" + id,
                                                marked: marked,
                                                task: "activities",
                                                tablename: "activities"
                                            });
                                        }
                                    }(host, t.taskid)
                                }
                                if (host.dataTaskEdit.status == 1) t.status = "success";
                                else if (host.dataTaskEdit.endtime >= today) t.status = "pending";
                                else t.status = "unsuccess";
                                host.database.activities.items.unshift(t);
                                hr.menu.changeCurrentUrlTab(host, "activities");
                            }
                            if (
                                (
                                    f_status == "all"
                                    || (f_status == "completed" && host.dataTaskEdit.status == 1)
                                    || (f_status == "uncompleted" && host.dataTaskEdit.status == 0)
                                    || (f_status == "doing" && host.dataTaskEdit.endtime >= today && host.dataTaskEdit.status == 0)
                                    || (f_status == "overdue" && host.dataTaskEdit.endtime <= today && host.dataTaskEdit.status == 0)
                                ) && (
                                    activity_type == "all"
                                    || host.dataTaskEdit.activityType == activity_type
                                ) && (
                                    employeeid[host.dataTaskEdit.assignto]
                                    // employeeid == 0
                                    // || host.dataTaskEdit.assignto == employeeid
                                ) && (
                                    host.dataTaskEdit.endtime >= start
                                    && host.dataTaskEdit.endtime < end
                                )
                            ) {
                                if (host.dataTaskEdit.status == 1) host.chartContent.success++;
                                else if (host.dataTaskEdit.endtime >= today) host.chartContent.pending++;
                                else host.chartContent.unsuccess++;
                                host.chartContent.count++;
                                host.chartContainer.clearChild();
                                host.chartContainer.addChild(theme.formOnboardingEmployeeInformationChart(host.chartContent));
                            }
                            resolve("");
                        })
                    }
                    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.activities.activitiesStatusChangeSave = function(host, activityName, content, status, params){
    return new Promise(function(resolve, reject){
        var status_filter = host.status.value;
        var today = new Date();
        today.setHours(0,0,0,0);
        ModalElement.show_loading();
        FormClass.api_call({
            url: "onboarding_activities_status_change_save.php",
            params: [
                {name: "activityName", value: activityName},
                {name: "id", value: content.id},
                {name: "status", value: status ? 1 : 0}
            ],
            func: function(success, message){
                ModalElement.close(-1);
                if (success) {
                    if (message.substr(0, 2) == "ok"){
                        var tables = [];
                        if (activityName == "meeting") tables.push("meetings");
                        else tables.push("tasks");
                        data_module.loadTables(tables, function(){
                            var index = host.database.activities.getIndex(activityName + "_" + content.id);
                            if (host.database.activities.items[index].status == 1) host.database.activities.items[index].status = "success";
                            else if (host.database.activities.items[index].endtime >= today) host.database.activities.items[index].status = "pending";
                            else host.database.activities.items[index].status = "unsuccess";
                            if (
                                status_filter == "all"
                                || (status_filter == "completed" && content.status == 1)
                                || (status_filter == "uncompleted" && content.status == 0)
                                || (status_filter == "doing" && content.endtime >= today && content.status == 0)
                                || (status_filter == "overdue" && content.endtime <= today && content.status == 0)
                            ) {
                                if (status) host.chartContent.success++;
                                else if (content.endtime >= today) host.chartContent.pending++;
                                else host.chartContent.unsuccess++;
                                host.chartContent.count++;
                                params.chartContainer.clearChild();
                                params.chartContainer.addChild(theme.formOnboardingEmployeeInformationChart(host.chartContent));
                            }
                            resolve("");
                        });
                    }
                    else {
                        console.log(message);
                        reject(message);
                    }
                }
                else {
                    console.log(message);
                    reject(message);
                }
            }
        });
    });
}

hr.activities.redraw = function(host){
    host.employeeid = [];
    var employeeid = host.employee.values;

    host.employee.values.forEach((item, i) => {
        if (item > 0) host.employeeid.push(item);
        else {
            host.employeeid = host.employeeid.concat(host.database.orgs.items[host.dictionary.orgs[-item]].allEmployeeIdList);
        }
    });

    host.employeeid = host.employeeid.filter(function(elt, index){
        var t1 = host.employeeid.indexOf(elt) == index;
        var t2 = true;
        if (systemconfig.privSystem < 2) {
            t2 = host.privilegesDic[-elt].view_activities || host.privilegesDic[-elt].edit_activities;
        }
        return t1 && t2;
    });

    host.empDict = {};

    host.employeeid.forEach((item, i) => {
        host.empDict[item] = 1;
    });

    var timeValue = host.time.getValue();
    var start = new Date(timeValue.specificValue.start);
    var end = new Date(timeValue.specificValue.end);
    var today = new Date();
    today.setHours(0,0,0,0);
    var filter = {
        status: host.status.value,
        activity_type: host.activity_type.value,
        starttime: start,
        endtime: end,
        privSystem: systemconfig.privSystem,
        today: today,
        userid: systemconfig.userid
    };
    var dictionary = {
        meetings: {},
        tasks: {}
    };
    var meetingFilter = function(elt){
        if (elt.participant.indexOf("_") != -1) {
            var participantStr = elt.participant.split("_");
            var participant = [];
            for (var i = 0; i < participantStr.length; i++) {
                if (participantStr[i] == "") continue;
                participant.push(parseInt(participantStr[i], 10));
            }
            elt.participant = participant;
        }
        else if (elt.participant == "") elt.participant = [];
        else elt.participant = EncodingClass.string.toVariable(elt.participant);
        var y = false;
        for (i = 0; i < elt.participant.length; i++){
            if (extraParams.empDict[elt.participant[i]]) {
                y = true;
                break;
            }
        }
        if (!extraParams.empDict[elt.assignto] && !y) return null;

        if (elt.endtime < extraParams.filter.starttime || elt.endtime >= extraParams.filter.endtime) return null;
        if (extraParams.filter.status != "all") {
            switch (extraParams.filter.status) {
                case "completed":
                    if (elt.status == 0) return null;
                    break;
                case "uncompleted":
                    if (elt.status == 1) return null;
                    break;
                case "overdue":
                    if (elt.status == 1 || elt.endtime >= extraParams.filter.today) return null;
                    break;
                default:
                    if (elt.status == 1 || elt.endtime < extraParams.filter.today) return null;
            }
        }
        var isView = false;
        if (
            extraParams.filter.privSystem >= 2
            || (extraParams.empDict2[elt.assignto] && extraParams.filter.userid == extraParams.empDict2[elt.assignto].userid)
            || (extraParams.privilegesDic[-elt.assignto] && extraParams.privilegesDic[-elt.assignto].view_activities)
            || (extraParams.privilegesDic[-elt.assignto] && extraParams.privilegesDic[-elt.assignto].edit_activities)
        ) isView = true;

        if (!isView) {
            for (i = 0; i < elt.participant.length; i++){
                if (
                    (extraParams.empDict2[elt.participant[i]] && extraParams.filter.userid == extraParams.empDict2[elt.participant[i]].userid)
                    || (extraParams.privilegesDic[-elt.participant[i]] && extraParams.privilegesDic[-elt.participant[i]].edit_activities)
                    || (extraParams.privilegesDic[-elt.participant[i]] && extraParams.privilegesDic[-elt.participant[i]].view_activities)
                ) {
                    isView = true;
                    break;
                }
            }
        }
        elt.meetingid = elt.id;
        elt.assignto = elt.assignto;
        elt.id = "meeting_" + elt.id;
        elt.activityType = "type_meeting";
        if (isView) {
            var status;
            if (elt.status == 1) status = "success";
            else if (elt.endtime >= extraParams.filter.today) status = "pending";
            else status = "unsuccess";
            var ret = {
                id: elt.id,
                meetingid: elt.meetingid,
                status: status,
                name: elt.name,
                assignto: elt.assignto
            };
            return ret;
        }
        else {
            console.log(999);
            return null;
        }
    };
    var taskFilter = function(elt){
        if (elt.participant.indexOf("_") != -1) {
            var participantStr = elt.participant.split("_");
            var participant = [];
            for (var i = 0; i < participantStr.length; i++) {
                if (participantStr[i] == "") continue;
                participant.push(parseInt(participantStr[i], 10));
            }
            elt.participant = participant;
        }
        else if (elt.participant == "") elt.participant = [];
        else elt.participant = EncodingClass.string.toVariable(elt.participant);
        var y = false;
        for (i = 0; i < elt.participant.length; i++){
            if (extraParams.empDict[elt.participant[i]]) {
                y = true;
                break;
            }
        }
        if (!extraParams.empDict[elt.assignto] && !y) return null;
        if (elt.endtime < extraParams.filter.starttime || elt.endtime >= extraParams.filter.endtime) return null;
        if (extraParams.filter.status != "all") {
            switch (extraParams.filter.status) {
                case "completed":
                    if (elt.status == 0) return null;
                    break;
                case "uncompleted":
                    if (elt.status == 1) return null;
                    break;
                case "overdue":
                    if (elt.status == 1 || elt.endtime >= extraParams.filter.today) return null;
                    break;
                default:
                    if (elt.status == 1 || elt.endtime < extraParams.filter.today) return null;
            }
        }
        var isView = false;
        if (
            extraParams.filter.privSystem >= 2
            || (extraParams.empDict2[elt.assignto] && extraParams.filter.userid == extraParams.empDict2[elt.assignto].userid)
            || (extraParams.privilegesDic[-elt.assignto] && extraParams.privilegesDic[-elt.assignto].view_activities)
            || (extraParams.privilegesDic[-elt.assignto] && extraParams.privilegesDic[-elt.assignto].edit_activities)
        ) isView = true;
        if (!isView) {
            for (i = 0; i < elt.participant.length; i++){
                if (
                    (extraParams.empDict2[elt.participant[i]] && extraParams.filter.userid == extraParams.empDict2[elt.participant[i]].userid)
                    || (extraParams.privilegesDic[-elt.participant[i]] && extraParams.privilegesDic[-elt.participant[i]].edit_activities)
                    || (extraParams.privilegesDic[-elt.participant[i]] && extraParams.privilegesDic[-elt.participant[i]].view_activities)
                ) {
                    isView = true;
                    break;
                }
            }
        }
        elt.taskid = elt.id;
        elt.assignto = elt.assignto;
        elt.id = "task_" + elt.id;
        elt.activityType = "type_task";
        if (isView) {
            var status;
            if (elt.status == 1) status = "success";
            else if (elt.endtime >= extraParams.filter.today) status = "pending";
            else status = "unsuccess";
            var ret = {
                id: elt.id,
                taskid: elt.taskid,
                status: status,
                name: elt.name,
                assignto: elt.assignto
            };
            return ret;
        }
        else {
            return null;
        }
    };
    var meetingLinkFilter = function(elt){
        if (extraParams.dictionary.meetings[elt.meetingid] !== undefined) {
            return elt;
        }
        return null;
    };
    var taskLinkFilter = function(elt){
        if (extraParams.dictionary.tasks[elt.taskid] !== undefined) {
            return elt;
        }
        return null;
    };
    ModalElement.show_loading();
    var tables = [];
    if (filter.activity_type == "all" || filter.activity_type == "type_meeting") {
        tables.push("meetings");
        tables.push("meeting_links");
    }
    if (filter.activity_type == "all" || filter.activity_type == "type_task") {
        tables.push("tasks");
        tables.push("task_links");
    }
    data_module.loadTables(tables, function(){
        var content = {
            meetings: [],
            meeting_links: [],
            tasks: [],
            task_links: []
        };
        var p1 = false, p2 = false;
        if (filter.activity_type == "all" || filter.activity_type == "type_meeting") {
            data_module.cacheContent_meetings.psearch({
                extraParams: {
                    empDict: host.empDict,
                    empDict2: host.dictionary.employees,
                    privilegesDic: host.privilegesDic,
                    filter: filter
                },
                searchFunc: meetingFilter,
                postFunc: function (record) {
                    record.func = {
                        view: function(host, id){
                            return function(resolve) {
                                hr.activities.showActivitiesMeetingPre(host, id, resolve);
                            }
                        }(host, record.meetingid),
                        delete: function(host, id){
                            return function() {
                                return new Promise(function(resolve,reject){
                                    hr.activities.deleteActivitiesMeetingConfirm(host, id, record.name).then(function(value){
                                        resolve(value);
                                    });
                                });
                            }
                        }(host, record.meetingid),
                        changeStatus: function(host, id){
                            return function(value){
                                return new Promise(function(resolve, reject){
                                    var t = data_module.cacheContent_meetings.read(id);
                                    if (t.status == 1) host.chartContent.success--;
                                    else if (t.endtime >= today) host.chartContent.pending--;
                                    else host.chartContent.unsuccess--;
                                    host.chartContent.count--;
                                    hr.activities.activitiesStatusChangeSave(host, "meeting", t, value, {chartContainer: host.chartContainer}).then(function(message){
                                        resolve(message);
                                    });
                                }, function(err){console.log(err);});
                            }
                        }(host, record.meetingid),
                        markedFunc: function(host, id){
                            return function(marked){
                                return contentModule.markedFunc(host, {
                                    id: "meeting_" + id,
                                    marked: marked,
                                    task: "activities",
                                    tablename: "activities"
                                });
                            }
                        }(host, record.meetingid)
                    }
                    return record;
                },
                callbackfunc: function (values) {
                    content.meetings = values;
                    content.meetings.forEach((cur, idx) => {
                        dictionary.meetings[cur.meetingid] = idx;
                    });
                    data_module.cacheContent_meeting_links.psearch({
                        extraParams: {
                            dictionary: dictionary
                        },
                        searchFunc: meetingLinkFilter,
                        postFunc: function (record) {
                            content.meetings[dictionary.meetings[record.meetingid]].tablename = record.tablename;
                            content.meetings[dictionary.meetings[record.meetingid]].instanceid = record.instanceid;
                            return record;
                        },
                        callbackfunc: function (values) {
                            content.meeting_links = values;
                            p1 = true;
                        }
                    });
                }
            });
        }
        else {
            p1 = true;
        }
        if (filter.activity_type == "all" || filter.activity_type == "type_task") {
            data_module.cacheContent_tasks.psearch({
                extraParams: {
                    empDict: host.empDict,
                    empDict2: host.dictionary.employees,
                    privilegesDic: host.privilegesDic,
                    filter: filter
                },
                searchFunc: taskFilter,
                postFunc: function (record) {
                    record.func = {
                        view: function(host, id){
                            return function(resolve) {
                                hr.activities.showActivitiesTaskPre(host, id, resolve);
                            }
                        }(host, record.taskid),
                        delete: function(host, id){
                            return function() {
                                return new Promise(function(resolve,reject){
                                    hr.activities.deleteActivitiesTaskConfirm(host, id, record.name).then(function(value){
                                        resolve(value);
                                    });
                                });
                            }
                        }(host, record.taskid),
                        changeStatus: function(host, id){
                            return function(value){
                                return new Promise(function(resolve, reject){
                                    var t =  data_module.cacheContent_tasks.read(id);
                                    if (t.status == 1) host.chartContent.success--;
                                    else if (t.endtime >= today) host.chartContent.pending--;
                                    else host.chartContent.unsuccess--;
                                    host.chartContent.count--;
                                    hr.activities.activitiesStatusChangeSave(host, "task", t, value, {chartContainer: host.chartContainer}).then(function(message){
                                        resolve(message);
                                    });
                                }, function(err){console.log(err);});
                            }
                        }(host, record.taskid),
                        markedFunc: function(host, id){
                            return function(marked){
                                return contentModule.markedFunc(host, {
                                    id: "task_" + id,
                                    marked: marked,
                                    task: "activities",
                                    tablename: "activities"
                                });
                            }
                        }(host, record.taskid)
                    };
                    return record;
                },
                callbackfunc: function (values) {
                    content.tasks = values;
                    content.tasks.forEach((cur, idx) => {
                        dictionary.tasks[cur.taskid] = idx;
                    });

                    data_module.cacheContent_task_links.psearch({
                        extraParams: {
                            dictionary: dictionary
                        },
                        searchFunc: taskLinkFilter,
                        postFunc: function (record) {
                            content.tasks[dictionary.tasks[record.taskid]].tablename = record.tablename;
                            content.tasks[dictionary.tasks[record.taskid]].instanceid = record.instanceid;

                            return record;
                        },
                        callbackfunc: function (values) {
                            content.task_links = values;
                            p2 = true;
                        }
                    });
                }
            });
        }
        else {
            p2 = true;
        }
        Thread.wait(
            function () {
                return p1 && p2;
            },
            function () {
                var t = {};
                t.activities = content.meetings.concat(content.tasks);
                contentModule.makeDatabaseContent(host, t);
                hr.activities.makeUserMarkerData(host, "activities");
                host.chartContent = {
                    count: 0,
                    success: 0,
                    unsuccess: 0,
                    pending: 0
                };
                for (var i = 0; i < host.database.activities.items.length; i++){
                    if (host.database.activities.items[i].status == "success") host.chartContent.success++;
                    else if (host.database.activities.items[i].status == "pending") host.chartContent.pending++;
                    else host.chartContent.unsuccess++;
                    host.chartContent.count++;
                }

                host.chartContainer.clearChild();
                host.chartContainer.addChild(theme.formOnboardingEmployeeInformationChart(host.chartContent));



                host.tableContent = {
                    database: host.database,
                    form_config: host.form_config,
                    user_column_configsDic: host.user_column_configsDic,
                    inputsearchbox: host.inputsearchbox,
                    status: host.status,
                    activity_type: host.activity_type,
                    time: host.time,
                    employee: host.employee,
                    data_container: host.data_container,
                    tableView: null,
                    configColumnActivities: null,
                    columnList: host.columnList
                };

                host.funcs.formActivitiesContentData(host.tableContent);
                ModalElement.close(-1);
            }
        );

    });
};

hr.activities.init = function(host){
    return new Promise(function(resolveMn, rejectMn){
        host.database = {};
        ModalElement.show_loading();
        data_module.loadActivitiesInit().then(function(content){
            ModalElement.close(-1);
            contentModule.makeDatabaseContent(host, content);
            host.form_config = contentModule.configVariable(host);
            contentModule.makeOrgsIndex(host);
            contentModule.makeEmployeeData(host);
            contentModule.makeEmployeesIndex(host);
            var orgDict = {};
            var root = [];
            host.database.orgs.items.forEach((item, i) => {
                orgDict[item.id] = i;
                if (item.parentid == 0) root.push(item.id);
            });
            var createAllEmployeeInOrg = function(orgid){
                var index = orgDict[orgid];
                host.database.orgs.items[index].allEmployeeIdList = host.database.orgs.items[index].employeeIdList;
                host.database.orgs.items[index].childIndexList.forEach((item, i) => {
                    createAllEmployeeInOrg(host.database.orgs.items[item].id);
                    host.database.orgs.items[index].allEmployeeIdList = host.database.orgs.items[index].allEmployeeIdList.concat(
                        host.database.orgs.items[item].allEmployeeIdList
                    );
                });
            };
            root.forEach(function(elt){
                createAllEmployeeInOrg(elt);
            });
            host.user_column_configsDic = contentModule.getUser_column_configsDic(host);
            host.dictionary = {
                employees: contentModule.makeDictionaryIndex(host.database.employees.items),
                peoples: contentModule.makeDictionaryIndex(host.database.peoples.items),
                orgs: orgDict
            };
            host.dictionary.employees = {};
            host.database.employees.items.forEach(function(elt, index){
                host.dictionary.employees[elt.id] = elt;
            });
            host.dictionary.users = {};
            host.database.users.items.forEach(function(elt, index){
                host.dictionary.users[elt.homeid] = index;
            });
            host.employeeOfMe = content.employeeOfMe;
            if (systemconfig.privSystem < 2) {
                contentModule.makeEmployeeGroupMemberIndex(host);
                contentModule.makeConfigPrivileges(host);
            }
            host.sessionid = (new Date()).getTime();
            var cmdbutton = {
                close: function (event, me) {
                    if (hr.isMobile){
                        theme.mobileInitBack();
                    }
                    else {
                        hr.menu.tabPanel.removeTab(host.holder.id);
                    }
                },
                addMeeting: function(host){
                    return function (event, me) {
                        hr.activities.addActivitiesMeeting(host, 0, function onSave(value){
                        }, function onAdd(value){
                            var table = host.data_container.childNodes[0];
                            table.notifyAddRowAt(0);
                        }, function onRemove(){if (hr.isMobile) hr.menu.showMobileTabbar(true);});
                    }
                } (host),
                addTask: function(host){
                    return function (event, me) {
                        hr.activities.addActivitiesTask(host, 0, function onSave(value){
                        }, function onAdd(value){
                            var table = host.data_container.childNodes[0];
                            table.notifyAddRowAt(0);
                        }, function onRemove(){if (hr.isMobile) hr.menu.showMobileTabbar(true);});
                    }
                } (host)
            };

            var employeeItems = contentModule.getMemberOfEmployeeSelectMenu(host);
            employeeItems.splice(0, 1);
            // employeeItems[0].text = LanguageModule.text("txt_all_employee");

            host.chartContainer = absol._({});
            host.data_container = absol._({
                // style: {paddingBottom: "var(--footer-margin)"}
            });

            host.holder.addChild(host.frameList);
            var singlePage = host.funcs.formActivitiesInit({
                cmdbutton: cmdbutton,
                holder: host.holder,
                data_container: host.data_container,
                chartContainer: host.chartContainer,
                employeeItems: employeeItems,
                timeClass: "activities-time-class",
                filter_change_func: function(){
                    hr.activities.redraw(host);
                }
            });
            host.status = singlePage.status;
            host.activity_type = singlePage.activity_type;
            host.inputsearchbox = singlePage.inputsearchbox;
            host.time = singlePage.time;
            host.employee = singlePage.employee;
            host.employee.values = host.employeeOfMe;

            var displayDic = {
                status: true,
                name: true,
                assignto: true,
                endtime: true,
                reminder: true,
                assignto: true,
                result: true
            };
            var meetingColumnList = contentModule.getColumnListFromDatatype(host, "meeting", displayDic);
            var taskColumnList = contentModule.getColumnListFromDatatype(host, "task", displayDic);
            var columnList = [];
            var t_array = [];

            meetingColumnList.forEach(function(elt){
                if (elt.value != "allday") {
                    columnList.push(elt);
                    t_array.push(elt.value);
                }
            });


            taskColumnList.forEach(function(elt){
                if (t_array.indexOf(elt.value) == -1) columnList.push(elt);
            });


            if (!host.user_column_configsDic["activities_list"]){
                for (var i = 0; i < columnList.length; i++){
                    if (columnList[i].value == "status"){
                        var x = columnList[i];
                        columnList.splice(i, 1);
                        columnList.unshift({value: 'activityType', display: true, main: true, type: -257, text: LanguageModule.text("txt_work")});
                        columnList.unshift(x);
                        break;
                    }
                }
            }
            else columnList.push({value: 'activityType', display: true, main: true, type: -257, text: LanguageModule.text("txt_work")});

            columnList.push({value: 'activityPurpose', display: true, main: true, type: "purpose", text: "Chức năng"});

            columnList.push({value: 'marked', display: true, main: true, type: "marked", text: LanguageModule.text("txt_marked")});

            host.columnList = columnList;

            host.frameList.addChild(singlePage);
            singlePage.requestActive();
            hr.activities.redraw(host);

            resolveMn(host);
        })
    });
};

VaKeR 2022