Add support for dygraph and dygraph+error charts.
diff --git a/app.yaml b/app.yaml
index 0063637..d28bc3c 100644
--- a/app.yaml
+++ b/app.yaml
@@ -14,10 +14,10 @@
 - url: /help
   static_files: help.html
   upload: help.html
-- url: /render.js
-  static_files: render.js
-  upload: render.js
-- url: /(.*)\.json
+- url: /([^/]*).js
+  static_files: \1.js
+  upload: (.*).js
+- url: /([^/]*)\.json
   static_files: \1.json
   mime_type: text/plain
   upload: (.*\.json)
diff --git a/render.html b/render.html
index b318326..978739c 100644
--- a/render.html
+++ b/render.html
@@ -12,7 +12,8 @@
   }
   </style>
   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
-  <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+  <script src="dygraph-combined.js"></script>
+  <script src="https://www.google.com/jsapi"></script>
   <script>
   google.load('visualization', '1.0', {
     packages: ['table', 'corechart', 'treemap', 'annotatedtimeline']
diff --git a/render.js b/render.js
index 0f55014..d585072 100644
--- a/render.js
+++ b/render.js
@@ -572,20 +572,18 @@
     }
   }
   var chartops = args.get('chart');
+  var t;
   if (chartops) {
     grid = fillNullsWithZero(grid);
-    var datatable = dataToGvizTable(grid);
     var el = document.getElementById('vizchart');
     $(el).height(window.innerHeight).width(window.innerWidth);
     var options = {};
     if (args.get('title')) {
       options.title = args.get('title');
     }
-    var t;
     if (chartops == 'stackedarea' || chartops == 'stacked') {
       t = new google.visualization.AreaChart(el);
       options.isStacked = true;
-      t.draw(datatable, options);
     } else if (chartops == 'column') {
       t = new google.visualization.ColumnChart(el);
     } else if (chartops == 'bar') {
@@ -596,17 +594,22 @@
       t = new google.visualization.CandlestickChart(el);
     } else if (chartops == 'timeline') {
       t = new google.visualization.AnnotatedTimeLine(el);
+    } else if (chartops == 'dygraph' || chartops == 'dygraph+errors') {
+      t = new Dygraph.GVizChart(el);
+      options.showRoller = true;
+      if (chartops == 'dygraph+errors') {
+	options.errorBars = true;
+      }
     } else {
       // default to a line chart if unrecognized type
       t = new google.visualization.LineChart(el);
     }
-    t.draw(datatable, options);
   } else {
-    var datatable = dataToGvizTable(grid);
     var el = document.getElementById('viztable');
-    var t = new google.visualization.Table(el);
-    t.draw(datatable, {});
+    t = new google.visualization.Table(el);
   }
+  var datatable = dataToGvizTable(grid);
+  t.draw(datatable, options);
 }