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

    var facilityClassDataSource = BemsWebApplication.db.createDataSource('FmsFacilityCodeClass');
    facilityClassDataSource.filter([
                    ['SiteId', '=', BWA.UserInfo.SiteId()],
                    'and',
                    ['ParentFacilityClassId', '=', null]
    ]);
    var facilityClassDataSource2 = BemsWebApplication.db.createDataSource('FmsFacilityCodeClass');
    var facilityClasses2 = ko.observableArray();
    var buildingDataSource = BemsWebApplication.db.createDataSource('CmBuilding', true),
        floorDataSource = BemsWebApplication.db.createDataSource('CmFloor', true),
        zoneDataSource = BemsWebApplication.db.createDataSource('CmZone', true),

        UserDataSource = BemsWebApplication.db.createDataSource('CmUser', true),
        facilityDataSource = BemsWebApplication.db.createDataSource('CmFacility', true),
        fuelTypeDataSource = BemsWebApplication.db.createDataSource('BemsFuelType', true),
        contractTypeDataSource = BemsWebApplication.db.createDataSource('BemsNoticePriceContractType'),

        floorDataSource2 = BemsWebApplication.db.createDataSource('CmFloor', true),
        zoneDataSource2 = BemsWebApplication.db.createDataSource('CmZone', true),
        contractTypeDataSource2 = BemsWebApplication.db.createDataSource('BemsNoticePriceContractType');
    var filePath = "/App_Data/files/form/설비등록양식.xlsx";
    var isEditModeInPopup = ko.observable(false);
    // 설비분류 데이터소스 
    var facilityTypeDataSource = BemsWebApplication.db.createDataSource('BemsFacilityType');
    var facilityTypes = ko.observableArray();
    var facility = ko.observableArray();
    var facilityClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()];
    var buildings = ko.observableArray(),
        floors = ko.observableArray(),
        zones = ko.observableArray(),
        floors2 = ko.observableArray(),
        zones2 = ko.observableArray(),
        user = ko.observableArray(),
        contract = ko.observableArray(),
        fuelTypes = ko.observableArray(),
        contractTypes = ko.observableArray();

    var searchFacilityClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()],
        searchFacilityClassValues = [ko.observable(), ko.observable(), ko.observable()],
        searchBuildings = ko.observableArray(),
        searchFloors = ko.observableArray(),
        searchFuelTypes = 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'),
        defaultSearchContractTypeArray = $SearchView.createDefaultArray('ContractType');

    var tabsVisible = ko.observable(false);
    var 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) {//2019-11-11 변경
        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) {
                                    if (uploadedFileInfo.FileId) {
                                        dataViewModel.FileId(uploadedFileInfo.FileId);
                                        var keys = BWA.db.extractKeysObject('CmFacility', dataViewModel);
                                        if (keys.FacilityCode != null) {
                                            return BWA.db.CmFacility.update(keys, { FileId: uploadedFileInfo.FileId });
                                        }
                                    }
                                },
                                handleRemovedFile: function () {
                                    dataViewModel.FileId(null);
                                }
                            });
                        }
                    }
                }, 100);
            }
            else {
                if (timer) {
                    clearInterval(timer);
                    timer = null;
                }
                dropZone = null;
            }
        });
    }

    function FacilityDownload() {
        var url = "";
        if (BemsWebApplication.config.mode == "production") {
            url = BemsWebApplication.config.endpoints.service.production + filePath;
        } else {
            url = BemsWebApplication.config.endpoints.service.local + filePath;
        }
        window.location.assign(url);
    }

    function FacilityImport() {
        var inputFileControl = document.getElementById("FILE_IMPORT");
        $(document).ready(function () {
            function changeValue(e) {
                if (e.currentTarget.value == "") {

                }
                else if (!checkFileType(e.currentTarget.value)) {
                    utils.toast.show('정해진 양식으로만 올려주세요!', 'error');
                    return;
                } else {
                    var files = e.target.files; //input file 객체를 가져온다.
                    var i, f;
                    for (i = 0; i != files.length; ++i) {
                        f = files[i];
                        var reader = new FileReader(); //FileReader를 생성한다.         

                        //성공적으로 읽기 동작이 완료된 경우 실행되는 이벤트 핸들러를 설정한다.
                        reader.onload = function (e) {
                            if (e) {
                                var data = e.target.result;
                                data = new Uint8Array(data);
                                var EXCELarray = [];
                                var tempEXCELarray = [];
                                var workbook = XLSX.read(data, { type: 'array' });
                                workbook.SheetNames.forEach(function (item, index, array) {
                                    EXCELarray.push(XLSX.utils.sheet_to_json(workbook.Sheets[item]));
                                });
                                for (var i = 0; i < EXCELarray[0].length; i++) {
                                    var tempmaterial = {
                                        SiteId: BWA.UserInfo.SiteId(),
                                        FacilityTypeId: EXCELarray[0][i]['BEMS 유형 (*)'],
                                        FacilityCode: null,
                                        FirstClassId: EXCELarray[0][i]['시설 대분류(*)'],
                                        SecondClassId: EXCELarray[0][i]['시설 중분류'],
                                        ThirdClassId: EXCELarray[0][i]['시설 소분류'],
                                        DeviceType: EXCELarray[0][i]['종류'],
                                        ParentFacilityCode: null,
                                        Name: EXCELarray[0][i]['시설명칭(*)'],
                                        Nickname: EXCELarray[0][i]['시설별칭(*)'],
                                        Rfid: EXCELarray[0][i]['RFID'],
                                        Manufacturer: EXCELarray[0][i]['제조업체'],
                                        ManufactureDate: EXCELarray[0][i]['제조일자'],
                                        ManufactureSerial: EXCELarray[0][i]['제조번호'],
                                        ManufactureModel: EXCELarray[0][i]['제조모델'],
                                        Supplier: EXCELarray[0][i]['납품업체'],
                                        SupplierPhoneNo: EXCELarray[0][i]['업체전화'],
                                        BuildingId: EXCELarray[0][i]['설치위치(대)'],
                                        FloorId: EXCELarray[0][i]['설치위치(중)'],
                                        ZoneId: EXCELarray[0][i]['설치위치(소)'],
                                        InstallDate: EXCELarray[0][i]['설치일자'],
                                        OperationStartDate: EXCELarray[0][i]['운전시작일'],
                                        FacilityCapacity: EXCELarray[0][i]['시설용량'],
                                        FacilityCost: EXCELarray[0][i]['시설비용'],
                                        FacilityCount: EXCELarray[0][i]['시설수량'],
                                        FacilitySeviceLifeYear: null,
                                        FacilityUsage: EXCELarray[0][i]['시설용도'],
                                        RatedPowerConsumption: EXCELarray[0][i]['정격전력소비량'],
                                        RatedCOP: EXCELarray[0][i]['정격COP'],
                                        MainContactorUserId: EXCELarray[0][i]['정담당자'],
                                        SubContactorUserId: EXCELarray[0][i]['부담당자'],
                                        Note: EXCELarray[0][i]['Note'],
                                        Reserved1: null,
                                        Reserved2: null,
                                        IsUse: EXCELarray[0][i]['사용여부(*)[활성화 or 취소]'],
                                        FileId: null,
                                        IsVirtualFacility: false,
                                        FuelTypeId: EXCELarray[0][i]['연료종류'],
                                        ContractType: EXCELarray[0][i]['계약종류'],
                                    }

                                    // BEMS 유형
                                    if (tempmaterial.FacilityTypeId == null) {
                                        utils.toast.show('BEMS 유형을 입력해야합니다(' + (i + 1) + '번 행)', 'error');
                                        return;
                                    }
                                    else {
                                        var cnt = 0;
                                        for (var j = 0; j < facilityTypes().length; j++) {
                                            if (tempmaterial.FacilityTypeId == facilityTypes()[j].Name()) {
                                                tempmaterial.FacilityTypeId = facilityTypes()[j].FacilityTypeId();
                                                break;
                                            }
                                            else {
                                                cnt++;
                                                if (cnt == facilityTypes().length) {
                                                    utils.toast.show('잘못된 BEMS 유형 내용을 입력하였습니다(' + (i + 1) + '번 행)', 'error');
                                                    return;
                                                }
                                            }
                                        }
                                    }

                                    // 시설명칭
                                    if (tempmaterial.Name == null) {
                                        utils.toast.show('시설명칭을 입력해야합니다(' + (i + 1) + '번 행)', 'error');
                                        return;
                                    }
                                    else {
                                        tempmaterial.Name = tempmaterial.Name.toString();
                                    }
                                    if (tempmaterial.Nickname == null) {
                                        utils.toast.show('시설별칭을 입력해야합니다(' + (i + 1) + '번 행)', 'error');
                                        return;
                                    } else {
                                        tempmaterial.Nickname = tempmaterial.Nickname.toString();
                                    }

                                    for (var j = 0; j < facility().length; j++) {
                                        if (tempmaterial.Name == facility()[j].Name()) {
                                            if (tempmaterial.Nickname == facility()[j].Nickname()) {
                                                utils.toast.show('동일한 시설명칭과 시설별칭을 입력할수 없습니다(' + (i + 1) + '번 행)', 'error');
                                                return;
                                            }
                                        }
                                    }

                                    //사용여부
                                    if (tempmaterial.IsUse == null) {
                                        utils.toast.show('사용여부를 입력해야합니다(' + (i + 1) + '번 행)[활성화 or 취소]', 'error');
                                        return;
                                    }
                                    else {
                                        if (tempmaterial.IsUse == "활성화") {
                                            tempmaterial.IsUse = true;
                                        } else if (tempmaterial.IsUse == "취소") {
                                            tempmaterial.IsUse = false;
                                        }
                                        else {
                                            utils.toast.show('사용여부를 정확히 입력해야합니다(' + (i + 1) + '번 행)[활성화 or 취소]', 'error');
                                            return;
                                        }
                                    }

                                    //시설 대분류
                                    if (tempmaterial.FirstClassId == null) {
                                        utils.toast.show('시설 대분류를 입력해야합니다(' + (i + 1) + '번 행)', 'error');
                                        return;
                                    }
                                    else {
                                        var cnt = 0;
                                        for (var j = 0; j < facilityClasses2().length; j++) {
                                            if ((tempmaterial.FirstClassId == facilityClasses2()[j].Name()) && facilityClasses2()[j].Depth() == 0) {
                                                tempmaterial.FirstClassId = facilityClasses2()[j].FacilityClassId();
                                                break;
                                            }
                                            else {
                                                cnt++;
                                                if (cnt == facilityClasses2().length) {
                                                    utils.toast.show('잘못된 시설 대분류 내용을 입력하였습니다(' + (i + 1) + '번 행)', 'error');
                                                    return;
                                                }
                                            }
                                        }
                                    }

                                    //시설 중분류
                                    if (tempmaterial.SecondClassId != null) {
                                        var cnt = 0;
                                        for (var j = 0; j < facilityClasses2().length; j++) {
                                            if ((tempmaterial.SecondClassId == facilityClasses2()[j].Name()) && (tempmaterial.FirstClassId == facilityClasses2()[j].ParentFacilityClassId()) && (facilityClasses2()[j].Depth() == 1)) {
                                                tempmaterial.SecondClassId = facilityClasses2()[j].FacilityClassId();
                                                break;
                                            }
                                            else {
                                                cnt++;
                                                if (cnt == facilityClasses2().length) {
                                                    utils.toast.show('잘못된 시설 중분류 내용을 입력하였습니다(' + (i + 1) + '번 행)', 'error');
                                                    return;
                                                }
                                            }
                                        }
                                    }

                                    //시설 소분류
                                    if (tempmaterial.ThirdClassId != null) {
                                        var cnt = 0;
                                        for (var j = 0; j < facilityClasses2().length; j++) {
                                            if ((tempmaterial.ThirdClassId == facilityClasses2()[j].Name()) && (tempmaterial.SecondClassId == facilityClasses2()[j].ParentFacilityClassId()) && (facilityClasses2()[j].Depth() == 2)) {
                                                tempmaterial.ThirdClassId = facilityClasses2()[j].FacilityClassId();
                                                break;
                                            }
                                            else {
                                                cnt++;
                                                if (cnt == facilityClasses2().length) {
                                                    utils.toast.show('잘못된 시설 소분류 내용을 입력하였습니다(' + (i + 1) + '번 행)', 'error');
                                                    return;
                                                }
                                            }
                                        }
                                    }

                                    if (tempmaterial.BuildingId != null) {
                                        var cnt = 0;
                                        for (var j = 0; j < buildings().length; j++) {
                                            if (tempmaterial.BuildingId == buildings()[j].Name()) {
                                                tempmaterial.BuildingId = buildings()[j].BuildingId();
                                                break;
                                            }
                                            else {
                                                cnt++;
                                                if (cnt == buildings().length) {
                                                    utils.toast.show('잘못된 설치위치(대) 내용을 입력하였습니다(' + (i + 1) + '번 행)', 'error');
                                                    return;
                                                }
                                            }
                                        }
                                    }

                                    if (tempmaterial.FloorId != null) {
                                        var cnt = 0;
                                        for (var j = 0; j < floors2().length; j++) {
                                            if (tempmaterial.FloorId == floors2()[j].Name()) {
                                                tempmaterial.FloorId = floors2()[j].FloorId();
                                                break;
                                            }
                                            else {
                                                cnt++;
                                                if (cnt == floors2().length) {
                                                    utils.toast.show('잘못된 설치위치(중) 내용을 입력하였습니다(' + (i + 1) + '번 행)', 'error');
                                                    return;
                                                }
                                            }
                                        }
                                    }

                                    if (tempmaterial.ZoneId != null) {
                                        var cnt = 0;
                                        for (var j = 0; j < zones2().length; j++) {
                                            if (tempmaterial.ZoneId == zones2()[j].Name()) {
                                                tempmaterial.ZoneId = zones2()[j].ZoneId();
                                                break;
                                            }
                                            else {
                                                cnt++;
                                                if (cnt == zones2().length) {
                                                    utils.toast.show('잘못된 설치위치(소) 내용을 입력하였습니다(' + (i + 1) + '번 행)', 'error');
                                                    return;
                                                }
                                            }
                                        }
                                    }

                                    if (tempmaterial.MainContactorUserId != null) {
                                        var cnt = 0;
                                        for (var j = 0; j < user().length; j++) {
                                            if (tempmaterial.MainContactorUserId == user()[j].Name()) {
                                                tempmaterial.MainContactorUserId = user()[j].UserId();
                                                break;
                                            }
                                            else {
                                                cnt++;
                                                if (cnt == user().length) {
                                                    utils.toast.show('잘못된 정담당자 내용을 입력하였습니다(' + (i + 1) + '번 행)', 'error');
                                                    return;
                                                }
                                            }
                                        }
                                    }

                                    if (tempmaterial.SubContactorUserId != null) {
                                        var cnt = 0;
                                        for (var j = 0; j < user().length; j++) {
                                            if (tempmaterial.SubContactorUserId == user()[j].Name()) {
                                                tempmaterial.SubContactorUserId = user()[j].UserId();
                                                break;
                                            }
                                            else {
                                                cnt++;
                                                if (cnt == user().length) {
                                                    utils.toast.show('잘못된 부담당자 내용을 입력하였습니다(' + (i + 1) + '번 행)', 'error');
                                                    return;
                                                }
                                            }
                                        }
                                    }

                                    if (tempmaterial.FuelTypeId != null) {
                                        var cnt = 0;
                                        for (var j = 0; j < fuelTypes().length; j++) {
                                            if (tempmaterial.FuelTypeId == fuelTypes()[j].Name()) {
                                                tempmaterial.FuelTypeId = fuelTypes()[j].FuelTypeId();
                                                break;
                                            }
                                            else {
                                                cnt++;
                                                if (cnt == fuelTypes().length) {
                                                    utils.toast.show('잘못된 연료종류를 입력하였습니다(' + (i + 1) + '번 행)', 'error');
                                                    return;
                                                }
                                            }
                                        }
                                    }

                                    if (tempmaterial.ContractType != null) {
                                        var cnt = 0;
                                        for (var j = 0; j < contract().length; j++) {
                                            if (tempmaterial.ContractType == contract()[j].Name()) {
                                                tempmaterial.ContractType = contract()[j].ContractType();
                                                break;
                                            }
                                            else {
                                                cnt++;
                                                if (cnt == contract().length) {
                                                    utils.toast.show('잘못된 계약종류를 입력하였습니다(' + (i + 1) + '번 행)', 'error');
                                                    return;
                                                }
                                            }
                                        }
                                    }

                                    if (tempmaterial.DeviceType != null)
                                        tempmaterial.DeviceType = tempmaterial.DeviceType.toString();
                                    if (tempmaterial.Rfid != null) {
                                        tempmaterial.Rfid = tempmaterial.Rfid.toString();
                                        for (var j = 0; j < facility().length; j++) {
                                            if (facility()[j].Rfid() == tempmaterial.Rfid && tempmaterial.Rfid != "" && tempmaterial.Rfid != null) {
                                                utils.toast.show('RFID값이 중복되었습니다(' + (i + 1) + '번 행)', 'error');
                                                return;
                                            }
                                        }
                                    }

                                    if (tempmaterial.Manufacturer != null)
                                        tempmaterial.Manufacturer = tempmaterial.Manufacturer.toString();

                                    if (tempmaterial.ManufactureSerial != null)
                                        tempmaterial.ManufactureSerial = tempmaterial.ManufactureSerial.toString();
                                    if (tempmaterial.ManufactureModel != null)
                                        tempmaterial.ManufactureModel = tempmaterial.ManufactureModel.toString();
                                    if (tempmaterial.Supplier != null)
                                        tempmaterial.Supplier = tempmaterial.Supplier.toString();
                                    if (tempmaterial.SupplierPhoneNo != null)
                                        tempmaterial.SupplierPhoneNo = tempmaterial.SupplierPhoneNo.toString();
                                    if (tempmaterial.FacilityUsage != null)
                                        tempmaterial.FacilityUsage = tempmaterial.FacilityUsage.toString();
                                    if (tempmaterial.RatedPowerConsumption != null)
                                        tempmaterial.RatedPowerConsumption = tempmaterial.RatedPowerConsumption.toString();
                                    if (tempmaterial.Note != null)
                                        tempmaterial.Note = tempmaterial.Note.toString();
                                    if (tempmaterial.FacilityCapacity != null)
                                        tempmaterial.FacilityCapacity = tempmaterial.FacilityCapacity.toString();

                                    if (tempmaterial.InstallDate != null) {
                                        tempmaterial.InstallDate = parse(tempmaterial.InstallDate);
                                    }
                                    if (tempmaterial.OperationStartDate != null) {
                                        tempmaterial.OperationStartDate = parse(tempmaterial.OperationStartDate);
                                    }
                                    if (tempmaterial.ManufactureDate != null) {
                                        tempmaterial.ManufactureDate = parse(tempmaterial.ManufactureDate);
                                    }

                                    if (tempmaterial.RatedCOP != null) {
                                        if (typeof (tempmaterial.RatedCOP) == "string") {
                                            utils.toast.show('정격COP은 숫자만 입력가능합니다(' + (i + 1) + '번 행)', 'error');
                                            return;
                                        }
                                        else {
                                            tempmaterial.RatedCOP = parseFloat(tempmaterial.RatedCOP);
                                        }
                                    }

                                    if (tempmaterial.FacilityCost != null) {
                                        if (typeof (tempmaterial.FacilityCost) == "string") {
                                            utils.toast.show('시설비용은 숫자만 입력가능합니다(' + (i + 1) + '번 행)', 'error');
                                            return;
                                        }
                                        else {
                                            tempmaterial.FacilityCost = parseInt(tempmaterial.FacilityCost);
                                        }
                                    }
                                    if (tempmaterial.FacilityCount != null) {
                                        if (typeof (tempmaterial.FacilityCount) == "string") {
                                            utils.toast.show('시설수량은 숫자만 입력가능합니다(' + (i + 1) + '번 행)', 'error');
                                            return;
                                        }
                                        else {
                                            tempmaterial.FacilityCount = parseInt(tempmaterial.FacilityCount);
                                        }
                                    }
                                    tempEXCELarray.push(tempmaterial);
                                }
                                for (var k = 0; k < tempEXCELarray.length; k++) {
                                    BWA.db.CmFacility.insert(tempEXCELarray[k]).done(function (response, responseKey) {
                                        if (k == tempEXCELarray.length) {
                                            facilityDataSource.load().done(function (result5) {
                                                facility(result5);
                                                utils.toast.show($G('successDatabaseInsertionMsg'));
                                                $('#gridContainer').dxDataGrid('instance').refresh();
                                            });
                                        }
                                    }).fail(function (error) {
                                        utils.toast.show(error);
                                    });
                                }
                            }
                        };

                        //파일객체를 읽는다. 완료되면 원시 이진 데이터가 문자열로 포함됨.
                        reader.readAsArrayBuffer(f);
                    }//end. for	
                }
                $("#FILE_IMPORT").val("");
            }
            $("#FILE_IMPORT").on("change", changeValue);
        });
        inputFileControl.click();
    }

    function parse(str) {
        var y = String(str).substr(0, 4);
        var m = String(str).substr(4, 2);
        var d = String(str).substr(6, 2);
        return new Date(y, m - 1, d);
    }

    function checkFileType(filePath) {

        var fileLen = filePath.length;
        var lastDot = filePath.lastIndexOf('.');
        var fileFormat = filePath.substring(lastDot, fileLen).toLowerCase();

        if (fileFormat == ".xls" || fileFormat == ".xlsx") {
            return true;
        } else { return false; }
    }

    var facilityOptions = BemsWebApplication.Factory.Facility;
    var viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'CmFacility', {

        dataSourceOptions: facilityOptions.getDataSourceForDataGrid(),
        columns: facilityOptions.getColumns([
            { dataField: 'FacilityCode', width: '7%' },
            { dataField: 'FmsFacilityCodeClass/Name', caption: '시설(대)', width: '7%', alignment: 'center', allowFiltering: false },
            { dataField: 'FmsFacilityCodeClass1/Name', caption: '시설(중)', width: '10%', alignment: 'center', allowFiltering: false },
            { dataField: 'FmsFacilityCodeClass2/Name', caption: '시설(소)', width: '10%', alignment: 'center', allowFiltering: false },
            { dataField: 'Name', width: '35%', alignment: 'left' },
            { dataField: 'ManufactureModel', width: '20%', alignment: 'left' },
            { dataField: 'FacilityCapacity', caption: '시설용량', width: '20%', alignment: 'left' },
            { dataField: 'CmFloor/Name', caption: $G('facilityLocation'), width: '10%', alignment: 'center', allowFiltering: false }
        ]),
        "export": {
            enabled: true,
            fileName: '설비 정보 목록',
        },
        onExporting: function (e) {
            e.component.columnOption("FacilityCode", "visible", false);
        },
        onExported: function (e) {
            e.component.columnOption("FacilityCode", "visible", true);
        },

        popupWidth: '760px',
        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(),
        handlePopupButtonEdit: function (dataModel) {
            isEditModeInPopup(true);
        },
        handleCancelInPopup: function () {
            isEditModeInPopup(false);
        },
        handlePopupButtonClose: function () {
            isEditModeInPopup(false);
        },
        handleViewShowing: function () {
            facilityTypeDataSource.filter([
                ['FacilityTypeId', '<', 99]
            ]);
            floorDataSource2.filter([
                    ['SiteId', '=', BWA.UserInfo.SiteId()]
            ]);
            zoneDataSource2.filter([
                    ['SiteId', '=', BWA.UserInfo.SiteId()]
            ]);
            contractTypeDataSource2.filter([
                    ['FuelTypeId', '>=', 1]
            ]);
            // 빌딩 데이터 로드 시점 
            $.when(facilityClassDataSource.load(),
                buildingDataSource.load(),
                facilityTypeDataSource.load(),
                fuelTypeDataSource.load(),
                facilityDataSource.load(),
                UserDataSource.load(),
                floorDataSource2.load(),
                zoneDataSource2.load(),
                contractTypeDataSource2.load()
            ).done(function (result1, result2, result3, result4, result5, UserData, floorData, zoneData, contractData) {

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

                buildings(result2[0]);
                user(UserData[0]);

                floors2(floorData[0]);
                zones2(zoneData[0]);
                contract(contractData[0]);

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

                var fuelTypeItemNull = new BemsWebApplication.BemsFuelTypeViewModel({ FuelTypeId: null, Name: '선택' });
                result4[0].unshift(fuelTypeItemNull);
                fuelTypes(result4[0]);

                facilityTypes(result3[0]);
                facility(result5[0]);
                searchDeferred.resolve();
            });

            facilityClassDataSource2.filter([
                    ['SiteId', '=', BWA.UserInfo.SiteId()]
            ]);

            // 빌딩 데이터 로드 시점 
            $.when(facilityClassDataSource2.load()
            ).done(function (result1) {
                facilityClasses2(result1);
            });
        },

        handleViewShown: function (dataViewModel, isEditModeInPopup) {
            setupDropZone(isEditModeInPopup, dataViewModel);

            $("#gridContainer").dxDataGrid({
                paging: {
                    pageSize: 18
                }
            });
        },

        handlePopupShowing: function (isNewInPopup) {
            imagefileUrl(undefined);
            if (_.isNull(dropZone) === false) dropZone.resetUploadedFileInfo();
            if (isNewInPopup() == false) {
                isEditModeInPopup(false);
            } else {
                dropZone = null;
                isEditModeInPopup(true);
            }
        },

        handlePopupShown: function (isEditMode, isNewInPopup, dataViewModel) {
            if (isNewInPopup === false) {
                isEditModeInPopup(false);
            }
            else {
                dataViewModel.IsVirtualFacility(false);
                isEditModeInPopup(true);
            }
            $.when(
                facilityDataSource.load()
            ).done(function (result5) {
                facility(result5);
            });
            viewModel.searchViewPopup.show();
        },

        handleSaveSuccess: function () {
            if (_.isNull(dropZone) === false) {
                dropZone.resetUploadedFileInfo();
            }
            isEditModeInPopup(false);
        },

        handleAfterDelete: function () {
            facilityDataSource.load().done(function (result5) {
                facility(result5);
            });
        },

        handleAfterInsert: function (db, db2) {
            if (db2.FacilityTypeId != 1) return;
            var dataViewModel = new BemsWebApplication['CmFacilityTempSetViewModel']();
            dataViewModel.SiteId = db.SiteId;
            dataViewModel.FacilityCode = db.FacilityCode;
            var promise = BemsWebApplication.api.post('BemsMonitoringPoint/AddAirTempSet', dataViewModel);
            promise.done(function () {

            });
        },

        handleAfterSaveInPopup: function (responseKey, response) {//2019-11-11 변경
            viewModel.dataModel.FacilityCode(responseKey.FacilityCode);
        },
        handleSaveButtonInPopup: function (isInsert) {//2019-11-11 변경
            if (isInsert === false) {//추가, 변경 여부
                if (_.isNull(dropZone) === false) {
                    if (viewModel.dataModel.FileId() != null) { //변경 - 그림삭제
                        var temp = {
                            SiteId: BWA.UserInfo.SiteId(),
                            FileId: viewModel.dataModel.FileId()
                        }
                        BWA.db.CmFile.byKey(temp).done(function (data) {
                            dropZone.removeFile(data);
                            dropZone.processQueue();
                        });
                    }
                    else {
                        dropZone.processQueue();//변경 - 그림 삭제 필요없음
                    }
                }
            }
            else {
                if (_.isNull(dropZone) === false) { //추가
                    if (viewModel.dataModel.FileId() == null) {
                        dropZone.processQueue();
                    }
                }
            }
        },
        handleBeforeDelete: function (db) {//2019-11-11 변경
            var temp = {
                SiteId: BWA.UserInfo.SiteId(),
                FileId: viewModel.dataModel.FileId()
            }
            BWA.db.CmFile.byKey(temp).done(function (data) {
                if ($('#facilityDropZone1').length) {
                    if (_.isNull(dropZone)) {
                        dropZone = BWA.DropZone.create({
                            id: '#facilityDropZone1',
                            categoryId: $Code.FileCategory.FACILITY
                        });
                        dropZone.removeFile(data);
                        dropZone = null;
                    }
                }
            });

            var dataViewModel = new BemsWebApplication['CmFacilityTempSetViewModel']();
            dataViewModel.SiteId = db.SiteId;
            dataViewModel.FacilityCode = db.FacilityCode;

            var promise = BemsWebApplication.api.post('BemsMonitoringPoint/RemoveAirTempSet', dataViewModel);
            promise.done(function () {

            });
        },

        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);
                    imagefileUrl("images/default.png");
                    //dataViewModel.imagefileUrl("images/default.png");
                }
                selectedFacility(dataViewModel);
            }
        },

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

            dataGrid.clearSelection();
            var data = clickRow.data;
            var dataModel = viewModel.dataModel;

            if (data.ParentFacilityCode() != null) {
                for (var i = 0; i < facility().length; i++) {
                    if (data.ParentFacilityCode() == facility()[i].FacilityCode()) {
                        dataModel.ParentFacilityName(facility()[i].Name());
                        break;
                    }
                }
            } else {
                dataModel.ParentFacilityName("");
            }

            dataModel.ClassName = $KoSet(dataModel.ClassName,
                BWA.Factory.Facility.formatClassName(
                data['FmsFacilityCodeClass/Name'] == undefined ? '' : data['FmsFacilityCodeClass/Name'](),
                data['FmsFacilityCodeClass1/Name'] == undefined ? '' : data['FmsFacilityCodeClass1/Name'](),
                data['FmsFacilityCodeClass2/Name'] == undefined ? '' : data['FmsFacilityCodeClass2/Name']()));

            dataModel.BuildingName = $KoSet(dataModel.BuildingName, data['CmBuilding/Name'] == undefined ? '' : data['CmBuilding/Name']());
            dataModel.FloorName = $KoSet(dataModel.FloorName, data['CmFloor/Name'] == undefined ? '' : data['CmFloor/Name']());
            dataModel.ZoneName = $KoSet(dataModel.ZoneName, data['CmZone/Name'] == undefined ? '' : data['CmZone/Name']());

            dataModel.facilitylocation(dataModel.BuildingName() + " - " + dataModel.FloorName() + " - " + dataModel.ZoneName());

            //2016 04 21
            dataModel.MainContactorUserName = $KoSet(dataModel.MainContactorUserName, data['CmUser/Name'] == undefined ? '' : data['CmUser/Name']());
            dataModel.SubContactorUserName = $KoSet(dataModel.SubContactorUserName, data['CmUser1/Name'] == undefined ? '' : data['CmUser1/Name']());

            // jhLee 2016 04 22
            dataModel.FuelTypeName = $KoSet(dataModel.FuelTypeName, data['BemsFuelType/Name'] == undefined ? '' : data['BemsFuelType/Name']());
            dataModel.ContractTypeName = $KoSet(dataModel.ContractTypeName, data['BemsNoticePriceContractType/Name'] == undefined ? '' : data['BemsNoticePriceContractType/Name']);

            popupVisible(true);
        },
        beforeInsertingDataViewModel: function (dataModel, dbModelId) {
            var dfd = $.Deferred();
            for (var i = 0; i < facility().length; i++) {
                if (facility()[i].Rfid() == dataModel.Rfid() && dataModel.Rfid() != "" && dataModel.Rfid() != null) {
                    return dfd.resolve(false, 'RFID값이 중복되었습니다.');
                }
            }
            return dfd.resolve(true);
        },

        beforeUpdateDataViewModel: function () {
            for (var i = 0; i < facility().length; i++) {
                if (facility()[i].Rfid() == viewModel.dataModel.Rfid() && viewModel.dataModel.Rfid() != "" && viewModel.dataModel.Rfid() != null) {
                    if (facility()[i].FacilityCode() != viewModel.dataModel.FacilityCode()) {
                        utils.toast.show('RFID값이 중복되었습니다.', 'error');
                        return 0;
                    }
                }
            }
            return 2; // 2016 01 19 BaseClass 에서 update한다.
        }

    });

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

    viewModel.handleSelectBoxChangeFirstClass = function (e) {
        if (viewModel.dataModel.FirstClassId() != null) {
            facilityClassDataSource.filter([
                ["SiteId", "=", BWA.UserInfo.SiteId()],
                "and",
                ["Depth", "=", 1],
                "and",
                ["ParentFacilityClassId", "=", viewModel.dataModel.FirstClassId()]
            ]);
        }
        facilityClassDataSource.load().done(function (result) {
            facilityClasses[1](result);
        });

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

    viewModel.handleSelectBoxChangeSecondClass = function (e) {

        if (viewModel.dataModel.FirstClassId() != null) {
            facilityClassDataSource.filter([
                ["SiteId", "=", BWA.UserInfo.SiteId()],
                "and",
                ["Depth", "=", 2],
                "and",
                ["ParentFacilityClassId", "=", viewModel.dataModel.SecondClassId()]
            ]);
        }
        facilityClassDataSource.load().done(function (result) {
            facilityClasses[2](result);
        });
        //BWA.DataUtil.setArrayDataSourceFilter(facilityClassDataSource, 'ParentFacilityClassId', e.value, facilityClasses[2]);
        viewModel.dataModel.ThirdClassId(null);
    };

    viewModel.handleSelectBoxChangeBuilding = function (e) {

        if (viewModel.dataModel.BuildingId() != null) {
            floorDataSource2.filter([
                ['SiteId', '=', BWA.UserInfo.SiteId()],
                "and",
                ['BuildingId', '=', viewModel.dataModel.BuildingId()]
            ]);
        }
        floorDataSource2.load().done(function (result) {
            floors(result);
        });

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

    viewModel.handleSelectBoxChangeFloor = function (e) {

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

    viewModel.handleSelectBoxChangeFuelType = function (e) {

        BWA.DataUtil.setArrayDataSourceFilter(contractTypeDataSource, 'FuelTypeId', e.value, contractTypes).done(function () {
            var contractTypeItemNull = new BemsWebApplication.BemsNoticePriceContractTypeViewModel({ FuelTypeId: e.value, ContractType: null, Name: '선택' });
            contractTypes.unshift(contractTypeItemNull);
        });
        viewModel.dataModel.ContractType(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();
    }

    // JD : 아래를 주석처리 하면 팝업 화면이 깨짐 
    // JD : 일단 tabsVisible = false, currentTabIndex = 0 으로 초기화 되어 있으므로 나둠 
    viewModel.tabsOptions = {
        visible: tabsVisible,
        selectedIndex: currentTabIndex,
        dataSource: [
            { text: '시설정보' },
            { text: '작업이력' },
            { text: '하위시설' },
            { text: '점검항목' },
            { text: '법정항목' },
            { text: '운전일자항목' }
        ]
    };

    viewModel.dataModel.MainContactorUserName = $KoSet(viewModel.dataModel.MainContactorUserName, '');
    viewModel.dataModel.SubContactorUserName = $KoSet(viewModel.dataModel.SubContactorUserName, '');
    viewModel.dataModel.ParentFacilityName = $KoSet(viewModel.dataModel.ParentFacilityName, '');

    viewModel.facilityTypes = facilityTypes;

    viewModel.dataModel.facilitylocation = ko.observable();
    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);
    viewModel.fuelTypes = fuelTypes;
    viewModel.contractTypes = contractTypes;
    viewModel.isEditModeInPopup = isEditModeInPopup;
    viewModel.FacilityDownload = FacilityDownload;
    viewModel.FacilityImport = FacilityImport;

    var multiViewDataSource = [{
        viewModel: viewModel,
        imagefileUrl: imagefileUrl,
        template: 'facility'
    }];

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

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

    return viewModel;
};