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

    var endpointSelector = "";
    if (BemsWebApplication.config.mode == "production") {
        endpointSelector = new DevExpress.EndpointSelector(BemsWebApplication.config.endpoints).config.db.production;
    } else {
        endpointSelector = new DevExpress.EndpointSelector(BemsWebApplication.config.endpoints).config.db.local;
    }
    var facilityClassDataSource = BemsWebApplication.db.createDataSource('FmsFacilityCodeClass');
    var AIR_HANDLING = $Code.FacilityType.AIR_HANDLING;
    var TEMP_SET = $Code.Formula[AIR_HANDLING].TEMP_SET;
    var buildingDataSource = BemsWebApplication.db.createDataSource('CmBuilding', true),
        floorDataSource = BemsWebApplication.db.createDataSource('CmFloor'),
        zoneDataSource = BemsWebApplication.db.createDataSource('CmZone');

    // 설비분류 데이터소스 
    var facilityTypeDataSource = BemsWebApplication.db.createDataSource('BemsFacilityType');
    var facilityTypes = ko.observableArray();

    var facilityClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()];
    var buildings = ko.observableArray(),
        floors = ko.observableArray(),
        zones = ko.observableArray();

    var searchFacilityClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()],
        searchFacilityClassValues = [ko.observable(), ko.observable(), ko.observable()],
        searchBuildings = ko.observableArray(),
        searchFloors = ko.observableArray(),
        searchBuildingId = ko.observable(),
        searchFloorId = ko.observable();

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

    var searchDeferred = new $.Deferred();



    var handleFirstClassChangedValueInSearchView = function (e) {
        if (e.value === 0) {
            initializeSearchClasses();
            return;
        }
        BWA.DataUtil.setArrayDataSourceFilter(facilityClassDataSource, 'ParentFacilityClassId', e.value, searchFacilityClasses[1], defaultSearchClassArray);
    };
    var handleSecondClassChangedValueInSearchView = function (e) {
        if (e.value === 0) {
            initializeSearchClasses(true);
            return;
        }
        BWA.DataUtil.setArrayDataSourceFilter(facilityClassDataSource, 'ParentFacilityClassId', e.value, searchFacilityClasses[2], defaultSearchClassArray);
    };

    var handleBuildingInSearchView = function (e) {
        if (e.value === 0) {
            searchFloors(defaultSearchFloorArray.slice(0));
            searchFloorId(0);
            return 0;
        }
        BWA.DataUtil.setArrayDataSourceFilter(floorDataSource, 'BuildingId', e.value, searchFloors, defaultSearchFloorArray);
    }

    function initializeSearchClasses(onlyThird) {
        if (onlyThird === undefined || onlyThird === false) {
            searchFacilityClasses[1](defaultSearchClassArray.slice(0));
            searchFacilityClassValues[1](0);
        }
        searchFacilityClasses[2](defaultSearchClassArray.slice(0));
        searchFacilityClassValues[2](0);
    }

    function setupDropZone(isEditModeInPopup, dataViewModel) {

        var timer = null;
        isEditModeInPopup.subscribe(function (value) {

            if (value) {

                if (timer) { clearInterval(timer); }

                timer = setInterval(function () {

                    if ($('#facilityDropZone').length) {

                        if (_.isNull(dropZone)) {

                            dropZone = BWA.DropZone.create({

                                id: '#facilityDropZone',
                                categoryId: $Code.FileCategory.FACILITY,
                                uploadedFileInfo: uploadedFileInfo,
                                handleRemoveBeforePromise: function () {

                                    var keys = BWA.db.extractKeysObject('CmFacility', dataViewModel);
                                    return BWA.db.CmFacility.update(keys, { FileId: null });
                                },
                                handleSuccess: function (fileInfo) {
                                    dataViewModel.FileId(fileInfo.FileId);
                                },

                                handleRemovedFile: function () {
                                    dataViewModel.FileId(null);
                                },
                            });

                            uploadedFileInfo.SiteId = dataViewModel.SiteId();
                            uploadedFileInfo.FileId = dataViewModel.FileId();

                            if (uploadedFileInfo.FileId) {

                                BWA.db.CmFile.byKey(uploadedFileInfo).done(function (data) {

                                    dropZone.removeAllFiles();

                                    dropZone.emit('addedfile', {
                                        name: data.Name,
                                        size: data.FileSize
                                    });

                                });
                            }
                        }
                    }
                }, 100);
            }
            else {

                if (timer) {
                    clearInterval(timer);
                    timer = null;
                }
                dropZone = null;
            }
        });
    }

    var facilityOptions = BemsWebApplication.Factory.Facility;

    var viewModel = BWA.DataGrid.createViewWithDataGrid( params, viewInfo, 'CmFacilityTempSet', {
        rowUpdated: function (e) {
            var PropertyId, controlvalue;
            var now = new Date();
            var SiteId = e.key.SiteId;
            var FacilityCode = e.key.FacilityCode;
            var data = e.data;
            var data_columns = Object.getOwnPropertyNames(data).toString();
            var nowmonth = now.getMonth() + 1;
            var nowmonth = "T" + nowmonth;
            if (data_columns == nowmonth) {
                if (data_columns == "T1") { controlvalue = data.T1; }
                else if (data_columns == "T2") { controlvalue = data.T2; }
                else if (data_columns == "T3") { controlvalue = data.T3; }
                else if (data_columns == "T4") { controlvalue = data.T4; }
                else if (data_columns == "T5") { controlvalue = data.T5; }
                else if (data_columns == "T6") { controlvalue = data.T6; }
                else if (data_columns == "T7") { controlvalue = data.T7; }
                else if (data_columns == "T8") { controlvalue = data.T8; }
                else if (data_columns == "T9") { controlvalue = data.T9; }
                else if (data_columns == "T10") { controlvalue = data.T10; }
                else if (data_columns == "T11") { controlvalue = data.T11; }
                else { controlvalue = data.T12; }
                controlvalue = parseFloat(controlvalue);
                var dataSource = new DevExpress.data.DataSource({
                    store: {
                        type: "odata",
                        url: endpointSelector + "/BemsFormulaParameter"
                    },
                    requireTotalCount: true,
                    pageSize: 1
                });
                dataSource.filter([
                        ["SiteId", "=", BWA.UserInfo.SiteId()],
                        "and",
                        ["FacilityCode", "=", FacilityCode],
                        "and",
                        ["FormulaId", "=", TEMP_SET]
                ]);
                dataSource.load()
                .done(function (result) {
                    if (result.length == 0) {
                        utils.toast.show("[BemsFormulaParameter] 공조기 온도 설정 데이터가 없습니다.");
                    } else {
                        PropertyId = result[0].ParameterPropertyId;
                        var store = new DevExpress.data.ODataStore({
                            url: endpointSelector + "/BemsControlPointHistory",
                            key: ["CreateDateTime", "PropertyId", "FacilityCode", "SiteId"],
                            keyType: { CreateDateTime: "DateTime", PropertyId: "Int32", FacilityCode: "Int32", SiteId: "Int32" }
                        });
                        store.insert({
                            SiteId: SiteId,
                            FacilityTypeId: AIR_HANDLING,
                            FacilityCode: FacilityCode,
                            PropertyId: PropertyId,
                            CreateDateTime: now,
                            ControlValue: controlvalue,
                            WriteServiceName: null,
                            ActionDateTime: null
                        })
                    }
                })
                .fail(function (error) {
                    utils.toast.show(error);
                });
            }
        },
            rowAlternationEnabled: true,
            editing: {
                editMode: 'cell', // 14.1은  batch, row 두가지 밖에 없다. cell->row로 동작중이다. 2015 07 15 hcLee
                editEnabled: true,
            },

            dataSourceOptions: {
                select: ['SiteId', 'FacilityCode',  'CmFacility/Name', 'T1', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7', 'T8', 'T9', 'T10', 'T11', 'T12'],
                expand: ['CmFacility'],
                extendOptions: {
                    forceOriginalField: true,
                }
            },

            columns: [
            { dataField: 'FacilityCode', caption: $G('number'), width: '4%', alignment: 'center' },
                { dataField: 'CmFacility/Name', caption: '공조기명', width: '10%', alignment: 'center', allowEditing: false },

                { dataField: 'T1', caption: '1월 설정온도', width: '8%', alignment: 'center' },
                { dataField: 'T2', caption: '2월 설정온도', width: '8%', alignment: 'center' },
                { dataField: 'T3', caption: '3월 설정온도', width: '8%', alignment: 'center' },
                { dataField: 'T4', caption: '4월 설정온도', width: '8%', alignment: 'center' },
                { dataField: 'T5', caption: '5월 설정온도', width: '8%', alignment: 'center' },
                { dataField: 'T6', caption: '6월 설정온도', width: '8%', alignment: 'center' },
                { dataField: 'T7', caption: '7월 설정온도', width: '8%', alignment: 'center' },
                { dataField: 'T8', caption: '8월 설정온도', width: '8%', alignment: 'center' },
                { dataField: 'T9', caption: '9월 설정온도', width: '8%', alignment: 'center' },
                { dataField: 'T10', caption: '10월 설정온도', width: '8%', alignment: 'center' },
                { dataField: 'T11', caption: '11월 설정온도', width: '8%', alignment: 'center' },
            { dataField: 'T12', caption: '12월 설정온도', width: '8%', alignment: 'center' }

            ],
            popupWidth: 480,

            searchViewItems: [
                { id: 'CmFacility/BuildingId', ignoreValue: 0, defaultValue: 0, value: searchBuildingId, dataSource: searchBuildings, handleChangedValue: handleBuildingInSearchView },
                { id: 'CmFacility/FloorId', ignoreValue: 0, defaultValue: 0, withCheckId: 'CmFacility/BuildingId', value: searchFloorId, dataSource: searchFloors },
                { id: 'CmFacility/Name' }
            ],
            promiseDataInSearchView: searchDeferred.promise(),

        
            handleViewShowing: function () {
                facilityClassDataSource.filter([
                        ['SiteId', '=', BWA.UserInfo.SiteId()],
                        'and',
                        ['ParentFacilityClassId', '=', null]
                ]);

                facilityTypeDataSource.filter([
                    ['FacilityTypeId', '=', 1]
                ]);

                // 빌딩 데이터 로드 시점 
                $.when(facilityClassDataSource.load(),
                    buildingDataSource.load(),
                    facilityTypeDataSource.load()
                ).done(function (result1, result2, result3) {


                    buildings(result2[0]);

                    searchBuildings(defaultSearchBuildingArray.slice(0).concat(result2[0]));
                    searchFloors(defaultSearchFloorArray.slice(0));


                    searchDeferred.resolve();
                    
                });
            },
            
            handleViewShown: function (dataViewModel, isEditModeInPopup) {
                setupDropZone(isEditModeInPopup, dataViewModel);


            },

            handleViewHidden: function () {
                $SearchView.visibleObservable(false); // hcLee 2015 03 23
                visiblePopup(false);
            },

            handlePopupShowing: function (that) {
            },
    });

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

    viewModel.handleSelectBoxChangeFirstClass = function (e) {

        BWA.DataUtil.setArrayDataSourceFilter(facilityClassDataSource, 'ParentFacilityClassId', e.value, facilityClasses[1]);
        viewModel.dataModel.SecondClassId(null);
        viewModel.dataModel.ThirdClassId(null);
    };

    viewModel.handleSelectBoxChangeSecondClass = function (e) {

        BWA.DataUtil.setArrayDataSourceFilter(facilityClassDataSource, 'ParentFacilityClassId', e.value, facilityClasses[2]);
        viewModel.dataModel.ThirdClassId(null);
    };

    viewModel.handleSelectBoxChangeBuilding = function (e) {

        BWA.DataUtil.setArrayDataSourceFilter(floorDataSource, 'BuildingId', e.value, floors);
        viewModel.dataModel.FloorId(null);
        viewModel.dataModel.ZoneId(null);
    };

    viewModel.handleSelectBoxChangeFloor = function (e) {

        BWA.DataUtil.setArrayDataSourceFilter(zoneDataSource, 'FloorId', e.value, zones);
        viewModel.dataModel.ZoneId(null);
    };

    function refreshList() {

    }



    viewModel.facilityTypes = facilityTypes;

    viewModel.dataModel.ClassName = ko.observable();
    viewModel.facilityClasses = facilityClasses;
    viewModel.searchFacilityClasses = searchFacilityClasses;
    viewModel.buildings = buildings;
    viewModel.floors = floors;
    viewModel.zones = zones;

    return viewModel;
};