CI: Reorg screenshots.js for clarity

- rename list of browser info objects
- make `pinned` optional boolean key
- log sessionID
- log browser version, not just name and platform
- use info on the actual browser we're using as reported by Sauce, not
  our config info
- check for specifically Firefox and IE for single-screenshot case,
  rather than checking that it's not one of the ones that require
  multiple screenshots (wish this was feature-based, i.e. it would
  actually measure the returned screenshot and see if it's less than the
  viewport height)
- factor out capturing browser logs to a subsequent .then() after the
  if/else and the loop, rather than duplicating it (also, don't write
  logs at all if no logs returned (Edge/IE))
- loop starts out by taking screenshot and then scrolls, rather than
  starting by scrolling to 0
diff --git a/script/screenshots.js b/script/screenshots.js
index 57fa384..c26e743 100644
--- a/script/screenshots.js
+++ b/script/screenshots.js
@@ -23,180 +23,148 @@
   console.error('No $CIRCLE_ARTIFACTS found, for testing do something like `CIRCLE_ARTIFACTS=/tmp script/screenshots.js`');
   process.exit(1);
 }
-var allImgsDir = baseDir+'/imgs';
-fs.mkdirSync(allImgsDir);
+fs.mkdirSync(baseDir+'/imgs');
 
-var browserVersions = [
+var browsers = [
   {
-    'version': {
-      // Expecting IE 8
-      'browserName': 'Internet Explorer',
-      'platform': 'Windows XP'
+    config: {
+      browserName: 'Internet Explorer',
+      platform: 'Windows XP'
     },
-    'pinned': 'PINNED'
+    pinned: true // should be pinned to IE 8
   },
   {
-    'version': {
+    config: {
       // Expecting IE 11
-      'browserName': 'Internet Explorer',
-      'platform': 'Windows 7'
+      browserName: 'Internet Explorer',
+      platform: 'Windows 7'
     },
-    'pinned': 'PINNED'
+    pinned: true // should be pinned to IE 11
   },
   {
-    'version': {
-      'browserName': 'MicrosoftEdge',
-      'platform': 'Windows 10'
-    },
-    'pinned': 'EVERGREEN'
+    config: {
+      browserName: 'MicrosoftEdge',
+      platform: 'Windows 10'
+    }
   },
   {
-    'version': {
-      'browserName': 'Firefox',
-      'platform': 'OS X 10.11'
-    },
-    'pinned': 'EVERGREEN'
+    config: {
+      browserName: 'Firefox',
+      platform: 'OS X 10.11'
+    }
   },
   {
-    'version': {
-      'browserName': 'Safari',
-      'platform': 'OS X 10.11'
-    },
-    'pinned': 'EVERGREEN'
+    config: {
+      browserName: 'Safari',
+      platform: 'OS X 10.11'
+    }
   },
   {
-    'version': {
-      'browserName': 'Chrome',
-      'platform': 'OS X 10.11'
-    },
-    'pinned': 'EVERGREEN'
+    config: {
+      browserName: 'Chrome',
+      platform: 'OS X 10.11'
+    }
   },
   {
-    'version': {
-      'browserName': 'Firefox',
-      'platform': 'Linux'
-    },
-    'pinned': 'EVERGREEN'
-  },
+    config: {
+      browserName: 'Firefox',
+      platform: 'Linux'
+    }
+  }
 ];
 
 
-browserVersions.forEach(function(obj) {
-  var cfg = obj.version;
-  var browser = cfg.browserName.replace(/\s/g, '_');
-  var platform = cfg.platform.replace(/\s/g, '_');
-  var piecesDir = allImgsDir+'/'+obj.pinned+'_'+platform+'_'+browser;
-
-  cfg.build = build_name;
+browsers.forEach(function(browser) {
+  browser.config.build = build_name;
   var browserDriver = wd.promiseChainRemote('ondemand.saucelabs.com', 80, username, accessKey);
-  return browserDriver.init(cfg)
-  .then(function(_, capabilities) {
-    console.log(cfg.browserName,cfg.platform,'init');
+  return browserDriver.init(browser.config)
+  .then(function(sessionID, capabilities) {
+    var cfg = capabilities || browser.config;
+    console.log(cfg.browserName, cfg.version, cfg.platform, 'init', sessionID);
 
-    fs.mkdirSync(piecesDir);
+    var pinned = browser.pinned ? 'PINNED' : 'EVERGREEN';
+    var filename = [pinned, cfg.platform, cfg.browserName].join('_').replace(/ /g, '_');
 
-    return browserDriver;
-  })
-  .get(url)
-  .then(function() {
-    console.log(cfg.browserName,cfg.platform,'get');
-    return [browserDriver.safeExecute('document.documentElement.scrollHeight'),
-            browserDriver.safeExecute('document.documentElement.clientHeight')];
-  })
-  .spread(function(scrollHeight, viewportHeight) {
-    console.log(cfg.browserName, cfg.platform, 'get scrollHeight, clientHeight', scrollHeight, viewportHeight);
+    return browserDriver.get(url)
+    .then(function() {
+      console.log(cfg.browserName, cfg.version, cfg.platform, 'get');
+      return [browserDriver.safeExecute('document.documentElement.scrollHeight'),
+              browserDriver.safeExecute('document.documentElement.clientHeight')];
+    })
+    .spread(function(scrollHeight, viewportHeight) {
+      console.log(cfg.browserName, cfg.version,  cfg.platform, 'get scrollHeight, clientHeight', scrollHeight, viewportHeight);
 
-    // Firefox and Internet Explorer will take a screenshot of the entire webpage,
-    if (cfg.browserName != 'Safari' && cfg.browserName != 'Chrome' && cfg.browserName != 'MicrosoftEdge') {
-      // saves file in the file `piecesDir/browser_version_platform/*.png`
-      var filename = piecesDir+'/'+browser+'_'+platform+'.png';
-      console.log(cfg.browserName, cfg.platform, 'about to saveScreenshot');
-      return browserDriver.saveScreenshot(filename)
-      .then(willLog(cfg.browserName,cfg.platform,'saveScreenshot'))
-      .then(function() {
-        return browserDriver.log('browser')
-        .then(willLog(cfg.browserName,cfg.platform,'log'), function(err) {
-          // the Edge/Internet Explorer drivers don't support logs, but the others do
-          console.log(cfg.browserName, cfg.platform, 'Error fetching logs:', JSON.stringify(err, null, 2));
-          return [];
-        });
-      })
-      .then(function(logs) {
-        var logfile = baseDir+'/'+browser+'_'+platform+'.log'
-        return new Promise(function(resolve, reject) {
-          fs.writeFile(logfile,logs.join('\n'), function(err) {
-            if (err) return reject(err);
+      // the easy case: Firefox and IE return a screenshot of the entire webpage
+      if (cfg.browserName === 'Firefox' || cfg.browserName === 'Internet Explorer') {
+        return browserDriver.saveScreenshot(baseDir + '/imgs/' + filename + '.png')
+        .then(willLog(cfg.browserName, cfg.version, cfg.platform, 'saveScreenshot'))
+      // the hard case: for Chrome, Safari, and Edge, scroll through the page and
+      // take screenshots of each piece; circle.yml will stitch them together
+      } else {
+        var piecesDir = baseDir + '/imgs/' + filename + '/';
+        fs.mkdirSync(piecesDir);
 
-            return resolve(browserDriver.quit());
-          });
-        });
-      });
-    } else {
-      var scrollTop = 0;
+        var scrollTop = 0;
+        var index = 1;
+        return (function loop() {
+          return browserDriver.saveScreenshot(piecesDir + index + '.png')
+          .then(function() {
+            console.log(cfg.browserName, cfg.version, cfg.platform, 'saveScreenshot');
 
-      // loop generates the images. Firefox and Internet Explorer will take
-      // a screenshot of the entire webpage, but Opera, Safari, and Chrome
-      // do not. For those browsers we scroll through the page and take
-      // incremental screenshots.
-      return (function loop() {
-        var index = (scrollTop/viewportHeight) + 1;
-        // saves file in the file `piecesDir/browser_version_platform/#.png`
-        var filename = piecesDir+'/'+index+'.png';
+            scrollTop += viewportHeight;
+            index += 1;
 
-        // Use `window.scrollTo` because thats what jQuery does
-        // https://github.com/jquery/jquery/blob/1.12.3/src/offset.js#L186
-        // `window.scrollTo` was used instead of jQuery because jQuery was
-        // causing a stackoverflow in Safari.
-        return browserDriver.safeEval('window.scrollTo(0,'+scrollTop+');')
-        .then(willLog(cfg.browserName,cfg.platform,'safeEval 1'))
-        .saveScreenshot(filename)
-        .then(function() {
-          console.log(cfg.browserName,cfg.platform,'saveScreenshot');
+            // if the viewport hasn't passed the bottom edge of the page yet,
+            // scroll down and take another screenshot
+            if (scrollTop + viewportHeight <= scrollHeight) {
+              // Use `window.scrollTo` because thats what jQuery does:
+              //   https://github.com/jquery/jquery/blob/1.12.3/src/offset.js#L186
+              // Use `window.scrollTo` instead of jQuery because jQuery was
+              // causing a stackoverflow in Safari.
+              return browserDriver.safeEval('window.scrollTo(0,'+scrollTop+');')
+              .then(willLog(cfg.browserName, cfg.version, cfg.platform, 'scrollTo()'))
+              .then(loop);
+            } else { // we are past the bottom edge of the page, reduce window size to
+              // fit only the part of the page that hasn't been screenshotted.
 
-          scrollTop += viewportHeight;
-          if (scrollTop + viewportHeight > scrollHeight) {
-            return browserDriver.getWindowSize()
-            .then(function(size) {
-              console.log(cfg.browserName,cfg.platform,'getWindowSize');
-              // account for the viewport offset
-              var extra = size.height - viewportHeight;
-              return browserDriver.setWindowSize(size.width, (scrollHeight-scrollTop)+extra)
-              .then(willLog(cfg.browserName,cfg.platform,'setWindowSize'))
-              .safeEval('window.scrollTo(0,'+scrollHeight+');')
-              .then(function() {
-                console.log(cfg.browserName,cfg.platform,'safeEval 2');
+              // If there is no remaining part of the page, we're done, short-circuit
+              if (scrollTop === scrollHeight) return browserDriver;
 
-                index++;
-                var filename = piecesDir+'/'+index+'.png';
-                return browserDriver.saveScreenshot(filename)
-                .then(willLog(cfg.browserName,cfg.platform,'saveScreenshot Final'))
-                .then(function() {
-                  return browserDriver.log('browser')
-                  .then(willLog(cfg.browserName,cfg.platform,'log'), function(err) {
-                    // the Edge/Internet Explorer drivers don't support logs, but the others do
-                    console.log(cfg.browserName, cfg.platform, 'Error fetching logs:', JSON.stringify(err, null, 2));
-                    return [];
-                  });
-                })
-                .then(function(logs) {
-                  var logfile = baseDir+'/'+browser+'_'+platform+'.log'
-                  return new Promise(function(resolve, reject) {
-                    fs.writeFile(logfile,logs.join('\n'), function(err) {
-                      if (err) return reject(err);
-                      console.log(cfg.browserName,cfg.platform,'writeFile');
-
-                      return resolve(browserDriver.quit());
-                    });
-                  });
-                });
+              return browserDriver.getWindowSize()
+              .then(function(windowSize) {
+                console.log(cfg.browserName, cfg.version, cfg.platform, 'getWindowSize');
+                // window size is a little bigger than the viewport because of address
+                // bar and scrollbars and stuff
+                var windowPadding = windowSize.height - viewportHeight;
+                var newWindowHeight = scrollHeight - scrollTop + windowPadding;
+                return browserDriver.setWindowSize(windowSize.width, newWindowHeight)
+                .then(willLog(cfg.browserName, cfg.version, cfg.platform, 'setWindowSize'))
+                .safeEval('window.scrollTo(0,'+scrollHeight+');')
+                .then(willLog(cfg.browserName, cfg.version, cfg.platform, 'scrollTo() Final'))
+                .saveScreenshot(piecesDir + index + '.png')
+                .then(willLog(cfg.browserName, cfg.version, cfg.platform, 'saveScreenshot Final'));
               });
-            });
-          } else {
-            return loop();
-          }
-        });
-      })();
-    }
+            }
+          });
+        })();
+      }
+    })
+  })
+  .log('browser')
+  .then(function(logs) {
+    var logfile = baseDir+'/'+browserName+'_'+platform+'.log'
+    return new Promise(function(resolve, reject) {
+      fs.writeFile(logfile,logs.join('\n'), function(err) {
+        if (err) return reject(err);
+        console.log(cfg.browserName,cfg.platform,'writeFile');
+
+        return resolve(browserDriver.quit());
+      });
+    });
+  }, function(err) {
+    // the Edge/Internet Explorer drivers don't support logs, but the others do
+    console.log(cfg.browserName, cfg.platform, 'Error fetching logs:', JSON.stringify(err, null, 2));
+    return [];
   })
   .fail(function(err) {
     console.log('ERROR:', cfg.browserName, cfg.platform);