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/09/29 05:43:06 UTC

svn commit: r451106 [35/40] - in /tapestry/tapestry4/trunk: ./ tapestry-framework/src/java/org/apache/tapestry/asset/ tapestry-framework/src/js/dojo/ tapestry-framework/src/js/dojo/src/ tapestry-framework/src/js/dojo/src/animation/ tapestry-framework/s...

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/YahooMap.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/YahooMap.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/YahooMap.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/YahooMap.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,169 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.YahooMap");
+dojo.require("dojo.event.*");
+dojo.require("dojo.math");
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.HtmlWidget");
+
+(function(){
+	var yappid = djConfig["yAppId"]||djConfig["yahooAppId"]||"dojotoolkit";
+	if(!dojo.hostenv.post_load_){
+		if(yappid == "dojotoolkit"){
+			dojo.debug("please provide a unique Yahoo App ID in djConfig.yahooAppId when using the map widget");
+		}
+		var tag = "<scr"+"ipt src='http://api.maps.yahoo.com/ajaxymap?v=3.0&appid="+yappid+"'></scri"+"pt>";
+		if(!dj_global["YMap"]){
+			document.write(tag);
+		}
+	}else{
+		dojo.debug("cannot initialize map system after the page has been loaded! Please either manually include the script block provided by Yahoo in your page or require() the YahooMap widget before onload has fired");
+	}
+})();
+
+dojo.widget.defineWidget(
+	"dojo.widget.YahooMap",
+	dojo.widget.HtmlWidget,
+	function(){
+		// parameters
+		this.map=null;
+		this.datasrc="";
+		this.data=[];
+		this.width=0;
+		this.height=0;
+		this.controls=["zoomlong","maptype","pan"];
+	},
+{
+	isContainer: false,
+	templatePath:null,
+	templateCssPath:null,
+
+	findCenter:function(aPts){
+		var start=new YGeoPoint(37,-90);
+		if(aPts.length==0) return start;
+		var minLat,maxLat, minLon, maxLon, cLat, cLon;
+		minLat=maxLat=aPts[0].Lat;
+		minLon=maxLon=aPts[0].Lon;
+		for(var i=0; i<aPts.length; i++){
+			minLat=Math.min(minLat,aPts[i].Lat);
+			maxLat=Math.max(maxLat,aPts[i].Lat);
+			minLon=Math.min(minLon,aPts[i].Lon);
+			maxLon=Math.max(maxLon,aPts[i].Lon);
+		}
+		cLat=dojo.math.round((minLat+maxLat)/2,6);
+		cLon=dojo.math.round((minLon+maxLon)/2,6);
+		return new YGeoPoint(cLat,cLon);
+	},
+	setControls:function(){
+		var methodmap={
+			maptype:"addTypeControl",
+			pan:"addPanControl",
+			zoomlong:"addZoomLong",
+			zoomshort:"addZoomShort"
+		}
+		var c=this.controls;
+		for(var i=0; i<c.length; i++){
+			var controlMethod=methodmap[c[i].toLowerCase()];
+			if(this.map[controlMethod]){
+				this.map[controlMethod]();
+			}
+		}
+	},
+	
+	parse:function(table){
+		this.data=[];
+
+		//	get the column indices
+		var h=table.getElementsByTagName("thead")[0];
+		if(!h){
+			return;
+		}
+
+		var a=[];
+		var cols=h.getElementsByTagName("td");
+		if(cols.length==0){
+			cols=h.getElementsByTagName("th");
+		}
+		for(var i=0; i<cols.length; i++){
+			var c=cols[i].innerHTML.toLowerCase();
+			if(c=="long") c="lng";
+			a.push(c);
+		}
+		
+		//	parse the data
+		var b=table.getElementsByTagName("tbody")[0];
+		if(!b){
+			return;
+		}
+		for(var i=0; i<b.childNodes.length; i++){
+			if(!(b.childNodes[i].nodeName&&b.childNodes[i].nodeName.toLowerCase()=="tr")){
+				continue;
+			}
+			var cells=b.childNodes[i].getElementsByTagName("td");
+			var o={};
+			for(var j=0; j<a.length; j++){
+				var col=a[j];
+				if(col=="lat"||col=="lng"){
+					o[col]=parseFloat(cells[j].innerHTML);					
+				}else{
+					o[col]=cells[j].innerHTML;
+				}
+			}
+			this.data.push(o);
+		}
+	},
+	render:function(){
+		var pts=[];
+		var d=this.data;
+		for(var i=0; i<d.length; i++){
+			var pt=new YGeoPoint(d[i].lat, d[i].lng);
+			pts.push(pt);
+			var icon=d[i].icon||null;
+			if(icon){
+				icon=new YImage(icon);
+			}
+			var m=new YMarker(pt,icon);
+			if(d[i].description){
+				m.addAutoExpand("<div>"+d[i].description+"</div>");
+			}
+			this.map.addOverlay(m);
+		}
+		var c=this.findCenter(pts);
+		var z=this.map.getZoomLevel(pts);
+		this.map.drawZoomAndCenter(c,z);
+	},
+	
+	initialize:function(args, frag){
+		if(!YMap || !YGeoPoint){
+			dojo.raise("dojo.widget.YahooMap: The Yahoo Map script must be included in order to use this widget.");
+		}
+		if(this.datasrc){
+			this.parse(dojo.byId(this.datasrc));
+		}
+		else if(this.domNode.getElementsByTagName("table")[0]){
+			this.parse(this.domNode.getElementsByTagName("table")[0]);
+		}
+	},
+	postCreate:function(){
+		//	clean the domNode before creating the map.
+		while(this.domNode.childNodes.length>0){
+			this.domNode.removeChild(this.domNode.childNodes[0]);
+		}
+
+		if(this.width>0&&this.height>0){
+			this.map=new YMap(this.domNode, YAHOO_MAP_REG, new YSize(this.width, this.height));
+		}else{
+			this.map=new YMap(this.domNode);
+		}
+		this.setControls();
+		this.render();
+	}
+});

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/YahooMap.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/__package__.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/__package__.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/__package__.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/__package__.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,23 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.kwCompoundRequire({
+	common: ["dojo.xml.Parse", 
+			 "dojo.widget.Widget", 
+			 "dojo.widget.Parse", 
+			 "dojo.widget.Manager"],
+	browser: ["dojo.widget.DomWidget",
+			  "dojo.widget.HtmlWidget"],
+	dashboard: ["dojo.widget.DomWidget",
+			  "dojo.widget.HtmlWidget"],
+	svg: 	 ["dojo.widget.SvgWidget"],
+	rhino: 	 ["dojo.widget.SwtWidget"]
+});
+dojo.provide("dojo.widget.*");

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/__package__.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoContainer.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoContainer.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoContainer.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoContainer.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,107 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.demoEngine.DemoContainer");
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.HtmlWidget");
+dojo.require("dojo.widget.demoEngine.DemoPane");
+dojo.require("dojo.widget.demoEngine.SourcePane");
+dojo.require("dojo.widget.TabContainer");
+
+dojo.widget.defineWidget("my.widget.demoEngine.DemoContainer", 
+	dojo.widget.HtmlWidget, 
+	{
+		templatePath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoContainer.html"),
+		templateCssPath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoContainer.css"),
+		postCreate: function() {
+			dojo.html.addClass(this.domNode,this.domNodeClass);
+			dojo.html.addClass(this.tabNode, this.tabClass);
+			dojo.html.addClass(this.returnImageNode, this.returnClass);
+			this.returnImageNode.src=this.returnImage;
+
+			this.tabContainer = dojo.widget.createWidget("TabContainer",{},this.tabNode);
+
+			this.demoTab = dojo.widget.createWidget("DemoPane",{});
+			this.tabContainer.addChild(this.demoTab);
+
+			this.sourceTab= dojo.widget.createWidget("SourcePane",{});
+			this.tabContainer.addChild(this.sourceTab);
+
+			dojo.html.setOpacity(this.domNode,0);
+			dojo.html.hide(this.domNode);
+		},
+
+		loadDemo: function(url) {
+			this.demoTab.setHref(url);
+			this.sourceTab.setHref(url);
+			this.showDemo();
+		},
+
+		setName: function(name) {
+			dojo.html.removeChildren(this.demoNameNode);
+			this.demoNameNode.appendChild(document.createTextNode(name));
+		},
+
+		setSummary: function(summary) {
+			dojo.html.removeChildren(this.summaryNode);
+			this.summaryNode.appendChild(document.createTextNode(summary));
+		},
+
+		showSource: function() {
+			dojo.html.removeClass(this.demoButtonNode,this.selectedButtonClass);
+			dojo.html.addClass(this.sourceButtonNode,this.selectedButtonClass);
+			this.tabContainer.selectTab(this.sourceTab);	
+		},
+
+		showDemo: function() {
+			dojo.html.removeClass(this.sourceButtonNode,this.selectedButtonClass);
+			dojo.html.addClass(this.demoButtonNode,this.selectedButtonClass);
+			this.tabContainer.selectTab(this.demoTab);
+		},
+
+		returnToDemos: function() {
+			dojo.debug("Return To Demos");
+		},
+
+		show: function() {
+			dojo.html.setOpacity(this.domNode,1);
+			dojo.html.show(this.domNode);
+			this.tabContainer.checkSize();
+		}
+	},
+	"",
+	function() {
+		dojo.debug("DemoPane Init");
+		this.domNodeClass="demoContainer";
+
+		this.tabContainer="";
+		this.sourceTab="";
+		this.demoTab="";
+
+		this.headerNode="";
+		this.returnNode="";
+	
+		this.returnImageNode="";
+		this.returnImage="images/dojoDemos.gif";
+		this.returnClass="return";
+		
+		this.summaryNode="";
+		this.demoNameNode="";
+		this.tabControlNode="";
+
+		this.tabNode="";
+		this.tabClass = "demoContainerTabs";
+
+		this.sourceButtonNode="";
+		this.demoButtonNode="";
+
+		this.selectedButtonClass="selected";
+	}
+);

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoContainer.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoItem.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoItem.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoItem.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoItem.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,71 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.demoEngine.DemoItem");
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.HtmlWidget");
+
+dojo.widget.defineWidget("my.widget.demoEngine.DemoItem", 
+	dojo.widget.HtmlWidget, 
+	{
+		templatePath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoItem.html"),
+		templateCssPath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoItem.css"),
+		postCreate: function() {
+			dojo.html.addClass(this.domNode,this.domNodeClass);
+			dojo.html.addClass(this.summaryBoxNode, this.summaryBoxClass);
+			dojo.html.addClass(this.screenshotTdNode, this.screenshotTdClass);
+			dojo.html.addClass(this.summaryContainerNode, this.summaryContainerClass);
+			dojo.html.addClass(this.summaryNode, this.summaryClass);
+			dojo.html.addClass(this.viewDemoLinkNode, this.viewDemoLinkClass);
+
+			this.nameNode.appendChild(document.createTextNode(this.name));
+			this.descriptionNode.appendChild(document.createTextNode(this.description));
+			this.thumbnailImageNode.src = this.thumbnail;
+			this.thumbnailImageNode.name=this.name;
+			this.viewDemoImageNode.src = this.viewDemoImage;
+			this.viewDemoImageNode.name=this.name;
+		},
+		onSelectDemo: function() {
+			//Attach to this to do something when a demo is selected
+		}
+	},
+	"",
+	function() {
+		this.demo = "";
+
+		this.domNodeClass="demoItemWrapper";
+
+		this.summaryBoxNode="";
+		this.summaryBoxClass="demoItemSummaryBox";
+
+		this.nameNode="";
+		this.thumbnailImageNode="";
+		this.viewDemoImageNode="";
+
+		this.screenshotTdNode="";
+		this.screenshotTdClass="demoItemScreenshot";
+
+		this.summaryContainerNode="";
+		this.summaryContainerClass="demoItemSummaryContainer";
+
+		this.summaryNode="";
+		this.summaryClass="demoItemSummary";
+
+		this.viewDemoLinkNode="";
+		this.viewDemoLinkClass="demoItemView";
+
+		this.descriptionNode="";
+
+		this.name="Some Demo";
+		this.description="This is the description of this demo.";
+		this.thumbnail="images/test_thumb.gif";
+		this.viewDemoImage="images/viewDemo.png";
+	}
+);

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoItem.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoNavigator.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoNavigator.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoNavigator.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoNavigator.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,188 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.demoEngine.DemoNavigator");
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.HtmlWidget");
+dojo.require("dojo.widget.Button");
+dojo.require("dojo.widget.demoEngine.DemoItem");
+dojo.require("dojo.io.*");
+dojo.require("dojo.lfx.*");
+dojo.require("dojo.lang.common");
+
+dojo.widget.defineWidget("my.widget.demoEngine.DemoNavigator", 
+	dojo.widget.HtmlWidget, 
+	{
+		templatePath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoNavigator.html"),
+		templateCssPath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoNavigator.css"),
+		postCreate: function() {
+			dojo.html.addClass(this.domNode,this.domNodeClass);
+			dojo.html.addClass(this.demoListWrapperNode,this.demoListWrapperClass);
+			dojo.html.addClass(this.demoListContainerNode,this.demoListContainerClass);
+
+			if (dojo.render.html.ie) {
+				dojo.debug("render ie");
+				dojo.html.hide(this.demoListWrapperNode); 
+			} else {
+				dojo.debug("render non-ie");
+				dojo.lfx.html.fadeHide(this.demoListWrapperNode, 0).play();	
+			}
+
+			this.getRegistry(this.demoRegistryUrl);
+
+			this.demoContainer = dojo.widget.createWidget("DemoContainer",{returnImage: this.returnImage},this.demoNode);
+			dojo.event.connect(this.demoContainer,"returnToDemos", this, "returnToDemos");
+			this.demoContainer.hide();
+		},
+
+		returnToDemos: function() {
+			this.demoContainer.hide();
+			if (dojo.render.html.ie) {
+				dojo.debug("render ie");
+				dojo.html.show(this.navigationContainer) ;
+			} else {	
+				dojo.debug("render non-ie");
+				dojo.lfx.html.fadeShow(this.navigationContainer,250).play();
+			}
+
+			//if (dojo.render.html.ie) {
+			//	dojo.html.setOpacity(this.navigationContainer);
+			//}
+
+			dojo.lang.forEach(this.categoriesChildren, dojo.lang.hitch(this, function(child){
+				child.checkSize();
+			}));
+
+			dojo.lang.forEach(this.demoListChildren, dojo.lang.hitch(this, function(child){
+				child.checkSize();
+			}));
+		},
+
+		show: function() {
+			//dojo.widget.demoEngine.DemoNavigator.superclass.show.call(this);
+			dojo.html.show(this.domNode);
+			dojo.html.setOpacity(this.domNode,1);
+			//dojo.html.setOpacity(this.navigationContainer);	
+			//dojo.html.show(this.navigationContainer);
+			dojo.html.setOpacity(this.navigationContainer,1);
+
+			dojo.lang.forEach(this.categoriesChildren, dojo.lang.hitch(this, function(child){
+				child.checkSize();
+			}));
+
+			dojo.lang.forEach(this.demoListChildren, dojo.lang.hitch(this, function(child){
+				child.checkSize();
+			}));
+		},
+		getRegistry: function(url) {
+			dojo.io.bind({
+				url: url,
+				load: dojo.lang.hitch(this,this.processRegistry),
+				mimetype: "text/json"
+			});
+		},
+
+		processRegistry: function(type,registry,e) {
+			dojo.debug("Processing Registry");
+			this.registry = registry;
+			dojo.lang.forEach(this.registry.navigation, dojo.lang.hitch(this,this.addCategory)); 
+		},
+
+		addCategory: function(category) {
+				var newCat = dojo.widget.createWidget("Button",{caption: category.name});
+
+				if(!dojo.lang.isObject(this.registry.categories)) {
+					this.registry.categories=function(){};
+				}
+
+				this.registry.categories[category.name] = category;
+				this.categoriesChildren.push(newCat);
+				this.categoriesButtonsNode.appendChild(newCat.domNode);	
+				newCat.domNode.categoryName = category.name;
+				dojo.event.connect(newCat,"onClick", this, "onSelectCategory");
+		},
+
+		addDemo: function(demoName) {
+			var demo = this.registry.definitions[demoName];
+
+			if (dojo.render.html.ie) {
+				dojo.html.show(this.demoListWrapperNode) 
+			} else {
+				dojo.lfx.html.fadeShow(this.demoListWrapperNode, 250).play();
+			}
+
+			var newDemo = dojo.widget.createWidget("DemoItem",{viewDemoImage: this.viewDemoImage, name: demoName, description: demo.description, thumbnail: demo.thumbnail});
+			this.demoListChildren.push(newDemo);
+			this.demoListContainerNode.appendChild(newDemo.domNode);	
+			dojo.event.connect(newDemo,"onSelectDemo",this,"onSelectDemo");
+		},
+
+		onSelectCategory: function(e) {
+			catName = e.currentTarget.categoryName;	
+			dojo.debug("Selected Category: " + catName);
+			//Remove current list of demos
+			dojo.lang.forEach(this.demoListChildren, function(child) {
+					child.destroy();
+			});
+			this.demoListChildren=[];
+
+			//add demos from this cat
+			dojo.lang.forEach(this.registry.categories[catName].demos, dojo.lang.hitch(this,function(demoName){
+				this.addDemo(demoName);
+			}));
+		},
+
+		onSelectDemo: function(e) {
+			//Attach to this to do something when a demo is selected
+			dojo.debug("Demo Selected: " + e.target.name);
+
+			if (dojo.render.html.ie) {
+				dojo.debug("render ie");
+				dojo.html.hide(this.navigationContainer) ;
+				this.demoContainer.show();
+				this.demoContainer.showDemo();
+			} else {
+				dojo.debug("render non-ie");
+				dojo.lfx.html.fadeHide(this.navigationContainer,250,null,dojo.lang.hitch(this, function() {
+					this.demoContainer.show();	
+					this.demoContainer.showDemo();
+				})).play();
+			}
+
+			this.demoContainer.loadDemo(this.registry.definitions[e.target.name].url);
+			this.demoContainer.setName(e.target.name);
+			this.demoContainer.setSummary(this.registry.definitions[e.target.name].description);
+		}
+		
+	},
+	"",
+	function() {
+		this.demoRegistryUrl="demoRegistry.json";
+		this.registry=function(){};
+
+		this.categoriesNode="";
+		this.categoriesButtonsNode="";
+		this.navigationContainer="";
+
+		this.domNodeClass="demoNavigator";
+
+		this.demoNode="";
+		this.demoContainer="";
+
+		this.demoListWrapperNode="";
+		this.demoListWrapperClass="demoNavigatorListWrapper";
+		this.demoListContainerClass="demoNavigatorListContainer";
+
+		this.returnImage="images/dojoDemos.gif";
+		this.viewDemoImage="images/viewDemo.png";
+		this.demoListChildren = [];
+		this.categoriesChildren = [];
+	}
+);

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoNavigator.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoPane.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoPane.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoPane.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoPane.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,44 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.demoEngine.DemoPane");
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.HtmlWidget");
+
+dojo.widget.defineWidget("my.widget.demoEngine.DemoPane", 
+	dojo.widget.HtmlWidget, 
+	{
+		templatePath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoPane.html"),
+		templateCssPath: dojo.uri.dojoUri("src/widget/demoEngine/templates/DemoPane.css"),
+		postCreate: function() {
+			dojo.html.addClass(this.domNode,this.domNodeClass);
+			dojo.debug("PostCreate");
+			this._launchDemo();
+		},
+		
+		_launchDemo: function() {
+			dojo.debug("Launching Demo");
+			dojo.debug(this.demoNode);
+			this.demoNode.src=this.href;
+		},
+
+		setHref: function(url) {
+			this.href = url;
+			this._launchDemo();
+		}
+	},
+	"",
+	function() {
+		dojo.debug("DemoPane Init");
+		this.domNodeClass="demoPane";
+		this.demoNode = "";
+		this.href = "";
+	}
+);

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/DemoPane.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/SourcePane.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/SourcePane.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/SourcePane.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/SourcePane.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,52 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.demoEngine.SourcePane");
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.HtmlWidget");
+dojo.require("dojo.io.*");
+
+dojo.widget.defineWidget("my.widget.demoEngine.SourcePane", 
+	dojo.widget.HtmlWidget, 
+	{
+		templatePath: dojo.uri.dojoUri("src/widget/demoEngine/templates/SourcePane.html"),
+		templateCssPath: dojo.uri.dojoUri("src/widget/demoEngine/templates/SourcePane.css"),
+		postCreate: function() {
+			dojo.html.addClass(this.domNode,this.domNodeClass);
+			dojo.debug("PostCreate");
+		},
+	
+		getSource: function() {
+			if (this.href) {
+				dojo.io.bind({
+					url: this.href,
+					load: dojo.lang.hitch(this, "fillInSource"),
+					mimetype: "text/plain"
+				});
+			}
+		},	
+
+		fillInSource: function(type, source, e) {
+			this.sourceNode.value=source;
+		},
+
+		setHref: function(url) {
+			this.href = url;
+			this.getSource();
+		}
+	},
+	"",
+	function() {
+		dojo.debug("SourcePane Init");
+		this.domNodeClass="sourcePane";
+		this.sourceNode = "";
+		this.href = "";
+	}
+);

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/SourcePane.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/__package__.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/__package__.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/__package__.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/__package__.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,20 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.kwCompoundRequire({
+	browser: [
+		"dojo.widget.demoEngine.DemoItem",
+		"dojo.widget.demoEngine.DemoNavigator",
+		"dojo.widget.demoEngine.DemoPane",
+		"dojo.widget.demoEngine.SourcePane",
+		"dojo.widget.demoEngine.DemoContainer"
+	]
+});
+dojo.provide("dojo.widget.demoEngine.*");

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/__package__.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoContainer.css
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoContainer.css?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoContainer.css (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoContainer.css Thu Sep 28 20:42:39 2006
@@ -0,0 +1,39 @@
+.demoContainer{
+	width: 100%;
+	height: 100%;
+	padding: 0px;
+	margin: 0px;
+}
+
+.demoContainer .return {
+	cursor: pointer;
+}
+
+.demoContainer span {
+	margin-right: 10px;
+	cursor: pointer;
+}
+
+.demoContainer .selected {
+	border-bottom: 5px solid #95bfff;
+}
+
+.demoContainer table {
+	background: #f5f5f5;
+	width: 100%;
+	height: 100%;
+}
+
+.demoContainerTabs {
+	width: 100%;
+	height: 400px;
+}
+
+.demoContainerTabs .dojoTabLabels-top {
+	display: none;
+}
+
+.demoContainerTabs .dojoTabPaneWrapper {
+	border: 0px;
+}
+

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoContainer.css
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoContainer.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoContainer.html?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoContainer.html (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoContainer.html Thu Sep 28 20:42:39 2006
@@ -0,0 +1,25 @@
+<div dojoAttachPoint="domNode">
+	<table width="100%" cellspacing="0" cellpadding="5">
+		<tbody>
+			<tr dojoAttachPoint="headerNode">
+				<td dojoAttachPoint="returnNode" valign="middle" width="1%">
+					<img dojoAttachPoint="returnImageNode" dojoAttachEvent="onclick: returnToDemos"/>
+				</td>
+				<td>
+					<h1 dojoAttachPoint="demoNameNode"></h1>
+					<p dojoAttachPoint="summaryNode"></p>
+				</td>
+				<td dojoAttachPoint="tabControlNode" valign="middle" align="right" nowrap>
+					<span dojoAttachPoint="sourceButtonNode" dojoAttachEvent="onclick: showSource">source</span>
+					<span dojoAttachPoint="demoButtonNode" dojoAttachEvent="onclick: showDemo">demo</span>
+				</td>
+			</tr>
+			<tr>
+				<td colspan="3">
+					<div dojoAttachPoint="tabNode">
+					</div>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+</div>

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoContainer.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoItem.css
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoItem.css?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoItem.css (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoItem.css Thu Sep 28 20:42:39 2006
@@ -0,0 +1,58 @@
+.demoItemSummaryBox {
+	background: #efefef;
+	border:1px solid #dae3ee;
+}
+
+.demoItemScreenshot {
+	padding:0.65em;
+	width:175px;
+	border-right:1px solid #fafafa;
+	text-align:center;
+	cursor: pointer;
+}
+
+.demoItemWrapper{
+	margin-bottom:1em;
+}
+
+.demoItemWrapper a:link, .demoItemWrapper a:visited {
+	color:#a6238f;
+	text-decoration:none;
+}
+
+.demoItemSummaryContainer {
+	border-left:1px solid #ddd;
+}
+
+.demoItemSummaryContainer h1 {
+	background-color:#e8e8e8;
+	border-bottom: 1px solid #e6e6e6;
+	color:#738fb9;
+	margin:1px;
+	padding:0.5em;
+	font-family:"Lucida Grande", "Tahoma", serif;
+	font-size:1.25em;
+	font-weight:normal;
+}
+
+.demoItemSummaryContainer h1 .packageSummary {
+	display:block;
+	color:#000;
+	font-size:10px;
+	margin-top:2px;
+}
+
+.demoItemSummaryContainer .demoItemSummary{
+	padding:1em;
+}
+
+.demoItemSummaryContainer .demoItemSummary p {
+	font-size:0.85em;
+	padding:0;
+	margin:0;
+}
+
+.demoItemView {
+	text-align:right;
+	cursor: pointer;
+}

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoItem.css
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoItem.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoItem.html?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoItem.html (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoItem.html Thu Sep 28 20:42:39 2006
@@ -0,0 +1,21 @@
+<div dojoAttachPoint="domNode">
+	<div dojoAttachPoint="summaryBoxNode">
+		<table width="100%" cellspacing="0" cellpadding="0">
+			<tbody>
+				<tr>
+					<td dojoAttachPoint="screenshotTdNode" valign="top" width="1%">
+						<img dojoAttachPoint="thumbnailImageNode" dojoAttachEvent="onclick: onSelectDemo" />
+					</td>
+					<td dojoAttachPoint="summaryContainerNode" valign="top">
+						<h1 dojoAttachPoint="nameNode">
+						</h1>
+						<div dojoAttachPoint="summaryNode">
+							<p dojoAttachPoint="descriptionNode"></p>
+							<div dojoAttachPoint="viewDemoLinkNode"><img dojoAttachPoint="viewDemoImageNode"/ dojoAttachEvent="onclick: onSelectDemo"></div>
+						</div>
+					</td>
+				</tr>
+			</tbody>
+		</table>
+	</div>
+</div>

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoItem.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoNavigator.css
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoNavigator.css?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoNavigator.css (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoNavigator.css Thu Sep 28 20:42:39 2006
@@ -0,0 +1,28 @@
+.demoNavigatorListWrapper {
+	border:1px solid #dcdbdb;
+	background-color:#f8f8f8;
+	padding:2px;
+}
+
+.demoNavigatorListContainer {
+	border:1px solid #f0f0f0;
+	background-color:#fff;
+	padding:1em;
+}
+
+.demoNavigator h1 {
+	margin-top: 0px;
+	margin-bottom: 10px;
+	font-size: 1.2em;
+	border-bottom:1px dotted #a9ccf5;
+}
+
+.demoNavigator .dojoButton {
+	margin-bottom: 5px;
+}
+
+.demoNavigator .dojoButton .dojoButtonContents {
+	font-size: 1.1em;
+	width: 100px;
+	color: black;
+}

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoNavigator.css
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoNavigator.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoNavigator.html?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoNavigator.html (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoNavigator.html Thu Sep 28 20:42:39 2006
@@ -0,0 +1,24 @@
+<div dojoAttachPoint="domNode">
+	<table width="100%" cellspacing="0" cellpadding="5">
+		<tbody>
+			<tr dojoAttachPoint="navigationContainer">
+				<td dojoAttachPoint="categoriesNode" valign="top" width="1%">
+					<h1>Categories</h1>
+					<div dojoAttachPoint="categoriesButtonsNode"></div>
+				</td>
+
+				<td dojoAttachPoint="demoListNode" valign="top">
+					<div dojoAttachPoint="demoListWrapperNode">
+						<div dojoAttachPoint="demoListContainerNode">
+						</div>
+					</div>
+				</td>
+			</tr>
+			<tr>
+				<td colspan="2">
+					<div dojoAttachPoint="demoNode"></div>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+</div>

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoNavigator.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoPane.css
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoPane.css?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoPane.css (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoPane.css Thu Sep 28 20:42:39 2006
@@ -0,0 +1,18 @@
+.demoPane {
+	width: 100%;
+	height: 100%;
+	padding: 0px;
+	margin: 0px;
+	overflow: hidden;
+}
+
+.demoPane iframe {
+	width: 100%;
+	height: 100%;
+	border: 0px;
+	border: none;
+	overflow: auto;
+	padding: 0px;
+	margin:0px;
+	background: #ffffff;
+}

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoPane.css
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoPane.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoPane.html?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoPane.html (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoPane.html Thu Sep 28 20:42:39 2006
@@ -0,0 +1,3 @@
+<div dojoAttachPoint="domNode">
+	<iframe dojoAttachPoint="demoNode"></iframe>
+</div>

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/DemoPane.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/SourcePane.css
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/SourcePane.css?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/SourcePane.css (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/SourcePane.css Thu Sep 28 20:42:39 2006
@@ -0,0 +1,20 @@
+.sourcePane {
+	width: 100%;
+	height: 100%;
+	padding: 0px;
+	margin: 0px;
+	overflow: hidden;
+}
+
+.sourcePane textarea{
+	width: 100%;
+	height: 100%;
+	border: 0px;
+	overflow: auto;
+	padding: 0px;
+	margin:0px;
+}
+
+* html .sourcePane {
+	overflow: auto;
+}

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/SourcePane.css
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/SourcePane.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/SourcePane.html?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/SourcePane.html (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/SourcePane.html Thu Sep 28 20:42:39 2006
@@ -0,0 +1,3 @@
+<div dojoAttachPoint="domNode">
+	<textarea dojoAttachPoint="sourceNode" rows="100%"></textarea>
+</div>

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/SourcePane.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/general.css
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/general.css?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/general.css (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/general.css Thu Sep 28 20:42:39 2006
@@ -0,0 +1,73 @@
+.demoListWrapper {
+	border:1px solid #dcdbdb;
+	background-color:#f8f8f8;
+	padding:2px;
+}
+
+.demoListContainer {
+	border:1px solid #f0f0f0;
+	background-color:#fff;
+	padding:1em;
+}
+
+.demoSummaryBox {
+	background: #efefef;
+	border:1px solid #dae3ee;
+}
+
+.screenshot {
+	padding:0.65em;
+	width:175px;
+	border-right:1px solid #fafafa;
+	text-align:center;
+}
+
+.demoSummary {
+	margin-bottom:1em;
+}
+
+.demoSummary a:link, .demoSummary a:visited {
+	color:#a6238f;
+	text-decoration:none;
+}
+
+.summaryContainer {
+	border-left:1px solid #ddd;
+}
+
+.summaryContainer h1 {
+	background-color:#e8e8e8;
+	border-bottom: 1px solid #e6e6e6;
+	color:#738fb9;
+	margin:1px;
+	padding:0.5em;
+	font-family:"Lucida Grande", "Tahoma", serif;
+	font-size:1.25em;
+	font-weight:normal;
+}
+
+.summaryContainer h1 .packageSummary {
+	display:block;
+	color:#000;
+	font-size:10px;
+	margin-top:2px;
+}
+
+.summaryContainer .summary {
+	padding:1em;
+}
+
+.summaryContainer .summary p {
+	font-size:0.85em;
+	padding:0;
+	margin:0;
+}
+
+.reflection {
+	background: url("images/demoBoxReflection.gif") repeat-x top left;
+	height:25px;
+}
+
+.view {
+	text-align:right;
+}

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/general.css
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/images/test_thumb.gif
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/images/test_thumb.gif?view=auto&rev=451106
==============================================================================
Binary file - no diff available.

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/images/test_thumb.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/images/viewDemo.png
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/images/viewDemo.png?view=auto&rev=451106
==============================================================================
Binary file - no diff available.

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/demoEngine/templates/images/viewDemo.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/layout.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/layout.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/layout.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/layout.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,121 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.html.layout");
+
+dojo.require("dojo.lang.common");
+dojo.require("dojo.string.extras");
+dojo.require("dojo.html.style");
+dojo.require("dojo.html.layout");
+
+/**
+ * Layout a bunch of child dom nodes within a parent dom node
+ * Input is an array of objects like:
+ * @ container - parent node
+ * @ layoutPriority - "top-bottom" or "left-right"
+ * @ children an array like [ {domNode: foo, layoutAlign: "bottom" }, {domNode: bar, layoutAlign: "client"} ]
+ */
+dojo.widget.html.layout = function(container, children, layoutPriority) {
+	dojo.html.addClass(container, "dojoLayoutContainer");
+
+	// Copy children array and remove elements w/out layout.
+	// Also record each child's position in the input array, for sorting purposes.
+	children = dojo.lang.filter(children, function(child, idx){
+		child.idx = idx;
+		return dojo.lang.inArray(["top","bottom","left","right","client","flood"], child.layoutAlign)
+	});
+
+	// Order the children according to layoutPriority.
+	// Multiple children w/the same layoutPriority will be sorted by their position in the input array.
+	if(layoutPriority && layoutPriority!="none"){
+		var rank = function(child){
+			switch(child.layoutAlign){
+				case "flood":
+					return 1;
+				case "left":
+				case "right":
+					return (layoutPriority=="left-right") ? 2 : 3;
+				case "top":
+				case "bottom":
+					return (layoutPriority=="left-right") ? 3 : 2;
+				default:
+					return 4;
+			}
+		};
+		children.sort(function(a,b){
+			return (rank(a)-rank(b)) || (a.idx - b.idx);
+		});
+	}
+
+	// remaining space (blank area where nothing has been written)
+	var f={
+		top: dojo.html.getPixelValue(container, "padding-top", true),
+		left: dojo.html.getPixelValue(container, "padding-left", true)
+	};
+	dojo.lang.mixin(f, dojo.html.getContentBox(container));
+
+	// set positions/sizes
+	dojo.lang.forEach(children, function(child){
+		var elm=child.domNode;
+		var pos=child.layoutAlign;
+		// set elem to upper left corner of unused space; may move it later
+		with(elm.style){
+			left = f.left+"px";
+			top = f.top+"px";
+			bottom = "auto";
+			right = "auto";
+		}
+		dojo.html.addClass(elm, "dojoAlign" + dojo.string.capitalize(pos));
+
+		// set size && adjust record of remaining space.
+		// note that setting the width of a <div> may affect it's height.
+		// TODO: same is true for widgets but need to implement API to support that
+		if ( (pos=="top")||(pos=="bottom") ) {
+			dojo.html.setMarginBox(elm, { width: f.width });
+			var h = dojo.html.getMarginBox(elm).height;
+			f.height -= h;
+			if(pos=="top"){
+				f.top += h;
+			}else{
+				elm.style.top = f.top + f.height + "px";
+			}
+		}else if(pos=="left" || pos=="right"){
+			var w = dojo.html.getMarginBox(elm).width;
+			// width needs to be set for Firefox (#941)
+			dojo.html.setMarginBox(elm, { width: w, height: f.height });
+
+			f.width -= w;
+			if(pos=="left"){
+				f.left += w;
+			}else{
+				elm.style.left = f.left + f.width + "px";
+			}
+		} else if(pos=="flood" || pos=="client"){
+			dojo.html.setMarginBox(elm, { width: f.width, height: f.height });
+		}
+		
+		// TODO: for widgets I want to call resizeTo(), but for top/bottom
+		// alignment I only want to set the width, and have the size determined
+		// dynamically.  (The thinner you make a div, the more height it consumes.)
+		if(child.onResized){
+			child.onResized();
+		}
+	});
+};
+
+// This is essential CSS to make layout work (it isn't "styling" CSS)
+// make sure that the position:absolute in dojoAlign* overrides other classes
+dojo.html.insertCssText(
+	".dojoLayoutContainer{ position: relative; display: block; }\n" +
+	"body .dojoAlignTop, body .dojoAlignBottom, body .dojoAlignLeft, body .dojoAlignRight { position: absolute; overflow: hidden; }\n" +
+	"body .dojoAlignClient { position: absolute }\n" +
+	".dojoAlignClient { overflow: auto; }\n"
+);
+

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/layout.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/loader.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/loader.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/loader.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/loader.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,843 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.html.loader");
+
+dojo.require("dojo.widget.HtmlWidget");
+dojo.require("dojo.io.*");
+dojo.require("dojo.lang.common");
+dojo.require("dojo.lang.extras");
+
+dojo.require("dojo.experimental");
+
+// as this is a singleton dojo.declare doesnt by us anything here
+dojo.widget.html.loader = new (function(){
+	// summary:
+	// 	loading stuff moved out of contentpane to make it directly accessible by other widgets
+	this.toString = function(){ return "dojo.widget.html.loader"; }
+	var _loader = this;
+
+	// back/forward tracking
+	dojo.addOnLoad(function(){
+		dojo.experimental(_loader.toString());
+		var undo = dojo.evalObjPath("dojo.undo.browser");
+		if(djConfig["preventBackButtonFix"] && undo && !undo.initialState){
+			undo.setInitialState(new trackerObj);
+		}
+	});
+
+	var logger = {};
+	var trackerObj = function(id, data){
+		this.id = id;
+		this.data = data
+	};
+	trackerObj.prototype.handle = function(type){
+		if(typeof dojo == 'undefined'){ return; } // wtf? how can dojo become undef?
+		var wg = dojo.widget.byId(this.id);
+		if(wg){ wg.setContent(this.data, true); }
+	};
+
+	this._log = function(widget, data){
+		// if a loader widget B is a child of loader widget A
+		// we need to destroy all of B's undo if we switch content
+		if(widget.trackHistory){
+			if(!logger[widget.widgetId]){
+				logger[widget.widgetId] = { childrenIds: [], stack:[data] };
+			}var children = logger[widget.widgetId].childrenIds;
+			while(children && children.length){
+				delete logger[children.pop()];
+			}
+			for(var child in widget.children){
+				logger[widget.widgetId].childrenIds = child.widgetId;
+			}
+			dojo.undo.browser.addToHistory(new trackerObj(widget.widgetId, dojo.lang.shallowCopy(data, true)));
+		}
+	}
+
+	// shortCuts
+	var undef = dojo.lang.isUndefined;
+	var isFunc = dojo.lang.isFunction;
+
+
+
+	/************ private needed functions, no need to be part of widget API ***********/
+	// usefull if user wants to prevent default behaviour ie: _setContent("Error...")
+	function handleDefaults(e, handler, useAlert){
+		if(!handler){ handler = "onContentError"; }
+		if(dojo.lang.isString(e)){ e = {_text: e}; }
+		if(!e._text){ e._text = e.toString(); }
+		e.toString = function(){ return this._text; };
+		if(typeof e.returnValue != "boolean"){
+			e.returnValue = true; 
+		}
+		if(typeof e.preventDefault != "function"){
+			e.preventDefault = function(){ this.returnValue = false; };
+		}
+		// call our handler
+		this[handler](e);
+		if(e.returnValue){
+			if(useAlert){
+				alert(e.toString());
+			}else{
+				this.loader.callOnUnLoad.call(this, false);
+				this.onSetContent(e.toString());
+			}
+		}
+	};
+
+	// set up downloader, used by both scripts and content
+	function downloader(bindArgs) {
+		for(var x in this.bindArgs){
+			bindArgs[x] = (undef(bindArgs[x]) ? this.bindArgs[x] : undefined);
+		}
+		var cache = this.cacheContent;
+		if(undef(bindArgs.useCache)){ bindArgs.useCache = cache; }
+		if(undef(bindArgs.preventCache)){ bindArgs.preventCache = !cache; }
+		if(undef(bindArgs.mimetype)){ bindArgs.mimetype = "text/html"; }
+		this.loader.bindObj = dojo.io.bind(bindArgs);
+	};
+
+	// runs addOnLoad/addOnUnLoad functions
+	function stackRunner(st){
+		var err = "", func = null;
+		var scope = this.scriptScope || dojo.global();
+		while(st.length){
+			func = st.shift();
+			try{
+				func.call(scope);
+			}catch(e){
+				err += "\n"+func+" failed: "+e;
+			}
+		}
+		if(err.length){
+			var name = (st== this.loader.addOnLoads) ? "addOnLoad" : "addOnUnLoad";
+			handleDefaults.call(this, name+" failure\n "+err, "onExecError", true);
+		}
+	};
+
+	// push addOnLoad and addOnUnLoad functions onto stack
+	function stackPusher(st, obj, func){
+		if(typeof func == 'undefined') {
+			st.push(obj);
+		}else{
+			st.push(function(){ obj[func](); });
+		}
+	};
+
+	// code saver, collects onLoad, onResized and isLoaded
+	function refreshed(){
+		this.onResized();
+		this.onLoad();
+		this.isLoaded = true;
+	};
+
+	// runs scripts and starts the content parser
+	function asyncParse(data){
+		if(this.executeScripts){
+			this.onExecScript.call(this, data.scripts);
+		}
+		if(this.parseContent){
+			this.onContentParse.call(this);
+		}
+		refreshed.call(this);
+	};
+
+	// run java function
+	function runHandler(){
+		//FIXME: current behaviour is to return false if handler is there, is that intended?
+		if(dojo.lang.isFunction(this.handler)) {
+			this.handler(this, this.containerNode||this.domNode);
+			refreshed.call(this);
+			return false;
+		}
+		return true;
+	};
+
+	// divided up splitAndFixPaths in different parts
+	this.htmlContentBasicFix = function(/*string*/s, /*string||dojo.uri.Uri*/url){
+		// summary:
+		//	strips out <style, <link rel=stylesheet and <title tags
+		//	intended to take out tags that might cause DOM faults
+		var titles = [], styles = [];
+		/************** <title> ***********/
+		// khtml can't attach a <style> or <title> node as child of body
+		var regex = /<title[^>]*>([\s\S]*?)<\/title>/i;
+		var match, attr;
+		while(match = regex.exec(s)){
+			titles.push(match[1]);
+			s = s.substring(0, match.index) + s.substr(match.index + match[0].length);
+		};
+		/****************  cut out all <style> and <link rel="stylesheet" href=".."> **************/
+		regex = /(?:<(style)[^>]*>([\s\S]*?)<\/style>|<link ([^>]*rel=['"]?stylesheet['"]?[^>]*)>)/i;
+		while(match = regex.exec(s)){
+			if(match[1] && match[1].toLowerCase() == "style"){
+				styles.push(dojo.html.fixPathsInCssText(match[2],url));
+			}else if(attr = match[3].match(/href=(['"]?)([^'">]*)\1/i)){
+				styles.push({path: attr[2]});
+			}
+			s = s.substring(0, match.index) + s.substr(match.index + match[0].length);
+		};
+		return {'s': s, 'titles': titles, 'styles': styles};//object
+	};
+
+	this.htmlContentAdjustPaths = function(/*string*/s, /*string||dojo.uri.Uri*/url){
+		// summary:
+		//	adjusts relative paths in content to be relative to current page
+		var tag = "", str = "", tagFix = "", path = "";
+		var attr = [], origPath = "", fix = "";
+
+		// attributepaths one tag can have multiple paths example:
+		// <input src="..." style="url(..)"/> or <a style="url(..)" href="..">
+		// strip out the tag and run fix on that.
+		// this guarantees that we won't run replace on another tag's attribute + it was easier do
+		var regexFindTag = /<[a-z][a-z0-9]*[^>]*\s(?:(?:src|href|style)=[^>])+[^>]*>/i;
+		var regexFindAttr = /\s(src|href|style)=(['"]?)([\w()\[\]\/.,\\'"-:;#=&?\s@]+?)\2/i;
+		// these are the supported protocols, all other is considered relative
+		var regexProtocols = /^(?:[#]|(?:(?:https?|ftps?|file|javascript|mailto|news):))/;
+
+		while(tag = regexFindTag.exec(s)){
+			str += s.substring(0, tag.index);
+			s = s.substring((tag.index + tag[0].length), s.length);
+			tag = tag[0];
+
+			// loop through attributes
+			tagFix = '';
+			while(attr = regexFindAttr.exec(tag)){
+				path = ""; origPath = attr[3];
+				switch(attr[1].toLowerCase()){
+					case "src":// falltrough
+					case "href":
+						if(regexProtocols.exec(origPath)){
+							path = origPath;
+						} else {
+							path = (new dojo.uri.Uri(url, origPath).toString());
+						}
+						break;
+					case "style":// style
+						path = dojo.html.fixPathsInCssText(origPath, url);
+						break;
+					default:
+						path = origPath;
+				}
+
+				fix = " " + attr[1] + "=" + attr[2] + path + attr[2];
+
+				// slices up tag before next attribute check
+				tagFix += tag.substring(0, attr.index) + fix;
+				tag = tag.substring((attr.index + attr[0].length), tag.length);
+			}
+			str += tagFix + tag;
+		}
+		return str+s; // string
+	};
+
+
+	this.htmlContentScripts = function(/*string*/s, /*boolean*/collectScripts){
+		// summary:
+		// 	handles scripts and dojo .require(...) etc calls
+		// NOTE: we need to go through here even if we have executeScripts=false
+		//		 and if we have parseWidgets true 
+		var scripts = [], requires = [], match = [];
+		var attr = "", tmp = null, tag = "", sc = "", str = "";
+		
+		/***************** cut out all <script> tags, push them into scripts array ***************/
+		var regex = /<script([^>]*)>([\s\S]*?)<\/script>/i;
+		var regexSrc = /src=(['"]?)([^"']*)\1/i;
+		var regexDojoJs = /.*(\bdojo\b\.js(?:\.uncompressed\.js)?)$/;
+		var regexInvalid = /(?:var )?\bdjConfig\b(?:[\s]*=[\s]*\{[^}]+\}|\.[\w]*[\s]*=[\s]*[^;\n]*)?;?|dojo\.hostenv\.writeIncludes\(\s*\);?/g;
+		var regexRequires = /dojo\.(?:(?:require(?:After)?(?:If)?)|(?:widget\.(?:manager\.)?registerWidgetPackage)|(?:(?:hostenv\.)?setModulePrefix)|defineNamespace)\((['"]).*?\1\)\s*;?/;
+
+		while(match = regex.exec(s)){
+			if(this.executeScripts && match[1]){
+				if(attr = regexSrc.exec(match[1])){
+					// remove a dojo.js or dojo.js.uncompressed.js from remoteScripts
+					// we declare all files named dojo.js as bad, regardless of path
+					if(regexDojoJs.exec(attr[2])){
+						dojo.debug("Security note! inhibit:"+attr[2]+" from  beeing loaded again.");
+					}else{
+						scripts.push({path: attr[2]});
+					}
+				}
+			}
+			if(match[2]){
+				// remove all invalid variables etc like djConfig and dojo.hostenv.writeIncludes()
+				sc = match[2].replace(regexInvalid, "");
+				if(!sc){ continue; }
+
+				// cut out all dojo .require (...) calls, if we have execute 
+				// scripts false widgets dont get there require calls
+				// takes out possible widgetpackage registration as well
+				while(tmp = regexRequires.exec(sc)){
+					requires.push(tmp[0]);
+					sc = sc.substring(0, tmp.index) + sc.substr(tmp.index + tmp[0].length);
+				}
+				if(collectScripts){
+					scripts.push(sc);
+				}
+			}
+			s = s.substr(0, match.index) + s.substr(match.index + match[0].length);
+		}
+		/******** scan for scriptScope in html eventHandlers 
+					and replace with link to this widget *********/
+		if(collectScripts){
+			var regex = /(<[a-zA-Z][a-zA-Z0-9]*\s[^>]*\S=(['"])[^>]*[^\.\]])scriptScope([^>]*>)/;
+			str = "";
+			while(tag = regex.exec(s)){
+				tmp = ((tag[2]=="'") ? '"': "'");
+				str += s.substring(0, tag.index);
+				s = s.substr(tag.index).replace(regex, "$1dojo.widget.byId("+ tmp + this.widgetId + tmp + ").scriptScope$3");
+			}
+			s = str + s;
+		}
+		return {'s': s, 'requires': requires, 'scripts': scripts}; // object
+	};
+
+		
+	this.splitAndFixPaths = function(/*object*/args){
+		// summary:
+		//	pathfixes, require calls, css stuff and neccesary content clean
+		// args:
+		//	content 		string
+		//	url 			string? or dojo.uri.Uri that that pulled the content in, for path adjust
+		//	adjustPaths		boolean, if true adjust relative paths in content to match this page
+		//	collectScripts	boolean, if true it takes out all <script and <script src=.. tags and collects
+		//					 dojo.require calls in a separate array, usefull for eval
+		//	collectRequires	boolean, if true and collectScripts is false it still collects scripts along with
+		//					 dojo.require calls
+		//	bodyExtract		boolean, if true only return content inside of the body tag
+
+		// return:			{xml: string,
+		//					styles: array, remote style get object {path: /*string*/url}
+		//					requires: array,
+		//					scripts: array, remote scripts get object {path: /*string*/url}
+		//					url: string}
+		if(!args.url) { args.url = "./"; } // point to this page if not set
+		// make sure back/forward buttons dont mess up url.
+		url = new dojo.uri.Uri(location, args.url).toString();
+		var ret = {'xml': 	"",
+				'styles':	[],
+				'titles':	[],
+				'requires':	[],
+				'scripts':	[],
+				'url':		url };
+
+		if(args.content){ // make sure we dont run regexes on empty content
+			var tmp = null, content = args.content;
+			if(args.adjustPaths){
+				content = _loader.htmlContentAdjustPaths.call(this, content, url);
+			}
+
+			tmp = _loader.htmlContentBasicFix.call(this, content, url);
+			content = tmp.s;
+			ret.styles = tmp.styles;
+			ret.titles = tmp.titles;
+
+			if(args.collectRequires || args.collectScripts){
+				tmp = _loader.htmlContentScripts.call(this, content, args.collectScripts);
+				content = tmp.s;
+				ret.requires = tmp.requires;
+				ret.scripts = tmp.scripts;
+			}
+
+			/********* extract content *********/
+			var match = [];
+			if(args.bodyExtract){
+				match = content.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+				if(match) { content = match[1]; }
+			}
+			ret.xml = content;
+		}
+		return ret;// object 
+	};
+
+
+	// the all important startup function
+	this.hookUp = function(/*object*/args){
+		// summary:
+		// 	mixin or extend loader into a widget
+		// args:
+		//	widget: widget reference
+		//	mixin: boolean, default false
+		// 		if mixin true, it will only extend the current widget, not its prototype
+		var widget = args.widget;
+		if(dojo.lang.isString(widget)){
+			if(args.mixin){	
+				dojo.raise(this.toString()+", cant use mixin when widget is a string");
+			 }
+			widget = dojo.evalObjPath(widget);
+		}
+		if(!widget || !(widget instanceof dojo.widget.HtmlWidget)){
+			dojo.raise(this.toString()+" Widget is'nt defined or isnt a HtmlWidget instance"); 
+		}
+		// make sure we dont mixin more than once
+		if(widget.loader && widget.setUrl){ return; }
+
+		// extend widget prototype or mixin this widget instance
+		var widgetProto = (args.mixin) ? widget : widget.constructor.prototype;
+	
+		/********************************************
+		** per widgetImpl variables, mixin into widget 
+		********************************************/
+		// stuff it into a loader obj
+		widget.loader = {
+			isLoaded: false,
+			styleNodes:  [],
+			addOnLoads: [],
+			addOnUnLoads: [],
+			callOnUnLoad:(function(canCall){
+							return function(after){ this.abort();
+								if(canCall){ this.onUnLoad(); }
+								canCall = after;
+							};
+						})(false),
+			bindObj: null,
+			// to disconnect widget
+			unHook: (function(w, wg){
+				var oldProps = {
+					isContainer: w.isContainer,
+					adjustPats: w.adjustPaths,
+					href: w.href,
+					extractContent: w.extractContent,
+					parseContent: w.parseContent,
+					cacheContent: w.cacheContent,
+					bindArgs: w.bindArgs,
+					preload: w.preload,
+					refreshOnShow: w.refreshOnShow,
+					handler: w.handler,
+					trackHistory: w.trackHistory,
+					executeScripts: w.executeScripts,
+					scriptScope: w.scriptScope,
+					// functions
+					postCreate: w.postCreate,
+					show: w.show,
+					refresh: w.refresh,
+					loadContents: w.loadContents,
+					abort: w.abort,
+					destroy: w.destroy,
+					onLoad: w.onLoad,
+					onUnLoad: w.onUnLoad,
+					addOnLoad: w.addOnLoad,
+					addOnUnLoad: w.addOnUnLoad,
+					onDownloadStart: w.onDownloadStart,
+					onDownloadEnd: w.onDownloadEnd,
+					onDownloadError: w.onDownloadError,
+					onContentError: w.onContentError,
+					onExecError: w.onExecError,
+					onSetContent: w.onSetContent,
+					setUrl: w.setUrl,
+					setContent: w.setContent,
+					onContentParse: w.onContentParse,
+					onExecScript: w.onExecScript,
+					setHandler: w.setHandler
+				};
+				return function(){
+					if(wg.abort){ wg.abort(); }
+					// make sure we dont unhook prototype if there is more widgets of this type left
+					if((w != wg) && (dojo.widget.byType(wg.widgetType).length>1)){ return; }
+					for(var x in oldProps){
+						if(oldProps[x]===undefined){
+							delete w[x]; continue;
+						}
+						w[x] = oldProps[x];
+					}
+					delete wg._loader_defined;
+					delete wg.loader;
+				};
+			})(widgetProto, widget)
+		};
+
+		// make sure we dont do this more than once per widget/widgetprototype
+		if(widgetProto._loader_defined || widget._loader_defined){ return; }		
+
+		/**************** private variables *********************/
+
+		// loading options, prototype parts of widgets mixin to prototype
+		dojo.mixin(widgetProto, {
+			// always set to a containerwidget
+			isContainer: true,
+			// fix relative paths in content to fit into this page
+			adjustPaths: 	undef(widgetProto.adjustPaths) ? true : widgetProto.adjustPaths,
+			// only usable on construction, use setUrl or setContent after that
+			href: 			undef(widgetProto.href) ? "" : widgetProto.href,
+			// extract visible content from inside of <body> .... </body>
+			extractContent: undef(widgetProto.extractContent) ? true : widgetProto.extractContent,
+			// construct all widgets that is in content
+			// FIXME: rename to parseWidgets?
+			parseContent: 	undef(widgetProto.parseContent) ? true : widgetProto.parseContent,
+			// use io binds javascript cache, or if false, prevent browsercache
+			cacheContent: 	undef(widgetProto.cacheContent) ? true : widgetProto.cacheContent,
+			// specify  specific  io.bind arguments such as transport and useCache
+			bindArgs:		undef(widgetProto.bindArgs) ? {} : widgetProto.bindArgs,
+			// force load even if widget isnt shown (lazyload setting)
+			preload: 		undef(widgetProto.preload) ? false : widgetProto.preload,
+			// reload content automatically onShow, use with cacheContent = flase
+			refreshOnShow:	undef(widgetProto.refreshOnShow) ? false : widgetProto.refreshOnShow,
+			// name of java function which should generate content
+			handler: 		undef(widgetProto.handler) ? "" : widgetProto.handler,
+			// if true scripts in content will be evaled after content is innerHTML'ed
+			executeScripts: undef(widgetProto.executeScripts) ? false : widgetProto.executeScripts,
+			// log contents (back/forward support)
+			trackHistory:	undef(widgetProto.tracHistory) ? false : widgetProto.trackHistory,
+			scriptScope: null // always overwrite
+		});
+
+		/****************************************************
+		******* public functions, becomes part of widgets API
+		*****************************************************/
+
+		/*********** Public functions that wigets cant overide **********/
+		// set up postCreate, call originalcode before our own
+		widgetProto.postCreate = (function(postCreate){
+			return function(){
+				if(widgetProto.constructor.superclass.postCreate != postCreate){
+					postCreate.apply(this, arguments);
+				}else{
+					widgetProto.constructor.superclass.postCreate.apply(this, arguments);
+				}
+				if(this.handler!==""){ this.setHandler(this.handler); }
+				if(this.isShowing() || this.preload){ 
+					this.loadContents();
+					if(!this.href){ // back/forward save initial state
+						_loader._log(this,(this.domNode||this.containerNode).innerHTML);
+					}
+				}
+			}
+		})(widgetProto.postCreate);
+
+		// set up onShow listener, call original code after this block
+		widgetProto.show = (function(show){
+			return function(){
+				// if refreshOnShow is true, reload the contents every time; otherwise, load only the first time
+				if(this.refreshOnShow){
+					this.refresh();
+				}else{ 
+					this.loadContents();
+				}
+				if((widgetProto.constructor.superclass.show == show) || !isFunc(show)){
+					widgetProto.constructor.superclass.show.apply(this, arguments);
+				}else{
+					show.apply(this, arguments);
+				}
+			};
+		})(widgetProto.show);
+
+		// destroy cleanups, original code in the middle
+		widgetProto.destroy = (function(destroy){
+			return function(destroy){
+				this.onUnLoad();
+				this.abort();
+				this.loader.unHook();
+				if((widgetProto.constructor.superclass.destroy != destroy) && isFunc(destroy)){
+					destroy.apply(this, arguments);
+				}else{
+					widgetProto.constructor.superclass.destroy.apply(this, arguments);
+				}
+			}
+		})(widgetProto.destroy);
+
+
+		/******* Public functions that widgets can overide *****/
+		// set up a refresh function
+		if(!widgetProto.refresh){
+			widgetProto.refresh = function(){
+				this.loader.isLoaded = false;
+				this.loadContents();
+			};
+		}
+
+		// set up html loading contents
+		if(!widgetProto.loadContents){
+			widgetProto.loadContents = function(){
+				if(this.loader.isLoaded){ return; }
+				// javafunction
+				if(isFunc(this.handler)){
+					runHandler.call(this);
+				}else if(this.href !== ""){
+					handleDefaults.call(this, "Loading...", "onDownloadStart");
+					var self = this, url = this.href;
+					downloader.call(this, {
+						url: url,
+						load: function(type, data, xhr){
+							self.onDownloadEnd.call(self, url, data);
+						},
+						error: function(type, err, xhr){
+							// XHR insnt a normal JS object, copy esentials
+							var e = {
+								responseText: xhr.responseText,
+								status: xhr.status,
+								statusText: xhr.statusText,
+								responseHeaders: (xhr.getAllResponseHeaders) ? xhr.getAllResponseHeaders():[],
+								_text: "Error loading '" + url + "' (" + xhr.status + " "+  xhr.statusText + ")"
+							};
+							handleDefaults.call(self, e, "onDownloadError");
+							self.onLoad();
+						}
+					});
+				}
+			};
+		}
+
+		// set up abort
+		if(!widgetProto.abort){
+			widgetProto.abort = function(){
+				if(!this.loader || !this.loader.bindObj || !this.loader.bindObj.abort){ return; }
+				this.loader.bindObj.abort();
+				this.loader.bindObj = null;
+			};
+		}
+
+		// onLoad
+		if(!widgetProto.onLoad){
+			widgetProto.onLoad = function(){
+				stackRunner.call(this, this.loader.addOnLoads);
+				this.loader.isLoaded = true;
+			};
+		}
+
+		// onUnLoad, original code in the middle
+		if(!widgetProto.onUnLoad){
+			widgetProto.onUnLoad = function(){
+				stackRunner.call(this, this.loader.addOnUnLoads);
+				delete this.scriptScope;
+			}
+		}
+
+		// add to onLoad queue
+		if(!widgetProto.addOnLoad){
+			widgetProto.addOnLoad = function(obj, func){
+				stackPusher.call(this, this.loader.addOnLoads, obj, func);
+			};
+		}
+
+		// add to onUnLoad queue 
+		if(!widgetProto.addOnUnLoad){
+			widgetProto.addOnUnLoad = function(obj, func){
+				stackPusher.call(this, this.loader.addOnUnLoads, obj, func);
+			}
+		}
+
+		// script or java errors, preventDefault-able
+		if(!widgetProto.onExecError){
+			widgetProto.onExecError = function(){/*stub*/};
+		}
+	
+		// called on DOM faults, require fault etc in content, preventDefault-able
+		if(!widgetProto.onContentError){
+			widgetProto.onContentError = function(){/*stub*/};
+		}
+	
+		// called when download error occurs, preventDefault-able
+		if(!widgetProto.onDownloadError){
+			widgetProto.onDownloadError = function(){/*stub*/};
+		}
+	
+		// called before download starts, preventDefault-able
+		if(!widgetProto.onDownloadStart){
+			widgetProto.onDownloadStart = function(onDownloadStart){/*stub*/};
+		}
+	
+		// called when download is finished successfully
+		if(!widgetProto.onDownloadEnd){
+			widgetProto.onDownloadEnd = function(url, data){
+				var args =  {content: data,
+							url: url,
+							adjustPaths: this.adjustPaths,
+							collectScripts: this.executeScripts,
+							collectRequires: this.parseContent,
+							bodyExtract: this.extractContent };
+				data = _loader.splitAndFixPaths.call(this, args);
+				this.setContent(data);
+			}
+		}
+
+		// previously called _setContent, widget defined onSetContent can modify content or cancel
+		if(!widgetProto.onSetContent){
+			widgetProto.onSetContent = function(cont){
+				this.destroyChildren();
+		
+				// remove old stylenodes from HEAD
+				var styleNodes = this.loader.styleNodes;
+				while(styleNodes.length){
+					var st = styleNodes.pop();
+					if(st && st.parentNode){
+						st.parentNode.removeChild(st);
+					}
+				}
+		
+				var node = this.containerNode || this.domNode;
+				while(node.firstChild){
+					try{
+						dojo.event.browser.clean(node.firstChild);
+					}catch(e){}
+					node.removeChild(node.firstChild);
+				}
+				try{
+					if(typeof cont != "string"){
+						node.appendChild(cont);
+					}else{
+						try{// hack to deal with domfaults, ie. appending div to tablenodes
+							node.innerHTML = cont;
+						}catch(e){var tmp;
+							(tmp = dojo.doc().createElement("div")).innerHTML = cont;
+							while(tmp.firstChild){
+								node.appendChild(tmp.removeChild(tmp.firstChild));
+							}
+						}
+					}
+				}catch(e){
+					e._text = "Could'nt load content: "+e;
+					var useAlert = (this.loader._onSetContent_err == e._text); // make sure we dont loop
+					this.loader._onSetContent_err = e._text;
+					handleDefaults.call(this, e, "onContentError", useAlert);
+				}
+			};
+		}
+
+		if(!widgetProto.setUrl){
+			widgetProto.setUrl = function(url){
+				this.href = url;
+				this.loader.isLoaded = false;
+				if ( this.preload || this.isShowing() ){
+					this.loadContents();
+				}
+			}
+		}
+
+		if(!widgetProto.setContent){
+			widgetProto.setContent = function(data, dontLog){
+				this.loader.callOnUnLoad.call(this, true);
+		
+				if(!data||dojo.html.isNode(data)){
+					this.onSetContent(data);
+					refreshed.call(this);
+				}else{
+					// need to run splitAndFixPaths? ie. manually setting content
+					// adjustPaths is taken care of inside splitAndFixPaths
+					if(typeof data.xml != 'string'){
+						this.href = ""; // so we can refresh safely
+						var args =  {content: data,
+							url: this.href,
+							adjustPaths: this.adjustPaths,
+							collectScripts: this.executeScripts,
+							collectRequires: this.parseContent,
+							bodyExtract: this.extractContent };
+						data = _loader.splitAndFixPaths.call(this, args); 
+					}else if(data.url!="./"){
+						 this.url = data.url;// backbutton thing
+					}
+					this.onSetContent(data.xml);
+	
+					// insert styles from content (in same order they came in)
+					for(var i = 0, styles = data.styles; i < styles.length; i++){
+						if(styles[i].path){
+							this.loader.styleNodes.push(dojo.html.insertCssFile(styles[i].path));
+						}else{
+							this.loader.styleNodes.push(dojo.html.insertCssText(styles[i]));
+						}
+					}
+		
+					if(this.parseContent){
+						for(var i = 0, requires = data.requires; i < requires.length; i++){
+							try{
+								eval(requires[i]);
+							} catch(e){
+								e._text = "dojo.widget.html.loader.hookUp: error in package loading calls, "+(e.description||e);
+								handleDefaults.call(this, e, "onContentError", true);
+							}
+						}
+					}
+					// need to allow async load, Xdomain uses it
+					// NOTE: on Xdomain loads this can break the sync thread of setContent
+					// 		if you you do any dojo. require(...) etc
+					if(dojo.hostenv.isXDomain && data.requires.length){
+						dojo.addOnLoad(function(){ 
+							asyncParse.call(this, data);
+							if(!dontLog){
+								_loader._log(this, data);
+							}
+						});// this opens a thread need abort undo
+						dontLog = true;
+					}else{
+						asyncParse.call(this, data);
+					}
+				}if(!dontLog){
+// 					_loader._log(this, data);
+				}
+			};
+		}
+
+		if(!widgetProto.onContentParse){
+			widgetProto.onContentParse = function(){
+				var node = this.containerNode || this.domNode;
+				var parser = new dojo.xml.Parse();
+				var frag = parser.parseElement(node, null, true);
+				dojo.widget.getParser().createSubComponents(frag, this);
+			};
+		}
+
+		// previously called _executeScripts
+		if(!widgetProto.onExecScript){
+			widgetProto.onExecScript = function(scripts){
+				// loop through the scripts in the order they came in
+				var self = this, tmp = "", code = "";
+				for(var i = 0; i < scripts.length; i++){ // remotescript
+					if(scripts[i].path){
+						var url = scripts[i].path;
+						downloader.call(this,{
+							'url': 		url,
+							'load': function(type, scriptStr){
+								(function(){tmp = scriptStr; scripts[i] = scriptStr;}).call(self);
+							},
+							'error': function(type, error){
+								error._text = type + " downloading remote script";
+								handleDefaults.call(self, error, "onExecError", true);
+							},
+							'mimetype': "text/plain",
+							'sync':     true
+						});
+						code += tmp;
+					}else{
+						code += scripts[i];
+					}
+				}
+
+				try{
+					// initialize a new anonymous container for our script, dont make it part of this widgets scope chain
+					// instead send in a variable that points to this widget, usefull to connect events to onLoad, onUnLoad etc..
+					delete this.scriptScope;
+					this.scriptScope = new (new Function('_container_', code+'; return this;'))(self);
+				}catch(e){
+					e._text = "Error running scripts from content:\n"+(e.description||e.toString());
+					handleDefaults.call(this, e, "onExecError", true);
+				}
+			};
+		}
+
+		// Generate content from given java function
+		if(!widgetProto.setHandler){
+			widgetProto.setHandler = function(handler) {
+				var fcn = dojo.lang.isFunction(handler) ? handler : window[handler];
+				if(!isFunc(fcn)) {
+					// FIXME: needs testing! somebody with java knowledge needs to try this
+					handleDefaults.call(this, "Unable to set handler, '" + handler + "' not a function.", "onExecError", true);
+					return;
+				}
+				this.handler = function() {
+					return fcn.apply(this, arguments);
+				};
+			};
+		}
+
+		// make sure we extend this widget only once
+		widgetProto._loader_defined = true;
+	};
+
+
+})();

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/loader.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/stabile.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/stabile.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/stabile.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/stabile.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,213 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+// Maintain state of widgets when user hits back/forward button
+
+dojo.provide("dojo.widget.html.stabile");
+
+dojo.widget.html.stabile = {
+	// Characters to quote in single-quoted regexprs
+	_sqQuotables: new RegExp("([\\\\'])", "g"),
+
+	// Current depth.
+	_depth: 0,
+
+	// Set to true when calling v.toString, to sniff for infinite
+	// recursion.
+	_recur: false,
+
+	// Levels of nesting of Array and object displays.
+	// If when >= depth, no display or array or object internals.
+	depthLimit: 2
+};
+
+
+
+
+
+//// PUBLIC METHODS
+
+// Get the state stored for the widget with the given ID, or undefined
+// if none.
+// 
+dojo.widget.html.stabile.getState = function(id){
+	dojo.widget.html.stabile.setup();
+	return dojo.widget.html.stabile.widgetState[id];
+}
+
+
+// Set the state stored for the widget with the given ID.  If isCommit
+// is true, commits all widget state to more stable storage.
+// 
+dojo.widget.html.stabile.setState = function(id, state, isCommit){
+	dojo.widget.html.stabile.setup();
+	dojo.widget.html.stabile.widgetState[id] = state;
+	if(isCommit){
+		dojo.widget.html.stabile.commit(dojo.widget.html.stabile.widgetState);
+	}
+}
+
+
+// Sets up widgetState: a hash keyed by widgetId, maps to an object
+// or array writable with "describe".  If there is data in the widget
+// storage area, use it, otherwise initialize an empty object.
+// 
+dojo.widget.html.stabile.setup = function(){
+	if(!dojo.widget.html.stabile.widgetState){
+		var text = dojo.widget.html.stabile.getStorage().value;
+		dojo.widget.html.stabile.widgetState = text ? dj_eval("("+text+")") : {};
+	}
+}
+
+
+// Commits all widget state to more stable storage, so if the user
+// navigates away and returns, it can be restored.
+// 
+dojo.widget.html.stabile.commit = function(state){
+	dojo.widget.html.stabile.getStorage().value = dojo.widget.html.stabile.description(state);
+}
+
+// Return a JSON "description string" for the given value.
+// Supports only core JavaScript types with literals, plus Date,
+// and cyclic structures are unsupported.
+// showAll defaults to false -- if true, this becomes a simple symbolic
+// object dumper, but you cannot "eval" the output.
+//
+dojo.widget.html.stabile.description = function(v, showAll){
+	// Save and later restore dojo.widget.html.stabile._depth;
+	var depth = dojo.widget.html.stabile._depth;
+
+	var describeThis = function() {
+		 return this.description(this, true);
+	} 
+	
+	try {
+
+		if(v===void(0)){
+			return "undefined";
+		}
+		if(v===null){
+			return "null";
+		}
+		if(typeof(v)=="boolean" || typeof(v)=="number"
+		    || v instanceof Boolean || v instanceof Number){
+			return v.toString();
+		}
+
+		if(typeof(v)=="string" || v instanceof String){
+			// Quote strings and their contents as required.
+			// Replacing by $& fails in IE 5.0
+			var v1 = v.replace(dojo.widget.html.stabile._sqQuotables, "\\$1"); 
+			v1 = v1.replace(/\n/g, "\\n");
+			v1 = v1.replace(/\r/g, "\\r");
+			// Any other important special cases?
+			return "'"+v1+"'";
+		}
+
+		if(v instanceof Date){
+			// Create a data constructor.
+			return "new Date("+d.getFullYear+","+d.getMonth()+","+d.getDate()+")";
+		}
+
+		var d;
+		if(v instanceof Array || v.push){
+			// "push" test needed for KHTML/Safari, don't know why -cp
+
+			if(depth>=dojo.widget.html.stabile.depthLimit)
+			  return "[ ... ]";
+
+			d = "[";
+			var first = true;
+			dojo.widget.html.stabile._depth++;
+			for(var i=0; i<v.length; i++){
+				// Skip functions and undefined values
+				// if(v[i]==undef || typeof(v[i])=="function")
+				//   continue;
+				if(first){
+					first = false;
+				}else{
+					d += ",";
+				}
+				d+=arguments.callee(v[i], showAll);
+			}
+			return d+"]";
+		}
+
+		if(v.constructor==Object
+		    || v.toString==describeThis){
+			if(depth>=dojo.widget.html.stabile.depthLimit)
+			  return "{ ... }";
+
+			// Instanceof Hash is good, or if we just use Objects,
+			// we can say v.constructor==Object.
+			// IE (5?) lacks hasOwnProperty, but perhaps objects do not always
+			// have prototypes??
+			if(typeof(v.hasOwnProperty)!="function" && v.prototype){
+				throw new Error("description: "+v+" not supported by script engine");
+			}
+			var first = true;
+			d = "{";
+			dojo.widget.html.stabile._depth++;
+			for(var key in v){
+				// Skip values that are functions or undefined.
+				if(v[key]==void(0) || typeof(v[key])=="function")
+					continue;
+				if(first){
+					first = false;
+				}else{
+					d += ", ";
+				}
+				var kd = key;
+				// If the key is not a legal identifier, use its description.
+				// For strings this will quote the stirng.
+				if(!kd.match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)){
+					kd = arguments.callee(key, showAll);
+				}
+				d += kd+": "+arguments.callee(v[key], showAll);
+			}
+			return d+"}";
+		}
+
+		if(showAll){
+			if(dojo.widget.html.stabile._recur){
+				// Save the original definitions of toString;
+				var objectToString = Object.prototype.toString;
+				return objectToString.apply(v, []);
+			}else{
+				dojo.widget.html.stabile._recur = true;
+				return v.toString();
+			}
+		}else{
+			// log("Description? "+v.toString()+", "+typeof(v));
+			throw new Error("Unknown type: "+v);
+			return "'unknown'";
+		}
+
+	} finally {
+		// Always restore the global current depth.
+		dojo.widget.html.stabile._depth = depth;
+	}
+
+}
+
+
+
+//// PRIVATE TO MODULE
+
+// Gets an object (form field) with a read/write "value" property.
+// 
+dojo.widget.html.stabile.getStorage = function(){
+	if (dojo.widget.html.stabile.dataField) {
+		return dojo.widget.html.stabile.dataField;
+	}
+	var form = document.forms._dojo_form;
+	return dojo.widget.html.stabile.dataField = form ? form.stabile : {value: ""};
+}
+

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/html/stabile.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/DropdownDatePicker.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/DropdownDatePicker.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/DropdownDatePicker.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/DropdownDatePicker.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,13 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+({
+		selectDate: "Select a date"
+})

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/DropdownDatePicker.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/DropdownTimePicker.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/DropdownTimePicker.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/DropdownTimePicker.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/DropdownTimePicker.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,13 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+({
+		selectTime: "Select time"
+})

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/DropdownTimePicker.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/TimePicker.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/TimePicker.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/TimePicker.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/TimePicker.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,13 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+({
+		any: "any"
+})

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/TimePicker.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/fr/validate.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/fr/validate.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/fr/validate.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/fr/validate.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,15 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+({
+		invalidMessage: "* La valeur saisie est incorrecte.",
+		missingMessage: "* Cette valeur est obligatoire.",
+		rangeMessage: "* Cette valeur est hors limites."
+})

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/fr/validate.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/ja/validate.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/ja/validate.js?view=auto&rev=451106
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/ja/validate.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/nls/ja/validate.js Thu Sep 28 20:42:39 2006
@@ -0,0 +1,16 @@
+/*
+	Copyright (c) 2004-2006, The Dojo Foundation
+	All Rights Reserved.
+
+	Licensed under the Academic Free License version 2.1 or above OR the
+	modified BSD license. For more information on Dojo licensing, see:
+
+		http://dojotoolkit.org/community/licensing.shtml
+*/
+
+/*<?xml version="1.0" encoding="UTF-8" ?>*/
+({
+		invalidMessage: "* 入力したデータに該当するものがありません。",
+		missingMessage: "* 入力が必須です。",
+		rangeMessage: "* 入力した数値は選択範囲外です。"
+})