You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ed...@apache.org on 2006/11/11 17:44:48 UTC

svn commit: r473755 [7/43] - in /jackrabbit/trunk/contrib/jcr-browser: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/jackrabbit/ src/main/java/org/apache/jackrabbit/browser/ src/main/resources/ s...

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

Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/charting/vml/Plotters.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/ArrayList.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/ArrayList.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/ArrayList.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/ArrayList.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,136 @@
+dojo.provide("dojo.collections.ArrayList");
+dojo.require("dojo.collections.Collections");
+
+dojo.collections.ArrayList=function(/* array? */arr){
+	//	summary
+	//	Returns a new object of type dojo.collections.ArrayList
+	var items=[];
+	if(arr) items=items.concat(arr);
+	this.count=items.length;
+	this.add=function(/* object */obj){
+		//	summary
+		//	Add an element to the collection.
+		items.push(obj);
+		this.count=items.length;
+	};
+	this.addRange=function(/* array */a){
+		//	summary
+		//	Add a range of objects to the ArrayList
+		if(a.getIterator){
+			var e=a.getIterator();
+			while(!e.atEnd()){
+				this.add(e.get());
+			}
+			this.count=items.length;
+		}else{
+			for(var i=0; i<a.length; i++){
+				items.push(a[i]);
+			}
+			this.count=items.length;
+		}
+	};
+	this.clear=function(){
+		//	summary
+		//	Clear all elements out of the collection, and reset the count.
+		items.splice(0, items.length);
+		this.count=0;
+	};
+	this.clone=function(){
+		//	summary
+		//	Clone the array list
+		return new dojo.collections.ArrayList(items);	//	dojo.collections.ArrayList
+	};
+	this.contains=function(/* object */obj){
+		//	summary
+		//	Check to see if the passed object is a member in the ArrayList
+		for(var i=0; i < items.length; i++){
+			if(items[i] == obj) {
+				return true;	//	bool
+			}
+		}
+		return false;	//	bool
+	};
+	this.forEach=function(/* function */ fn, /* object? */ scope){
+		//	summary
+		//	functional iterator, following the mozilla spec.
+		var s=scope||dj_global;
+		if(Array.forEach){
+			Array.forEach(items, fn, s);
+		}else{
+			for(var i=0; i<items.length; i++){
+				fn.call(s, items[i], i, items);
+			}
+		}
+	};
+	this.getIterator=function(){
+		//	summary
+		//	Get an Iterator for this object
+		return new dojo.collections.Iterator(items);	//	dojo.collections.Iterator
+	};
+	this.indexOf=function(/* object */obj){
+		//	summary
+		//	Return the numeric index of the passed object; will return -1 if not found.
+		for(var i=0; i < items.length; i++){
+			if(items[i] == obj) {
+				return i;	//	int
+			}
+		}
+		return -1;	// int
+	};
+	this.insert=function(/* int */ i, /* object */ obj){
+		//	summary
+		//	Insert the passed object at index i
+		items.splice(i,0,obj);
+		this.count=items.length;
+	};
+	this.item=function(/* int */ i){
+		//	summary
+		//	return the element at index i
+		return items[i];	//	object
+	};
+	this.remove=function(/* object */obj){
+		//	summary
+		//	Look for the passed object, and if found, remove it from the internal array.
+		var i=this.indexOf(obj);
+		if(i >=0) {
+			items.splice(i,1);
+		}
+		this.count=items.length;
+	};
+	this.removeAt=function(/* int */ i){
+		//	summary
+		//	return an array with function applied to all elements
+		items.splice(i,1);
+		this.count=items.length;
+	};
+	this.reverse=function(){
+		//	summary
+		//	Reverse the internal array
+		items.reverse();
+	};
+	this.sort=function(/* function? */ fn){
+		//	summary
+		//	sort the internal array
+		if(fn){
+			items.sort(fn);
+		}else{
+			items.sort();
+		}
+	};
+	this.setByIndex=function(/* int */ i, /* object */ obj){
+		//	summary
+		//	Set an element in the array by the passed index.
+		items[i]=obj;
+		this.count=items.length;
+	};
+	this.toArray=function(){
+		//	summary
+		//	Return a new array with all of the items of the internal array concatenated.
+		return [].concat(items);
+	}
+	this.toString=function(/* string */ delim){
+		//	summary
+		//	implementation of toString, follows [].toString();
+		return items.join((delim||","));
+	};
+};

Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/ArrayList.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/BinaryTree.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/BinaryTree.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/BinaryTree.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/BinaryTree.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,193 @@
+dojo.provide("dojo.collections.BinaryTree");
+dojo.require("dojo.collections.Collections");
+dojo.require("dojo.experimental");
+
+dojo.experimental("dojo.collections.BinaryTree");
+
+dojo.collections.BinaryTree=function(data){
+	function node(data, rnode, lnode){
+		this.value=data||null;
+		this.right=rnode||null;
+		this.left=lnode||null;
+		this.clone=function(){
+			var c=new node();
+			if (this.value.value) c.value=this.value.clone();
+			else c.value=this.value;
+			if (this.left) c.left=this.left.clone();
+			if (this.right) c.right=this.right.clone();
+		}
+		this.compare=function(n){
+			if (this.value > n.value) return 1;
+			if (this.value < n.value) return -1;
+			return 0;
+		}
+		this.compareData=function(d){
+			if (this.value > d) return 1;
+			if (this.value < d) return -1;
+			return 0;
+		}
+	}
+
+	function inorderTraversalBuildup(current, a){
+		if (current){
+			inorderTraversalBuildup(current.left, a);
+			a.add(current);
+			inorderTraversalBuildup(current.right, a);
+		}
+	}
+
+	function preorderTraversal(current, sep){
+		var s="";
+		if (current){
+			s=current.value.toString() + sep;
+			s += preorderTraversal(current.left, sep);
+			s += preorderTraversal(current.right, sep);
+		}
+		return s;
+	}
+	function inorderTraversal(current, sep){
+		var s="";
+		if (current){
+			s=inorderTraversal(current.left, sep);
+			s += current.value.toString() + sep;
+			s += inorderTraversal(current.right, sep);
+		}
+		return s;
+	}
+	function postorderTraversal(current, sep){
+		var s="";
+		if (current){
+			s=postorderTraversal(current.left, sep);
+			s += postorderTraversal(current.right, sep);
+			s += current.value.toString() + sep;
+		}
+		return s;
+	}
+	
+	function searchHelper(current, data){
+		if (!current) return null;
+		var i=current.compareData(data);
+		if (i==0) return current;
+		if (i>0) return searchHelper(current.left, data);
+		else return searchHelper(current.right, data);
+	}
+
+	this.add=function(data){
+		var n=new node(data);
+		var i;
+		var current=root;
+		var parent=null;
+		while (current){
+			i=current.compare(n);
+			if (i == 0) return;
+			parent=current;
+			if (i > 0) current=current.left;
+			else current=current.right;
+		}
+		this.count++;
+		if (!parent) root=n;
+		else {
+			i=parent.compare(n);
+			if (i > 0) parent.left=n;
+			else parent.right=n;
+		}
+	};
+	this.clear=function(){
+		root=null;
+		this.count=0;
+	};
+	this.clone=function(){
+		var c=new dojo.collections.BinaryTree();
+		c.root=root.clone();
+		c.count=this.count;
+		return c;
+	};
+	this.contains=function(data){
+		return this.search(data) != null;
+	};
+	this.deleteData=function(data){
+		var current=root;
+		var parent=null;
+		var i=current.compareData(data);
+		while (i != 0 && current != null){
+			if (i > 0){
+				parent=current;
+				current=current.left;
+			} else if (i < 0) {
+				parent=current;
+				current=current.right;
+			}
+			i=current.compareData(data);
+		}
+		if (!current) return;
+		this.count--;
+		if (!current.right) {
+			if (!parent) root=current.left;
+			else {
+				i=parent.compare(current);
+				if (i > 0) parent.left=current.left;
+				else if (i < 0) parent.right=current.left;
+			}
+		} else if (!current.right.left){
+			if (!parent) root=current.right;
+			else {
+				i=parent.compare(current);
+				if (i > 0) parent.left=current.right;
+				else if (i < 0) parent.right=current.right;
+			}
+		} else {
+			var leftmost=current.right.left;
+			var lmParent=current.right;
+			while (leftmost.left != null){
+				lmParent=leftmost;
+				leftmost=leftmost.left;
+			}
+			lmParent.left=leftmost.right;
+			leftmost.left=current.left;
+			leftmost.right=current.right;
+			if (!parent) root=leftmost;
+			else {
+				i=parent.compare(current);
+				if (i > 0) parent.left=leftmost;
+				else if (i < 0) parent.right=leftmost;
+			}
+		}
+	};
+	this.getIterator=function(){
+		var a=[];
+		inorderTraversalBuildup(root, a);
+		return new dojo.collections.Iterator(a);
+	};
+	this.search=function(data){
+		return searchHelper(root, data);
+	};
+	this.toString=function(order, sep){
+		if (!order) var order=dojo.collections.BinaryTree.TraversalMethods.Inorder;
+		if (!sep) var sep=" ";
+		var s="";
+		switch (order){
+			case dojo.collections.BinaryTree.TraversalMethods.Preorder:
+				s=preorderTraversal(root, sep);
+				break;
+			case dojo.collections.BinaryTree.TraversalMethods.Inorder:
+				s=inorderTraversal(root, sep);
+				break;
+			case dojo.collections.BinaryTree.TraversalMethods.Postorder:
+				s=postorderTraversal(root, sep);
+				break;
+		};
+		if (s.length == 0) return "";
+		else return s.substring(0, s.length - sep.length);
+	};
+
+	this.count=0;
+	var root=this.root=null;
+	if (data) {
+		this.add(data);
+	}
+}
+dojo.collections.BinaryTree.TraversalMethods={
+	Preorder : 1,
+	Inorder : 2,
+	Postorder : 3
+};

Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/BinaryTree.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Collections.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Collections.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Collections.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Collections.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,114 @@
+dojo.provide("dojo.collections.Collections");
+
+dojo.collections.DictionaryEntry=function(/* string */k, /* object */v){
+	//	summary
+	//	return an object of type dojo.collections.DictionaryEntry
+	this.key=k;
+	this.value=v;
+	this.valueOf=function(){ 
+		return this.value; 	//	object
+	};
+	this.toString=function(){ 
+		return String(this.value);	//	string 
+	};
+}
+
+/*	Iterators
+ *	The collections.Iterators (Iterator and DictionaryIterator) are built to
+ *	work with the Collections included in this module.  However, they *can*
+ *	be used with arrays and objects, respectively, should one choose to do so.
+ */
+dojo.collections.Iterator=function(/* array */arr){
+	//	summary
+	//	return an object of type dojo.collections.Iterator
+	var a=arr;
+	var position=0;
+	this.element=a[position]||null;
+	this.atEnd=function(){
+		//	summary
+		//	Test to see if the internal cursor has reached the end of the internal collection.
+		return (position>=a.length);	//	bool
+	};
+	this.get=function(){
+		//	summary
+		//	Test to see if the internal cursor has reached the end of the internal collection.
+		if(this.atEnd()){
+			return null;		//	object
+		}
+		this.element=a[position++];
+		return this.element;	//	object
+	};
+	this.map=function(/* function */fn, /* object? */scope){
+		//	summary
+		//	Functional iteration with optional scope.
+		var s=scope||dj_global;
+		if(Array.map){
+			return Array.map(a,fn,s);	//	array
+		}else{
+			var arr=[];
+			for(var i=0; i<a.length; i++){
+				arr.push(fn.call(s,a[i]));
+			}
+			return arr;		//	array
+		}
+	};
+	this.reset=function(){
+		//	summary
+		//	reset the internal cursor.
+		position=0;
+		this.element=a[position];
+	};
+}
+
+/*	Notes:
+ *	The DictionaryIterator no longer supports a key and value property;
+ *	the reality is that you can use this to iterate over a JS object
+ *	being used as a hashtable.
+ */
+dojo.collections.DictionaryIterator=function(/* object */obj){
+	//	summary
+	//	return an object of type dojo.collections.DictionaryIterator
+	var a=[];	//	Create an indexing array
+	var testObject={};
+	for(var p in obj){
+		if(!testObject[p]){
+			a.push(obj[p]);	//	fill it up
+		}
+	}
+	var position=0;
+	this.element=a[position]||null;
+	this.atEnd=function(){
+		//	summary
+		//	Test to see if the internal cursor has reached the end of the internal collection.
+		return (position>=a.length);	//	bool
+	};
+	this.get=function(){
+		//	summary
+		//	Test to see if the internal cursor has reached the end of the internal collection.
+		if(this.atEnd()){
+			return null;		//	object
+		}
+		this.element=a[position++];
+		return this.element;	//	object
+	};
+	this.map=function(/* function */fn, /* object? */scope){
+		//	summary
+		//	Functional iteration with optional scope.
+		var s=scope||dj_global;
+		if(Array.map){
+			return Array.map(a,fn,s);	//	array
+		}else{
+			var arr=[];
+			for(var i=0; i<a.length; i++){
+				arr.push(fn.call(s,a[i]));
+			}
+			return arr;		//	array
+		}
+	};
+	this.reset=function() { 
+		//	summary
+		//	reset the internal cursor.
+		position=0; 
+		this.element=a[position];
+	};
+};

Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Collections.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Dictionary.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Dictionary.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Dictionary.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Dictionary.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,119 @@
+dojo.provide("dojo.collections.Dictionary");
+dojo.require("dojo.collections.Collections");
+
+dojo.collections.Dictionary=function(/* dojo.collections.Dictionary? */dictionary){
+	//	summary
+	//	Returns an object of type dojo.collections.Dictionary
+	var items={};
+	this.count=0;
+
+	//	comparator for property addition and access.
+	var testObject={};
+
+	this.add=function(/* string */k, /* object */v){
+		//	summary
+		//	Add a new item to the Dictionary.
+		var b=(k in items);
+		items[k]=new dojo.collections.DictionaryEntry(k,v);
+		if(!b){
+			this.count++;
+		}
+	};
+	this.clear=function(){
+		//	summary
+		//	Clears the internal dictionary.
+		items={};
+		this.count=0;
+	};
+	this.clone=function(){
+		//	summary
+		//	Returns a new instance of dojo.collections.Dictionary; note the the dictionary is a clone but items might not be.
+		return new dojo.collections.Dictionary(this);	//	dojo.collections.Dictionary
+	};
+	this.contains=this.containsKey=function(/* string */k){
+		//	summary
+		//	Check to see if the dictionary has an entry at key "k".
+		if(testObject[k]){
+			return false;			// bool
+		}
+		return (items[k]!=null);	//	bool
+	};
+	this.containsValue=function(/* object */v){
+		//	summary
+		//	Check to see if the dictionary has an entry with value "v".
+		var e=this.getIterator();
+		while(e.get()){
+			if(e.element.value==v){
+				return true;	//	bool
+			}
+		}
+		return false;	//	bool
+	};
+	this.entry=function(/* string */k){
+		//	summary
+		//	Accessor method; similar to dojo.collections.Dictionary.item but returns the actual Entry object.
+		return items[k];	//	dojo.collections.DictionaryEntry
+	};
+	this.forEach=function(/* function */ fn, /* object? */ scope){
+		//	summary
+		//	functional iterator, following the mozilla spec.
+		var a=[];	//	Create an indexing array
+		for(var p in items) {
+			if(!testObject[p]){
+				a.push(items[p]);	//	fill it up
+			}
+		}
+		var s=scope||dj_global;
+		if(Array.forEach){
+			Array.forEach(a, fn, s);
+		}else{
+			for(var i=0; i<a.length; i++){
+				fn.call(s, a[i], i, a);
+			}
+		}
+	};
+	this.getKeyList=function(){
+		//	summary
+		//	Returns an array of the keys in the dictionary.
+		return (this.getIterator()).map(function(entry){ 
+			return entry.key; 
+		});	//	array
+	};
+	this.getValueList=function(){
+		//	summary
+		//	Returns an array of the values in the dictionary.
+		return (this.getIterator()).map(function(entry){ 
+			return entry.value; 
+		});	//	array
+	};
+	this.item=function(/* string */k){
+		//	summary
+		//	Accessor method.
+		if(k in items){
+			return items[k].valueOf();	//	object
+		}
+		return undefined;	//	object
+	};
+	this.getIterator=function(){
+		//	summary
+		//	Gets a dojo.collections.DictionaryIterator for iteration purposes.
+		return new dojo.collections.DictionaryIterator(items);	//	dojo.collections.DictionaryIterator
+	};
+	this.remove=function(/* string */k){
+		//	summary
+		//	Removes the item at k from the internal collection.
+		if(k in items && !testObject[k]){
+			delete items[k];
+			this.count--;
+			return true;	//	bool
+		}
+		return false;	//	bool
+	};
+
+	if (dictionary){
+		var e=dictionary.getIterator();
+		while(e.get()) {
+			 this.add(e.element.key, e.element.value);
+		}
+	}
+};

Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Dictionary.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Graph.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Graph.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Graph.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Graph.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,143 @@
+dojo.provide("dojo.collections.Graph");
+dojo.require("dojo.collections.Collections");
+
+dojo.experimental("dojo.collections.Graph");
+
+dojo.collections.Graph=function(nodes){
+	function node(key, data, neighbors) {
+		this.key=key;
+		this.data=data;
+		this.neighbors=neighbors||new adjacencyList();
+		this.addDirected=function(){
+			if (arguments[0].constructor==edgeToNeighbor){
+				this.neighbors.add(arguments[0]);
+			}else{
+				var n=arguments[0];
+				var cost=arguments[1]||0;
+				this.neighbors.add(new edgeToNeighbor(n, cost));
+			}
+		}
+	}
+	function nodeList(){
+		var d=new dojo.collections.Dictionary();
+		function nodelistiterator(){
+			var o=[] ;	//	Create an indexing array
+			var e=d.getIterator();
+			while(e.get()){
+				o[o.length]=e.element;
+			}
+
+			var position=0;
+			this.element=o[position]||null;
+			this.atEnd=function(){
+				return (position>=o.length);
+			}
+			this.get=function(){
+				if(this.atEnd()){
+					return null;		//	object
+				}
+				this.element=o[position++];
+				return this.element;	//	object
+			};
+			this.map=function(/* function */fn, /* object? */scope){
+				var s=scope||dj_global;
+				if(Array.map){
+					return Array.map(o,fn,s);	//	array
+				}else{
+					var arr=[];
+					for(var i=0; i<o.length; i++){
+						arr.push(fn.call(s,o[i]));
+					}
+					return arr;		//	array
+				}
+			};
+			this.reset=function(){
+				position=0;
+				this.element=o[position];
+			};
+		}
+		
+		this.add=function(node){
+			d.add(node.key, node);
+		};
+		this.clear=function(){
+			d.clear();
+		};
+		this.containsKey=function(key){
+			return d.containsKey(key);
+		};
+		this.getIterator=function(){
+			return new nodelistiterator(this);
+		};
+		this.item=function(key){
+			return d.item(key);
+		};
+		this.remove=function(node){
+			d.remove(node.key);
+		};
+	}
+	function edgeToNeighbor(node, cost){
+		this.neighbor=node;
+		this.cost=cost;
+	}
+	function adjacencyList(){
+		var d=[];
+		this.add=function(o){
+			d.push(o);
+		};
+		this.item=function(i){
+			return d[i];
+		};
+		this.getIterator=function(){
+			return new dojo.collections.Iterator([].concat(d));
+		};
+	}
+
+	this.nodes=nodes||new nodeList();
+	this.count=this.nodes.count;
+	this.clear=function(){
+		this.nodes.clear();
+		this.count=0;
+	};
+	this.addNode=function(){
+		var n=arguments[0];
+		if(arguments.length > 1){
+			n=new node(arguments[0],arguments[1]);
+		}
+		if(!this.nodes.containsKey(n.key)){
+			this.nodes.add(n);
+			this.count++;
+		}
+	};
+	this.addDirectedEdge=function(uKey, vKey, cost){
+		var uNode,vNode;
+		if(uKey.constructor!= node){
+			uNode=this.nodes.item(uKey);
+			vNode=this.nodes.item(vKey);
+		}else{
+			uNode=uKey;
+			vNode=vKey;
+		}
+		var c=cost||0;
+		uNode.addDirected(vNode,c);
+	};
+	this.addUndirectedEdge=function(uKey, vKey, cost){
+		var uNode, vNode;
+		if(uKey.constructor!=node){
+			uNode=this.nodes.item(uKey);
+			vNode=this.nodes.item(vKey);
+		}else{
+			uNode=uKey;
+			vNode=vKey;
+		}
+		var c=cost||0;
+		uNode.addDirected(vNode,c);
+		vNode.addDirected(uNode,c);
+	};
+	this.contains=function(n){
+		return this.nodes.containsKey(n.key);
+	};
+	this.containsKey=function(k){
+		return this.nodes.containsKey(k);
+	};
+}

Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Graph.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Queue.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Queue.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Queue.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Queue.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,77 @@
+dojo.provide("dojo.collections.Queue");
+dojo.require("dojo.collections.Collections");
+
+dojo.collections.Queue=function(/* array? */arr){
+	//	summary
+	//	return an object of type dojo.collections.Queue
+	var q=[];
+	if (arr){
+		q=q.concat(arr);
+	}
+	this.count=q.length;
+	this.clear=function(){
+		//	summary
+		//	clears the internal collection
+		q=[];
+		this.count=q.length;
+	};
+	this.clone=function(){
+		//	summary
+		//	creates a new Queue based on this one
+		return new dojo.collections.Queue(q);	//	dojo.collections.Queue
+	};
+	this.contains=function(/* object */ o){
+		//	summary
+		//	Check to see if the passed object is an element in this queue
+		for(var i=0; i<q.length; i++){
+			if (q[i]==o){
+				return true;	//	bool
+			}
+		}
+		return false;	//	bool
+	};
+	this.copyTo=function(/* array */ arr, /* int */ i){
+		//	summary
+		//	Copy the contents of this queue into the passed array at index i.
+		arr.splice(i,0,q);
+	};
+	this.dequeue=function(){
+		//	summary
+		//	shift the first element off the queue and return it
+		var r=q.shift();
+		this.count=q.length;
+		return r;	//	object
+	};
+	this.enqueue=function(/* object */ o){
+		//	summary
+		//	put the passed object at the end of the queue
+		this.count=q.push(o);
+	};
+	this.forEach=function(/* function */ fn, /* object? */ scope){
+		//	summary
+		//	functional iterator, following the mozilla spec.
+		var s=scope||dj_global;
+		if(Array.forEach){
+			Array.forEach(q, fn, s);
+		}else{
+			for(var i=0; i<q.length; i++){
+				fn.call(s, q[i], i, q);
+			}
+		}
+	};
+	this.getIterator=function(){
+		//	summary
+		//	get an Iterator based on this queue.
+		return new dojo.collections.Iterator(q);	//	dojo.collections.Iterator
+	};
+	this.peek=function(){
+		//	summary
+		//	get the next element in the queue without altering the queue.
+		return q[0];
+	};
+	this.toArray=function(){
+		//	summary
+		//	return an array based on the internal array of the queue.
+		return [].concat(q);
+	};
+};

Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Queue.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Set.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Set.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Set.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Set.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,84 @@
+dojo.provide("dojo.collections.Set");
+dojo.require("dojo.collections.Collections");
+dojo.require("dojo.collections.ArrayList");
+
+dojo.collections.Set = new function(){
+	//	summary
+	//	Singleton for dealing with common set operations.
+	this.union = function(/* array */setA, /* array */setB){
+		//	summary
+		//	Return the union of the two passed sets.
+		if (setA.constructor == Array) var setA = new dojo.collections.ArrayList(setA);
+		if (setB.constructor == Array) var setB = new dojo.collections.ArrayList(setB);
+		if (!setA.toArray || !setB.toArray) dojo.raise("Set operations can only be performed on array-based collections.");
+		var result = new dojo.collections.ArrayList(setA.toArray());
+		var e = setB.getIterator();
+		while(!e.atEnd()){
+			var item=e.get();
+			if(!result.contains(item)){
+				result.add(item);
+			}
+		}
+		return result;	//	dojo.collections.ArrayList
+	};
+	this.intersection = function(/* array */setA, /* array */setB){
+		//	summary
+		//	Return the intersection of the two passed sets.
+		if (setA.constructor == Array) var setA = new dojo.collections.ArrayList(setA);
+		if (setB.constructor == Array) var setB = new dojo.collections.ArrayList(setB);
+		if (!setA.toArray || !setB.toArray) dojo.raise("Set operations can only be performed on array-based collections.");
+		var result = new dojo.collections.ArrayList();
+		var e = setB.getIterator();
+		while(!e.atEnd()){
+			var item=e.get();
+			if(setA.contains(item)){
+				result.add(item);
+			}
+		}
+		return result;	//	dojo.collections.ArrayList
+	};
+	this.difference = function(/* array */setA, /* array */setB){
+		//	summary
+		//	Returns everything in setA that is not in setB.
+		if (setA.constructor == Array) var setA = new dojo.collections.ArrayList(setA);
+		if (setB.constructor == Array) var setB = new dojo.collections.ArrayList(setB);
+		if (!setA.toArray || !setB.toArray) dojo.raise("Set operations can only be performed on array-based collections.");
+		var result = new dojo.collections.ArrayList();
+		var e=setA.getIterator();
+		while(!e.atEnd()){
+			var item=e.get();
+			if(!setB.contains(item)){
+				result.add(item);
+			}
+		}
+		return result;	//	dojo.collections.ArrayList
+	};
+	this.isSubSet = function(/* array */setA, /* array */setB) {
+		//	summary
+		//	Returns if set B is a subset of set A.
+		if (setA.constructor == Array) var setA = new dojo.collections.ArrayList(setA);
+		if (setB.constructor == Array) var setB = new dojo.collections.ArrayList(setB);
+		if (!setA.toArray || !setB.toArray) dojo.raise("Set operations can only be performed on array-based collections.");
+		var e = setA.getIterator();
+		while(!e.atEnd()){
+			if(!setB.contains(e.get())){
+				return false;	//	boolean
+			}
+		}
+		return true;	//	boolean
+	};
+	this.isSuperSet = function(/* array */setA, /* array */setB){
+		//	summary
+		//	Returns if set B is a superset of set A.
+		if (setA.constructor == Array) var setA = new dojo.collections.ArrayList(setA);
+		if (setB.constructor == Array) var setB = new dojo.collections.ArrayList(setB);
+		if (!setA.toArray || !setB.toArray) dojo.raise("Set operations can only be performed on array-based collections.");
+		var e = setB.getIterator();
+		while(!e.atEnd()){
+			if(!setA.contains(e.get())){
+				return false;	//	boolean
+			}
+		}
+		return true;	//	boolean
+	};
+}();

Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Set.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/SkipList.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/SkipList.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/SkipList.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/SkipList.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,139 @@
+dojo.provide("dojo.collections.SkipList");
+dojo.require("dojo.collections.Collections");
+dojo.require("dojo.experimental");
+
+dojo.experimental("dojo.collections.SkipList");
+
+dojo.collections.SkipList = function(){
+	function node(height, val){
+		this.value = val;
+		this.height = height;
+		this.nodes = new nodeList(height);
+		this.compare = function(val){
+			if (this.value > val) return 1;
+			if (this.value < val) return -1;
+			return 0;
+		}
+		this.incrementHeight = function(){
+			this.nodes.incrementHeight();
+			this.height++;
+		};
+		this.decrementHeight = function(){
+			this.nodes.decrementHeight();
+			this.height--;
+		};
+	}
+	function nodeList(height){
+		var arr = [];
+		this.height = height;
+		for (var i = 0; i < height; i++) arr[i] = null;
+		this.item = function(i){
+			return arr[i];
+		};
+		this.incrementHeight = function(){
+			this.height++;
+			arr[this.height] = null;
+		};
+		this.decrementHeight = function(){
+			arr.splice(arr.length - 1, 1);
+			this.height--;
+		};
+	}
+	function iterator(list){
+		this.element = list.head;
+		this.atEnd = function(){
+			return (this.element==null);
+		}
+		this.get = function(){
+			if(this.atEnd()){
+				return null;
+			}
+			this.element=this.element.nodes[0];
+			return this.element;
+		}
+		this.reset = function(){
+			this.element = list.head;
+		}
+	}
+
+	function chooseRandomHeight(max){
+		var level = 1;
+		while (Math.random() < PROB && level < max) level++;
+		return level;
+	}
+
+	var PROB = 0.5;
+	var comparisons = 0;
+
+	this.head = new node(1);
+	this.count = 0;
+	this.add = function(val){
+		var updates = [];
+		var current = this.head;
+		for (var i = this.head.height; i >= 0; i--){
+			if (!(current.nodes[i] != null && current.nodes[i].compare(val) < 0)) comparisons++;
+			while (current.nodes[i] != null && current.nodes[i].compare(val) < 0){
+				current = current.nodes[i];
+				comparisons++;
+			}
+			updates[i] = current;
+		}
+		if (current.nodes[0] != null && current.nodes[0].compare(val) == 0) return;
+		var n = new node(val, chooseRandomHeight(this.head.height + 1));
+		this.count++;
+		if (n.height > this.head.height){
+			this.head.incrementHeight();
+			this.head.nodes[this.head.height - 1] = n;
+		}
+		for (i = 0; i < n.height; i++){
+			if (i < updates.length) {
+				n.nodes[i] = updates[i].nodes[i];
+				updates[i].nodes[i] = n;
+			}
+		}
+	};
+	
+	this.contains = function(val){
+		var current = this.head;
+		var i;
+		for (i = this.head.height - 1; i >= 0; i--) {
+			while (current.item(i) != null) {
+				comparisons++;
+				var result = current.nodes[i].compare(val);
+				if (result == 0) return true;
+				else if (result < 0) current = current.nodes[i];
+				else break;
+			}
+		}
+		return false;
+	};
+	this.getIterator = function(){
+		return new iterator(this);
+	};
+
+	this.remove = function(val){
+		var updates = [];
+		var current = this.head;
+		for (var i = this.head.height - 1; i >= 0; i--){
+			if (!(current.nodes[i] != null && current.nodes[i].compare(val) < 0)) comparisons++;
+			while (current.nodes[i] != null && current.nodes[i].compare(val) < 0) {
+				current = current.nodes[i];
+				comparisons++;
+			}
+			updates[i] = current;
+		}
+		
+		current = current.nodes[0];
+		if (current != null && current.compare(val) == 0){
+			this.count--;
+			for (var i = 0; i < this.head.height; i++){
+				if (updates[i].nodes[i] != current) break;
+				else updates[i].nodes[i] = current.nodes[i];
+			}
+			if (this.head.nodes[this.head.height - 1] == null) this.head.decrementHeight();
+		}
+	};
+	this.resetComparisons = function(){ 
+		comparisons = 0; 
+	};
+}

Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/SkipList.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/SortedList.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/SortedList.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/SortedList.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/SortedList.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,201 @@
+dojo.provide("dojo.collections.SortedList");
+dojo.require("dojo.collections.Collections");
+
+dojo.collections.SortedList=function(/* object? */ dictionary){
+	//	summary
+	//	creates a collection that acts like a dictionary but is also internally sorted.
+	//	Note that the act of adding any elements forces an internal resort, making this object potentially slow.
+	var _this=this;
+	var items={};
+	var q=[];
+	var sorter=function(a,b){
+		if (a.key > b.key) return 1;
+		if (a.key < b.key) return -1;
+		return 0;
+	};
+	var build=function(){
+		q=[];
+		var e=_this.getIterator();
+		while (!e.atEnd()){
+			q.push(e.get());
+		}
+		q.sort(sorter);
+	};
+	var testObject={};
+
+	this.count=q.length;
+	this.add=function(/* string */ k,/* object */v){
+		//	summary
+		//	add the passed value to the dictionary at location k
+		if (!items[k]) {
+			items[k]=new dojo.collections.DictionaryEntry(k,v);
+			this.count=q.push(items[k]);
+			q.sort(sorter);
+		}
+	};
+	this.clear=function(){
+		//	summary
+		//	clear the internal collections
+		items={};
+		q=[];
+		this.count=q.length;
+	};
+	this.clone=function(){
+		//	summary
+		//	create a clone of this sorted list
+		return new dojo.collections.SortedList(this);	//	dojo.collections.SortedList
+	};
+	this.contains=this.containsKey=function(/* string */ k){
+		//	summary
+		//	Check to see if the list has a location k
+		if(testObject[k]){
+			return false;			//	bool
+		}
+		return (items[k]!=null);	//	bool
+	};
+	this.containsValue=function(/* object */ o){
+		//	summary
+		//	Check to see if this list contains the passed object
+		var e=this.getIterator();
+		while (!e.atEnd()){
+			var item=e.get();
+			if(item.value==o){ 
+				return true;	//	bool
+			}
+		}
+		return false;	//	bool
+	};
+	this.copyTo=function(/* array */ arr, /* int */ i){
+		//	summary
+		//	copy the contents of the list into array arr at index i
+		var e=this.getIterator();
+		var idx=i;
+		while(!e.atEnd()){
+			arr.splice(idx,0,e.get());
+			idx++;
+		}
+	};
+	this.entry=function(/* string */ k){
+		//	summary
+		//	return the object at location k
+		return items[k];	//	dojo.collections.DictionaryEntry
+	};
+	this.forEach=function(/* function */ fn, /* object? */ scope){
+		//	summary
+		//	functional iterator, following the mozilla spec.
+		var s=scope||dj_global;
+		if(Array.forEach){
+			Array.forEach(q, fn, s);
+		}else{
+			for(var i=0; i<q.length; i++){
+				fn.call(s, q[i], i, q);
+			}
+		}
+	};
+	this.getByIndex=function(/* int */ i){
+		//	summary
+		//	return the item at index i
+		return q[i].valueOf();	//	object
+	};
+	this.getIterator=function(){
+		//	summary
+		//	get an iterator for this object
+		return new dojo.collections.DictionaryIterator(items);	//	dojo.collections.DictionaryIterator
+	};
+	this.getKey=function(/* int */ i){
+		//	summary
+		//	return the key of the item at index i
+		return q[i].key;
+	};
+	this.getKeyList=function(){
+		//	summary
+		//	return an array of the keys set in this list
+		var arr=[];
+		var e=this.getIterator();
+		while (!e.atEnd()){
+			arr.push(e.get().key);
+		}
+		return arr;	//	array
+	};
+	this.getValueList=function(){
+		//	summary
+		//	return an array of values in this list
+		var arr=[];
+		var e=this.getIterator();
+		while (!e.atEnd()){
+			arr.push(e.get().value);
+		}
+		return arr;	//	array
+	};
+	this.indexOfKey=function(/* string */ k){
+		//	summary
+		//	return the index of the passed key.
+		for (var i=0; i<q.length; i++){
+			if (q[i].key==k){
+				return i;	//	int
+			}
+		}
+		return -1;	//	int
+	};
+	this.indexOfValue=function(/* object */ o){
+		//	summary
+		//	return the first index of object o
+		for (var i=0; i<q.length; i++){
+			if (q[i].value==o){
+				return i;	//	int
+			}
+		}
+		return -1;	//	int
+	};
+	this.item=function(/* string */ k){
+		// 	summary
+		//	return the value of the object at location k.
+		if(k in items && !testObject[k]){
+			return items[k].valueOf();	//	object
+		}
+		return undefined;	//	object
+	};
+	this.remove=function(/* string */k){
+		// 	summary
+		//	remove the item at location k and rebuild the internal collections.
+		delete items[k];
+		build();
+		this.count=q.length;
+	};
+	this.removeAt=function(/* int */ i){
+		//	summary
+		//	remove the item at index i, and rebuild the internal collections.
+		delete items[q[i].key];
+		build();
+		this.count=q.length;
+	};
+	this.replace=function(/* string */ k, /* object */ v){
+		//	summary
+		//	Replace an existing item if it's there, and add a new one if not.
+		if (!items[k]){
+			//	we're adding a new object, return false
+			this.add(k,v);
+			return false; // bool
+		}else{
+			//	we're replacing an object, return true
+			items[k]=new dojo.collections.DictionaryEntry(k,v);
+			q.sort(sorter);
+			return true; // bool
+		}
+	};
+	this.setByIndex=function(/* int */ i, /* object */ o){
+		//	summary
+		//	set an item by index
+		items[q[i].key].value=o;
+		build();
+		this.count=q.length;
+	};
+	if (dictionary){
+		var e=dictionary.getIterator();
+		while (!e.atEnd()){
+			var item=e.get();
+			q[q.length]=items[item.key]=new dojo.collections.DictionaryEntry(item.key,item.value);
+		}
+		q.sort(sorter);
+	}
+}

Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/SortedList.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Stack.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Stack.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Stack.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Stack.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,75 @@
+dojo.provide("dojo.collections.Stack");
+dojo.require("dojo.collections.Collections");
+
+dojo.collections.Stack=function(/* array? */arr){
+	//	summary
+	//	returns an object of type dojo.collections.Stack
+	var q=[];
+	if (arr) q=q.concat(arr);
+	this.count=q.length;
+	this.clear=function(){
+		//	summary
+		//	Clear the internal array and reset the count
+		q=[];
+		this.count=q.length;
+	};
+	this.clone=function(){
+		//	summary
+		//	Create and return a clone of this Stack
+		return new dojo.collections.Stack(q);
+	};
+	this.contains=function(/* object */o){
+		//	summary
+		//	check to see if the stack contains object o
+		for (var i=0; i<q.length; i++){
+			if (q[i] == o){
+				return true;	//	bool
+			}
+		}
+		return false;	//	bool
+	};
+	this.copyTo=function(/* array */ arr, /* int */ i){
+		//	summary
+		//	copy the stack into array arr at index i
+		arr.splice(i,0,q);
+	};
+	this.forEach=function(/* function */ fn, /* object? */ scope){
+		//	summary
+		//	functional iterator, following the mozilla spec.
+		var s=scope||dj_global;
+		if(Array.forEach){
+			Array.forEach(q, fn, s);
+		}else{
+			for(var i=0; i<q.length; i++){
+				fn.call(s, q[i], i, q);
+			}
+		}
+	};
+	this.getIterator=function(){
+		//	summary
+		//	get an iterator for this collection
+		return new dojo.collections.Iterator(q);	//	dojo.collections.Iterator
+	};
+	this.peek=function(){
+		//	summary
+		//	Return the next item without altering the stack itself.
+		return q[(q.length-1)];	//	object
+	};
+	this.pop=function(){
+		//	summary
+		//	pop and return the next item on the stack
+		var r=q.pop();
+		this.count=q.length;
+		return r;	//	object
+	};
+	this.push=function(/* object */ o){
+		//	summary
+		//	Push object o onto the stack
+		this.count=q.push(o);
+	};
+	this.toArray=function(){
+		//	summary
+		//	create and return an array based on the internal collection
+		return [].concat(q);	//	array
+	};
+}

Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Stack.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Store.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Store.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Store.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Store.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,269 @@
+dojo.provide("dojo.collections.Store");
+dojo.require("dojo.lang.common");
+
+/*	Store
+ *	Designed to be a simple store of data with access methods...
+ *	specifically to be mixed into other objects (such as widgets).
+ */
+dojo.collections.Store = function(/* array? */jsonArray){
+	//	summary
+	//	Data Store with accessor methods.
+	var data = [];
+	this.keyField = "Id";
+
+	this.get = function(){
+		//	summary
+		//	Get the internal data array, should not be used.
+		return data;	//	array
+	};
+	this.getByKey = function(/* string */key){
+		//	summary
+		//	Find the internal data object by key.
+		for(var i=0; i<data.length; i++){
+			if(data[i].key==key){
+				return data[i];	// object
+			}
+		}
+		return null;	// null
+	};
+	this.getByIndex = function(/*number*/idx){ 
+		//	summary
+		//	Get the internal data object by index.
+		return data[idx]; 	// object
+	};
+	
+	this.getData = function(){
+		//	summary
+		//	Get an array of source objects.
+		var arr = [];
+		for(var i=0; i<data.length; i++){
+			arr.push(data[i].src);
+		}
+		return arr;	//	array
+	};
+	this.getDataByKey = function(/*string*/key){
+		//	summary
+		//	Get the source object by key.
+		for(var i=0; i<data.length; i++){
+			if(data[i].key==key){
+				return data[i].src; //	object
+			}
+		}
+		return null;	//	null
+	};
+	this.getDataByIndex = function(/*number*/idx){ 
+		//	summary
+		//	Get the source object at index idx.
+		return data[idx].src; 	//	object
+	};
+
+	this.update = function(/* Object */obj, /* string */fieldPath, /* Object */val){
+		var parts=fieldPath.split("."), i=0, o=obj, field;
+		if(parts.length>1) {
+			field = parts.pop();
+			do{ 
+				if(parts[i].indexOf("()")>-1){
+					var temp=parts[i++].split("()")[0];
+					if(!o[temp]){
+						dojo.raise("dojo.collections.Store.getField(obj, '" + field + "'): '" + temp + "' is not a property of the passed object.");
+					} else {
+						//	this *will* throw an error if the method in question can't be invoked without arguments.
+						o = o[temp]();
+					}
+				} else {
+					o = o[parts[i++]];
+				}
+			} while (i<parts.length && o != null);
+		} else {
+			field = parts[0];
+		}
+
+		obj[field] = val;
+		this.onUpdateField(obj, fieldPath, val);
+	};
+
+	this.forEach = function(/* function */fn){
+		//	summary
+		//	Functional iteration directly on the internal data array.
+		if(Array.forEach){
+			Array.forEach(data, fn, this);
+		}else{
+			for(var i=0; i<data.length; i++){
+				fn.call(this, data[i]);
+			}
+		}
+	};
+	this.forEachData = function(/* function */fn){
+		//	summary
+		//	Functional iteration on source objects in internal data array.
+		if(Array.forEach){
+			Array.forEach(this.getData(), fn, this);
+		}else{
+			var a=this.getData();
+			for(var i=0; i<a.length; i++){
+				fn.call(this, a[i]);
+			}
+		}
+	};
+
+	this.setData = function(/*array*/arr){
+		//	summary
+		//	Set up the internal data.
+		data = []; 	//	don't fire onClearData
+		for(var i=0; i<arr.length; i++){
+			data.push({ 
+				key:arr[i][this.keyField], 
+				src:arr[i]
+			});
+		}
+		this.onSetData();
+	};
+	
+	this.clearData = function(){
+		//	summary
+		//	Clears the internal data array.
+		data = [];
+		this.onClearData();
+	};
+
+	this.addData = function(/*obj*/obj,/*string?*/key){ 
+		//	summary
+		//	Add an object with optional key to the internal data array.
+		var k = key || obj[this.keyField];
+		if(this.getByKey(k)){
+			var o = this.getByKey(k);
+			o.src = obj;
+		} else {
+			var o={ key:k, src:obj };
+			data.push(o);
+		}
+		this.onAddData(o);
+	};
+	this.addDataRange = function(/*array*/arr){
+		//	summary
+		//	Add a range of objects to the internal data array.
+		var objects=[];
+		for(var i=0; i<arr.length; i++){
+			var k = arr[i][this.keyField];
+			if(this.getByKey(k)){
+				var o = this.getByKey(k);
+				o.src = obj;
+			} else {
+				var o = { key:k, src:arr[i] };
+				data.push(o);
+			}
+			objects.push(o);
+		}
+		this.onAddDataRange(objects);
+	};
+	
+	this.removeData = function(/*obj*/obj){
+		//	summary
+		//	remove the passed object from the internal data array.
+		var idx=-1;
+		var o=null;
+		for(var i=0; i<data.length; i++){
+			if(data[i].src==obj){
+				idx=i;
+				o=data[i];
+				break;
+			}
+		}
+		this.onRemoveData(o);
+		if(idx>-1){
+			data.splice(idx,1);
+		}
+	};
+	this.removeDataByKey = function(/*string*/key){
+		//	summary
+		//	remove the object at key from the internal data array.
+		this.removeData(this.getDataByKey(key));
+	};
+	this.removeDataByIndex = function(/*number*/idx){
+		//	summary
+		//	remove the object at idx from the internal data array.
+		this.removeData(this.getDataByIndex(idx));
+	};
+
+	if(jsonArray && jsonArray.length && jsonArray[0]){
+		this.setData(jsonArray);
+	}
+};
+
+dojo.extend(dojo.collections.Store, {
+	getField:function(/*object*/obj, /*string*/field){
+		//	helper to get the nested value if needed.
+		var parts=field.split("."), i=0, o=obj;
+		do{ 
+			if(parts[i].indexOf("()")>-1){
+				var temp=parts[i++].split("()")[0];
+				if(!o[temp]){
+					dojo.raise("dojo.collections.Store.getField(obj, '" + field + "'): '" + temp + "' is not a property of the passed object.");
+				} else {
+					//	this *will* throw an error if the method in question can't be invoked without arguments.
+					o = o[temp]();
+				}
+			} else {
+				o = o[parts[i++]];
+			}
+		} while (i<parts.length && o != null);
+		
+		if(i < parts.length){
+			dojo.raise("dojo.collections.Store.getField(obj, '" + field + "'): '" + field + "' is not a property of the passed object.");
+		}
+		return o; // object
+	},
+	getFromHtml:function(/* array */meta, /* HTMLTableBody */body, /* function? */fnMod){
+		//	summary
+		//	Parse HTML data into native JSON structure for the store.
+		var rows = body.rows;
+
+		//	create a data constructor.
+		var ctor=function(row){
+			var obj = {};
+			for(var i=0; i<meta.length; i++){
+				var o = obj;
+				var data = row.cells[i].innerHTML;
+				var p = meta[i].getField();
+				if(p.indexOf(".") > -1){
+					p = p.split(".");
+					while(p.length>1){
+						var pr = p.shift();
+						o[pr] = {};
+						o = o[pr];
+					}
+					p = p[0];
+				}
+
+				var type = meta[i].getType();
+				if(type == String){
+					o[p] = data;
+				} else {
+					if(data){
+						o[p] = new type(data);
+					} else {
+						o[p] = new type();
+					}
+				}
+			}
+			return obj;
+		};
+
+		//	we have initialization data, let's parse it.
+		var arr=[];
+		for(var i=0; i<rows.length; i++){
+			var o = ctor(rows[i]);
+			if(fnMod){
+				fnMod(o, rows[i]);	//	apply any modifiers.
+			}
+			arr.push(o);
+		}
+		return arr;	//	array
+	},
+	onSetData:function(){ },
+	onClearData:function(){ },
+	onAddData:function(obj){ },
+	onAddDataRange:function(arr){ },
+	onRemoveData:function(obj){ },
+	onUpdateField:function(obj, field, val){ }
+});

Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/Store.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/__package__.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/__package__.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/__package__.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/__package__.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,12 @@
+dojo.kwCompoundRequire({
+	common: [
+		"dojo.collections.Collections",
+		"dojo.collections.SortedList", 
+		"dojo.collections.Dictionary", 
+		"dojo.collections.Queue", 
+		"dojo.collections.ArrayList", 
+		"dojo.collections.Stack",
+		"dojo.collections.Set"
+	]
+});
+dojo.provide("dojo.collections.*");

Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/collections/__package__.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/crypto.js
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/crypto.js?view=auto&rev=473755
==============================================================================
--- jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/crypto.js (added)
+++ jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/crypto.js Sat Nov 11 08:44:22 2006
@@ -0,0 +1,21 @@
+dojo.provide("dojo.crypto");
+
+dojo.crypto.cipherModes={ 
+	//	summary
+	//	Enumeration for various cipher modes.
+	ECB:0, 
+	CBC:1, 
+	PCBC:2, 
+	CFB:3, 
+	OFB:4, 
+	CTR:5 
+};
+
+dojo.crypto.outputTypes={ 
+	//	summary
+	//	Enumeration for input and output encodings.
+	Base64:0,
+	Hex:1,
+	String:2,
+	Raw:3 
+};

Propchange: jackrabbit/trunk/contrib/jcr-browser/src/main/webapp/dojo/src/crypto.js
------------------------------------------------------------------------------
    svn:eol-style = native