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