/**
 * @provides javelin-behavior-line-chart
 * @requires javelin-behavior
 *           javelin-dom
 *           javelin-vector
 *           phui-chart-css
 */

JX.behavior('line-chart', function(config) {

  function fn(n) {
    return n + '(' + JX.$A(arguments).slice(1).join(', ') + ')';
  }

  var h = JX.$(config.hardpoint);
  var d = JX.Vector.getDim(h);

  var padding = {
    top: 24,
    left: 48,
    bottom: 48,
    right: 32
  };

  var size = {
    frameWidth: d.x,
    frameHeight: d.y,
  };

  size.width = size.frameWidth - padding.left - padding.right;
  size.height = size.frameHeight - padding.top - padding.bottom;

  var x = d3.time.scale()
    .range([0, size.width]);

  var y = d3.scale.linear()
    .range([size.height, 0]);

  var xAxis = d3.svg.axis()
    .scale(x)
    .orient('bottom');

  var yAxis = d3.svg.axis()
    .scale(y)
    .orient('left');

  var svg = d3.select('#' + config.hardpoint).append('svg')
    .attr('width', size.frameWidth)
    .attr('height', size.frameHeight)
    .attr('class', 'chart');

  var g = svg.append('g')
      .attr('transform', fn('translate', padding.left, padding.top));

  g.append('rect')
      .attr('class', 'inner')
      .attr('width', size.width)
      .attr('height', size.height);

  var line = d3.svg.line()
    .x(function(d) { return x(d.date); })
    .y(function(d) { return y(d.count); });

  var data = [];
  for (var ii = 0; ii < config.x[0].length; ii++) {
    data.push(
      {
        date: new Date(config.x[0][ii] * 1000),
        count: +config.y[0][ii]
      });
  }

  x.domain(d3.extent(data, function(d) { return d.date; }));

  var yex = d3.extent(data, function(d) { return d.count; });
  yex[0] = 0;
  yex[1] = yex[1] * 1.05;
  y.domain(yex);

  g.append('path')
    .datum(data)
    .attr('class', 'line')
    .attr('d', line);

  g.append('g')
    .attr('class', 'x axis')
    .attr('transform', fn('translate', 0, size.height))
    .call(xAxis);

  g.append('g')
    .attr('class', 'y axis')
    .attr('transform', fn('translate', 0, 0))
    .call(yAxis);

  var div = d3.select('body')
    .append('div')
    .attr('class', 'chart-tooltip')
    .style('opacity', 0);

  g.selectAll('dot')
    .data(data)
    .enter()
    .append('circle')
    .attr('class', 'point')
    .attr('r', 3)
    .attr('cx', function(d) { return x(d.date); })
    .attr('cy', function(d) { return y(d.count); })
    .on('mouseover', function(d) {
      var d_y = d.date.getFullYear();
      var d_m = d.date.getMonth();
      var d_d = d.date.getDate();

      div
        .html(d_y + '-' + d_m + '-' + d_d + ': ' + d.count)
        .style('opacity', 0.9)
        .style('left', (d3.event.pageX - 60) + 'px')
        .style('top', (d3.event.pageY - 38) + 'px');
      })
    .on('mouseout', function() {
      div.style('opacity', 0);
    });

});