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