stats_server/views/statics/vendors/3d/d3.js
function brush(g) {
    var resizes = x && y ? ["n", "e", "s", "w", "nw", "ne", "se", "sw"]
        : x ? ["e", "w"]
        : y ? ["n", "s"]
        : [];

    g.each(function() {
      var g = d3.select(this).on("mousedown.brush", down),
          bg = g.selectAll(".background").data([,]),
          fg = g.selectAll(".extent").data([,]),
          tz = g.selectAll(".resize").data(resizes, String),
          e;

      // An invisible, mouseable area for starting a new brush.
      bg.enter().append("svg:rect")
          .attr("class", "background")
          .style("visibility", "hidden")
          .style("pointer-events", "all")
          .style("cursor", "crosshair");

      // The visible brush extent; style this as you like!
      fg.enter().append("svg:rect")
          .attr("class", "extent")
          .style("cursor", "move");

      // More invisible rects for resizing the extent.
      tz.enter().append("svg:rect")
          .attr("class", function(d) { return "resize " + d; })
          .attr("width", 6)
          .attr("height", 6)
          .style("visibility", "hidden")
          .style("pointer-events", brush.empty() ? "none" : "all")
          .style("cursor", function(d) { return d3_svg_brushCursor[d]; });

      // Remove any superfluous resizers.
      tz.exit().remove();

      // Initialize the background to fill the defined range.
      // If the range isn't defined, you can post-process.
      if (x) {
        e = d3_scaleExtent(x.range());
        bg.attr("x", e[0]).attr("width", e[1] - e[0]);
        d3_svg_brushRedrawX(g, extent);
      }
      if (y) {
        e = d3_scaleExtent(y.range());
        bg.attr("y", e[0]).attr("height", e[1] - e[0]);
        d3_svg_brushRedrawY(g, extent);
      }
    });
  }
function brush(g) {
    var resizes = x && y ? ["n", "e", "s", "w", "nw", "ne", "se", "sw"]
        : x ? ["e", "w"]
        : y ? ["n", "s"]
        : [];

    g.each(function() {
      var g = d3.select(this).on("mousedown.brush", down),
          bg = g.selectAll(".background").data([,]),
          fg = g.selectAll(".extent").data([,]),
          tz = g.selectAll(".resize").data(resizes, String),
          e;

      // An invisible, mouseable area for starting a new brush.
      bg.enter().append("svg:rect")
          .attr("class", "background")
          .style("visibility", "hidden")
          .style("pointer-events", "all")
          .style("cursor", "crosshair");

      // The visible brush extent; style this as you like!
      fg.enter().append("svg:rect")
          .attr("class", "extent")
          .style("cursor", "move");

      // More invisible rects for resizing the extent.
      tz.enter().append("svg:rect")
          .attr("class", function(d) { return "resize " + d; })
          .attr("width", 6)
          .attr("height", 6)
          .style("visibility", "hidden")
          .style("pointer-events", brush.empty() ? "none" : "all")
          .style("cursor", function(d) { return d3_svg_brushCursor[d]; });

      // Remove any superfluous resizers.
      tz.exit().remove();

      // Initialize the background to fill the defined range.
      // If the range isn't defined, you can post-process.
      if (x) {
        e = d3_scaleExtent(x.range());
        bg.attr("x", e[0]).attr("width", e[1] - e[0]);
        d3_svg_brushRedrawX(g, extent);
      }
      if (y) {
        e = d3_scaleExtent(y.range());
        bg.attr("y", e[0]).attr("height", e[1] - e[0]);
        d3_svg_brushRedrawY(g, extent);
      }
    });
  }
function brush ( g ) { var resizes = x && y ? [ "n" , "e" , "s" , "w" , "nw" , "ne" , "se" , "sw" ] : x ? [ "e" , "w" ] : y ? [ "n" , "s" ] : [ ] ; g . each ( function ( ) { var g = d3 . select ( this ) . on ( "mousedown.brush" , down ) , bg = g . selectAll ( ".background" ) . data ( [ , ] ) , fg = g . selectAll ( ".extent" ) . data ( [ , ] ) , tz = g . selectAll ( ".resize" ) . data ( resizes , String ) , e ; // An invisible, mouseable area for starting a new brush. bg . enter ( ) . append ( "svg:rect" ) . attr ( "class" , "background" ) . style ( "visibility" , "hidden" ) . style ( "pointer-events" , "all" ) . style ( "cursor" , "crosshair" ) ; // The visible brush extent; style this as you like! fg . enter ( ) . append ( "svg:rect" ) . attr ( "class" , "extent" ) . style ( "cursor" , "move" ) ; // More invisible rects for resizing the extent. tz . enter ( ) . append ( "svg:rect" ) . attr ( "class" , function ( d ) { return "resize " + d ; } ) . attr ( "width" , 6 ) . attr ( "height" , 6 ) . style ( "visibility" , "hidden" ) . style ( "pointer-events" , brush . empty ( ) ? "none" : "all" ) . style ( "cursor" , function ( d ) { return d3_svg_brushCursor [ d ] ; } ) ; // Remove any superfluous resizers. tz . exit ( ) . remove ( ) ; // Initialize the background to fill the defined range. // If the range isn't defined, you can post-process. if ( x ) { e = d3_scaleExtent ( x . range ( ) ) ; bg . attr ( "x" , e [ 0 ] ) . attr ( "width" , e [ 1 ] - e [ 0 ] ) ; d3_svg_brushRedrawX ( g , extent ) ; } if ( y ) { e = d3_scaleExtent ( y . range ( ) ) ; bg . attr ( "y" , e [ 0 ] ) . attr ( "height" , e [ 1 ] - e [ 0 ] ) ; d3_svg_brushRedrawY ( g , extent ) ; } } ) ; }
[x0, y0], [x1, y1]
[ x0 y0 ] [ x1 y1 ]