<commit_before>Map = (function ($) {
  var Estupros = {};
  var zoomScale = 2;
  var zoomedInto = undefined;

  function initialize(element, svgPath) {
    d3.xml(svgPath, 'image/svg+xml', function (xml) {
      element.html(xml.documentElement);

      _setupCallbacks();
      _loadEstupros();
    });
  };

  function _setupCallbacks() {
    d3.selectAll('path.str4')
      .on('mouseover', function () { if (!zoomedInto) { _toggleActive.call(this); }})
      .on('click', _zoom);

    d3.selectAll('path.str3')
      .on('mouseover', function () { if (zoomedInto) { _toggleActive.call(this); }})
      .on('click', _zoom);
  };

  function _loadEstupros() {
    $.getJSON('data/dados_estupros.json', function (data) {
      Estupros = data;
    });
  };

  function _toggleActive() {
    var d3Element = d3.select(this);

    d3.select('path.active').classed('active', false);
    d3Element.classed('active', true);

    _showInfo(d3Element.attr('id').replace(/.*_/, ''));
  };

  function _zoom() {
    var id = d3.select(this).attr('id'),
        element = document.getElementById(id),
        svgId = d3.select('svg').attr('id'),
        svg = document.getElementById(svgId),
        viewBox;

    if (zoomedInto === this) {
      viewBox = _noZoomViewBox(svg, zoomScale);
      zoomedInto = undefined;
      d3.selectAll('path.inactive').classed('inactive', false);
    } else {
      if (zoomedInto) {
        viewBox = _centeredViewBox(element, svg);
      } else {
        viewBox = _centeredViewBoxWithZoom(element, svg);
      }
      d3.selectAll('path.str4').classed('inactive', true);
      zoomedInto = this;
    }

    d3.select(svg).transition().attr('viewBox', viewBox);
    d3.select('path.active').classed('active', false);
  }

  function _noZoomViewBox(svg) {
    var viewBox = d3.select(svg).attr('viewBox').split(' ');

    viewBox[0] = viewBox[1] = 0;
    viewBox[2] *= zoomScale;
    viewBox[3] *= zoomScale;

    return viewBox.join(' ');
  }

  function _centeredViewBoxWithZoom(element, svg) {
    var viewBox = _centeredViewBox(element, svg).split(' ');

    viewBox[2] /= zoomScale;
    viewBox[3] /= zoomScale;

    return viewBox.join(' ');
  }

  function _centeredViewBox(element, svg) {
    var elementMiddle = _getMiddlePoint(element),
        svgMiddle = _getMiddlePoint(svg),
        viewBox = d3.select(svg).attr('viewBox').split(' ');

    viewBox[0] = (elementMiddle.x - svgMiddle.x/zoomScale);
    viewBox[1] = (elementMiddle.y - svgMiddle.y/zoomScale);

    return viewBox.join(' ');
  }

  function _getMiddlePoint(element) {
    var bbox = element.getBBox();

    return { x: bbox.x + bbox.width/2,
             y: bbox.y + bbox.height/2 };
  };

  function _showInfo(codigo) {
    var regiao       = Estupros[codigo];
    if (!regiao) { return; }
    var nome_regiao     = "<h3>"+regiao.nome+"</h3>";
    var media_vitima    = "<p class='victim'>Média de idade das vítimas: <br><em>"+regiao.media_idade_vitima+"</em></p>";
    var media_autor     = "<p class='author'>Média de idade dos autores: <br><em>"+regiao.media_idade_autor+"</em></p>";
    var ocorrencias     = "<p>Número de ocorrências na região: <br><em>"+_formatNumber(regiao.ocorrencias)+"</em></p>";
    var populacao       = "<p>População na região: <br><em>"+_formatNumber(regiao.populacao)+"</em></p>";
    $('#info').html(nome_regiao + media_vitima + media_autor + ocorrencias + populacao);
  };

  function _formatNumber(number) {
      return number.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
  };

  return {
    'initialize': initialize
  };
})(Zepto);

$(document).ready(function () {
  Map.initialize($('#map'), 'data/RioGrandedoSul_MesoMicroMunicip.svg');
});
<commit_msg>Selecionar regiões agora muda a URL.<commit_after>Map = (function ($) {
  var Estupros = {};
  var zoomScale = 2;
  var zoomedInto = undefined;

  function initialize(element, svgPath) {
    d3.xml(svgPath, 'image/svg+xml', function (xml) {
      element.html(xml.documentElement);

      _setupCallbacks();
      _loadEstupros(function () {
        var focusedElementId = window.location.hash.replace('#', '');
        _focusInto(focusedElementId);
      });
    });
  };

  function _setupCallbacks() {
    d3.selectAll('path.str4')
      .on('mouseover', function () { if (!zoomedInto) { _toggleActive.call(this); }})
      .on('click', _zoom);

    d3.selectAll('path.str3')
      .on('mouseover', function () { if (zoomedInto) { _toggleActive.call(this); }})
      .on('click', _zoom);
  };

  function _loadEstupros(callback) {
    $.getJSON('data/dados_estupros.json', function (data) {
      Estupros = data;
      callback();
    });
  };

  function _focusInto(id) {
    var element = document.getElementById(id),
        d3Element = d3.select(element);

    if (!element) { return; }

    d3Element.on('click').call(element);
    d3Element.on('mouseover').call(element);
  }

  function _toggleActive() {
    var d3Element = d3.select(this),
        id = d3Element.attr('id');

    d3.select('path.active').classed('active', false);
    d3Element.classed('active', true);

    _showInfo(id.replace(/.*_/, ''));
    window.location.hash = id;
  };

  function _zoom() {
    var id = d3.select(this).attr('id'),
        element = document.getElementById(id),
        svgId = d3.select('svg').attr('id'),
        svg = document.getElementById(svgId),
        viewBox;

    if (zoomedInto === this) {
      viewBox = _noZoomViewBox(svg, zoomScale);
      zoomedInto = undefined;
      d3.selectAll('path.inactive').classed('inactive', false);
    } else {
      if (zoomedInto) {
        viewBox = _centeredViewBox(element, svg);
      } else {
        viewBox = _centeredViewBoxWithZoom(element, svg);
      }
      d3.selectAll('path.str4').classed('inactive', true);
      zoomedInto = this;
    }

    d3.select(svg).transition().attr('viewBox', viewBox);
    d3.select('path.active').classed('active', false);
  }

  function _noZoomViewBox(svg) {
    var viewBox = d3.select(svg).attr('viewBox').split(' ');

    viewBox[0] = viewBox[1] = 0;
    viewBox[2] *= zoomScale;
    viewBox[3] *= zoomScale;

    return viewBox.join(' ');
  }

  function _centeredViewBoxWithZoom(element, svg) {
    var viewBox = _centeredViewBox(element, svg).split(' ');

    viewBox[2] /= zoomScale;
    viewBox[3] /= zoomScale;

    return viewBox.join(' ');
  }

  function _centeredViewBox(element, svg) {
    var elementMiddle = _getMiddlePoint(element),
        svgMiddle = _getMiddlePoint(svg),
        viewBox = d3.select(svg).attr('viewBox').split(' ');

    viewBox[0] = (elementMiddle.x - svgMiddle.x/zoomScale);
    viewBox[1] = (elementMiddle.y - svgMiddle.y/zoomScale);

    return viewBox.join(' ');
  }

  function _getMiddlePoint(element) {
    var bbox = element.getBBox();

    return { x: bbox.x + bbox.width/2,
             y: bbox.y + bbox.height/2 };
  };

  function _showInfo(codigo) {
    var regiao       = Estupros[codigo];
    if (!regiao) { return; }
    var nome_regiao     = "<h3>"+regiao.nome+"</h3>";
    var media_vitima    = "<p class='victim'>Média de idade das vítimas: <br><em>"+regiao.media_idade_vitima+"</em></p>";
    var media_autor     = "<p class='author'>Média de idade dos autores: <br><em>"+regiao.media_idade_autor+"</em></p>";
    var ocorrencias     = "<p>Número de ocorrências na região: <br><em>"+_formatNumber(regiao.ocorrencias)+"</em></p>";
    var populacao       = "<p>População na região: <br><em>"+_formatNumber(regiao.populacao)+"</em></p>";
    $('#info').html(nome_regiao + media_vitima + media_autor + ocorrencias + populacao);
  };

  function _formatNumber(number) {
      return number.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
  };

  return {
    'initialize': initialize
  };
})(Zepto);

$(document).ready(function () {
  Map.initialize($('#map'), 'data/RioGrandedoSul_MesoMicroMunicip.svg');
});

{'fraction_non_alphanumeric': 0.17969543147208122, 'fraction_numerical': 0.009137055837563452, 'mean_word_length': 3.2531030760928226, 'pattern_counts': {'":': 0, '<': 47, '<?xml version=': 0, '>': 47, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 8}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1601281', 'n_tokens_mistral': 2872, 'n_tokens_neox': 2764, 'n_words': 450}