GUI -- TopoView - implemented show/hide background map ('B' keystroke)
- reworked SvgUtilService.makeVisible() to be dual-purpose .visible(el, [b]) method.

Change-Id: I8e68994627d1022066cdc9dcbed006675431d91a
diff --git a/web/gui/src/main/webapp/app/fw/svg/svgUtil.js b/web/gui/src/main/webapp/app/fw/svg/svgUtil.js
index 2c47d44..b6c98f0 100644
--- a/web/gui/src/main/webapp/app/fw/svg/svgUtil.js
+++ b/web/gui/src/main/webapp/app/fw/svg/svgUtil.js
@@ -235,12 +235,16 @@
                 return s.replace(/px$/,'');
             }
 
+            function safeId(s) {
+                return s.replace(/[^a-z0-9]/gi, '-');
+            }
+
             function makeVisible(el, b) {
                 el.style('visibility', (b ? 'visible' : 'hidden'));
             }
 
-            function safeId(s) {
-                return s.replace(/[^a-z0-9]/gi, '-');
+            function isVisible(el) {
+                return el.style('visibility') === 'visible';
             }
 
             return {
@@ -249,8 +253,14 @@
                 cat7: cat7,
                 translate: translate,
                 stripPx: stripPx,
-                makeVisible: makeVisible,
-                safeId: safeId
+                safeId: safeId,
+                visible: function (el, x) {
+                            if (x === undefined) {
+                                return isVisible(el);
+                            } else {
+                                makeVisible(el, x);
+                            }
+                         }
             };
         }]);
 }());
diff --git a/web/gui/src/main/webapp/app/view/topo/topo.js b/web/gui/src/main/webapp/app/view/topo/topo.js
index c413347..00b06d5 100644
--- a/web/gui/src/main/webapp/app/view/topo/topo.js
+++ b/web/gui/src/main/webapp/app/view/topo/topo.js
@@ -48,7 +48,7 @@
 
             H: [tfs.toggleHosts, 'Toggle host visibility'],
             M: [tfs.toggleOffline, 'Toggle offline visibility'],
-            //B: [toggleBg, 'Toggle background image'],
+            B: [toggleMap, 'Toggle background map'],
             //P: togglePorts,
 
             //X: [toggleNodeLock, 'Lock / unlock node positions'],
@@ -94,6 +94,10 @@
         tfs.updateDeviceColors();
     }
 
+    function toggleMap() {
+        sus.visible(mapG, !sus.visible(mapG));
+    }
+
     function resetZoom() {
         zoomer.reset();
     }
@@ -184,7 +188,7 @@
     }
 
     function showNoDevs(b) {
-        sus.makeVisible(noDevsLayer, b);
+        sus.visible(noDevsLayer, b);
     }
 
     function showCallibrationPoints() {
diff --git a/web/gui/src/main/webapp/app/view/topo/topoForce.js b/web/gui/src/main/webapp/app/view/topo/topoForce.js
index 35c606f..8f15b947 100644
--- a/web/gui/src/main/webapp/app/view/topo/topoForce.js
+++ b/web/gui/src/main/webapp/app/view/topo/topoForce.js
@@ -365,21 +365,21 @@
     }
 
     function updateHostVisibility() {
-        sus.makeVisible(nodeG.selectAll('.host'), showHosts);
-        sus.makeVisible(linkG.selectAll('.hostLink'), showHosts);
+        sus.visible(nodeG.selectAll('.host'), showHosts);
+        sus.visible(linkG.selectAll('.hostLink'), showHosts);
     }
 
     function updateOfflineVisibility(dev) {
         function updDev(d, show) {
-            sus.makeVisible(d.el, show);
+            sus.visible(d.el, show);
 
             tms.findAttachedLinks(d.id).forEach(function (link) {
                 b = show && ((link.type() !== 'hostLink') || showHosts);
-                sus.makeVisible(link.el, b);
+                sus.visible(link.el, b);
             });
             tms.findAttachedHosts(d.id).forEach(function (host) {
                 b = show && showHosts;
-                sus.makeVisible(host.el, b);
+                sus.visible(host.el, b);
             });
         }
 
@@ -721,7 +721,7 @@
             textDy = r + 10;
 
         d.el = node;
-        sus.makeVisible(node, showHosts);
+        sus.visible(node, showHosts);
 
         is.addHostIcon(node, r, gid);
 
@@ -849,7 +849,7 @@
         d.el = link;
         restyleLinkElement(d);
         if (d.type() === 'hostLink') {
-            sus.makeVisible(link, showHosts);
+            sus.visible(link, showHosts);
         }
     }
 
diff --git a/web/gui/src/main/webapp/tests/app/fw/svg/svgUtil-spec.js b/web/gui/src/main/webapp/tests/app/fw/svg/svgUtil-spec.js
index 69fe750..6fb1a60 100644
--- a/web/gui/src/main/webapp/tests/app/fw/svg/svgUtil-spec.js
+++ b/web/gui/src/main/webapp/tests/app/fw/svg/svgUtil-spec.js
@@ -41,7 +41,7 @@
     it('should define api functions', function () {
         expect(fs.areFunctions(sus, [
             'createDragBehavior', 'loadGlow', 'cat7', 'translate', 'stripPx',
-            'makeVisible', 'safeId'
+            'safeId', 'visible'
         ])).toBeTruthy();
     });
 
@@ -114,15 +114,17 @@
         expect(sus.stripPx('4px')).toEqual('4');
     });
 
-    // === makeVisible()
+    // === visible()
 
     it('should hide and show an element', function () {
         var r = svg.append('rect');
 
-        sus.makeVisible(r, false);
+        sus.visible(r, false);
         expect(r.style('visibility')).toEqual('hidden');
+        expect(sus.visible(r)).toBe(false);
 
-        sus.makeVisible(r, true);
+        sus.visible(r, true);
         expect(r.style('visibility')).toEqual('visible');
+        expect(sus.visible(r)).toBe(true);
     });
 });