BemsWebApplication.MainDashboardFMS = function (params, viewInfo) {
    "use strict";

    var initialized = false;

    var useBusinessFiltering = ko.observable(false);
    var visiblePopup = ko.observable(false);


    var works = ko.observableArray();
    var works2 = ko.observableArray();
    var works3 = ko.observableArray();

    var eq = BWA.DataUtil.constructEqualFilter,
        and = BWA.DataUtil.andFilter;
    var BFDataSource = BemsWebApplication.db.createDataSource('CmBusinessField'),
        progressDataSource = BemsWebApplication.db.createDataSource('FmsWorkCodeType'),

        chartPieDay = BWA.Chart.Instance('chartPieDayTReport', 'dxPieChart');

    var progresses = ko.observableArray();
    
    var workDataSource = BWA.DataUtil.createDataSource({
        dataSourceOptions: {
            select: [
            'SiteId', 'WorkRequestId', 'FmsWorkRequest/FmsWorkCodeType/Name',
            'FmsWorkRequest/WorkTypeId', 'Title', 'OrderDate', 'FmsWorkRequest/WorkProgressId',
            'CmUser/Name', // 작업지시자
            'FmsWorkRequest/CmBusinessField/Name',
            'BusinessFieldId', 'FmsWorkRequest/CmBusinessField/Name', 'FmsWorkRequest/BusinessFieldId'
            ],
            expand: ['FmsWorkRequest',
            'FmsWorkResult',
            'FmsWorkResult/CmUser',
            'FmsWorkResult/IsConfirmed',
            'FmsWorkResult/ConfirmedDate',
            'FmsWorkRequest/FmsWorkCodeType',
            'FmsWorkRequest/CmBusinessField',
            'FmsWorkRequest/FmsWorkCodeProgress',
            'CmBusinessField', 'CmUser'],
            extendOptions: {
                forceOriginalField: true,
            }
        },
    }, 'FmsWorkOrder');
    //}, 'FmsWorkRequest');
    // 2016 05 11 추가
    var workDataSource2 = BWA.DataUtil.createDataSource({
        dataSourceOptions: {
            select: [
                'SiteId', 'WorkRequestId',
                'StartDate', 'EndDate',
                'ConfirmedDate', 'ConfirmedUserId', 'IsConfirmed',
                'CauseClassId', 'Content',
                'FmsWorkRequest/WorkTypeId',
                'FmsWorkOrder/Title',
                'FmsWorkOrder/OrderDate',
                'FmsWorkRequest/WorkProgressId',
                'CmUser/Name', // 작업자
                'FmsWorkRequest/FmsWorkCodeType/Name',
                'FmsWorkRequest/CmBusinessField/Name',
                'FmsWorkRequest/FmsWorkCodeProgress/Name',
                'FmsWorkOrder/BusinessFieldId',
            ],
            expand: [
                'FmsWorkRequest',
                'FmsWorkOrder',
                'FmsWorkRequest/FmsWorkCodeType',
                'FmsWorkRequest/CmBusinessField',
                'FmsWorkRequest/FmsWorkCodeProgress',
                'FmsWorkOrder/CmBusinessField', 'CmUser'],

            extendOptions: {
                forceOriginalField: true
            }
        },
    }, 'FmsWorkResult');

    var AnnounceDataSource = BWA.DataUtil.createDataSource({
        dataSourceOptions: {
            select: [
                'SiteId',
                'AnnouncementId',
                'BusinessFieldId',
                'CmBusinessField/Name',
                'Title',
                'Contents',
                'RegisterUserId ',
                'CmUser/Name', // 등록자
                'AddDate',
                'UpdateDate',
                'IsUse',
                'ReadCount',
            ],
            expand: [
                'CmBusinessField',
                'CmUser'
            ],

            extendOptions: {
                forceOriginalField: true
            }
        },
    }, 'CmAnnouncement');

    var initialized_cal = false;
    function handleViewShown() {
        if (initialized === false) {

            BFDataSource.filter([
                eq('SiteId', BWA.UserInfo.SiteId()),//**kgpark
            ]);
            $.when(
                BFDataSource.load(),
                progressDataSource.load()
            ).done(function (BFResult, progressResult) {
                progresses = progressResult[0];
                
                chartPieDay = chartPieDay(BWA.ChartOptions.MainDashboardFMS.getPieChartDayOptions());

                handleSearchInSearchView();
            });
            initialized = true;
        }
        else
            handleSearchInSearchView();
        
        if (initialized_cal === false) {

            holidayCalendar = utils.fullCalendar.create('holidayCalendar', calendarOptions);
            var date = moment();
            currentYear = date.year();
            check_button();
        }
        else
            refreshList_cal();

    }

    function handleSearchInSearchView() {

        if (!useBusinessFiltering) {
            workDataSource2.filter([
                eq('SiteId', BWA.UserInfo.SiteId()),
                and,
                [
                    eq('FmsWorkRequest/WorkProgressId', $Code.WorkProgress.WORK_COMPLETE)
                ]
            ]);
        } else {
            workDataSource2.filter([
                eq('SiteId', BWA.UserInfo.SiteId()),
                and,
                [eq('FmsWorkRequest/WorkProgressId', $Code.WorkProgress.WORK_COMPLETE)],
                and,
                [eq('FmsWorkRequest/BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'or', eq('FmsWorkRequest/BusinessFieldId', 1)]]);
        }
        workDataSource2.load().done(function (workResult) {
            works(workResult);
        });


        if (!useBusinessFiltering) {
            workDataSource2.filter([
                eq('SiteId', BWA.UserInfo.SiteId()),
                and,
                [
                    eq('FmsWorkRequest/WorkProgressId', $Code.WorkProgress.WORKING),
                    'or',
                    eq('FmsWorkRequest/WorkProgressId', $Code.WorkProgress.WORK_HOLD)
                ]
            ]);
        } else {
            workDataSource2.filter([
                eq('SiteId', BWA.UserInfo.SiteId()),
                and,
                [eq('FmsWorkRequest/WorkProgressId', $Code.WorkProgress.WORKING), 'or', eq('FmsWorkRequest/WorkProgressId', $Code.WorkProgress.WORK_HOLD)],
                and,
                [eq('FmsWorkRequest/BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'or', eq('FmsWorkRequest/BusinessFieldId', 1)]
            ]);
        }
        workDataSource2.load().done(function (workResult) {
            works2(workResult);
        });

        //공지사항 추가
        if (!useBusinessFiltering) {
            AnnounceDataSource.filter([
                [eq('SiteId', BWA.UserInfo.SiteId()), 'or', eq('SiteId',BemsWebApplication.config.HOSiteId)]
            ]);
        } else {
            AnnounceDataSource.filter([
                [eq('SiteId', BWA.UserInfo.SiteId())],
                and,
                [eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'or', eq('BusinessFieldId', 1)]
            ]);
        }
        
        AnnounceDataSource.load().done(function (AnnounceResult) {
            works3(AnnounceResult);
        });


        var now_st = new Date();
        now_st = new Date(now_st.getFullYear(), now_st.getMonth(), now_st.getDate(), 0, 0, 0);

        workDataSource.filter([
               [
                   eq('SiteId', BWA.UserInfo.SiteId()),
                   and,
                   ['FmsWorkRequest/WorkProgressId',"<=", $Code.WorkProgress.WORKING],
                   //and,
                   //['OrderDate', ">=", now_st]
               ]
        ]);
        workDataSource.load().done(function (workResult2) {
            var pieDataArray = [];
            _.each(progresses, function (x) {
                if (x.WorkTypeId() >= 1)
                    pieDataArray.push({
                        FuelTypeName: x.Name(),
                        Value: (x.WorkTypeId() == 1) ? workResult2.length : getWorkProcessCount(workResult2, x.WorkTypeId(), null)
                    })
            });
            chartPieDay().option('dataSource', pieDataArray);
        });

        //$("#large-indicator").dxLoadIndicator({
        //    height: 60,
        //    width: 60
        //});
    }

    function handleViewHidden() {
        visiblePopup(false);
        holidayCalendar.clearEvents(true);
    }

    function handleViewShowing() {
        useBusinessFiltering = BWA.UserInfo.isDependBusinessField(viewInfo.viewName);
    }

    function getWorkProcessCount(datas, type, bf) {
        var cnt = 0;
        _.each(datas, function (x) {
            if (x['SiteId']() == BWA.UserInfo.SiteId() && x['FmsWorkRequest/WorkTypeId']() == type && (bf == null || x['FmsWorkRequest/BusinessFieldId']() == bf))  //**kgpark
                
                cnt++;
        });
        return cnt;
    }

    function refreshList() {
        //dataSource.pageIndex(0);
        //dataSource.load();
    }

    //****************** 달력 조회 ***********************//

    var holidayDataSource = BemsWebApplication.db.createDataSource('CmHoliday', true, true);
    var holidayCustomDataSource = BemsWebApplication.db.createDataSource('CmHolidayCustom', true);
    var holidayWeekendDataSource = BemsWebApplication.db.createDataSource('CmHolidayWeekend', true);
    var checkBox_regular = true, checkBox_legal = true, checkBox_any = true;

    var workScheduleDataSource = BWA.DataUtil.createDataSource({
        dataSourceOptions: {
            select: [
                'SiteId', 'WorkScheduleId', 'WorkTypeId', 'BusinessFieldId', 'Title', 'FmsWorkSchedule/CycleUnitId',
                'FmsWorkSchedule/CycleSize', 'FmsWorkSchedule/IsUse', 'FmsWorkSchedule/IsAutoOrder', 'StartWorkDate',
                'CmUser/Name', 'CmBusinessField/Name', 'FmsWorkResult/EndDate', 'FmsWorkResult/IsConfirmed',
                'CmPartner/Name', 'FmsWorkSchedule/HolidayWorkTypeId'
            ],
            expand: ['FmsWorkSchedule', 'CmUser', 'CmBusinessField', 'CmPartner', 'FmsWorkResult'],
            extendOptions: {
                forceOriginalField: true
            }
        }
    }, 'FmsWorkRequest');

    var holidaySources;
    var holidayCustomSources;
    var workScheduleSources;
    var cc = new CalendarConverter;
    var holidayWeekendDataViewModel = new BemsWebApplication.CmHolidayWeekendViewModel();
    var loadedYears = [];
    var viewDate = null;
    var currentYear = null;
    var holidays = [];
    var weekends = [];
    var isSaturday = false;
    var isSunday = false;
    var holidayCalendar = null;
    var calendarOptions = {
        selectable: false,
        editable: false,
        //weekends: true,
        weekNumbers: false,
        changedMonth: function (view) {
            var date = view.calendar.getDate();
            viewDate = date; //hcLee 2016 03 21
            if (currentYear !== null && date.year() !== currentYear) {
                currentYear = date.year();
                check_button();
            }
            else {
                applyWeekends(date);
            }
        }
    }
    
    function refreshHolidays(date) {
        holidays = [];
        var currentYear = date.year();
        if (loadedYears.indexOf(currentYear) < 0) {
            loadedYears.push(currentYear);
            var year;
            var month;
            var day;
            var solar;
            $.each(holidaySources, function (i, item) {
                year = currentYear;
                month = item.HolidayMonth() - 1;
                day = item.HolidayDay();
                if (item.IsLunar()) {
                    solar = cc.lunar2solar(new Date(year - 1, month, day));
                    if (solar.sYear !== year) {
                        solar = cc.lunar2solar(new Date(year, month, day));
                    }
                    year = solar.sYear;
                    month = solar.sMonth - 1;
                    day = solar.sDay;
                }
                utils.holiday.pushHolidayEventInArray(holidays, item.Name(), moment([year, month, day]), true, undefined, 0);
            });

            $.each(holidayCustomSources, function (i, item) {
                var itemDate = item.HolidayDate();
                if (itemDate.getFullYear() === currentYear) {
                    utils.holiday.pushHolidayEventInArray(holidays, item.Name(), moment([itemDate.getFullYear(), itemDate.getMonth(), itemDate.getDate()]), false, undefined, 1);
                }
            });

            $.each(workScheduleSources, function (i, item) {
                var itemDate = item['FmsWorkResult/EndDate']();//추가
                item.Name = item.Title;
                if (itemDate.getFullYear() === currentYear) {
                    utils.holiday.pushWorkScheduleEventInArray(holidays, item, moment([itemDate.getFullYear(), itemDate.getMonth(), itemDate.getDate()]), false, undefined, item.WorkTypeId());
                }
            });
        }
        applyWeekends(date);
    }

    function loadHolidays(date) {
        holidays = [];
        loadedYears = [];

        workScheduleDataSource.filter().push('and', eq("SiteId", BWA.UserInfo.SiteId()));
        if (useBusinessFiltering)
            workScheduleDataSource.filter().push('and', [eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'or', eq('BusinessFieldId', 1)]);
        $.when(
            holidayDataSource.load(),
            holidayCustomDataSource.load(),
            holidayWeekendDataSource.load(),
            workScheduleDataSource.load())//수정
            .done(function (result1, result2, result3, result4) {

                holidaySources = result1[0];
                holidayCustomSources = result2[0];
                var tempworkScheduleSources = result4[0];
                workScheduleSources = [];
                for (var i = 0; i < tempworkScheduleSources.length; i++) {
                    if (tempworkScheduleSources[i]['FmsWorkResult/IsConfirmed'] != null) {
                        if (tempworkScheduleSources[i]['FmsWorkResult/IsConfirmed']() == true) {
                            workScheduleSources.push(tempworkScheduleSources[i]);
                        }
                    }
                }
                if (result3.length > 0) {
                    var weekend = result3[0][0];
                    isSaturday = weekend.Saturday();
                    isSunday = weekend.Sunday();
                    holidayWeekendDataViewModel.SiteId(weekend.SiteId());
                    holidayWeekendDataViewModel.Saturday(weekend.Saturday());
                    holidayWeekendDataViewModel.Sunday(weekend.Sunday());
                }
                refreshHolidays(date);
            });
    }

    function applyWeekends(date) {
        if (holidayCalendar === null) return;
        if (isSunday == false && isSaturday == false) {
            holidayCalendar.updateEvents(holidays);
            return;
        }
        weekends = utils.holiday.getWeekendHolidays(date, isSaturday, isSunday);
        holidayCalendar.updateEvents(holidays.concat(weekends));
    }
    
    function check_button() {
        $("#checkBox_regular").dxCheckBox({
            text: "정기 점검",
            value: true,
            onValueChanged: function (e) {
                switch (e.value) {
                    case true:
                        checkBox_regular = true;
                        break;
                    case false:
                        checkBox_regular = false;
                        break;
                }
                Data_filter(viewDate);
            }
        });
        $("#checkBox_legal").dxCheckBox({
            text: "법정 검사",
            value: true,
            onValueChanged: function (e) {
                switch (e.value) {
                    case true:
                        checkBox_legal = true;
                        break;
                    case false:
                        checkBox_legal = false;
                        break;
                }
                Data_filter(viewDate);
            }
        });
        $("#checkBox_any").dxCheckBox({
            text: "수시 점검",
            value: true,
            onValueChanged: function (e) {
                switch (e.value) {
                    case true:
                        checkBox_any = true;
                        break;
                    case false:
                        checkBox_any = false;
                        break;
                }
                Data_filter(viewDate);
            }
        });
        Data_filter(viewDate);
    }

    function Data_filter(date) {
        workScheduleDataSource.filter([]);
        if (checkBox_regular) {//1
            if (checkBox_legal) {//2
                if (checkBox_any) {//5
                    workScheduleDataSource.filter().push(["WorkTypeId", ">=", 1]);//1,2,5
                }
                else {
                    workScheduleDataSource.filter().push([["WorkTypeId", "=", 1], 'or', ["WorkTypeId", "=", 2]]);//1,2
                }
            }
            else {
                if (checkBox_any) {//5
                    workScheduleDataSource.filter().push([["WorkTypeId", "=", 1], 'or', ["WorkTypeId", "=", 5]]);//1,5
                }
                else {
                    workScheduleDataSource.filter().push(["WorkTypeId", "=", 1]);//1
                }
            }
        }
        else {
            if (checkBox_legal) {//2
                if (checkBox_any) {//5
                    workScheduleDataSource.filter().push([["WorkTypeId", "=", 2], 'or', ["WorkTypeId", "=", 5]]);//2,5
                }
                else {
                    workScheduleDataSource.filter().push(["WorkTypeId", "=", 2]);//2
                }
            }
            else {
                if (checkBox_any) {//5
                    workScheduleDataSource.filter().push(["WorkTypeId", "=", 5]);//5
                }
                else {
                    workScheduleDataSource.filter().push(["WorkTypeId", "=", 0]);//0
                }
            }
        }
        loadHolidays(date);
        initialized_cal = true;
    }

    function refreshList_cal() {
        currentYear = viewDate.year();
        Data_filter(viewDate);
    }

    //****************** 달력 조회 ***********************//

    //var viewModel = $.extend(BWA.CommonView.create(params, viewInfo, searchViewOptions, ko.observable(null), handleViewShown, null, handleSearchInSearchView), {
    var viewModel = $.extend(BWA.CommonView.create(params, viewInfo, null, ko.observable(null), handleViewShown), {
        refreshList: refreshList,
        viewShowing: handleViewShowing,

        workDataGridOptions: utils.datagrid.defaultOptions({

            rowClick: function (row) {
            },

            //rowAlternationEnabled: true,
            useNumberColumn: false,
            dataSource: works,
            datagridId: 'gridContainer',

            paging: {
                enabled: true,
                pageSize: 4
            },

            pager: {
                //allowedPageSizes: true,
                showPageSizeSelector: false,
                allowedPageSizes: [4],
                visible: false
            },

            columns: [
                // dataField: 'WorkRequestId', caption: $G('number'), width: '8%', alignment: 'center' },
                { dataField: 'FmsWorkRequest/CmBusinessField/Name', caption: $G('businessFieldName'), width: '15%', alignment: 'center' },
                { dataField: 'FmsWorkRequest/FmsWorkCodeType/Name', caption: $G('workTypeName'), width: '15%', alignment: 'center' },
                {
                    dataField: 'FmsWorkOrder/OrderDate', caption: $G('orderedDate'), width: '17.5%', alignment: 'center', 
                    customizeText: function (cellInfo) {
                        return $G.date(cellInfo.value);
                    }
                },
                {
                    dataField: 'EndDate', caption: '종료일', width: '17.5%', alignment: 'center', sortOrder: 'desc',
                    customizeText: function (cellInfo) {
                        return $G.date(cellInfo.value);
                    }
                },
                { dataField: 'FmsWorkOrder/Title', caption: '작업명', width: '20%', alignment: 'center' },
                { dataField: 'CmUser/Name', caption: '작업지시자', width: '15%', alignment: 'center' },
            ],
        }),

        workDataGridOptions2: utils.datagrid.defaultOptions({
            
            //rowAlternationEnabled: true,
            dataSource: works2,
            datagridId: 'gridContainer2',
            useNumberColumn: false,

            columns: [
                //{ dataField: 'WorkRequestId', caption: $G('number'), width: '8%', alignment: 'center' },
                { dataField: 'FmsWorkRequest/CmBusinessField/Name', caption: $G('businessFieldName'), width: '20%', alignment: 'center' },
                { dataField: 'FmsWorkRequest/FmsWorkCodeType/Name', caption: $G('workTypeName'), width: '20%', alignment: 'center' },
                //{
                //    dataField: 'FmsWorkOrder/OrderDate', caption: $G('orderedDate'), width: '15%', alignment: 'center', sortOrder: 'desc',
                //    customizeText: function (cellInfo) {
                //        return $G.date(cellInfo.value);
                //    }
                //},
                {
                    dataField: 'EndDate', caption: '종료예정일', width: '30%', alignment: 'center', sortOrder: 'desc',
                    customizeText: function (cellInfo) {
                        return $G.date(cellInfo.value);
                    }
                },
                { dataField: 'FmsWorkOrder/Title', caption: '작업명', width: '30%', alignment: 'center' },
                //{ dataField: 'CmUser/Name', caption: '작업자', width: '10%', alignment: 'center' },
            ],
            paging: {
                enabled: true,
                pageSize: 4
            },

            pager: {
                //allowedPageSizes: true,
                showPageSizeSelector: false,
                allowedPageSizes: [4],
                visible: false
            },
        }),
        
        workDataGridOptions3: utils.datagrid.defaultOptions({

            //rowAlternationEnabled: true,
            dataSource: works3,
            datagridId: 'gridContainer3',
            useNumberColumn: false,

            columns: [
                { dataField: 'CmBusinessField/Name', caption: $G('businessFieldName'), width: '15%', alignment: 'center' },
                { dataField: 'Title', caption: '제목', width: '35%', alignment: 'center' },
                { dataField: 'CmUser/Name', caption: '등록자', width: '20%', alignment: 'center' },
                {
                    dataField: 'UpdateDate', caption: '수정일', width: '20%', alignment: 'center', sortOrder: 'desc',
                    customizeText: function (cellInfo) {
                        return $G.date(cellInfo.value);
                    }
                },
                { dataField: 'ReadCount', caption: '조회수', width: '10%', alignment: 'center' },
            ],
            paging: {
                enabled: true,
                pageSize: 4
            },

            pager: {
                //allowedPageSizes: true,
                showPageSizeSelector: false,
                allowedPageSizes: [4],
                visible: false
            },

            rowPrepared: function (rowElement, rowInfo) {
                if (rowInfo.rowType == 'data') {
                    var data = rowInfo.data;
                    if (data.SiteId() == BemsWebApplication.config.HOSiteId) {
                        rowElement.css('background-color', 'rgba(255,0,0,0.1)');
                        
                    }
                }
            },
        })

    });
    
    return viewModel;
};