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

    // Permission Index
    var PI_SEARCH = 0,
        PI_MODIFICATION = 1,
        PI_BUSINESS_FIELD = 2;

    var CmPatrolCourseDataSource = BemsWebApplication.db.createDataSource('CmPatrolCourse');
    var PatrolCourseInfo = ko.observableArray();
    var RowName;
    /*
        var commandButtonOptions = [ {
            icon: 'edit',
            id: 'create1',
            title: '순찰코스 순서저장',
            disabled: disableOrderUpdate,
            action: handleOrderUpdate
        }];*/
    /*
    var selectedPatrolPosData = ko.observable();

    selectedPatrolPosData.subscribe(function (value) {
        if (isMainContactor) {
            viewModel.dataModel.MainContactorlPosId(value.UserId);
            viewModel.dataModel.MainContactorUserName(value.Name);
        }
        else {
            viewModel.dataModel.SubContactorUserId(value.UserId);
            viewModel.dataModel.SubContactorUserName(value.Name);
        }
    });*/

    var PatrolCourseDataSource = BWA.db.createDataSource('CmPatrolCourse'),
//        PatrolCoursePosDataSource = BWA.db.createDataSource('CmPatrolCoursePos'),
        PatrolCoursePosDataSource = BWA.DataUtil.createDataSource({
            dataSourceOptions: {
                select: ['SiteId', 'PatrolCourseId', 'PosId', 'CourseOrder', 'CmPatrolCourse/Name', 'CmPatrolPos/Name', 'CmPatrolPos/CmBuilding/Name', 'CmPatrolPos/CmFloor/Name'],
                //select: ['SiteId', 'PatrolCourseId', 'PosId', 'CourseOrder', 'CmPatroPos/Name', 'CmPatroPos/CmBuilding/Name', 'CmPatroPos/CmFloor/Name'],
                expand: ['CmPatrolCourse', 'CmPatrolPos', 'CmPatrolPos/CmBuilding', 'CmPatrolPos/CmFloor'],
                extendOptions: {
                    forceOriginalField: true
                },
                filter: [
                    ['SiteId', '=', BWA.UserInfo.SiteId()] // 4
                    //eq('SiteId', 0), // 초기화를 위해서 0
                //    eq('SiteId', BWA.UserInfo.SiteId()),
                //    and,
                //    ['FmsWorkRequest/WorkProgressId', '=', $Code.WorkProgress.WORKING] // 4
                //    //, and, ['FmsWorkRequest/WorkProgressId', '<=', 5]
                ]
            }
        }, 'CmPatrolCoursePos'),

        possInView = ko.observableArray(),

        //PatrolCoursePermissionDataArray = ko.observableArray(),

        deleteDisabled = ko.observable(true),
        popupVisible = ko.observable(false),

        upDisabled = ko.observable(true),
        downDisabled = ko.observable(true),

        reSelectRow = ko.observable(false),
        disableOrderUpdate = ko.observable(true),

        selectedPatrolCourse = ko.observable(null),
        selectedCoursePos = ko.observable(null),

        rowIndex,
        viewModel,
        //gridView,
        sidemenuHashSet;

    //var datagrid = $('#EnergySavingControlDataGridViewInSearchView').dxDataGrid('instance');
    //var gridView = $('#gridContainer2').dxDataGrid('instance');

    //var headerCheckBoxValues = [ko.observable(false), ko.observable(false), ko.observable(false)];

    //gridView = $('#gridContainer2').dxDataGrid('instance');
    //    var dataGrid = $('#gridContainer').dxDataGrid('instance');

    // menuDataGridOptions -> PatrolCoursePos
    var menuDataGridOptions = utils.datagrid.defaultOptions({
        //dataSource: PatrolCoursePosDataSource,
        dataSource: possInView,
        width: '100%',
        //height: 706,
        height: 685,
        datagridId: 'gridContainer2',
        dbId: 'CmPatrolCoursePos',
        //useNumberColumn: true,

        columns: [
            { dataField: 'CourseOrder', caption: '순서', width: '15%', alignment: 'center', sortOrder: 'asc' },
//            { dataField: 'PosId', caption: '순찰지점', width: '35%', },
//            { dataField: 'CmPatrolCourse/Name', caption: '순찰코스명', width: '35%', },
            { dataField: 'CmPatrolPos/Name', caption: '순찰지점명', width: '35%', },
            { dataField: 'CmPatrolPos/CmBuilding/Name', caption: '빌딩', width: '25%',},
            { dataField: 'CmPatrolPos/CmFloor/Name', caption: '층', width: '25%'},
//            { dataField: 'CourseOrder', caption: '순서', width: '25%'  },
        ],

        paging: {
            enabled: true,
            pageSize: 19
        },
        pager: {
        },

        selection: {
            mode: 'multiple',
            allowSelectAll: true,
        },
        /*
        handleShowPopup:function(clickdata){
        },*/
        rowPrepared: function (rowElement, rowInfo) {
            if (rowInfo.rowType == 'data' && reSelectRow()) {
                var dataGrid = $('#gridContainer2').dxDataGrid('instance');
                if (dataGrid.totalCount() - 1 == rowInfo.dataIndex) {
                    dataGrid.selectRowsByIndexes(rowIndex);
                    upDisabled(rowIndex == 0 ? true : false);
                    downDisabled(rowIndex == dataGrid.totalCount() - 1 ? true : false);
                    reSelectRow(false);
                }
            }
        },
        //byKey(key)
        //getKeyByRowIndex(rowIndex)

        selectionChanged: function (clickRow) {
            var array = utils.datagrid.getSelectedRowsData('gridContainer2');

            deleteDisabled(!(array.length > 0));

            if (array.length == 1) {
                selectedCoursePos(array[0]);
                var dataGrid = $('#gridContainer2').dxDataGrid('instance');
                //var index = dataGrid.getRowIndexByKey(dataGrid.getSelectedRowKeys());
                rowIndex = dataGrid.getRowIndexByKey(clickRow.currentSelectedRowKeys[0]);
                //dataGrid.selectRowsByIndexes(rowIndexes);
                upDisabled(rowIndex == 0 ? true : false);
                downDisabled(rowIndex == dataGrid.totalCount() - 1 ? true : false);
            }
            else {
                if (reSelectRow() == false) {
                    upDisabled(true);
                    downDisabled(true);
                }
            }

            //$('#gridContainer2').dxDataGrid('instance').selectRowsByIndexes(0);
            /*
                        if (reSelectRow()) {
                            $('#gridContainer2').dxDataGrid('instance').selectRowsByIndexes(rowIndex);
                            reSelectRow(false);
                        }*/
        },

        /*
        contentReadyAction: function(e) {
            //gridView = e.component;
            //datagrid.filter(null);
        },*/
    });

    var viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'CmPatrolCourse', {
        dataSourceOptions: {
            select: ['SiteId', 'PatrolCourseId', 'Name',],
            extendOptions: {
                forceOriginalField: true
            },
            filter: [
                ['SiteId', '=', BWA.UserInfo.SiteId()] 
            ]
        },
        height: 685,
        popupWidth: 480,
        columns: [
            { dataField: 'Number', caption: $G('number'), width: '20%', allowSorting: false },
            { dataField: 'Name', caption: '순찰코스명', width: '80%' }
        ],
        paging: {
            enabled: true,
            pageSize: 19
        },
        pager: {
        },

        NoSearchView: true,     // 2019.07.25 kgpark 검색버튼 삭제

        handleViewShown: function () {
            sidemenuHashSet = $SideMenu.getSidemenuHashSet();
            //$SearchView.setPopupVisibleObservable(null);
            $SearchView.visibleObservable(false);
        },

        handlePopupShowing2: function (selectedId) {
            var data = selectedPatrolCourse();
            selectedId.SiteId = data.SiteId();
            selectedId.PatrolCourseId = data.PatrolCourseId();
            selectedId.Name = data.Name();
        },

        /*
        handleAfterLoadingModelByKey: function(data, dataViewModel, isNewInPopup) {
        },*/

        
        handlePopupShowing: function (that) {

            CmPatrolCourseDataSource.filter([
                ["SiteId", "=", BWA.UserInfo.SiteId()]
            ]);
            CmPatrolCourseDataSource.load().done(function (result) {
                PatrolCourseInfo(result);
            });
        },

        handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {

            var data = clickRow.data;
            selectedPatrolCourse(data);
            LoadCoursePos();
            RowName = data.Name;
            //$('#gridContainer2').dxDataGrid('instance').selectRowsByIndexes(1);
        },

        beforeInsertingDataViewModel: function (dataModel, dbModelId) {

            var dfd = $.Deferred();
            var isDuplicated = false;

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

    function handleOrderUp() {
        disableOrderUpdate(false);
        var dataGrid = $('#gridContainer2').dxDataGrid('instance');
        //rowIndex--;
        //dataGrid.selectRowsByIndexes(rowIndex);
        //return;

        var data = selectedCoursePos();
        var oldOrder = data.CourseOrder();

        rowIndex--;
        //dataGrid.selectRowsByIndexes(rowIndex);

        //var data2 = dataGrid.byKey(dataGrid.getKeyByRowIndex(rowIndex))
        dataGrid.byKey(dataGrid.getKeyByRowIndex(rowIndex)).done(function (dataObject) {
            data.CourseOrder(dataObject.CourseOrder());
            //data.CourseOrder(100);
            dataObject.CourseOrder(oldOrder);
            reSelectRow(true);
            $('#gridContainer2').dxDataGrid('instance').refresh();
        });

        //dataGrid.selectRowsByIndexes(rowIndex);
        //var data2 = dataGrid.getSelectedRowsData();
        //        data.CourseOrder(data2[0].CourseOrder());
        //data.CourseOrder(100);
        //        data2[0].CourseOrder(oldOrder);
        //dataGrid.selectRowsByIndexes(rowIndex);
        //dataGrid.selectRowsByIndexes(-1);
        //dataGrid.selectRowsByIndexes(rowIndex);

        /*
                var chage = new Array();
                var dataGrid = $('#gridContainer2').dxDataGrid('instance');
                var data = selectedCoursePos();
                chage.push({
                    SiteId: data.SiteId(),
                    PatrolCourseId: data.PatrolCourseId(),
                    PosId: data.PosId(),
                    CourseOrder: data.CourseOrder()
                });
        
                rowIndex--;
                dataGrid.selectRowsByIndexes(rowIndex);
                data = dataGrid.getSelectedRowsData();
        
                chage.push({
                    SiteId: data[0].SiteId(),
                    PatrolCourseId: data[0].PatrolCourseId(),
                    PosId: data[0].PosId(),
                    CourseOrder: data[0].CourseOrder()
                });
        
                reSelectRow(true);
                BWA.api.post('CmPatrolCourse/ChangeCourseOrder', chage).done(function () {
                    // 재로드하는 걸로
                    utils.toast.show($G('successDatabaseProcessMsg'));
                    LoadCoursePos();
                });
        */
    }

    function handleOrderDown() {
        disableOrderUpdate(false);

        var dataGrid = $('#gridContainer2').dxDataGrid('instance');

        var data = selectedCoursePos();
        var oldOrder = data.CourseOrder();

        rowIndex++;
        dataGrid.byKey(dataGrid.getKeyByRowIndex(rowIndex)).done(function (dataObject) {
            data.CourseOrder(dataObject.CourseOrder());
            dataObject.CourseOrder(oldOrder);
            reSelectRow(true);
            $('#gridContainer2').dxDataGrid('instance').refresh();
        });

        //dataGrid.selectRowsByIndexes(rowIndex);
        //var data2 = dataGrid.getSelectedRowsData();
        //        data.CourseOrder(data2[0].CourseOrder());
        //data.CourseOrder(100);
        //        data2[0].CourseOrder(oldOrder);
        //dataGrid.selectRowsByIndexes(rowIndex);
        //dataGrid.selectRowsByIndexes(-1);
        return;

        var chage = new Array();
        var dataGrid = $('#gridContainer2').dxDataGrid('instance');
        var data = selectedCoursePos();
        chage.push({
            SiteId: data.SiteId(),
            PatrolCourseId: data.PatrolCourseId(),
            PosId: data.PosId(),
            CourseOrder: data.CourseOrder()
        });

        rowIndex++
        dataGrid.selectRowsByIndexes(rowIndex);
        data = dataGrid.getSelectedRowsData();

        chage.push({
            SiteId: data[0].SiteId(),
            PatrolCourseId: data[0].PatrolCourseId(),
            PosId: data[0].PosId(),
            CourseOrder: data[0].CourseOrder()
        });

        reSelectRow(true);
        BWA.api.post('CmPatrolCourse/ChangeCourseOrder', chage).done(function () {
            // 재로드하는 걸로
            utils.toast.show($G('successDatabaseProcessMsg'));
            LoadCoursePos();
        });
    }

    function handleDelete() {
        DevExpress.ui.dialog.confirm($G('deleteConfirmMsg'), "삭제").then(function (result) {
            if (result) {

                var array = utils.datagrid.getSelectedRowsData('gridContainer2');

                var data = selectedPatrolCourse();
                var PatrolCourseId = data.PatrolCourseId();

                var postData;
                postData = _.map(array, function (m) {
                    return {
                        SiteId: m.SiteId(),
                        PatrolCourseId: PatrolCourseId,
                        PosId: m.PosId(),
                    };
                });

                BWA.api.post('CmPatrolCourse/DeleteCoursePos', postData).done(function () {
                    utils.toast.show($G('successDatabaseProcessMsg'));
                    PatrolCoursePosDataSource.load().done(function (poss) {
                        possInView(poss);
                        $('#gridContainer2').dxDataGrid('instance').refresh();
                    });
                });
            }
        });
    }

    // GroupUser 추가
    function handlePosAdd() {
        viewModel.PatrolPosSearchPopup.show();
    }

    function handleEdit() {
        /*
                var data = selectedPatrolCourse();
                viewModel.dataModel = data;
        
                viewModel.dataModel.SiteId = $KoSet(viewModel.dataModel.SiteId, data['SiteId']);
                viewModel.dataModel.PatrolCourseId = $KoSet(viewModel.dataModel.PatrolCourseId, data['PatrolCourseId']);
                viewModel.dataModel.Name = $KoSet(viewModel.dataModel.Name, data['Name']); */
        //viewModel.popupVisible(false);
        viewModel.popupVisible(true);
        //viewModel.popupVisible(true);
    }

    //onSelectedMaterials: function(selectedMaterials) {
    function onSelectedposs(selectedposs) {

        if (selectedposs.length <= 0) return;

        var data = selectedPatrolCourse();
        var PatrolCourseId = data.PatrolCourseId();

        $('#gridContainer2').dxDataGrid('instance').refresh();
        // 여기서 바로 저장 하자 !!

        var postData;
        try {
            postData = _.map(selectedposs, function (m) {
                return {
                    SiteId: m.SiteId(),
                    PatrolCourseId: PatrolCourseId,
                    BuildingId: m.BuildingId(),
                    FloorId: m.FloorId(),
                    PosId: m.PosId(),
                };
            });
        } catch (e) {
            postData = _.map(selectedposs, function (m) {
                return {
                    SiteId: m.SiteId,
                    PatrolCourseId: PatrolCourseId,
                    BuildingId: m.BuildingId,
                    FloorId: m.FloorId,
                    PosId: m.PosId,
                };
            });
        }

        BWA.api.post('CmPatrolCourse/AddCoursePos', postData).done(function () {
            // 재로드하는 걸로
            LoadCoursePos();
            utils.toast.show($G('successDatabaseProcessMsg'));
        });
    }

    function handleOrderUpdate() {
        var dataGrid = $('#gridContainer2').dxDataGrid('instance');
        var chage = new Array();

        var total = dataGrid.totalCount();

        for (var i = 0; i < total; i++) {
            dataGrid.byKey(dataGrid.getKeyByRowIndex(i)).done(function (data) {
                chage.push({
                    SiteId: data.SiteId(),
                    PatrolCourseId: data.PatrolCourseId(),
                    PosId: data.PosId(),
                    CourseOrder: data.CourseOrder()
                });
            });
        }

        BWA.api.post('CmPatrolCourse/UpdateCourseOrder', chage).done(function () {
            utils.toast.show($G('successDatabaseProcessMsg'));
            //LoadCoursePos();
            disableOrderUpdate(true);
        });
    }

    function LoadCoursePos() {

        var eq = BWA.DataUtil.constructEqualFilter;
        var and = BWA.DataUtil.andFilter;

        var data = selectedPatrolCourse();
        PatrolCoursePosDataSource.filter([
            eq('SiteId', data.SiteId()),
            and,
            eq('PatrolCourseId', data.PatrolCourseId()),
        ]);
        PatrolCoursePosDataSource.load().done(function (poss) {
            possInView(poss);
            $('#gridContainer2').dxDataGrid('instance').refresh();
        });
        disableOrderUpdate(true);
    }

    viewModel.popupVisible.subscribe(function (visible) {
        var i = {};
    });

    viewModel.menuDataGridOptions = menuDataGridOptions;
    viewModel.handlePosAdd = handlePosAdd;
    viewModel.handleEdit = handleEdit;
    viewModel.handleDelete = handleDelete;
    viewModel.handleOrderUpdate = handleOrderUpdate;
    viewModel.handleOrderUp = handleOrderUp;
    viewModel.handleOrderDown = handleOrderDown;
    viewModel.selectedPatrolCourse = selectedPatrolCourse;
    viewModel.selectedCoursePos = selectedCoursePos;
    viewModel.deleteDisabled = deleteDisabled;
    viewModel.upDisabled = upDisabled;
    viewModel.downDisabled = downDisabled;
    viewModel.reSelectRow = reSelectRow;
    viewModel.disableOrderUpdate = disableOrderUpdate;

    //viewModel.handleSearchInSearchView = handleSearchInSearchView;

    viewModel.PatrolPosSearchPopup = $PatrolPosSearchPopup(viewModel, null, true, onSelectedposs);
    //viewModel.userSearchPopup = $UserSearchPopup(viewModel, selectedUserData, true, onSelectedposs);
    //viewModel.toolbarItems.push({location: 'after', widget: 'button', options: { text: $G('close'), icon: 'save', clickAction: handleOrderUpdate } });
    //    viewModel.commandButtonOptions = commandButtonOptions;

    viewModel.handleSearchInSearchView2 = function (filter) {
        var filterA = [];
        _.each(filter, function (x) {
            filterA.push(x);
        });
        PatrolCoursePosDataSource.filter(filterA);
        PatrolCoursePosDataSource.load().done(function (result) {
            //PatrolCoursePermissionDataArray.load().done(function (result) {
            //PatrolCoursePermissionDataArray(result);
        });
    };

    return viewModel;
};