function dateRangePath() { var orientation = 'horizontal'; var cellSize = 10; var offset = null; var closed = true; function path(t0, t1) { if (offset) t1 = offset(t0); var d0 = t0.getDay(); var d1 = t1.getDay(); var w0 = weekOfYear(t0); var w1 = weekOfYear(t1); var context = d3.path(); if (orientation === 'horizontal') { if (closed) { context.moveTo((w0 + 1) * cellSize, d0 * cellSize); context.lineTo(w0 * cellSize, d0 * cellSize); context.lineTo(w0 * cellSize, 7 * cellSize); context.lineTo(w1 * cellSize, 7 * cellSize); context.lineTo(w1 * cellSize, (d1 + 1) * cellSize); context.lineTo((w1 + 1) * cellSize, (d1 + 1) * cellSize); context.lineTo((w1 + 1) * cellSize, 0); context.lineTo((w0 + 1) * cellSize, 0); context.closePath(); } else { context.moveTo((w0 + 1) * cellSize, d0 * cellSize); if (d0 === 0) context.moveTo(w0 * cellSize,d0 * cellSize); else context.lineTo(w0 * cellSize,d0 * cellSize); context.lineTo(w0 * cellSize, 7 * cellSize); context.moveTo(w1 * cellSize, 7 * cellSize); context.lineTo(w1 * cellSize, (d1 + 1) * cellSize); if (d1 === 6) context.moveTo((w1 + 1) * cellSize, (d1 + 1) * cellSize); else context.lineTo((w1 + 1) * cellSize, (d1 + 1) * cellSize); context.lineTo((w1 + 1) * cellSize, 0); context.moveTo((w0 + 1) * cellSize, 0); context.lineTo((w0 + 1) * cellSize, d0 * cellSize); } } else if (orientation === 'vertical') { if (closed) { context.moveTo(d0 * cellSize, (w0 + 1) * cellSize); context.lineTo(d0 * cellSize, w0 * cellSize); context.lineTo(7 * cellSize, w0 * cellSize); context.lineTo(7 * cellSize, w1 * cellSize); context.lineTo((d1 + 1) * cellSize, w1 * cellSize); context.lineTo((d1 + 1) * cellSize, (w1 + 1) * cellSize); context.lineTo(0, (w1 + 1) * cellSize); context.lineTo(0, (w0 + 1) * cellSize); context.closePath(); } else { context.moveTo(d0 * cellSize, (w0 + 1) * cellSize); if (d0 === 0) context.moveTo(d0 * cellSize, w0 * cellSize); else context.lineTo(d0 * cellSize, w0 * cellSize); context.lineTo(7 * cellSize, w0 * cellSize); context.moveTo(7 * cellSize, w1 * cellSize); context.lineTo((d1 + 1) * cellSize, w1 * cellSize); if (d1 === 6) context.moveTo((d1 + 1) * cellSize, (w1 + 1) * cellSize); else context.lineTo((d1 + 1) * cellSize, (w1 + 1) * cellSize); context.lineTo(0, (w1 + 1) * cellSize); context.moveTo(0, (w0 + 1) * cellSize); context.lineTo(d0 * cellSize, (w0 + 1) * cellSize); } } return context.toString(); } path.orientation = function(_) { if (!arguments.length) return orientation; if (['horizontal', 'vertical'].indexOf(_) === -1) { throw new Error('orientation must be either "horizonal" or "vertical"'); } orientation = _; return path; }; path.closed = function(_) { if (!arguments.length) return closed; closed = _; return path; }; path.cellSize = function(_) { if (!arguments.length) return cellSize; cellSize = _; return path; }; path.offset = function(_) { if (!arguments.length) return offset; if (typeof(_) === 'number') { offset = function(t0) { return new Date(t0.getFullYear(), t0.getMonth(), t0.getDay() + _); }; } else if (typeof(_) === 'function') { offset = _; } else { throw new Error('offset must be either a number (of days) or a function taking the starting date'); } return path; }; function weekOfYear(date) { return d3.timeWeek .count(d3.timeYear(date), date); } return path; }