topo2Map.js 3.86 KB
/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 ONOS GUI -- Topology Map Module.
 Defines behavior for loading geographical maps into the map layer.
 */

(function () {
    'use strict';

    // Injected Services
    var $loc, ps, ms, sus, countryFilters;

    // Injected Classes
    var MapSelectionDialog;

    // internal state
    var mapG;

    function init(zoomLayer) {
        return setUpMap(zoomLayer);
    }

    function setUpMap(zoomLayer) {
        var prefs = currentMap(),
            mapId = prefs.mapid,
            mapFilePath = prefs.mapfilepath,
            mapScale = prefs.mapscale,
            loadMap = ms.loadMapInto,
            promise, cfilter;

        mapG = d3.select('#topo-map');

        if (mapG.empty()) {
            mapG = zoomLayer.append('g').attr('id', 'topo-map');
        } else {
            mapG.each(function (d, i) {
                d3.selectAll(this.childNodes).remove();
            });
        }

        if (mapFilePath === '*countries') {
            cfilter = countryFilters[mapId] || countryFilters.uk;
            loadMap = ms.loadMapRegionInto;
        }

        promise = loadMap(mapG, mapFilePath, mapId, {
            countryFilters: cfilter,
            adjustScale: mapScale,
            shading: ''
        });

        return promise;
    }

    function currentMap() {
        return ps.getPrefs(
            'topo_mapid',
            {
                mapid: 'usa',
                mapscale: 1,
                mapfilepath: '*continental_us',
                tint: 'off'
            },
            $loc.search()
        );
    }

    function opacifyMap(b) {
        mapG.transition()
            .duration(1000)
            .attr('opacity', b ? 1 : 0);
    }

    function setMap(map) {
        ps.setPrefs('topo_mapid', map);
        setUpMap();
        opacifyMap(true);
    }

    // TODO: -- START -- Move to dedicated module
    var prefsState = {};

    function updatePrefsState(what, b) {
        prefsState[what] = b ? 1 : 0;
        ps.setPrefs('topo_prefs', prefsState);
    }

    function _togSvgLayer(x, G, tag, what) {
        var on = (x === 'keyev') ? !sus.visible(G) : Boolean(x);
        sus.visible(G, on);
        updatePrefsState(tag, on);
        // flash.flash(verb + ' ' + what);
    }
    // TODO: -- END -- Move to dedicated module

    function toggle(x) {
        _togSvgLayer(x, mapG, 'bg', 'background map');
    }

    function openMapSelection() {

        // TODO: Create a view class with extend method
        MapSelectionDialog.prototype.currentMap = currentMap;

        new MapSelectionDialog({
            okHandler: function (preferences) {
                setMap(preferences);
            }
        }).open();
    }

    angular.module('ovTopo2')
    .factory('Topo2MapService',
        ['$location', 'PrefsService', 'MapService',
            'SvgUtilService', 'Topo2CountryFilters', 'Topo2MapDialog',
            function (_$loc_, _ps_, _ms_, _sus_, _t2cf_, _t2md_) {

                $loc = _$loc_;
                ps = _ps_;
                ms = _ms_;
                sus = _sus_;
                countryFilters = _t2cf_;
                MapSelectionDialog = _t2md_;

                return {
                    init: init,
                    openMapSelection: openMapSelection,
                    toggle: toggle
                };
            }
        ]);

})();