BemsWebApplication.PatrolPlan = function (params, viewInfo) {
    "use strict";
    var eq = BWA.DataUtil.constructEqualFilter;
    var and = BWA.DataUtil.andFilter;
    var SiteId = BWA.UserInfo.SiteId();
    var patrolgroupDataSource = BemsWebApplication.db.createDataSource('CmPatrolGroup', true),
        patrolcourseDataSource = BemsWebApplication.db.createDataSource('CmPatrolCourse', true);
    patrolgroupDataSource.filter([
        eq('SiteId', SiteId)
    ]);
    patrolcourseDataSource.filter([
        eq('SiteId', SiteId)
    ]);

    var CmPatrolPlanDataSource = BemsWebApplication.db.createDataSource('CmPatrolPlan');
    var PatrolPlanInfo = ko.observableArray();
    var RowName;

    var patrolgroups = ko.observableArray(),
        patrolcourses = ko.observableArray();

    var patrolgroupsForSearch = ko.observableArray(),
        patrolcoursesForSearch = ko.observableArray(),

        patrolgroupIdForSerach = ko.observable(),
        patrolcourseIdForSerach = ko.observable(),

        defaultSearchPatrolGroupArray = $SearchView.createDefaultArray('PatrolGroupId'),
        defaultSearchPatrolCourseArray = $SearchView.createDefaultArray('PatrolCourseId');

    var deferredForSearch = new $.Deferred();

    /*
    function handleBuildingInSearchView(e) {
        if( e.value === 0 ) {
            floorsForSearch( getDefaultFloorForSearch() );
        }
        else {
            BWA.DataUtil.setArrayDataSourceFilter( floorDataSource, 'BuildingId', e.value, floorsForSearch, getDefaultFloorForSearch() );        
        }
        floorIdForSerach( 0 );
    }*/

    var viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'CmPatrolPlan', {
        rowAlternationEnabled: true,
        /*
                    editing: {
                        editMode: 'batch',
                        editEnabled: true,
                        //removeEnabled: true,
                        //insertEnabled: true
                    },*/

        dataSourceOptions: {
            select: ['SiteId', 'PatrolPlanId', 'GroupId', 'CourseId', 'Name', 'PlanDesc', 'term', 'inDate', 'CmPatrolGroup/Name', 'CmPatrolCourse/Name'],
            expand: ['CmPatrolGroup', 'CmPatrolCourse'],
            extendOptions: {
                forceOriginalField: true,
            },
            filter: [
                    ['SiteId', '=', SiteId]
            ]
        },

        columns: [
            { dataField: 'PatrolPlanId', caption: $G('number'), width: '10%', alignment: 'center', sortOrder: 'desc' },
            { dataField: 'Name', caption: '순찰계획명', width: '30%', alignment: 'center' },
            { dataField: 'CmPatrolGroup/Name', caption: '순찰조', width: '20%', alignment: 'center' },
            { dataField: 'CmPatrolCourse/Name', caption: '순찰코스', width: '20%', alignment: 'center' },
    //        { dataField: 'term', caption: '순찰주기(시간)', width: '10%', alignment: 'center' },
            { dataField: 'PlanDesc', caption: '주요점검사항', width: '30%', alignment: 'center' },
            {
                dataField: 'inDate', caption: '최종변경일', width: '10%', alignment: 'center',
                customizeText: function (cellInfo) {
                    return $G.date(cellInfo.value);
                }
            },
        ],
        popupWidth: 580,
        promiseDataInSearchView: deferredForSearch.promise(),
        searchViewItems: [
            //{ id: 'PatrolGroupId', ignoreValue: 0, defaultValue: 0, value: patrolgroupIdForSerach, dataSource: patrolgroupsForSearch, handleChangedValue: handleBuildingInSearchView },
            { id: 'GroupId', ignoreValue: 0, defaultValue: 0, value: patrolgroupIdForSerach, dataSource: patrolgroupsForSearch },
            { id: 'CourseId', ignoreValue: 0, defaultValue: 0, value: patrolcourseIdForSerach, dataSource: patrolcoursesForSearch },
            { id: 'Name' }
        ],
        handleViewShowing: function () {
            patrolgroupDataSource.load().done(function (pgResults) {
                patrolgroups(pgResults);
                patrolgroupsForSearch(defaultSearchPatrolGroupArray.slice(0).concat(pgResults));
                patrolgroupIdForSerach(0);

                patrolcourseDataSource.load().done(function (pgResults) {
                    patrolcourses(pgResults);
                    patrolcoursesForSearch(defaultSearchPatrolCourseArray.slice(0).concat(pgResults));
                    patrolcourseIdForSerach(0);
                    deferredForSearch.resolve();
                });

            });
        },

        handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
            dataGrid.clearSelection();

            viewModel.isNewInPopup(false); // 

            var data = clickRow.data;
            var dataModel = viewModel.dataModel;
            dataModel.PatrolGroupName = $KoSet(dataModel.PatrolGroupName, data['CmPatrolGroup/Name']);
            dataModel.PatrolCourseName = $KoSet(dataModel.PatrolCourseName, data['CmPatrolCourse/Name']);
            //dataModel.CourseId = $KoSet(dataModel.CourseId, data.CourseId);
            //dataModel.GroupId = $KoSet(dataModel.GroupId, data.GroupId);

            RowName = data.Name;
            popupVisible(true);
        },

        handleAfterLoadingModelByKey: function (data, dataViewModel, isNewInPopup) {
            //if( isNewInPopup() == false ) {
            //  BWA.DataUtil.setArrayDataSourceFilter(patrolgroupDataSource, 'GroupId', dataViewModel.GroupId(), patrolgroups);
            //BWA.DataUtil.setArrayDataSourceFilter(floorDataSource, 'BuildingId', dataViewModel.BuildingId(), floors);
            //}
        },

        viewHidden: function () {
            $SearchView.visibleObservable(false);
            visiblePopup(false);
        },

        handlePopupShowing: function (isNewInPopup, dataViewModel, selectedData) {
            /*                if (isNewInPopup()) {
                                dataViewModel.inDate(new Date());
                            }*/
            CmPatrolPlanDataSource.filter([
                ["SiteId", "=", BWA.UserInfo.SiteId()]
            ]);
            CmPatrolPlanDataSource.load().done(function (result) {
                PatrolPlanInfo(result);
            });
        },

        handleBeforeDelete: function (db) {
            //var parameters = {
            //    SiteId: db.SiteId,
            //    ScheduleId: db.ScheduleId
            //};

            //BWA.api.post('CmPatrolSchedule/Delete', null, parameters).done(function () {
            //});
        },

        beforeInsertingDataViewModel: function (dataModel, dbModelId) {
            dataModel.inDate(new Date());
            var dfd = $.Deferred();

            var isDuplicated = false;

            for (var i = 0; i < PatrolPlanInfo().length; i++) {
                if (dataModel.Name() == PatrolPlanInfo()[i].Name()) {
                    isDuplicated = true;
                }
            }

            if (!BWA.DataUtil.isValidInputValue(dataModel.Name()) || dataModel.term() == null)
                return dfd.resolve(false, '저장 혹은 수정 반드시 필수 입력 정보(*)를 모두 입력하셔야 합니다 (앞뒤공백 허용안함)');
            else {
                if (isDuplicated)
                    return dfd.resolve(false, '이미 동일 정보가 존재합니다.');
                else
                    return dfd.resolve(true);
            }
        },

        beforeUpdateDataViewModel: function () {

            // 수정시에 시간변경
            viewModel.dataModel.inDate(new Date());

            var isDuplicated = false;
            for (var i = 0; i < PatrolPlanInfo().length; i++) {
                if (viewModel.dataModel.Name() == PatrolPlanInfo()[i].Name() && (RowName() != PatrolPlanInfo()[i].Name())) {
                    isDuplicated = true;
                }
            }
            if (!BWA.DataUtil.isValidInputValue(viewModel.dataModel.Name()) || _.isEmpty(viewModel.dataModel.Name()) || viewModel.dataModel.term() == null) {
                utils.toast.show('저장 혹은 수정 반드시 필수 입력 정보(*)를 모두 입력하셔야 합니다 (앞뒤공백 허용안함)', 'error');
                return 0;
            }
            else {
                if (isDuplicated) {
                    utils.toast.show('이미 동일 이름이 존재합니다.', 'error');
                    return 0;
                }
                else
                    return 2;
            }
        },

        handleAfterInsert: function (db) {
            /*
            var dataViewModel = new BemsWebApplication['CmZoneTempHumiSetViewModel']();
            dataViewModel.SiteId = db.SiteId;
            dataViewModel.BuildingId = db.BuildingId;
            dataViewModel.FloorId = db.FloorId;
            dataViewModel.ZoneId = db.ZoneId;
            var promise = BemsWebApplication.api.post('BemsMonitoringPoint/AddZoneTempHumiSet', dataViewModel);
            promise.done(function () {
                ;
            });*/

        },
    });
    /*
    function getDefaultFloorForSearch() {
        return $SearchView.createDefaultArray( 'FloorId' );        
    }

    floorDataSource.filter('BuildingId', -1); */

    // 콤보, text 등록먼저후 생기는 팝업에서 안보이는 문제해결
    viewModel.dataModel.PatrolGroupName = ko.observable();
    viewModel.dataModel.PatrolCourseName = ko.observable();
    //viewModel.dataModel.GroupId = ko.observable();
    //viewModel.dataModel.CourseId= ko.observable();

    viewModel.patrolgroups = patrolgroups;
    viewModel.patrolcourses = patrolcourses;


    /*
        viewModel.popupInsertButtonOptions.action = function () {
            alert('insett');
        }*/
    return viewModel;
};