text: import CLASS from './class';
  import { ChartInternal } from './core';
  
  ChartInternal.prototype.selectPoint = function (target, d, i) {
      var $$ = this, config = $$.config,
          cx = (config.axis_rotated ? $$.circleY : $$.circleX).bind($$),
          cy = (config.axis_rotated ? $$.circleX : $$.circleY).bind($$),
          r = $$.pointSelectR.bind($$);
      config.data_onselected.call($$.api, d, target.node());
      // add selected-circle on low layer g
      $$.main.select('.' + CLASS.selectedCircles + $$.getTargetSelectorSuffix(d.id)).selectAll('.' + CLASS.selectedCircle + '-' + i)
          .data([d])
          .enter().append('circle')
          .attr("class", function () { return $$.generateClass(CLASS.selectedCircle, i); })
          .attr("cx", cx)
          .attr("cy", cy)
          .attr("stroke", function () { return $$.color(d); })
          .attr("r", function (d) { return $$.pointSelectR(d) * 1.4; })
          .transition().duration(100)
          .attr("r", r);
  };
  ChartInternal.prototype.unselectPoint = function (target, d, i) {
      var $$ = this;
      $$.config.data_onunselected.call($$.api, d, target.node());
      // remove selected-circle from low layer g
      $$.main.select('.' + CLASS.selectedCircles + $$.getTargetSelectorSuffix(d.id)).selectAll('.' + CLASS.selectedCircle + '-' + i)
          .transition().duration(100).attr('r', 0)
          .remove();
  };
  ChartInternal.prototype.togglePoint = function (selected, target, d, i) {
      selected ? this.selectPoint(target, d, i) : this.unselectPoint(target, d, i);
  };
  ChartInternal.prototype.selectPath = function (target, d) {
      var $$ = this;
      $$.config.data_onselected.call($$, d, target.node());
      if ($$.config.interaction_brighten) {
          target.transition().duration(100)
              .style("fill", function () { return $$.d3.rgb($$.color(d)).brighter(0.75); });
      }
  };
  ChartInternal.prototype.unselectPath = function (target, d) {
      var $$ = this;
      $$.config.data_onunselected.call($$, d, target.node());
      if ($$.config.interaction_brighten) {
          target.transition().duration(100)
              .style("fill", function () { return $$.color(d); });
      }
  };
  ChartInternal.prototype.togglePath = function (selected, target, d, i) {
      selected ? this.selectPath(target, d, i) : this.unselectPath(target, d, i);
  };
  ChartInternal.prototype.getToggle = function (that, d) {
      var $$ = this, toggle;
      if (that.nodeName === 'circle') {
          if ($$.isStepType(d)) {
              // circle is hidden in step chart, so treat as within the click area
              toggle = function () {}; // TODO: how to select step chart?
          } else {
              toggle = $$.togglePoint;
          }
      }
      else if (that.nodeName === 'path') {
          toggle = $$.togglePath;
      }
      return toggle;
  };
  ChartInternal.prototype.toggleShape = function (that, d, i) {
      var $$ = this, d3 = $$.d3, config = $$.config,
          shape = d3.select(that), isSelected = shape.classed(CLASS.SELECTED),
          toggle = $$.getToggle(that, d).bind($$);
  
      if (config.data_selection_enabled && config.data_selection_isselectable(d)) {
          if (!config.data_selection_multiple) {
              $$.main.selectAll('.' + CLASS.shapes + (config.data_selection_grouped ? $$.getTargetSelectorSuffix(d.id) : "")).selectAll('.' + CLASS.shape).each(function (d, i) {
                  var shape = d3.select(this);
                  if (shape.classed(CLASS.SELECTED)) { toggle(false, shape.classed(CLASS.SELECTED, false), d, i); }
              });
          }
          shape.classed(CLASS.SELECTED, !isSelected);
          toggle(!isSelected, shape, d, i);
      }
  };
  