state_graph.js: Add focus hover for time

Adds an SVG rect element to the focus display and displays a tooltip
with the current time at the hovering mouse cursor.

BUG=b:150216354
TEST=Manually tested in browser

Change-Id: I3e23aae92ae36526799d57c5ec2ccfb6563c898c
diff --git a/state_graph.js b/state_graph.js
index ca272e1..d8e3375 100644
--- a/state_graph.js
+++ b/state_graph.js
@@ -348,6 +348,15 @@
       .attr('class', 'focus')
       .attr('transform', 'translate(' + focusMargin.left + ',0)');
 
+  var focusHoverTarget = svg.append('rect')
+      .attr('width', width)
+      .attr('height', focusHeight)
+      .attr('fill', 'rgba(0, 0, 0, 0)')
+      .attr('stroke', 'none')
+      .on('mouseover', focusMouseOver)
+      .on('mousemove', focusMouseMove)
+      .on('mouseout', focusMouseOut);
+
   var context = svg.append('g')
       .attr('class', 'context')
       .attr('transform',
@@ -624,4 +633,28 @@
     }
     return ('zoom_' + i + ' suspends partial');
   }
+
+  let timeHover = null;
+  function focusMouseOver(d, i) {
+    timeHover = document.createElement('div');
+    timeHover.style.position = 'absolute';
+    document.body.appendChild(timeHover);
+  }
+  function focusMouseMove(d, i) {
+    const bounds = this.getClientRects()[0];
+    const rawX = d3.mouse(this)[0];
+    const xpos = rawX + bounds.left + window.scrollX;
+    const rawY = d3.mouse(this)[1];
+    const mouseOffset = 30;
+    const ypos = rawY + bounds.top + window.scrollY - mouseOffset;
+    const text = getXTickLabels(focusX.invert(rawX - focusMargin.left));
+    timeHover.style.left = xpos + 'px';
+    timeHover.style.top = ypos + 'px';
+    timeHover.innerHTML = text;
+  }
+  function focusMouseOut(d, i) {
+    timeHover.remove();
+    timeHover = null;
+  }
+
 }