diff --git a/render.js b/render.js
index 9945178..b6c2e43 100644
--- a/render.js
+++ b/render.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
 
 var afterquery = (function() {
   // Mostly for konqueror compatibility
@@ -134,14 +134,16 @@
   }
 
 
-  var DATE_RE1 = RegExp('^(\\d{4})[-/](\\d{1,2})(?:[-/](\\d{1,2})(?:[T\\s](\\d{1,2}):(\\d\\d)(?::(\\d\\d))?)?)?$');
-  var DATE_RE2 = RegExp('^Date\\((\\d+),(\\d+),(\\d+)(?:,(\\d+),(\\d+)(?:,(\\d+)(?:,(\\d+))?)?)?\\)$');
+  var DATE_RE1 = RegExp('^(\\d{4})[-/](\\d{1,2})(?:[-/](\\d{1,2})' +
+                        '(?:[T\\s](\\d{1,2}):(\\d\\d)(?::(\\d\\d))?)?)?$');
+  var DATE_RE2 = RegExp('^Date\\((\\d+),(\\d+),(\\d+)' +
+                        '(?:,(\\d+),(\\d+)(?:,(\\d+)(?:,(\\d+))?)?)?\\)$');
   function myParseDate(s) {
     if (s == null) return s;
     if (s && s.getDate) return s;
     var g = DATE_RE1.exec(s) || DATE_RE2.exec(s);
     if (g) {
-      return new Date(g[1], g[2]-1, g[3] || 1,
+      return new Date(g[1], g[2] - 1, g[3] || 1,
                       g[4] || 0, g[5] || 0, g[6] || 0, g[7] || 0);
     }
     return NaN;
@@ -161,7 +163,7 @@
 
 
   function colNameToColNum(grid, colname) {
-    var keycol = colname=='*' ? 0 : grid.headers.indexOf(colname);
+    var keycol = (colname == '*') ? 0 : grid.headers.indexOf(colname);
     if (keycol < 0) {
       throw new Error('unknown column name "' + key + '"');
     }
@@ -231,7 +233,7 @@
     },
 
     last: function(l) {
-      return l.slice(l.length-1)[0];
+      return l.slice(l.length - 1)[0];
     },
 
     only: function(l) {
@@ -240,7 +242,7 @@
       } else if (l.length < 1) {
         return null;
       } else {
-        throw new Error('cell has more than one value: only(' + l + ')')
+        throw new Error('cell has more than one value: only(' + l + ')');
       }
     },
 
@@ -326,7 +328,7 @@
         }
         valuecols.push(colnum);
         valuefuncs.push(func);
-        outgrid.headers.push(field=='*' ? '_count' : ingrid.headers[colnum]);
+        outgrid.headers.push(field == '*' ? '_count' : ingrid.headers[colnum]);
         outgrid.types.push(func.return_type || ingrid.types[colnum]);
       }
     };
@@ -384,7 +386,8 @@
             // if there's only one valkey (the common case), don't include the
             // name of the old value column in the new column names; it's
             // just clutter.
-            var name = valkeys.length>1 ? xcolkey.join(' ') : colkey.join(' ');
+            var name = valkeys.length > 1 ?
+                xcolkey.join(' ') : colkey.join(' ');
             var colnum = keyToColNum(ingrid, valkeys[coli]);
             colkey_outcols[xcolkey] = outgrid.headers.length;
             valuecols[xcolkey] = colnum;
@@ -421,7 +424,7 @@
 
 
   function stringifiedCols(row, types) {
-    var out = []
+    var out = [];
     for (var coli in types) {
       if (types[coli] === T_DATE) {
         out.push(row[coli].strftime('%Y-%m-%d') || '');
@@ -457,7 +460,7 @@
         delete missing[key];
       }
       seen[key] = 1;
-    }
+    };
 
     for (var rowi in ingrid.data) {
       var row = ingrid.data[rowi];
@@ -714,7 +717,7 @@
         }
       }
       return 0;
-    }
+    };
     var outdata = grid.data.concat();
     outdata.sort(comparator);
     return { headers: grid.headers, data: outdata, types: grid.types };
@@ -756,7 +759,7 @@
 
 
   function doLimit(ingrid, limit) {
-    limit = parseInt(limit)
+    limit = parseInt(limit);
     if (ingrid.data.length > limit) {
       return {
           headers: ingrid.headers,
@@ -851,23 +854,23 @@
   function runqueue(after_each) {
     var step = function(i) {
       if (i < _queue.length) {
-        var el = _queue[i]
+        var el = _queue[i];
         var text = el[0], func = el[1], args = el.slice(2);
-        showstatus('Running step ' + (+i+1) + ' of ' + _queue.length + '...',
+        showstatus('Running step ' + (+i + 1) + ' of ' + _queue.length + '...',
                    text);
         setTimeout(function() {
           var start = Date.now();
           wrap(func).apply(null, args);
           var end = Date.now();
           if (after_each) {
-            after_each(i + 1, _queue.length, text, end-start);
+            after_each(i + 1, _queue.length, text, end - start);
           }
           step(i + 1);
         }, 0);
       } else {
         showstatus('');
       }
-    }
+    };
     step(0);
   }
 
@@ -877,7 +880,7 @@
     enqueue('parse', function() {
       console.debug('gotdata:', gotdata);
       grid = gridFromData(gotdata);
-      console.debug('grid:',  grid);
+      console.debug('grid:', grid);
     });
 
     var argi;
@@ -1057,7 +1060,7 @@
         err("<p><a href='/help'>here's the documentation</a>");
         throw e;
       }
-    }
+    };
     return f;
   }
 
@@ -1090,21 +1093,23 @@
 
     iframe.contentWindow.onerror = function(message, xurl, lineno) {
       error(null, message + ' url=' + xurl + ' line=' + lineno);
-    }
+    };
 
     iframe.contentWindow.loaded = function() {
       alert('loaded');
-    }
+    };
 
     iframe.contentDocument.write(
-        '<script async onerror="loaded" onload="loaded" src="' + encodeURI(url) + '"></script>');
+        '<script async onerror="loaded" onload="loaded" src="' +
+        encodeURI(url) +
+        '"></script>');
   }
 
 
   function _run(query) {
     var args = parseArgs(query);
     var url = args.get('url');
-    if (!url) throw new Error("Missing url= in query parameter");
+    if (!url) throw new Error('Missing url= in query parameter');
     showstatus('Loading <a href="' + encodeURI(url) + '">data</a>...');
     getUrlData(url, wrap(gotData, args), wrap(gotError, url));
     var editlink = args.get('editlink');
@@ -1117,5 +1122,5 @@
     parseArgs: parseArgs,
     trySplitOne: trySplitOne,
     render: wrap(_run)
-  }
+  };
 })();
