d3.svg.legend = function() {
    
    var legendValues=
    [
     {color: "red", stop: [0,1]},
     {color: "blue", stop: [1,2]},
     {color: "purple", stop: [2,3]},
     {color: "yellow", stop: [3,4]},
     {color: "Aquamarine", stop: [4,5]}
    ];
    var legendScale;
    var cellWidth = 15;
    var cellHeight = 10;
    var adjustable = false;
    var labelFormat = d3.format(".01f");
    var labelUnits = "units";
    var lastValue = 6;
    var changeValue = 1;
    var orientation = "horizontal";
    var cellPadding = 0;
   
    function legend(g) {
    
    function cellRange(valuePosition, changeVal) {
    legendValues[valuePosition].stop[0] += changeVal;
    legendValues[valuePosition - 1].stop[1] += changeVal;
    redraw();
    }

    function redraw() {
        
        g.selectAll("g.legendCells")
          .data(legendValues)
          .exit().remove();

        g.selectAll("g.legendCells")
          .select("rect")
          .style("fill", function(d) {return d.color});

        if (orientation == "vertical") {

            g.selectAll("g.legendCells")
              .select("text.breakLabels")
              .style("display", "block")
              .style("text-anchor", "start")
              .attr("x", cellWidth + cellPadding)
              .attr("y", 5 + (cellHeight / 2))
              .text(function(d) {return labelFormat(d.stop[0]) + (d.stop[1].length > 0 ? " - " + labelFormat(d.stop[1]) : "")})

            g.selectAll("g.legendCells")
              .attr("transform", function(d,i) {return "translate(0," + (i * (cellHeight + cellPadding)) + ")" });
        }
        else {

            g.selectAll("g.legendCells")
             .attr("transform", function(d,i) {return "translate(" + (i * cellWidth) + ",0)" });

            g.selectAll("text.breakLabels")
             .style("text-anchor", "middle")
             .attr("x", 0).attr("y", -7)
             .style("display", function(d,i) {return i == 0 ? "none" : "block"})
             .text(function(d) {return labelFormat(d.stop[0])});
        }
    }

    g.selectAll("g.legendCells")
     .data(legendValues)
     .enter()
     .append("g")
     .attr("class", "legendCells")
     .attr("transform", function(d,i) {return "translate(" + (i * (cellWidth + cellPadding)) + ",0)" })
    
    g.selectAll("g.legendCells")
     .append("rect")
     .attr("height", cellHeight)
     .attr("width", cellWidth)
     .style("fill", function(d) {return "d.color"})
     .style("stroke", "none")
     .style("stroke-width", "2px");

    g.selectAll("g.legendCells")
     .append("text")
     .attr("class", "breakLabels")
     .style("pointer-events", "none");
    
    g.append("text")
     .text(labelUnits)
     .attr("y", -7);
    
    redraw();
    }
    
    legend.inputScale = function(newScale) {
        if (!arguments.length) return scale;
            scale = newScale;
            legendValues = [];
            if (scale.invertExtent) {
                //Is a quantile scale
                scale.range().forEach(function(el) {
                    var cellObject = {color: el, stop: scale.invertExtent(el)}
                    legendValues.push(cellObject)
                })
            }
            else {
                scale.domain().forEach(function (el) {
                    var cellObject = {color: scale(el), stop: [el,""]}
                    legendValues.push(cellObject)
                })
            }
            return this;
    }
    
    legend.scale = function(testValue) {
        var foundColor = legendValues[legendValues.length - 1].color;
        for (el in legendValues) {
            if(testValue < legendValues[el].stop[1]) {
                foundColor = legendValues[el].color;
                break;
            }
        }
        return foundColor;
    }

    legend.cellWidth = function(newCellSize) {
        if (!arguments.length) return cellWidth;
            cellWidth = newCellSize;
            return this;
    }

    legend.cellHeight = function(newCellSize) {
        if (!arguments.length) return cellHeight;
            cellHeight = newCellSize;
            return this;
    }

    legend.cellPadding = function(newCellPadding) {
        if (!arguments.length) return cellPadding;
            cellPadding = newCellPadding;
            return this;
    }
    
    legend.cellExtent = function(incColor,newExtent) {
        var selectedStop = legendValues.filter(function(el) {return el.color == incColor})[0].stop;
        if (arguments.length == 1) return selectedStop;
            legendValues.filter(function(el) {return el.color == incColor})[0].stop = newExtent;
            return this;
    }
    
    legend.cellStepping = function(incStep) {
        if (!arguments.length) return changeValue;
            changeValue = incStep;
            return this;
    }
    
    legend.units = function(incUnits) {
        if (!arguments.length) return labelUnits;
            labelUnits = incUnits;
            return this;
    }
    
    legend.orientation = function(incOrient) {
        if (!arguments.length) return orientation;
            orientation = incOrient;
            return this;
    }

    legend.labelFormat = function(incFormat) {
        if (!arguments.length) return labelFormat;
            labelFormat = incFormat;
            if (incFormat == "none") {
                labelFormat = function(inc) {return inc};
            }
            return this;
    }

return legend;    
    
}