You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by sv...@apache.org on 2006/11/10 10:15:40 UTC

svn commit: r473277 [45/45] - in /myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource: ./ src/ src/animation/ src/cal/ src/charting/ src/charting/svg/ src/charting/vml/ src/collections/ src/crypto/ src/data/ src/data/...

Modified: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/vml/Chart.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/vml/Chart.js?view=diff&rev=473277&r1=473276&r2=473277
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/vml/Chart.js (original)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/widget/vml/Chart.js Fri Nov 10 01:15:01 2006
@@ -8,419 +8,632 @@
 		http://dojotoolkit.org/community/licensing.shtml
 */
 
-dojo.provide("dojo.widget.vml.Chart");
-
-dojo.require("dojo.widget.HtmlWidget");
-dojo.require("dojo.widget.Chart");
-dojo.require("dojo.math");
-dojo.require("dojo.html");
-//dojo.require("dojo.vml");
-dojo.require("dojo.graphics.color");
-
-dojo.widget.vml.Chart=function(){
-	dojo.widget.Chart.call(this);
-	dojo.widget.HtmlWidget.call(this);
-};
-dojo.inherits(dojo.widget.vml.Chart, dojo.widget.HtmlWidget);
-dojo.lang.extend(dojo.widget.vml.Chart, {
-	//	widget props
-	templatePath:null,
-	templateCssPath:null,
-
-	//	state
-	_isInitialized:false,
-	hasData:false,
-
-	//	chart props
-	vectorNode:null,
-	plotArea:null,
-	dataGroup:null,
-	axisGroup:null,
-
-	properties:{
-		height:400,	//	defaults, will resize to the domNode.
-		width:600,
-		plotType:null,
-		padding:{
-			top:10,
-			bottom:2,
-			left:60,
-			right:30
-		},
-		axes:{
-			x:{
-				plotAt:0,
-				label:"",
-				unitLabel:"",
-				unitType:Number,
-				nUnitsToShow:10,
-				range:{
-					min:0,
-					max:200
-				}
-			},
-			y:{
-				plotAt:0,
-				label:"",
-				unitLabel:"",
-				unitType:Number,
-				nUnitsToShow:10,
-				range:{
-					min:0,
-					max:200
-				}
-			}
-		}
-	},
-	
-	fillInTemplate:function(args,frag){
-		this.initialize();
-		this.render();
-	},
-	parseData:function(){
-	},
-	initialize:function(){
-		//	parse the data first.
-		this.parseData();
-	
-		// render the body of the chart, not the chart data.
-		if(this.vectorNode){ this.destroy(); }
-		this.vectorNode=document.createElement("div");
-		this.vectorNode.style.width=this.properties.width+"px";
-		this.vectorNode.style.height=this.properties.height+"px";
-		this.vectorNode.style.position="relative";
-		this.domNode.appendChild(this.vectorNode);
-
-		var plotWidth=this.properties.width-this.properties.padding.left-this.properties.padding.right;
-		var plotHeight=this.properties.height-this.properties.padding.top-this.properties.padding.bottom;
-
-		this.plotArea=document.createElement("div");
-		this.plotArea.style.position="absolute";
-		this.plotArea.style.backgroundColor="#fff";
-		this.plotArea.style.top=(this.properties.padding.top)-2+"px";
-		this.plotArea.style.left=(this.properties.padding.left-1)+"px";
-		this.plotArea.style.width=plotWidth+"px";
-		this.plotArea.style.height=plotHeight+"px";
-		this.vectorNode.appendChild(this.plotArea);
-		
-		this.dataGroup=document.createElement("div");
-		this.dataGroup.style.position="relative";
-		this.plotArea.appendChild(this.dataGroup);
-
-		//	clipping rects, what a fucking pain.
-		var bg=this.domNode.style.backgroundColor;
-		var r=document.createElement("v:rect");
-		r.setAttribute("fillcolor", bg);
-		r.setAttribute("stroked", "false");
-		r.style.position="absolute";
-		r.style.top=(-1*this.properties.padding.top)-1+"px";
-		r.style.left=(-1*this.properties.padding.left)+"px";
-		r.style.width=(this.properties.width-3)+"px";
-		r.style.height=(this.properties.padding.top)-2+"px";
-		this.vectorNode.appendChild(r);
-
-		r=document.createElement("v:rect");
-		r.setAttribute("fillcolor", bg);
-		r.setAttribute("stroked", "false");
-		r.style.position="absolute";
-		r.style.top=plotHeight-2+"px";
-		r.style.left=(-1*this.properties.padding.left)+"px";
-		r.style.width=(this.properties.width-3)+"px";
-		r.style.height=(this.properties.padding.bottom)-2+"px"; // fixme: check this.
-		this.vectorNode.appendChild(r);
-
-		r=document.createElement("v:rect");
-		r.setAttribute("fillcolor", bg);
-		r.setAttribute("stroked", "false");
-		r.style.position="absolute";
-		r.style.top="-2px";
-		r.style.left=(-1*this.properties.padding.left)+"px";
-		r.style.width=(this.properties.padding.left-1)+"px";
-		r.style.height=plotHeight+"px";
-		this.vectorNode.appendChild(r);
-		
-		r=document.createElement("v:rect");
-		r.setAttribute("fillcolor", bg);
-		r.setAttribute("stroked", "false");
-		r.style.position="absolute";
-		r.style.top="-2px";
-		r.style.right=(-1*this.properties.padding.right)+1+"px";
-		r.style.width=(this.properties.padding.right-1)+"px";
-		r.style.height=plotHeight+"px";
-		this.vectorNode.appendChild(r);
-		//	end clipping rects.  god that sucks, i wish VML had clipping outside of that crap vmlframe...
-
-		this.axisGroup=document.createElement("div");
-		this.axisGroup.style.position="relative";
-		this.plotArea.appendChild(this.axisGroup);
-
-		var stroke=1;
-
-		//	x axis
-		var line=document.createElement("v:line");
-		var y=dojo.widget.vml.Chart.Plotter.getY(this.properties.axes.x.plotAt, this);
-		line.setAttribute("from", this.properties.padding.left-stroke + "," + y);
-		line.setAttribute("to", plotWidth + "," + y);
-		line.style.position="absolute";
-		line.style.antialias="false";
-		line.setAttribute("strokecolor", "#666");
-		line.setAttribute("strokeweight", stroke*2+"px");
-		this.axisGroup.appendChild(line);
-
-		//	y axis
-		var line=document.createElement("v:line");
-		var y=dojo.widget.vml.Chart.Plotter.getX(this.properties.axes.y.plotAt, this);
-		line.setAttribute("from", y+","+this.properties.padding.top);
-		line.setAttribute("to", y+","+this.properties.height-this.properties.padding.bottom);
-		line.style.position="absolute";
-		line.style.antialias="false";
-		line.setAttribute("strokecolor", "#666");
-		line.setAttribute("strokeweight", stroke*2+"px");
-		this.axisGroup.appendChild(line);
-		
-		//	labels
-		var size=10;
-
-		//	x axis labels.
-		var t=document.createElement("div");
-		t.style.position="absolute";
-		t.style.top=(this.properties.height-this.properties.padding.bottom+size+2)+"px";
-		t.style.left=this.properties.padding.left+"px";
-		t.style.fontFamily="sans-serif";
-		t.style.fontSize=size+"px";
-		t.innerHTML=dojo.math.round(parseFloat(this.properties.axes.x.range.min),2);
-		this.axisGroup.appendChild(t);
-
-		t=document.createElement("div");
-		t.style.position="absolute";
-		t.style.top=(this.properties.height-this.properties.padding.bottom+size+2)+"px";
-		t.style.left=(this.properties.width-this.properties.padding.right-(size/2))+"px";
-		t.style.fontFamily="sans-serif";
-		t.style.fontSize=size+"px";
-		t.innerHTML=dojo.math.round(parseFloat(this.properties.axes.x.range.max),2);
-		this.axisGroup.appendChild(t);
-
-		//	y axis labels.
-		t=document.createElement("div");
-		t.style.position="absolute";
-		t.style.top=-1*(size/2)+"px";
-		t.style.right=(plotWidth+4)+"px";
-		t.style.fontFamily="sans-serif";
-		t.style.fontSize=size+"px";
-		t.innerHTML=dojo.math.round(parseFloat(this.properties.axes.y.range.max),2);
-		this.axisGroup.appendChild(t);
-		
-		t=document.createElement("div");
-		t.style.position="absolute";
-		t.style.top=(this.properties.height-this.properties.padding.bottom)+"px";
-		t.style.right=(plotWidth+4)+"px";
-		t.style.fontFamily="sans-serif";
-		t.style.fontSize=size+"px";
-		t.innerHTML=dojo.math.round(parseFloat(this.properties.axes.y.range.min),2);
-		this.axisGroup.appendChild(t);
-		
-		//	this is last.
-		this.assignColors();
-		this._isInitialized=true;
-	},
-	destroy:function(){
-		while(this.domNode.childNodes.length>0){
-			this.domNode.removeChild(this.domNode.childNodes[0]);
-		}
-		this.vectorNode=this.plotArea=this.dataGroup=this.axisGroup=null;
-	},
-	render:function(){
-		if (this.dataGroup){
-			while(this.dataGroup.childNodes.length>0){
-				this.dataGroup.removeChild(this.dataGroup.childNodes[0]);
-			}
-		} else {
-			this.initialize();
-		}
-		for(var i=0; i<this.series.length; i++){
-			dojo.widget.vml.Chart.Plotter.plot(this.series[i], this);
-		}
-	}
-});
-
-dojo.widget.vml.Chart.Plotter=new function(){
-	var _this=this;
-	var plotters = {};
-	var types=dojo.widget.Chart.PlotTypes;
-	
-	this.getX=function(value, chart){
-		var v=parseFloat(value);
-		var min=chart.properties.axes.x.range.min;
-		var max=chart.properties.axes.x.range.max;
-		var ofst=0-min;
-		min+=ofst; max+=ofst; v+=ofst;
-
-		var xmin=chart.properties.padding.left;
-		var xmax=chart.properties.width-chart.properties.padding.right;
-		var x=(v*((xmax-xmin)/max))+xmin;
-		return x;
-	};
-	this.getY=function(value, chart){
-		var v=parseFloat(value);
-		var max=chart.properties.axes.y.range.max;
-		var min=chart.properties.axes.y.range.min;
-		var ofst=0;
-		if(min<0)ofst+=Math.abs(min);
-		min+=ofst; max+=ofst; v+=ofst;
-		
-		var ymin=chart.properties.height-chart.properties.padding.bottom;
-		var ymax=chart.properties.padding.top;
-		var y=(((ymin-ymax)/(max-min))*(max-v))+ymax;
-		return y;
-	};
-
-	this.addPlotter=function(name, func){
-		plotters[name]=func;
-	};
-	this.plot=function(series, chart){
-		if (series.values.length==0) return;
-		if (series.plotType && plotters[series.plotType]){
-			return plotters[series.plotType](series, chart);
-		}
-		else if (chart.plotType && plotters[chart.plotType]){
-			return plotters[chart.plotType](series, chart);
-		}
-	};
-
-	//	plotting
-	plotters[types.Bar]=function(series, chart){
-		var space=1;
-		var lastW = 0;
-		for (var i=0; i<series.values.length; i++){
-			var x=_this.getX(series.values[i].x, chart);
-			var w;
-			if (i==series.values.length-1){
-				w=lastW;
-			} else{
-				w=_this.getX(series.values[i+1].x, chart)-x-space;
-				lastW=w;
-			}
-			x-=(w/2);
-
-			var yA=_this.getY(chart.properties.axes.x.plotAt, chart);
-			var y=_this.getY(series.values[i].value, chart);
-			var h=Math.abs(yA-y);
-			if (parseFloat(series.values[i].value)<chart.properties.axes.x.plotAt){
-				var oy=yA;
-				yA=y;
-				y=oy;
-			}
-
-			var bar=document.createElement("v:rect");
-			bar.style.position="absolute";
-			bar.style.top=x+"px";
-			bar.style.left=y+"px";
-			bar.style.width=w+"px";
-			bar.style.height=h+"px";
-			bar.setAttribute("fillColor", series.color);
-			bar.setAttribute("title", series.label + ": " + series.values[i].value);
-			bar.setAttribute("coordsize", chart.properties.width + "," + chart.properties.height);
-			var fill=document.createElement("v:fill");
-			fill.setAttribute("opacity", "0.9");
-			bar.appendChild(fill);
-			chart.dataGroup.appendChild(bar);
-		}
-	};	
-	plotters[types.Line]=function(series, chart){
-		var tension=3;
-
-		var line=document.createElement("v:shape");
-		line.setAttribute("strokeweight", "2px");
-		line.setAttribute("strokecolor", series.color);
-		line.setAttribute("fillcolor", "none");
-		line.setAttribute("filled", "false");
-		line.setAttribute("title", series.label);
-		line.setAttribute("coordsize", chart.properties.width + "," + chart.properties.height);
-		line.style.position="absolute";
-		line.style.top="0px";
-		line.style.left="0px";
-		line.style.width= chart.properties.width+"px";
-		line.style.height=chart.properties.height+"px";
-		var stroke=document.createElement("v:stroke");
-		stroke.setAttribute("opacity", "0.85");
-		line.appendChild(stroke);
-
-		var path = [];
-		for (var i=0; i<series.values.length; i++){
-			var x = _this.getX(series.values[i].x, chart)
-			var y = _this.getY(series.values[i].value, chart);
-
-			if (i==0){
-				path.push("m");
-				path.push(x+","+y);
-			}else{
-				var lastx=_this.getX(series.values[i-1].x, chart);
-				var lasty=_this.getY(series.values[i-1].value, chart);
-				var dx=x-lastx;
-				
-				path.push("v");
-				var cx=x-(tension-1)*(dx/tension);
-				path.push(cx+",0");
-				cx=x-(dx/tension);
-				path.push(cx+","+y-lasty);
-				path.push(dx, y-lasty);
-			}
-		}
-		line.setAttribute("path", path.join(" ")+" e");
-		chart.dataGroup.appendChild(line);
-	};
-	plotters[types.Scatter]=function(series, chart){
-		var r=8;
-		for (var i=0; i<series.values.length; i++){
-			var x=_this.getX(series.values[i].x, chart);
-			var y=_this.getY(series.values[i].value, chart);
-			var mod=r/2;
-
-			var point=document.createElement("v:rect");
-			point.setAttribute("fillcolor", series.color);
-			point.setAttribute("strokecolor", series.color);
-			point.setAttribute("title", series.label + ": " + series.values[i].value);
-			point.style.position="absolute";
-			point.style.rotation="45";
-			point.style.top=(y-mod)+"px";
-			point.style.left=(x-mod)+"px";
-			point.style.width=r+"px";
-			point.style.height=r+"px";
-			var fill=document.createElement("v:fill");
-			fill.setAttribute("opacity", "0.5");
-			point.appendChild(fill);
-			chart.dataGroup.appendChild(point);
-		}
-	};	
-	plotters[types.Bubble]=function(series, chart){
-		//	added param for series[n].value: size
-		var minR=1;
-		
-		//	do this off the x axis?
-		var min=chart.properties.axes.x.range.min;
-		var max=chart.properties.axes.x.range.max;
-		var ofst=0-min;
-
-		min+=ofst; max+=ofst;
-		var xmin=chart.properties.padding.left;
-		var xmax=chart.properties.width-chart.properties.padding.right;
-		var factor=(max-min)/(xmax-xmin)*25;
-		
-		for (var i=0; i<series.values.length; i++){
-			var size = series.values[i].size;
-			if (isNaN(parseFloat(size))) size=minR;
-			var mod=(parseFloat(size)*factor)/2;
-
-			var point=document.createElement("v:oval");
-			point.setAttribute("strokecolor", series.color);
-			point.setAttribute("fillcolor", series.color);
-			point.setAttribute("title", series.label + ": " + series.values[i].value + " (" + size + ")");
-			point.style.position="absolute";
-			point.style.top=(_this.getY(series.values[i].value, chart)-mod) + "px";
-			point.style.left=(_this.getX(series.values[i].x, chart)-mod) + "px";
-			point.style.width=mod+"px";
-			point.style.height=mod+"px";
-			chart.dataGroup.appendChild(point);
-		}
-	};
-}();
+dojo.provide("dojo.widget.vml.Chart");
+
+dojo.require("dojo.widget.HtmlWidget");
+dojo.require("dojo.widget.Chart");
+dojo.require("dojo.math");
+dojo.require("dojo.html.layout");
+dojo.require("dojo.gfx.color");
+
+dojo.widget.defineWidget(
+	"dojo.widget.vml.Chart",
+	[dojo.widget.HtmlWidget, dojo.widget.Chart],
+	function(){
+		//	summary
+		//	initializes the VML version of Chart.
+		this.templatePath=null;
+		this.templateCssPath=null;
+		this._isInitialize=false;
+		this.hasData=false;
+		this.vectorNode=null;
+		this.plotArea=null;
+		this.dataGroup=null;
+		this.axisGroup=null;
+		this.properties={
+			height:0,	//	defaults, will resize to the domNode.
+			width:0,
+			defaultWidth:600,
+			defaultHeight:400,
+			plotType:null,
+			padding:{
+				top:10,
+				bottom:2,
+				left:60,
+				right:30
+			},
+			axes:{
+				x:{
+					plotAt:0,
+					label:"",
+					unitLabel:"",
+					unitType:Number,
+					nUnitsToShow:10,
+					range:{
+						min:0,
+						max:200
+					}
+				},
+				y:{
+					plotAt:0,
+					label:"",
+					unitLabel:"",
+					unitType:Number,
+					nUnitsToShow:10,
+					range:{
+						min:0,
+						max:200
+					}
+				}
+			}
+		};
+	},
+{
+	parseProperties:function(/* HTMLElement */node){
+		//	summary
+		//	Parse the properties off the main tag
+		var bRangeX=false;
+		var bRangeY=false;
+		if (node.getAttribute("width")){ 
+			this.properties.width=node.getAttribute("width");
+		}
+		if (node.getAttribute("height")){
+			this.properties.height=node.getAttribute("height");
+		}
+		if (node.getAttribute("plotType")){
+			this.properties.plotType=node.getAttribute("plotType");
+		}
+		if (node.getAttribute("padding")){
+			if (node.getAttribute("padding").indexOf(",") > -1)
+				var p=node.getAttribute("padding").split(","); 
+			else var p=node.getAttribute("padding").split(" ");
+			if (p.length==1){
+				var pad=parseFloat(p[0]);
+				this.properties.padding.top=pad;
+				this.properties.padding.right=pad;
+				this.properties.padding.bottom=pad;
+				this.properties.padding.left=pad;
+			} else if(p.length==2){
+				var padV=parseFloat(p[0]);
+				var padH=parseFloat(p[1]);
+				this.properties.padding.top=padV;
+				this.properties.padding.right=padH;
+				this.properties.padding.bottom=padV;
+				this.properties.padding.left=padH;
+			} else if(p.length==4){
+				this.properties.padding.top=parseFloat(p[0]);
+				this.properties.padding.right=parseFloat(p[1]);
+				this.properties.padding.bottom=parseFloat(p[2]);
+				this.properties.padding.left=parseFloat(p[3]);
+			}
+		}
+		if (node.getAttribute("rangeX")){
+			var p=node.getAttribute("rangeX");
+			if (p.indexOf(",")>-1) p=p.split(",");
+			else p=p.split(" ");
+			this.properties.axes.x.range.min=parseFloat(p[0]);
+			this.properties.axes.x.range.max=parseFloat(p[1]);
+			bRangeX=true;
+		}
+		if (node.getAttribute("rangeY")){
+			var p=node.getAttribute("rangeY");
+			if (p.indexOf(",")>-1) p=p.split(",");
+			else p=p.split(" ");
+			this.properties.axes.y.range.min=parseFloat(p[0]);
+			this.properties.axes.y.range.max=parseFloat(p[1]);
+			bRangeY=true;
+		}
+		return { rangeX:bRangeX, rangeY:bRangeY };
+	},
+	setAxesPlot:function(/* HTMLElement */table){
+		//	summary
+		//	figure out where to plot the axes
+		if (table.getAttribute("axisAt")){
+			var p=table.getAttribute("axisAt");
+			if (p.indexOf(",")>-1) p=p.split(",");
+			else p=p.split(" ");
+			
+			//	x axis
+			if (!isNaN(parseFloat(p[0]))){
+				this.properties.axes.x.plotAt=parseFloat(p[0]);
+			} else if (p[0].toLowerCase()=="ymin"){
+				this.properties.axes.x.plotAt=this.properties.axes.y.range.min;
+			} else if (p[0].toLowerCase()=="ymax"){
+				this.properties.axes.x.plotAt=this.properties.axes.y.range.max;
+			}
+
+			// y axis
+			if (!isNaN(parseFloat(p[1]))){
+				this.properties.axes.y.plotAt=parseFloat(p[1]);
+			} else if (p[1].toLowerCase()=="xmin"){
+				this.properties.axes.y.plotAt=this.properties.axes.x.range.min;
+			} else if (p[1].toLowerCase()=="xmax"){
+				this.properties.axes.y.plotAt=this.properties.axes.x.range.max;
+			}
+		} else {
+			this.properties.axes.x.plotAt=this.properties.axes.y.range.min;
+			this.properties.axes.y.plotAt=this.properties.axes.x.range.min;
+		}
+	},
+	drawVectorNode:function(){
+		//	summary
+		//	Draws the main canvas for the chart
+		if(this.vectorNode){ this.destroy(); }
+		this.vectorNode=document.createElement("div");
+		this.vectorNode.style.width=this.properties.width+"px";
+		this.vectorNode.style.height=this.properties.height+"px";
+		this.vectorNode.style.position="relative";
+		this.domNode.appendChild(this.vectorNode);
+	},
+	drawPlotArea:function(){
+		//	summary
+		//	Draws the plot area for the chart
+		var plotWidth=this.properties.width-this.properties.padding.left-this.properties.padding.right;
+		var plotHeight=this.properties.height-this.properties.padding.top-this.properties.padding.bottom;
+
+		if(this.plotArea){
+			this.plotArea.parentNode.removeChild(this.plotArea);
+			this.plotArea=null;
+		}
+		this.plotArea=document.createElement("div");
+		this.plotArea.style.position="absolute";
+		this.plotArea.style.backgroundColor="#fff";
+		this.plotArea.style.top=(this.properties.padding.top)-2+"px";
+		this.plotArea.style.left=(this.properties.padding.left-1)+"px";
+		this.plotArea.style.width=plotWidth+"px";
+		this.plotArea.style.height=plotHeight+"px";
+		this.plotArea.style.clip="rect(0 "+plotWidth+" "+plotHeight+" 0)";
+		this.vectorNode.appendChild(this.plotArea);
+	},
+	drawDataGroup:function(){
+		//	summary
+		//	Draws the data group for the chart
+		var plotWidth=this.properties.width-this.properties.padding.left-this.properties.padding.right;
+		var plotHeight=this.properties.height-this.properties.padding.top-this.properties.padding.bottom;
+
+		if(this.dataGroup){
+			this.dataGroup.parentNode.removeChild(this.dataGroup);
+			this.dataGroup=null;
+		}
+		this.dataGroup=document.createElement("div");
+		this.dataGroup.style.position="absolute";
+		this.dataGroup.setAttribute("title", "Data Group");
+		this.dataGroup.style.top="0px";
+		this.dataGroup.style.left="0px";
+		this.dataGroup.style.width=plotWidth+"px";
+		this.dataGroup.style.height=plotHeight+"px";
+		this.plotArea.appendChild(this.dataGroup);
+	},
+	drawAxes:function(){
+		//	summary
+		//	Draws the axes for the chart
+		var plotWidth=this.properties.width-this.properties.padding.left-this.properties.padding.right;
+		var plotHeight=this.properties.height-this.properties.padding.top-this.properties.padding.bottom;
+
+		if(this.axisGroup){
+			this.axisGroup.parentNode.removeChild(this.axisGroup);
+			this.axisGroup=null;
+		}
+		this.axisGroup=document.createElement("div");
+		this.axisGroup.style.position="absolute";
+		this.axisGroup.setAttribute("title", "Axis Group");
+		this.axisGroup.style.top="0px";
+		this.axisGroup.style.left="0px";
+		this.axisGroup.style.width=plotWidth+"px";
+		this.axisGroup.style.height=plotHeight+"px";
+		this.plotArea.appendChild(this.axisGroup);
+		var stroke=1;
+
+		//	x axis
+		var line=document.createElement("v:line");
+		var y=dojo.widget.vml.Chart.Plotter.getY(this.properties.axes.x.plotAt, this);
+		line.setAttribute("from", "0px,"+y+"px");
+		line.setAttribute("to", plotWidth+"px,"+y+"px");
+		line.style.position="absolute";
+		line.style.top="0px";
+		line.style.left="0px";
+		line.style.antialias="false";
+		line.setAttribute("strokecolor", "#666");
+		line.setAttribute("strokeweight", stroke*2+"px");
+		this.axisGroup.appendChild(line);
+
+		//	y axis
+		var line=document.createElement("v:line");
+		var x=dojo.widget.vml.Chart.Plotter.getX(this.properties.axes.y.plotAt, this);
+		line.setAttribute("from", x+"px,0px");
+		line.setAttribute("to", x+"px,"+plotHeight+"px");
+		line.style.position="absolute";
+		line.style.top="0px";
+		line.style.left="0px";
+		line.style.antialias="false";
+		line.setAttribute("strokecolor", "#666");
+		line.setAttribute("strokeweight", stroke*2+"px");
+		this.axisGroup.appendChild(line);
+		
+		//	labels
+		var size=10;
+
+		//	x axis labels.
+		var t=document.createElement("div");
+		t.style.position="absolute";
+		t.style.top=(this.properties.height-this.properties.padding.bottom)+"px";
+		t.style.left=this.properties.padding.left+"px";
+		t.style.fontFamily="sans-serif";
+		t.style.fontSize=size+"px";
+		t.innerHTML=dojo.math.round(parseFloat(this.properties.axes.x.range.min),2);
+		this.vectorNode.appendChild(t);
+
+		t=document.createElement("div");
+		t.style.position="absolute";
+		t.style.top=(this.properties.height-this.properties.padding.bottom)+"px";
+		t.style.left=(this.properties.width-this.properties.padding.right-size)+"px";
+		t.style.fontFamily="sans-serif";
+		t.style.fontSize=size+"px";
+		t.innerHTML=dojo.math.round(parseFloat(this.properties.axes.x.range.max),2);
+		this.vectorNode.appendChild(t);
+
+		//	y axis labels.
+		t=document.createElement("div");
+		t.style.position="absolute";
+		t.style.top=(size/2)+"px";
+		t.style.left="0px";
+		t.style.width=this.properties.padding.left + "px";
+		t.style.textAlign="right";
+		t.style.paddingRight="4px";
+		t.style.fontFamily="sans-serif";
+		t.style.fontSize=size+"px";
+		t.innerHTML=dojo.math.round(parseFloat(this.properties.axes.y.range.max),2);
+		this.vectorNode.appendChild(t);
+		
+		t=document.createElement("div");
+		t.style.position="absolute";
+		t.style.top=(this.properties.height-this.properties.padding.bottom-size)+"px";
+		t.style.left="0px";
+		t.style.width=this.properties.padding.left + "px";
+		t.style.textAlign="right";
+		t.style.paddingRight="4px";
+		t.style.fontFamily="sans-serif";
+		t.style.fontSize=size+"px";
+		t.innerHTML=dojo.math.round(parseFloat(this.properties.axes.y.range.min),2);
+		this.vectorNode.appendChild(t);
+	},
+	
+	init:function(){
+		//	summary
+		//	Initialize the chart
+		if(!this.properties.width || !this.properties.height){
+			var box=dojo.html.getContentBox(this.domNode);
+			if(!this.properties.width){
+				this.properties.width=(box.width<32)?this.properties.defaultWidth:box.width;
+			}
+			if(!this.properties.height){
+				this.properties.height=(box.height<32)?this.properties.defaultHeight:box.height;
+			}
+		}
+
+		//	set up the chart; each is a method so that it can be selectively overridden.
+		this.drawVectorNode();
+		this.drawPlotArea();
+		this.drawDataGroup();
+		this.drawAxes();
+
+		//	this is last.
+		this.assignColors();
+		this._isInitialized=true;
+	},
+	destroy:function(){
+		//	summary
+		//	Node cleanup
+		while(this.domNode.childNodes.length>0){
+			this.domNode.removeChild(this.domNode.childNodes[0]);
+		}
+		this.vectorNode=this.plotArea=this.dataGroup=this.axisGroup=null;
+	},
+	render:function(){
+		//	summary
+		//	Draws the data on the chart
+		if (this.dataGroup){
+			while(this.dataGroup.childNodes.length>0){
+				this.dataGroup.removeChild(this.dataGroup.childNodes[0]);
+			}
+		} else {
+			this.init();
+		}
+		for(var i=0; i<this.series.length; i++){
+			dojo.widget.vml.Chart.Plotter.plot(this.series[i], this);
+		}
+	},
+	postCreate:function(){
+		//	summary
+		//	Parse any data if included with the chart, and kick off the rendering.
+		var table=this.domNode.getElementsByTagName("table")[0];
+		if (table){
+			var ranges=this.parseProperties(table);
+			var bRangeX=false;
+			var bRangeY=false;
+		
+			//	fix the axes
+			var axisValues = this.parseData(table);
+			if(!bRangeX){
+				this.properties.axes.x.range={min:axisValues.x.min, max:axisValues.x.max};
+			}
+			if(!bRangeY){
+				this.properties.axes.y.range={min:axisValues.y.min, max:axisValues.y.max};
+			}
+			this.setAxesPlot(table);
+
+			//	table values should be populated, now pop it off.
+			this.domNode.removeChild(table);
+		}
+		if(this.series.length>0){
+			this.render();
+		}
+	}
+});
+
+dojo.widget.vml.Chart.Plotter=new function(){
+	//	summary
+	//	Singleton for plotting series of data.
+	var self=this;
+	var plotters = {};
+	var types=dojo.widget.Chart.PlotTypes;
+	
+	this.getX=function(/* string||number */value, /* dojo.widget.Chart */chart){
+		//	summary
+		//	Calculate the x coord on the passed chart for the passed value
+		var v=parseFloat(value);
+		var min=chart.properties.axes.x.range.min;
+		var max=chart.properties.axes.x.range.max;
+		var ofst=0-min;
+		min+=ofst; max+=ofst; v+=ofst;
+
+		var xmin = 0;
+		var xmax=chart.properties.width-chart.properties.padding.left-chart.properties.padding.right;
+		var x=(v*((xmax-xmin)/max))+xmin;
+		return x;
+	};
+	this.getY=function(/* string||number */value, /* dojo.widget.Chart */chart){
+		//	summary
+		//	Calculate the y coord on the passed chart for the passed value
+		var v=parseFloat(value);
+		var max=chart.properties.axes.y.range.max;
+		var min=chart.properties.axes.y.range.min;
+		var ofst=0;
+		if(min<0)ofst+=Math.abs(min);
+		min+=ofst; max+=ofst; v+=ofst;
+		
+		var ymin=chart.properties.height-chart.properties.padding.top-chart.properties.padding.bottom;
+		var ymax = 0;
+		var y=(((ymin-ymax)/(max-min))*(max-v))+ymax;
+		return y;
+	};
+
+	this.addPlotter=function(/* string */name, /* function */func){
+		//	summary
+		//	add a custom plotter function to this object.
+		plotters[name]=func;
+	};
+	this.plot=function(/* dojo.widget.Chart.DataSeries */series, /* dojo.widget.Chart */chart){
+		//	summary
+		//	plot the passed series.
+		if (series.values.length==0) return;	//	void
+		if (series.plotType && plotters[series.plotType]){
+			return plotters[series.plotType](series, chart);	//	void
+		}
+		else if (chart.plotType && plotters[chart.plotType]){
+			return plotters[chart.plotType](series, chart);		//	void
+		}
+	};
+
+	//	plotting
+	plotters["bar"]=function(/* dojo.widget.Chart.DataSeries */series, /* dojo.widget.Chart */chart){
+		//	summary
+		//	plot the passed series as a set of bars.
+		var space=1;
+		var lastW = 0;
+		var ys = [];
+		var yAxis=self.getY(chart.properties.axes.x.plotAt, chart);
+		var yA = yAxis;
+		for (var i=0; i<series.values.length; i++){
+			var x=self.getX(series.values[i].x, chart);
+			var w;
+			if (i==series.values.length-1){
+				w=lastW;
+			} else{
+				w=self.getX(series.values[i+1].x, chart)-x-space;
+				lastW=w;
+			}
+			x-=(w/2);
+
+			var y=self.getY(series.values[i].value, chart);
+			var h=Math.abs(yA-y);
+			if (parseFloat(series.values[i].value) < chart.properties.axes.x.plotAt){
+				y=yA;
+			}
+
+			var bar=document.createElement("v:rect");
+			bar.style.position="absolute";
+			bar.style.top=y+"px";
+			bar.style.left=x+"px";
+			bar.style.width=w+"px";
+			bar.style.height=h+"px";
+			bar.setAttribute("fillColor", series.color);
+			bar.setAttribute("stroked", "false");
+			bar.style.antialias="false";
+			bar.setAttribute("title", series.label + " (" + i + "): " + series.values[i].value);
+			var fill=document.createElement("v:fill");
+			fill.setAttribute("opacity", "0.9");
+			bar.appendChild(fill);
+			chart.dataGroup.appendChild(bar);
+		}
+	};	
+	plotters["line"]=function(/* dojo.widget.Chart.DataSeries */series, /* dojo.widget.Chart */chart){
+		//	summary
+		//	plot the passed series as a line with tensioning
+		var tension=1.5;
+
+		var line=document.createElement("v:shape");
+		line.setAttribute("strokeweight", "2px");
+		line.setAttribute("strokecolor", series.color);
+		line.setAttribute("fillcolor", "none");
+		line.setAttribute("filled", "false");
+		line.setAttribute("title", series.label);
+		line.setAttribute("coordsize", chart.properties.width + "," + chart.properties.height);
+		line.style.position="absolute";
+		line.style.top="0px";
+		line.style.left="0px";
+		line.style.width= chart.properties.width+"px";
+		line.style.height=chart.properties.height+"px";
+		var stroke=document.createElement("v:stroke");
+		stroke.setAttribute("opacity", "0.85");
+		line.appendChild(stroke);
+
+		var path = [];
+		for (var i=0; i<series.values.length; i++){
+			var x = Math.round(self.getX(series.values[i].x, chart));
+			var y = Math.round(self.getY(series.values[i].value, chart));
+
+			if (i==0){
+				path.push("m");
+				path.push(x+","+y);
+			}else{
+				var lastx=Math.round(self.getX(series.values[i-1].x, chart));
+				var lasty=Math.round(self.getY(series.values[i-1].value, chart));
+				var dx=x-lastx;
+				var dy=y-lasty;
+				
+				path.push("c");
+				var cx=Math.round((x-(tension-1)*(dx/tension)));
+				path.push(cx+","+lasty);
+				cx=Math.round((x-(dx/tension)));
+				path.push(cx+","+y);
+				path.push(x+","+y);
+			}
+		}
+		line.setAttribute("path", path.join(" ")+" e");
+		chart.dataGroup.appendChild(line);
+	};
+	plotters["area"]=function(/* dojo.widget.Chart.DataSeries */series, /* dojo.widget.Chart */chart){
+		//	summary
+		//	plot the passed series as an area with tensioning.
+		var tension=1.5;
+
+		var line=document.createElement("v:shape");
+		line.setAttribute("strokeweight", "1px");
+		line.setAttribute("strokecolor", series.color);
+		line.setAttribute("fillcolor", series.color);
+		line.setAttribute("title", series.label);
+		line.setAttribute("coordsize", chart.properties.width + "," + chart.properties.height);
+		line.style.position="absolute";
+		line.style.top="0px";
+		line.style.left="0px";
+		line.style.width= chart.properties.width+"px";
+		line.style.height=chart.properties.height+"px";
+		var stroke=document.createElement("v:stroke");
+		stroke.setAttribute("opacity", "0.8");
+		line.appendChild(stroke);
+		var fill=document.createElement("v:fill");
+		fill.setAttribute("opacity", "0.4");
+		line.appendChild(fill);
+
+		var path = [];
+		for (var i=0; i<series.values.length; i++){
+			var x = Math.round(self.getX(series.values[i].x, chart));
+			var y = Math.round(self.getY(series.values[i].value, chart));
+
+			if (i==0){
+				path.push("m");
+				path.push(x+","+y);
+			}else{
+				var lastx=Math.round(self.getX(series.values[i-1].x, chart));
+				var lasty=Math.round(self.getY(series.values[i-1].value, chart));
+				var dx=x-lastx;
+				var dy=y-lasty;
+				
+				path.push("c");
+				var cx=Math.round((x-(tension-1)*(dx/tension)));
+				path.push(cx+","+lasty);
+				cx=Math.round((x-(dx/tension)));
+				path.push(cx+","+y);
+				path.push(x+","+y);
+			}
+		}
+		path.push("l");
+		path.push(x + "," + self.getY(0, chart));
+		path.push("l");
+		path.push(self.getX(0, chart) + "," + self.getY(0,chart));
+		line.setAttribute("path", path.join(" ")+" x e");
+		chart.dataGroup.appendChild(line);
+	};
+	plotters["scatter"]=function(/* dojo.widget.Chart.DataSeries */series, /* dojo.widget.Chart */chart){
+		//	summary
+		//	plot the passed series as a scatter chart
+		var r=6;
+		for (var i=0; i<series.values.length; i++){
+			var x=self.getX(series.values[i].x, chart);
+			var y=self.getY(series.values[i].value, chart);
+			var mod=r/2;
+
+			var point=document.createElement("v:rect");
+			point.setAttribute("fillcolor", series.color);
+			point.setAttribute("strokecolor", series.color);
+			point.setAttribute("title", series.label + ": " + series.values[i].value);
+			point.style.position="absolute";
+			point.style.rotation="45";
+			point.style.top=(y-mod)+"px";
+			point.style.left=(x-mod)+"px";
+			point.style.width=r+"px";
+			point.style.height=r+"px";
+			var fill=document.createElement("v:fill");
+			fill.setAttribute("opacity", "0.6");
+			point.appendChild(fill);
+			chart.dataGroup.appendChild(point);
+		}
+	};	
+	plotters["bubble"]=function(/* dojo.widget.Chart.DataSeries */series, /* dojo.widget.Chart */chart){
+		//	summary
+		//	plot the passed series as a series of bubbles (scatter with 3rd dimension)
+		//	added param for series[n].value: size
+		var minR=1;
+		
+		//	do this off the x axis?
+		var min=chart.properties.axes.x.range.min;
+		var max=chart.properties.axes.x.range.max;
+		var ofst=0-min;
+
+		min+=ofst; max+=ofst;
+		var xmin=chart.properties.padding.left;
+		var xmax=chart.properties.width-chart.properties.padding.right;
+		var factor=(max-min)/(xmax-xmin)*25;
+		
+		for (var i=0; i<series.values.length; i++){
+			var size = series.values[i].size;
+			if (isNaN(parseFloat(size))) size=minR;
+
+			var radius=(parseFloat(size)*factor)/2;
+			var diameter=radius * 2;
+			var cx=self.getX(series.values[i].x, chart);
+			var cy=self.getY(series.values[i].value, chart);
+
+			var top=cy-radius;
+			var left=cx-radius;
+
+			var point=document.createElement("v:oval");
+			point.setAttribute("fillcolor", series.color);
+			point.setAttribute("title", series.label + ": " + series.values[i].value + " (" + size + ")");
+			point.setAttribute("stroked", "false");
+			point.style.position="absolute";
+			
+			point.style.top=top+"px";
+			point.style.left=left+"px";
+			point.style.width=diameter+"px";
+			point.style.height=diameter+"px";
+
+			var fill=document.createElement("v:fill");
+			fill.setAttribute("opacity", "0.8");
+			point.appendChild(fill);
+			
+			chart.dataGroup.appendChild(point);
+		}
+	};
+}();

Modified: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/xml/Parse.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/xml/Parse.js?view=diff&rev=473277&r1=473276&r2=473277
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/xml/Parse.js (original)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/xml/Parse.js Fri Nov 10 01:15:01 2006
@@ -9,99 +9,143 @@
 */
 
 dojo.provide("dojo.xml.Parse");
-
 dojo.require("dojo.dom");
 
 //TODO: determine dependencies
 // currently has dependency on dojo.xml.DomUtil nodeTypes constants...
 
-/* generic method for taking a node and parsing it into an object
-
-TODO: WARNING: This comment is wrong!
-
-For example, the following xml fragment
-
-<foo bar="bar">
-	<baz xyzzy="xyzzy"/>
-</foo>
-
-can be described as:
-
-dojo.???.foo = {}
-dojo.???.foo.bar = {}
-dojo.???.foo.bar.value = "bar";
-dojo.???.foo.baz = {}
-dojo.???.foo.baz.xyzzy = {}
-dojo.???.foo.baz.xyzzy.value = "xyzzy"
-
+/* 
+  generic class for taking a node and parsing it into an object
 */
+
 // using documentFragment nomenclature to generalize in case we don't want to require passing a collection of nodes with a single parent
+
 dojo.xml.Parse = function(){
 
-	function getDojoTagName (node) {
-		var tagName = node.tagName;
-		if (tagName.substr(0,5).toLowerCase() != "dojo:") {
-			
-			if (tagName.substr(0,4).toLowerCase() == "dojo") {
-				// FIXME: this assuumes tag names are always lower case
-				return "dojo:" + tagName.substring(4).toLowerCase();
-			}
-		
-			// allow lower-casing
-			var djt = node.getAttribute("dojoType") || node.getAttribute("dojotype");
-			if (djt) { return "dojo:" + djt.toLowerCase(); }
-			
-			if (node.getAttributeNS && node.getAttributeNS(dojo.dom.dojoml,"type")) {
-				return "dojo:" + node.getAttributeNS(dojo.dom.dojoml,"type").toLowerCase();
-			}
-			try {
-				// FIXME: IE really really doesn't like this, so we squelch
-				// errors for it
-				djt = node.getAttribute("dojo:type");
-			} catch (e) { /* FIXME: log? */ }
+	// supported dojoTagName's:
+	// 
+	// <prefix:tag> => prefix:tag
+	// <dojo:tag> => dojo:tag
+	// <dojoTag> => dojo:tag
+	// <tag dojoType="type"> => dojo:type
+	// <tag dojoType="prefix:type"> => prefix:type
+	// <tag dojo:type="type"> => dojo:type
+	// <tag class="classa dojo-type classb"> => dojo:type	
+
+	// get normalized (lowercase) tagName
+	// some browsers report tagNames in lowercase no matter what
+	function getTagName(node){
+		return ((node)&&(node.tagName) ? node.tagName.toLowerCase() : '');
+	}
 
-			if (djt) { return "dojo:"+djt.toLowerCase(); }
-		
-			if (!dj_global["djConfig"] || !djConfig["ignoreClassNames"]) {
-				// FIXME: should we make this optionally enabled via djConfig?
-				var classes = node.className||node.getAttribute("class");
-				// FIXME: following line, without check for existence of classes.indexOf
-				// breaks firefox 1.5's svg widgets
-				if (classes && classes.indexOf && classes.indexOf("dojo-") != -1) {
-					var aclasses = classes.split(" ");
-					for(var x=0; x<aclasses.length; x++){
-						if (aclasses[x].length > 5 && aclasses[x].indexOf("dojo-") >= 0) {
-							return "dojo:"+aclasses[x].substr(5).toLowerCase();
-						}
+	// locate dojo qualified tag name
+	function getDojoTagName(node){
+		var tagName = getTagName(node);
+		if (!tagName){
+				return '';
+		}
+		// any registered tag
+		if((dojo.widget)&&(dojo.widget.tags[tagName])){
+			return tagName;
+		}
+		// <prefix:tag> => prefix:tag
+		var p = tagName.indexOf(":");
+		if(p>=0){
+			return tagName;
+		}
+		// <dojo:tag> => dojo:tag
+		if(tagName.substr(0,5) == "dojo:"){
+			return tagName;
+		}
+		if(dojo.render.html.capable && dojo.render.html.ie && node.scopeName != 'HTML'){
+			return node.scopeName.toLowerCase() + ':' + tagName;
+		}
+		// <dojoTag> => dojo:tag
+		if(tagName.substr(0,4) == "dojo"){
+			// FIXME: this assumes tag names are always lower case
+			return "dojo:" + tagName.substring(4);
+		}
+		// <tag dojoType="prefix:type"> => prefix:type
+		// <tag dojoType="type"> => dojo:type
+		var djt = node.getAttribute("dojoType") || node.getAttribute("dojotype");
+		if(djt){
+			if (djt.indexOf(":")<0){
+				djt = "dojo:"+djt;
+			}
+			return djt.toLowerCase();
+		}
+		// <tag dojo:type="type"> => dojo:type
+		djt = node.getAttributeNS && node.getAttributeNS(dojo.dom.dojoml,"type");
+		if(djt){
+			return "dojo:" + djt.toLowerCase();
+		}
+		// <tag dojo:type="type"> => dojo:type
+		try{
+			// FIXME: IE really really doesn't like this, so we squelch errors for it
+			djt = node.getAttribute("dojo:type");
+		}catch(e){ 
+			// FIXME: log?  
+		}
+		if(djt){ return "dojo:"+djt.toLowerCase(); }
+		// <tag class="classa dojo-type classb"> => dojo:type	
+		if((!dj_global["djConfig"])|| (djConfig["ignoreClassNames"])){ 
+			// FIXME: should we make this optionally enabled via djConfig?
+			var classes = node.className||node.getAttribute("class");
+			// FIXME: following line, without check for existence of classes.indexOf
+			// breaks firefox 1.5's svg widgets
+			if((classes )&&(classes.indexOf)&&(classes.indexOf("dojo-")!=-1)){
+		    var aclasses = classes.split(" ");
+		    for(var x=0, c=aclasses.length; x<c; x++){
+	        if(aclasses[x].slice(0, 5) == "dojo-"){
+            return "dojo:"+aclasses[x].substr(5).toLowerCase(); 
 					}
 				}
 			}
-		
 		}
-		return tagName.toLowerCase();
+		// no dojo-qualified name
+		return '';
 	}
 
 	this.parseElement = function(node, hasParentNodeSet, optimizeForDojoML, thisIdx){
 
-        // if parseWidgets="false" don't search inside this node for widgets
-        if (node.getAttribute("parseWidgets") == "false") {
-            return {};
-        }
-
-		// TODO: make this namespace aware
 		var parsedNodeSet = {};
+		
+		var tagName = getTagName(node);
+		//There's a weird bug in IE where it counts end tags, e.g. </dojo:button> as nodes that should be parsed.  Ignore these
+		if((tagName)&&(tagName.indexOf("/")==0)){
+			return null;
+		}
+		
+		// look for a dojoml qualified name
+		// process dojoml only when optimizeForDojoML is true
+		var process = true;
+		if(optimizeForDojoML){
+			var dojoTagName = getDojoTagName(node);
+			tagName = dojoTagName || tagName;
+			process = Boolean(dojoTagName);
+		}
+		
+		if(node && node.getAttribute && node.getAttribute("parseWidgets") && node.getAttribute("parseWidgets") == "false") {
+			return {};
+		}
 
-		var tagName = getDojoTagName(node);
 		parsedNodeSet[tagName] = [];
-		if((!optimizeForDojoML)||(tagName.substr(0,4).toLowerCase()=="dojo")){
-			var attributeSet = parseAttributes(node);
+		var pos = tagName.indexOf(":");
+		if(pos>0){
+			var ns = tagName.substring(0,pos);
+			parsedNodeSet["ns"] = ns;
+			// honor user namespace filters
+			if((dojo.ns)&&(!dojo.ns.allow(ns))){process=false;}
+		}
+
+		if(process){
+			var attributeSet = this.parseAttributes(node);
 			for(var attr in attributeSet){
 				if((!parsedNodeSet[tagName][attr])||(typeof parsedNodeSet[tagName][attr] != "array")){
 					parsedNodeSet[tagName][attr] = [];
 				}
 				parsedNodeSet[tagName][attr].push(attributeSet[attr]);
-			}
-	
+			}	
 			// FIXME: we might want to make this optional or provide cloning instead of
 			// referencing, but for now, we include a node reference to allow
 			// instantiated components to figure out their "roots"
@@ -109,14 +153,14 @@
 			parsedNodeSet.tagName = tagName;
 			parsedNodeSet.index = thisIdx||0;
 		}
-	
+
 		var count = 0;
-		var tcn, i = 0, nodes = node.childNodes;
-		while(tcn = nodes[i++]){
+		for(var i = 0; i < node.childNodes.length; i++){
+			var tcn = node.childNodes.item(i);
 			switch(tcn.nodeType){
 				case  dojo.dom.ELEMENT_NODE: // element nodes, call this function recursively
 					count++;
-					var ctn = getDojoTagName(tcn);
+					var ctn = getDojoTagName(tcn) || getTagName(tcn);
 					if(!parsedNodeSet[ctn]){
 						parsedNodeSet[ctn] = [];
 					}
@@ -127,7 +171,7 @@
 					}
 					break;
 				case  dojo.dom.TEXT_NODE: // if a single text node is the child, treat it as an attribute
-					if(node.childNodes.length == 1) {
+					if(node.childNodes.length == 1){
 						parsedNodeSet[tagName].push({ value: node.childNodes.item(0).nodeValue });
 					}
 					break;
@@ -157,32 +201,35 @@
 			}
 		}
 		//return (hasParentNodeSet) ? parsedNodeSet[node.tagName] : parsedNodeSet;
+		//if(parsedNodeSet.tagName)dojo.debug("parseElement: RETURNING NODE WITH TAGNAME "+parsedNodeSet.tagName);
 		return parsedNodeSet;
-	}
+	};
 
 	/* parses a set of attributes on a node into an object tree */
-	function parseAttributes(node) {
-		// TODO: make this namespace aware
+	this.parseAttributes = function(node){
 		var parsedAttributeSet = {};
 		var atts = node.attributes;
 		// TODO: should we allow for duplicate attributes at this point...
 		// would any of the relevant dom implementations even allow this?
 		var attnode, i=0;
-		while(attnode=atts[i++]) {
+		while((attnode=atts[i++])){
 			if((dojo.render.html.capable)&&(dojo.render.html.ie)){
 				if(!attnode){ continue; }
-				if(	(typeof attnode == "object")&&
+				if((typeof attnode == "object")&&
 					(typeof attnode.nodeValue == 'undefined')||
 					(attnode.nodeValue == null)||
 					(attnode.nodeValue == '')){ 
 					continue; 
 				}
 			}
-			var nn = (attnode.nodeName.indexOf("dojo:") == -1) ? attnode.nodeName : attnode.nodeName.split("dojo:")[1];
+
+			var nn = attnode.nodeName.split(":");
+			nn = (nn.length == 2) ? nn[1] : attnode.nodeName;
+						
 			parsedAttributeSet[nn] = { 
 				value: attnode.nodeValue 
 			};
 		}
 		return parsedAttributeSet;
-	}
-}
+	};
+};

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/xml/XslTransform.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/xml/XslTransform.js?view=auto&rev=473277
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/xml/XslTransform.js (added)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/xml/XslTransform.js Fri Nov 10 01:15:01 2006
@@ -0,0 +1,188 @@
+/*
+	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.xml.XslTransform");
+
+dojo.xml.XslTransform = function(/*String*/ xsltUri) {
+	//	summary:
+	//	dojo.xml.XslTransform is a convenience object that takes the URI String 
+	//		of an XSL file as a constructor argument.
+	//	After each transformation all parameters will be cleared.
+
+	//	Note this is supported by IE and Mozilla ONLY.
+
+	dojo.debug("XslTransform is supported by Internet Explorer and Mozilla, with limited support in Opera 9 (no document function support).");
+	var IS_IE = window.ActiveXObject ? true : false;
+	var ACTIVEX_DOMS = [
+		"Msxml2.DOMDocument.5.0", 
+		"Msxml2.DOMDocument.4.0", 
+		"Msxml2.DOMDocument.3.0", 
+		"MSXML2.DOMDocument", 
+		"MSXML.DOMDocument", 
+		"Microsoft.XMLDOM"
+	];
+	var ACTIVEX_FT_DOMS = [
+		"Msxml2.FreeThreadedDOMDocument.5.0", 
+		"MSXML2.FreeThreadedDOMDocument.4.0", 
+		"MSXML2.FreeThreadedDOMDocument.3.0"
+	];
+	var ACTIVEX_TEMPLATES = [
+		"Msxml2.XSLTemplate.5.0", 
+		"Msxml2.XSLTemplate.4.0", 
+		"MSXML2.XSLTemplate.3.0"
+	];
+  
+	function getActiveXImpl(activeXArray) {
+		for (var i=0; i < activeXArray.length; i++) {
+			try {
+				var testObj = new ActiveXObject(activeXArray[i]);
+				if (testObj) {
+					return activeXArray[i];
+				}
+			} catch (e) {}
+		}
+		dojo.raise("Could not find an ActiveX implementation in:\n\n " + activeXArray);
+	}
+    
+    if (xsltUri == null || xsltUri == undefined) {
+        dojo.raise("You must pass the URI String for the XSL file to be used!");
+        return false;
+    }
+    
+    var xsltDocument = null;
+    var xsltProcessor = null;
+    if (IS_IE) {
+        xsltDocument = new ActiveXObject(getActiveXImpl(ACTIVEX_FT_DOMS));
+        xsltDocument.async = false;
+    } else {
+        xsltProcessor = new XSLTProcessor();
+        xsltDocument = document.implementation.createDocument("", "", null);
+        xsltDocument.addEventListener("load", onXslLoad, false);
+    }
+    xsltDocument.load(xsltUri);
+    
+    if (IS_IE) {
+        var xslt = new ActiveXObject(getActiveXImpl(ACTIVEX_TEMPLATES));
+        xslt.stylesheet = xsltDocument;  
+        xsltProcessor = xslt.createProcessor();
+    }
+      
+    function onXslLoad() {
+        xsltProcessor.importStylesheet(xsltDocument); 
+    }
+  
+    function getResultDom(xmlDoc, params) {
+      if (IS_IE) {
+          addIeParams(params);
+          var result = getIeResultDom(xmlDoc);
+          removeIeParams(params);   
+          return result;
+      } else {
+          return getMozillaResultDom(xmlDoc, params);
+      }
+    }
+    
+    function addIeParams(params) {
+        if (params != null) {
+          for (var i=0; i<params.length; i++) 
+              xsltProcessor.addParameter(params[i][0], params[i][1]);
+        }
+    }
+    
+    function removeIeParams(params) {
+        if (params != null) {
+            for (var i=0; i<params.length; i++) 
+                xsltProcessor.addParameter(params[i][0], "");
+        }
+    }
+    
+    function getIeResultDom(xmlDoc) {
+        xsltProcessor.input = xmlDoc;
+        var outDoc = new ActiveXObject(getActiveXImpl(ACTIVEX_DOMS));
+        outDoc.async = false;  
+        outDoc.validateOnParse = false;
+        xsltProcessor.output = outDoc;
+        xsltProcessor.transform();
+        if (outDoc.parseError.errorCode != 0) {
+            var err = outDoc.parseError;
+			dojo.raise("err.errorCode: " + err.errorCode + "\n\nerr.reason: " + err.reason + "\n\nerr.url: " + err.url + "\n\nerr.srcText: " + err.srcText);
+        }
+        return outDoc;
+    }
+    
+    function getIeResultStr(xmlDoc, params) {
+        xsltProcessor.input = xmlDoc;
+        xsltProcessor.transform();    
+        return xsltProcessor.output;
+    }
+    
+    function addMozillaParams(params) {
+        if (params != null) {
+            for (var i=0; i<params.length; i++) 
+                xsltProcessor.setParameter(null, params[i][0], params[i][1]);
+        }
+    }
+    
+    function getMozillaResultDom(xmlDoc, params) {
+        addMozillaParams(params);
+        var resultDoc = xsltProcessor.transformToDocument(xmlDoc);
+        xsltProcessor.clearParameters();
+        return resultDoc;
+    }
+    
+    function getMozillaResultStr(xmlDoc, params, parentDoc) {
+        addMozillaParams(params);
+        var resultDoc = xsltProcessor.transformToFragment(xmlDoc, parentDoc);
+        var serializer = new XMLSerializer();
+        xsltProcessor.clearParameters();
+        return serializer.serializeToString(resultDoc);
+    }
+  
+    this.getResultString = function(/*XMLDocument*/ xmlDoc, /*2 Dimensional Array*/params, /*HTMLDocument*/parentDoc) {
+        var content = null;
+        if (IS_IE) {
+            addIeParams(params);
+            content = getIeResultStr(xmlDoc, params);
+            removeIeParams(params);  
+        } else {
+            content = getMozillaResultStr(xmlDoc, params, parentDoc);
+        } 
+        //dojo.debug(content);
+        return content;
+    };
+  
+    this.transformToContentPane = function(/*XMLDocument*/ xmlDoc, /*2 Dimensional Array*/params, /*ContentPane*/contentPane, /*HTMLDocument*/parentDoc) {
+        var content = this.getResultString(xmlDoc, params, parentDoc);
+        contentPane.setContent(content);
+    };
+      
+    this.transformToRegion = function(/*XMLDocument*/ xmlDoc, /*2 Dimensional Array*/params, /*HTMLElement*/region, /*HTMLDocument*/parentDoc) {
+        try {
+            var content = this.getResultString(xmlDoc, params, parentDoc);
+            region.innerHTML = content;
+        } catch (e) {
+            dojo.raise(e.message + "\n\n xsltUri: " + xsltUri)
+        }
+    };
+  
+    this.transformToDocument = function(/*XMLDocument*/ xmlDoc, /*2 Dimensional Array*/params) {
+        return getResultDom(xmlDoc, params);
+    }
+  
+    this.transformToWindow = function(/*XMLDocument*/ xmlDoc, /*2 Dimensional Array*/params, /*HTMLDocument*/windowDoc, /*HTMLDocument*/parentDoc) {
+        try {
+            windowDoc.open();
+            windowDoc.write(this.getResultString(xmlDoc, params, parentDoc));
+            windowDoc.close();
+        } catch (e) {
+            dojo.raise(e.message + "\n\n xsltUri: " + xsltUri)
+        }
+    };
+};

Propchange: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/xml/XslTransform.js
------------------------------------------------------------------------------
    svn:keywords = "Id Author LastChangedDate LastChangedBy LastChangedRevision"

Propchange: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/xml/XslTransform.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/xml/__package__.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/xml/__package__.js?view=diff&rev=473277&r1=473276&r2=473277
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/xml/__package__.js (original)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/src/xml/__package__.js Fri Nov 10 01:15:01 2006
@@ -10,9 +10,9 @@
 
 dojo.require("dojo.xml.Parse");
 dojo.kwCompoundRequire({
-	common:		["dojo.xml.domUtil"],
-    browser: 	["dojo.xml.htmlUtil"],
-    dashboard: 	["dojo.xml.htmlUtil"],
+	common:		["dojo.dom"],
+    browser: 	["dojo.html.*"],
+    dashboard: 	["dojo.html.*"],
     svg: 		["dojo.xml.svgUtil"]
 });
 dojo.provide("dojo.xml.*");

Added: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/storage_dialog.swf
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/storage_dialog.swf?view=auto&rev=473277
==============================================================================
Binary file - no diff available.

Propchange: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/storage_dialog.swf
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/version.txt
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/version.txt?view=diff&rev=473277&r1=473276&r2=473277
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/version.txt (original)
+++ myfaces/tomahawk/trunk/core/src/main/resources/org/apache/myfaces/custom/dojo/resource/version.txt Fri Nov 10 01:15:01 2006
@@ -1,2 +1,2 @@
-keeDOJO library version 0.3.1
+keeDOJO library version 0.4
 kitchen sink release