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

    var cycleTypeClassDataSource = BemsWebApplication.db.createDataSource('FmsFacilityCodeCycleType', true, true),
        businessFieldDataSource = BemsWebApplication.db.createDataSource('CmBusinessField', true, true, true),
        checkScheduleDataSource = BemsWebApplication.db.createDataSource('FmsFacilitySchedule', true);

    var searchCycleTypes = ko.observableArray(),
        searchBusinessFields = ko.observableArray(),
        selectedDate = ko.observable(),
        selectedSchedules = ko.observableArray();

    var scheduleCalendar = null;
    
    var checkScheduleManager = utils.checkSchedule.createScheduleManager();

    function loadSchedules(searchFilter) {
        var date = scheduleCalendar.getDate().clone().endOf('month');
        defaultFilter([
            ['SiteId', '=', BWA.UserInfo.SiteId()],
            'and',
            ['StartDate', '<=', date.toDate()],
            'and',
            ['ConfirmedUserId', '<>', null]
        ]);
        if ($IsValid(searchFilter)) {
            checkScheduleDataSource.filter(defaultFilter().slice(0).concat(searchFilter));
        }

        $.when(checkScheduleDataSource.load(), checkScheduleManager.load(scheduleCalendar.getDate())).done(function(result) {
            var events = [];
            $.each(result[0], function(i, schedule) {
                var s = checkScheduleManager.generateScheduleEvents(date, schedule);
                events.splice.apply(events, [events.length, 0].concat(s));
            });
            scheduleCalendar.updateEvents(events);
        });
    }

    var scheduleCalendarOptions = {
        //selectable: false,
        height: 680,
        editable: false,
        select: function( start, end ) {

            var schedules = [];
            scheduleCalendar.getEvents($G.date( start ), function(event) {
                schedules.push(event);
            });            
            if (schedules.length === 0) {
                utils.toast.show('예정된 점검이 없습니다.', 'wanring');
            }
            else {
                selectedSchedules(schedules);
                selectedDate(start);
                viewModel.workOrderGenerationPopup.show();
            }
        },

        changedMonth: function(view) {
            if (scheduleCalendar === null) return;
            loadSchedules();
        },
    };

    function refreshList() {
    }

    function handleViewShown() {

        if (!scheduleCalendar) {
            scheduleCalendar = utils.fullCalendar.create('scheduleCalendar', scheduleCalendarOptions);
        }

        $.when(cycleTypeClassDataSource.load(), businessFieldDataSource.load()).done(function(result1, result2) {
            searchCycleTypes($SearchView.createDefaultArray('CycleTypeId').slice(0).concat(result1[0]));
            searchBusinessFields($SearchView.createDefaultArray('BusinessFieldId').slice(0).concat(result2[0]));
        });

        loadSchedules();

        $SearchView.setPopupVisibleObservable(popupSearchViewVisible);
        $SideMenu.showSideMenuIfWill(params.view);
    }

    var defaultFilter = ko.observable();
    var popupSearchViewVisible = ko.observable();


    var viewModel = {
        viewShown: handleViewShown,
        refreshList: refreshList,
    };
    $SearchView.setupInView(viewModel, {
        searchViewItems: [
            { id: 'BusinessFieldId', ignoreValue: 0, defaultValue: 0, dataSource: searchBusinessFields },
            { id: 'CycleTypeId', ignoreValue: 0, defaultValue: 0, dataSource: searchCycleTypes },
            { id: 'Name' }
        ],

    }, popupSearchViewVisible, null, function(filter) {
        loadSchedules(filter);
    });

    viewModel.workOrderGenerationPopup = BWA.Popup.WorkOrderGenerationPopup(viewModel, selectedDate, selectedSchedules, viewInfo);

    return viewModel;
};