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

    var ZoneInfo = ko.observableArray();
    var CmZoneDataSource = BemsWebApplication.db.createDataSource('CmZone');
    var RowBuildingId;
    var RowName, RowFloorId;

    var buildingDataSource = BemsWebApplication.db.createDataSource('CmBuilding', true),
        floorDataSource = BemsWebApplication.db.createDataSource('CmFloor', true);

    var buildings = ko.observableArray(),
        floors = ko.observableArray();

    var buildingsForSearch = ko.observableArray(),
        floorsForSearch = ko.observableArray(),

        buildingIdForSerach = ko.observable(),
        floorIdForSerach = ko.observable(),

        defaultSearchBuildingArray = $SearchView.createDefaultArray('BuildingId'),
        defaultSearchFloorArray = $SearchView.createDefaultArray('FloorId');

    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, 'CmZone', {
        rowAlternationEnabled: true,
        /*
                    editing: {
                        editMode: 'batch',
                        editEnabled: true,
                        //removeEnabled: true,
                        //insertEnabled: true
                    },*/

        dataSourceOptions: {
            select: ['SiteId', 'FloorId', 'BuildingId', 'ZoneId', 'Name', 'CmBuilding/Name', 'CmFloor/Name', 'Target_temperature', 'Target_humidity'],
            expand: ['CmBuilding', 'CmFloor'],
            extendOptions: {
                forceOriginalField: true,
            }
        },

        columns: [
            { dataField: 'ZoneId', caption: $G('number'), width: '15%', alignment: 'center', sortOrder: 'desc' },
            /*
            { dataField: 'CmBuilding/Name', caption: $G('buildingName'), width: '22%', alignment: 'center', allowEditing: false },
            { dataField: 'CmFloor/Name', caption: $G('floorName'), width: '23%', alignment: 'center', allowEditing: false },
            { dataField: 'Name', caption: $G('zoneName'), width: '40%', alignment: 'center', allowEditing: false }, */
            { dataField: 'CmBuilding/Name', caption: $G('buildingName'), width: '22%', alignment: 'center' },
            { dataField: 'CmFloor/Name', caption: $G('floorName'), width: '23%', alignment: 'center' },
            { dataField: 'Name', caption: $G('zoneName'), width: '40%', alignment: 'center' },

            //{ dataField: 'Target_temperature', caption: '목표온도', width: '40%', alignment: 'center' },
            //{ dataField: 'Target_humidity', caption: '목표습도', width: '40%', alignment: 'center' }
            //utils.datagrid.columnIsUse( '15%' )
        ],
		
		paging: {
			pageSize: 18
		},
		pager: {},

        // 2019.04.17 엑셀 출력 기능 추가 ~~~
        "export": {
            enabled: true,
            fileName: '구역 정보 목록'
        },
        onExporting: function (e) {
            e.component.columnOption("ZoneId", "visible", false);
        },
        onExported: function (e) {
            e.component.columnOption("ZoneId", "visible", true);
        },
        // ~~~ 2019.04.17 엑셀 출력 기능 추가
        popupWidth: 480,
        promiseDataInSearchView: deferredForSearch.promise(),
        searchViewItems: [
            { id: 'BuildingId', ignoreValue: 0, defaultValue: 0, value: buildingIdForSerach, dataSource: buildingsForSearch, handleChangedValue: handleBuildingInSearchView },
            { id: 'FloorId', ignoreValue: 0, defaultValue: 0, value: floorIdForSerach, dataSource: floorsForSearch },  //withCheckId: 'BuildingId', 
            { id: 'Name' }
        ],
        handleViewShowing: function () {         
            buildingDataSource.load().done(function (buildingResults) {
                buildings(buildingResults);

                //buildingsForSearch( $SearchView.createArrayOfSelectBox( 'BuildingId', buildings() ) );
                //floorsForSearch( getDefaultFloorForSearch() );

                buildingsForSearch(defaultSearchBuildingArray.slice(0).concat(buildingResults));
                floorsForSearch(defaultSearchFloorArray.slice(0));

                buildingIdForSerach(0);
                floorIdForSerach(0);
                deferredForSearch.resolve();
            });
        },
        handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
            dataGrid.clearSelection();
            // hcLee 2016 02 16 키필드가 콤보로 제공될때 등록시만 보이고 수정시에는 안보기에 하기 위하여 꼭 필요 !!!
            viewModel.isNewInPopup(false);
            //$("#textBuildingName").show();
            var data = clickRow.data;
            var dataModel = viewModel.dataModel;

            dataModel.BuildingName = $KoSet(dataModel.BuildingName, data['CmBuilding/Name']);
            dataModel.FloorName = $KoSet(dataModel.FloorName, data['CmFloor/Name']);

            RowBuildingId = data.BuildingId;
            RowFloorId = data.FloorId;
            RowName = data.Name;
            //alert(dataModel.BuildingName()); 

            popupVisible(true);
        },
        handleAfterLoadingModelByKey: function (data, dataViewModel, isNewInPopup) {
            if (isNewInPopup() == false) {
                BWA.DataUtil.setArrayDataSourceFilter(floorDataSource, 'BuildingId', dataViewModel.BuildingId(), floors);
            }
        },
        viewHidden: function () {
            $SearchView.visibleObservable(false); // hcLee 2015 03 23
            visiblePopup(false);
        },

        handleBeforeDelete: function (db) {
            //alert('handleAfterDelete ' + db.SiteId + db.BuildingId + db.FloorId + db.ZoneId);
            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/RemoveZoneTempHumiSet', dataViewModel);
            promise.done(function () {

            });
        },

        // 이름 중복 방지
        handlePopupShowing: function () {
            CmZoneDataSource.filter([
                ["SiteId", "=", BWA.UserInfo.SiteId()]
            ]);
            CmZoneDataSource.load().done(function (result) {
                ZoneInfo(result);
            });
        },

        beforeInsertingDataViewModel: function (dataModel, dbModelId) {
            var dfd = $.Deferred();
            var isDuplicated = false;

            for (var i = 0; i < ZoneInfo().length; i++) {
                if (dataModel.BuildingId() == ZoneInfo()[i].BuildingId() && dataModel.FloorId() == ZoneInfo()[i].FloorId() && dataModel.Name() == ZoneInfo()[i].Name()) {
                    isDuplicated = true;
                    break;
                }
            }
            if (!BWA.DataUtil.isValidInputValue(dataModel.BuildingId())
                || !BWA.DataUtil.isValidInputValue(dataModel.FloorId())
                || !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 < ZoneInfo().length; i++) {
                if (viewModel.dataModel.Name() == ZoneInfo()[i].Name() && RowName() != ZoneInfo()[i].Name()
                    && viewModel.dataModel.BuildingId() == ZoneInfo()[i].BuildingId() && viewModel.dataModel.FloorId() == ZoneInfo()[i].FloorId()) {
                    isDuplicated = true;
                    break;
                }
            }
            if (!BWA.DataUtil.isValidInputValue(viewModel.dataModel.Name())
                || !BWA.DataUtil.isValidInputValue(viewModel.dataModel.FloorId())
                || !BWA.DataUtil.isValidInputValue(viewModel.dataModel.Name())) {
                utils.toast.show('저장 혹은 수정 반드시 필수 입력 정보를 모두 입력하셔야 합니다 (앞뒤공백 허용안함)', 'error');
                return 0;
            }
            else {
                if (isDuplicated) {
                    utils.toast.show('이미 동일 명칭이 존재합니다 (빌딩 명칭, 층 명칭, 구역 명칭 확인 필요)', 'error');
                    return 0;
                }
                else
                    return 2;
            }
        },

        handleAfterInsert: function (db) {
            //alert('handleAfterInsert' + db.SiteId + db.BuildingId + db.FloorId + db.ZoneId);
            //var data = new CmZoneTempHumiSet();
            var dataViewModel = new BemsWebApplication['CmZoneTempHumiSetViewModel']();
            dataViewModel.SiteId = db.SiteId;
            dataViewModel.BuildingId = db.BuildingId;
            dataViewModel.FloorId = db.FloorId;
            dataViewModel.ZoneId = db.ZoneId;
            /*
            dataViewModel.T1 = 0;
            dataViewModel.T2 = 0;
            dataViewModel.T3 = 0;
            dataViewModel.T4 = 0;
            dataViewModel.T5 = 0;
            dataViewModel.T6 = 0;
            dataViewModel.T7 = 0;
            dataViewModel.T8 = 0;
            dataViewModel.T9 = 0;
            dataViewModel.T10 = 0;
            dataViewModel.T11 = 0;
            dataViewModel.T12 = 0;

            dataViewModel.H1 = 0;
            dataViewModel.H2 = 0;
            dataViewModel.H3 = 0;
            dataViewModel.H4 = 0;
            dataViewModel.H5 = 0;
            dataViewModel.H6 = 0;
            dataViewModel.H7 = 0;
            dataViewModel.H8 = 0;
            dataViewModel.H9 = 0;
            dataViewModel.H10 = 0;
            dataViewModel.H11 = 0;
            dataViewModel.H12 = 0;*/

            //r promise = BemsWebApplication.api.post('BemsMonitoringPoint/AddZoneTempHumi', dataViewModel.toJS());
            var promise = BemsWebApplication.api.post('BemsMonitoringPoint/AddZoneTempHumiSet', dataViewModel);
            promise.done(function () {
                ;
            });
        },
    });

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

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

    //viewModel.dataModel.ClassName = ko.observable();
    viewModel.dataModel.BuildingName = ko.observable();
    viewModel.dataModel.FloorName = ko.observable();
    viewModel.buildings = buildings;
    //viewModel.buildingsForSearch = buildingsForSearch;
    viewModel.floors = floors;
    //viewModel.floorsForSearch = floorsForSearch;

    viewModel.handleSelectBoxChangeBuilding = function (e) {
        //BWA.DataUtil.setArrayDataSourceFilter( floorDataSource, 'BuildingId', e.value, floors );
        if (viewModel.dataModel.BuildingId() != null) {
            floorDataSource.filter([
                ['SiteId', '=', BWA.UserInfo.SiteId()],
                "and",
                ['BuildingId', '=', viewModel.dataModel.BuildingId()]
            ]);
        }
        floorDataSource.load().done(function (result) {
            floors(result);
        });
        viewModel.dataModel.FloorId(null);
    }

    viewModel.searchViewPopup = BWA.Popup.SearchView.create({
        parentPopupId: 'popupDetail',
        parentPopupVisible: viewModel.popupVisible,
        handleSearch: function (filter, searchItems) {
        }
    });

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