Fix for ONOS-291. Highlighting intents in ONOS GUI for selected links.

Change-Id: I757aa40b96d92014fa2d720539da20dd309ec9b1
diff --git a/web/gui/src/main/webapp/app/view/topo/topoLink.js b/web/gui/src/main/webapp/app/view/topo/topoLink.js
index 95a9daa..bfe0df5 100644
--- a/web/gui/src/main/webapp/app/view/topo/topoLink.js
+++ b/web/gui/src/main/webapp/app/view/topo/topoLink.js
@@ -31,7 +31,7 @@
         network,
         showPorts = true,       // enable port highlighting by default
         enhancedLink = null,    // the link over which the mouse is hovering
-        selectedLink = null;    // the link which is currently selected
+        selectedLinks = {};     // the links which are already selected
 
     // SVG elements;
     var svg;
@@ -210,25 +210,33 @@
 
     function selectLink(ldata) {
         // if the new link is same as old link, do nothing
-        if (selectedLink && ldata && selectedLink.key === ldata.key) return;
+         if (d3.event.shiftKey && ldata.el.classed('selected')) {
+            unselLink(ldata);
+            return;
+         }
 
-        // make sure no nodes are selected
-        tss.deselectAll();
+         if (d3.event.shiftKey && !ldata.el.classed('selected')) {
+            selLink(ldata);
+            return;
+         }
 
-        // first, unenhance the currently enhanced link
-        if (selectedLink) {
-            unselLink(selectedLink);
-        }
-        selectedLink = ldata;
-        if (selectedLink) {
-            selLink(selectedLink);
-        }
+         tss.deselectAll();
+
+         if (!ldata.el.classed('selected')) {
+            selLink(ldata);
+            return;
+         }
+
+         if (ldata.el.classed('selected')) {
+            unselLink(ldata);
+         }
     }
 
     function unselLink(d) {
         // guard against link element not set
         if (d.el) {
             d.el.classed('selected', false);
+            delete selectedLinks[d.key];
         }
     }
 
@@ -237,6 +245,7 @@
         if (!d.el) return;
 
         d.el.classed('selected', true);
+        selectedLinks[d.key] = {key : d};
 
         tps.displayLink(d, tov.hooks.modifyLinkData);
         tps.displaySomething();
@@ -252,6 +261,9 @@
 
     function mouseClickHandler() {
         var mp, link, node;
+        if (!d3.event.shiftKey) {
+            deselectAllLinks();
+        }
 
         if (!tss.clickConsumed()) {
             mp = getLogicalMousePosition(this);
@@ -262,6 +274,7 @@
             } else {
                 link = computeNearestLink(mp);
                 selectLink(link);
+                tss.selectObject(link);
             }
         }
     }
@@ -285,13 +298,15 @@
         return on;
     }
 
-    function deselectLink() {
-        if (selectedLink) {
-            unselLink(selectedLink);
-            selectedLink = null;
-            return true;
+    function deselectAllLinks() {
+
+        if (Object.keys(selectedLinks).length > 0) {
+            network.links.forEach(function (d) {
+                if (selectedLinks[d.key]) {
+                    unselLink(d);
+                }
+            });
         }
-        return false;
     }
 
     // ==========================
@@ -333,7 +348,7 @@
                 initLink: initLink,
                 destroyLink: destroyLink,
                 togglePorts: togglePorts,
-                deselectLink: deselectLink
+                deselectAllLinks: deselectAllLinks
             };
         }]);
 }());