/**
* Adds support for the <code>transform</code> attribute of <code>Graphic</code>
* <code>Shape</code> instances.
* @module anim
* @submodule anim-shape-transform
* @deprecated Use anim-shape instead.
*/
/**
* Adds support for the <code>transform</code> and <code>fill</code> attributes of <code>Graphic</code>
* and <code>Shape</code> instances. The <code>anim-shape</code> submodule can be used for all animations
* involving <code>Graphic</code> <code>Shape</code> attributes.
*
* @module anim
* @submodule anim-shape
*/
var NUM = Number,
TO,
TOSTRING,
COLOR = "color",
STOPS = "stops",
TYPE = "type",
GETUPDATEDSTOPS = function(anim, from, to, elapsed, duration, fn)
{
var i = 0,
getUpdatedColorValue = Y.Anim.getUpdatedColorValue,
toStop,
fromStop,
prop,
len = to.length,
stops = [],
stop;
for(; i < len; i = i + 1)
{
toStop = to[i];
fromStop = from[i];
stop = {};
for(prop in toStop)
{
if(toStop.hasOwnProperty(prop))
{
if(prop === COLOR)
{
stop[prop] = Y.Color.toHex(getUpdatedColorValue(
Y.Color.toHex(fromStop[prop]),
Y.Color.toHex(toStop[prop]),
elapsed,
duration,
fn
));
}
else
{
stop[prop] = fn(elapsed, NUM(fromStop[prop]), NUM(toStop[prop]) - NUM(fromStop[prop]), duration);
}
}
}
stops.push(stop);
}
return stops;
},
FILLANDSTROKEBEHAVIOR = {
set: function(anim, att, from, to, elapsed, duration, fn) {
var i,
updated = {},
getUpdatedColorValue = Y.Anim.getUpdatedColorValue,
getUpdatedStops = GETUPDATEDSTOPS;
for(i in to)
{
if(to.hasOwnProperty(i) && i !== TYPE)
{
switch(i)
{
case COLOR :
updated[i] = getUpdatedColorValue(from[i], to[i], elapsed, duration, fn);
break;
case STOPS :
updated[i] = getUpdatedStops(anim, from[i], to[i], elapsed, duration, fn);
break;
default :
updated[i] = fn(elapsed, NUM(from[i]), NUM(to[i]) - NUM(from[i]), duration);
break;
}
}
}
anim._node.set(att, updated);
}
};
Y.Anim.behaviors.fill = FILLANDSTROKEBEHAVIOR;
Y.Anim.behaviors.stroke = FILLANDSTROKEBEHAVIOR;
Y.Anim.behaviors.transform = {
set: function(anim, att, from, to, elapsed, duration, fn) {
var node = anim._node,
transform = "",
transformTo,
transformFrom,
toArgs,
fromArgs,
i = 0,
j,
argLen,
len;
to = TO;
len = TO.length;
for(; i < len; ++i)
{
toArgs = to[i].concat();
fromArgs = from[i].concat();
transformTo = toArgs.shift();
transformFrom = fromArgs.shift();
argLen = toArgs.length;
transform += transformTo + "(";
for(j = 0; j < argLen; ++j)
{
transform += fn(elapsed, NUM(fromArgs[j]), NUM(toArgs[j]) - NUM(fromArgs[j]), duration);
if(j < argLen - 1)
{
transform += ", ";
}
}
transform += ");";
}
if(transform)
{
node.set('transform', transform);
}
node._transform = TOSTRING;
},
get: function(anim) {
var node = anim._node,
fromMatrix = node.matrix,
toString = anim.get("to").transform,
fromString = node.get("transform"),
toArray = Y.MatrixUtil.getTransformArray(toString),
fromArray = fromString ? Y.MatrixUtil.getTransformArray(fromString) : null,
toMatrix,
i,
len,
transformFunction,
from;
if(toArray)
{
if(!fromArray || fromArray.length < 1)
{
fromArray = [];
len = toArray.length;
for(i = 0; i < len; ++i)
{
transformFunction = toArray[i][0];
fromArray[i] = Y.MatrixUtil.getTransformFunctionArray(transformFunction);
}
TO = toArray;
from = fromArray;
}
else if(Y.MatrixUtil.compareTransformSequence(toArray, fromArray))
{
TO = toArray;
from = fromArray;
}
else
{
toMatrix = new Y.Matrix();
len = toArray.length;
for(i = 0; i < len; ++i)
{
transformFunction = toArray[i].shift();
transformFunction = transformFunction === "matrix" ? "multiply" : transformFunction;
toMatrix[transformFunction].apply(toMatrix, toArray[i]);
}
TO = toMatrix.decompose();
from = fromMatrix.decompose();
}
}
TOSTRING = toString;
return from;
}
};