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

    var imagefileUrl = ko.observable(), uploadedFileInfo = {}, dropZone = null;

    var eq = BWA.DataUtil.constructEqualFilter, and = BWA.DataUtil.andFilter, noteq = BWA.DataUtil.constructNotEqualFilter;

    //권한설정
    var hasnotModificationPermission = ko.observable(true);

    // 공사업체 데이터 소스...
    var partnerDataSource = BemsWebApplication.db.createDataSource('CmPartner', true, false, true),
        constructionTypeDataSource = BemsWebApplication.db.createDataSource('FmsConstructionCodeType', true, false, true);

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

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

    var constructionEstimateDataModel = new BemsWebApplication.FmsConstructionEstimationViewModel();

    var deferredForSearch = new $.Deferred();

    var constructionEstimatePopupToolbarItems = [
            { location: 'before', text: '상세보기' },
            { location: 'after', widget: 'button', options: { text: $G('save'), icon: 'save', clickAction: handlePopupButtonSave, disabled: hasnotModificationPermission } },
            { location: 'after', widget: 'button', options: { text: $G('close'), icon: 'close', clickAction: constructionEstimatePopupButtonClose } }
    ];

    var dataSourceOptions = {
        select: [
            'SiteId',
            'ConstructionId',
            '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'
        ],
        expand: [
            'FmsConstructionCodeProgress',
            'CmPartner',
            'FmsConstructionEstimation',
            'FmsConstructionCodeType'
        ],

        extendOptions: {
            forceOriginalField: true
        },
        filter: [
            eq('SiteId', BWA.UserInfo.SiteId()),
            'and',
            eq('ProgressId', 3), // 공사완료 항목만 가져옴 
        ]
    };

    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', sortOrder: 'desc', format: "yyyy-MM-dd" },
            { dataField: 'EndDate', caption: '종료일', width: '20%', alignment: 'center', format: "yyyy-MM-dd" },
        ],
        popupWidth: '740px',
        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 }
        ],

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

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

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

            // 데이터 초기화 
            constructionEstimateDataModel.SiteId(data['SiteId']());
            constructionEstimateDataModel.ConstructionId(data['ConstructionId']());
            constructionEstimateDataModel.EstimateDate(new Date());
            constructionEstimateDataModel.EstimateUserId(BWA.UserInfo.UserId());
            constructionEstimateDataModel.Safety01_CleanUp(0);
            constructionEstimateDataModel.Safety02_PersonalProtection(0);
            constructionEstimateDataModel.Safety03_FireExtinguisher(0);
            constructionEstimateDataModel.Safety04_HighPlaceWork(0);
            constructionEstimateDataModel.Safety05_Weld(0);
            constructionEstimateDataModel.Safety06_SurroundingCleanUp(0);
            constructionEstimateDataModel.Safety07_SurroundingHealthy(0);
            constructionEstimateDataModel.Safety08_Noise(0);
            constructionEstimateDataModel.Safety09_FacilityProtection(0);
            constructionEstimateDataModel.Safety10_Waste(0);
            constructionEstimateDataModel.Safety11_Execution(0);
            constructionEstimateDataModel.Safety12_Announcement(0);
            constructionEstimateDataModel.Ability01_Compliance(0);
            constructionEstimateDataModel.Ability02_Fault(0);
            constructionEstimateDataModel.Ability03_SkillLevel(0);
            constructionEstimateDataModel.Ability04_ProcessManagement(0);
            constructionEstimateDataModel.Ability05_Collaboration(0);
            constructionEstimateDataModel.Service01_Compliance(0);
            constructionEstimateDataModel.Service02_SkillLevel(0);
            constructionEstimateDataModel.Comment('');
            constructionEstimateDataModel.SafetyScore(0);
            constructionEstimateDataModel.AbilityScore(0);
            constructionEstimateDataModel.ServiceScore(0);

            popupVisible(true);
        },
        handleViewShowing: function (dataModel) {
            //권한설정
            hasnotModificationPermission(!BWA.UserInfo.hasPermissionOfModification(viewInfo.viewName));

            partnerDataSource.filter([
                eq('PartnerTypeId', 1), // 공사업체 유형 필터링
                and,
                eq('SiteId', BWA.UserInfo.SiteId())
            ])
            $.when(
                partnerDataSource.load(),
                constructionTypeDataSource.load()
            )
            .done(function (dbPartners, dbConstructions) {
                partners(dbPartners[0]);
                constructionTypes(dbConstructions[0]);
                constructionTypesForSearch($SearchView.createArrayOfSelectBox('ConstructionTypeId', constructionTypes()));
                partnerTypesForSearch($SearchView.createArrayOfSelectBox('PartnerId', partners()));

                deferredForSearch.resolve();
            });
        },

        handlePopupShown: function (isEditMode, isNew, dataViewModel) {

            // 공사완료 상태인 경우 EditMode 로 팝업을 띄워야 함
            if (dataViewModel.ProgressId() == 3) {
                setEditMode();
            }
        }
    });

    function setEditMode() {
        viewModel.visibleEditButton(false);
        viewModel.visibleDeleteButton(false);
        viewModel.viewModeInPopup(false);
        viewModel.isEditModeInPopup(true);
    }

    // Subscribe 이벤트의 실제 구현 
    function estimateValueChanged() {
        constructionEstimateDataModel.SafetyScore(caculateSafetyScore());
        constructionEstimateDataModel.AbilityScore(caculateAbilityScore());
        constructionEstimateDataModel.ServiceScore(caculateServiceScore());
    }

    // 안전수칙준수 총점 계산
    function caculateSafetyScore() {
        var saftyScore = 0;
        var trueCount = 0;

        trueCount += checkTrue(constructionEstimateDataModel.Safety01_CleanUp());
        trueCount += checkTrue(constructionEstimateDataModel.Safety02_PersonalProtection());
        trueCount += checkTrue(constructionEstimateDataModel.Safety03_FireExtinguisher());
        trueCount += checkTrue(constructionEstimateDataModel.Safety04_HighPlaceWork());
        trueCount += checkTrue(constructionEstimateDataModel.Safety05_Weld());
        trueCount += checkTrue(constructionEstimateDataModel.Safety06_SurroundingCleanUp());
        trueCount += checkTrue(constructionEstimateDataModel.Safety07_SurroundingHealthy());
        trueCount += checkTrue(constructionEstimateDataModel.Safety08_Noise());
        trueCount += checkTrue(constructionEstimateDataModel.Safety09_FacilityProtection());
        trueCount += checkTrue(constructionEstimateDataModel.Safety10_Waste());
        trueCount += checkTrue(constructionEstimateDataModel.Safety11_Execution());
        trueCount += checkTrue(constructionEstimateDataModel.Safety12_Announcement());
        saftyScore = ((trueCount / 12) * 50).toFixed(1);

        return saftyScore;
    }

    // 공사수행능력 총점 계산
    function caculateAbilityScore() {
        var abilityScore = 0;
        var trueCount = 0;

        trueCount += checkTrue(constructionEstimateDataModel.Ability01_Compliance());
        trueCount += checkTrue(constructionEstimateDataModel.Ability02_Fault());
        trueCount += checkTrue(constructionEstimateDataModel.Ability03_SkillLevel());
        trueCount += checkTrue(constructionEstimateDataModel.Ability04_ProcessManagement());
        trueCount += checkTrue(constructionEstimateDataModel.Ability05_Collaboration());
        abilityScore = (trueCount / 5) * 40;

        return abilityScore;
    }

    // 용역수행능력 총점 계산
    function caculateServiceScore() {
        var serviceScore = 0;
        var trueCount = 0;
        trueCount += checkTrue(constructionEstimateDataModel.Service01_Compliance());
        trueCount += checkTrue(constructionEstimateDataModel.Service02_SkillLevel());
        serviceScore = (trueCount / 2) * 10;
        return serviceScore;
    }

    function checkTrue(value) {
        if (value == true) { return 1; }
        else { return 0; }
    }

    function constructionEstimatePopupButtonClose() {
        viewModel.popupVisible(false);
    }

    function handlePopupButtonSave() {

        var postData = constructionEstimateDataModel.toJS();
        var parameters = {
            SiteId: constructionEstimateDataModel.SiteId(),
            ConstructionId: constructionEstimateDataModel.ConstructionId()
        };

        BWA.api.post('FmsConstructionEstimation', postData, parameters).done(function () {
            utils.toast.show($G('successDatabaseInsertionMsg'));
            viewModel.popupOptions.visible(false);
            viewModel.gridView().refresh();
        });
    }

    constructionEstimateDataModel.Safety01_CleanUp.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Safety02_PersonalProtection.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Safety03_FireExtinguisher.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Safety04_HighPlaceWork.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Safety05_Weld.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Safety06_SurroundingCleanUp.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Safety07_SurroundingHealthy.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Safety08_Noise.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Safety09_FacilityProtection.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Safety10_Waste.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Safety11_Execution.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Safety12_Announcement.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Ability01_Compliance.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Ability02_Fault.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Ability03_SkillLevel.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Ability04_ProcessManagement.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Ability05_Collaboration.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Service01_Compliance.subscribe(function () { estimateValueChanged(); });
    constructionEstimateDataModel.Service02_SkillLevel.subscribe(function () { estimateValueChanged(); });

    viewModel.constructionTypes = constructionTypes;
    viewModel.partners = partners;
    viewModel.constructionEstimateDataModel = constructionEstimateDataModel;
    viewModel.dataModel.ConstructionTypeName = ko.observable();
    viewModel.dataModel.PartnerName = ko.observable();
    viewModel.dataModel.PartnerPhoneNo = ko.observable();
    viewModel.constructionEstimatePopupToolbarItems = constructionEstimatePopupToolbarItems;

    return viewModel;
};