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

    var viewModel, sidemenuHashSet;
    var headerCheckBoxValues = ko.observable(false);
    var saving = ko.observable(false);

    var headerTemplate = function (header, info) {
        var dataGrid = $('#gridContainer').dxDataGrid('instance');
        var checkbox = $('<div>');
        checkbox.appendTo(header);
        checkbox.dxCheckBox({
            value: headerCheckBoxValues(),
            valueChangeAction: function (e) {
                headerCheckBoxValues(e.value);
            }
        });

        $('<div>')
            .css('display', 'inline-block')
            .html(info.column.caption)
            .appendTo(header);
    };

    var viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'CmMenu', {
        popupWidth: 480,
        columns: [
            { dataField: 'SiteId', caption: '번호', width: '10%', allowSorting: false },
            { dataField: 'MenuPath', caption: '메뉴 경로', width: '60%', allowSorting: true },
            { dataField: 'Name', caption: '메뉴 이름', width: '20%', allowSorting: false },
            { dataField: 'MenuId', caption: '메뉴 ID', width: '20%', allowSorting: false },
            { dataField: 'Used', caption: '사용', width: '20%', allowSorting: false },
        ],
        "export": {
            enabled: true,
            fileName: '메뉴 목록',
        },
        onExporting: function (e) {
            e.component.columnOption("SiteId", "visible", false);
        },
        onExported: function (e) {
            e.component.columnOption("SiteId", "visible", true);
        },
        paging: {
            pageSize: 18,
            enabled: true
        },
        pager: {
        },

        cellPrepared: function (cellElement, cellInfo) {
            if (cellInfo.columnIndex == 4) {

                (function (element, info) {

                    if (info.rowType == 'data') {
                        var index = info.columnIndex - 4; // 
                        var checker = (1 << index);
                        var checked = (info.value & checker);

                        //console.log(info.columnIndex + ' ' + checked);

                        $(cellElement).text('');

                        var checkbox = $('<div>');
                        checkbox.appendTo(element);
                        checkbox.dxCheckBox({
                            value: checked > 0 ? true : false,
                            valueChangeAction: function (e) {
                                var p = info.data.Used

                                if (e.value) {
                                    p(p() | checker);
                                }
                                else {
                                    p(p() & ~checker);
                                }
                            }
                        });
                        var dataCheckBoxes = info.data.checkboxes = info.data.checkboxes || [];
                        dataCheckBoxes[index] = checkbox;
                    }
                })(cellElement, cellInfo);
            }
        },

        selection: {
            mode: 'none'
        },
        searchViewItems: [
           { id: 'MenuPath' },
           { id: 'Name' },
           { id: 'MenuId' }//ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: searchFacilityClassValues[1], dataSource: searchFacilityClasses[1], handleChangedValue: handleSecondClassChangedValueInSearchView },
        ],
        handleViewShown: function () {
            sidemenuHashSet = $SideMenu.getSidemenuHashSet();
            _.each(sidemenuHashSet, function (items, id) {
                items['MenuId'] = id;
                items['Used'] = true;
            });
            //$SearchView.visibleObservable(false);
        },
        handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
        }
    });

    function handleSave() {
        saving(true);
        var rows = utils.datagrid.getItems($('#gridContainer').dxDataGrid('instance'));
        var newmenus = [];
        _.each(rows, function (menu) {
            newmenus.push({
                SiteId: BWA.UserInfo.SiteId(),
                MenuId: menu.MenuId(),
                MenuPath: menu.MenuPath(),
                Used: menu.Used(),
                Name: menu.Name(),
            });
        });

        BWA.api.post('CmMenu/DeleteAll', { SiteId: BWA.UserInfo.SiteId() }).done(function () {
            BWA.api.post('CmMenu/InsertAll', newmenus).done(function () {
                viewModel.refreshList();
                utils.toast.show($G('successDatabaseProcessMsg'));
                saving(false);
            });
        });
    }

    // 메뉴 초기화
    function handleEdit() {
        var newmenus = [];
        _.each(sidemenuHashSet, function (menu) {
            newmenus.push({
                SiteId: BWA.UserInfo.SiteId(),
                MenuId: menu.MenuId,
                MenuPath: menu.MenuPath,
                Name: menu.Name,
                Used: true,
            });
        });

        BWA.api.post('CmMenu/DeleteAll', { SiteId: BWA.UserInfo.SiteId() }).done(function () {
            BWA.api.post('CmMenu/InsertAll', newmenus).done(function () {
                viewModel.refreshList();
                utils.toast.show($G('successDatabaseProcessMsg'));
            });
        });
    }

    function handleHeaderCheckboxValueFunc(index) {

        return function (check) {
            var rows = utils.datagrid.getItems($('#gridContainer').dxDataGrid('instance'));
            _.each(rows, function (data, i) {
                data.checkboxes[index].dxCheckBox({
                    value: check
                });
            });
        };
    }

    headerCheckBoxValues.subscribe(handleHeaderCheckboxValueFunc(0))

    viewModel.popupVisible.subscribe(function (visible) {
    });

    viewModel.handleSave = handleSave;
    viewModel.handleEdit = handleEdit;

    viewModel.sidemenuHashSet = sidemenuHashSet;
    viewModel.saving = saving;
    return viewModel;
};