You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by jk...@apache.org on 2006/02/01 06:41:23 UTC

svn commit: r373998 [12/23] - in /jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo: ./ src/ src/alg/ src/animation/ src/collections/ src/crypto/ src/data/ src/dnd/ src/event/ src/flash/ src/flash/flash6/ src/flash/flash8/ src/fx/...

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/storage/browser.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/storage/browser.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/storage/browser.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/storage/browser.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,102 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.storage.browser");
+dojo.require("dojo.storage");
+dojo.require("dojo.uri.*");
+
+dojo.storage.browser.StorageProvider = function(){
+	this.initialized = false;
+	this.flash = null;
+	this.backlog = [];
+}
+
+dojo.inherits(	dojo.storage.browser.StorageProvider, 
+				dojo.storage.StorageProvider);
+
+dojo.lang.extend(dojo.storage.browser.StorageProvider, {
+	storageOnLoad: function(){
+		this.initialized = true;
+		this.hideStore();
+		while(this.backlog.length){
+			this.set.apply(this, this.backlog.shift());
+		}
+	},
+
+	unHideStore: function(){
+		var container = dojo.byId("dojo-storeContainer");
+		with(container.style){
+			position = "absolute";
+			overflow = "visible";
+			width = "215px";
+			height = "138px";
+			// FIXME: make these positions dependent on screen size/scrolling!
+			left = "30px"; 
+			top = "30px";
+			visiblity = "visible";
+			zIndex = "20";
+			border = "1px solid black";
+		}
+	},
+
+	hideStore: function(status){
+		var container = dojo.byId("dojo-storeContainer");
+		with(container.style){
+			left = "-300px";
+			top = "-300px";
+		}
+	},
+
+	set: function(key, value, ns){
+		if(!this.initialized){
+			this.backlog.push([key, value, ns]);
+			return "pending";
+		}
+		return this.flash.set(key, value, ns||this.namespace);
+	},
+
+	get: function(key, ns){
+		return this.flash.get(key, ns||this.namespace);
+	},
+
+	writeStorage: function(){
+		var swfloc = dojo.uri.dojoUri("src/storage/Storage.swf").toString();
+		// alert(swfloc);
+		var storeParts = [
+			'<div id="dojo-storeContainer"',
+				'style="position: absolute; left: -300px; top: -300px;">'];
+		if(dojo.render.html.ie){
+			storeParts.push('<object');
+			storeParts.push('	style="border: 1px solid black;"');
+			storeParts.push('	classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"');
+			storeParts.push('	codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"');
+			storeParts.push('	width="215" height="138" id="dojoStorage">');
+			storeParts.push('	<param name="movie" value="'+swfloc+'">');
+			storeParts.push('	<param name="quality" value="high">');
+			storeParts.push('</object>');
+		}else{
+			storeParts.push('<embed src="'+swfloc+'" width="215" height="138" ');
+			storeParts.push('	quality="high" ');
+			storeParts.push('	pluginspage="http://www.macromedia.com/go/getflashplayer" ');
+			storeParts.push('	type="application/x-shockwave-flash" ');
+			storeParts.push('	name="dojoStorage">');
+			storeParts.push('</embed>');
+		}
+		storeParts.push('</div>');
+		document.write(storeParts.join(""));
+	}
+});
+
+dojo.storage.setProvider(new dojo.storage.browser.StorageProvider());
+dojo.storage.provider.writeStorage();
+
+dojo.addOnLoad(function(){
+	dojo.storage.provider.flash = (dojo.render.html.ie) ? window["dojoStorage"] : document["dojoStorage"];
+});

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/storage/dashboard.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/storage/dashboard.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/storage/dashboard.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/storage/dashboard.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,52 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.require("dojo.storage");
+dojo.require("dojo.json");
+dojo.provide("dojo.storage.dashboard");
+
+dojo.storage.dashboard.StorageProvider = function(){
+	this.initialized = false;
+}
+
+dojo.inherits(dojo.storage.dashboard.StorageProvider, dojo.storage.StorageProvider);
+
+dojo.lang.extend(dojo.storage.dashboard.StorageProvider, {
+	storageOnLoad: function(){
+		this.initialized = true;
+	},
+
+	set: function(key, value, ns){
+		if (ns && widget.system){
+			widget.system("/bin/mkdir " + ns);
+			var system = widget.system("/bin/echo " + value + " >" + ns + "/" + key);
+			if(system.errorString){
+				return false;
+			}
+			return true;
+		}
+
+		return widget.setPreferenceForKey(dojo.json.serialize(value), key);
+	},
+
+	get: function(key, ns){
+		if (ns && widget.system) {
+			var system = widget.system("/bin/cat " + ns + "/" + key);
+			if(system.errorString){
+				return "";
+			}
+			return system.outputString;
+		}
+
+		return dojo.json.evalJSON(widget.preferenceForKey(key));
+	}
+});
+
+dojo.storage.setProvider(new dojo.storage.dashboard.StorageProvider());
\ No newline at end of file

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/storage/storage.sh
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/storage/storage.sh?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/storage/storage.sh (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/storage/storage.sh Tue Jan 31 21:39:49 2006
@@ -0,0 +1,3 @@
+#! /bin/bash
+
+mtasc -version 8 -swf Storage.swf -main -header 215:138:10 Storage.as 

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,12 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.string");
+dojo.require("dojo.string.common");

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/Builder.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/Builder.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/Builder.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/Builder.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,105 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.string.Builder");
+dojo.require("dojo.string");
+
+// NOTE: testing shows that direct "+=" concatenation is *much* faster on
+// Spidermoneky and Rhino, while arr.push()/arr.join() style concatenation is
+// significantly quicker on IE (Jscript/wsh/etc.).
+
+dojo.string.Builder = function(str){
+	this.arrConcat = (dojo.render.html.capable && dojo.render.html["ie"]);
+
+	var a = [];
+	var b = str || "";
+	var length = this.length = b.length;
+
+	if(this.arrConcat){
+		if(b.length > 0){
+			a.push(b);
+		}
+		b = "";
+	}
+
+	this.toString = this.valueOf = function(){ 
+		return (this.arrConcat) ? a.join("") : b;
+	};
+
+	this.append = function(s){
+		if(this.arrConcat){
+			a.push(s);
+		}else{
+			b+=s;
+		}
+		length += s.length;
+		this.length = length;
+		return this;
+	};
+
+	this.clear = function(){
+		a = [];
+		b = "";
+		length = this.length = 0;
+		return this;
+	};
+
+	this.remove = function(f,l){
+		var s = ""; 
+		if(this.arrConcat){
+			b = a.join(""); 
+		}
+		a=[];
+		if(f>0){
+			s = b.substring(0, (f-1));
+		}
+		b = s + b.substring(f + l); 
+		length = this.length = b.length; 
+		if(this.arrConcat){
+			a.push(b);
+			b="";
+		}
+		return this;
+	};
+
+	this.replace = function(o,n){
+		if(this.arrConcat){
+			b = a.join(""); 
+		}
+		a = []; 
+		b = b.replace(o,n); 
+		length = this.length = b.length; 
+		if(this.arrConcat){
+			a.push(b);
+			b="";
+		}
+		return this;
+	};
+
+	this.insert = function(idx,s){
+		if(this.arrConcat){
+			b = a.join(""); 
+		}
+		a=[];
+		if(idx == 0){
+			b = s + b;
+		}else{
+			var t = b.split("");
+			t.splice(idx,0,s);
+			b = t.join("")
+		}
+		length = this.length = b.length; 
+		if(this.arrConcat){
+			a.push(b); 
+			b="";
+		}
+		return this;
+	};
+};

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/__package__.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/__package__.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/__package__.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/__package__.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,19 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.hostenv.conditionalLoadModule({
+	common: [
+		"dojo.string",
+		"dojo.string.common",
+		"dojo.string.extras",
+		"dojo.string.Builder"
+	]
+});
+dojo.hostenv.moduleLoaded("dojo.string.*");

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/common.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/common.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/common.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/common.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,87 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.string.common");
+
+dojo.require("dojo.string");
+
+/**
+ * Trim whitespace from 'str'. If 'wh' > 0,
+ * only trim from start, if 'wh' < 0, only trim
+ * from end, otherwise trim both ends
+ */
+dojo.string.trim = function(str, wh){
+	if(!str.replace){ return str; }
+	if(!str.length){ return str; }
+	var re = (wh > 0) ? (/^\s+/) : (wh < 0) ? (/\s+$/) : (/^\s+|\s+$/g);
+	return str.replace(re, "");
+}
+
+/**
+ * Trim whitespace at the beginning of 'str'
+ */
+dojo.string.trimStart = function(str) {
+	return dojo.string.trim(str, 1);
+}
+
+/**
+ * Trim whitespace at the end of 'str'
+ */
+dojo.string.trimEnd = function(str) {
+	return dojo.string.trim(str, -1);
+}
+
+/**
+ * Return 'str' repeated 'count' times, optionally
+ * placing 'separator' between each rep
+ */
+dojo.string.repeat = function(str, count, separator) {
+	var out = "";
+	for(var i = 0; i < count; i++) {
+		out += str;
+		if(separator && i < count - 1) {
+			out += separator;
+		}
+	}
+	return out;
+}
+
+/**
+ * Pad 'str' to guarantee that it is at least 'len' length
+ * with the character 'c' at either the start (dir=1) or
+ * end (dir=-1) of the string
+ */
+dojo.string.pad = function(str, len/*=2*/, c/*='0'*/, dir/*=1*/) {
+	var out = String(str);
+	if(!c) {
+		c = '0';
+	}
+	if(!dir) {
+		dir = 1;
+	}
+	while(out.length < len) {
+		if(dir > 0) {
+			out = c + out;
+		} else {
+			out += c;
+		}
+	}
+	return out;
+}
+
+/** same as dojo.string.pad(str, len, c, 1) */
+dojo.string.padLeft = function(str, len, c) {
+	return dojo.string.pad(str, len, c, 1);
+}
+
+/** same as dojo.string.pad(str, len, c, -1) */
+dojo.string.padRight = function(str, len, c) {
+	return dojo.string.pad(str, len, c, -1);
+}

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/extras.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/extras.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/extras.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/string/extras.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,208 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.string.extras");
+
+dojo.require("dojo.string.common");
+dojo.require("dojo.lang");
+
+/**
+ * Parameterized string function
+ * str - formatted string with %{values} to be replaces
+ * pairs - object of name: "value" value pairs
+ * killExtra - remove all remaining %{values} after pairs are inserted
+ */
+dojo.string.paramString = function(str, pairs, killExtra) {
+	for(var name in pairs) {
+		var re = new RegExp("\\%\\{" + name + "\\}", "g");
+		str = str.replace(re, pairs[name]);
+	}
+
+	if(killExtra) { str = str.replace(/%\{([^\}\s]+)\}/g, ""); }
+	return str;
+}
+
+/** Uppercases the first letter of each word */
+dojo.string.capitalize = function (str) {
+	if (!dojo.lang.isString(str)) { return ""; }
+	if (arguments.length == 0) { str = this; }
+	var words = str.split(' ');
+	var retval = "";
+	var len = words.length;
+	for (var i=0; i<len; i++) {
+		var word = words[i];
+		word = word.charAt(0).toUpperCase() + word.substring(1, word.length);
+		retval += word;
+		if (i < len-1)
+			retval += " ";
+	}
+	
+	return new String(retval);
+}
+
+/**
+ * Return true if the entire string is whitespace characters
+ */
+dojo.string.isBlank = function (str) {
+	if(!dojo.lang.isString(str)) { return true; }
+	return (dojo.string.trim(str).length == 0);
+}
+
+dojo.string.encodeAscii = function(str) {
+	if(!dojo.lang.isString(str)) { return str; }
+	var ret = "";
+	var value = escape(str);
+	var match, re = /%u([0-9A-F]{4})/i;
+	while((match = value.match(re))) {
+		var num = Number("0x"+match[1]);
+		var newVal = escape("&#" + num + ";");
+		ret += value.substring(0, match.index) + newVal;
+		value = value.substring(match.index+match[0].length);
+	}
+	ret += value.replace(/\+/g, "%2B");
+	return ret;
+}
+
+dojo.string.escape = function(type, str) {
+	var args = [];
+	for(var i = 1; i < arguments.length; i++) { args.push(arguments[i]); }
+	switch(type.toLowerCase()) {
+		case "xml":
+		case "html":
+		case "xhtml":
+			return dojo.string.escapeXml.apply(this, args);
+		case "sql":
+			return dojo.string.escapeSql.apply(this, args);
+		case "regexp":
+		case "regex":
+			return dojo.string.escapeRegExp.apply(this, args);
+		case "javascript":
+		case "jscript":
+		case "js":
+			return dojo.string.escapeJavaScript.apply(this, args);
+		case "ascii":
+			// so it's encode, but it seems useful
+			return dojo.string.encodeAscii.apply(this, args);
+		default:
+			return str;
+	}
+}
+
+dojo.string.escapeXml = function(str, noSingleQuotes) {
+	str = str.replace(/&/gm, "&amp;").replace(/</gm, "&lt;")
+		.replace(/>/gm, "&gt;").replace(/"/gm, "&quot;");
+	if(!noSingleQuotes) { str = str.replace(/'/gm, "&#39;"); }
+	return str;
+}
+
+dojo.string.escapeSql = function(str) {
+	return str.replace(/'/gm, "''");
+}
+
+dojo.string.escapeRegExp = function(str) {
+	return str.replace(/\\/gm, "\\\\").replace(/([\f\b\n\t\r])/gm, "\\$1");
+}
+
+dojo.string.escapeJavaScript = function(str) {
+	return str.replace(/(["'\f\b\n\t\r])/gm, "\\$1");
+}
+// TODO: make an HTML version
+dojo.string.summary = function(str, len) {
+	if(!len || str.length <= len) {
+		return str;
+	} else {
+		return str.substring(0, len).replace(/\.+$/, "") + "...";
+	}
+}
+
+/**
+ * Returns true if 'str' ends with 'end'
+ */
+dojo.string.endsWith = function(str, end, ignoreCase) {
+	if(ignoreCase) {
+		str = str.toLowerCase();
+		end = end.toLowerCase();
+	}
+	return str.lastIndexOf(end) == str.length - end.length;
+}
+
+/**
+ * Returns true if 'str' ends with any of the arguments[2 -> n]
+ */
+dojo.string.endsWithAny = function(str /* , ... */) {
+	for(var i = 1; i < arguments.length; i++) {
+		if(dojo.string.endsWith(str, arguments[i])) {
+			return true;
+		}
+	}
+	return false;
+}
+
+/**
+ * Returns true if 'str' starts with 'start'
+ */
+dojo.string.startsWith = function(str, start, ignoreCase) {
+	if(ignoreCase) {
+		str = str.toLowerCase();
+		start = start.toLowerCase();
+	}
+	return str.indexOf(start) == 0;
+}
+
+/**
+ * Returns true if 'str' starts with any of the arguments[2 -> n]
+ */
+dojo.string.startsWithAny = function(str /* , ... */) {
+	for(var i = 1; i < arguments.length; i++) {
+		if(dojo.string.startsWith(str, arguments[i])) {
+			return true;
+		}
+	}
+	return false;
+}
+
+/**
+ * Returns true if 'str' starts with any of the arguments 2 -> n
+ */
+dojo.string.has = function(str /* , ... */) {
+	for(var i = 1; i < arguments.length; i++) {
+		if(str.indexOf(arguments[i] > -1)) {
+			return true;
+		}
+	}
+	return false;
+}
+
+dojo.string.normalizeNewlines = function (text,newlineChar) {
+	if (newlineChar == "\n") {
+		text = text.replace(/\r\n/g, "\n");
+		text = text.replace(/\r/g, "\n");
+	} else if (newlineChar == "\r") {
+		text = text.replace(/\r\n/g, "\r");
+		text = text.replace(/\n/g, "\r");
+	} else {
+		text = text.replace(/([^\r])\n/g, "$1\r\n");
+		text = text.replace(/\r([^\n])/g, "\r\n$1");
+	}
+	return text;
+}
+
+dojo.string.splitEscaped = function (str,charac) {
+	var components = [];
+	for (var i = 0, prevcomma = 0; i < str.length; i++) {
+		if (str.charAt(i) == '\\') { i++; continue; }
+		if (str.charAt(i) == charac) {
+			components.push(str.substring(prevcomma, i));
+			prevcomma = i + 1;
+		}
+	}
+	components.push(str.substr(prevcomma));
+	return components;
+}

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/style.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/style.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/style.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/style.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,585 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.style");
+dojo.require("dojo.graphics.color");
+
+// values: content-box, border-box
+dojo.style.boxSizing = {
+	marginBox: "margin-box",
+	borderBox: "border-box",
+	paddingBox: "padding-box",
+	contentBox: "content-box"
+};
+
+dojo.style.getBoxSizing = function(node) {
+	node = dojo.byId(node);
+	if (dojo.render.html.ie || dojo.render.html.opera){ 
+		var cm = document["compatMode"];
+		if (cm == "BackCompat" || cm == "QuirksMode"){ 
+			return dojo.style.boxSizing.borderBox; 
+		}else{
+			return dojo.style.boxSizing.contentBox; 
+		}
+	}else{
+		if(arguments.length == 0){ node = document.documentElement; }
+		var sizing = dojo.style.getStyle(node, "-moz-box-sizing");
+		if(!sizing){ sizing = dojo.style.getStyle(node, "box-sizing"); }
+		return (sizing ? sizing : dojo.style.boxSizing.contentBox);
+	}
+}
+
+/*
+
+The following several function use the dimensions shown below
+
+    +-------------------------+
+    |  margin                 |
+    | +---------------------+ |
+    | |  border             | |
+    | | +-----------------+ | |
+    | | |  padding        | | |
+    | | | +-------------+ | | |
+    | | | |   content   | | | |
+    | | | +-------------+ | | |
+    | | +-|-------------|-+ | |
+    | +-|-|-------------|-|-+ |
+    +-|-|-|-------------|-|-|-+
+    | | | |             | | | |
+    | | | |<- content ->| | | |
+    | |<------ inner ------>| |
+    |<-------- outer -------->|
+    +-------------------------+
+
+    * content-box
+
+    |m|b|p|             |p|b|m|
+    | |<------ offset ----->| |
+    | | |<---- client --->| | |
+    | | | |<-- width -->| | | |
+
+    * border-box
+
+    |m|b|p|             |p|b|m|
+    | |<------ offset ----->| |
+    | | |<---- client --->| | |
+    | |<------ width ------>| |
+*/
+
+/*
+	Notes:
+
+	General:
+		- Uncomputable values are returned as NaN.
+		- setOuterWidth/Height return *false* if the outer size could not be computed, otherwise *true*.
+		- I (sjmiles) know no way to find the calculated values for auto-margins. 
+		- All returned values are floating point in 'px' units. If a non-zero computed style value is not specified in 'px', NaN is returned.
+
+	FF:
+		- styles specified as '0' (unitless 0) show computed as '0pt'.
+
+	IE:
+		- clientWidth/Height are unreliable (0 unless the object has 'layout').
+		- margins must be specified in px, or 0 (in any unit) for any sizing function to work. Otherwise margins detect as 'auto'.
+		- padding can be empty or, if specified, must be in px, or 0 (in any unit) for any sizing function to work.
+
+	Safari:
+		- Safari defaults padding values to 'auto'.
+
+	See the unit tests for examples of (un)computable values in a given browser.
+
+*/
+
+// FIXME: these work for most elements (e.g. DIV) but not all (e.g. TEXTAREA)
+
+dojo.style.isBorderBox = function(node) {
+	return (dojo.style.getBoxSizing(node) == dojo.style.boxSizing.borderBox);
+}
+
+dojo.style.getUnitValue = function (node, cssSelector, autoIsZero){
+	node = dojo.byId(node);
+	var result = { value: 0, units: 'px' };
+	var s = dojo.style.getComputedStyle(node, cssSelector);
+	if (s == '' || (s == 'auto' && autoIsZero)){ return result; }
+	if (dojo.lang.isUndefined(s)){ 
+		result.value = NaN;
+	}else{
+		// FIXME: is regex inefficient vs. parseInt or some manual test? 
+		var match = s.match(/(\-?[\d.]+)([a-z%]*)/i);
+		if (!match){
+			result.value = NaN;
+		}else{
+			result.value = Number(match[1]);
+			result.units = match[2].toLowerCase();
+		}
+	}
+	return result;		
+}
+
+dojo.style.getPixelValue = function (node, cssSelector, autoIsZero){
+	node = dojo.byId(node);
+	var result = dojo.style.getUnitValue(node, cssSelector, autoIsZero);
+	// FIXME: there is serious debate as to whether or not this is the right solution
+	if(isNaN(result.value)){ return 0; }
+	// FIXME: code exists for converting other units to px (see Dean Edward's IE7) 
+	// but there are cross-browser complexities
+	if((result.value)&&(result.units != 'px')){ return NaN; }
+	return result.value;
+}
+
+dojo.style.getNumericStyle = dojo.style.getPixelValue; // backward compat
+
+dojo.style.isPositionAbsolute = function(node){
+	node = dojo.byId(node);
+	return (dojo.style.getComputedStyle(node, 'position') == 'absolute');
+}
+
+dojo.style.getMarginWidth = function(node){
+	node = dojo.byId(node);
+	var autoIsZero = dojo.style.isPositionAbsolute(node);
+	var left = dojo.style.getPixelValue(node, "margin-left", autoIsZero);
+	var right = dojo.style.getPixelValue(node, "margin-right", autoIsZero);
+	return left + right;
+}
+
+dojo.style.getBorderWidth = function(node){
+	node = dojo.byId(node);
+	var left = (dojo.style.getStyle(node, 'border-left-style') == 'none' ? 0 : dojo.style.getPixelValue(node, "border-left-width"));
+	var right = (dojo.style.getStyle(node, 'border-right-style') == 'none' ? 0 : dojo.style.getPixelValue(node, "border-right-width"));
+	return left + right;
+}
+
+dojo.style.getPaddingWidth = function(node){
+	node = dojo.byId(node);
+	var left = dojo.style.getPixelValue(node, "padding-left", true);
+	var right = dojo.style.getPixelValue(node, "padding-right", true);
+	return left + right;
+}
+
+dojo.style.getContentWidth = function (node){
+	node = dojo.byId(node);
+	return node.offsetWidth - dojo.style.getPaddingWidth(node) - dojo.style.getBorderWidth(node);
+}
+
+dojo.style.getInnerWidth = function (node){
+	node = dojo.byId(node);
+	return node.offsetWidth;
+}
+
+dojo.style.getOuterWidth = function (node){
+	node = dojo.byId(node);
+	return dojo.style.getInnerWidth(node) + dojo.style.getMarginWidth(node);
+}
+
+dojo.style.setOuterWidth = function (node, pxWidth){
+	node = dojo.byId(node);
+	if (!dojo.style.isBorderBox(node)){
+		pxWidth -= dojo.style.getPaddingWidth(node) + dojo.style.getBorderWidth(node);
+	}
+	pxWidth -= dojo.style.getMarginWidth(node);
+	if (!isNaN(pxWidth) && pxWidth > 0){
+		node.style.width = pxWidth + 'px';
+		return true;
+	}else return false;
+}
+
+// FIXME: these aliases are actually the preferred names
+dojo.style.getContentBoxWidth = dojo.style.getContentWidth;
+dojo.style.getBorderBoxWidth = dojo.style.getInnerWidth;
+dojo.style.getMarginBoxWidth = dojo.style.getOuterWidth;
+dojo.style.setMarginBoxWidth = dojo.style.setOuterWidth;
+
+dojo.style.getMarginHeight = function(node){
+	node = dojo.byId(node);
+	var autoIsZero = dojo.style.isPositionAbsolute(node);
+	var top = dojo.style.getPixelValue(node, "margin-top", autoIsZero);
+	var bottom = dojo.style.getPixelValue(node, "margin-bottom", autoIsZero);
+	return top + bottom;
+}
+
+dojo.style.getBorderHeight = function(node){
+	node = dojo.byId(node);
+	var top = (dojo.style.getStyle(node, 'border-top-style') == 'none' ? 0 : dojo.style.getPixelValue(node, "border-top-width"));
+	var bottom = (dojo.style.getStyle(node, 'border-bottom-style') == 'none' ? 0 : dojo.style.getPixelValue(node, "border-bottom-width"));
+	return top + bottom;
+}
+
+dojo.style.getPaddingHeight = function(node){
+	node = dojo.byId(node);
+	var top = dojo.style.getPixelValue(node, "padding-top", true);
+	var bottom = dojo.style.getPixelValue(node, "padding-bottom", true);
+	return top + bottom;
+}
+
+dojo.style.getContentHeight = function (node){
+	node = dojo.byId(node);
+	return node.offsetHeight - dojo.style.getPaddingHeight(node) - dojo.style.getBorderHeight(node);
+}
+
+dojo.style.getInnerHeight = function (node){
+	node = dojo.byId(node);
+	return node.offsetHeight; // FIXME: does this work?
+}
+
+dojo.style.getOuterHeight = function (node){
+	node = dojo.byId(node);
+	return dojo.style.getInnerHeight(node) + dojo.style.getMarginHeight(node);
+}
+
+dojo.style.setOuterHeight = function (node, pxHeight){
+	node = dojo.byId(node);
+	if (!dojo.style.isBorderBox(node)){
+		pxHeight -= dojo.style.getPaddingHeight(node) + dojo.style.getBorderHeight(node);
+	}
+	pxHeight -= dojo.style.getMarginHeight(node);
+	if (!isNaN(pxHeight) && pxHeight > 0){
+		node.style.height = pxHeight + 'px';
+		return true;
+	}else return false;
+}
+
+dojo.style.setContentWidth = function(node, pxWidth){
+	node = dojo.byId(node);
+	if (dojo.style.isBorderBox(node)){
+		pxWidth += dojo.style.getPaddingWidth(node) + dojo.style.getBorderWidth(node);
+	}
+
+	if (!isNaN(pxWidth) && pxWidth > 0){
+		node.style.width = pxWidth + 'px';
+		return true;
+	}else return false;
+}
+
+dojo.style.setContentHeight = function(node, pxHeight){
+	node = dojo.byId(node);
+	if (dojo.style.isBorderBox(node)){
+		pxHeight += dojo.style.getPaddingHeight(node) + dojo.style.getBorderHeight(node);
+	}
+
+	if (!isNaN(pxHeight) && pxHeight > 0){
+		node.style.height = pxHeight + 'px';
+		return true;
+	}else return false;
+}
+
+// FIXME: these aliases are actually the preferred names
+dojo.style.getContentBoxHeight = dojo.style.getContentHeight;
+dojo.style.getBorderBoxHeight = dojo.style.getInnerHeight;
+dojo.style.getMarginBoxHeight = dojo.style.getOuterHeight;
+dojo.style.setMarginBoxHeight = dojo.style.setOuterHeight;
+
+dojo.style.getTotalOffset = function (node, type, includeScroll){
+	node = dojo.byId(node);
+	var typeStr = (type=="top") ? "offsetTop" : "offsetLeft";
+	var typeScroll = (type=="top") ? "scrollTop" : "scrollLeft";
+	
+	var coord = (type=="top") ? "y" : "x";
+	var offset = 0;
+	if(node["offsetParent"]){
+		
+		// in Safari, if the node is an absolutly positioned child of the body
+		// and the body has a margin the offset of the child and the body
+		// contain the body's margins, so we need to end at the body
+		if (dojo.render.html.safari
+			&& node.style.getPropertyValue("position") == "absolute"
+			&& node.parentNode == document.body)
+		{
+			var endNode = document.body;
+		} else {
+			var endNode = document.body.parentNode;
+		}
+		
+		if(includeScroll && node.parentNode != document.body) {
+			offset -= dojo.style.sumAncestorProperties(node, typeScroll);
+		}
+		// FIXME: this is known not to work sometimes on IE 5.x since nodes
+		// soemtimes need to be "tickled" before they will display their
+		// offset correctly
+		do {
+			var n = node[typeStr];
+			offset += isNaN(n) ? 0 : n;
+			node = node.offsetParent;
+		} while (node != endNode && node != null);
+	}else if(node[coord]){
+		var n = node[coord];
+		offset += isNaN(n) ? 0 : n;
+	}
+	return offset;
+}
+
+dojo.style.sumAncestorProperties = function (node, prop) {
+	node = dojo.byId(node);
+	if (!node) { return 0; } // FIXME: throw an error?
+	
+	var retVal = 0;
+	while (node) {
+		var val = node[prop];
+		if (val) {
+			retVal += val - 0;
+		}
+		node = node.parentNode;
+	}
+	return retVal;
+}
+
+dojo.style.totalOffsetLeft = function (node, includeScroll){
+	node = dojo.byId(node);
+	return dojo.style.getTotalOffset(node, "left", includeScroll);
+}
+
+dojo.style.getAbsoluteX = dojo.style.totalOffsetLeft;
+
+dojo.style.totalOffsetTop = function (node, includeScroll){
+	node = dojo.byId(node);
+	return dojo.style.getTotalOffset(node, "top", includeScroll);
+}
+
+dojo.style.getAbsoluteY = dojo.style.totalOffsetTop;
+
+dojo.style.getAbsolutePosition = function(node, includeScroll) {
+	node = dojo.byId(node);
+	var position = [
+		dojo.style.getAbsoluteX(node, includeScroll),
+		dojo.style.getAbsoluteY(node, includeScroll)
+	];
+	position.x = position[0];
+	position.y = position[1];
+	return position;
+}
+
+dojo.style.styleSheet = null;
+
+// FIXME: this is a really basic stub for adding and removing cssRules, but
+// it assumes that you know the index of the cssRule that you want to add 
+// or remove, making it less than useful.  So we need something that can 
+// search for the selector that you you want to remove.
+dojo.style.insertCssRule = function (selector, declaration, index) {
+	if (!dojo.style.styleSheet) {
+		if (document.createStyleSheet) { // IE
+			dojo.style.styleSheet = document.createStyleSheet();
+		} else if (document.styleSheets[0]) { // rest
+			// FIXME: should create a new style sheet here
+			// fall back on an exsiting style sheet
+			dojo.style.styleSheet = document.styleSheets[0];
+		} else { return null; } // fail
+	}
+
+	if (arguments.length < 3) { // index may == 0
+		if (dojo.style.styleSheet.cssRules) { // W3
+			index = dojo.style.styleSheet.cssRules.length;
+		} else if (dojo.style.styleSheet.rules) { // IE
+			index = dojo.style.styleSheet.rules.length;
+		} else { return null; } // fail
+	}
+
+	if (dojo.style.styleSheet.insertRule) { // W3
+		var rule = selector + " { " + declaration + " }";
+		return dojo.style.styleSheet.insertRule(rule, index);
+	} else if (dojo.style.styleSheet.addRule) { // IE
+		return dojo.style.styleSheet.addRule(selector, declaration, index);
+	} else { return null; } // fail
+}
+
+dojo.style.removeCssRule = function (index){
+	if(!dojo.style.styleSheet){
+		dojo.debug("no stylesheet defined for removing rules");
+		return false;
+	}
+	if(dojo.render.html.ie){
+		if(!index){
+			index = dojo.style.styleSheet.rules.length;
+			dojo.style.styleSheet.removeRule(index);
+		}
+	}else if(document.styleSheets[0]){
+		if(!index){
+			index = dojo.style.styleSheet.cssRules.length;
+		}
+		dojo.style.styleSheet.deleteRule(index);
+	}
+	return true;
+}
+
+dojo.style.getBackgroundColor = function (node) {
+	node = dojo.byId(node);
+	var color;
+	do{
+		color = dojo.style.getStyle(node, "background-color");
+		// Safari doesn't say "transparent"
+		if(color.toLowerCase() == "rgba(0, 0, 0, 0)") { color = "transparent"; }
+		if(node == document.getElementsByTagName("body")[0]) { node = null; break; }
+		node = node.parentNode;
+	}while(node && dojo.lang.inArray(color, ["transparent", ""]));
+
+	if( color == "transparent" ) {
+		color = [255, 255, 255, 0];
+	} else {
+		color = dojo.graphics.color.extractRGB(color);
+	}
+	return color;
+}
+
+dojo.style.getComputedStyle = function (node, cssSelector, inValue) {
+	node = dojo.byId(node);
+	var value = inValue;
+	if (node.style.getPropertyValue) { // W3
+		value = node.style.getPropertyValue(cssSelector);
+	}
+	if(!value) {
+		if (document.defaultView) { // gecko
+			var cs = document.defaultView.getComputedStyle(node, "");
+			if (cs) { 
+				value = cs.getPropertyValue(cssSelector);
+			} 
+		} else if (node.currentStyle) { // IE
+			value = node.currentStyle[dojo.style.toCamelCase(cssSelector)];
+		} 
+	}
+	
+	return value;
+}
+
+dojo.style.getStyle = function (node, cssSelector) {
+	node = dojo.byId(node);
+	var camelCased = dojo.style.toCamelCase(cssSelector);
+	var value = node.style[camelCased]; // dom-ish
+	return (value ? value : dojo.style.getComputedStyle(node, cssSelector, value));
+}
+
+dojo.style.toCamelCase = function (selector) {
+	var arr = selector.split('-'), cc = arr[0];
+	for(var i = 1; i < arr.length; i++) {
+		cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1);
+	}
+	return cc;		
+}
+
+dojo.style.toSelectorCase = function (selector) {
+	return selector.replace(/([A-Z])/g, "-$1" ).toLowerCase() ;
+}
+
+/* float between 0.0 (transparent) and 1.0 (opaque) */
+dojo.style.setOpacity = function setOpacity (node, opacity, dontFixOpacity) {
+	node = dojo.byId(node);
+	var h = dojo.render.html;
+	if(!dontFixOpacity){
+		if( opacity >= 1.0){
+			if(h.ie){
+				dojo.style.clearOpacity(node);
+				return;
+			}else{
+				opacity = 0.999999;
+			}
+		}else if( opacity < 0.0){ opacity = 0; }
+	}
+	if(h.ie){
+		if(node.nodeName.toLowerCase() == "tr"){
+			// FIXME: is this too naive? will we get more than we want?
+			var tds = node.getElementsByTagName("td");
+			for(var x=0; x<tds.length; x++){
+				tds[x].style.filter = "Alpha(Opacity="+opacity*100+")";
+			}
+		}
+		node.style.filter = "Alpha(Opacity="+opacity*100+")";
+	}else if(h.moz){
+		node.style.opacity = opacity; // ffox 1.0 directly supports "opacity"
+		node.style.MozOpacity = opacity;
+	}else if(h.safari){
+		node.style.opacity = opacity; // 1.3 directly supports "opacity"
+		node.style.KhtmlOpacity = opacity;
+	}else{
+		node.style.opacity = opacity;
+	}
+}
+	
+dojo.style.getOpacity = function getOpacity (node){
+	node = dojo.byId(node);
+	if(dojo.render.html.ie){
+		var opac = (node.filters && node.filters.alpha &&
+			typeof node.filters.alpha.opacity == "number"
+			? node.filters.alpha.opacity : 100) / 100;
+	}else{
+		var opac = node.style.opacity || node.style.MozOpacity ||
+			node.style.KhtmlOpacity || 1;
+	}
+	return opac >= 0.999999 ? 1.0 : Number(opac);
+}
+
+dojo.style.clearOpacity = function clearOpacity (node) {
+	node = dojo.byId(node);
+	var h = dojo.render.html;
+	if(h.ie){
+		if( node.filters && node.filters.alpha ) {
+			node.style.filter = ""; // FIXME: may get rid of other filter effects
+		}
+	}else if(h.moz){
+		node.style.opacity = 1;
+		node.style.MozOpacity = 1;
+	}else if(h.safari){
+		node.style.opacity = 1;
+		node.style.KhtmlOpacity = 1;
+	}else{
+		node.style.opacity = 1;
+	}
+}
+
+dojo.style.isVisible = function(node){
+	node = dojo.byId(node);
+	// FIXME: this should also look at visibility!
+	return dojo.style.getComputedStyle(node||this.domNode, "display") != "none";
+}
+
+dojo.style.show  = function(node){
+	node = dojo.byId(node);
+	if(node.style){
+		node.style.display = dojo.lang.inArray(['tr', 'td', 'th'], node.tagName.toLowerCase()) ? "" : "block";
+	}
+}
+
+dojo.style.hide = function(node){
+	node = dojo.byId(node);
+	if(node.style){
+		node.style.display = "none";
+	}
+}
+
+dojo.style.toggleVisible = function(node) {
+	if(dojo.style.isVisible(node)) {
+		dojo.style.hide(node);
+		return false;
+	} else {
+		dojo.style.show(node);
+		return true;
+	}
+}
+
+// in: coordinate array [x,y,w,h] or dom node
+// return: coordinate array
+dojo.style.toCoordinateArray = function(coords, includeScroll) {
+	if(dojo.lang.isArray(coords)){
+		// coords is already an array (of format [x,y,w,h]), just return it
+		while ( coords.length < 4 ) { coords.push(0); }
+		while ( coords.length > 4 ) { coords.pop(); }
+		var ret = coords;
+	} else {
+		// coords is an dom object (or dom object id); return it's coordinates
+		var node = dojo.byId(coords);
+		var ret = [
+			dojo.style.getAbsoluteX(node, includeScroll),
+			dojo.style.getAbsoluteY(node, includeScroll),
+			dojo.style.getInnerWidth(node),
+			dojo.style.getInnerHeight(node)
+		];
+	}
+	ret.x = ret[0];
+	ret.y = ret[1];
+	ret.w = ret[2];
+	ret.h = ret[3];
+	return ret;
+};

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/svg.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/svg.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/svg.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/svg.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,277 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.svg");
+dojo.require("dojo.lang");
+dojo.require("dojo.dom");
+
+dojo.lang.mixin(dojo.svg, dojo.dom);
+
+/**
+ *	The Graphics object.  Hopefully gives the user a way into
+ *	XPlatform rendering functions supported correctly and incorrectly.
+**/
+dojo.svg.graphics = dojo.svg.g = new function(d){
+	this.suspend = function(){
+		try { d.documentElement.suspendRedraw(0); } catch(e){ }
+	};
+	this.resume = function(){
+		try { d.documentElement.unsuspendRedraw(0); } catch(e){ }
+	};
+	this.force = function(){
+		try { d.documentElement.forceRedraw(); } catch(e){ }
+	};
+}(document);
+
+/**
+ *	The Animations control object.  Hopefully gives the user a way into
+ *	XPlatform animation functions supported correctly and incorrectly.
+**/
+dojo.svg.animations = dojo.svg.anim = new function(d){
+	this.arePaused = function(){
+		try {
+			return d.documentElement.animationsPaused();
+		} catch(e){
+			return false;
+		}
+	} ;
+	this.pause = function(){
+		try { d.documentElement.pauseAnimations(); } catch(e){ }
+	};
+	this.resume = function(){
+		try { d.documentElement.unpauseAnimations(); } catch(e){ }
+	};
+}(document);
+
+/**
+ *	signatures from dojo.style.
+ */
+dojo.svg.toCamelCase = function(selector){
+	var arr = selector.split('-'), cc = arr[0];
+	for(var i = 1; i < arr.length; i++) {
+		cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1);
+	}
+	return cc;		
+};
+dojo.svg.toSelectorCase = function (selector) {
+	return selector.replace(/([A-Z])/g, "-$1" ).toLowerCase() ;
+};
+dojo.svg.getStyle = function(node, cssSelector){
+	return document.defaultView.getComputedStyle(node, cssSelector);
+};
+dojo.svg.getNumericStyle = function(node, cssSelector){
+	return parseFloat(dojo.svg.getStyle(node, cssSelector));
+};
+
+/**
+ *	alpha channel operations
+ */
+dojo.svg.getOpacity = function(node){
+	return Math.min(1.0, dojo.svg.getNumericStyle(node, "fill-opacity"));
+};
+dojo.svg.setOpacity = function(node, opacity){
+	node.setAttributeNS(this.xmlns.svg, "fill-opacity", opacity);
+	node.setAttributeNS(this.xmlns.svg, "stroke-opacity", opacity);
+};
+dojo.svg.clearOpacity = function(node){
+	node.setAttributeNS(this.xmlns.svg, "fill-opacity", "1.0");
+	node.setAttributeNS(this.xmlns.svg, "stroke-opacity", "1.0");
+};
+
+/**
+ *	Coordinates and dimensions.
+ */
+dojo.svg.getCoords = function(node){
+	if (node.getBBox) {
+		var box = node.getBBox();
+		return { x: box.x, y: box.y };
+	}
+	return null;
+};
+dojo.svg.setCoords = function(node, coords){
+	var p = dojo.svg.getCoords();
+	if (!p) return;
+	var dx = p.x - coords.x;
+	var dy = p.y - coords.y;
+	dojo.svg.translate(node, dx, dy);
+};
+dojo.svg.getDimensions = function(node){
+	if (node.getBBox){
+		var box = node.getBBox();
+		return { width: box.width, height : box.height };
+	}
+	return null;
+};
+dojo.svg.setDimensions = function(node, dim){
+	//	will only support shape-based and container elements; path-based elements are ignored.
+	if (node.width){
+		node.width.baseVal.value = dim.width;
+		node.height.baseVal.vaule = dim.height;
+	}
+	else if (node.r){
+		node.r.baseVal.value = Math.min(dim.width, dim.height)/2;
+	}
+	else if (node.rx){
+		node.rx.baseVal.value = dim.width/2;
+		node.ry.baseVal.value = dim.height/2;
+	}
+};
+
+/**
+ *	Transformations.
+ */
+dojo.svg.translate = function(node, dx, dy){
+	if (node.transform && node.ownerSVGElement && node.ownerSVGElement.createSVGTransform){
+		var t = node.ownerSVGElement.createSVGTransform();
+		t.setTranslate(dx, dy);
+		node.transform.baseVal.appendItem(t);
+	}
+};
+dojo.svg.scale = function(node, scaleX, scaleY){
+	if (!scaleY) var scaleY = scaleX;
+	if (node.transform && node.ownerSVGElement && node.ownerSVGElement.createSVGTransform){
+		var t = node.ownerSVGElement.createSVGTransform();
+		t.setScale(scaleX, scaleY);
+		node.transform.baseVal.appendItem(t);
+	}
+};
+dojo.svg.rotate = function(node, ang, cx, cy){
+	if (node.transform && node.ownerSVGElement && node.ownerSVGElement.createSVGTransform){
+		var t = node.ownerSVGElement.createSVGTransform();
+		if (!cx) t.setMatrix(t.matrix.rotate(ang));
+		else t.setRotate(ang, cx, cy);
+		node.transform.baseVal.appendItem(t);
+	}
+};
+dojo.svg.skew = function(node, ang, axis){
+	var dir = axis || "x";
+	if (node.transform && node.ownerSVGElement && node.ownerSVGElement.createSVGTransform){
+		var t = node.ownerSVGElement.createSVGTransform();
+		if (dir != "x") t.setSkewY(ang);
+		else t.setSkewX(ang);
+		node.transform.baseVal.appendItem(t);
+	}
+};
+dojo.svg.flip = function(node, axis){
+	var dir = axis || "x";
+	if (node.transform && node.ownerSVGElement && node.ownerSVGElement.createSVGTransform){
+		var t = node.ownerSVGElement.createSVGTransform();
+		t.setMatrix((dir != "x") ? t.matrix.flipY() : t.matrix.flipX());
+		node.transform.baseVal.appendItem(t);
+	}
+};
+dojo.svg.invert = function(node){
+	if (node.transform && node.ownerSVGElement && node.ownerSVGElement.createSVGTransform){
+		var t = node.ownerSVGElement.createSVGTransform();
+		t.setMatrix(t.matrix.inverse());
+		node.transform.baseVal.appendItem(t);
+	}
+};
+dojo.svg.applyMatrix = function(node, a, b, c, d, e, f){
+	if (node.transform && node.ownerSVGElement && node.ownerSVGElement.createSVGTransform){
+		var m;
+		if (b){
+			var m = node.ownerSVGElement.createSVGMatrix();
+			m.a = a;
+			m.b = b;
+			m.c = c;
+			m.d = d;
+			m.e = e;
+			m.f = f;
+		} else m = a;
+		var t = node.ownerSVGElement.createSVGTransform();
+		t.setMatrix(m);
+		node.transform.baseVal.appendItem(t);
+	}
+};
+
+/**
+ *	Grouping and z-index operations.
+ */
+dojo.svg.group = function(nodes){
+	//	expect an array of nodes, attaches the group to the parent of the first node.
+	var p = nodes.item(0).parentNode;
+	var g = document.createElementNS(this.xmlns.svg, "g");
+	for (var i = 0; i < nodes.length; i++) g.appendChild(nodes.item(i));
+	p.appendChild(g);
+	return g;
+};
+dojo.svg.ungroup = function(g){
+	//	puts the children of the group on the same level as group was.
+	var p = g.parentNode;
+	while (g.childNodes.length > 0) p.appendChild(g.childNodes.item(0));
+	p.removeChild(g);
+};
+//	if the node is part of a group, return the group, else return null.
+dojo.svg.getGroup = function(node){
+	//	if the node is part of a group, return the group, else return null.
+	var a = this.getAncestors(node);
+	for (var i = 0; i < a.length; i++){
+		if (a[i].nodeType == this.ELEMENT_NODE && a[i].nodeName.toLowerCase() == "g")
+			return a[i];
+	}
+	return null;
+};
+dojo.svg.bringToFront = function(node){
+	var n = this.getGroup(node) || node;
+	n.ownerSVGElement.appendChild(n);
+};
+dojo.svg.sendToBack = function(node){
+	var n = this.getGroup(node) || node;
+	n.ownerSVGElement.insertBefore(n, n.ownerSVGElement.firstChild);
+};
+//	TODO: possibly push node up a level in the DOM if it's at the beginning or end of the childNodes list.
+dojo.svg.bringForward = function(node){
+	var n = this.getGroup(node) || node;
+	if (this.getLastChildElement(n.parentNode) != n){
+		this.insertAfter(n, this.getNextSiblingElement(n), true);
+	}
+};
+dojo.svg.sendBackward = function(node){
+	var n = this.getGroup(node) || node;
+	if (this.getFirstChildElement(n.parentNode) != n){
+		this.insertBefore(n, this.getPreviousSiblingElement(n), true);
+	}
+};
+//	modded to account for FF 1.5 mixed environment, will try ASVG first, then w3 standard.
+dojo.dom.createNodesFromText = function (txt, wrap){
+	var docFrag;
+	if (window.parseXML) docFrag = parseXML(txt, window.document);
+	else if (window.DOMParser) docFrag = (new DOMParser()).parseFromString(txt, "text/xml");
+	else dojo.raise("dojo.dom.createNodesFromText: environment does not support XML parsing");
+	docFrag.normalize();
+	if(wrap){ 
+		var ret = [docFrag.firstChild.cloneNode(true)];
+		return ret;
+	}
+	var nodes = [];
+	for(var x=0; x<docFrag.childNodes.length; x++){
+		nodes.push(docFrag.childNodes.item(x).cloneNode(true));
+	}
+	// tn.style.display = "none";
+	return nodes;
+}
+
+// FIXME: this should be removed after 0.2 release
+if(!dojo.evalObjPath("dojo.dom.createNodesFromText")) {
+	dojo.dom.createNodesFromText = function() {
+		dojo.deprecated("dojo.dom.createNodesFromText", "use dojo.svg.createNodesFromText instead");
+		dojo.svg.createNodesFromText.apply(dojo.html, arguments);
+	}
+}
+
+//	IE INLINE FIX
+/*
+if (dojo.render.html.ie && dojo.render.svg.adobe){
+	document.write("<object id=\"AdobeSVG\" classid=\"clsid:78156a80-c6a1-4bbf-8e6a-3cd390eeb4e2\"></object>");
+	document.write("<?import namespace=\"svg\" urn=\"http://www.w3.org/2000/svg\" implementation=\"#AdobeSVG\"?>");
+}
+*/
+// vim:ts=4:noet:tw=0:

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/Builder.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/Builder.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/Builder.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/Builder.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,16 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.text.Builder");
+dojo.require("dojo.string.Builder");
+
+dj_deprecated("dojo.text.Builder is deprecated, use dojo.string.Builder instead");
+
+dojo.text.Builder = dojo.string.Builder;

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/String.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/String.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/String.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/String.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,15 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dj_deprecated("dojo.text.String is being replaced by dojo.string");
+dojo.require("dojo.string");
+
+dojo.text = dojo.string;
+dojo.provide("dojo.text.String");

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/Text.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/Text.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/Text.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/Text.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,15 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dj_deprecated("dojo.text.Text is being replaced by dojo.string");
+dojo.require("dojo.string");
+
+dojo.text = dojo.string;
+dojo.provide("dojo.text.Text");

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/__package__.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/__package__.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/__package__.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/__package__.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,17 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.hostenv.conditionalLoadModule({
+	common: [
+		"dojo.text.String",
+		"dojo.text.Builder"
+	]
+});
+dojo.hostenv.moduleLoaded("dojo.text.*");

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/textDirectory.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/textDirectory.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/textDirectory.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/text/textDirectory.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,81 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.text.textDirectory");
+dojo.provide("dojo.text.textDirectory.Property");
+dojo.provide("dojo.text.textDirectory.tokenise");
+dojo.require("dojo.string");
+
+/* adapted from Paul Sowden's iCalendar work */
+
+dojo.textDirectoryTokeniser = function () {}
+
+/*
+ * This class parses a single line from a text/directory file
+ * and returns an object with four named values; name, group, params
+ * and value. name, group and value are strings containing the original
+ * tokens unaltered and values is an array containing name/value pairs
+ * or a single name token packed into arrays.
+ */
+dojo.textDirectoryTokeniser.Property = function (line) {
+	// split into name/value pair
+	var left = dojo.string.trim(line.substring(0, line.indexOf(':')));
+	var right = dojo.string.trim(line.substr(line.indexOf(':') + 1));
+
+	// seperate name and paramters	
+	var parameters = dojo.string.splitEscaped(left,';');
+	this.name = parameters[0]
+	parameters.splice(0, 1);
+
+	// parse paramters
+	this.params = [];
+	for (var i = 0; i < parameters.length; i++) {
+		var arr = parameters[i].split("=");
+		var key = dojo.string.trim(arr[0].toUpperCase());
+		
+		if (arr.length == 1) { this.params.push([key]); continue; }
+		
+		var values = dojo.string.splitEscaped(arr[1],',');
+		for (var j = 0; j < values.length; j++) {
+			if (dojo.string.trim(values[j]) != '') {
+				this.params.push([key, dojo.string.trim(values[j])]);
+			}
+		}
+	}
+
+	// seperate group
+	if (this.name.indexOf('.') > 0) {
+		var arr = this.name.split('.');
+		this.group = arr[0];
+		this.name = arr[1];
+	}
+	
+	// don't do any parsing, leave to implementation
+	this.value = right;
+}
+
+
+// tokeniser, parses into an array of properties.
+dojo.textDirectoryTokeniser.tokenise = function (text) {
+	// normlize to one propterty per line and parse
+	nText = dojo.string.normalizeNewlines(text,"\n");
+	nText = nText.replace(/\n[ \t]/g, '');
+	nText = nText.replace(/\x00/g, '');
+		
+	var lines = nText.split("\n");
+	var properties = []
+
+	for (var i = 0; i < lines.length; i++) {
+		if (dojo.string.trim(lines[i]) == '') { continue; }
+		var prop = new dojo.textDirectoryTokeniser.Property(lines[i]);
+		properties.push(prop);
+	}
+	return properties;
+}

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/undo/Manager.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/undo/Manager.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/undo/Manager.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/undo/Manager.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,171 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.undo.Manager");
+dojo.require("dojo.lang");
+
+dojo.undo.Manager = function(parent) {
+	this.clear();
+	this._parent = parent;
+};
+dojo.lang.extend(dojo.undo.Manager, {
+	_parent: null,
+	_undoStack: null,
+	_redoStack: null,
+	_currentManager: null,
+
+	canUndo: false,
+	canRedo: false,
+
+	isUndoing: false,
+	isRedoing: false,
+
+	// these events allow you to hook in and update your code (UI?) as necessary
+	onUndo: function(manager, item) {},
+	onRedo: function(manager, item) {},
+
+	// fired when you do *any* undo action, which means you'll have one for every item
+	// in a transaction. this is usually only useful for debugging
+	onUndoAny: function(manager, item) {},
+	onRedoAny: function(manager, item) {},
+
+	_updateStatus: function() {
+		this.canUndo = this._undoStack.length > 0;
+		this.canRedo = this._redoStack.length > 0;
+	},
+
+	clear: function() {
+		this._undoStack = [];
+		this._redoStack = [];
+		this._currentManager = this;
+
+		this.isUndoing = false;
+		this.isRedoing = false;
+
+		this._updateStatus();
+	},
+
+	undo: function() {
+		if(!this.canUndo) { return false; }
+
+		this.endAllTransactions();
+
+		this.isUndoing = true;
+		var top = this._undoStack.pop();
+		if(top instanceof this.constructor) {
+			top.undoAll();
+		} else {
+			top.undo();
+		}
+		if(top.redo) {
+			this._redoStack.push(top);
+		}
+		this.isUndoing = false;
+
+		this._updateStatus();
+		this.onUndo(this, top);
+		if(!(top instanceof this.constructor)) {
+			this.getTop().onUndoAny(this, top);
+		}
+		return true;
+	},
+
+	redo: function() {
+		if(!this.canRedo) { return false; }
+
+		this.isRedoing = true;
+		var top = this._redoStack.pop();
+		if(top instanceof this.constructor) {
+			top.redoAll();
+		} else {
+			top.redo();
+		}
+		this._undoStack.push(top);
+		this.isRedoing = false;
+
+		this._updateStatus();
+		this.onRedo(this, top);
+		if(!(top instanceof this.constructor)) {
+			this.getTop().onRedoAny(this, top);
+		}
+		return true;
+	},
+
+	undoAll: function() {
+		while(this._undoStack.length > 0) {
+			this.undo();
+		}
+	},
+
+	redoAll: function() {
+		while(this._redoStack.length > 0) {
+			this.redo();
+		}
+	},
+
+	push: function(undo, redo /* optional */, description /* optional */) {
+		if(!undo) { return; }
+
+		if(this._currentManager == this) {
+			this._undoStack.push({
+				undo: undo,
+				redo: redo,
+				description: description
+			});
+		} else {
+			this._currentManager.push.apply(this._currentManager, arguments);
+		}
+		// adding a new undo-able item clears out the redo stack
+		this._redoStack = [];
+		this._updateStatus();
+	},
+
+	beginTransaction: function() {
+		if(this._currentManager == this) {
+			var mgr = new dojo.undo.Manager(this);
+			this._undoStack.push(mgr);
+			this._currentManager = mgr;
+		} else {
+			this._currentManager.beginTransaction.apply(this._currentManager, arguments);
+		}
+	},
+
+	endTransaction: function() {
+		if(this._currentManager == this) {
+			if(this._parent) {
+				this._parent._currentManager = this._parent;
+				if(this._undoStack.length == 0) {
+					// don't leave empty transactions hangin' around
+					var idx = dojo.lang.find(this._parent._undoStack, this);
+					if(idx >= 0) {
+						this._parent._undoStack.splice(idx, 1);
+					}
+				}
+			}
+		} else {
+			this._currentManager.endTransaction.apply(this._currentManager, arguments);
+		}
+	},
+
+	endAllTransactions: function() {
+		while(this._currentManager != this) {
+			this.endTransaction();
+		}
+	},
+
+	// find the top parent of an undo manager
+	getTop: function() {
+		if(this._parent) {
+			return this._parent.getTop();
+		} else {
+			return this;
+		}
+	}
+});

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/undo/__package__.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/undo/__package__.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/undo/__package__.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/undo/__package__.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,12 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.require("dojo.undo.Manager");
+dojo.provide("dojo.undo.*");

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uri/Uri.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uri/Uri.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uri/Uri.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uri/Uri.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,108 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.uri.Uri");
+
+dojo.uri = new function() {
+	this.joinPath = function() {
+		// DEPRECATED: use the dojo.uri.Uri object instead
+		var arr = [];
+		for(var i = 0; i < arguments.length; i++) { arr.push(arguments[i]); }
+		return arr.join("/").replace(/\/{2,}/g, "/").replace(/((https*|ftps*):)/i, "$1/");
+	}
+	
+	this.dojoUri = function (uri) {
+		// returns a Uri object resolved relative to the dojo root
+		return new dojo.uri.Uri(dojo.hostenv.getBaseScriptUri(), uri);
+	}
+		
+	this.Uri = function (/*uri1, uri2, [...]*/) {
+		// An object representing a Uri.
+		// Each argument is evaluated in order relative to the next until
+		// a conanical uri is producued. To get an absolute Uri relative
+		// to the current document use
+		//      new dojo.uri.Uri(document.baseURI, uri)
+
+		// TODO: support for IPv6, see RFC 2732
+
+		// resolve uri components relative to each other
+		var uri = arguments[0];
+		for (var i = 1; i < arguments.length; i++) {
+			if(!arguments[i]) { continue; }
+
+			// Safari doesn't support this.constructor so we have to be explicit
+			var relobj = new dojo.uri.Uri(arguments[i].toString());
+			var uriobj = new dojo.uri.Uri(uri.toString());
+
+			if (relobj.path == "" && relobj.scheme == null &&
+				relobj.authority == null && relobj.query == null) {
+				if (relobj.fragment != null) { uriobj.fragment = relobj.fragment; }
+				relobj = uriobj;
+			} else if (relobj.scheme == null) {
+				relobj.scheme = uriobj.scheme;
+			
+				if (relobj.authority == null) {
+					relobj.authority = uriobj.authority;
+					
+					if (relobj.path.charAt(0) != "/") {
+						var path = uriobj.path.substring(0,
+							uriobj.path.lastIndexOf("/") + 1) + relobj.path;
+
+						var segs = path.split("/");
+						for (var j = 0; j < segs.length; j++) {
+							if (segs[j] == ".") {
+								if (j == segs.length - 1) { segs[j] = ""; }
+								else { segs.splice(j, 1); j--; }
+							} else if (j > 0 && !(j == 1 && segs[0] == "") &&
+								segs[j] == ".." && segs[j-1] != "..") {
+
+								if (j == segs.length - 1) { segs.splice(j, 1); segs[j - 1] = ""; }
+								else { segs.splice(j - 1, 2); j -= 2; }
+							}
+						}
+						relobj.path = segs.join("/");
+					}
+				}
+			}
+
+			uri = "";
+			if (relobj.scheme != null) { uri += relobj.scheme + ":"; }
+			if (relobj.authority != null) { uri += "//" + relobj.authority; }
+			uri += relobj.path;
+			if (relobj.query != null) { uri += "?" + relobj.query; }
+			if (relobj.fragment != null) { uri += "#" + relobj.fragment; }
+		}
+
+		this.uri = uri.toString();
+
+		// break the uri into its main components
+		var regexp = "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$";
+	    var r = this.uri.match(new RegExp(regexp));
+
+		this.scheme = r[2] || (r[1] ? "" : null);
+		this.authority = r[4] || (r[3] ? "" : null);
+		this.path = r[5]; // can never be undefined
+		this.query = r[7] || (r[6] ? "" : null);
+		this.fragment  = r[9] || (r[8] ? "" : null);
+		
+		if (this.authority != null) {
+			// server based naming authority
+			regexp = "^((([^:]+:)?([^@]+))@)?([^:]*)(:([0-9]+))?$";
+			r = this.authority.match(new RegExp(regexp));
+			
+			this.user = r[3] || null;
+			this.password = r[4] || null;
+			this.host = r[5];
+			this.port = r[7] || null;
+		}
+	
+		this.toString = function(){ return this.uri; }
+	}
+};

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uri/__package__.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uri/__package__.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uri/__package__.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uri/__package__.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,14 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.hostenv.conditionalLoadModule({
+	common: ["dojo.uri.Uri", false, false]
+});
+dojo.hostenv.moduleLoaded("dojo.uri.*");

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/LightweightGenerator.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/LightweightGenerator.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/LightweightGenerator.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/LightweightGenerator.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,82 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.uuid.LightweightGenerator");
+
+/**
+ * The LightweightGenerator is intended to be small and fast,
+ * but not necessarily good.
+ * 
+ * Small: The LightweightGenerator has a small footprint. 
+ * Once comments are stripped, it's only about 25 lines of 
+ * code, and it doesn't dojo.require() any other packages.
+ *
+ * Fast: The LightweightGenerator can generate lots of new 
+ * UUIDs fairly quickly (at least, more quickly than the other 
+ * dojo UUID generators).
+ *
+ * Not necessarily good: We use Math.random() as our source
+ * of randomness, which may or may not provide much randomness. 
+ */
+dojo.uuid.LightweightGenerator = new function() {
+
+	var HEX_RADIX = 16;
+
+// --------------------------------------------------
+// Private functions
+// --------------------------------------------------
+	function _generateRandomEightCharacterHexString() {
+		// Make random32bitNumber be a randomly generated floating point number
+		// between 0 and (4,294,967,296 - 1), inclusive.
+		var random32bitNumber = Math.floor( (Math.random() % 1) * Math.pow(2, 32) );
+		var eightCharacterHexString = random32bitNumber.toString(HEX_RADIX);
+		while (eightCharacterHexString.length < 8) {
+			eightCharacterHexString = "0" + eightCharacterHexString;
+		}
+		return eightCharacterHexString; // for example: "3B12F1DF"
+	}
+
+// --------------------------------------------------
+// Public functions
+// --------------------------------------------------
+
+/**
+ * This function generates random UUIDs, meaning "version 4" UUIDs.
+ * For example, a typical generated value would be something like
+ * "3b12f1df-5232-4804-897e-917bf397618a".
+ *
+ * Examples:
+ * <pre>
+ *   var string = dojo.uuid.LightweightGenerator.generate();
+ *   var string = dojo.uuid.LightweightGenerator.generate(String);
+ *   var uuid   = dojo.uuid.LightweightGenerator.generate(dojo.uuid.Uuid);
+ * </pre>
+ *
+ * @param	returnType	Optional. The type of instance to return.
+ * @return	A newly generated version 4 UUID.
+ */
+	this.generate = function(returnType) {
+		var hyphen = "-";
+		var versionCodeForRandomlyGeneratedUuids = "4"; // 8 == binary2hex("0100")
+		var variantCodeForDCEUuids = "8"; // 8 == binary2hex("1000")
+		var a = _generateRandomEightCharacterHexString();
+		var b = _generateRandomEightCharacterHexString();
+		b = b.substring(0, 4) + hyphen + versionCodeForRandomlyGeneratedUuids + b.substring(5, 8);
+		var c = _generateRandomEightCharacterHexString();
+		c = variantCodeForDCEUuids + c.substring(1, 4) + hyphen + c.substring(4, 8);
+		var d = _generateRandomEightCharacterHexString();
+		var returnValue = a + hyphen + b + hyphen + c + d;
+		returnValue = returnValue.toLowerCase();
+		if (returnType && (returnType != String)) {
+			returnValue = new returnType(returnValue);
+		}
+		return returnValue;
+	};
+}();

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/NameBasedGenerator.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/NameBasedGenerator.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/NameBasedGenerator.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/NameBasedGenerator.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,43 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.uuid.NameBasedGenerator");
+
+dojo.uuid.NameBasedGenerator = new function() {
+
+/**
+ * This function generates name-based UUIDs, meaning "version 3" 
+ * and "version 5" UUIDs.
+ *
+ * Examples:
+ * <pre>
+ *   var string = dojo.uuid.NameBasedGenerator.generate();
+ *   var string = dojo.uuid.NameBasedGenerator.generate(String);
+ *   var uuid   = dojo.uuid.NameBasedGenerator.generate(dojo.uuid.Uuid);
+ * </pre>
+ *
+ * @param	returnType	Optional. The type of instance to return.
+ * @return	A newly generated version 3 or version 5 UUID.
+ */
+	this.generate = function(returnType) {
+		dojo.unimplemented('dojo.uuid.NameBasedGenerator.generate');
+		
+		// FIXME:
+		// For an algorithm to generate name-based UUIDs, 
+		// see sections 4.3 of RFC 4122:
+		//  http://www.ietf.org/rfc/rfc4122.txt
+		
+		var returnValue = "00000000-0000-0000-0000-000000000000"; // FIXME
+		if (returnType && (returnType != String)) {
+			returnValue = new returnType(returnValue);
+		}
+		return returnValue;
+	};
+}();
\ No newline at end of file

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/NilGenerator.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/NilGenerator.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/NilGenerator.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/NilGenerator.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,38 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.uuid.NilGenerator");
+
+dojo.uuid.NilGenerator = new function() {
+
+/**
+ * This function returns the Nil UUID: 
+ * "00000000-0000-0000-0000-000000000000".
+ * The Nil UUID is described in section 4.1.7 of
+ * RFC 4122: http://www.ietf.org/rfc/rfc4122.txt
+ *
+ * Examples:
+ * <pre>
+ *   var string = dojo.uuid.NilGenerator.generate();
+ *   var string = dojo.uuid.NilGenerator.generate(String);
+ *   var uuid   = dojo.uuid.NilGenerator.generate(dojo.uuid.Uuid);
+ * </pre>
+ *
+ * @param	returnType	Optional. The type of instance to return.
+ * @return	The nil UUID.
+ */
+	this.generate = function(returnType) {
+		var returnValue = "00000000-0000-0000-0000-000000000000";
+		if (returnType && (returnType != String)) {
+			returnValue = new returnType(returnValue);
+		}
+		return returnValue;
+	};
+}();
\ No newline at end of file

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/RandomGenerator.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/RandomGenerator.js?rev=373998&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/RandomGenerator.js (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/html/dojo/src/uuid/RandomGenerator.js Tue Jan 31 21:39:49 2006
@@ -0,0 +1,44 @@
+/*
+	Copyright (c) 2004-2005, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.uuid.RandomGenerator");
+
+dojo.uuid.RandomGenerator = new function() {
+
+/**
+ * This function generates random UUIDs, meaning "version 4" UUIDs.
+ * For example, a typical generated value would be something like
+ * "3b12f1df-5232-4804-897e-917bf397618a".
+ *
+ * Examples:
+ * <pre>
+ *   var string = dojo.uuid.RandomGenerator.generate();
+ *   var string = dojo.uuid.RandomGenerator.generate(String);
+ *   var uuid   = dojo.uuid.RandomGenerator.generate(dojo.uuid.Uuid);
+ * </pre>
+ *
+ * @param	returnType	Optional. The type of instance to return.
+ * @return	A newly generated version 4 UUID.
+ */
+	this.generate = function(returnType) {
+		dojo.unimplemented('dojo.uuid.RandomGenerator.generate');
+		
+		// FIXME:
+		// For an algorithm to generate a random UUID, see
+		// sections 4.4 and 4.5 of RFC 4122:
+		//  http://www.ietf.org/rfc/rfc4122.txt
+		
+		var returnValue = "00000000-0000-0000-0000-000000000000"; // FIXME
+		if (returnType && (returnType != String)) {
+			returnValue = new returnType(returnValue);
+		}
+		return returnValue;
+	};
+}();



---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-dev-help@jakarta.apache.org