Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/svg/Plotters.js
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/svg/Plotters.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/svg/Plotters.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/svg/Plotters.js Mon Feb 19 09:56:06 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; +} Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/svg/Plotters.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/svg/Plotters.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/svg/Plotters.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/Axis.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/Axis.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/Axis.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/Axis.js Mon Feb 19 09:56:06 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 + } + }); +} Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/Axis.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/Axis.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/Axis.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/PlotArea.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/PlotArea.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/PlotArea.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/PlotArea.js Mon Feb 19 09:56:06 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 + } + }); +} Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/PlotArea.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/PlotArea.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/PlotArea.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/Plotters.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/Plotters.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/Plotters.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/charting/vml/Plotters.js Mon Feb 19 09:56:06 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; + fo |
Free forum by Nabble | Edit this page |