updated check for empty string
[dygraphs.git] / plugins / legend.js
index bfc0595..5f7ac7e 100644 (file)
@@ -1,3 +1,9 @@
+/**
+ * @license
+ * Copyright 2012 Dan Vanderkam (danvdk@gmail.com)
+ * MIT-licensed (http://opensource.org/licenses/MIT)
+ */
+
 Dygraph.Plugins.Legend = (function() {
 
 /*
@@ -8,7 +14,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 +43,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 +67,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 +95,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 +114,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 +126,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 +145,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";
@@ -199,7 +209,10 @@ var generateLegendHTML = function(g, x, sel_points, oneEmWidth) {
   // TODO(danvk): remove this use of a private API
   var xOptView = g.optionsViewForAxis_('x');
   var xvf = xOptView('valueFormatter');
-  html = xvf(x, xOptView, labels[0], g) + ":";
+  html = xvf(x, xOptView, labels[0], g);
+  if(html !== '') {
+       html += ':';
+  }
 
   var yOptViews = [];
   var num_axes = g.numAxes();