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

    var BUILDING_DEPTH = 1,
        FLOOR_DEPTH = 2,
        ZONE_DEPTH = 3;

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

    //var buildingDataSource = BemsWebApplication.db.createDataSource('CmBuilding', true),
    var buildingDataSource = BemsWebApplication.db.createDataSource('CmBuilding', [('SiteId', '=', BWA.UserInfo.SiteId())]),
        floorDataSource = BemsWebApplication.db.createDataSource('CmFloor', true),
        zoneDataSource = BemsWebApplication.db.createDataSource('CmZone', true),

        factory = BemsWebApplication.Factory.PointLocationMapping,

        viewModel, gridView,

        popupVisible = ko.observable(false),
        selectedTreeItemData = ko.observable(null),
        selectedTreeItem = ko.observable(null), // 2015 11 12 hcLee 추가 기존 TreeItem -> TreeItemData 로 변경 하고 (위) 이거 추가함
//        selectedPoints = ko.observableArray(),


        dataSource = factory.getDataSource(),

        //dataSource. (dataSourceOptions).filter = ['SiteId', '=', BWA.UserInfo.SiteId()],

        dataGridOptions = utils.datagrid.defaultOptions({

            dxDataSource: dataSource,
            //            datagridId: datagridId,
            dbId: 'BemsMonitoringPoint',
            width: '100%',
            height: 685,
            selection: {
                mode: 'multiple'
            },

            columns: factory.getColumns([
                { dataField: 'CmFacility/Name', width: '40%' },
                { dataField: 'Name', width: '40%' },
                { dataField: 'ValueType', width: '20%' }
            ]),

            wordWrapEnabled: true,

            paging: {
                pageSize: 19,
                enabled: true
            },
            pager: {
            },

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

    function refreshList() {
        var date = moment();
    }

    function handleButtonSearchPointView() {
        if (selectedTreeItemData() === null) {
            utils.toast.show('선택된 빌딩/층/존이 없습니다.', 'warning');
            return null;
        }

        viewModel.pointSearchPopup.show();
    }

    function handleClickTreeItem(element, data) {

        // 2015 11 12  hcLee 추가
        selectedTreeItem(data);

        var eq = BWA.DataUtil.constructEqualFilter;

        var depth = data.depth;
        data = data.data;

        selectedTreeItemData(data);

        var filter = [eq('SiteId', data.SiteId()), 'and'];

        var buildingId = null;
        var floorId = null;
        var zoneId = null;

        switch (depth) {

            case BUILDING_DEPTH: // building
                buildingId = data.BuildingId();
                break;

            case FLOOR_DEPTH: // floor
                buildingId = data.BuildingId();
                floorId = data.FloorId();
                break;

            case ZONE_DEPTH: // zone
                buildingId = data.BuildingId();
                floorId = data.FloorId();
                zoneId = data.ZoneId();
                break;
        }

        filter.push(eq('BuildingId', buildingId));
        filter.push('and');
        filter.push(eq('FloorId', floorId));
        filter.push('and');
        filter.push(eq('ZoneId', zoneId));

        viewModel.pointSearchPopup.setLocation(data.SiteId(), buildingId, floorId, zoneId);

        var datagrid = $('#datagrid').dxDataGrid('instance');
        datagrid.filter(filter);
    }

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

    function handleViewShown() {
        if (buildingDataSource._items.length != 0) {
            var data = selectedTreeItem();
            if (data != null)
                $('#locationTreeView').cwTreeView('reload', selectedTreeItem().parentData);
        }

        var eq = BWA.DataUtil.constructEqualFilter;
        $('#locationTreeView').cwTreeView({
            width: '30%',
            height: 'auto',
            //            height: '480px',
            onClickTreeItem: handleClickTreeItem,
            delegateDataSource: function (data, alterObj) {
                var id = data.id;
                var depth = data.depth;

                var promise = null;
                switch (depth) {
                    case 0:
                        promise = buildingDataSource.load();
                        break;
                    case 1:
                        floorDataSource.filter([
                            eq('SiteId', BWA.UserInfo.SiteId()),
                            'and',
                            eq('BuildingId', data.data.BuildingId())
                        ]);
                        promise = floorDataSource.load();
                        break;
                    case 2:
                        zoneDataSource.filter([
                            eq('SiteId', BWA.UserInfo.SiteId()),
                            'and',
                            eq('BuildingId', data.data.BuildingId()),
                            'and',
                            eq('FloorId', data.data.FloorId())
                        ]);
                        promise = zoneDataSource.load();
                        break;
                }
                return promise;
            }
        });

        gridView = $('#datagrid').dxDataGrid('instance');

        // hcLee 2016 01 22
        if (selectedTreeItemData() === null) {
            var eq = BWA.DataUtil.constructEqualFilter;
            var filterInit = [eq('SiteId', -1)];
            //..var datagrid = $('#datagrid').dxDataGrid('instance');
            gridView.filter(filterInit);
        }
        $SearchView.setPopupVisibleObservable(null);
        //$SideMenu.showSideMenuIfWill(params.view);
    }

    function handleAddPoints(points) {
        if (points.length === 0) return;
        if (selectedTreeItemData() === null) {
            utils.toast.show('선택된 빌딩/층/존이 없습니다.', 'warning');
            return null;
        }

        var rows = window.utils.datagrid.getItems(gridView);

        points = _.map(points, function (item) {

            var facilityCode = item.FacilityCode;
            var propertyId = item.PropertyId;

            if (_.some(rows, function (x) {
                return (x.FacilityCode() === facilityCode && x.PropertyId === propertyId);
            })) {
                return null;
            }
            return item;
        });

        var data = selectedTreeItemData();
        var parameters = {
            BuildingId: data.BuildingId()
        };
        if (_.isUndefined(data.FloorId) === false) {
            parameters.FloorId = data.FloorId();
            if (_.isUndefined(data.ZoneId) === false) {
                parameters.ZoneId = data.ZoneId();
            }
            else {
                parameters.ZoneId = null;
            }
        }
        else {
            parameters.FloorId = null;
            parameters.ZoneId = null;
        }

        var postData = [];
        var itemKeys = ['SiteId', 'FacilityCode', 'PropertyId'];
        var toJS = BWA.DataUtil.convertHybridViewModelToJS;
        //        $.each(points.concat(rows), function(i, item) {
        $.each(points, function (i, item) {
            item = toJS(_.pick(item, itemKeys));
            item = $.extend(item, parameters);
            postData.push(item);
        });

        parameters.SiteId = data.SiteId();
        var promise = BemsWebApplication.api.post(
            'BemsMonitoringPoint/AddLocation', postData, parameters
        );

        promise.done(function () {
            utils.toast.show($G('successDatabaseProcessMsg'));
            gridView.refresh();
        });

        console.log(points);
        return promise;
    }

    function handleRemoveSelectedPoints() {

        if (selectedTreeItemData() === null) {
            utils.toast.show('선택된 빌딩/층/존이 없습니다.', 'warning');
            return null;
        }

        var rows = gridView.getSelectedRowsData();

        var postData = [];
        var itemKeys = BWA.db.BemsMonitoringPoint.key();
        var toJS = BWA.DataUtil.convertHybridViewModelToJS;

        $.each(rows, function (i, item) {
            item = toJS(_.pick(item, itemKeys));
            postData.push(item);
        });

        var promise = BemsWebApplication.api.post(
            'BemsMonitoringPoint/RemoveLocation', postData
        );

        promise.done(function () {
            utils.toast.show($G('successDatabaseProcessMsg'));
            gridView.clearSelection();
            gridView.refresh();
        });

        return promise;
    }

    viewModel = {
        viewShowing: handleViewShowing,
        hasnotModificationPermission: hasnotModificationPermission, //권한설정

        refreshList: refreshList,

        handleRemoveSelectedPoints: handleRemoveSelectedPoints,
        handleButtonSearchPointView: handleButtonSearchPointView,
        dataGridOptions: dataGridOptions,
    };

    viewModel.pointSearchPopup = BWA.Popup.PointSearch.create(viewModel, handleAddPoints);

    return $.extend(BWA.CommonView.create(params, viewInfo, viewModel.options, null, handleViewShown), viewModel);
    //    return viewModel;
};