re-add the legend_div into the parent div after resize, otherwise it remains stuck...
[dygraphs.git] / plugins / legend.js
index bfc0595..d63f080 100644 (file)
@@ -8,7 +8,6 @@ Current bits of jankiness:
     2. dygraph.plotter_.area
 - Registers for a "predraw" event, which should be renamed.
 - I call calculateEmWidthInDiv more often than needed.
-- Why can't I call "this.deselect(e)" instead of "legend.deselect.call(this, e)"?
 
 */
 
@@ -38,8 +37,11 @@ legend.prototype.toString = function() {
  * - Reading your own options
  * - DOM manipulation
  * - Registering event listeners
+ *
+ * @param {Dygraph} g Graph instance.
+ * @return {object.<string, function(ev)>} Mapping of event names to callbacks.
  */
-legend.prototype.activate = function(g, r) {
+legend.prototype.activate = function(g) {
   var div;
   var divWidth = g.getOption('labelsDivWidth');
 
@@ -59,8 +61,9 @@ legend.prototype.activate = function(g, r) {
       "zIndex": 10,
       "width": divWidth + "px",
       "top": "0px",
-      "right": "2px",
+      "left": (g.size().width - divWidth - 2) + "px",
       "background": "white",
+      "lineHeight": "normal",
       "textAlign": "left",
       "overflow": "hidden"};
 
@@ -86,12 +89,13 @@ legend.prototype.activate = function(g, r) {
 
   this.legend_div_ = div;
 
-  r.addEventListener('select', legend.select);
-  r.addEventListener('deselect', legend.deselect);
-
-  // TODO(danvk): rethink the name "predraw" before we commit to it in any API.
-  r.addEventListener('predraw', legend.predraw);
-  r.addEventListener('drawChart', legend.drawChart);
+  return {
+    select: this.select,
+    deselect: this.deselect,
+    // TODO(danvk): rethink the name "predraw" before we commit to it in any API.
+    predraw: this.predraw,
+    drawChart: this.drawChart
+  };
 };
 
 // Needed for dashed lines.
@@ -104,7 +108,7 @@ var calculateEmWidthInDiv = function(div) {
   return oneEmWidth;
 };
 
-legend.select = function(e) {
+legend.prototype.select = function(e) {
   var xValue = e.selectedX;
   var points = e.selectedPoints;
 
@@ -116,15 +120,14 @@ legend.select = function(e) {
   this.legend_div_.innerHTML = html;
 };
 
-legend.deselect = function(e) {
+legend.prototype.deselect = function(e) {
   var oneEmWidth = calculateEmWidthInDiv(this.legend_div_);
   var html = generateLegendHTML(e.dygraph, undefined, undefined, oneEmWidth);
   this.legend_div_.innerHTML = html;
 };
 
-legend.drawChart = function(e) {
-  // TODO(danvk): why doesn't this.deselect(e) work here?
-  legend.deselect.call(this, e);
+legend.prototype.drawChart = function(e) {
+  this.deselect(e);
 }
 
 // Right edge should be flush with the right edge of the charting area (which
@@ -136,11 +139,12 @@ legend.drawChart = function(e) {
  * - its top edge is flush with the top edge of the charting area
  * @private
  */
-legend.predraw = function(e) {
+legend.prototype.predraw = function(e) {
   // Don't touch a user-specified labelsDiv.
   if (!this.is_generated_div_) return;
 
   // TODO(danvk): only use real APIs for this.
+  e.dygraph.graphDiv.appendChild(this.legend_div_);
   var area = e.dygraph.plotter_.area;
   this.legend_div_.style.left = area.x + area.w - e.dygraph.getOption("labelsDivWidth") - 1 + "px";
   this.legend_div_.style.top = area.y + "px";