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

    var facilityClassDataSource = BemsWebApplication.db.createDataSource('FmsFacilityCodeClass');

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

    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 imagefileUrl = ko.observable(),
        uploadedFileInfo = {},
        dropZone = null;

    var isMainContactor = true,
        selectedUserData = ko.observable(),
        selectedFacility = ko.observable(),
        selectedFacilityDataInSearchParentPopup = ko.observable();

    var searchDeferred = new $.Deferred();

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

    var tabsVisible = ko.observable(false),
        currentTabIndex = ko.observable(0);

    selectedFacilityDataInSearchParentPopup.subscribe(function(value) {
        viewModel.dataModel.ParentFacilityCode(value.FacilityCode);
        viewModel.dataModel.ParentFacilityName(value.Name);
    });
    selectedUserData.subscribe(function(value) {
        if (isMainContactor) {
            viewModel.dataModel.MainContactorUserId(value.UserId);
            viewModel.dataModel.MainContactorUserName(value.Name);
        }
        else {
            viewModel.dataModel.SubContactorUserId(value.UserId);
            viewModel.dataModel.SubContactorUserName(value.Name);
        }
    });

    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
                                    });
                                    //dropZone.options.maxFiles = 0; // 이게 있으면 삭제후 다시 업로드가 안 된다.

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

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

    }


    var facilityOptions = BemsWebApplication.Factory.Facility;

    var viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'CmFacility', {

        dataSourceOptions: facilityOptions.getDataSourceForDataGrid(),
        //dataSourceOptions: {
        //    store: BemsWebApplication.odata.Facility,
        //    select: [ 'SiteId' , 'FacilityCode' , 'ParentFacilityName', 'FirstClassName', 'SecondClassName', 'ThirdClassName', 'Name', 'Nickname',
        //              'BuildingName', 'FloorName', 'ZoneName', 'ManufactureModel', 'MainContactorUserName', 'SubContactorUserName' ]
        //},
        columns: facilityOptions.getColumns([
            { dataField: 'FacilityCode' },
            { dataField: 'ClassName' },
            { dataField: 'Name' },
            { dataField: 'ManufactureModel' },
            { dataField: 'MainContactorUserName' },
            { dataField: 'SubContactorUserName' },
            { dataField: 'Location' }
        ]),
        popupWidth: '740px',
        wordWrapEnabled: true,
        cellPrepared: BemsWebApplication.Factory.Facility.cellPrepared,
        searchViewItems: [
            { id: 'FirstClassId', ignoreValue: 0, defaultValue: 0, value: searchFacilityClassValues[0], dataSource: searchFacilityClasses[0], handleChangedValue: handleFirstClassChangedValueInSearchView },
            { id: 'SecondClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: searchFacilityClassValues[1], dataSource: searchFacilityClasses[1], handleChangedValue: handleSecondClassChangedValueInSearchView },
            { id: 'ThirdClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: searchFacilityClassValues[2], dataSource: searchFacilityClasses[2] },
            { id: 'BuildingId', ignoreValue: 0, defaultValue: 0, value: searchBuildingId, dataSource: searchBuildings, handleChangedValue: handleBuildingInSearchView },
            { id: 'FloorId', ignoreValue: 0, defaultValue: 0, withCheckId: 'BuildingId', value: searchFloorId, dataSource: searchFloors },
            { id: 'Name' }
        ],
        promiseDataInSearchView: searchDeferred.promise(),

        handleViewShowing: function() {

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

            $.when(facilityClassDataSource.load(), buildingDataSource.load()).done(function(result1, result2) {

                facilityClasses[0](result1[0]);
                searchFacilityClasses[0](defaultSearchClassArray.slice(0).concat(result1[0]));
                initializeSearchClasses();

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

                searchDeferred.resolve();
            });
        },

        handleViewShown: function(dataViewModel, isEditModeInPopup) {

            setupDropZone(isEditModeInPopup, dataViewModel);
        },

        handlePopupShowing: function(isNewInPopup) {

            tabsVisible(isNewInPopup() == false);
        },

        handlePopupShown: function(isEditModeInPopup, isNewInPopup, dataViewModel) {

            if (isNewInPopup === false) {
                //viewModel.childFacilitiesMultiView.load();                
            }


            viewModel.searchViewPopup.show();
        },

        //handlePopupHiding: function() {

        //    if (_.isNull(dropZone) === false) {

        //        dropZone.dispose();
        //    }
        //},

        //handleCancelInPopup: function() {

        //    if (_.isNull(dropZone) === false) {

        //        dropZone.dispose();
        //    }
        //},

        handleSaveSuccess: function() {

            if (_.isNull(dropZone) === false) {

                dropZone.resetUploadedFileInfo();
            }
        },


        handleAfterLoadingModelByKey: function(data, dataViewModel, isNewInPopup) {

            if (isNewInPopup() == false) {
                BWA.DataUtil.setArrayDataSourceFilter(facilityClassDataSource, 'ParentFacilityClassId', dataViewModel.FirstClassId(), facilityClasses[1]).done(function() {
                    BWA.DataUtil.setArrayDataSourceFilter(facilityClassDataSource, 'ParentFacilityClassId', dataViewModel.SecondClassId(), facilityClasses[2]);
                });
                BWA.DataUtil.setArrayDataSourceFilter(floorDataSource, 'BuildingId', dataViewModel.BuildingId(), floors).done(function() {
                    BWA.DataUtil.setArrayDataSourceFilter(zoneDataSource, 'FloorId', dataViewModel.FloorId(), zones);
                });

                if (_.isNull(dataViewModel.FileId()) === false) {

                    imagefileUrl('{0}/CmFile(SiteId={1},FileId={2})/$value'.formati(BWA.db._url, dataViewModel.SiteId(), dataViewModel.FileId()));
                }
                else {
                    imagefileUrl(undefined);
                }

                selectedFacility(dataViewModel);
            }
        },

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

            dataGrid.clearSelection();

            var data = clickRow.data;
            var dataModel = viewModel.dataModel;

            dataModel.ParentFacilityName = $KoSet(dataModel.ParentFacilityName, data.ParentFacilityName);
            dataModel.ClassName = $KoSet(dataModel.ClassName,
                BWA.Factory.Facility.formatClassName(data.FirstClassName(), data.SecondClassName(), data.ThirdClassName()));

            dataModel.BuildingName = $KoSet(dataModel.BuildingName, data.BuildingName);
            dataModel.FloorName = $KoSet(dataModel.FloorName, data.FloorName);
            dataModel.ZoneName = $KoSet(dataModel.ZoneName, data.ZoneName);

            dataModel.MainContactorUserName = $KoSet(dataModel.MainContactorUserName, data.MainContactorUserName);
            dataModel.SubContactorUserName = $KoSet(dataModel.SubContactorUserName, data.SubContactorUserName);

            popupVisible(true);
        }

    });
    //var handleSelectBoxCompany = function( e ) {
    //    viewModel.dataModel.CompanyId(e.value);
    //};


    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);
    }

    viewModel.buttonSearchFacility = function() {

        viewModel.facilitySearchPopup.show();
    };

    viewModel.buttonSearchMainContactorUser = function(e) {

        isMainContactor = true;
        viewModel.userSearchPopup.show();
    }

    viewModel.buttonSearchSubContactorUser = function(e) {

        isMainContactor = false;
        viewModel.userSearchPopup.show();
    }

    viewModel.tabsOptions = {
        visible: tabsVisible,
        selectedIndex: currentTabIndex,
        dataSource: [
            { text: '시설정보' },
            { text: '작업이력' },
            { text: '하위시설' },
            { text: '점검항목' },
            { text: '법정항목' },
            { text: '운전일자항목' }
        ]
    };

    //viewModel.companyDataSource = companies;
    //viewModel.handleSelectBoxCompany = handleSelectBoxCompany;
    viewModel.dataModel.ClassName = ko.observable();
    viewModel.facilityClasses = facilityClasses;
    viewModel.searchFacilityClasses = searchFacilityClasses;
    viewModel.buildings = buildings;
    viewModel.floors = floors;
    viewModel.zones = zones;
    viewModel.userSearchPopup = $UserSearchPopup(viewModel, selectedUserData);
    viewModel.facilitySearchPopup = BWA.Popup.Facility.create(viewModel, selectedFacilityDataInSearchParentPopup);

    var multiViewDataSource = [{
        viewModel: viewModel,
        imagefileUrl: imagefileUrl,
        template: 'facility'
    }];
    //viewModel.childFacilitiesMultiView = BWA.Facility.createChildFacilitiesMultiViewInPopup(viewModel,selectedFacility);

    BWA.Popup.WorkResult.setupMultiViewInPopup(viewModel, selectedFacility, multiViewDataSource);
    BWA.Facility.setupMultiViewInPopup(viewModel, selectedFacility, multiViewDataSource);
    BWA.FacilityCheckItem.setupMultiViewInPopup($Code.WorkType.REGULAR_CHECK, 'checkItems',
        'checkItemDataGrid', viewModel, selectedFacility, multiViewDataSource);
    BWA.FacilityCheckItem.setupMultiViewInPopup($Code.WorkType.LEGAL_CHECK, 'legalCheckItems',
        'legalCheckItemDataGrid', viewModel, selectedFacility, multiViewDataSource);
    //BWA.CheckGroupManagement.setupMultiViewInPopup(viewModel, selectedFacility, multiViewDataSource);
    //BWA.LegalCheckGroupManagement.setupMultiViewInPopup(viewModel, selectedFacility, multiViewDataSource);

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

        }
    });

    //    viewModel.searchViewPopup

    viewModel.multiViewOptions = {
        height: '560px',
        selectedIndex: currentTabIndex,
        dataSource: multiViewDataSource
    };

    return viewModel;
};