text: 'use strict';
  
  var subTypes = require('../scatter/subtypes');
  var styleTextSelection = require('./edit_style').styleTextSelection;
  
  module.exports = function select(searchInfo, selectionTester) {
      var cd = searchInfo.cd;
      var selection = [];
      var trace = cd[0].trace;
      var stash = cd[0].t;
      var len = trace._length;
      var x = stash.x;
      var y = stash.y;
      var scene = stash._scene;
      var index = stash.index;
  
      if(!scene) return selection;
  
      var hasText = subTypes.hasText(trace);
      var hasMarkers = subTypes.hasMarkers(trace);
      var hasOnlyLines = !hasMarkers && !hasText;
  
      if(trace.visible !== true || hasOnlyLines) return selection;
  
      var els = [];
      var unels = [];
  
      // degenerate polygon does not enable selection
      // filter out points by visible scatter ones
      if(selectionTester !== false && !selectionTester.degenerate) {
          for(var i = 0; i < len; i++) {
              if(selectionTester.contains([stash.xpx[i], stash.ypx[i]], false, i, searchInfo)) {
                  els.push(i);
                  selection.push({
                      pointNumber: i,
                      x: x[i],
                      y: y[i]
                  });
              } else {
                  unels.push(i);
              }
          }
      }
  
      if(hasMarkers) {
          var scatter2d = scene.scatter2d;
  
          if(!els.length && !unels.length) {
              // reset to base styles when clearing
              var baseOpts = new Array(scene.count);
              baseOpts[index] = scene.markerOptions[index];
              scatter2d.update.apply(scatter2d, baseOpts);
          } else if(!scene.selectBatch[index].length && !scene.unselectBatch[index].length) {
              // set unselected styles on 'context' canvas (if not done already)
              var unselOpts = new Array(scene.count);
              unselOpts[index] = scene.markerUnselectedOptions[index];
              scatter2d.update.apply(scatter2d, unselOpts);
          }
      }
  
      scene.selectBatch[index] = els;
      scene.unselectBatch[index] = unels;
  
      if(hasText) {
          styleTextSelection(cd);
      }
  
      return selection;
  };
  