BemsWebApplication.Manual = function (params, viewInfo) {
    "use strict";
    //2019-11-25 변경
    var dropZone = null;
    var eq = BWA.DataUtil.constructEqualFilter;
    var and = BWA.DataUtil.andFilter;
    var drawingHistory;
    var historyViewModel = new BemsWebApplication.FmsManualHistoryViewModel();

    var endpointSelector = "";
    if (BemsWebApplication.config.mode == "production") {
        endpointSelector = new DevExpress.EndpointSelector(BemsWebApplication.config.endpoints).config.db.production;
    } else {
        endpointSelector = new DevExpress.EndpointSelector(BemsWebApplication.config.endpoints).config.db.local;
    }

    var ManualInfo = ko.observableArray();
    var FmsManualDataSource = BemsWebApplication.db.createDataSource('FmsManual');
    var RowName, RowTypeId;
    //2019-11-25 변경

    //drawingGroupDataSource = BemsWebApplication.db.createDataSource('FmsDrawingCodeGroup', true),
    var drawingTypeDataSource = BemsWebApplication.db.createDataSource('FmsManualType', true),

        drawingHistoryDataSource = BemsWebApplication.DataUtil.createDataSource({
            dataSourceOptions: {
                select: [
                    'SiteId', 'ManualId', 'HistoryId', 'FileId', 'Description', 'RevisionNo',
                    'UpdatedDate', 'UpdatedUserId',
                    'CmFile/Name', 'CmFile/FileSize', 'CmUser/Name'
                ],
                expand: ['CmFile', 'CmUser'],
                extendOptions: {
                    forceOriginalField: true
                }
            }
        }, 'FmsManualHistory');

    var drawingHistories = ko.observableArray(),
        //drawingGroups = ko.observableArray(),
        drawingTypes = ko.observableArray(),

        //drawingGroupsForSearch = ko.observableArray(),
        drawingTypesForSearch = ko.observableArray(),

        tabsVisible = ko.observable(false),

        textAreaNoteHeightInPopup = ko.observable(),

        isVisibleHistoryInsertButton = ko.observable(false),
        uploadedFileInfo = {},
        drawingHistoryPopup,

        deferredForSearch = new $.Deferred();

    params.popupPosition = { offset: '-200 0' };
    var viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'FmsManual', {

        popupWidth: 720,
        dataSourceOptions: {
            select: [
                'SiteId', 'ManualId', 'ManualNo', 'Name', 'ManualTypeId',
                'FmsManualType/Name', 'Description'
            ],
            expand: ['FmsManualType'],
            extendOptions: {
                forceOriginalField: true
            }
        },
        columns: [
            { dataField: 'ManualId', caption: '번호', width: '10%', alignment: 'center', sortOrder: 'desc' },
            { dataField: 'FmsManualType/Name', caption: '매뉴얼 유형', width: '15%', alignment: 'center' },
            { dataField: 'ManualNo', caption: '매뉴얼 번호', width: '25%', alignment: 'center' },
            { dataField: 'Name', caption: '매뉴얼 명', width: '35%', alignment: 'center' }
        ],
        searchViewItems: [
            { id: 'ManualTypeId', ignoreValue: 0, defaultValue: 0, dataSource: drawingTypesForSearch },
            { id: 'Name' }
        ],

        getAddedToolbarItemsInPopup: function (e) {
            var isEditModeInPopup = e.isEditModeInPopup,
                hasnotModificationPermission = e.hasnotModificationPermission;
            isEditModeInPopup.subscribe(function (isEditMode) {
                tabIndex(0); // 왼쪽 수정은 무조건 매뉴얼 hcLee 2016 03 24추가
                //isVisibleHistoryInsertButton(tabIndex() === 1 && isEditMode);
            });
            return [
                {
                    location: 'after',
                    widget: 'button',
                    options: {
                        text: '매뉴얼이력추가',
                        icon: 'plus',
                        visible: isVisibleHistoryInsertButton,
                        disabled: hasnotModificationPermission,
                        clickAction: function () {
                            drawingHistoryPopup.handleInsertDrawingHistory();
                        }
                    }
                },
            ]
        },

        promiseDataInSearchView: deferredForSearch.promise(),
        handlePopupShowing: function (isNewInPopup) {

            FmsManualDataSource.filter([
                ["SiteId", "=", BWA.UserInfo.SiteId()]
            ]);
            FmsManualDataSource.load().done(function (result) {
                ManualInfo(result);
            });

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

        // hcLee 2016 03 28
        beforeInsertingDataViewModel: function (dataModel, dbModelId) {
            var dfd = $.Deferred();
            if (BWA.DataUtil.isValidInputValue(dataModel.ManualTypeId()) == false ||
                BWA.DataUtil.isValidInputValue(dataModel.ManualNo()) == false ||
                BWA.DataUtil.isValidInputValue(dataModel.Name()) == false ||
                manualFileUpload.dropzone.files.length == 0)//2019-11-25 변경
                dfd.resolve(false, '(*) 표시 항목은 필수 입력 사항 입니다.');


            var isDuplicated = false;
            for (var i = 0; i < ManualInfo().length; i++) {
                if (dataModel.Name() == ManualInfo()[i].Name() && dataModel.ManualTypeId() == ManualInfo()[i].ManualTypeId()) {
                    isDuplicated = true;
                }
            }
            if (!BWA.DataUtil.isValidInputValue(dataModel.Name()))
                return dfd.resolve(false, '저장 혹은 수정 반드시 필수 입력 정보를 모두 입력하셔야 합니다 (앞뒤공백 허용안함)');

            else {
                if (isDuplicated)
                    return dfd.resolve(false, '이미 동일 정보가 존재합니다 (매뉴얼분류, 매뉴얼명 확인 필요)');
                else
                    return dfd.resolve(true);
            }
        },
        beforeUpdateDataViewModel: function () {
            var dataModel = viewModel.dataModel;
            if (BWA.DataUtil.isValidInputValue(dataModel.ManualTypeId()) == false ||
                BWA.DataUtil.isValidInputValue(dataModel.ManualNo()) == false ||
                BWA.DataUtil.isValidInputValue(dataModel.Name()) == false) {
                utils.toast.show('(*) 표시 항목은 필수 입력 사항 입니다!', 'error');
                return 0;
            }

            var isDuplicated = false;
            for (var i = 0; i < ManualInfo().length; i++) {
                if (viewModel.dataModel.Name() == ManualInfo()[i].Name() && viewModel.dataModel.ManualTypeId() == ManualInfo()[i].ManualTypeId()
                    && (RowName() != ManualInfo()[i].Name() || RowManualTypeId() != ManualInfo()[i].ManualTypeId())) {
                    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) {

            var fileId = uploadedFileInfo.FileId;
            if (_.isUndefined(fileId)) return;
            var dataViewModel = viewModel.dataModel;//2019-11-25 변경
            drawingHistory = new BWA.FmsManualHistoryViewModel();

            drawingHistory.SiteId(responseKey.SiteId);
            drawingHistory.ManualId(responseKey.ManualId);
            drawingHistory.FileId(fileId);
            drawingHistory.RevisionNo(0); // 2016 03 28 hcLee 추가
            drawingHistory.UpdatedDate(new Date());
            drawingHistory.UpdatedUserId(BWA.UserInfo.UserId());
            
            //2019-11-25 변경
            if (viewModel.isNewInPopup() === false) {//추가, 변경 여부
                if (_.isNull(dropZone) === false) {
                    if (drawingHistory.FileId() != null) { //변경 - 그림삭제
                        var temp = {
                            SiteId: BWA.UserInfo.SiteId(),
                            FileId: drawingHistory.FileId()
                        }
                        BWA.db.CmFile.byKey(temp).done(function (data) {
                            dropZone.removeFile(data);
                            dropZone.processQueue();
                        });
                    }
                    else {
                        dropZone.processQueue();//변경 - 그림 삭제 필요없음
                    }
                }
            }
            else {
                if (_.isNull(dropZone) === false) { //추가
                    if (drawingHistory.FileId() == null) {
                        dropZone.processQueue();
                    }
                }
            }

            BWA.db.FmsManualHistory.insert(drawingHistory.toJS()).done(function () {

                //                utils.toast.show('데이터베이스 항목 등록 작업이 성공하였습니다.');
            });
        },

        //2019-11-25 변경
        handleBeforeDelete: function () {
            for (var i = 0; i < drawingHistories().length; i++) {
                var temp1 = {
                    SiteId: BWA.UserInfo.SiteId(),
                    FileId: drawingHistories()[i].FileId()
                }
                if (temp1.FileId != null) {
                    BWA.db.CmFile.byKey(temp1).done(function (data) {
                        if (_.isNull(dropZone)) {
                            dropZone = BWA.DropZone.create({
                                id: '#manualFileUpload1',
                                categoryId: $Code.FileCategory.MANUAL
                            });
                        }
                        dropZone.removeFile(data);
                    });
                }
                var store = new DevExpress.data.ODataStore({
                    url: endpointSelector + "/FmsManualHistory",
                    key: ["SiteId", "ManualId", "HistoryId"],
                    keyType: {
                        SiteId: "Int32",
                        ManualId: "Int32",
                        HistoryId: "Int32"
                    }
                });
                var removeData = {
                    SiteId: BWA.UserInfo.SiteId(), ManualId: drawingHistories()[i].ManualId(), HistoryId: drawingHistories()[i].HistoryId(),
                    RevisionNo: drawingHistories()[i].RevisionNo(), FileId: drawingHistories()[i].FileId(),
                    Description: drawingHistories()[i].Description(), UpdatedDate: drawingHistories()[i].UpdatedDate(), UpdatedUserId: drawingHistories()[i].UpdatedUserId
                };
                store.remove(removeData).done(function (values, key) {
                    utils.toast.show("삭제 되었습니다.");
                })
                .fail(function (error) {
                    utils.toast.show(error);
                });

                if (i == drawingHistories().length) {
                    dropZone = null;
                }
            }
        },

        //handleInitializedInPopup: function() {
        handlePopupShown: function (isEditModeInPopup, isNewInPopup, dataViewModel) {
            if (isNewInPopup) {
                uploadedFileInfo.FileId = null;
                textAreaNoteHeightInPopup(170);
                dropZone = BWA.DropZone.create({
                    categoryId: $Code.FileCategory.MANUAL,
                    id: '#manualFileUpload',
                    uploadedFileInfo: uploadedFileInfo,
                    maxFiles: 1,

                    handleSuccess: function (fileInfo) {
                        if (uploadedFileInfo.FileId) {
                            historyViewModel.FileId(fileInfo.FileId);
                            drawingHistoryDataSource.filter([
                                eq('SiteId', BWA.UserInfo.SiteId()),
                                and,
                                eq('ManualId', drawingHistory.ManualId())
                            ]);
                            drawingHistoryDataSource.load().done(function (histories) {
                                drawingHistories(histories);
                                if (drawingHistories()[0].HistoryId() != null) {
                                    return BWA.db.FmsManualHistory.update({ SiteId: drawingHistories()[0].SiteId(), HistoryId: drawingHistories()[0].HistoryId(), ManualId: drawingHistories()[0].ManualId() }, { FileId: fileInfo.FileId })
                                        .done(function (res) {
                                            $('#gridContainer').dxDataGrid('instance').refresh();
                                        });
                                }
                            });
                        }
                    },
                    handleRemovedFile: function () {
                        historyViewModel.FileId(null);
                    }
                });
            }
            else {
                textAreaNoteHeightInPopup(340);
                reloadDrawingHistory(dataViewModel.ManualId());
            }
        },

        handleViewShowing: function (that) {
            $.when(
                //drawingGroupDataSource.load(),
                drawingTypeDataSource.load())
            //.done(function(dbGroups, dbTypes) {
            .done(function (dbTypes) {
                //drawingGroups(dbGroups[0]);
                //drawingTypes(dbTypes[0]);
                drawingTypes(dbTypes);
                //drawingGroupsForSearch($SearchView.createDefaultArray('DrawingGroupId').concat(dbGroups[0]));
                drawingTypesForSearch($SearchView.createDefaultArray('ManualTypeId').concat(dbTypes));
                deferredForSearch.resolve();
            });
        },

        //2016 03 24 hcLee 추가
        handleCancelInPopup: function () {
            //tabIndex(1);
            tabIndex(0);
            tabIndex(0);
        },

        handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
            dataGrid.clearSelection();
            var data = clickRow.data;
            var dataModel = viewModel.dataModel;
            // dataModel.DrawingGroupName = $KoSet(dataModel.DrawingGroupName, data['FmsDrawingCodeGroup/Name']);
            dataModel.ManualTypeName = $KoSet(dataModel.ManualTypeName, data['FmsManualType/Name']);

            var data = clickRow.data;
            RowName = data.Name;
            RowTypeId = data.ManualTypeId;

            popupVisible(true);
        },

        handleViewShown: function () {
        }
    });

    function reloadDrawingHistory(drawingId) {
        drawingHistoryDataSource.filter([
            eq('SiteId', BWA.UserInfo.SiteId()),
            and,
            eq('ManualId', drawingId)
        ]);

        drawingHistoryDataSource.load().done(function (histories) {
            drawingHistories(histories);
        });
    }

    drawingHistoryPopup = BWA.Popup.ManualHistory.create(viewModel, params, drawingHistories, reloadDrawingHistory);
    //viewModel.drawingGroups = drawingGroups;
    viewModel.drawingTypes = drawingTypes;
    //viewModel.drawingGroupsForSearch = drawingGroupsForSearch;
    viewModel.drawingTypesForSearch = drawingTypesForSearch;

    var tabIndex = ko.observable(0);
    viewModel.tabsOptions = {
        visible: tabsVisible,
        selectedIndex: tabIndex,
        dataSource: [
            { text: '매뉴얼정보' },
            { text: '매뉴얼이력' }
        ]
    };

    tabIndex.subscribe(function (index) {
        // 왼쪽 수정은 무조건 매뉴얼 hcLee 2016 03 24추가
        //if (viewModel.isEditModeInPopup()) return;
        if (viewModel.isEditModeInPopup() == false) {
            isVisibleHistoryInsertButton(index === 1);
            viewModel.visibleEditButton(index === 0);
            viewModel.visibleDeleteButton(index === 0);
        }

        if (index == 0) drawingHistoryPopup.hide();
        //if (index == 0 &&  tabIndex() == 0) return;
        // hcLee 2016 03 24
        if (viewModel.isEditModeInPopup()) {
            tabIndex(0);
            return;
        }
    });

    viewModel.multiViewOptions = {

        dataSource: [
            {
                template: 'drawing',
                viewModel: viewModel,
                dataModel: viewModel.dataModel,
            },
            {
                template: 'drawingHistory',
                viewModel: viewModel,
                dataGridOptions: {
                    dataSource: drawingHistories,
                    columns: [
                        { dataField: 'RevisionNo', caption: $G('revisionNo'), width: '13%' },
                        { dataField: 'UpdatedDate', caption: $G('updatedDate'), width: '30%', dataType: 'date', format: 'yyyy-MM-dd HH:mm:ss' },
                        { dataField: 'CmUser/Name', caption: $G('modifier'), width: '22%' },
                        {
                            dataField: 'CmFile/Name', caption: $G('fileName'), alignment: 'center', width: '45%',
                            cellTemplate: function (cellElement, cellInfo) {

                                var data = cellInfo.data;
                                var url = [
                                    BWA.db._url,
                                    '/CmFile(SiteId={0},FileId={1})/$value'.formati(data.SiteId(), data.FileId())
                                ].join('');

                                $('<a>')
                                    .prop('href', url)
                                    .prop('download', cellInfo.value)
                                    .attr('style', 'color: {0} !important; text-decoration: underline;'.formati('purple'))
                                    //.style('color', '#333 !important')
                                    .attr('target', '_blank')
                                    .text(cellInfo.value)
                                    .appendTo(cellElement);
                            }
                        }
                    ],
                    paging: {
                        pageSize: 10,
                        enabled: true
                    },
                    pager: { visible: true },

                    hoverStateEnabled: true,
                    contentReadyAction: function (e) {
                        drawingHistoryPopup.setDrawingHistoryGridViewInstance(e.component);
                    },
                    selection: { mode: 'single' },
                    rowClick: function (clickRow) {
                        if (drawingHistoryPopup.isNewData()) {
                            utils.toast.show('매뉴얼이력추가 중 입니다.'); // hcLee 2016 03 28
                            return;
                        }
                        drawingHistoryPopup.setSelectedDrawingHistory(clickRow.data);
                        //drawingHistoryPopup.hide();
                        drawingHistoryPopup.show();
                    },
                    height: 405
                }
            }
        ],
        swipeEnabled: false,
        selectedIndex: tabIndex,
        height: '520px'
    };

    viewModel.dataModel.ManualTypeName = $KoSet(viewModel.dataModel.ManualTypeName, '');
    viewModel.isEditModeInPopup.subscribe(function (isEditMode) {
        tabIndex(0); // 왼쪽 수정은 무조건 매뉴얼 hcLee 2016 03 24추가
        //isVisibleHistoryInsertButton(tabIndex() === 1 && isEditMode);
    });

    viewModel.textAreaNoteHeightInPopup = textAreaNoteHeightInPopup;
    viewModel.drawingHistoryPopup = drawingHistoryPopup;
    return viewModel;
};