{"version":3,"file":"bundle.js","sources":["node_modules/browserify/node_modules/browser-pack/_prelude.js","src/main.js","src/timeline.js","src/util/configurable.js","src/eventLine.js","src/delimiter.js","src/filterData.js"],"names":["timeline","require","define","amd","d3","chart","window","module","exports","configurable","eventLine","delimiter","defaultConfig","start","Date","end","width","padding","top","left","bottom","right","locale","axisFormat","tickFormat","d","getMilliseconds","getSeconds","getMinutes","getHours","getDay","getDate","getMonth","eventHover","hasDelimiter","hasTopAxis","hasBottomAxis","data","length","eventColor","config","eventDropGraph","selection","each","updateZoom","event","sourceEvent","toString","zoom","translate","scale","redraw","redrawDelimiter","svg","select","remove","append","classed","attr","graphWidth","call","xScale","dateFormat","timeFormat","time","format","drawXAxis","where","tickFormatData","forEach","item","tick","slice","push","multi","xAxis","axis","orient","y","parseInt","graphHeight","graph","size","height","graphBody","lines","selectAll","enter","yScale","name","style","exit","behavior","center","on","this","yDomain","yRange","index","domain","range","yAxisEl","yTick","curx","cury","zoomRect","clientX","clientY","el","document","elementFromPoint","tagName","x","ordinal","key","targetFunction","listeners","value","arguments","hasOwnProperty","filterData","text","count","dates","circle","limits","filteredData","boundary","min","max","datum"],"mappings":"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","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})","\"use strict\";\n/* global require, define, module */\n\nvar timeline = require('./timeline');\n\nif (typeof define === \"function\" && define.amd) {\n  define('d3.chart.timeline', [\"d3\"], function (d3) {\n    d3.chart = d3.chart || {};\n    d3.chart.timeline = timeline(d3);\n  });\n} else if (window) {\n  window.d3.chart = window.d3.chart || {};\n  window.d3.chart.timeline = timeline(window.d3);\n} else {\n  module.exports = timeline;\n}\n","\"use strict\";\n/* global require, module */\n\nvar configurable = require('./util/configurable');\nvar eventLine = require('./eventLine');\nvar delimiter = require('./delimiter');\n\nmodule.exports = function (d3) {\n\n  var defaultConfig = {\n    start: new Date(0),\n    end: new Date(),\n    width: 1000,\n    padding: {\n      top: 60,\n      left: 200,\n      bottom: 40,\n      right: 50\n    },\n    locale: null,\n    axisFormat: null,\n    tickFormat: [\n        [\".%L\", function(d) { return d.getMilliseconds(); }],\n        [\":%S\", function(d) { return d.getSeconds(); }],\n        [\"%I:%M\", function(d) { return d.getMinutes(); }],\n        [\"%I %p\", function(d) { return d.getHours(); }],\n        [\"%a %d\", function(d) { return d.getDay() && d.getDate() != 1; }],\n        [\"%b %d\", function(d) { return d.getDate() != 1; }],\n        [\"%B\", function(d) { return d.getMonth(); }],\n        [\"%Y\", function() { return true; }]\n    ],\n    eventHover: null,\n    hasDelimiter: true,\n    hasTopAxis: true,\n    hasBottomAxis: function (data) {\n      return data.length >= 10;\n    },\n    eventColor: 'black'\n  };\n\n  return function timeline(config) {\n    var xScale = d3.time.scale();\n    var yScale = d3.scale.ordinal();\n    config = config || {};\n    for (var key in defaultConfig) {\n      config[key] = config[key] || defaultConfig[key];\n    }\n\n    function eventDropGraph(selection) {\n      selection.each(function (data) {\n        var zoom = d3.behavior.zoom().center(null).on(\"zoom\", updateZoom);\n\n        if (config.hasDelimiter) {\n          zoom.on(\"zoomend\", redrawDelimiter);\n        }\n        var graphWidth = config.width - config.padding.right - config.padding.left;\n        var graphHeight = data.length * 40;\n        var height = graphHeight + config.padding.top + config.padding.bottom;\n\n        d3.select(this).select('svg').remove();\n\n        var svg = d3.select(this)\n          .append('svg')\n          .attr('width', config.width)\n          .attr('height', height)\n        ;\n\n        var graph = svg.append('g')\n          .attr('transform', 'translate(0, 25)');\n\n        var yDomain = [];\n        var yRange = [];\n\n        data.forEach(function (event, index) {\n          yDomain.push(event.name);\n          yRange.push(index * 40);\n        });\n\n        yScale.domain(yDomain).range(yRange);\n\n        var yAxisEl = graph.append('g')\n          .classed('y-axis', true)\n          .attr('transform', 'translate(0, 60)');\n\n        var yTick = yAxisEl.append('g').selectAll('g').data(yDomain);\n\n        yTick.enter()\n          .append('g')\n          .attr('transform', function(d) {\n            return 'translate(0, ' + yScale(d) + ')';\n          })\n          .append('line')\n          .classed('y-tick', true)\n          .attr('x1', config.padding.left)\n          .attr('x2', config.padding.left + graphWidth);\n\n        yTick.exit().remove();\n\n        var curx, cury;\n        var zoomRect = svg\n          .append('rect')\n          .call(zoom)\n          .classed('zoom', true)\n          .attr('width', graphWidth)\n          .attr('height', height )\n          .attr('transform', 'translate(' + config.padding.left + ', 35)')\n        ;\n\n        if (typeof config.eventHover === 'function') {\n          zoomRect.on('mousemove', function(d, e) {\n            var event = d3.event;\n            if (curx == event.clientX && cury == event.clientY) return;\n            curx = event.clientX;\n            cury = event.clientY;\n            zoomRect.attr('display', 'none');\n            var el = document.elementFromPoint(d3.event.clientX, d3.event.clientY);\n            zoomRect.attr('display', 'block');\n            if (el.tagName !== 'circle') return;\n            config.eventHover(el);\n          });\n        }\n\n        xScale.range([0, graphWidth]).domain([config.start, config.end]);\n\n        zoom.x(xScale);\n\n        function updateZoom() {\n          if (d3.event.sourceEvent.toString() === '[object MouseEvent]') {\n            zoom.translate([d3.event.translate[0], 0]);\n          }\n\n          if (d3.event.sourceEvent.toString() === '[object WheelEvent]') {\n            zoom.scale(d3.event.scale);\n          }\n\n          redraw();\n        }\n\n        function redrawDelimiter() {\n          svg.select('.delimiter').remove();\n          var delimiterEl = svg\n            .append('g')\n            .classed('delimiter', true)\n            .attr('width', graphWidth)\n            .attr('height', 10)\n            .attr('transform', 'translate(' + config.padding.left + ', ' + (config.padding.top - 45) + ')')\n            .call(delimiter({\n              xScale: xScale,\n              dateFormat: config.locale ? config.locale.timeFormat(\"%d %B %Y\") : d3.time.format(\"%d %B %Y\")\n            }))\n          ;\n        }\n\n        function drawXAxis(where) {\n\n          // copy config.tickFormat because d3 format.multi edit its given tickFormat data\n          var tickFormatData = [];\n\n          config.tickFormat.forEach(function (item) {\n            var tick = item.slice(0);\n            tickFormatData.push(tick);\n          });\n\n          var tickFormat = config.locale ? config.locale.timeFormat.multi(tickFormatData) : d3.time.format.multi(tickFormatData);\n          var xAxis = d3.svg.axis()\n            .scale(xScale)\n            .orient(where)\n            .tickFormat(tickFormat);\n          ;\n\n          if (typeof config.axisFormat === 'function') {\n            config.axisFormat(xAxis);\n          }\n\n          var y = (where == 'bottom' ? parseInt(graphHeight) : 0) + config.padding.top - 40;\n\n          graph.select('.x-axis.' + where).remove();\n          var xAxisEl = graph\n            .append('g')\n            .classed('x-axis', true)\n            .classed(where, true)\n            .attr('transform', 'translate(' + config.padding.left + ', ' + y + ')')\n            .call(xAxis)\n          ;\n        }\n\n        function redraw() {\n\n          var hasTopAxis = typeof config.hasTopAxis === 'function' ? config.hasTopAxis(data) : config.hasTopAxis;\n          if (hasTopAxis) {\n            drawXAxis('top');\n          }\n\n          var hasBottomAxis = typeof config.hasBottomAxis === 'function' ? config.hasBottomAxis(data) : config.hasBottomAxis;\n          if (hasBottomAxis) {\n            drawXAxis('bottom');\n          }\n\n          zoom.size([config.width, height]);\n\n          graph.select('.graph-body').remove();\n          var graphBody = graph\n            .append('g')\n            .classed('graph-body', true)\n            .attr('transform', 'translate(' + config.padding.left + ', ' + (config.padding.top - 15) + ')');\n\n          var lines = graphBody.selectAll('g').data(data);\n\n          lines.enter()\n            .append('g')\n            .classed('line', true)\n            .attr('transform', function(d) {\n              return 'translate(0,' + yScale(d.name) + ')';\n            })\n            .style('fill', config.eventColor)\n            .call(eventLine({ xScale: xScale }))\n          ;\n\n          lines.exit().remove();\n        }\n\n        redraw();\n        if (config.hasDelimiter) {\n          redrawDelimiter();\n        }\n      });\n    }\n\n    configurable(eventDropGraph, config);\n\n    return eventDropGraph;\n  };\n};\n","module.exports = function configurable(targetFunction, config, listeners) {\n  listeners = listeners || {};\n  for (var item in config) {\n    (function(item) {\n      targetFunction[item] = function(value) {\n        if (!arguments.length) return config[item];\n        config[item] = value;\n        if (listeners.hasOwnProperty(item)) {\n          listeners[item](value);\n        }\n\n        return targetFunction;\n      };\n    })(item); // for doesn't create a closure, forcing it\n  }\n};\n","\"use strict\";\n/* global require, module, d3 */\n\nvar configurable = require('./util/configurable');\nvar filterData = require('./filterData');\n\nvar defaultConfig = {\n  xScale: null\n};\n\nmodule.exports = function (config) {\n\n  config = config || {};\n  for (var key in defaultConfig) {\n    config[key] = config[key] || defaultConfig[key];\n  }\n\n  var eventLine = function eventLine(selection) {\n    selection.each(function (data) {\n      d3.select(this).selectAll('text').remove();\n\n      d3.select(this).append('text')\n        .text(function(d) {\n          var count = filterData(d.dates, config.xScale).length;\n          return d.name + (count > 0 ? ' (' + count + ')' : '');\n        })\n        .attr('text-anchor', 'end')\n        .attr('transform', 'translate(-20)')\n        .style('fill', 'black')\n      ;\n\n      d3.select(this).selectAll('circle').remove();\n\n      var circle = d3.select(this).selectAll('circle')\n        .data(function(d) {\n          // filter value outside of range\n          return filterData(d.dates, config.xScale);\n        });\n\n      circle.enter()\n        .append('circle')\n        .attr('cx', function(d) {\n          return config.xScale(d);\n        })\n        .attr('cy', -5)\n        .attr('r', 10)\n      ;\n\n      circle.exit().remove();\n\n    });\n  };\n\n  configurable(eventLine, config);\n\n  return eventLine;\n};\n","\"use strict\";\n/* global require, module, d3 */\n\nvar configurable = require('./util/configurable');\n\nvar defaultConfig = {\n  xScale: null,\n  dateFormat: null\n};\n\nmodule.exports = function (config) {\n\n  config = config || {};\n  for (var key in defaultConfig) {\n    config[key] = config[key] || defaultConfig[key];\n  }\n\n  function delimiter(selection) {\n    selection.each(function (data) {\n      d3.select(this).selectAll('text').remove();\n\n      var limits = config.xScale.domain();\n\n      d3.select(this).append('text')\n        .text(function () {\n\n          return config.dateFormat(limits[0]);\n        })\n        .classed('start', true)\n      ;\n\n      d3.select(this).append('text')\n        .text(function () {\n\n          return config.dateFormat(limits[1]);\n        })\n        .attr('text-anchor', 'end')\n        .attr('transform', 'translate(' + config.xScale.range()[1] + ')')\n        .classed('end', true)\n      ;\n    });\n  }\n\n  configurable(delimiter, config);\n\n  return delimiter;\n};\n","\"use strict\";\n/* global module */\n\nmodule.exports = function filterDate(data, scale) {\n  data = data || [];\n  var filteredData = [];\n  var boundary = scale.range();\n  var min = boundary[0];\n  var max = boundary[1];\n  data.forEach(function (datum) {\n    var value = scale(datum);\n    if (value < min || value > max) {\n      return;\n    }\n    filteredData.push(datum);\n  });\n\n  return filteredData;\n};\n"]}
