You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by he...@apache.org on 2006/11/13 23:55:14 UTC

svn commit: r474551 [45/49] - in /struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo: ./ src/ src/alg/ src/animation/ src/cal/ src/charting/ src/charting/svg/ src/charting/vml/ src/collections/ src/crypto/ src/data/ src/data/cs...

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoItem.html
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoItem.html?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoItem.html (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoItem.html Mon Nov 13 14:54:45 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: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoItem.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoNavigator.css
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoNavigator.css?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoNavigator.css (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoNavigator.css Mon Nov 13 14:54:45 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: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoNavigator.css
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoNavigator.html
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoNavigator.html?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoNavigator.html (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoNavigator.html Mon Nov 13 14:54:45 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: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoNavigator.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoPane.css
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoPane.css?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoPane.css (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoPane.css Mon Nov 13 14:54:45 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: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoPane.css
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoPane.html
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoPane.html?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoPane.html (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoPane.html Mon Nov 13 14:54:45 2006
@@ -0,0 +1,3 @@
+<div dojoAttachPoint="domNode">
+	<iframe dojoAttachPoint="demoNode"></iframe>
+</div>

Propchange: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/DemoPane.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/SourcePane.css
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/SourcePane.css?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/SourcePane.css (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/SourcePane.css Mon Nov 13 14:54:45 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: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/SourcePane.css
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/SourcePane.html
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/SourcePane.html?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/SourcePane.html (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/SourcePane.html Mon Nov 13 14:54:45 2006
@@ -0,0 +1,3 @@
+<div dojoAttachPoint="domNode">
+	<textarea dojoAttachPoint="sourceNode" rows="100%"></textarea>
+</div>

Propchange: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/SourcePane.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/general.css
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/general.css?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/general.css (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/general.css Mon Nov 13 14:54:45 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: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/general.css
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/images/test_thumb.gif
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/images/test_thumb.gif?view=auto&rev=474551
==============================================================================
Binary file - no diff available.

Propchange: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/images/test_thumb.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/images/viewDemo.png
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/images/viewDemo.png?view=auto&rev=474551
==============================================================================
Binary file - no diff available.

Propchange: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/demoEngine/templates/images/viewDemo.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/html/layout.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/html/layout.js?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/html/layout.js (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/html/layout.js Mon Nov 13 14:54:45 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: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/html/layout.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/html/loader.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/html/loader.js?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/html/loader.js (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/html/loader.js Mon Nov 13 14:54:45 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 doesn't buy 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 ***********/
+	// useful 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 don't get their 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, useful 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 don't 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 don't 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 isn't defined or isn't a HtmlWidget instance"); 
+		}
+		// make sure we don't 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 don't unhook prototype if there are 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 don't do this more than once per widget/widgetprototype
+		if(widgetProto._loader_defined || widget._loader_defined){ return; }		
+
+		/**************** private variables *********************/
+
+		// loading options, prototype parts of widget's 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 isn't 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 widget's 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 don't 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, don'tLog){
+				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(!don'tLog){
+								_loader._log(this, data);
+							}
+						});// this opens a thread need abort undo
+						don'tLog = true;
+					}else{
+						asyncParse.call(this, data);
+					}
+				}if(!don'tLog){
+// 					_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, don't make it part of this widget's scope chain
+					// instead send in a variable that points to this widget, useful 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: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/html/loader.js
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/html/stabile.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/html/stabile.js?view=diff&rev=474551&r1=474550&r2=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/html/stabile.js (original)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/html/stabile.js Mon Nov 13 14:54:45 2006
@@ -1,5 +1,5 @@
 /*
-	Copyright (c) 2004-2005, The Dojo Foundation
+	Copyright (c) 2004-2006, The Dojo Foundation
 	All Rights Reserved.
 
 	Licensed under the Academic Free License version 2.1 or above OR the
@@ -8,201 +8,206 @@
 		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;
-
-	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 += ", ";
-				}
-				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){
-				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: ""};
-}
-
+// 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: ""};
+}
+

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/DropdownDatePicker.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/DropdownDatePicker.js?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/DropdownDatePicker.js (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/DropdownDatePicker.js Mon Nov 13 14:54:45 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: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/DropdownDatePicker.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/DropdownTimePicker.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/DropdownTimePicker.js?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/DropdownTimePicker.js (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/DropdownTimePicker.js Mon Nov 13 14:54:45 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: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/DropdownTimePicker.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/TimePicker.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/TimePicker.js?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/TimePicker.js (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/TimePicker.js Mon Nov 13 14:54:45 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: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/TimePicker.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/fr/validate.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/fr/validate.js?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/fr/validate.js (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/fr/validate.js Mon Nov 13 14:54:45 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: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/fr/validate.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/ja/validate.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/ja/validate.js?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/ja/validate.js (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/ja/validate.js Mon Nov 13 14:54:45 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: "* 入力した数値は選択範囲外です。"
+})

Propchange: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/ja/validate.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/validate.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/validate.js?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/validate.js (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/validate.js Mon Nov 13 14:54:45 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: "* The value entered is not valid.",
+		missingMessage: "* This value is required.",
+		rangeMessage: "* This value is out of range."
+})

Propchange: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/validate.js
------------------------------------------------------------------------------
    svn:eol-style = native

Added: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/zh-cn/validate.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/zh-cn/validate.js?view=auto&rev=474551
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/zh-cn/validate.js (added)
+++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/zh-cn/validate.js Mon Nov 13 14:54:45 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: "* 非法的输入值。",
+		missingMessage: "* 此值是必须的。",
+		rangeMessage: "* 输入数据超出值域。"
+})

Propchange: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/static/dojo/src/widget/nls/zh-cn/validate.js
------------------------------------------------------------------------------
    svn:eol-style = native