rem: anim.connect(x, anim, handlers[x]); 
add: dojo.connect(anim, x, anim, handlers[x]); 
context: 	dojo.animateProperty = function(			/*DOMNode[]*/ nodes, 												/*Object[]*/ propertyMap, 												/*int*/ duration,												/*function*/ easing,												/*Object*/ handlers){		// summary: Returns an animation that will transition the properties of "nodes"		//			depending how they are defined in "propertyMap".		// nodes: An array of DOMNodes or one DOMNode.		// propertyMap: { property: String, start: Decimal?, end: Decimal?, units: String? }		//				An array of objects defining properties to change.		// duration: Duration of the animation in milliseconds.		// easing: An easing function.		// handlers: { handler: Function?, onstart: Function?, onstop: Function?, onanimate: Function? }		nodes = _byId(nodes);		var targs = {			"propertyMap": propertyMap,			"nodes": nodes,			"duration": duration,			"easing": easing||dojo._defaultEasing		};				var setEmUp = function(args){			if(args.nodes.length==1){				// FIXME: we're only supporting start-value filling when one node is				// passed								var pm = args.propertyMap;				if(!dojo.isArray(args.propertyMap)){					// it's stupid to have to pack an array with a set of objects					// when you can just pass in an object list					var parr = [];					for(var pname in pm){						pm[pname].property = pname;						parr.push(pm[pname]);					}					pm = args.propertyMap = parr;				}				dojo.forEach(pm, function(prop){					if(typeof prop.start == "undefined"){						//FIXME: else clause is unecessary?  parseInt vs. parseFloat?						if(prop.property == "opacity"){							prop.start = dojo.style(args.nodes[0], prop.property);						}else{							prop.start = parseInt(dojo.getComputedStyle(args.nodes[0])[prop.property]);						}					}				});			}		}		var coordsAsInts = function(coords){			var cints = [];			dojo.forEach(coords, function(c){ 				cints.push(Math.round(c));			});			return cints;		}		var setStyle = function(n, style){			n = dojo.byId(n);			if(!n || !n.style){ return; }			for(var s in style){				try{					dojo.style(n, s, style[s]);				}catch(e){ //TODO: why the try/catch?					dojo.debug(e);				}			}		}		var PropLine = function(properties){			this._properties = properties;			this.diffs = [properties.length];			dojo.forEach(properties, function(prop, i){				// calculate the end - start to optimize a bit				if(dojo.isFunction(prop.start)){					prop.start = prop.start(prop, i);				}				if(dojo.isFunction(prop.end)){					prop.end = prop.end(prop, i);				}				if(dojo.isArray(prop.start)){					// don't loop through the arrays					this.diffs[i] = null;	/* FIXME - gfx dependency				}else if(prop.start instanceof dojo.gfx.color.Color){					// save these so we don't have to call toRgb() every getValue() call					prop.startRgb = prop.start.toRgb();					prop.endRgb = prop.end.toRgb();	*/				}else{					this.diffs[i] = prop.end - prop.start;				}			}, this);			this.getValue = function(n){				var ret = {};				dojo.forEach(this._properties, function(prop, i){					var value = null;					if(dojo.isArray(prop.start)){						// FIXME: what to do here?	/* FIXME					}else if(prop.start instanceof dojo.gfx.color.Color){						value = (prop.units||"rgb") + "(";						for(var j = 0 ; j < prop.startRgb.length ; j++){							value += Math.round(((prop.endRgb[j] - prop.startRgb[j]) * n) + prop.startRgb[j]) + (j < prop.startRgb.length - 1 ? "," : "");						}						value += ")";	*/					}else{						value = (this.diffs[i] * n) + prop.start + (prop.property != "opacity" ? prop.units||"px" : "");					}					ret[prop.property] = value;	//FIXME				ret[dojo.html.toCamelCase(prop.property)] = value;				}, this);				return ret;			}		}				var anim = new dojo._Animation({				beforeBegin: function(){ 					setEmUp(targs);					anim.curve = new PropLine(targs.propertyMap);				},				onAnimate: function(propValues){					dojo.forEach(targs.nodes, function(node){						setStyle(node, propValues);					});				}			},			targs.duration, null, targs.easing);		if(handlers){			for(var x in handlers){				if(dojo.isFunction(handlers[x])){					anim.connect(x, anim, handlers[x]);				}			}		}				return anim; // dojo._Animation	}
meta: 4497	/local1/tlutelli/issta_data/temp/all_js/javascript/2007_temp/2007/4497/c46a798f6f024789bed51167a0db32a321c7c84d/fx.js/buggy/_base/fx.js