$(function () {
    'use strict';

    var eq = BWA.DataUtil.constructEqualFilter,
        or = BWA.DataUtil.orFilter,
        and = BWA.DataUtil.andFilter;

    var visible = ko.observable(false),
        newInfo = ko.observable(false),
        userDataSource = BWA.DataUtil.createDataSource({
            dataSourceOptions: {
                paginate: false,
                select: ['SiteId', 'CompanyId', 'DepartmentId', 'UserId', 'Name', 'EmploymentType', 'Email', 'MobilePhoneNo', 'EmploymentStatus', 'CmPosition/Name', 'CmDepartment/Name', 'CmCompany/Name'],
                expand: ["CmPosition", "CmDepartment", "CmCompany"],
                extendOptions: {
                    alterNames: {
                        'CmPosition/Name': 'PositionName',
                        'CmDepartment/Name': 'DepartmentName',
                        'CmCompany/Name': 'CompanyName'
                    }
                }
            }
        }, 'CmUser'),

        userInfo = {
            SiteId: ko.observable(),
            UserId: ko.observable(),
            Name: ko.observable(),
            CompanyName: ko.observable(),
            PositionName: ko.observable(),
            DepartmentName: ko.observable(),
            MobilePhoneNo: ko.observable(),
            Email: ko.observable()
        };

    var announceGridView = undefined;

    var now = new Date();
    var endDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0);

    var announceDataSource = BWA.DataUtil.createDataSource({
        dataSourceOptions: {
            paginate: false,
            select: [
                'SiteId',
                'AnnouncementId',
                'BusinessFieldId',
                'CmBusinessField/Name',
                'Title',
                'Contents',
                'RegisterUserId ',
                'CmUser/Name', // 등록자
                'FileId',
                'CmFile/Name',
                'CmFile/FileSize',
                'AddDate',
                'UpdateDate',
                'IsUse',
                'ReadCount'
            ],
            expand: ['CmBusinessField', 'CmFile', 'CmUser'],
            extendOptions: {
                forceOriginalField: true
            },
        }
    }, 'CmAnnouncement');

    var announcements = ko.observableArray();

    var constructionDataSource = BWA.DataUtil.createDataSource({
        dataSourceOptions: {
            paginate: false,
            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',
                'FileId1',
                'FileId2',
                'FileId3',
                'CmFile/Name',
                'CmFile1/Name',
                'CmFile2/Name'

            ],
            expand: [
                'FmsConstructionCodeProgress',
                'CmPartner',
                'FmsConstructionEstimation',
                'FmsConstructionCodeType',
                'CmFile',
                'CmFile1',
                'CmFile2'
            ],
            extendOptions: {
                forceOriginalField: true
            },
        }
    }, 'FmsConstruction');

    var constructions = ko.observableArray();

    var workDataSource = BWA.DataUtil.createDataSource({
        dataSourceOptions: {
            paginate: false,
            select: [
                'SiteId', 'WorkRequestId',
                //'StartDate', 'EndDate',
                'StartWorkDate',
                //'ConfirmedDate', 'ConfirmedUserId', 'IsConfirmed',
                'FmsWorkRequest/Content',
                'FmsWorkRequest/WorkTypeId',
                'Title',
                'CmUser/Name', // 작업지시자
                //'FmsWorkResult/WorkerUserId/Name',

                'OrderDate',
                'FmsWorkRequest/WorkProgressId',
                //'CmUser1/Name', // 승인자
                'FmsWorkRequest/FmsWorkCodeType/Name',
                'CmBusinessField/Name',
                'FmsWorkRequest/FmsWorkCodeProgress/Name',
                'FmsWorkRequest/WorkTypeId',
                'FmsWorkResult/CmUser/Name', // 작업자
                'FmsWorkResult/CmUser1/Name', // 승인자  test ok hcLee 2016 03 22
                'FmsWorkResult/EndDate', // 작업자
                'BusinessFieldId',
                'Content'
            ],
            expand: [
                'FmsWorkRequest',
                'FmsWorkResult',
                'FmsWorkResult/CmUser',
                'FmsWorkResult/CmUser1',
                'FmsWorkRequest/FmsWorkCodeType',
                'FmsWorkRequest/FmsWorkCodeProgress',
                'CmBusinessField',
                'CmUser'],
            extendOptions: {
                forceOriginalField: true
            },
        }
    }, 'FmsWorkOrder');
    //}, 'FmsWorkRequest');

    var works = ko.observableArray();

    var announcePopupVisible = ko.observable(false);

    function announceHandlePopupButtonClose() {
        announcePopupVisible(false);
        announceGridView.refresh();
    }

    var announceDataModel = new BemsWebApplication.CmAnnouncementViewModel();
    announceDataModel.BusinessFieldName = ko.observable();
    announceDataModel.FileUrl = ko.observable();
    announceDataModel.FileName = ko.observable();

    var constructionPopupVisible = ko.observable(false);

    function constructionHandlePopupButtonClose() {
        constructionPopupVisible(false);
    }

    var constructionDataModel = ko.observable();
    constructionDataModel = new BemsWebApplication.FmsConstructionViewModel();

    var workPopupVisible = ko.observable(false);
    function workHandlePopupButtonClose() {
        workPopupVisible(false);
    }
    var workDataModel = ko.observable();
    workDataModel = new BemsWebApplication.FmsWorkOrderViewModel();

    BWA.UserPanel = {
        newInfo: newInfo,
        UserInfo: userInfo,

        announceDataModel: announceDataModel,
        announcePopupOptions: {
            width: '680px',
            height: 'auto',
            visible: announcePopupVisible,
            closeOnOutsideClick: true,
            showingAction: function (e) {
            },
            shownAction: function (e) {
                var keys = BWA.db.extractKeysObject('CmAnnouncement', BWA.UserPanel.announceDataModel);
                BWA.UserPanel.announceDataModel.ReadCount(BWA.UserPanel.announceDataModel.ReadCount() + 1);
                BWA.db.CmAnnouncement.update(keys, BWA.UserPanel.announceDataModel.toJS()).done(function (e) {
                    announceGridView.refresh();
                });
            }
        },
        announcePopupToolbarItems: [
            { location: 'before', text: '상세보기' },
            { location: 'after', widget: 'button', options: { text: $G('close'), icon: 'close', clickAction: announceHandlePopupButtonClose } }
        ],


        constructionDataModel: constructionDataModel,
        constructionPopupOptions: {
            width: '680px',
            height: 'auto',
            visible: constructionPopupVisible,
            closeOnOutsideClick: true,
            showingAction: function (e) { },
            shownAction: function (e) { }
        },
        constructionPopupToolbarItems: [
            { location: 'before', text: '상세보기' },
            { location: 'after', widget: 'button', options: { text: $G('close'), icon: 'close', clickAction: constructionHandlePopupButtonClose } }
        ],

        workDataModel: workDataModel,
        workPopupOptions: {
            width: '680px',
            height: 'auto',
            visible: workPopupVisible,
            closeOnOutsideClick: true,
            showingAction: function (e) { },
            shownAction: function (e) { }
        },
        workPopupToolbarItems: [
            { location: 'before', text: '상세보기' },
            { location: 'after', widget: 'button', options: { text: $G('close'), icon: 'close', clickAction: workHandlePopupButtonClose } }
        ],

        workDataGridOptions: utils.datagrid.defaultOptions({
            dataSource: works,
            datagridId: 'workDataGridInUserPanel',
            handleDataGridRowClick: function (id, dataGrid, clickRow) { // function () {
                dataGrid.clearSelection();
                var data = clickRow.data;
                //BWA.UserPanel.workDataModel = data;

                BWA.UserPanel.workDataModel.Title(data.Title());
                BWA.UserPanel.workDataModel.WorkProgressName = $KoSet(BWA.UserPanel.workDataModel.WorkProgressName, data['FmsWorkRequest/FmsWorkCodeProgress/Name']());
                BWA.UserPanel.workDataModel.WorkerUserName = $KoSet(BWA.UserPanel.workDataModel.WorkerUserName, data['FmsWorkResult/CmUser/Name']);

                BWA.UserPanel.workDataModel.StartWorkDate(data.StartWorkDate());
                BWA.UserPanel.workDataModel.OrderDate(data.OrderDate());
                BWA.UserPanel.workDataModel.Content(data.Content());

                //BWA.UserPanel.workDataModel.Title = $KoSet(BWA.UserPanel.workDataModel.Title, data['Title']());
                /*
                                BWA.UserPanel.workDataModel.BusinessFieldName = $KoSet(BWA.UserPanel.workDataModel.BusinessFieldName, data['CmBusinessField/Name']());
                                BWA.UserPanel.workDataModel.WorkTypeName = $KoSet(BWA.UserPanel.workDataModel.WorkTypeName, data['FmsWorkRequest/FmsWorkCodeType/Name']());
                
                                BWA.UserPanel.workDataModel.WorkerUserName = $KoSet(BWA.UserPanel.workDataModel.WorkerUserName, data['FmsWorkResult/WorkerUserId/Name']);
                                
                                BWA.UserPanel.workDataModel.ConfirmedUserName = $KoSet(BWA.UserPanel.workDataModel.ConfirmedUserName, '');
                                BWA.UserPanel.workDataModel.WorkProgressName = $KoSet(BWA.UserPanel.workDataModel.WorkProgressName, '');
                                //BWA.UserPanel.workDataModel.OrderDate = $KoSet(BWA.UserPanel.workDataModel.OrderDate, '');
                                BWA.UserPanel.workDataModel.OrderDate(data.OrderDate());
                                BWA.UserPanel.workDataModel.Content(data.Content());
                                */
                //if (data['CmUser1/Name'] !== undefined) {
                //    BWA.UserPanel.workDataModel.ConfirmedUserName(data['CmUser1/Name']());
                //}

                //BWA.UserPanel.workDataModel.EndDate = $KoSet(BWA.UserPanel.workDataModel.EndDate, data['FmsWorkResult/EndDate']);

                //BWA.UserPanel.workDataModel.OrderDate(data['FmsWorkOrder/OrderDate']());

                //if (data['FmsWorkOrder/Content'] !== undefined) {
                //    BWA.UserPanel.workDataModel.OrderContent(data['FmsWorkOrder/Content']());
                //}

                workPopupVisible(true);
            },
            useNumberColumn: true,
            columns: [
                { dataField: 'WorkRequestId', caption: $G('number'), width: '12%', alignment: 'center', sortOrder: 'desc' },
                { dataField: 'FmsWorkRequest/FmsWorkCodeType/Name', caption: $G('workTypeName'), width: '15%', alignment: 'center' },
                { dataField: 'FmsWorkRequest/FmsWorkCodeProgress/Name', caption: $G('workProgressName'), width: '15%', alignment: 'center' },
                //{ dataField: 'FmsWorkResult/CmUser/Name', caption: $G('workProgressName'), width: '15%', alignment: 'center' }, test ok hcLee 2016 03 22
                //{ dataField: 'FmsWorkResult/CmUser1/Name', caption: $G('workProgressName'), width: '15%', alignment: 'center' }, test ok  hcLee 2016 03 22

                { dataField: 'Title', caption: '작업명', width: '33%', alignment: 'center' },
            ],
            height: 220,
            paging: { pageSize: 4 },
            pager: { visible: true }
        }),

        constructionDataGridOptions: utils.datagrid.defaultOptions({
            dataSource: constructions,
            datagridId: 'constructionDataGridInUserPanel',
            handleDataGridRowClick: function (id, dataGrid, clickRow) { // function () {
                dataGrid.clearSelection();
                var data = clickRow.data;

                //BWA.UserPanel.constructionDataModel = data;
                BWA.UserPanel.constructionDataModel.Name(data.Name());
                BWA.UserPanel.constructionDataModel.ConstructLocation(data.ConstructLocation());
                //BWA.UserPanel.constructionDataModel.ConstructionTypeName(data.ConstructionTypeName());
                //BWA.UserPanel.constructionDataModel.ProgressName(data.ProgressName());
                BWA.UserPanel.constructionDataModel.StartDate(data.StartDate());
                BWA.UserPanel.constructionDataModel.EndDate(data.EndDate());

                BWA.UserPanel.constructionDataModel.WeldWorkStartTime(data.WeldWorkStartTime());
                BWA.UserPanel.constructionDataModel.WeldWorkEndTime(data.WeldWorkEndTime());

                BWA.UserPanel.constructionDataModel.GasWorkStartTime(data.GasWorkStartTime());
                BWA.UserPanel.constructionDataModel.GasWorkEndTime(data.GasWorkEndTime());

                BWA.UserPanel.constructionDataModel.PaintWorkStartTime(data.PaintWorkStartTime());
                BWA.UserPanel.constructionDataModel.PaintWorkStartTime(data.PaintWorkStartTime());

                BWA.UserPanel.constructionDataModel.ConstructionDetail(data.ConstructionDetail());
                BWA.UserPanel.constructionDataModel.InOutStockName(data.InOutStockName());

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

                BWA.UserPanel.constructionDataModel.ProgressName = $KoSet(BWA.UserPanel.constructionDataModel.ProgressName, data['FmsConstructionCodeProgress/Name']());
                BWA.UserPanel.constructionDataModel.FileUrl1 = $KoSet(BWA.UserPanel.constructionDataModel.FileUrl1, '');
                BWA.UserPanel.constructionDataModel.FileUrl2 = $KoSet(BWA.UserPanel.constructionDataModel.FileUrl2, '');
                BWA.UserPanel.constructionDataModel.AttachmentFileName1 = $KoSet(BWA.UserPanel.constructionDataModel.AttachmentFileName1, '');
                BWA.UserPanel.constructionDataModel.AttachmentFileName2 = $KoSet(BWA.UserPanel.constructionDataModel.AttachmentFileName2, '');

                if (data['FileId1']() != null) {
                    BWA.UserPanel.constructionDataModel.AttachmentFileName1(data['CmFile/Name']());
                    BWA.UserPanel.constructionDataModel.FileUrl1('{0}/CmFile(SiteId={1},FileId={2})/$value'.formati(BWA.db._url, data.SiteId(), data.FileId1()));
                } else {
                    BWA.UserPanel.constructionDataModel.AttachmentFileName1('');
                    BWA.UserPanel.constructionDataModel.FileUrl1('');
                }

                if (data['FileId2']() != null) {
                    BWA.UserPanel.constructionDataModel.AttachmentFileName2(data['CmFile1/Name']());
                    BWA.UserPanel.constructionDataModel.FileUrl2('{0}/CmFile(SiteId={1},FileId={2})/$value'.formati(BWA.db._url, data.SiteId(), data.FileId2()));

                }
                else {
                    BWA.UserPanel.constructionDataModel.AttachmentFileName2('');
                    BWA.UserPanel.constructionDataModel.FileUrl2('');
                }
                constructionPopupVisible(true);
            },
            useNumberColumn: true,
            columns: [
                { dataField: 'ConstructionId', caption: $G('number'), width: '15%', alignment: 'center', sortOrder: 'desc' },
                { dataField: 'FmsConstructionCodeType/Name', caption: '공사구분', width: '20%', alignment: 'center' },
                { dataField: 'Name', caption: '공사명', width: '80%', alignment: 'center' },
            ],
            height: 220,
            paging: { pageSize: 4 },
            pager: { visible: true }
        }),

        announceDataGridOptions: utils.datagrid.defaultOptions({
            //dxDataSource: announcements,
            dataSource: announcements,
            datagridId: 'announcementDataGridInUserPanel',
            handleDataGridRowClick: function (id, dataGrid, clickRow) {
                dataGrid.clearSelection();
                var data = clickRow.data;

                BWA.UserPanel.announceDataModel.AnnouncementId(data.AnnouncementId());
                BWA.UserPanel.announceDataModel.SiteId(data.SiteId());
                BWA.UserPanel.announceDataModel.Title(data.Title());
                BWA.UserPanel.announceDataModel.Contents(data.Contents());
                BWA.UserPanel.announceDataModel.AddDate(data.AddDate());
                BWA.UserPanel.announceDataModel.BusinessFieldName(data['CmBusinessField/Name']());
                BWA.UserPanel.announceDataModel.ReadCount(data.ReadCount());

                if (data.FileId() == null) {
                    BWA.UserPanel.announceDataModel.FileName('');
                    BWA.UserPanel.announceDataModel.FileUrl('');
                } else {
                    BWA.UserPanel.announceDataModel.FileName(data['CmFile/Name']());
                    BWA.UserPanel.announceDataModel.FileUrl('{0}/CmFile(SiteId={1},FileId={2})/$value'.formati(BWA.db._url, data.SiteId(), data.FileId()));
                }
                announcePopupVisible(true);
            },
            columns: [
                { dataField: 'AnnouncementId', caption: $G('number'), width: '15%', alignment: 'center', sortOrder: 'desc' },
                { dataField: 'Title', caption: '제목', width: '40%', alignment: 'center' },
            ],
            useNumberColumn: true,
            height: 220,
            paging: { pageSize: 4 },
            pager: { visible: true },
            contentReadyAction: function (e) {
                announceGridView = e.component;
            },
        }),

        options: {
            width: '1400',
            height: '670',
            visible: visible,
            position: { my: 'top', at: 'top', of: window },
            animation: {
                show: { type: "slide", easing: 'ease-in-out', duration: 400, from: { top: -649 }, to: { top: 0 } },
                hide: { type: "slide", easing: 'ease-in-out', duration: 400, from: { top: 1 }, to: { top: -649 } }
            },
            showingAction: function () {

                userDataSource.filter([
                    eq('SiteId', BWA.UserInfo.SiteId()),
                    and,
                    eq('UserId', BWA.UserInfo.UserId())
                ]);

                userDataSource.load().done(function (users) {
                    if (_.isEmpty(users)) {
                        return; // logout 처리 필요
                    }
                    BWA.DataUtil.copyViewModel(users[0], userInfo);
                });

                announceDataSource.filter([
                   eq('SiteId', BWA.UserInfo.SiteId()),
                   // hcLee 2015 12 24
                   and,
                   ['UpdateDate', '>', endDate],
                   and, // 2016 03 14
                   [eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'or', eq('BusinessFieldId', 1)]
                ]);

                announceDataSource.load().done(function (announceResult) {
                    announcements(announceResult);
                });

                constructionDataSource.filter([
                  eq('SiteId', BWA.UserInfo.SiteId()),
                  and,
                  ['ProgressId', '<', 3]
                ]);

                constructionDataSource.load().done(function (constructResult) {
                    constructions(constructResult);
                });

                workDataSource.filter([
                  eq('SiteId', BWA.UserInfo.SiteId()),
                  and,
                  [eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()), 'or', eq('BusinessFieldId', 1)], // hcLee 2016 04 04 추가
                  and, // 2016 03 14
                  [['FmsWorkRequest/WorkProgressId', '=', $Code.WorkProgress.WORK_STANDBY], // 3  대기만 보여준다 2016 03 09
                  or,
                  [eq('FmsWorkRequest/WorkProgressId', $Code.WorkProgress.WORKING), 'and', eq('FmsWorkResult/WorkerUserId', BWA.UserInfo.UserId())]]
                ]);

                workDataSource.load().done(function (workResult) {
                    works(workResult);
                });
            },

            contentReadyAction: function (e) {

            },
            shading: false,
            closeOnOutsideClick: true
        },

        handleToggleOpenClose: function () {
            visible(!visible());
        },

        show: function () {
            visible(true);
        },

        hide: function () {
            visible(false);
        }
    };
});