source: [view]
var helperNode = dojo.create("div"),
node = args.node = dojo.byId(args.node),
s = node.style,
dims = null,
hs = null,
pn = null,
lightColor = args.lightColor || "#dddddd",
darkColor = args.darkColor || "#555555",
bgColor = dojo.style(node, "backgroundColor"),
endColor = args.endColor || bgColor,
staticProps = {},
anims = [],
duration = args.duration ? args.duration / 2 : 250,
dir = args.dir || "left",
pConst = .9,
transparentColor = "transparent",
whichAnim = args.whichAnim,
axis = args.axis || "center",
depth = args.depth
;
// IE6 workaround: IE6 doesn't support transparent borders
var convertColor = function(color){
return ((new dojo.Color(color)).toHex() === "#000000") ? "#000001" : color;
};
if(dojo.isIE < 7){
endColor = convertColor(endColor);
lightColor = convertColor(lightColor);
darkColor = convertColor(darkColor);
bgColor = convertColor(bgColor);
transparentColor = "black";
helperNode.style.filter = "chroma(color='#000000')";
}
var init = (function(n){
return function(){
var ret = dojo.coords(n, true);
dims = {
top: ret.y,
left: ret.x,
width: ret.w,
height: ret.h
};
}
})(node);
init();
// helperNode initialization
hs = {
position: "absolute",
top: dims["top"] + "px",
left: dims["left"] + "px",
height: "0",
width: "0",
zIndex: args.zIndex || (s.zIndex || 0),
border: "0 solid " + transparentColor,
fontSize: "0",
visibility: "hidden"
};
var props = [ {},
{
top: dims["top"],
left: dims["left"]
}
];
var dynProperties = {
left: [leftConst, rightConst, topConst, bottomConst, widthConst, heightConst, "end" + heightConst + "Min", leftConst, "end" + heightConst + "Max"],
right: [rightConst, leftConst, topConst, bottomConst, widthConst, heightConst, "end" + heightConst + "Min", leftConst, "end" + heightConst + "Max"],
top: [topConst, bottomConst, leftConst, rightConst, heightConst, widthConst, "end" + widthConst + "Min", topConst, "end" + widthConst + "Max"],
bottom: [bottomConst, topConst, leftConst, rightConst, heightConst, widthConst, "end" + widthConst + "Min", topConst, "end" + widthConst + "Max"]
};
// property names
pn = dynProperties[dir];
// .4 <= pConst <= .9
if(typeof depth != "undefined"){
depth = Math.max(0, Math.min(1, depth)) / 2;
pConst = .4 + (.5 - depth);
}else{
pConst = Math.min(.9, Math.max(.4, dims[pn[5].toLowerCase()] / dims[pn[4].toLowerCase()]));
}
var p0 = props[0];
for(var i = 4; i < 6; i++){
if(axis == "center" || axis == "cube"){ // find a better name for "cube"
dims["end" + pn[i] + "Min"] = dims[pn[i].toLowerCase()] * pConst;
dims["end" + pn[i] + "Max"] = dims[pn[i].toLowerCase()] / pConst;
}else if(axis == "shortside"){
dims["end" + pn[i] + "Min"] = dims[pn[i].toLowerCase()];
dims["end" + pn[i] + "Max"] = dims[pn[i].toLowerCase()] / pConst;
}else if(axis == "longside"){
dims["end" + pn[i] + "Min"] = dims[pn[i].toLowerCase()] * pConst;
dims["end" + pn[i] + "Max"] = dims[pn[i].toLowerCase()];
}
}
if(axis == "center"){
p0[pn[2].toLowerCase()] = dims[pn[2].toLowerCase()] - (dims[pn[8]] - dims[pn[6]]) / 4;
}else if(axis == "shortside"){
p0[pn[2].toLowerCase()] = dims[pn[2].toLowerCase()] - (dims[pn[8]] - dims[pn[6]]) / 2;
}
staticProps[pn[5].toLowerCase()] = dims[pn[5].toLowerCase()] + "px";
staticProps[pn[4].toLowerCase()] = "0";
staticProps[borderConst + pn[1] + widthConst] = dims[pn[4].toLowerCase()] + "px";
staticProps[borderConst + pn[1] + "Color"] = bgColor;
p0[borderConst + pn[1] + widthConst] = 0;
p0[borderConst + pn[1] + "Color"] = darkColor;
p0[borderConst + pn[2] + widthConst] = p0[borderConst + pn[3] + widthConst] = axis != "cube"
? (dims["end" + pn[5] + "Max"] - dims["end" + pn[5] + "Min"]) / 2
: dims[pn[6]] / 2
;
p0[pn[7].toLowerCase()] = dims[pn[7].toLowerCase()] + dims[pn[4].toLowerCase()] / 2 + (args.shift || 0);
p0[pn[5].toLowerCase()] = dims[pn[6]];
var p1 = props[1];
p1[borderConst + pn[0] + "Color"] = { start: lightColor, end: endColor };
p1[borderConst + pn[0] + widthConst] = dims[pn[4].toLowerCase()];
p1[borderConst + pn[2] + widthConst] = 0;
p1[borderConst + pn[3] + widthConst] = 0;
p1[pn[5].toLowerCase()] = { start: dims[pn[6]], end: dims[pn[5].toLowerCase()] };
dojo.mixin(hs, staticProps);
dojo.style(helperNode, hs);
dojo.body().appendChild(helperNode);
var finalize = function(){
// helperNode.parentNode.removeChild(helperNode);
dojo.destroy(helperNode);
// fixes a flicker when the animation ends
s.backgroundColor = endColor;
s.visibility = "visible";
};
if(whichAnim == "last"){
for(i in p0){
p0[i] = { start: p0[i] };
}
p0[borderConst + pn[1] + "Color"] = { start: darkColor, end: endColor };
p1 = p0;
}
if(!whichAnim || whichAnim == "first"){
anims.push(dojo.animateProperty({
node: helperNode,
duration: duration,
properties: p0
}));
}
if(!whichAnim || whichAnim == "last"){
anims.push(dojo.animateProperty({
node: helperNode,
duration: duration,
properties: p1,
onEnd: finalize
}));
}
// hide the original node
dojo.connect(anims[0], "play", function(){
helperNode.style.visibility = "visible";
s.visibility = "hidden";
});
return dojo.fx.chain(anims); // dojo.Animation