incubator-xap-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mtu...@apache.org
Subject svn commit: r518313 [6/43] - in /incubator/xap/trunk/codebase/src/dojo: ./ src/ src/animation/ src/cal/ src/charting/ src/charting/svg/ src/charting/vml/ src/collections/ src/crypto/ src/data/ src/data/core/ src/data/old/ src/data/old/format/ src/data/...
Date Wed, 14 Mar 2007 20:37:27 GMT
Added: incubator/xap/trunk/codebase/src/dojo/src/charting/svg/Plotters.js
URL: http://svn.apache.org/viewvc/incubator/xap/trunk/codebase/src/dojo/src/charting/svg/Plotters.js?view=auto&rev=518313
==============================================================================
--- incubator/xap/trunk/codebase/src/dojo/src/charting/svg/Plotters.js (added)
+++ incubator/xap/trunk/codebase/src/dojo/src/charting/svg/Plotters.js Wed Mar 14 13:36:44 2007
@@ -0,0 +1,875 @@
+/*
+	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");
+
+if(dojo.render.svg.capable){
+	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: incubator/xap/trunk/codebase/src/dojo/src/charting/vml/Axis.js
URL: http://svn.apache.org/viewvc/incubator/xap/trunk/codebase/src/dojo/src/charting/vml/Axis.js?view=auto&rev=518313
==============================================================================
--- incubator/xap/trunk/codebase/src/dojo/src/charting/vml/Axis.js (added)
+++ incubator/xap/trunk/codebase/src/dojo/src/charting/vml/Axis.js Wed Mar 14 13:36:44 2007
@@ -0,0 +1,272 @@
+/*
+	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");
+
+if(dojo.render.vml.capable){
+	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: incubator/xap/trunk/codebase/src/dojo/src/charting/vml/PlotArea.js
URL: http://svn.apache.org/viewvc/incubator/xap/trunk/codebase/src/dojo/src/charting/vml/PlotArea.js?view=auto&rev=518313
==============================================================================
--- incubator/xap/trunk/codebase/src/dojo/src/charting/vml/PlotArea.js (added)
+++ incubator/xap/trunk/codebase/src/dojo/src/charting/vml/PlotArea.js Wed Mar 14 13:36:44 2007
@@ -0,0 +1,80 @@
+/*
+	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");
+
+if(dojo.render.vml.capable){
+	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: incubator/xap/trunk/codebase/src/dojo/src/charting/vml/Plotters.js
URL: http://svn.apache.org/viewvc/incubator/xap/trunk/codebase/src/dojo/src/charting/vml/Plotters.js?view=auto&rev=518313
==============================================================================
--- incubator/xap/trunk/codebase/src/dojo/src/charting/vml/Plotters.js (added)
+++ incubator/xap/trunk/codebase/src/dojo/src/charting/vml/Plotters.js Wed Mar 14 13:36:44 2007
@@ -0,0 +1,1077 @@
+/*
+	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");
+
+if(dojo.render.vml.capable){
+	dojo.mixin(dojo.charting.Plotters, {
+		/*********************************************************
+		 *	Grouped plotters: need all series on a plot at once.
+		 *********************************************************/
+		_group: function(plotarea){
+			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";
+			return group;
+		},
+		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 = dojo.charting.Plotters._group(plotarea);
+			
+			//	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 = dojo.charting.Plotters._group(plotarea);
+			
+			//	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 = dojo.charting.Plotters._group(plotarea);
+
+			//	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 = dojo.charting.Plotters._group(plotarea);
+
+			//	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 = dojo.charting.Plotters._group(plotarea);
+
+			//	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 = dojo.charting.Plotters._group(plotarea);
+			
+			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 = dojo.charting.Plotters._group(plotarea);
+
+			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 = dojo.charting.Plotters._group(plotarea);
+
+			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 = dojo.charting.Plotters._group(plotarea);
+
+			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 = dojo.charting.Plotters._group(plotarea);
+
+			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 = dojo.charting.Plotters._group(plotarea);
+
+			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 = dojo.charting.Plotters._group(plotarea);
+
+			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 = dojo.charting.Plotters._group(plotarea);
+
+			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 = dojo.charting.Plotters._group(plotarea);
+
+			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 = dojo.charting.Plotters._group(plotarea);
+
+			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: incubator/xap/trunk/codebase/src/dojo/src/collections/ArrayList.js
URL: http://svn.apache.org/viewvc/incubator/xap/trunk/codebase/src/dojo/src/collections/ArrayList.js?view=auto&rev=518313
==============================================================================
--- incubator/xap/trunk/codebase/src/dojo/src/collections/ArrayList.js (added)
+++ incubator/xap/trunk/codebase/src/dojo/src/collections/ArrayList.js Wed Mar 14 13:36:44 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||","));
+	};
+};



Mime
View raw message