GUI -- Cleaned up sprite definition format in JSON.
- Implemented sprite layer in topology view.

Change-Id: I0861641684df12202d6ccd069d89375a8005d4a8
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 b16cb6d..68ecf2c 100644
--- a/web/gui/src/main/webapp/app/view/topo/topo.js
+++ b/web/gui/src/main/webapp/app/view/topo/topo.js
@@ -33,7 +33,7 @@
         tes, tfs, tps, tis, tss, tls, tts, tos, fltr, ttbs;
 
     // DOM elements
-    var ovtopo, svg, defs, zoomLayer, mapG, forceG, noDevsLayer;
+    var ovtopo, svg, defs, zoomLayer, mapG, spriteG, forceG, noDevsLayer;
 
     // Internal state
     var zoomer, actionMap;
@@ -53,6 +53,7 @@
             P: [tfs.togglePorts, 'Toggle Port Highlighting'],
             dash: [tfs.showBadLinks, 'Show bad links'],
             B: [toggleMap, 'Toggle background map'],
+            S: [toggleSprites, 'Toggle sprite layer'],
 
             //X: [toggleNodeLock, 'Lock / unlock node positions'],
             Z: [tos.toggleOblique, 'Toggle oblique view (Experimental)'],
@@ -116,6 +117,14 @@
         flash.flash(verb + ' background map');
     }
 
+    function toggleSprites(x) {
+        var on = (x === 'keyev') ? !sus.visible(spriteG) : !!x,
+            verb = on ? 'Show' : 'Hide';
+        sus.visible(spriteG, on);
+        updatePrefsState('sprites', on);
+        flash.flash(verb + ' sprite layer');
+    }
+
     function resetZoom() {
         zoomer.reset();
     }
@@ -247,24 +256,6 @@
             .attr('opacity', b ? 1 : 0);
     }
 
-    function addSprites() {
-        var g = zoomLayer.append ('g').attr('id', 'topo-sprites');
-
-        function cloud(g, x, y) {
-            g.append('use').attr({
-                width: 100,
-                height: 100,
-                'xlink:href': '#cloud',
-                transform: sus.translate([x, y]) + sus.scale(4,4)
-            }).style('stroke', 'goldenrod')
-                .style('fill', 'none')
-                .style('stroke-width', 1.0);
-        }
-
-        cloud(g, 0, 50);
-        cloud(g, 800, 40);
-        cloud(g, 400, 450);
-    }
 
     // --- User Preferemces ----------------------------------------------
 
@@ -285,6 +276,7 @@
         toggleInstances(prefsState.insts);
         toggleSummary(prefsState.summary);
         toggleDetails(prefsState.detail);
+        toggleSprites(prefsState.sprites);
     }
 
 
@@ -298,11 +290,11 @@
             'TopoEventService', 'TopoForceService', 'TopoPanelService',
             'TopoInstService', 'TopoSelectService', 'TopoLinkService',
             'TopoTrafficService', 'TopoObliqueService', 'TopoFilterService',
-            'TopoToolbarService',
+            'TopoToolbarService', 'TopoSpriteService',
 
         function ($scope, _$log_, $loc, $timeout, _$cookies_, _fs_, mast, _ks_,
                   _zs_, _gs_, _ms_, _sus_, _flash_, _wss_, _ps_, _tes_, _tfs_,
-                  _tps_, _tis_, _tss_, _tls_, _tts_, _tos_, _fltr_, _ttbs_) {
+                  _tps_, _tis_, _tss_, _tls_, _tts_, _tos_, _fltr_, _ttbs_, tspr) {
             var self = this,
                 projection,
                 dim,
@@ -373,7 +365,8 @@
                     toggleMap(prefsState.bg);
                 }
             );
-     //       addSprites();
+            spriteG = zoomLayer.append ('g').attr('id', 'topo-sprites');
+            tspr.loadSprites(spriteG);
 
             forceG = zoomLayer.append('g').attr('id', 'topo-force');
             tfs.initForce(svg, forceG, uplink, dim);