BemsWebApplication.AnnounceManagement = function (params, viewInfo) {
    'use strict';

    var imagefileUrl1 = ko.observable(),
        uploadedFileInfo = {},
        dropZone1 = null;
    var isEditModeInPopup = ko.observable(false);
    var eq = BWA.DataUtil.constructEqualFilter,
        and = BWA.DataUtil.andFilter;

    var partnerTypeDataSource = BemsWebApplication.db.createDataSource('CmPartnerType', false, true, true),
         partnerDataSource = BemsWebApplication.db.createDataSource('CmPartner', true, true, true),
        contractClassDataSource = BemsWebApplication.db.createDataSource('FmsContractClass', true, true, true),
        contractMethodDataSource = BemsWebApplication.db.createDataSource('FmsContractMethod', true, true, true),
        contractTypeDataSource = BemsWebApplication.db.createDataSource('FmsContractType', true, true, true),
        paymentTypeDataSource = BemsWebApplication.db.createDataSource('FmsPaymentType', true, true, true),

        businessFieldDataSource = BemsWebApplication.db.createDataSource('CmBusinessField', true, true, true);

    var businessFieldsForSearch = ko.observableArray();

    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 partnerTypes = ko.observableArray(),
        contractClasses = ko.observableArray(),
        contractMethods = ko.observableArray(),
        contractTypes = ko.observableArray(),
        paymentTypes = ko.observableArray(),
        allPartner = ko.observableArray(),
        filteredPartner = ko.observableArray(),

        businessFields = ko.observableArray();

    var partnerTypesForSearch = ko.observableArray(),
        contractClassesForSearch = ko.observableArray(),
        contractMethodsForSearch = ko.observableArray(),
        contractTypesForSearch = ko.observableArray(),
        paymentTypesForSearch = ko.observableArray();

    var deferredForSearch = new $.Deferred();

    var dataSourceOptions = {
        select: [
            'SiteId',
            'AnnouncementId',
            'BusinessFieldId',
            'CmBusinessField/Name',
            'Title',
            'Contents',
            'RegisterUserId ',
            'CmUser/Name', // 등록자
            'FileId',
            'CmFile/Name',
            'CmFile/FileSize',
            'AddDate',
            'UpdateDate',
            'IsUse',
        ],
        expand: [
            'CmBusinessField',
            'CmFile',
            'CmUser'
        ],

        extendOptions: {
            forceOriginalField: true
        },
        filter: [
            ['SiteId', '=', BWA.UserInfo.SiteId()],
            'or',
            eq('SiteId', BemsWebApplication.config.HOSiteId)
        ]
    };
    var viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'CmAnnouncement', {
        dataSourceOptions: dataSourceOptions,
        columns: [
            { dataField: 'SiteId', visible: false, sortOrder: 'desc' },
            { dataField: 'AnnouncementId', caption: $G('number'), width: '10%', alignment: 'center', allowFiltering: false},
            { dataField: 'CmBusinessField/Name', caption: '업무분야', width: '10%', alignment: 'center' },
            { dataField: 'Title', caption: '제목', width: '40%', alignment: 'center' },
            { dataField: 'CmUser/Name', caption: '등록자', width: '40%', alignment: 'center' },
            {
                dataField: 'AddDate', caption: '등록일', width: '20%', alignment: 'center',
                customizeText: function (cellInfo) {
                    return $G.date(cellInfo.value);
                }
            },
            {
                dataField: 'UpdateDate', caption: '만료일', width: '20%', alignment: 'center',
                customizeText: function (cellInfo) {
                    return $G.date(cellInfo.value);
                }
            },

            //utils.datagrid.columnIsUse('20%') hcLee 2015 12 23
        ],
        /*
                toolbarItems: [
        { location: 'before', text: '공지사항 입력' },
        { location: 'after', widget: 'button', options: { text: $G('edit'), icon: 'edit', visible: _.isBoolean(isModifiable) ? isModifiable : visibleEditButton, disabled: hasnotModificationPermission, clickAction: handlePopupButtonEdit } },
        { location: 'after', widget: 'button', options: { text: $G('delete'), type: 'danger', icon: 'remove', visible: _.isBoolean(isModifiable) ? isModifiable : visibleDeleteButton, disabled: hasnotModificationPermission, clickAction: handlePopupButtonDelete } },
        { location: 'after', widget: 'button', options: { text: $G('cancel'), icon: 'cancel', visible: visibleCancelButton, clickAction: handlePopupButtonCancel } },
        { location: 'after', widget: 'button', options: { text: $G('save'), icon: 'save', visible: isEditModeInPopup, disabled: hasnotModificationPermission, clickAction: handlePopupButtonSave } },
        { location: 'after', widget: 'button', options: { text: $G('close'), icon: 'close', clickAction: handlePopupButtonClose } }
                ], */

        //popupWidth: 580,
        searchViewItems: [
            { id: 'BusinessFieldId', ignoreValue: 0, defaultValue: 0, dataSource: businessFieldsForSearch },
            { id: 'Title' },
            { id: 'Contents' },
            { id: 'AddDate', type: 'dateRange', isOnlyDate: true },
        ],
        mandatoryFields: [
            { dataField: 'Title', name: '제목' },
            { dataField: 'Contents', name: '내용' }
        ],

        handleAfterLoadingModelByKey: function (data, dataViewModel, isNewInPopup) {

            if (isNewInPopup() == false) {

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

                var keys = BWA.db.extractKeysObject('CmAnnouncement', dataViewModel);
                dataViewModel.ReadCount(dataViewModel.ReadCount() + 1);
                BWA.db.CmAnnouncement.update(keys, dataViewModel.toJS());
            }
        },

        handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
            dataGrid.clearSelection();

            var data = clickRow.data;
            var dataModel = viewModel.dataModel;
            if (dataModel.AnnouncementId() == data.AnnouncementId()) {
                setTimeout(function(){ 
                    var dataSource = new DevExpress.data.DataSource({
                        store: {
                            type: "odata",
                            url: endpointSelector + "/CmFile",
                        },
                        requireTotalCount: true
                    });
                    dataSource.filter([
                            ["SiteId", "=", BWA.UserInfo.SiteId()],
                            "and",
                            ["FileId", "=", viewModel.dataModel.FileId()]
                    ]);
                    dataSource.load()
                    .done(function (result) {
                        dataModel.AttachmentFileName(result[0].Name);
                    });
                }, 100)
            }
            else {
                if (data['FileId']() != null) {
                    dataModel.AttachmentFileName(data['CmFile/Name']());
                }
                else {
                    dataModel.AttachmentFileName('');
                }
            }

            //alert(dataModel.AttachmentFileName());
            popupVisible(true);
        },


        rowPrepared: function (rowElement, rowInfo) {
            if (rowInfo.rowType == 'data') {
                var data = rowInfo.data;
                if (data.SiteId() == BemsWebApplication.config.HOSiteId) {
                    rowElement.css('background-color', 'rgba(255,0,0,0.3)');
                }
            }
        },

        handleViewShowing: function (dataModel) {

            businessFieldDataSource.filter([
              [eq('SiteId', BWA.UserInfo.SiteId()), 'or', eq('SiteId', BemsWebApplication.config.HOSiteId)],
            ]);
            businessFieldDataSource.load().done(function (dbBusinessFields) {
                businessFields(dbBusinessFields);
                businessFieldsForSearch($SearchView.createArrayOfSelectBox('BusinessFieldId', businessFields()));
            });
        },

        handlePopupShowing: function (isNewInPopup, dataViewModel) {
            // 신규등록인 경우 
            //imagefileUrl1(undefined);
            //dropZone1.removeAllFiles();
            //if (_.isNull(dropZone1) === false) dropZone1.resetUploadedFileInfo();

            if (isNewInPopup()) {
                // hcLee 2016 01 04 추가
                dropZone1 = null;
                imagefileUrl1(undefined);

                dataViewModel.AddDate(new Date());
                dataViewModel.UpdateDate(new Date());
                dataViewModel.RegisterUserId(BWA.UserInfo.UserId());
                dataViewModel.ReadCount(0);
            }
        },
        handlePopupShown: function (isEditMode, isNew, dataViewModel) {
            imagefileUrl1(undefined);
            if (_.isNull(dropZone1) === false) dropZone1.resetUploadedFileInfo();
            isEditModeInPopup(false);
            if (isNew) { // 신규등록인 경우 
                isEditModeInPopup(true);
                dropZone1 = null;
            }
        },
        handleCancelInPopup: function () {
            isEditModeInPopup(false);
        },
        handlePopupButtonEdit: function (dataModel) {
            isEditModeInPopup(true);
        },
        handlePopupButtonClose: function () {
            isEditModeInPopup(false);
        },
        handleViewShown: function (dataViewModel, isEditModeInPopup) {
            setupDropZone(isEditModeInPopup, dataViewModel);
            
            $("#gridContainer").dxDataGrid({
                paging: {
                    pageSize: 20,
                    enabled: true
                }
            });
        },

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

        handleAfterSaveInPopup: function (responseKey, response) {//2019-10-14 변경
            viewModel.dataModel.AnnouncementId(responseKey.AnnouncementId);
            setTimeout(function(){ 
                var dataSource = new DevExpress.data.DataSource({
                    store: {
                        type: "odata",
                        url: endpointSelector + "/CmAnnouncement",
                    },
                    requireTotalCount: true
                });
                dataSource.filter([
                        ["SiteId", "=", BWA.UserInfo.SiteId()],
                        "and",
                        ["AnnouncementId", "=", viewModel.dataModel.AnnouncementId()]
                ]);
                dataSource.load()
                .done(function (result) {
                    viewModel.dataModel.FileId(result[0].FileId);
                });
            }, 100)
        },

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

    function processValueChange(e) {

        filteredPartner([]);
        _.each(allPartner(), function (partner) {
            if (e.value === partner.PartnerTypeId()) {
                filteredPartner.push(partner);
            }
        });

        if (!_.isEmpty(filteredPartner())) {
            viewModel.dataModel.PartnerId(filteredPartner()[0].PartnerId());
        }
    }

    function setupDropZone(isEditModeInPopup, dataViewModel) {

        var timer = null;
        isEditModeInPopup.subscribe(function (value) {

            if (value) {

                if (timer) { clearInterval(timer); }

                timer = setInterval(function () {

                    if ($('#announcementDropZone1').length) {

                        if (_.isNull(dropZone1)) {

                            dropZone1 = BWA.DropZone.create({

                                id: '#announcementDropZone1',

                                previewTemplate: "...",

                                categoryId: $Code.FileCategory.ANNOUNCEMENT,
                                uploadedFileInfo: uploadedFileInfo,                                
                                handleRemoveBeforePromise: function () {
                                    var keys = BWA.db.extractKeysObject('CmAnnouncement', dataViewModel);
                                    return BWA.db.CmAnnouncement.update(keys, { FileId: null });
                                },
                                handleSuccess: function (fileInfo) {

                                    dataViewModel.FileId(fileInfo.FileId);
                                    dropZone1.options.startLoadFileCount = 1;
                                    if (uploadedFileInfo.FileId) {
                                        dataViewModel.FileId(uploadedFileInfo.FileId);
                                        var keys = BWA.db.extractKeysObject('CmAnnouncement', dataViewModel);
                                        if (keys.AnnouncementId != null) {
                                            return BWA.db.CmAnnouncement.update(keys, { FileId: uploadedFileInfo.FileId });
                                        }
                                    }
                                },

                                handleRemovedFile: function () {
                                    dataViewModel.FileId(null);
                                    if (dropZone1 != null)
                                        dropZone1.options.startLoadFileCount = 0;
                                },
                            });

                        }
                    }

                }, 100);
            }
            else {
                if (timer) { clearInterval(timer); timer = null; }
                dropZone1 = null;
            }
        });
    }
    /*
    var toolbarItems = [
{ location: 'before', text: '공지사항 입력' },
{ location: 'after', widget: 'button', options: { text: $G('edit'), icon: 'edit', visible: _.isBoolean(isModifiable) ? isModifiable : visibleEditButton, disabled: hasnotModificationPermission, clickAction: handlePopupButtonEdit } },
{ location: 'after', widget: 'button', options: { text: $G('delete'), type: 'danger', icon: 'remove', visible: _.isBoolean(isModifiable) ? isModifiable : visibleDeleteButton, disabled: hasnotModificationPermission, clickAction: handlePopupButtonDelete } },
{ location: 'after', widget: 'button', options: { text: $G('cancel'), icon: 'cancel', visible: visibleCancelButton, clickAction: handlePopupButtonCancel } },
{ location: 'after', widget: 'button', options: { text: $G('save'), icon: 'save', visible: isEditModeInPopup, disabled: hasnotModificationPermission, clickAction: handlePopupButtonSave } },
{ location: 'after', widget: 'button', options: { text: $G('close'), icon: 'close', clickAction: handlePopupButtonClose } }
    ]; */

    viewModel.popupVisible.subscribe(function (value) {
        if (!value) {
            viewModel.gridView().refresh();
        }
    });

    viewModel.dataModel.AttachmentFileName = ko.observable();
    viewModel.imagefileUrl1 = imagefileUrl1;

    viewModel.businessFields = businessFields;

    viewModel.processValueChange = processValueChange;
    viewModel.partnerTypes = partnerTypes;
    viewModel.contractClasses = contractClasses;
    viewModel.contractMethods = contractMethods;
    viewModel.contractTypes = contractTypes;
    viewModel.paymentTypes = paymentTypes;
    viewModel.allPartner = allPartner;
    viewModel.filteredPartner = filteredPartner;
    viewModel.isEditModeInPopup = isEditModeInPopup;
    //viewModel.toolbarItems = toolbarItems;

    return viewModel;
};