| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | define("dojox/charting/plot2d/StackedBars", ["dojo/_base/lang", "dojo/_base/array", "dojo/_base/declare", "./Bars", "./common", 	"dojox/lang/functional", "dojox/lang/functional/reversed", "dojox/lang/functional/sequence"], 	function(lang, arr, declare, Bars, dc, df, dfr, dfs){	var	purgeGroup = dfr.lambda("item.purgeGroup()");/*=====var bars = dojox.charting.plot2d.Bars;=====*/	return declare("dojox.charting.plot2d.StackedBars", Bars, {		//	summary:		//		The plot object representing a stacked bar chart (horizontal bars).		getSeriesStats: function(){			//	summary:			//		Calculate the min/max on all attached series in both directions.			//	returns: Object			//		{hmin, hmax, vmin, vmax} min/max in both directions.			var stats = dc.collectStackedStats(this.series), t;			this._maxRunLength = stats.hmax;			stats.hmin -= 0.5;			stats.hmax += 0.5;			t = stats.hmin, stats.hmin = stats.vmin, stats.vmin = t;			t = stats.hmax, stats.hmax = stats.vmax, stats.vmax = t;			return stats;		},		render: function(dim, offsets){			//	summary:			//		Run the calculations for any axes for this plot.			//	dim: Object			//		An object in the form of { width, height }			//	offsets: Object			//		An object of the form { l, r, t, b}.			//	returns: dojox.charting.plot2d.StackedBars			//		A reference to this plot for functional chaining.			if(this._maxRunLength <= 0){				return this;			}			// stack all values			var acc = df.repeat(this._maxRunLength, "-> 0", 0);			for(var i = 0; i < this.series.length; ++i){				var run = this.series[i];				for(var j = 0; j < run.data.length; ++j){					var value = run.data[j];					if(value !== null){						var v = typeof value == "number" ? value : value.y;						if(isNaN(v)){ v = 0; }						acc[j] += v;					}				}			}			// draw runs in backwards			if(this.zoom && !this.isDataDirty()){				return this.performZoom(dim, offsets);			}			this.resetEvents();			this.dirty = this.isDirty();			if(this.dirty){				arr.forEach(this.series, purgeGroup);				this._eventSeries = {};				this.cleanGroup();				var s = this.group;				df.forEachRev(this.series, function(item){ item.cleanGroup(s); });			}			var t = this.chart.theme, f, gap, height,				ht = this._hScaler.scaler.getTransformerFromModel(this._hScaler),				vt = this._vScaler.scaler.getTransformerFromModel(this._vScaler),				events = this.events();			f = dc.calculateBarSize(this._vScaler.bounds.scale, this.opt);			gap = f.gap;			height = f.size;			for(var i = this.series.length - 1; i >= 0; --i){				var run = this.series[i];				if(!this.dirty && !run.dirty){					t.skip();					this._reconnectEvents(run.name);					continue;				}				run.cleanGroup();				var theme = t.next("bar", [this.opt, run]), s = run.group,					eventSeries = new Array(acc.length);				for(var j = 0; j < acc.length; ++j){					var value = run.data[j];					if(value !== null){						var v = acc[j],							width = ht(v),							finalTheme = typeof value != "number" ?								t.addMixin(theme, "bar", value, true) :								t.post(theme, "bar");						if(width >= 0 && height >= 1){							var rect = {								x: offsets.l,								y: dim.height - offsets.b - vt(j + 1.5) + gap,								width: width, height: height							};							var specialFill = this._plotFill(finalTheme.series.fill, dim, offsets);							specialFill = this._shapeFill(specialFill, rect);							var shape = s.createRect(rect).setFill(specialFill).setStroke(finalTheme.series.stroke);							run.dyn.fill   = shape.getFill();							run.dyn.stroke = shape.getStroke();							if(events){								var o = {									element: "bar",									index:   j,									run:     run,									shape:   shape,									x:       v,									y:       j + 1.5								};								this._connectEvents(o);								eventSeries[j] = o;							}							if(this.animate){								this._animateBar(shape, offsets.l, -width);							}						}					}				}				this._eventSeries[run.name] = eventSeries;				run.dirty = false;				// update the accumulator				for(var j = 0; j < run.data.length; ++j){					var value = run.data[j];					if(value !== null){						var v = typeof value == "number" ? value : value.y;						if(isNaN(v)){ v = 0; }						acc[j] -= v;					}				}			}			this.dirty = false;			return this;	//	dojox.charting.plot2d.StackedBars		}	});});
 |