Adding touchOVER check to the pageX/Y
[dygraphs.git] / experimental / palette / multi-palette.js
index 4497121..ee01a4c 100644 (file)
@@ -33,7 +33,6 @@ function MultiPalette() {
   this.onchange = function() {};
 }
 
-
 MultiPalette.optionSetValues = {
   "global": "global",
   "x": "x axis",
@@ -48,14 +47,14 @@ MultiPalette.prototype.create = function(parentElement) {
   var header = $("<div>").addClass("header").appendTo(this.root);
   // Selector for series and axes.
   var selectorRow = $("<div>").appendTo(header);
-  var optionSelector = $("<select>")
+  this.optionSelector = $("<select>")
       .change(function(x) {
-        self.activate(optionSelector.val());
+        self.activate(self.optionSelector.val());
       });
 
   selectorRow
       .append($("<span>").text("Option Set:"))
-      .append(optionSelector)
+      .append(this.optionSelector)
        .append($("<span>")
           .append($("<a>")
               .addClass("link")
@@ -86,77 +85,107 @@ MultiPalette.prototype.create = function(parentElement) {
               .click(function() { self.onchange(); }))));
 
   $.each(MultiPalette.optionSetValues, function(key, value) {
-     $(optionSelector)
-         .append($("<option></option>")
-         .attr("value", key)
-         .text(value)); 
-      var palette = new Palette(key);
-      palette.create(self.root);
-      palette.root.style.display = "none";
-      palette.onchange = function() {
-        self.onchange();
-      };
-      self.palettes[key] = palette;
+    self.createPalette_(key, key, value);
   });
 
   this.activate("global");
 }
 
+MultiPalette.prototype.createPalette_ = function(key, scope, value) {
+   this.optionSelector
+     .append($("<option></option>")
+     .attr("value", key)
+     .text(value)); 
+  var palette = new Palette(scope);
+  palette.create(this.root);
+  palette.root.hide();
+  var self = this;
+  palette.onchange = function() {
+    self.onchange();
+  };
+  this.palettes[key] = palette;
+}
+
+MultiPalette.prototype.setSeries = function(labels) {
+  for (var idx = 1; idx < labels.length; idx++) {
+    this.conditionallyAddSingleSeries_(labels[idx]);
+  }
+}
+
+MultiPalette.prototype.conditionallyAddSingleSeries_ = function(series) {
+  var key = "series:" + series;
+  if (!this.palettes.hasOwnProperty(key)) {
+    this.createPalette_(key, "series", series + " (series)");
+  }
+}
+
 MultiPalette.prototype.activate = function(key) {
   if (this.activePalette) {
-    this.activePalette.root.style.display = "none";
+    this.activePalette.root.hide();
   }
   this.activePalette = this.palettes[key];
-  this.activePalette.root.style.display = "block";
+  this.activePalette.root.show();
 }
 
 MultiPalette.prototype.showHash = function() {
   var hash = this.read();
   var textarea = new TextArea();
-  textarea.cancel.style.display = "none";
-
-  /*
-   * JSON.stringify isn't built to be nice to functions. The following fixes
-   * this.
-   *
-   * First, val.toString only does part of the work, turning it into
-   * "function () {\n  alert(\"p-click!\");\n}",
-   *
-   * {start,end}Marker make the surrounding quotes easy to find, and then
-   * remove them. It also converts the instances of \n and \" so the
-   * result looks like:
-   * function () {
-   *   alert("p-click!");
-   * }",
-   */
-  var startMarker = "<~%!<";
-  var endMarker = ">!%~>";
-  var replacer = function(key, val) {
-    if (typeof val === 'function') {
-      return startMarker + val.toString() + endMarker;
-    }
-    return val;
-  }
-  var text = JSON.stringify(hash, replacer, 2);
-  console.log(text);
-  while(true) {
-    var start = text.indexOf(startMarker);
-    var end = text.indexOf(endMarker); 
-    if (start == -1) {
-      break;
-    }
-    var substring = text.substring(start + startMarker.length, end);
-    while(substring.indexOf("\\n") >= 0) {
-      substring = substring.replace("\\n", "\n");
+
+  var hashToString = function(hash) {
+    /*
+     * JSON.stringify isn't built to be nice to functions. The following fixes
+     * this.
+     *
+     * First, val.toString only does part of the work, turning it into
+     * "function () {\n  alert(\"p-click!\");\n}",
+     *
+     * {start,end}Marker make the surrounding quotes easy to find, and then
+     * remove them. It also converts the instances of \n and \" so the
+     * result looks like:
+     * function () {
+     *   alert("p-click!");
+     * }",
+     */
+    var startMarker = "<~%!<";
+    var endMarker = ">!%~>";
+    var replacer = function(key, val) {
+      if (typeof val === 'function') {
+        return startMarker + val.toString() + endMarker;
+      }
+      return val;
     }
-    while(substring.indexOf("\\\"") >= 0) {
-      substring = substring.replace("\\\"", "\"");
+    var text = JSON.stringify(hash, replacer, 2);
+    while(true) {
+      var start = text.indexOf(startMarker);
+      var end = text.indexOf(endMarker); 
+      if (start == -1) {
+        break;
+      }
+      var substring = text.substring(start + startMarker.length, end);
+      while(substring.indexOf("\\n") >= 0) {
+        substring = substring.replace("\\n", "\n");
+      }
+      while(substring.indexOf("\\\"") >= 0) {
+        substring = substring.replace("\\\"", "\"");
+      }
+      text = text.substring(0, start - 1)
+          + substring
+          + text.substring(end + endMarker.length + 1);
     }
-    text = text.substring(0, start - 1)
-        + substring
-        + text.substring(end + endMarker.length + 1);
+    return text;
   }
+
+  var text = hashToString(hash);
+  var self = this;
   textarea.show("options", text);
+  textarea.okCallback = function(value) {
+    if (value != text) {
+      var newHash;
+      eval("newHash = " + value + ";");
+      self.write(newHash);
+      self.onchange();
+    }
+  };
 }
 
 /**
@@ -165,19 +194,38 @@ MultiPalette.prototype.showHash = function() {
 MultiPalette.prototype.read = function() {
   var results = this.palettes.global.read();
   results.axes = {};
+  results.series = {};
   var clearIfEmpty = function(hash, key) {
     var val = hash[key];
     if ($.isEmptyObject(val)) {
       delete hash[key];
     }
   }
+  var clearEmptyChildren = function(hash) {
+    for (var key in hash) {
+      if (hash.hasOwnProperty(key)) {
+        clearIfEmpty(hash, key);
+      }
+    }
+  }
+
   results.axes.x = this.palettes.x.read();
   results.axes.y = this.palettes.y.read();
   results.axes.y2 = this.palettes.y2.read();
-  clearIfEmpty(results.axes, "x");
-  clearIfEmpty(results.axes, "y");
-  clearIfEmpty(results.axes, "y2");
+
+  clearEmptyChildren(results.axes);
   clearIfEmpty(results, "axes");
+
+  for (var key in this.palettes) {
+    if (key.indexOf("series:") == 0) {
+      var series = key.substring("series:".length);
+      results.series[series] = this.palettes[key].read();
+    }
+  }
+
+  clearEmptyChildren(results.series);
+  clearIfEmpty(results, "series");
+
   return results;
 }
 
@@ -192,4 +240,13 @@ MultiPalette.prototype.write = function(hash) {
     this.palettes.y.write(axes["y"]);
     this.palettes.y2.write(axes["y2"]);
   }
+
+  if (hash.hasOwnProperty("series")) {
+    for (var key in hash.series) {
+      if (hash.series.hasOwnProperty(key)) {
+        this.conditionallyAddSingleSeries_(key);
+        this.palettes["series:" + key].write(hash.series[key]);
+      }
+    }
+  }  
 }