import “../core/ns”; import “../interpolate/interpolate”; import “../interpolate/transform”; import “transition”; import “tween”;

d3_transitionPrototype.attr = function(nameNS, value) {

if (arguments.length < 2) {

  // For attr(object), the object specifies the names and values of the
  // attributes to transition. The values may be functions that are
  // evaluated for each element.
  for (value in nameNS) this.attr(value, nameNS[value]);
  return this;
}

var interpolate = nameNS == "transform" ? d3_interpolateTransform : d3_interpolate,
    name = d3.ns.qualify(nameNS);

// For attr(string, null), remove the attribute with the specified name.
function attrNull() {
  this.removeAttribute(name);
}
function attrNullNS() {
  this.removeAttributeNS(name.space, name.local);
}

// For attr(string, string), set the attribute with the specified name.
function attrTween(b) {
  return b == null ? attrNull : (b += "", function() {
    var a = this.getAttribute(name), i;
    return a !== b && (i = interpolate(a, b), function(t) { this.setAttribute(name, i(t)); });
  });
}
function attrTweenNS(b) {
  return b == null ? attrNullNS : (b += "", function() {
    var a = this.getAttributeNS(name.space, name.local), i;
    return a !== b && (i = interpolate(a, b), function(t) { this.setAttributeNS(name.space, name.local, i(t)); });
  });
}

return d3_transition_tween(this, "attr." + nameNS, value, name.local ? attrTweenNS : attrTween);

};

d3_transitionPrototype.attrTween = function(nameNS, tween) {

var name = d3.ns.qualify(nameNS);

function attrTween(d, i) {
  var f = tween.call(this, d, i, this.getAttribute(name));
  return f && function(t) { this.setAttribute(name, f(t)); };
}
function attrTweenNS(d, i) {
  var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));
  return f && function(t) { this.setAttributeNS(name.space, name.local, f(t)); };
}

return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween);

};