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

    var imagefileUrl1 = ko.observable(),
        imagefileUrl2 = ko.observable(),
        uploadedFileInfo = {},
        //hcLee 2016 03 23
        uploadedFileInfo2 = {},
        dropZone1 = null,
        dropZone2 = null;

    var FmsConstructionDataSource = BemsWebApplication.db.createDataSource('FmsConstruction');
    var ConstructionInfo = ko.observableArray();
    var RowName;

    var eq = BWA.DataUtil.constructEqualFilter,
        and = BWA.DataUtil.andFilter,
        noteq = BWA.DataUtil.constructNotEqualFilter;
    var isEditModeInPopup = ko.observable(false);
    // 공사업체 데이터 소스...
    var partnerDataSource = BemsWebApplication.db.createDataSource('CmPartner', true, false, true),
        constructionTypeDataSource = BemsWebApplication.db.createDataSource('FmsConstructionCodeType', true, false, true),
        progressDataSource = BemsWebApplication.db.createDataSource('FmsConstructionCodeProgress');

    var partners = ko.observableArray(),
        constructionTypes = ko.observableArray(),
        dbProgresses = ko.observableArray();

    var constructionTypesForSearch = ko.observableArray(),
        partnerTypesForSearch = ko.observableArray();

    var deferredForSearch = new $.Deferred();

    var dataSourceOptions = {
        select: [
            'SiteId',
            'ConstructionId',
            'ConstructionTypeId',
            'Name',
            'StartDate',
            'EndDate',
            'PartnerId',
            'ConstructLocation',
            'OwnerShipName',
            'CommitmentMan',
            'OwnerShipPhoneNo',
            'WeldWorkStartTime',
            'WeldWorkEndTime',
            'GasWorkStartTime',
            'GasWorkEndTime',
            'PaintWorkStartTime',
            'PaintWorkEndTime',
            'Comment',
            'ProgressId',
            'AddDate',
            'UpdateDate',
            'FmsConstructionCodeProgress/Name',
            'CmPartner/Name',
            'CmPartner/PhoneNo',
            'FmsConstructionCodeType/Name',
            'ConstructionDetail',
            'InOutStockName',
            'FileId1',
            'FileId2',
            'FileId3',
            'CmFile/Name',
            'CmFile1/Name',
            'CmFile2/Name'
        ],
        expand: [
            'FmsConstructionCodeProgress',
            'CmPartner',
            'FmsConstructionEstimation',
            'FmsConstructionCodeType',
            'CmFile',
            'CmFile1',
            'CmFile2'
        ],
        extendOptions: {
            forceOriginalField: true
        },
        filter: [
            eq('SiteId', BWA.UserInfo.SiteId()),
            'and',
            ['ProgressId', '<', 3] // 공사진행단계 항목 까지만 가져옴 
        ]
    };

    function setupDropZone(isEditModeInPopup, dataViewModel) {//2019-11-18 변경

        var timer = null;
        isEditModeInPopup.subscribe(function (value) {
            if (value) {
                if (timer) { clearInterval(timer); }
                timer = setInterval(function () {
                    if ($('#constructionDropZone1').length) {
                        if (_.isNull(dropZone1)) {
                            dropZone1 = BWA.DropZone.create({
                                id: '#constructionDropZone1',

                                categoryId: $Code.FileCategory.CONSTRUCTION,
                                uploadedFileInfo: uploadedFileInfo,
                                handleRemoveBeforePromise: function () {
                                    var keys = BWA.db.extractKeysObject('FmsConstruction', dataViewModel);
                                    return BWA.db.FmsConstruction.update(keys, { FileId1: null });
                                },
                                handleSuccess: function (fileInfo) {
                                    if (uploadedFileInfo.FileId) {
                                        dataViewModel.FileId1(fileInfo.FileId);
                                        var keys = BWA.db.extractKeysObject('FmsConstruction', dataViewModel);
                                        if (keys.ConstructionId != null) {
                                            return BWA.db.FmsConstruction.update(keys, { FileId1: fileInfo.FileId })
                                                .done(function (res) {
                                                    $('#gridContainer').dxDataGrid('instance').refresh();
                                                });
                                        }
                                    }
                                },
                                handleRemovedFile: function () {
                                    dataViewModel.FileId1(null);
                                },
                            });
                        }
                    }

                    if ($('#constructionDropZone2').length) {
                        if (_.isNull(dropZone2)) {
                            dropZone2 = BWA.DropZone.create({
                                id: '#constructionDropZone2',
                                categoryId: $Code.FileCategory.CONSTRUCTION,
                                uploadedFileInfo: uploadedFileInfo2,
                                handleRemoveBeforePromise: function () {
                                    var keys = BWA.db.extractKeysObject('FmsConstruction', dataViewModel);
                                    return BWA.db.FmsConstruction.update(keys, { FileId2: null });
                                },
                                handleSuccess: function (fileInfo) {
                                    if (uploadedFileInfo2.FileId) {
                                        dataViewModel.FileId2(fileInfo.FileId);
                                        var keys = BWA.db.extractKeysObject('FmsConstruction', dataViewModel);
                                        if (keys.ConstructionId != null) {
                                            return BWA.db.FmsConstruction.update(keys, { FileId2: fileInfo.FileId })
                                                .done(function (res) {
                                                    $('#gridContainer').dxDataGrid('instance').refresh();
                                                });
                                        }
                                    }
                                },
                                handleRemovedFile: function () {
                                    dataViewModel.FileId2(null);
                                },
                            });
                        }
                    }
                }, 100);
            }
            else {
                if (timer) {
                    clearInterval(timer);
                    timer = null;
                }
                dropZone1 = null;
                dropZone2 = null;
            }
        });
    }

    var viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'FmsConstruction', {
        dataSourceOptions: dataSourceOptions,
        columns: [
            { dataField: 'Number', caption: $G('number'), width: '10%', alignment: 'center' },
            { dataField: 'FmsConstructionCodeType/Name', caption: '공사구분', width: '20%', alignment: 'center' },
            { dataField: 'Name', caption: '공사명', width: '80%', alignment: 'center' },
            { dataField: 'ConstructLocation', caption: '공사위치', width: '30%', alignment: 'center' },
            { dataField: 'CmPartner/Name', caption: '공사업체', width: '20%', alignment: 'center' },
            { dataField: 'OwnerShipName', caption: '공사책임자', width: '20%', alignment: 'center' },

            {
                dataField: 'StartDate', caption: '시작일', width: '20%', alignment: 'center',
                customizeText: function (cellInfo) { return $G.date(cellInfo.value); }
            },
            {
                dataField: 'EndDate', caption: '종료일', width: '20%', alignment: 'center',
                customizeText: function (cellInfo) { return $G.date(cellInfo.value); }
            },
        ],
        popupWidth: '900px',
        // jks-2015-12-30 팝업넓이조절
        //popupWidth: '740px',
        promiseDataInSearchView: deferredForSearch.promise(),
        searchViewItems: [
            { id: 'Name' },
            { id: 'ConstructionTypeId', ignoreValue: 0, defaultValue: 0, dataSource: constructionTypesForSearch },
            { id: 'PartnerId', ignoreValue: 0, defaultValue: 0, dataSource: partnerTypesForSearch },
            { id: 'StartDate', type: 'dateRange', isOnlyDate: true },
            { id: 'EndDate', type: 'dateRange', isOnlyDate: true }
        ],

        beforeInsertingDataViewModel: function (dataModel, dbModelId) {
            var dfd = $.Deferred();
            if (dataModel.StartDate() > dataModel.EndDate()) {
                return dfd.resolve(false, '시작일은 종료일 이전으로 선택해야 합니다.');
            }
            if (dataModel.WeldWorkStartTime() > dataModel.WeldWorkEndTime()) {
                return dfd.resolve(false, '용접작업시작시간은 용접작업종료시간 이전으로 선택해야 합니다.');
            }
            if (dataModel.GasWorkStartTime() > dataModel.GasWorkEndTime()) {
                return dfd.resolve(false, '가스공사시작시간은 가스공사종료시간 이전으로 선택해야 합니다.');
            }
            if (dataModel.PaintWorkStartTime() > dataModel.PaintWorkEndTime()) {
                return dfd.resolve(false, '도장작업시작시간은 도장작업종료시간 이전으로 선택해야 합니다.');
            } else {
                var isDuplicated = false;
                for (var i = 0; i < ConstructionInfo().length; i++) {
                    if (dataModel.Name() == ConstructionInfo()[i].Name()) {
                        isDuplicated = true;
                    }
                }
                
                if (isDuplicated)
                    return dfd.resolve(false, '이미 동일 이름이 존재합니다.');
                else
                    return dfd.resolve(true);
            }            
        },

        beforeUpdateDataViewModel: function () {
            var dataModel = viewModel.dataModel;
            if (dataModel.StartDate() > dataModel.EndDate()) {
                utils.toast.show('시작일은 종료일 이전으로 선택해야 합니다.', 'error');
                return 0;
            }
            if (dataModel.WeldWorkStartTime() > dataModel.WeldWorkEndTime()) {
                utils.toast.show('용접작업시작시간은 용접작업종료시간 이전으로 선택해야 합니다.', 'error');
                return 0;
            }
            if (dataModel.GasWorkStartTime() > dataModel.GasWorkEndTime()) {
                utils.toast.show('가스공사시작시간은 가스공사종료시간 이전으로 선택해야 합니다.', 'error');
                return 0;
            }
            if (dataModel.PaintWorkStartTime() > dataModel.PaintWorkEndTime()) {
                utils.toast.show('도장작업시작시간은 도장작업종료시간 이전으로 선택해야 합니다.', 'error');
                return 0;
            } else {
                if (dataModel.WeldWorkStartTime() != null) {
                    dataModel.WeldWorkStartTime().setSeconds(0);
                }
                if (dataModel.WeldWorkEndTime() != null) {
                    dataModel.WeldWorkEndTime().setSeconds(0);
                }
                if (dataModel.GasWorkStartTime() != null) {
                    dataModel.GasWorkStartTime().setSeconds(0);
                }
                if (dataModel.GasWorkEndTime() != null) {
                    dataModel.GasWorkEndTime().setSeconds(0);
                }
                if (dataModel.PaintWorkStartTime() != null) {
                    dataModel.PaintWorkStartTime().setSeconds(0);
                }
                if (dataModel.PaintWorkEndTime() != null) {
                    dataModel.PaintWorkEndTime().setSeconds(0);
                }
            }

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

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

            var temp2 = {
                SiteId: BWA.UserInfo.SiteId(),
                FileId: viewModel.dataModel.FileId2()
            }
            if (temp2.FileId != null) {
                BWA.db.CmFile.byKey(temp2).done(function (data) {
                    if ($('#constructionDropZone4').length) {
                        if (_.isNull(dropZone2)) {
                            dropZone2 = BWA.DropZone.create({
                                id: '#constructionDropZone4',
                                categoryId: $Code.FileCategory.CONSTRUCTION
                            });
                            dropZone2.removeFile(data);
                            dropZone2 = null;
                        }
                    }
                });
            }
        },
        handleAfterLoadingModelByKey: function (data, dataViewModel, isNewInPopup) {

            if (isNewInPopup() == false) {

                if (_.isNull(dataViewModel.FileId1()) === false) {
                    imagefileUrl1('{0}/CmFile(SiteId={1},FileId={2})/$value'.formati(BWA.db._url, dataViewModel.SiteId(), dataViewModel.FileId1()));
                }
                else {
                    imagefileUrl1(undefined);
                }

                if (_.isNull(dataViewModel.FileId2()) === false) {
                    imagefileUrl2('{0}/CmFile(SiteId={1},FileId={2})/$value'.formati(BWA.db._url, dataViewModel.SiteId(), dataViewModel.FileId2()));
                }
                else {
                    imagefileUrl2(undefined);
                }
                //var keys = BWA.db.extractKeysObject('FmsConstruction', dataViewModel);
                //BWA.db.FmsConstruction.update(keys, dataViewModel.toJS());
            }
        },
        
        handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {

            dataGrid.clearSelection();

            var data = clickRow.data;
            var dataModel = viewModel.dataModel;
            
            RowName = data.Name;
            //dataModel.PartnerName = data['CmPartner/Name']();
            //dataModel.PartnerPhoneNo = data['CmPartner/PhoneNo']();

            dataModel.PartnerName = $KoSet(dataModel.PartnerName, data['CmPartner/Name']());
            //dataModel.PartnerPhoneNo = $KoSet(dataModel.PartnerPhoneNo, data['CmPartner/PhoneNo']());
            dataModel.ConstructionTypeName = $KoSet(dataModel.ConstructionTypeName, data['FmsConstructionCodeType/Name']());

            dataModel.ProgressName = $KoSet(dataModel.ProgressName, data['FmsConstructionCodeProgress/Name']());

            if (data['FileId1']() != null)
                dataModel.AttachmentFileName1(data['CmFile/Name']());
            else dataModel.AttachmentFileName1('');

            if (data['FileId2']() != null)
                dataModel.AttachmentFileName2(data['CmFile1/Name']());
            else dataModel.AttachmentFileName2('');

            popupVisible(true);
        },
        // hcLee 2016 02 01
        handlePopupButtonEdit: function (dataModel) {
            isEditModeInPopup(true);
        },

        handleViewShowing: function (dataModel) {
            partnerDataSource.filter([
                eq('SiteId', BWA.UserInfo.SiteId()), // 공사업체 유형 필터링
                'and',
                eq('PartnerTypeId', 1)]);
            constructionTypeDataSource.filter([
                eq('SiteId', BWA.UserInfo.SiteId()) // 공사업체 유형 필터링
            ]);
            progressDataSource.filter([
                eq('ProgressId', 2),
                'or',
                eq('ProgressId', 3),
            ]);

            $.when(
                partnerDataSource.load(),
                constructionTypeDataSource.load(),
                progressDataSource.load()
            )
            .done(function (dbPartners, dbConstructions, dbProgress) {
                partners(dbPartners[0]);
                constructionTypes(dbConstructions[0]);
                dbProgresses(dbProgress[0]);

                constructionTypesForSearch($SearchView.createArrayOfSelectBox('ConstructionTypeId', constructionTypes()));
                partnerTypesForSearch($SearchView.createArrayOfSelectBox('PartnerId', partners()));

                deferredForSearch.resolve();
            });
        },

        handleViewShown: function (dataViewModel, isEditModeInPopup) {
            setupDropZone(isEditModeInPopup, dataViewModel);
        },
        handleCancelInPopup: function () {
            isEditModeInPopup(false);
        },
        handlePopupButtonClose: function () {
            isEditModeInPopup(false);
        },
        handleSaveSuccess: function () {

            if (_.isNull(dropZone1) === false) {
                dropZone1.resetUploadedFileInfo();
            }

            if (_.isNull(dropZone2) === false) {
                dropZone2.resetUploadedFileInfo();
            }
            isEditModeInPopup(false);
        },

        // hcLee 2016 03 23
        handlePopupShowing: function (isEditMode, isNew, dataViewModel) {
            imagefileUrl1(undefined);
            imagefileUrl2(undefined);

            if (_.isNull(dropZone1) === false) dropZone1.resetUploadedFileInfo();
            if (_.isNull(dropZone2) === false) dropZone2.resetUploadedFileInfo();

            if (isNew) { // 신규등록인 경우          
                dropZone1 = null;
                dropZone2 = null;
            }
            
            // 이름 중복 방지
            FmsConstructionDataSource.filter([
                ['SiteId', '=', BWA.UserInfo.SiteId()],
                'and',
               [ 'ProgressId', '<', 3]
            ]);
            FmsConstructionDataSource.load().done(function (result) {
                ConstructionInfo(result);
            });
        },

        handlePopupShown: function (isEditMode, isNew, dataViewModel) {
            //handlePopupShowing: function (isEditMode, isNew, dataViewModel) {
            var partners = viewModel.partners();
            var constructionTypes = viewModel.constructionTypes();
            /*
            imagefileUrl1(undefined);
            imagefileUrl2(undefined);
            if (_.isNull(dropZone1) === false) dropZone1.resetUploadedFileInfo();
            if (_.isNull(dropZone2) === false) dropZone2.resetUploadedFileInfo();
            */
            isEditModeInPopup(false);
            if (isNew) { // 신규등록인 경우 
                isEditModeInPopup(true);
                dataViewModel.ProgressId(2); // 공사계획 상태를 '진행' 단계로 초기화
                dataViewModel.AddDate($G.date(new Date()));
                dataViewModel.UpdateDate($G.date(new Date()));

                if (!_.isEmpty(partners)) {
                    dataViewModel.PartnerId(partners[0].PartnerId());
                }

                if (!_.isEmpty(constructionTypes)) {
                    dataViewModel.ConstructionTypeId(constructionTypes[0].ConstructionTypeId());
                }
            }
        }
    });

    viewModel.imagefileUrl1 = imagefileUrl1;
    viewModel.imagefileUrl2 = imagefileUrl2;
    viewModel.isEditModeInPopup = isEditModeInPopup;
    viewModel.constructionTypes = constructionTypes;
    viewModel.partners = partners;
    viewModel.dbProgresses = dbProgresses;

    viewModel.dataModel.ConstructionTypeName = ko.observable();
    viewModel.dataModel.PartnerName = ko.observable();
    //viewModel.dataModel.PartnerPhoneNo = ko.observable();
    viewModel.dataModel.ProgressName = ko.observable();
    viewModel.dataModel.AttachmentFileName1 = ko.observable();
    viewModel.dataModel.AttachmentFileName2 = ko.observable();
    viewModel.dataModel.AttachmentFileName3 = ko.observable();

    viewModel.dataModel.ProgressId.subscribe(function () {
        if (viewModel.dataModel.ProgressId() == 3) {
            viewModel.dataModel.EndDate(new Date());
        }
    });

    return viewModel;
};