You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by mu...@apache.org on 2007/03/03 06:49:21 UTC

svn commit: r514083 [9/49] - in /struts/struts2/trunk/plugins/dojo: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/struts2/ src/main/java/org/apache/struts2/components/ src/main/java/org/apache/st...

Added: struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/svg/Plotters.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/svg/Plotters.js?view=auto&rev=514083
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/svg/Plotters.js (added)
+++ struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/svg/Plotters.js Fri Mar  2 21:48:54 2007
@@ -0,0 +1,872 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.charting.svg.Plotters");
+dojo.require("dojo.lang.common");
+dojo.require("dojo.svg");
+
+//	TODO for 0.5: look at replacing manual plotting with dojo.gfx.
+
+//	Mixin the SVG-specific plotter object.
+dojo.mixin(dojo.charting.Plotters, {
+	/*********************************************************
+	 *	Grouped plotters: need all series on a plot at once.
+	 *********************************************************/
+	Bar: function(
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* object? */kwArgs,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots a set of grouped bars.
+		//	Bindings: y
+		var area = plotarea.getArea();
+		var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+		
+		//	precompile the data
+		var n = plot.series.length;	//	how many series
+		var data = [];
+		for(var i=0; i<n; i++){
+			var tmp = plot.series[i].data.evaluate(kwArgs);
+			data.push(tmp);
+		}
+
+		//	calculate the width of each bar.
+		var space = 8;
+		var nPoints = data[0].length;
+		var width = ((area.right-area.left)-(space*(nPoints-1)))/nPoints;	//	the width of each group.
+		var barWidth = width/n;	//	the width of each bar, no spaces.
+		var yOrigin = plot.axisY.getCoord(plot.axisX.origin, plotarea, plot);
+
+		for(var i=0; i<nPoints; i++){
+			//	calculate offset
+			var xStart = area.left+(width*i)+(space*i);
+			for(var j=0; j<n; j++){
+				var value = data[j][i].y;
+				var yA = yOrigin;
+				var x = xStart + (barWidth*j);
+				var y = plot.axisY.getCoord(value, plotarea, plot);
+				var h = Math.abs(yA-y);
+				if(value < plot.axisX.origin){
+					yA = y;
+					y = yOrigin;
+				}
+				
+				var bar=document.createElementNS(dojo.svg.xmlns.svg, "rect");
+				bar.setAttribute("fill", data[j][i].series.color);
+				bar.setAttribute("stroke-width", "0");
+				bar.setAttribute("x", x);
+				bar.setAttribute("y", y);
+				bar.setAttribute("width", barWidth);
+				bar.setAttribute("height", h);
+				bar.setAttribute("fill-opacity", "0.6");
+				if(applyTo){ applyTo(bar, data[j][i].src); }
+				group.appendChild(bar);
+			}
+		}
+		return group;	// SVGGElement
+	},
+	HorizontalBar: function(
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* object? */kwArgs,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots data in a set of grouped bars horizontally.
+		//	Bindings: y
+		var area = plotarea.getArea();
+		var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+		
+		//	precompile the data
+		var n = plot.series.length;	//	how many series
+		var data = [];
+		for(var i=0; i<n; i++){
+			var tmp = plot.series[i].data.evaluate(kwArgs);
+			data.push(tmp);
+		}
+
+		var space = 6;
+		var nPoints = data[0].length;
+		var h = ((area.bottom-area.top)-(space*(nPoints-1)))/nPoints;
+		var barH = h/n;
+		var xOrigin = plot.axisX.getCoord(0, plotarea, plot);
+
+		for(var i=0; i<nPoints; i++){
+			//	calculate offset
+			var yStart = area.top+(h*i)+(space*i);
+			for(var j=0; j<n; j++){
+				var value = data[j][i].y;
+				var y = yStart + (barH*j);
+				var xA = xOrigin;
+				var x = plot.axisX.getCoord(value, plotarea, plot);
+				var w = Math.abs(x-xA);
+				if(value > 0){
+					x = xOrigin;
+				}
+				
+				var bar=document.createElementNS(dojo.svg.xmlns.svg, "rect");
+				bar.setAttribute("fill", data[j][i].series.color);
+				bar.setAttribute("stroke-width", "0");
+				bar.setAttribute("x", xA);
+				bar.setAttribute("y", y);
+				bar.setAttribute("width", w);
+				bar.setAttribute("height", barH);
+				bar.setAttribute("fill-opacity", "0.6");
+				if(applyTo){ applyTo(bar, data[j][i].src); }
+				group.appendChild(bar);
+			}
+		}
+		return group;	//	SVGGElement
+	},
+	Gantt: function(
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* object? */kwArgs,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots a grouped set of Gantt bars
+		//	Bindings: high/low
+		var area = plotarea.getArea();
+		var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+		//	precompile the data
+		var n = plot.series.length;	//	how many series
+		var data = [];
+		for(var i=0; i<n; i++){
+			var tmp = plot.series[i].data.evaluate(kwArgs);
+			data.push(tmp);
+		}
+
+		var space = 2;
+		var nPoints = data[0].length;
+		var h = ((area.bottom-area.top)-(space*(nPoints-1)))/nPoints;
+		var barH = h/n;
+		for(var i=0; i<nPoints; i++){
+			//	calculate offset
+			var yStart = area.top+(h*i)+(space*i);
+			for(var j=0; j<n; j++){
+				var high = data[j][i].high;
+				var low = data[j][i].low;
+				if(low > high){
+					var t = high;
+					high = low;
+					low = t;
+				}
+				var x = plot.axisX.getCoord(low, plotarea, plot);
+				var w = plot.axisX.getCoord(high, plotarea, plot) - x;
+				var y = yStart + (barH*j);
+				
+				var bar=document.createElementNS(dojo.svg.xmlns.svg, "rect");
+				bar.setAttribute("fill", data[j][i].series.color);
+				bar.setAttribute("stroke-width", "0");
+				bar.setAttribute("x", x);
+				bar.setAttribute("y", y);
+				bar.setAttribute("width", w);
+				bar.setAttribute("height", barH);
+				bar.setAttribute("fill-opacity", "0.6");
+				if(applyTo){ applyTo(bar, data[j][i].src); }
+				group.appendChild(bar);
+			}
+		}
+		return group;	//	SVGGElement
+	},
+	StackedArea: function(
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* object? */kwArgs,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots a set of stacked areas.
+		//	Bindings: x/y
+		var area = plotarea.getArea();
+		var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+		//	precompile the data
+		var n = plot.series.length;	//	how many series
+		var data = [];
+		var totals = [];
+
+		//	we're assuming that all series for this plot has the name x assignment for now.
+		for(var i=0; i<n; i++){
+			var tmp = plot.series[i].data.evaluate(kwArgs);
+			//	run through and add current totals
+			for(var j=0; j<tmp.length; j++){
+				if(i==0){ totals.push(tmp[j].y); }
+				else { totals[j] += tmp[j].y; }
+				tmp[j].y = totals[j];
+			}
+			data.push(tmp);
+		}
+
+		for(var i=n-1; i>=0; i--){
+			var path = document.createElementNS(dojo.svg.xmlns.svg, "path");
+			path.setAttribute("fill", data[i][0].series.color);
+			path.setAttribute("fill-opacity", "0.4");
+			path.setAttribute("stroke", data[i][0].series.color);
+			path.setAttribute("stroke-width" , "1");
+			path.setAttribute("stroke-opacity", "0.85");
+
+			var cmd = [];
+			var r=3;
+			for(var j=0; j<data[i].length; j++){
+				var values = data[i];
+				var x = plot.axisX.getCoord(values[j].x, plotarea, plot);
+				var y = plot.axisY.getCoord(values[j].y, plotarea, plot);
+
+				if(j==0){ cmd.push("M"); }
+				else { cmd.push("L"); }
+				cmd.push(x+","+y);
+				
+				//	points on the line
+				var c=document.createElementNS(dojo.svg.xmlns.svg, "circle");
+				c.setAttribute("cx",x);
+				c.setAttribute("cy",y);
+				c.setAttribute("r","3");
+				c.setAttribute("fill", values[j].series.color);
+				c.setAttribute("fill-opacity", "0.6");
+				c.setAttribute("stroke-width", "1");
+				c.setAttribute("stroke-opacity", "0.85");
+				group.appendChild(c);
+				if(applyTo){ applyTo(c, data[i].src); }
+			}
+
+			//	now run the path backwards from the previous series.
+			if(i == 0){
+				cmd.push("L");
+				cmd.push(x + "," + plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+				cmd.push("L");
+				cmd.push(plot.axisX.getCoord(data[0][0].x, plotarea, plot) + "," +  plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+				cmd.push("Z");
+			} else {
+				var values = data[i-1];
+				cmd.push("L");
+				cmd.push(x + "," + Math.round(plot.axisY.getCoord(values[values.length-1].y, plotarea, plot)));
+				for(var j=values.length-2; j>=0; j--){
+					var x = plot.axisX.getCoord(values[j].x, plotarea, plot);
+					var y = plot.axisY.getCoord(values[j].y, plotarea, plot);
+					cmd.push("L");
+					cmd.push(x+","+y);
+				}
+			}
+			path.setAttribute("d", cmd.join(" ")+ " Z");
+			group.appendChild(path);
+		}
+		return group;	//	SVGGElement
+	},
+	StackedCurvedArea: function(
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* object? */kwArgs,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots a set of stacked areas, using a tensioning factor to soften points.
+		//	Bindings: x/y
+		var tension = 3;
+		var area = plotarea.getArea();
+		var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+		//	precompile the data
+		var n = plot.series.length;	//	how many series
+		var data = [];
+		var totals = [];
+
+		//	we're assuming that all series for this plot has the name x assignment for now.
+		for(var i=0; i<n; i++){
+			var tmp = plot.series[i].data.evaluate(kwArgs);
+			//	run through and add current totals
+			for(var j=0; j<tmp.length; j++){
+				if(i==0){ totals.push(tmp[j].y); }
+				else { totals[j] += tmp[j].y; }
+				tmp[j].y = totals[j];
+			}
+			data.push(tmp);
+		}
+
+		for(var i=n-1; i>=0; i--){
+			var path = document.createElementNS(dojo.svg.xmlns.svg, "path");
+			path.setAttribute("fill", data[i][0].series.color);
+			path.setAttribute("fill-opacity", "0.4");
+			path.setAttribute("stroke", data[i][0].series.color);
+			path.setAttribute("stroke-width" , "1");
+			path.setAttribute("stroke-opacity", "0.85");
+
+			var cmd = [];
+			var r=3;
+			for(var j=0; j<data[i].length; j++){
+				var values = data[i];
+				var x = plot.axisX.getCoord(values[j].x, plotarea, plot);
+				var y = plot.axisY.getCoord(values[j].y, plotarea, plot);
+				var dx = area.left + 1;
+				var dy = area.bottom;
+				if(j>0){
+					dx = x - plot.axisX.getCoord(values[j-1].x, plotarea, plot);
+					dy = plot.axisY.getCoord(values[j-1].y, plotarea, plot);
+				}
+
+				if(j==0){ cmd.push("M"); }
+				else {
+					cmd.push("C");
+					var cx = x-(tension-1) * (dx/tension);
+					cmd.push(cx + "," + dy);
+					cx = x - (dx/tension);
+					cmd.push(cx + "," + y);
+				}
+				cmd.push(x+","+y);
+				
+				//	points on the line
+				var c=document.createElementNS(dojo.svg.xmlns.svg, "circle");
+				c.setAttribute("cx",x);
+				c.setAttribute("cy",y);
+				c.setAttribute("r","3");
+				c.setAttribute("fill", values[j].series.color);
+				c.setAttribute("fill-opacity", "0.6");
+				c.setAttribute("stroke-width", "1");
+				c.setAttribute("stroke-opacity", "0.85");
+				group.appendChild(c);
+				if(applyTo){ applyTo(c, data[i].src); }
+			}
+
+			//	now run the path backwards from the previous series.
+			if(i == 0){
+				cmd.push("L");
+				cmd.push(x + "," + plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+				cmd.push("L");
+				cmd.push(plot.axisX.getCoord(data[0][0].x, plotarea, plot) + "," +  plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+				cmd.push("Z");
+			} else {
+				var values = data[i-1];
+				cmd.push("L");
+				cmd.push(x + "," + Math.round(plot.axisY.getCoord(values[values.length-1].y, plotarea, plot)));
+				for(var j=values.length-2; j>=0; j--){
+					var x = plot.axisX.getCoord(values[j].x, plotarea, plot);
+					var y = plot.axisY.getCoord(values[j].y, plotarea, plot);
+					var dx = x - plot.axisX.getCoord(values[j+1].x, plotarea, plot);
+					var dy = plot.axisY.getCoord(values[j+1].y, plotarea, plot);
+
+					cmd.push("C");
+					var cx = x-(tension-1) * (dx/tension);
+					cmd.push(cx + "," + dy);
+					cx = x - (dx/tension);
+					cmd.push(cx + "," + y);
+					cmd.push(x+","+y);
+				}
+			}
+			path.setAttribute("d", cmd.join(" ")+ " Z");
+			group.appendChild(path);
+		}
+		return group;	//	SVGGElement
+	},
+
+	/*********************************************************
+	 *	Single plotters: one series at a time.
+	 *********************************************************/
+	DataBar: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots a set of bars in relation to y==0.
+		//	Bindings: x/y
+		var area = plotarea.getArea();
+		var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+		
+		var n = data.length;
+		var w = (area.right-area.left)/(plot.axisX.range.upper - plot.axisX.range.lower);	//	the width of each group.
+		var yOrigin = plot.axisY.getCoord(plot.axisX.origin, plotarea, plot);
+
+		for(var i=0; i<n; i++){
+			//	calculate offset
+			var value = data[i].y;
+			var yA = yOrigin;
+			var x = plot.axisX.getCoord(data[i].x, plotarea, plot) - (w/2);
+			var y = plot.axisY.getCoord(value, plotarea, plot);
+			var h = Math.abs(yA-y);
+			if(value < plot.axisX.origin){
+				yA = y;
+				y = yOrigin;
+			}
+			var bar=document.createElementNS(dojo.svg.xmlns.svg, "rect");
+			bar.setAttribute("fill", data[i].series.color);
+			bar.setAttribute("stroke-width", "0");
+			bar.setAttribute("x", x);
+			bar.setAttribute("y", y);
+			bar.setAttribute("width", w);
+			bar.setAttribute("height", h);
+			bar.setAttribute("fill-opacity", "0.6");
+			if(applyTo){ applyTo(bar, data[i].src); }
+			group.appendChild(bar);
+		}
+		return group;	//	SVGGElement
+	},
+	Line: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as a line.
+		//	Bindings: x/y
+		var area = plotarea.getArea();
+		var line = document.createElementNS(dojo.svg.xmlns.svg, "g");
+		var path = document.createElementNS(dojo.svg.xmlns.svg, "path");
+		line.appendChild(path);
+
+		path.setAttribute("fill", "none");
+		path.setAttribute("stroke", data[0].series.color);
+		path.setAttribute("stroke-width" , "2");
+		path.setAttribute("stroke-opacity", "0.85");
+		if(data[0].series.label != null){
+			path.setAttribute("title", data[0].series.label);
+		}
+
+		var cmd=[];
+		for(var i=0; i<data.length; i++){
+			var x = plot.axisX.getCoord(data[i].x, plotarea, plot);
+			var y = plot.axisY.getCoord(data[i].y, plotarea, plot);
+			if(i==0){ cmd.push("M"); }
+			else { cmd.push("L"); }
+			cmd.push(x+","+y);
+			
+			//	points on the line
+			var c=document.createElementNS(dojo.svg.xmlns.svg, "circle");
+			c.setAttribute("cx",x);
+			c.setAttribute("cy",y);
+			c.setAttribute("r","3");
+			c.setAttribute("fill", data[i].series.color);
+			c.setAttribute("fill-opacity", "0.6");
+			c.setAttribute("stroke-width", "1");
+			c.setAttribute("stroke-opacity", "0.85");
+			line.appendChild(c);
+			if(applyTo){ applyTo(c, data[i].src); }
+		}
+		path.setAttribute("d", cmd.join(" "));
+		return line;	//	SVGGElement
+	},
+	CurvedLine: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as a line with a tension factor for softening.
+		//	Bindings: x/y
+		var tension = 3;
+		var area = plotarea.getArea();
+		var line = document.createElementNS(dojo.svg.xmlns.svg, "g");
+		var path = document.createElementNS(dojo.svg.xmlns.svg, "path");
+		line.appendChild(path);
+
+		path.setAttribute("fill", "none");
+		path.setAttribute("stroke", data[0].series.color);
+		path.setAttribute("stroke-width" , "2");
+		path.setAttribute("stroke-opacity", "0.85");
+		if(data[0].series.label != null){
+			path.setAttribute("title", data[0].series.label);
+		}
+
+		var cmd=[];
+		for(var i=0; i<data.length; i++){
+			var x = plot.axisX.getCoord(data[i].x, plotarea, plot);
+			var y = plot.axisY.getCoord(data[i].y, plotarea, plot);
+			var dx = area.left + 1;
+			var dy = area.bottom;
+			if(i>0){
+				dx = x - plot.axisX.getCoord(data[i-1].x, plotarea, plot);
+				dy = plot.axisY.getCoord(data[i-1].y, plotarea, plot);
+			}
+
+			if(i==0){ cmd.push("M"); }
+			else {
+				cmd.push("C");
+				var cx = x-(tension-1) * (dx/tension);
+				cmd.push(cx + "," + dy);
+				cx = x - (dx/tension);
+				cmd.push(cx + "," + y);
+			}
+			cmd.push(x+","+y);
+			
+			//	points on the line
+			var c=document.createElementNS(dojo.svg.xmlns.svg, "circle");
+			c.setAttribute("cx",x);
+			c.setAttribute("cy",y);
+			c.setAttribute("r","3");
+			c.setAttribute("fill", data[i].series.color);
+			c.setAttribute("fill-opacity", "0.6");
+			c.setAttribute("stroke-width", "1");
+			c.setAttribute("stroke-opacity", "0.85");
+			line.appendChild(c);
+			if(applyTo){ applyTo(c, data[i].src); }
+		}
+		path.setAttribute("d", cmd.join(" "));
+		return line;	// SVGGElement
+	},
+	Area: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as an area.
+		//	Bindings: x/y
+		var area = plotarea.getArea();
+		var line = document.createElementNS(dojo.svg.xmlns.svg, "g");
+		var path = document.createElementNS(dojo.svg.xmlns.svg, "path");
+		line.appendChild(path);
+
+		path.setAttribute("fill", data[0].series.color);
+		path.setAttribute("fill-opacity", "0.4");
+		path.setAttribute("stroke", data[0].series.color);
+		path.setAttribute("stroke-width" , "1");
+		path.setAttribute("stroke-opacity", "0.85");
+		if(data[0].series.label != null){
+			path.setAttribute("title", data[0].series.label);
+		}
+
+		var cmd=[];
+		for(var i=0; i<data.length; i++){
+			var x = plot.axisX.getCoord(data[i].x, plotarea, plot);
+			var y = plot.axisY.getCoord(data[i].y, plotarea, plot);
+			if(i==0){ cmd.push("M"); }
+			else { cmd.push("L"); }
+			cmd.push(x+","+y);
+			
+			//	points on the line
+			var c=document.createElementNS(dojo.svg.xmlns.svg, "circle");
+			c.setAttribute("cx",x);
+			c.setAttribute("cy",y);
+			c.setAttribute("r","3");
+			c.setAttribute("fill", data[i].series.color);
+			c.setAttribute("fill-opacity", "0.6");
+			c.setAttribute("stroke-width", "1");
+			c.setAttribute("stroke-opacity", "0.85");
+			line.appendChild(c);
+			if(applyTo){ applyTo(c, data[i].src); }
+		}
+		//	finish it off
+		cmd.push("L");
+		cmd.push(x + "," + plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+		cmd.push("L");
+		cmd.push(plot.axisX.getCoord(data[0].x, plotarea, plot) + "," +  plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+		cmd.push("Z");
+		path.setAttribute("d", cmd.join(" "));
+		return line;	//	SVGGElement
+	},
+	CurvedArea: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as an area with a tension for softening.
+		//	Bindings: x/y
+		var tension = 3;
+		var area = plotarea.getArea();
+		var line = document.createElementNS(dojo.svg.xmlns.svg, "g");
+		var path = document.createElementNS(dojo.svg.xmlns.svg, "path");
+		line.appendChild(path);
+
+		path.setAttribute("fill", data[0].series.color);
+		path.setAttribute("fill-opacity", "0.4");
+		path.setAttribute("stroke", data[0].series.color);
+		path.setAttribute("stroke-width" , "1");
+		path.setAttribute("stroke-opacity", "0.85");
+		if(data[0].series.label != null){
+			path.setAttribute("title", data[0].series.label);
+		}
+
+		var cmd=[];
+		for(var i=0; i<data.length; i++){
+			var x = plot.axisX.getCoord(data[i].x, plotarea, plot);
+			var y = plot.axisY.getCoord(data[i].y, plotarea, plot);
+			var dx = area.left + 1;
+			var dy = area.bottom;
+			if(i>0){
+				dx = x - plot.axisX.getCoord(data[i-1].x, plotarea, plot);
+				dy = plot.axisY.getCoord(data[i-1].y, plotarea, plot);
+			}
+
+			if(i==0){ cmd.push("M"); }
+			else {
+				cmd.push("C");
+				var cx = x-(tension-1) * (dx/tension);
+				cmd.push(cx + "," + dy);
+				cx = x - (dx/tension);
+				cmd.push(cx + "," + y);
+			}
+			cmd.push(x+","+y);
+			
+			//	points on the line
+			var c=document.createElementNS(dojo.svg.xmlns.svg, "circle");
+			c.setAttribute("cx",x);
+			c.setAttribute("cy",y);
+			c.setAttribute("r","3");
+			c.setAttribute("fill", data[i].series.color);
+			c.setAttribute("fill-opacity", "0.6");
+			c.setAttribute("stroke-width", "1");
+			c.setAttribute("stroke-opacity", "0.85");
+			line.appendChild(c);
+			if(applyTo){ applyTo(c, data[i].src); }
+		}
+		//	finish it off
+		cmd.push("L");
+		cmd.push(x + "," + plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+		cmd.push("L");
+		cmd.push(plot.axisX.getCoord(data[0].x, plotarea, plot) + "," +  plot.axisY.getCoord(plot.axisX.origin, plotarea, plot));
+		cmd.push("Z");
+		path.setAttribute("d", cmd.join(" "));
+		return line;	//	SVGGElement
+	},
+	HighLow: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as a set of high/low bars.
+		//	Bindings: x/high/low
+		var area = plotarea.getArea();
+		var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+		
+		var n = data.length;
+		var part = ((area.right-area.left)/(plot.axisX.range.upper - plot.axisX.range.lower))/4;
+		var w = part*2;
+
+		for(var i=0; i<n; i++){
+			var high = data[i].high;
+			var low = data[i].low;
+			if(low > high){
+				var t = low;
+				low = high;
+				high = t;
+			}
+
+			var x = plot.axisX.getCoord(data[i].x, plotarea, plot) - (w/2);
+			var y = plot.axisY.getCoord(high, plotarea, plot);
+			var h = plot.axisY.getCoord(low, plotarea, plot)-y;
+
+			//	high + low
+			var bar=document.createElementNS(dojo.svg.xmlns.svg, "rect");
+			bar.setAttribute("fill", data[i].series.color);
+			bar.setAttribute("stroke-width", "0");
+			bar.setAttribute("x", x);
+			bar.setAttribute("y", y);
+			bar.setAttribute("width", w);
+			bar.setAttribute("height", h);
+			bar.setAttribute("fill-opacity", "0.6");
+			if(applyTo){ applyTo(bar, data[i].src); }
+			group.appendChild(bar);
+		}
+		return group;	//	SVGGElement
+	},
+	HighLowClose: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as a set of high/low bars with a close indicator.
+		//	Bindings: x/high/low/close
+		var area = plotarea.getArea();
+		var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+		
+		var n = data.length;
+		var part = ((area.right-area.left)/(plot.axisX.range.upper - plot.axisX.range.lower))/4;
+		var w = part*2;
+
+		for(var i=0; i<n; i++){
+			var high = data[i].high;
+			var low = data[i].low;
+			if(low > high){
+				var t = low;
+				low = high;
+				high = t;
+			}
+			var c = data[i].close;
+
+			var x = plot.axisX.getCoord(data[i].x, plotarea, plot) - (w/2);
+			var y = plot.axisY.getCoord(high, plotarea, plot);
+			var h = plot.axisY.getCoord(low, plotarea, plot)-y;
+			var close = plot.axisY.getCoord(c, plotarea, plot);
+
+			var g = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+			//	high + low
+			var bar=document.createElementNS(dojo.svg.xmlns.svg, "rect");
+			bar.setAttribute("fill", data[i].series.color);
+			bar.setAttribute("stroke-width", "0");
+			bar.setAttribute("x", x);
+			bar.setAttribute("y", y);
+			bar.setAttribute("width", w);
+			bar.setAttribute("height", h);
+			bar.setAttribute("fill-opacity", "0.6");
+			g.appendChild(bar);
+
+			//	close
+			var line=document.createElementNS(dojo.svg.xmlns.svg, "line");
+			line.setAttribute("x1", x);
+			line.setAttribute("x2", x+w+(part*2));
+			line.setAttribute("y1", close);
+			line.setAttribute("y2", close);
+			line.setAttribute("style", "stroke:"+data[i].series.color+";stroke-width:1px;stroke-opacity:0.6;");
+			g.appendChild(line);
+
+			if(applyTo){ applyTo(g, data[i].src); }
+			group.appendChild(g);
+		}
+		return group;	//	SVGGElement
+	},
+	HighLowOpenClose: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as a set of high/low bars with open and close indicators.
+		//	Bindings: x/high/low/open/close
+		var area = plotarea.getArea();
+		var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+		
+		var n = data.length;
+		var part = ((area.right-area.left)/(plot.axisX.range.upper - plot.axisX.range.lower))/4;
+		var w = part*2;
+
+		for(var i=0; i<n; i++){
+			var high = data[i].high;
+			var low = data[i].low;
+			if(low > high){
+				var t = low;
+				low = high;
+				high = t;
+			}
+			var o = data[i].open;
+			var c = data[i].close;
+
+			var x = plot.axisX.getCoord(data[i].x, plotarea, plot) - (w/2);
+			var y = plot.axisY.getCoord(high, plotarea, plot);
+			var h = plot.axisY.getCoord(low, plotarea, plot)-y;
+			var open = plot.axisY.getCoord(o, plotarea, plot);
+			var close = plot.axisY.getCoord(c, plotarea, plot);
+
+			var g = document.createElementNS(dojo.svg.xmlns.svg, "g");
+
+			//	high + low
+			var bar=document.createElementNS(dojo.svg.xmlns.svg, "rect");
+			bar.setAttribute("fill", data[i].series.color);
+			bar.setAttribute("stroke-width", "0");
+			bar.setAttribute("x", x);
+			bar.setAttribute("y", y);
+			bar.setAttribute("width", w);
+			bar.setAttribute("height", h);
+			bar.setAttribute("fill-opacity", "0.6");
+			g.appendChild(bar);
+
+			//	open
+			var line=document.createElementNS(dojo.svg.xmlns.svg, "line");
+			line.setAttribute("x1", x-(part*2));
+			line.setAttribute("x2", x+w);
+			line.setAttribute("y1", open);
+			line.setAttribute("y2", open);
+			line.setAttribute("style", "stroke:"+data[i].series.color+";stroke-width:1px;stroke-opacity:0.6;");
+			g.appendChild(line);
+
+			//	close
+			var line=document.createElementNS(dojo.svg.xmlns.svg, "line");
+			line.setAttribute("x1", x);
+			line.setAttribute("x2", x+w+(part*2));
+			line.setAttribute("y1", close);
+			line.setAttribute("y2", close);
+			line.setAttribute("style", "stroke:"+data[i].series.color+";stroke-width:1px;stroke-opacity:0.6;");
+			g.appendChild(line);
+
+			if(applyTo){ applyTo(g, data[i].src); }
+			group.appendChild(g);
+		}
+		return group;	//	SVGGElement
+	},
+	Scatter: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as a set of points.
+		//	Bindings: x/y
+		var r=7;
+		var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+		for (var i=0; i<data.length; i++){
+			var x = plot.axisX.getCoord(data[i].x, plotarea, plot);
+			var y = plot.axisY.getCoord(data[i].y, plotarea, plot);
+			var point = document.createElementNS(dojo.svg.xmlns.svg, "path");
+			point.setAttribute("fill", data[i].series.color);
+			point.setAttribute("stroke-width", "0");
+			point.setAttribute("d",
+				"M " + x + "," + (y-r) + " " +
+				"Q " + x + "," + y + " " + (x+r) + "," + y + " " +
+				"Q " + x + "," + y + " " + x + "," + (y+r) + " " +
+				"Q " + x + "," + y + " " + (x-r) + "," + y + " " +
+				"Q " + x + "," + y + " " + x + "," + (y-r) + " " +
+				"Z"
+			);
+			if(applyTo){ applyTo(point, data[i].src); }
+			group.appendChild(point);
+		}
+		return group;	//	SVGGElement
+	},
+	Bubble: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as a set of points with a size factor.
+		//	Bindings: x/y/size
+		var group = document.createElementNS(dojo.svg.xmlns.svg, "g");
+		var sizeFactor=1;
+		for (var i=0; i<data.length; i++){
+			var x = plot.axisX.getCoord(data[i].x, plotarea, plot);
+			var y = plot.axisY.getCoord(data[i].y, plotarea, plot);
+			if(i==0){
+				//	figure out the size factor, start with the axis with the greater range.
+				var raw = data[i].size;
+				var dy = plot.axisY.getCoord(data[i].y + raw, plotarea, plot)-y;
+				sizeFactor = dy/raw;
+			}
+			if(sizeFactor<1) { sizeFactor = 1; }
+			var point = document.createElementNS(dojo.svg.xmlns.svg, "circle");
+			point.setAttribute("fill", data[i].series.color);
+			point.setAttribute("fill-opacity", "0.8");
+			point.setAttribute("stroke", data[i].series.color);
+			point.setAttribute("stroke-width", "1");
+			point.setAttribute("cx",x);
+			point.setAttribute("cy",y);
+			point.setAttribute("r", (data[i].size/2)*sizeFactor);
+			if(applyTo){ applyTo(point, data[i].src); }
+			group.appendChild(point);
+		}
+		return group;	//	SVGGElement
+	}
+});
+dojo.charting.Plotters["Default"] = dojo.charting.Plotters.Line;

Added: struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/vml/Axis.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/vml/Axis.js?view=auto&rev=514083
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/vml/Axis.js (added)
+++ struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/vml/Axis.js Fri Mar  2 21:48:54 2007
@@ -0,0 +1,270 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.charting.vml.Axis");
+dojo.require("dojo.lang.common");
+
+dojo.extend(dojo.charting.Axis, {
+	renderLines: function(
+		/* dojo.charting.PlotArea */plotArea, 
+		/* dojo.charting.Plot */plot, 
+		/* string */plane
+	){
+		//	summary
+		//	Renders any reference lines for this axis.
+		if(this.nodes.lines){
+			while(this.nodes.lines.childNodes.length > 0){
+				this.nodes.lines.removeChild(this.nodes.lines.childNodes[0]);
+			}
+			if(this.nodes.lines.parentNode){
+				this.nodes.lines.parentNode.removeChild(this.nodes.lines);
+				this.nodes.lines = null;
+			}
+		}
+		
+		var area = plotArea.getArea();
+		var g = this.nodes.lines = document.createElement("div");
+		g.setAttribute("id", this.getId()+"-lines");
+		for(var i=0; i<this._labels.length; i++){
+			if (this._labels[i].value == this.origin){ continue; }
+
+			var v = this.getCoord(this._labels[i].value, plotArea, plot);
+			var l=document.createElement("v:line");
+			var str=document.createElement("v:stroke");
+			str.dashstyle="dot";
+			l.appendChild(str);
+			l.setAttribute("strokecolor", "#666");
+			l.setAttribute("strokeweight", "1px");
+			var s=l.style;
+			s.position="absolute";
+			s.top="0px";
+			s.left="0px";
+			s.antialias="false";
+			if(plane == "x"){
+				l.setAttribute("from", v+"px,"+area.top+"px");
+				l.setAttribute("to", v+"px,"+area.bottom+"px");
+			}
+			else if (plane == "y"){
+				l.setAttribute("from", area.left+"px,"+v+"px");
+				l.setAttribute("to", area.right+"px,"+v+"px");
+			}
+			g.appendChild(l);
+		}
+		return g;	//	HTMLDivElement
+	},
+	renderTicks: function(
+		/* dojo.charting.PlotArea */plotArea, 
+		/* dojo.charting.Plot */plot, 
+		/* string */plane,
+		/* float */coord
+	){
+		//	summary
+		//	Renders any tick lines for this axis.
+		if(this.nodes.ticks){
+			while(this.nodes.ticks.childNodes.length > 0){
+				this.nodes.ticks.removeChild(this.nodes.ticks.childNodes[0]);
+			}
+			if(this.nodes.ticks.parentNode){
+				this.nodes.ticks.parentNode.removeChild(this.nodes.ticks);
+				this.nodes.ticks = null;
+			}
+		}
+		
+		var g = this.nodes.ticks = document.createElement("div");
+		g.setAttribute("id", this.getId()+"-ticks");
+		for(var i=0; i<this._labels.length; i++){
+			var v = this.getCoord(this._labels[i].value, plotArea, plot);
+
+			var l=document.createElement("v:line");
+			l.setAttribute("strokecolor", "#000");
+			l.setAttribute("strokeweight", "1px");
+			var s=l.style;
+			s.position="absolute";
+			s.top="0px";
+			s.left="0px";
+			s.antialias="false";
+			if(plane == "x"){
+				l.setAttribute("from", v+"px,"+coord+"px");
+				l.setAttribute("to", v+"px,"+(coord+3)+"px");
+			}
+			else if (plane == "y"){
+				l.setAttribute("from", (coord-2)+"px,"+v+"px");
+				l.setAttribute("to", (coord+2)+"px,"+v+"px");
+			}
+			g.appendChild(l);
+		}
+		return g;	//	HTMLDivElement
+	},
+	renderLabels: function(
+		/* dojo.charting.PlotArea */plotArea, 
+		/* dojo.charting.Plot */plot, 
+		/* string */plane,
+		/* float */coord,
+		/* int */textSize,
+		/* string */anchor
+	){
+		//	summary
+		//	Render all labels for this axis.
+		function createLabel(label, x, y, textSize, anchor){
+			var text = document.createElement("div");
+			var s=text.style;
+			text.innerHTML=label;
+			s.fontSize=textSize+"px";
+			s.fontFamily="sans-serif";
+			s.position="absolute";
+			s.top = y+"px";
+			if(anchor == "center"){
+				s.left = x + "px";
+				s.textAlign="center";
+			} else if (anchor == "left"){
+				s.left = x + "px";
+				s.textAlign="left";
+			} else if (anchor == "right"){
+				s.right = x + "px";
+				s.textAlign="right";
+			}
+			return text;
+		};
+
+		//	wipe if needed
+		if(this.nodes.labels){
+			while(this.nodes.labels.childNodes.length > 0){
+				this.nodes.labels.removeChild(this.nodes.labels.childNodes[0]);
+			}
+			if(this.nodes.labels.parentNode){
+				this.nodes.labels.parentNode.removeChild(this.nodes.labels);
+				this.nodes.labels = null;
+			}
+		}
+		var g = this.nodes.labels = document.createElement("div");
+		g.setAttribute("id", this.getId()+"-labels");
+
+		for(var i=0; i<this._labels.length; i++){
+			var v = this.getCoord(this._labels[i].value, plotArea, plot);
+			if(plane == "x"){
+				//	ugly hack but it works.
+				var node=createLabel(this._labels[i].label, v, coord, textSize, anchor);
+				document.body.appendChild(node);
+				node.style.left = v-(node.offsetWidth/2)+"px";
+				g.appendChild(node);
+			}
+			else if (plane == "y"){
+				var node = createLabel(this._labels[i].label, coord, v, textSize, anchor);
+				document.body.appendChild(node);
+				node.style.top = v-(node.offsetHeight/2)+"px";
+				g.appendChild(node);
+			}
+		}
+		return g;	//	HTMLDivElement
+	},
+	render: function(
+		/* dojo.charting.PlotArea */plotArea, 
+		/* dojo.charting.Plot */plot,
+		/* dojo.charting.Axis */drawAgainst,
+		/* string */plane
+	){
+		//	summary
+		//	Renders this axis to the given plot.
+
+		//	get the origin plot point.
+		var area = plotArea.getArea();
+		var stroke = 1;
+		var style = "stroke:#000;stroke-width:"+stroke+"px;";
+		var textSize=10;
+		var coord = drawAgainst.getCoord(this.origin, plotArea, plot);
+
+		//	draw the axis.
+		var g = this.nodes.main = document.createElement("div");
+		g.setAttribute("id", this.getId());	//	need a handle if we have to kill parts of the axis def.
+		var line = this.nodes.axis = document.createElement("v:line");
+		line.setAttribute("strokecolor", "#000");
+		line.setAttribute("strokeweight", stroke+"px");
+		var s=line.style;
+		s.position="absolute";
+		s.top="0px";
+		s.left="0px";
+		s.antialias="false";
+		if(plane == "x"){
+			line.setAttribute("from", area.left+"px,"+coord+"px");
+			line.setAttribute("to", area.right+"px,"+coord+"px");
+
+			//	set up the labels
+			var y = coord + Math.floor(textSize/2);
+			if(this.showLines){
+				g.appendChild(this.renderLines(plotArea, plot, plane, y));
+			}
+			if(this.showTicks){
+				g.appendChild(this.renderTicks(plotArea, plot, plane, coord));
+			}
+			if(this.showLabels){
+				g.appendChild(this.renderLabels(plotArea, plot, plane, y, textSize, "center"));
+			}
+			if(this.showLabel && this.label){
+				var x = plotArea.size.width/2;
+				var y = coord + Math.round(textSize*1.5); 
+				var text = document.createElement("div");
+				var s=text.style;
+				text.innerHTML=this.label;
+				s.fontSize=(textSize+2)+"px";
+				s.fontFamily="sans-serif";
+				s.fontWeight="bold";
+				s.position="absolute";
+				s.top = y+"px";
+				s.left = x + "px";
+				s.textAlign="center";
+				document.body.appendChild(text);
+				text.style.left = x-(text.offsetWidth/2)+"px";
+				g.appendChild(text);
+			}
+		} else {
+			line.setAttribute("from", coord+"px,"+area.top+"px");
+			line.setAttribute("to", coord+"px,"+area.bottom+"px");
+
+			//	set up the labels
+			var isMax = this.origin == drawAgainst.range.upper;
+			var x = coord+4;
+			var anchor = "left";
+			if(!isMax){
+				x = area.right-coord+textSize+4;
+				anchor = "right";
+				if(coord == area.left){ x += (textSize*2)-(textSize/2); }
+			}
+			if(this.showLines){
+				g.appendChild(this.renderLines(plotArea, plot, plane, x));
+			}
+			if(this.showTicks){
+				g.appendChild(this.renderTicks(plotArea, plot, plane, coord));
+			}
+			if(this.showLabels){
+				g.appendChild(this.renderLabels(plotArea, plot, plane, x, textSize, anchor));
+			}
+			if(this.showLabel && this.label){
+				x += (textSize*2)-2;
+				var y = plotArea.size.height/2;
+				var text = document.createElement("div");
+				var s=text.style;
+				text.innerHTML=this.label;
+				s.fontSize=(textSize+2)+"px";
+				s.fontFamily="sans-serif";
+				s.fontWeight="bold";
+				s.position="absolute";
+				s.height = plotArea.size.height+"px";
+				s.writingMode = "tb-rl";
+				s.textAlign="center";
+				s[anchor] = x+"px";
+				document.body.appendChild(text);
+				s.top = y-(text.offsetHeight/2)+"px";
+				g.appendChild(text);
+			}
+		}
+		g.appendChild(line);
+		return g;	//	HTMLDivElement
+	}
+});

Added: struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/vml/PlotArea.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/vml/PlotArea.js?view=auto&rev=514083
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/vml/PlotArea.js (added)
+++ struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/vml/PlotArea.js Fri Mar  2 21:48:54 2007
@@ -0,0 +1,78 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.charting.vml.PlotArea");
+dojo.require("dojo.lang.common");
+
+dojo.extend(dojo.charting.PlotArea, {
+	initializePlot: function(plot){
+		//	summary
+		//	Initialize the plot node for data rendering.
+		plot.destroy();
+		plot.dataNode = document.createElement("div");
+		plot.dataNode.id  = plot.getId();
+		return plot.dataNode;	//	HTMLDivElement
+	},
+	initialize:function(){
+		//	summary
+		//	Initialize the PlotArea.
+	
+		this.destroy();	//	kill everything first.
+		var main = this.nodes.main = document.createElement("div");
+		
+		//	start with the background
+		var area = this.nodes.area = document.createElement("div");
+		area.id = this.getId();
+		area.style.width=this.size.width+"px";
+		area.style.height=this.size.height+"px";
+		area.style.position="absolute";
+		main.appendChild(area);
+	
+		var bg = this.nodes.background = document.createElement("div");
+		bg.id = this.getId()+"-background";
+		bg.style.width=this.size.width+"px";
+		bg.style.height=this.size.height+"px";
+		bg.style.position="absolute";
+		bg.style.top="0px";
+		bg.style.left="0px";
+		bg.style.backgroundColor="#fff";
+		area.appendChild(bg);
+
+		//	the plot group
+		var a=this.getArea();
+		var plots = this.nodes.plots = document.createElement("div");
+		plots.id = this.getId()+"-plots";
+		plots.style.width=this.size.width+"px";
+		plots.style.height=this.size.height+"px";
+		plots.style.position="absolute";
+		plots.style.top="0px";
+		plots.style.left="0px";
+		plots.style.clip="rect("
+			+ a.top+" "
+			+ a.right+" "
+			+ a.bottom+" "
+			+ a.left
+			+")";
+		area.appendChild(plots);
+		for(var i=0; i<this.plots.length; i++){
+			plots.appendChild(this.initializePlot(this.plots[i]));
+		}
+
+		var axes = this.nodes.axes = document.createElement("div");
+		axes.id = this.getId() + "-axes";
+		area.appendChild(axes);
+		var ax = this.getAxes();
+		for(var p in ax){
+			var obj = ax[p];
+			axes.appendChild(obj.axis.initialize(this, obj.plot, obj.drawAgainst, obj.plane));
+		}
+		return main;	//	HTMLDivElement
+	}
+});

Added: struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/vml/Plotters.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/vml/Plotters.js?view=auto&rev=514083
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/vml/Plotters.js (added)
+++ struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/charting/vml/Plotters.js Fri Mar  2 21:48:54 2007
@@ -0,0 +1,1141 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.charting.vml.Plotters");
+dojo.require("dojo.lang.common");
+
+dojo.mixin(dojo.charting.Plotters, {
+	/*********************************************************
+	 *	Grouped plotters: need all series on a plot at once.
+	 *********************************************************/
+	Bar: function(
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* object? */kwArgs,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots a set of grouped bars.
+		//	Bindings: y
+		var area = plotarea.getArea();
+		var group = document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+		
+		//	precompile the data
+		var n = plot.series.length;	//	how many series
+		var data = [];
+		for(var i=0; i<n; i++){
+			var tmp = plot.series[i].data.evaluate(kwArgs);
+			data.push(tmp);
+		}
+
+		//	calculate the width of each bar.
+		var space = 8;
+		var nPoints = data[0].length;
+		var width = ((area.right-area.left)-(space*(nPoints-1)))/nPoints;	//	the width of each group.
+		var barWidth = Math.round(width/n);	//	the width of each bar, no spaces.
+		var yOrigin = plot.axisY.getCoord(plot.axisX.origin, plotarea, plot);
+
+		for(var i=0; i<nPoints; i++){
+			//	calculate offset
+			var xStart = area.left+(width*i)+(space*i);
+			for(var j=0; j<n; j++){
+				var value = data[j][i].y;
+				var yA = yOrigin;
+				var x = xStart + (barWidth*j);
+				var y = plot.axisY.getCoord(value, plotarea, plot);
+				var h = Math.abs(yA-y);
+				if(value < plot.axisX.origin){
+					yA = y;
+					y = yOrigin;
+				}
+				
+				var bar=document.createElement("v:rect");
+				bar.style.position="absolute";
+				bar.style.top=y+1+"px";
+				bar.style.left=x+"px";
+				bar.style.width=barWidth+"px";
+				bar.style.height=h+"px";
+				bar.setAttribute("fillColor", data[j][i].series.color);
+				bar.setAttribute("stroked", "false");
+				bar.style.antialias="false";
+				var fill=document.createElement("v:fill");
+				fill.setAttribute("opacity", "0.6");
+				bar.appendChild(fill);
+				if(applyTo){ applyTo(bar, data[j][i].src); }
+				group.appendChild(bar);
+			}
+		}
+		return group;	//	HTMLDivElement
+	},
+	HorizontalBar: function(
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* object? */kwArgs,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots data in a set of grouped bars horizontally.
+		//	Bindings: y
+		var area = plotarea.getArea();
+		var group = document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+		
+		//	precompile the data
+		var n = plot.series.length;	//	how many series
+		var data = [];
+		for(var i=0; i<n; i++){
+			var tmp = plot.series[i].data.evaluate(kwArgs);
+			data.push(tmp);
+		}
+
+		var space = 6;
+		var nPoints = data[0].length;
+		var h = ((area.bottom-area.top)-(space*(nPoints-1)))/nPoints;
+		var barH = h/n;
+		var xOrigin = plot.axisX.getCoord(0, plotarea, plot);
+
+		for(var i=0; i<nPoints; i++){
+			//	calculate offset
+			var yStart = area.top+(h*i)+(space*i);
+			for(var j=0; j<n; j++){
+				var value = data[j][i].y;
+				var y = yStart + (barH*j);
+				var xA = xOrigin;
+				var x = plot.axisX.getCoord(value, plotarea, plot);
+				var w = Math.abs(x-xA);
+				if(value > 0){
+					x = xOrigin;
+				}
+				
+				var bar=document.createElement("v:rect");
+				bar.style.position="absolute";
+				bar.style.top=y+1+"px";
+				bar.style.left=xA+"px";
+				bar.style.width=w+"px";
+				bar.style.height=barH+"px";
+				bar.setAttribute("fillColor", data[j][i].series.color);
+				bar.setAttribute("stroked", "false");
+				bar.style.antialias="false";
+				var fill=document.createElement("v:fill");
+				fill.setAttribute("opacity", "0.6");
+				bar.appendChild(fill);
+				if(applyTo){ applyTo(bar, data[j][i].src); }
+				group.appendChild(bar);
+			}
+		}
+
+		//	calculate the width of each bar.
+		var space = 4;
+		var n = plot.series.length;
+		var h = ((area.bottom-area.top)-(space*(n-1)))/n;
+		var xOrigin = plot.axisX.getCoord(0, plotarea, plot);
+		for(var i=0; i<n; i++){
+			var series = plot.series[i];
+			var data = series.data.evaluate(kwArgs);
+			var y = area.top+(h*i)+(space*i);
+			var value = data[data.length-1].y;
+
+			var xA = xOrigin;
+			var x = plot.axisX.getCoord(value, plotarea, plot);
+			var w = Math.abs(xA-x);
+			if(value > 0){
+				xA = x;
+				x = xOrigin;
+			}
+			
+		}
+		return group;	//	HTMLDivElement
+	},
+	Gantt: function(
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* object? */kwArgs,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots a grouped set of Gantt bars
+		//	Bindings: high/low
+		var area = plotarea.getArea();
+		var group = document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+		
+		//	precompile the data
+		var n = plot.series.length;	//	how many series
+		var data = [];
+		for(var i=0; i<n; i++){
+			var tmp = plot.series[i].data.evaluate(kwArgs);
+			data.push(tmp);
+		}
+
+		var space = 2;
+		var nPoints = data[0].length;
+		var h = ((area.bottom-area.top)-(space*(nPoints-1)))/nPoints;
+		var barH = h/n;
+		for(var i=0; i<nPoints; i++){
+			//	calculate offset
+			var yStart = area.top+(h*i)+(space*i);
+			for(var j=0; j<n; j++){
+				var high = data[j][i].high;
+				var low = data[j][i].low;
+				if(low > high){
+					var t = high;
+					high = low;
+					low = t;
+				}
+				var x = plot.axisX.getCoord(low, plotarea, plot);
+				var w = plot.axisX.getCoord(high, plotarea, plot) - x;
+				var y = yStart + (barH*j);
+				
+				var bar=document.createElement("v:rect");
+				bar.style.position="absolute";
+				bar.style.top=y+1+"px";
+				bar.style.left=x+"px";
+				bar.style.width=w+"px";
+				bar.style.height=barH+"px";
+				bar.setAttribute("fillColor", data[j][i].series.color);
+				bar.setAttribute("stroked", "false");
+				bar.style.antialias="false";
+				var fill=document.createElement("v:fill");
+				fill.setAttribute("opacity", "0.6");
+				bar.appendChild(fill);
+				if(applyTo){ applyTo(bar, data[j][i].src); }
+				group.appendChild(bar);
+			}
+		}
+		return group;	//	HTMLDivElement
+	},
+	StackedArea: function(
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* object? */kwArgs,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots a set of stacked areas.
+		//	Bindings: x/y
+		var area = plotarea.getArea();
+		var group=document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+
+		//	precompile the data
+		var n = plot.series.length;	//	how many series
+		var data = [];
+		var totals = [];
+
+		//	we're assuming that all series for this plot has the name x assignment for now.
+		for(var i=0; i<n; i++){
+			var tmp = plot.series[i].data.evaluate(kwArgs);
+			//	run through and add current totals
+			for(var j=0; j<tmp.length; j++){
+				if(i==0){ totals.push(tmp[j].y); }
+				else { totals[j] += tmp[j].y; }
+				tmp[j].y = totals[j];
+			}
+			data.push(tmp);
+		}
+
+		for(var i=n-1; i>=0; i--){
+			var path=document.createElement("v:shape");
+			path.setAttribute("strokeweight", "1px");
+			path.setAttribute("strokecolor", data[i][0].series.color);
+			path.setAttribute("fillcolor", data[i][0].series.color);
+			path.setAttribute("coordsize", (area.right-area.left) + "," + (area.bottom-area.top));
+			path.style.position="absolute";
+			path.style.top="0px";
+			path.style.left="0px";
+			path.style.width=area.right-area.left+"px";
+			path.style.height=area.bottom-area.top+"px";
+			var stroke=document.createElement("v:stroke");
+			stroke.setAttribute("opacity", "0.8");
+			path.appendChild(stroke);
+			var fill=document.createElement("v:fill");
+			fill.setAttribute("opacity", "0.4");
+			path.appendChild(fill);
+
+			var cmd = [];
+			var r=3;
+			for(var j=0; j<data[i].length; j++){
+				var values = data[i];
+				var x = Math.round(plot.axisX.getCoord(values[j].x, plotarea, plot));
+				var y = Math.round(plot.axisY.getCoord(values[j].y, plotarea, plot));
+
+				if (j==0){
+					cmd.push("m");
+					cmd.push(x+","+y);
+				}else{
+					cmd.push("l");
+					cmd.push(x+","+y);
+				}
+
+				//	add the circle.
+				var c = document.createElement("v:oval");
+				c.setAttribute("strokeweight", "1px");
+				c.setAttribute("strokecolor", values[j].series.color);
+				c.setAttribute("fillcolor", values[j].series.color);
+				var str=document.createElement("v:stroke");
+				str.setAttribute("opacity","0.8");
+				c.appendChild(str);
+				str=document.createElement("v:fill");
+				str.setAttribute("opacity","0.6");
+				c.appendChild(str);
+				var s=c.style;
+				s.position="absolute";
+				s.top=(y-r)+"px";
+				s.left=(x-r)+"px";
+				s.width=(r*2)+"px";
+				s.height=(r*2)+"px";
+				group.appendChild(c);
+				if(applyTo){ applyTo(c, data[j].src); }
+			}
+
+			//	now run the path backwards from the previous series.
+			if(i == 0){
+				cmd.push("l");
+				cmd.push(x + "," + Math.round(plot.axisY.getCoord(plot.axisX.origin, plotarea, plot)));
+				cmd.push("l");
+				cmd.push(Math.round(plot.axisX.getCoord(data[0][0].x, plotarea, plot)) + "," +  Math.round(plot.axisY.getCoord(plot.axisX.origin, plotarea, plot)));
+			} else {
+				var values = data[i-1];
+				cmd.push("l");
+				cmd.push(x + "," + Math.round(plot.axisY.getCoord(values[values.length-1].y, plotarea, plot)));
+				for(var j=values.length-2; j>=0; j--){
+					var x = Math.round(plot.axisX.getCoord(values[j].x, plotarea, plot));
+					var y = Math.round(plot.axisY.getCoord(values[j].y, plotarea, plot));
+					
+					cmd.push("l");
+					cmd.push(x+","+y);
+				}
+			}
+			path.setAttribute("path", cmd.join(" ")+" x e");
+			group.appendChild(path);
+		}
+		return group;	//	HTMLDivElement
+	},
+	StackedCurvedArea: function(
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* object? */kwArgs,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots a set of stacked areas, using a tensioning factor to soften points.
+		//	Bindings: x/y
+		var tension = 3;
+		var area = plotarea.getArea();
+		var group=document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+
+		//	precompile the data
+		var n = plot.series.length;	//	how many series
+		var data = [];
+		var totals = [];
+
+		//	we're assuming that all series for this plot has the name x assignment for now.
+		for(var i=0; i<n; i++){
+			var tmp = plot.series[i].data.evaluate(kwArgs);
+			//	run through and add current totals
+			for(var j=0; j<tmp.length; j++){
+				if(i==0){ totals.push(tmp[j].y); }
+				else { totals[j] += tmp[j].y; }
+				tmp[j].y = totals[j];
+			}
+			data.push(tmp);
+		}
+
+		for(var i=n-1; i>=0; i--){
+			var path=document.createElement("v:shape");
+			path.setAttribute("strokeweight", "1px");
+			path.setAttribute("strokecolor", data[i][0].series.color);
+			path.setAttribute("fillcolor", data[i][0].series.color);
+			path.setAttribute("coordsize", (area.right-area.left) + "," + (area.bottom-area.top));
+			path.style.position="absolute";
+			path.style.top="0px";
+			path.style.left="0px";
+			path.style.width=area.right-area.left+"px";
+			path.style.height=area.bottom-area.top+"px";
+			var stroke=document.createElement("v:stroke");
+			stroke.setAttribute("opacity", "0.8");
+			path.appendChild(stroke);
+			var fill=document.createElement("v:fill");
+			fill.setAttribute("opacity", "0.4");
+			path.appendChild(fill);
+
+			var cmd = [];
+			var r=3;
+			for(var j=0; j<data[i].length; j++){
+				var values = data[i];
+				var x = Math.round(plot.axisX.getCoord(values[j].x, plotarea, plot));
+				var y = Math.round(plot.axisY.getCoord(values[j].y, plotarea, plot));
+
+				if (j==0){
+					cmd.push("m");
+					cmd.push(x+","+y);
+				}else{
+					var lastx = Math.round(plot.axisX.getCoord(values[j-1].x, plotarea, plot));
+					var lasty = Math.round(plot.axisY.getCoord(values[j-1].y, plotarea, plot));
+					var dx=x-lastx;
+					var dy=y-lasty;
+					
+					cmd.push("c");
+					var cx=Math.round((x-(tension-1)*(dx/tension)));
+					cmd.push(cx+","+lasty);
+					cx=Math.round((x-(dx/tension)));
+					cmd.push(cx+","+y);
+					cmd.push(x+","+y);
+				}
+
+				//	add the circle.
+				var c = document.createElement("v:oval");
+				c.setAttribute("strokeweight", "1px");
+				c.setAttribute("strokecolor", values[j].series.color);
+				c.setAttribute("fillcolor", values[j].series.color);
+				var str=document.createElement("v:stroke");
+				str.setAttribute("opacity","0.8");
+				c.appendChild(str);
+				str=document.createElement("v:fill");
+				str.setAttribute("opacity","0.6");
+				c.appendChild(str);
+				var s=c.style;
+				s.position="absolute";
+				s.top=(y-r)+"px";
+				s.left=(x-r)+"px";
+				s.width=(r*2)+"px";
+				s.height=(r*2)+"px";
+				group.appendChild(c);
+				if(applyTo){ applyTo(c, data[j].src); }
+			}
+
+			//	now run the path backwards from the previous series.
+			if(i == 0){
+				cmd.push("l");
+				cmd.push(x + "," + Math.round(plot.axisY.getCoord(plot.axisX.origin, plotarea, plot)));
+				cmd.push("l");
+				cmd.push(Math.round(plot.axisX.getCoord(data[0][0].x, plotarea, plot)) + "," +  Math.round(plot.axisY.getCoord(plot.axisX.origin, plotarea, plot)));
+			} else {
+				var values = data[i-1];
+				cmd.push("l");
+				cmd.push(x + "," + Math.round(plot.axisY.getCoord(values[values.length-1].y, plotarea, plot)));
+				for(var j=values.length-2; j>=0; j--){
+					var x = Math.round(plot.axisX.getCoord(values[j].x, plotarea, plot));
+					var y = Math.round(plot.axisY.getCoord(values[j].y, plotarea, plot));
+
+					var lastx = Math.round(plot.axisX.getCoord(values[j+1].x, plotarea, plot));
+					var lasty = Math.round(plot.axisY.getCoord(values[j+1].y, plotarea, plot));
+					var dx=x-lastx;
+					var dy=y-lasty;
+					
+					cmd.push("c");
+					var cx=Math.round((x-(tension-1)*(dx/tension)));
+					cmd.push(cx+","+lasty);
+					cx=Math.round((x-(dx/tension)));
+					cmd.push(cx+","+y);
+					cmd.push(x+","+y);
+				}
+			}
+			path.setAttribute("path", cmd.join(" ")+" x e");
+			group.appendChild(path);
+		}
+		return group;	//	HTMLDivElement
+	},
+
+	/*********************************************************
+	 *	Single plotters: one series at a time.
+	 *********************************************************/
+	DataBar: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots a set of bars in relation to y==0.
+		//	Bindings: x/y
+		var area = plotarea.getArea();
+		var group = document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+		
+		var n = data.length;
+		var w = (area.right-area.left)/(plot.axisX.range.upper - plot.axisX.range.lower);	//	the width of each group.
+		var yOrigin = plot.axisY.getCoord(plot.axisX.origin, plotarea, plot);
+
+		for(var i=0; i<n; i++){
+			//	calculate offset
+			var value = data[i].y;
+			var yA = yOrigin;
+			var x = plot.axisX.getCoord(data[i].x, plotarea, plot)-(w/2)+1;
+			var y = plot.axisY.getCoord(value, plotarea, plot);
+			var h = Math.abs(yA-y);
+			if(value < plot.axisX.origin){
+				yA = y;
+				y = yOrigin;
+			}
+			var bar=document.createElement("v:rect");
+			bar.style.position="absolute";
+			bar.style.top=y+1+"px";
+			bar.style.left=x+"px";
+			bar.style.width=w+"px";
+			bar.style.height=h+"px";
+			bar.setAttribute("fillColor", data[i].series.color);
+			bar.setAttribute("stroked", "false");
+			bar.style.antialias="false";
+			var fill=document.createElement("v:fill");
+			fill.setAttribute("opacity", "0.6");
+			bar.appendChild(fill);
+			if(applyTo){ applyTo(bar, data[i].src); }
+			group.appendChild(bar);
+		}
+		return group;	//	HTMLDivElement
+	},
+	Line: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as a line.
+		//	Bindings: x/y
+		var area = plotarea.getArea();
+		var group=document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+
+		var path=document.createElement("v:shape");
+		path.setAttribute("strokeweight", "2px");
+		path.setAttribute("strokecolor", data[0].series.color);
+		path.setAttribute("fillcolor", "none");
+		path.setAttribute("filled", "false");
+		path.setAttribute("coordsize", (area.right-area.left) + "," + (area.bottom-area.top));
+		path.style.position="absolute";
+		path.style.top="0px";
+		path.style.left="0px";
+		path.style.width=area.right-area.left+"px";
+		path.style.height=area.bottom-area.top+"px";
+		var stroke=document.createElement("v:stroke");
+		stroke.setAttribute("opacity", "0.8");
+		path.appendChild(stroke);
+
+		var cmd = [];
+		var r=3;
+		for(var i=0; i<data.length; i++){
+			var x = Math.round(plot.axisX.getCoord(data[i].x, plotarea, plot));
+			var y = Math.round(plot.axisY.getCoord(data[i].y, plotarea, plot));
+
+			if (i==0){
+				cmd.push("m");
+				cmd.push(x+","+y);
+			}else{
+				cmd.push("l");
+				cmd.push(x+","+y);
+			}
+
+			//	add the circle.
+			var c = document.createElement("v:oval");
+			c.setAttribute("strokeweight", "1px");
+			c.setAttribute("strokecolor", data[i].series.color);
+			c.setAttribute("fillcolor", data[i].series.color);
+			var str=document.createElement("v:stroke");
+			str.setAttribute("opacity","0.8");
+			c.appendChild(str);
+			str=document.createElement("v:fill");
+			str.setAttribute("opacity","0.6");
+			c.appendChild(str);
+			var s=c.style;
+			s.position="absolute";
+			s.top=(y-r)+"px";
+			s.left=(x-r)+"px";
+			s.width=(r*2)+"px";
+			s.height=(r*2)+"px";
+			group.appendChild(c);
+			if(applyTo){ applyTo(c, data[i].src); }
+		}
+		path.setAttribute("path", cmd.join(" ")+" e");
+		group.appendChild(path);
+		return group;	//	HTMLDivElement
+	},
+	CurvedLine: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as a line with a tension factor for softening.
+		//	Bindings: x/y
+		var tension = 3;
+		var area = plotarea.getArea();
+		var group=document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+
+		var path=document.createElement("v:shape");
+		path.setAttribute("strokeweight", "2px");
+		path.setAttribute("strokecolor", data[0].series.color);
+		path.setAttribute("fillcolor", "none");
+		path.setAttribute("filled", "false");
+		path.setAttribute("coordsize", (area.right-area.left) + "," + (area.bottom-area.top));
+		path.style.position="absolute";
+		path.style.top="0px";
+		path.style.left="0px";
+		path.style.width=area.right-area.left+"px";
+		path.style.height=area.bottom-area.top+"px";
+		var stroke=document.createElement("v:stroke");
+		stroke.setAttribute("opacity", "0.8");
+		path.appendChild(stroke);
+
+		var cmd = [];
+		var r=3;
+		for(var i=0; i<data.length; i++){
+			var x = Math.round(plot.axisX.getCoord(data[i].x, plotarea, plot));
+			var y = Math.round(plot.axisY.getCoord(data[i].y, plotarea, plot));
+
+			if (i==0){
+				cmd.push("m");
+				cmd.push(x+","+y);
+			}else{
+				var lastx = Math.round(plot.axisX.getCoord(data[i-1].x, plotarea, plot));
+				var lasty = Math.round(plot.axisY.getCoord(data[i-1].y, plotarea, plot));
+				var dx=x-lastx;
+				var dy=y-lasty;
+				
+				cmd.push("c");
+				var cx=Math.round((x-(tension-1)*(dx/tension)));
+				cmd.push(cx+","+lasty);
+				cx=Math.round((x-(dx/tension)));
+				cmd.push(cx+","+y);
+				cmd.push(x+","+y);
+			}
+
+			//	add the circle.
+			var c = document.createElement("v:oval");
+			c.setAttribute("strokeweight", "1px");
+			c.setAttribute("strokecolor", data[i].series.color);
+			c.setAttribute("fillcolor", data[i].series.color);
+			var str=document.createElement("v:stroke");
+			str.setAttribute("opacity","0.8");
+			c.appendChild(str);
+			str=document.createElement("v:fill");
+			str.setAttribute("opacity","0.6");
+			c.appendChild(str);
+			var s=c.style;
+			s.position="absolute";
+			s.top=(y-r)+"px";
+			s.left=(x-r)+"px";
+			s.width=(r*2)+"px";
+			s.height=(r*2)+"px";
+			group.appendChild(c);
+			if(applyTo){ applyTo(c, data[i].src); }
+		}
+		path.setAttribute("path", cmd.join(" ")+" e");
+		group.appendChild(path);
+		return group;	//	HTMLDivElement
+	},
+	Area: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as an area.
+		//	Bindings: x/y
+		var area = plotarea.getArea();
+		var group=document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+
+		var path=document.createElement("v:shape");
+		path.setAttribute("strokeweight", "1px");
+		path.setAttribute("strokecolor", data[0].series.color);
+		path.setAttribute("fillcolor", data[0].series.color);
+		path.setAttribute("coordsize", (area.right-area.left) + "," + (area.bottom-area.top));
+		path.style.position="absolute";
+		path.style.top="0px";
+		path.style.left="0px";
+		path.style.width=area.right-area.left+"px";
+		path.style.height=area.bottom-area.top+"px";
+		var stroke=document.createElement("v:stroke");
+		stroke.setAttribute("opacity", "0.8");
+		path.appendChild(stroke);
+		var fill=document.createElement("v:fill");
+		fill.setAttribute("opacity", "0.4");
+		path.appendChild(fill);
+
+		var cmd = [];
+		var r=3;
+		for(var i=0; i<data.length; i++){
+			var x = Math.round(plot.axisX.getCoord(data[i].x, plotarea, plot));
+			var y = Math.round(plot.axisY.getCoord(data[i].y, plotarea, plot));
+
+			if (i==0){
+				cmd.push("m");
+				cmd.push(x+","+y);
+			}else{
+				cmd.push("l");
+				cmd.push(x+","+y);
+			}
+
+			//	add the circle.
+			var c = document.createElement("v:oval");
+			c.setAttribute("strokeweight", "1px");
+			c.setAttribute("strokecolor", data[i].series.color);
+			c.setAttribute("fillcolor", data[i].series.color);
+			var str=document.createElement("v:stroke");
+			str.setAttribute("opacity","0.8");
+			c.appendChild(str);
+			str=document.createElement("v:fill");
+			str.setAttribute("opacity","0.6");
+			c.appendChild(str);
+			var s=c.style;
+			s.position="absolute";
+			s.top=(y-r)+"px";
+			s.left=(x-r)+"px";
+			s.width=(r*2)+"px";
+			s.height=(r*2)+"px";
+			group.appendChild(c);
+			if(applyTo){ applyTo(c, data[i].src); }
+		}
+		cmd.push("l");
+		cmd.push(x + "," + Math.round(plot.axisY.getCoord(plot.axisX.origin, plotarea, plot)));
+		cmd.push("l");
+		cmd.push(Math.round(plot.axisX.getCoord(data[0].x, plotarea, plot)) + "," +  Math.round(plot.axisY.getCoord(plot.axisX.origin, plotarea, plot)));
+		path.setAttribute("path", cmd.join(" ")+" x e");
+		group.appendChild(path);
+		return group;	//	HTMLDivElement
+	},
+	CurvedArea: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as an area with a tension for softening.
+		//	Bindings: x/y
+		var tension = 3;
+		var area = plotarea.getArea();
+		var group=document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+
+		var path=document.createElement("v:shape");
+		path.setAttribute("strokeweight", "1px");
+		path.setAttribute("strokecolor", data[0].series.color);
+		path.setAttribute("fillcolor", data[0].series.color);
+		path.setAttribute("coordsize", (area.right-area.left) + "," + (area.bottom-area.top));
+		path.style.position="absolute";
+		path.style.top="0px";
+		path.style.left="0px";
+		path.style.width=area.right-area.left+"px";
+		path.style.height=area.bottom-area.top+"px";
+		var stroke=document.createElement("v:stroke");
+		stroke.setAttribute("opacity", "0.8");
+		path.appendChild(stroke);
+		var fill=document.createElement("v:fill");
+		fill.setAttribute("opacity", "0.4");
+		path.appendChild(fill);
+
+		var cmd = [];
+		var r=3;
+		for(var i=0; i<data.length; i++){
+			var x = Math.round(plot.axisX.getCoord(data[i].x, plotarea, plot));
+			var y = Math.round(plot.axisY.getCoord(data[i].y, plotarea, plot));
+
+			if (i==0){
+				cmd.push("m");
+				cmd.push(x+","+y);
+			}else{
+				var lastx = Math.round(plot.axisX.getCoord(data[i-1].x, plotarea, plot));
+				var lasty = Math.round(plot.axisY.getCoord(data[i-1].y, plotarea, plot));
+				var dx=x-lastx;
+				var dy=y-lasty;
+				
+				cmd.push("c");
+				var cx=Math.round((x-(tension-1)*(dx/tension)));
+				cmd.push(cx+","+lasty);
+				cx=Math.round((x-(dx/tension)));
+				cmd.push(cx+","+y);
+				cmd.push(x+","+y);
+			}
+
+			//	add the circle.
+			var c = document.createElement("v:oval");
+			c.setAttribute("strokeweight", "1px");
+			c.setAttribute("strokecolor", data[i].series.color);
+			c.setAttribute("fillcolor", data[i].series.color);
+			var str=document.createElement("v:stroke");
+			str.setAttribute("opacity","0.8");
+			c.appendChild(str);
+			str=document.createElement("v:fill");
+			str.setAttribute("opacity","0.6");
+			c.appendChild(str);
+			var s=c.style;
+			s.position="absolute";
+			s.top=(y-r)+"px";
+			s.left=(x-r)+"px";
+			s.width=(r*2)+"px";
+			s.height=(r*2)+"px";
+			group.appendChild(c);
+			if(applyTo){ applyTo(c, data[i].src); }
+		}
+		cmd.push("l");
+		cmd.push(x + "," + Math.round(plot.axisY.getCoord(plot.axisX.origin, plotarea, plot)));
+		cmd.push("l");
+		cmd.push(Math.round(plot.axisX.getCoord(data[0].x, plotarea, plot)) + "," +  Math.round(plot.axisY.getCoord(plot.axisX.origin, plotarea, plot)));
+		path.setAttribute("path", cmd.join(" ")+" x e");
+		group.appendChild(path);
+		return group;	//	HTMLDivElement
+	},
+	HighLow: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as a set of high/low bars.
+		//	Bindings: x/high/low
+		var area = plotarea.getArea();
+		var group=document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+		
+		var n = data.length;
+		var part = ((area.right-area.left)/(plot.axisX.range.upper - plot.axisX.range.lower))/4;
+		var w = part*2;
+
+		for(var i=0; i<n; i++){
+			var high = data[i].high;
+			var low = data[i].low;
+			if(low > high){
+				var t = low;
+				low = high;
+				high = t;
+			}
+
+			var x = plot.axisX.getCoord(data[i].x, plotarea, plot) - (w/2);
+			var y = plot.axisY.getCoord(high, plotarea, plot);
+			var h = plot.axisY.getCoord(low, plotarea, plot)-y;
+
+			//	high + low
+			var bar=document.createElement("v:rect");
+			bar.style.position="absolute";
+			bar.style.top=y+1+"px";
+			bar.style.left=x+"px";
+			bar.style.width=w+"px";
+			bar.style.height=h+"px";
+			bar.setAttribute("fillColor", data[i].series.color);
+			bar.setAttribute("stroked", "false");
+			bar.style.antialias="false";
+			var fill=document.createElement("v:fill");
+			fill.setAttribute("opacity", "0.6");
+			bar.appendChild(fill);
+			if(applyTo){ applyTo(bar, data[i].src); }
+			group.appendChild(bar);
+		}
+		return group;	//	HTMLDivElement
+	},	
+	HighLowClose: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as a set of high/low bars with a close indicator.
+		//	Bindings: x/high/low/close
+		var area = plotarea.getArea();
+		var group=document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+		
+		var n = data.length;
+		var part = ((area.right-area.left)/(plot.axisX.range.upper - plot.axisX.range.lower))/4;
+		var w = part*2;
+
+		for(var i=0; i<n; i++){
+			var high = data[i].high;
+			var low = data[i].low;
+			if(low > high){
+				var t = low;
+				low = high;
+				high = t;
+			}
+			var c = data[i].close;
+
+			var x = plot.axisX.getCoord(data[i].x, plotarea, plot) - (w/2);
+			var y = plot.axisY.getCoord(high, plotarea, plot);
+			var h = plot.axisY.getCoord(low, plotarea, plot)-y;
+			var close = plot.axisY.getCoord(c, plotarea, plot);
+
+			var g = document.createElement("div");
+
+			//	high + low
+			var bar=document.createElement("v:rect");
+			bar.style.position="absolute";
+			bar.style.top=y+1+"px";
+			bar.style.left=x+"px";
+			bar.style.width=w+"px";
+			bar.style.height=h+"px";
+			bar.setAttribute("fillColor", data[i].series.color);
+			bar.setAttribute("stroked", "false");
+			bar.style.antialias="false";
+			var fill=document.createElement("v:fill");
+			fill.setAttribute("opacity", "0.6");
+			bar.appendChild(fill);
+			g.appendChild(bar);
+
+			var line = document.createElement("v:line");
+			line.setAttribute("strokecolor", data[i].series.color);
+			line.setAttribute("strokeweight", "1px");
+			line.setAttribute("from", x+"px,"+close+"px");
+			line.setAttribute("to", (x+w+(part*2)-2)+"px,"+close+"px");
+			var s=line.style;
+			s.position="absolute";
+			s.top="0px";
+			s.left="0px";
+			s.antialias="false";
+			var str=document.createElement("v:stroke");
+			str.setAttribute("opacity","0.6");
+			line.appendChild(str);
+			g.appendChild(line);
+
+			if(applyTo){ applyTo(g, data[i].src); }
+			group.appendChild(g);
+		}
+		return group;	//	HTMLDivElement
+	},	
+	HighLowOpenClose: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as a set of high/low bars with open and close indicators.
+		//	Bindings: x/high/low/open/close
+		var area = plotarea.getArea();
+		var group=document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+		
+		var n = data.length;
+		var part = ((area.right-area.left)/(plot.axisX.range.upper - plot.axisX.range.lower))/4;
+		var w = part*2;
+
+		for(var i=0; i<n; i++){
+			var high = data[i].high;
+			var low = data[i].low;
+			if(low > high){
+				var t = low;
+				low = high;
+				high = t;
+			}
+			var o = data[i].open;
+			var c = data[i].close;
+
+			var x = plot.axisX.getCoord(data[i].x, plotarea, plot) - (w/2);
+			var y = plot.axisY.getCoord(high, plotarea, plot);
+			var h = plot.axisY.getCoord(low, plotarea, plot)-y;
+			var open = plot.axisY.getCoord(o, plotarea, plot);
+			var close = plot.axisY.getCoord(c, plotarea, plot);
+
+			var g = document.createElement("div");
+
+			//	high + low
+			var bar=document.createElement("v:rect");
+			bar.style.position="absolute";
+			bar.style.top=y+1+"px";
+			bar.style.left=x+"px";
+			bar.style.width=w+"px";
+			bar.style.height=h+"px";
+			bar.setAttribute("fillColor", data[i].series.color);
+			bar.setAttribute("stroked", "false");
+			bar.style.antialias="false";
+			var fill=document.createElement("v:fill");
+			fill.setAttribute("opacity", "0.6");
+			bar.appendChild(fill);
+			g.appendChild(bar);
+
+			var line = document.createElement("v:line");
+			line.setAttribute("strokecolor", data[i].series.color);
+			line.setAttribute("strokeweight", "1px");
+			line.setAttribute("from", (x-(part*2))+"px,"+open+"px");
+			line.setAttribute("to", (x+w-2)+"px,"+open+"px");
+			var s=line.style;
+			s.position="absolute";
+			s.top="0px";
+			s.left="0px";
+			s.antialias="false";
+			var str=document.createElement("v:stroke");
+			str.setAttribute("opacity","0.6");
+			line.appendChild(str);
+			g.appendChild(line);
+			
+			var line = document.createElement("v:line");
+			line.setAttribute("strokecolor", data[i].series.color);
+			line.setAttribute("strokeweight", "1px");
+			line.setAttribute("from", x+"px,"+close+"px");
+			line.setAttribute("to", (x+w+(part*2)-2)+"px,"+close+"px");
+			var s=line.style;
+			s.position="absolute";
+			s.top="0px";
+			s.left="0px";
+			s.antialias="false";
+			var str=document.createElement("v:stroke");
+			str.setAttribute("opacity","0.6");
+			line.appendChild(str);
+			g.appendChild(line);
+
+			if(applyTo){ applyTo(g, data[i].src); }
+			group.appendChild(g);
+		}
+		return group;	//	HTMLDivElement
+	},	
+	Scatter: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as a set of points.
+		//	Bindings: x/y
+		var r=6;
+		var mod=r/2;
+
+		var area = plotarea.getArea();
+		var group=document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+
+		for(var i=0; i<data.length; i++){
+			var x = Math.round(plot.axisX.getCoord(data[i].x, plotarea, plot));
+			var y = Math.round(plot.axisY.getCoord(data[i].y, plotarea, plot));
+
+			var point = document.createElement("v:rect");
+			point.setAttribute("strokecolor", data[i].series.color);
+			point.setAttribute("fillcolor", data[i].series.color);
+			var fill=document.createElement("v:fill");
+			fill.setAttribute("opacity","0.6");
+			point.appendChild(fill);
+
+			var s=point.style;
+			s.position="absolute";
+			s.rotation="45";
+			s.top=(y-mod)+"px";
+			s.left=(x-mod)+"px";
+			s.width=r+"px";
+			s.height=r+"px";
+			group.appendChild(point);
+			if(applyTo){ applyTo(point, data[i].src); }
+		}
+		return group;	//	HTMLDivElement
+	},
+	Bubble: function(
+		/* array */data, 
+		/* dojo.charting.PlotArea */plotarea,
+		/* dojo.charting.Plot */plot,
+		/* function? */applyTo
+	){
+		//	summary
+		//	Plots the series as a set of points with a size factor.
+		//	Bindings: x/y/size
+		var sizeFactor=1;
+		var area = plotarea.getArea();
+		var group=document.createElement("div");
+		group.style.position="absolute";
+		group.style.top="0px";
+		group.style.left="0px";
+		group.style.width=plotarea.size.width+"px";
+		group.style.height=plotarea.size.height+"px";
+
+		for(var i=0; i<data.length; i++){
+			var x = Math.round(plot.axisX.getCoord(data[i].x, plotarea, plot));
+			var y = Math.round(plot.axisY.getCoord(data[i].y, plotarea, plot));
+			if(i==0){
+				//	figure out the size factor, start with the axis with the greater range.
+				var raw = data[i].size;
+				var dy = plot.axisY.getCoord(data[i].y + raw, plotarea, plot)-y;
+				sizeFactor = dy/raw;
+			}
+			if(sizeFactor<1) { sizeFactor = 1; }
+			var r = (data[i].size/2)*sizeFactor;
+
+			var point = document.createElement("v:oval");
+			point.setAttribute("strokecolor", data[i].series.color);
+			point.setAttribute("fillcolor", data[i].series.color);
+			var fill=document.createElement("v:fill");
+			fill.setAttribute("opacity","0.6");
+			point.appendChild(fill);
+
+			var s=point.style;
+			s.position="absolute";
+			s.rotation="45";
+			s.top=(y-r)+"px";
+			s.left=(x-r)+"px";
+			s.width=(r*2)+"px";
+			s.height=(r*2)+"px";
+			group.appendChild(point);
+			if(applyTo){ applyTo(point, data[i].src); }
+		}
+		return group;	//	HTMLDivElement
+	}
+});
+dojo.charting.Plotters["Default"] = dojo.charting.Plotters.Line;

Added: struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/collections/ArrayList.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/collections/ArrayList.js?view=auto&rev=514083
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/collections/ArrayList.js (added)
+++ struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/src/collections/ArrayList.js Fri Mar  2 21:48:54 2007
@@ -0,0 +1,146 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.collections.ArrayList");
+dojo.require("dojo.collections.Collections");
+
+dojo.collections.ArrayList=function(/* array? */arr){
+	//	summary
+	//	Returns a new object of type dojo.collections.ArrayList
+	var items=[];
+	if(arr) items=items.concat(arr);
+	this.count=items.length;
+	this.add=function(/* object */obj){
+		//	summary
+		//	Add an element to the collection.
+		items.push(obj);
+		this.count=items.length;
+	};
+	this.addRange=function(/* array */a){
+		//	summary
+		//	Add a range of objects to the ArrayList
+		if(a.getIterator){
+			var e=a.getIterator();
+			while(!e.atEnd()){
+				this.add(e.get());
+			}
+			this.count=items.length;
+		}else{
+			for(var i=0; i<a.length; i++){
+				items.push(a[i]);
+			}
+			this.count=items.length;
+		}
+	};
+	this.clear=function(){
+		//	summary
+		//	Clear all elements out of the collection, and reset the count.
+		items.splice(0, items.length);
+		this.count=0;
+	};
+	this.clone=function(){
+		//	summary
+		//	Clone the array list
+		return new dojo.collections.ArrayList(items);	//	dojo.collections.ArrayList
+	};
+	this.contains=function(/* object */obj){
+		//	summary
+		//	Check to see if the passed object is a member in the ArrayList
+		for(var i=0; i < items.length; i++){
+			if(items[i] == obj) {
+				return true;	//	bool
+			}
+		}
+		return false;	//	bool
+	};
+	this.forEach=function(/* function */ fn, /* object? */ scope){
+		//	summary
+		//	functional iterator, following the mozilla spec.
+		var s=scope||dj_global;
+		if(Array.forEach){
+			Array.forEach(items, fn, s);
+		}else{
+			for(var i=0; i<items.length; i++){
+				fn.call(s, items[i], i, items);
+			}
+		}
+	};
+	this.getIterator=function(){
+		//	summary
+		//	Get an Iterator for this object
+		return new dojo.collections.Iterator(items);	//	dojo.collections.Iterator
+	};
+	this.indexOf=function(/* object */obj){
+		//	summary
+		//	Return the numeric index of the passed object; will return -1 if not found.
+		for(var i=0; i < items.length; i++){
+			if(items[i] == obj) {
+				return i;	//	int
+			}
+		}
+		return -1;	// int
+	};
+	this.insert=function(/* int */ i, /* object */ obj){
+		//	summary
+		//	Insert the passed object at index i
+		items.splice(i,0,obj);
+		this.count=items.length;
+	};
+	this.item=function(/* int */ i){
+		//	summary
+		//	return the element at index i
+		return items[i];	//	object
+	};
+	this.remove=function(/* object */obj){
+		//	summary
+		//	Look for the passed object, and if found, remove it from the internal array.
+		var i=this.indexOf(obj);
+		if(i >=0) {
+			items.splice(i,1);
+		}
+		this.count=items.length;
+	};
+	this.removeAt=function(/* int */ i){
+		//	summary
+		//	return an array with function applied to all elements
+		items.splice(i,1);
+		this.count=items.length;
+	};
+	this.reverse=function(){
+		//	summary
+		//	Reverse the internal array
+		items.reverse();
+	};
+	this.sort=function(/* function? */ fn){
+		//	summary
+		//	sort the internal array
+		if(fn){
+			items.sort(fn);
+		}else{
+			items.sort();
+		}
+	};
+	this.setByIndex=function(/* int */ i, /* object */ obj){
+		//	summary
+		//	Set an element in the array by the passed index.
+		items[i]=obj;
+		this.count=items.length;
+	};
+	this.toArray=function(){
+		//	summary
+		//	Return a new array with all of the items of the internal array concatenated.
+		return [].concat(items);
+	}
+	this.toString=function(/* string */ delim){
+		//	summary
+		//	implementation of toString, follows [].toString();
+		return items.join((delim||","));
+	};
+};