You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2012/10/24 18:51:19 UTC

[2/15] git commit: Reorganize a number of assets under META-INF/assets

Reorganize a number of assets under META-INF/assets


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/02ed252a
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/02ed252a
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/02ed252a

Branch: refs/heads/5.4-js-rewrite
Commit: 02ed252a4d1eca4db1b1a536e790552f2c0c0c8e
Parents: 1ab1c6c
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Wed Oct 24 09:30:14 2012 -0700
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Wed Oct 24 09:30:14 2012 -0700

----------------------------------------------------------------------
 .../services/javascript/CoreJavaScriptStack.java   |    2 +-
 .../apache/tapestry5/services/TapestryModule.java  |   14 +-
 .../META-INF/assets/tapestry5/ajax-loader.gif      |  Bin 0 -> 1849 bytes
 .../tapestry5/datepicker_106/css/datepicker.css    |  143 +
 .../tapestry5/datepicker_106/images/arrow.left.png |  Bin 0 -> 181 bytes
 .../datepicker_106/images/arrow.right.png          |  Bin 0 -> 181 bytes
 .../tapestry5/datepicker_106/js/datepicker.js      |  738 ++
 .../META-INF/assets/tapestry5/default.css          |  498 ++
 .../META-INF/assets/tapestry5/deselect.png         |  Bin 0 -> 304 bytes
 .../META-INF/assets/tapestry5/require_2.0.2.js     | 2037 +++++
 .../tapestry5/scriptaculous_1_9_0/builder.js       |  136 +
 .../tapestry5/scriptaculous_1_9_0/controls.js      |  965 +++
 .../tapestry5/scriptaculous_1_9_0/dragdrop.js      |  974 +++
 .../tapestry5/scriptaculous_1_9_0/effects.js       | 1123 +++
 .../tapestry5/scriptaculous_1_9_0/prototype.js     | 6082 +++++++++++++++
 .../tapestry5/scriptaculous_1_9_0/scriptaculous.js |   59 +
 .../assets/tapestry5/scriptaculous_1_9_0/slider.js |  275 +
 .../assets/tapestry5/scriptaculous_1_9_0/sound.js  |   59 +
 .../tapestry5/scriptaculous_1_9_0/unittest.js      |  568 ++
 .../resources/META-INF/assets/tapestry5/spacer.gif |  Bin 0 -> 43 bytes
 .../META-INF/assets/tapestry5/t5-alerts.css        |   61 +
 .../META-INF/assets/tapestry5/t53-compatibility.js |   49 +
 .../META-INF/assets/tapestry5/tapestry-console.css |   42 +
 .../META-INF/assets/tapestry5/tapestry.js          |  954 +++
 .../META-INF/assets/tapestry5/tree-branch.png      |  Bin 0 -> 141 bytes
 .../META-INF/assets/tapestry5/tree-branchend.png   |  Bin 0 -> 137 bytes
 .../META-INF/assets/tapestry5/tree-sprites.png     |  Bin 0 -> 1109 bytes
 .../META-INF/assets/tapestry5/tree-vpipe.png       |  Bin 0 -> 107 bytes
 .../resources/META-INF/assets/tapestry5/tree.css   |   92 +
 .../resources/META-INF/assets/tapestry5/tree.js    |  198 +
 .../resources/org/apache/tapestry5/ajax-loader.gif |  Bin 1849 -> 0 bytes
 .../tapestry5/datepicker_106/css/datepicker.css    |  143 -
 .../tapestry5/datepicker_106/images/arrow.left.png |  Bin 181 -> 0 bytes
 .../datepicker_106/images/arrow.right.png          |  Bin 181 -> 0 bytes
 .../tapestry5/datepicker_106/js/datepicker.js      |  738 --
 .../resources/org/apache/tapestry5/default.css     |  498 --
 .../resources/org/apache/tapestry5/deselect.png    |  Bin 304 -> 0 bytes
 .../org/apache/tapestry5/require_2.0.2.js          | 2037 -----
 .../tapestry5/scriptaculous_1_9_0/builder.js       |  136 -
 .../tapestry5/scriptaculous_1_9_0/controls.js      |  965 ---
 .../tapestry5/scriptaculous_1_9_0/dragdrop.js      |  974 ---
 .../tapestry5/scriptaculous_1_9_0/effects.js       | 1123 ---
 .../tapestry5/scriptaculous_1_9_0/prototype.js     | 6082 ---------------
 .../tapestry5/scriptaculous_1_9_0/scriptaculous.js |   59 -
 .../apache/tapestry5/scriptaculous_1_9_0/slider.js |  275 -
 .../apache/tapestry5/scriptaculous_1_9_0/sound.js  |   59 -
 .../tapestry5/scriptaculous_1_9_0/unittest.js      |  568 --
 .../main/resources/org/apache/tapestry5/spacer.gif |  Bin 43 -> 0 bytes
 .../resources/org/apache/tapestry5/t5-alerts.css   |   61 -
 .../org/apache/tapestry5/t53-compatibility.js      |   49 -
 .../org/apache/tapestry5/tapestry-console.css      |   42 -
 .../resources/org/apache/tapestry5/tapestry.js     |  954 ---
 .../resources/org/apache/tapestry5/tree-branch.png |  Bin 141 -> 0 bytes
 .../org/apache/tapestry5/tree-branchend.png        |  Bin 137 -> 0 bytes
 .../org/apache/tapestry5/tree-sprites.png          |  Bin 1109 -> 0 bytes
 .../resources/org/apache/tapestry5/tree-vpipe.png  |  Bin 107 -> 0 bytes
 .../main/resources/org/apache/tapestry5/tree.css   |   92 -
 .../main/resources/org/apache/tapestry5/tree.js    |  198 -
 58 files changed, 15061 insertions(+), 15061 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/02ed252a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/CoreJavaScriptStack.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/CoreJavaScriptStack.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/CoreJavaScriptStack.java
index 143cdeb..91899be 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/CoreJavaScriptStack.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/CoreJavaScriptStack.java
@@ -41,7 +41,7 @@ public class CoreJavaScriptStack implements JavaScriptStack
 
     private final Flow<Asset> javaScriptStack, stylesheetStack;
 
-    private static final String ROOT = "org/apache/tapestry5";
+    private static final String ROOT = "${tapestry.asset.root}";
 
     private static final String[] CORE_JAVASCRIPT = new String[]
             {

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/02ed252a/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
index d7b30e2..6dc0e56 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
@@ -2118,7 +2118,7 @@ public final class TapestryModule
 
         configuration.add(SymbolConstants.DEFAULT_STYLESHEET, "");
 
-        configuration.add("tapestry.spacer-image", "classpath:/org/apache/tapestry5/spacer.gif");
+        configuration.add("tapestry.spacer-image", "classpath:META-INF/assets/tapestry5/spacer.gif");
 
         configuration.add(SymbolConstants.PRODUCTION_MODE, true);
 
@@ -2139,13 +2139,13 @@ public final class TapestryModule
         // files deleted between scriptaculous releases to be accidentally left lying around).
         // There's also a ClasspathAliasManager contribution based on the path.
 
-        configuration.add(SymbolConstants.SCRIPTACULOUS, "classpath:${tapestry.scriptaculous.path}");
-        configuration.add("tapestry.scriptaculous.path", "org/apache/tapestry5/scriptaculous_1_9_0");
+        configuration.add("tapestry.asset.root", "META-INF/assets/tapestry5");
+
+        configuration.add(SymbolConstants.SCRIPTACULOUS, "${tapestry.asset.root}/scriptaculous_1_9_0");
 
         // Likewise for WebFX DatePicker, currently version 1.0.6
 
-        configuration.add("tapestry.datepicker.path", "org/apache/tapestry5/datepicker_106");
-        configuration.add(SymbolConstants.DATEPICKER, "classpath:${tapestry.datepicker.path}");
+        configuration.add(SymbolConstants.DATEPICKER, "${tapestry.asset.root}/datepicker_106");
 
         configuration.add(SymbolConstants.PERSISTENCE_STRATEGY, PersistenceConstants.SESSION);
 
@@ -2206,14 +2206,14 @@ public final class TapestryModule
         // By default, no page is on the whitelist unless it has the @WhitelistAccessOnly annotation
         configuration.add(MetaDataConstants.WHITELIST_ONLY_PAGE, false);
 
-        configuration.add(SymbolConstants.REQUIRE_JS, "classpath:org/apache/tapestry5/require_2.0.2.js");
+        configuration.add(SymbolConstants.REQUIRE_JS, "${tapestry.asset.root}/require_2.0.2.js");
         configuration.add(SymbolConstants.CONTEXT_PATH, "");
 
         // Leaving this as the default results in a runtime error logged to the console (and a default password is used);
         // you are expected to override this symbol.
         configuration.add(SymbolConstants.HMAC_PASSPHRASE, "");
 
-        configuration.add(SymbolConstants.BOOTSTRAP_ROOT, "classpath:META-INF/assets/tapestry5/bootstrap_2_1_1");
+        configuration.add(SymbolConstants.BOOTSTRAP_ROOT, "${tapestry.asset.root}/bootstrap_2_1_1");
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/02ed252a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/ajax-loader.gif
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/ajax-loader.gif b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/ajax-loader.gif
new file mode 100644
index 0000000..e1cafab
Binary files /dev/null and b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/ajax-loader.gif differ

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/02ed252a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/css/datepicker.css
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/css/datepicker.css b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/css/datepicker.css
new file mode 100644
index 0000000..77d9c02
--- /dev/null
+++ b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/css/datepicker.css
@@ -0,0 +1,143 @@
+.datePicker {
+    border: 1px solid WindowText;
+    background: Window;
+    width: 170px;
+    padding: 0px;
+    cursor: default;
+    -moz-user-focus: normal;
+}
+
+.datePicker td {
+    font: smallcaption;
+    font: small-caption;
+    text-align: center;
+    color: WindowText;
+    cursor: default;
+    font-weight: normal !important;
+    -moz-user-select: none;
+    padding: 0;
+}
+
+.datePicker td.red {
+    color: red;
+}
+
+.datePicker .header {
+    background: Window;
+    padding: 3px;
+    border-bottom: 1px solid WindowText;
+}
+
+.datePicker .headerTable {
+    width: 100%;
+}
+
+.datePicker .footer {
+    padding: 3px;
+}
+
+.datePicker .footerTable {
+    width: 100%;
+}
+
+.datePicker .grid {
+    padding: 3px;
+}
+
+.datePicker .gridTable {
+    width: 100%;
+}
+
+.datePicker .gridTable td {
+    width: 14.3%;
+}
+
+.datePicker .gridTable .daysRow td {
+    font-weight: bold !important;
+    border-bottom: 1px solid ThreeDDarkShadow;
+}
+
+.datePicker .grid .gridTable .upperLine {
+    width: 100%;
+    height: 2px;
+    overflow: hidden;
+    background: transparent;
+}
+
+.datePicker td.today {
+    font-weight: bold !important;
+}
+
+.datePicker td.selected {
+    background: Highlight;
+    color: HighlightText !important;
+}
+
+.datePicker td.labelContainer {
+    width: 100%;
+}
+
+.datePicker td .topLabel {
+    color: CaptionText;
+    display: block;
+    font-weight: bold !important;
+    width: 100%;
+    text-decoration: none;
+
+}
+
+.datePicker td.filler {
+    width: 100%;
+}
+
+.datePicker button {
+    border-width: 1px;
+    font: Caption;
+    font-weight: normal !important;
+    display: block;
+}
+
+.datePicker .previousButton {
+    background: buttonface url("../images/arrow.left.png") no-repeat center center;
+}
+
+.datePicker .nextButton {
+    background: buttonface url("../images/arrow.right.png") no-repeat center center;
+}
+
+.datePicker .previousButton,
+.datePicker .nextButton {
+    width: 14px;
+    height: 14px;
+}
+
+.datePicker .todayButton,
+.datePicker .noneButton {
+    width: 50px;
+}
+
+.datePicker .labelPopup {
+    position: absolute;
+    min-width: 130px;
+    background: Window;
+    border: 1px solid WindowText;
+    padding: 1px;
+}
+
+.datePicker .labelPopup a {
+    width: 100%;
+    display: block;
+    color: WindowText;
+    text-decoration: none;
+    white-space: nowrap;
+}
+
+.datePicker .labelPopup a:hover {
+    background: Highlight;
+    color: HighlightText;
+}
+
+.datePicker .labelPopup a.selected {
+    font-weight: bold;
+}
+

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/02ed252a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/images/arrow.left.png
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/images/arrow.left.png b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/images/arrow.left.png
new file mode 100644
index 0000000..93085aa
Binary files /dev/null and b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/images/arrow.left.png differ

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/02ed252a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/images/arrow.right.png
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/images/arrow.right.png b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/images/arrow.right.png
new file mode 100644
index 0000000..79abee5
Binary files /dev/null and b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/images/arrow.right.png differ

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/02ed252a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/js/datepicker.js
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/js/datepicker.js b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/js/datepicker.js
new file mode 100644
index 0000000..5033ad4
--- /dev/null
+++ b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/datepicker_106/js/datepicker.js
@@ -0,0 +1,738 @@
+/*----------------------------------------------------------------------------\
+|                              Date Picker 1.06                               |
+|-----------------------------------------------------------------------------|
+|                         Created by Erik Arvidsson                           |
+|                  (http://webfx.eae.net/contact.html#erik)                   |
+|                      For WebFX (http://webfx.eae.net/)                      |
+|-----------------------------------------------------------------------------|
+|                            A DOM based Date Picker                          |
+|-----------------------------------------------------------------------------|
+|       Copyright (c) 1999, 2002, 2002, 2003, 2004, 2006 Erik Arvidsson       |
+|-----------------------------------------------------------------------------|
+| Licensed under the Apache License, Version 2.0 (the "License"); you may not |
+| use this file except in compliance with the License.  You may obtain a copy |
+| of the License at http://www.apache.org/licenses/LICENSE-2.0                |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| Unless  required  by  applicable law or  agreed  to  in  writing,  software |
+| distributed under the License is distributed on an  "AS IS" BASIS,  WITHOUT |
+| WARRANTIES OR  CONDITIONS OF ANY KIND,  either express or implied.  See the |
+| License  for the  specific language  governing permissions  and limitations |
+| under the License.                                                          |
+|-----------------------------------------------------------------------------|
+| Dependencies: datepicker.css      Date picker style declarations            |
+|-----------------------------------------------------------------------------|
+| 2002-02-10 | Changed _update method to only update the text nodes instead   |
+|            | rewriting the entire table. Also added support for mouse wheel |
+|            | in IE6.                                                        |
+| 2002-01-14 | Cleaned up for 1.0 public version                              |
+| 2002-01-15 | Replace all innerHTML calls with DOM1 methods                  |
+| 2002-01-18 | Minor IE6 bug that occured when dragging the mouse             |
+| 2002-01-19 | Added a popup that is shown when the user clicks on the month. |
+|            | This allows navigation to 6 adjacent months.                   |
+| 2002-04-10 | Fixed a bug that occured in the popup when a date was selected |
+|            | that caused surroundung months to "overflow"                   |
+|            | This had the effect that one could get two October months      |
+|            | listed.                                                        |
+| 2002-09-06 | I had missed one place were window was used instead of         |
+|            | doc.parentWindow                                               |
+| 2003-08-28 | Added support for ensurin no date overflow when changing       |
+|            | months.                                                        |
+| 2004-01-10 | Adding type on the buttons to ensure they are not submit       |
+|            | buttons. Minor CSS change for CSS2                             |
+| 2006-05-28 | Changed license to Apache Software License 2.0.                |
+| 2011-07-27 | Separated "selected date" and "calendar date" concepts.        |
+|            | Selected date is the date specifically selected by the user to |
+|            | put into the form field.  Calendar date reflects the currently |
+|            | displayed month. These are often, but not always, the same     |
+|            | value.  Separating them simplifies a lot of logic and resolves |
+|            | TAP5-1409. Also somewhat smarter for whether to trigger        |
+|            | onselect when clicking "today" (and/or "none")                 |
+|-----------------------------------------------------------------------------|
+| Created 2001-10-?? | All changes are in the log above. | Updated 2006-05-28 |
+\----------------------------------------------------------------------------*/
+
+// The DatePicker constructor
+// oDate : Date Optional argument representing the date to select
+// Note: some minor modifications for Tapestry, to work well as a popup.
+function DatePicker(oDate)
+{
+    // check arguments
+    if (arguments.length == 0)
+    {
+        this._selectedDate = null;
+        this._calendarDate = new Date;
+        this._selectedInited = false;
+    }
+    else
+    {
+        this._selectedDate = oDate;
+        if (!oDate) 
+        {
+            this._calendarDate = new Date;
+        } else 
+        {
+            this._calendarDate = new Date(oDate);
+        }
+        this._selectedInited = true;
+        
+    }
+
+    this._matrix = [[],[],[],[],[],[],[]];
+    this._showNone = true;
+    this._showToday = true;
+    this._firstWeekDay = 0;	// start week with monday according to standards
+    this._redWeekDay = 6;	// sunday is the default red day.
+}
+
+// two static fields describing the name of the months abd days
+DatePicker.months = [
+    "January", "February", "March", "April",
+    "May", "June", "July", "August",
+    "September", "October", "November", "December"];
+DatePicker.days = ["m", "t", "w", "t", "f", "s", "s"];
+
+
+// Function invoked whenever the selected date changes, whether by
+// navigation or when the user selects a date.
+DatePicker.prototype.onchange = function ()
+{
+};
+
+// onselect is more specified than onchange, and    is triggered only when the user makes a specific selection
+// using the calendar (rather than navigating to a new month). For Tapestry,
+// this will dismiss the popup.
+DatePicker.prototype.onselect = function()
+{
+}
+
+
+// create the nodes inside the date picker
+DatePicker.prototype.create = function (doc)
+{
+    if (doc == null) doc = document;
+
+    this._document = doc;
+
+	// create elements
+    this._el = doc.createElement("div");
+    this._el.className = "datePicker";
+
+	// header
+    var div = doc.createElement("div");
+    div.className = "header";
+    this._el.appendChild(div);
+
+    var headerTable = doc.createElement("table");
+    headerTable.className = "headerTable";
+    headerTable.cellSpacing = 0;
+    div.appendChild(headerTable);
+
+    var tBody = doc.createElement("tbody");
+    headerTable.appendChild(tBody);
+
+    var tr = doc.createElement("tr");
+    tBody.appendChild(tr);
+
+    var td = doc.createElement("td");
+    this._previousMonth = doc.createElement("button");
+    this._previousMonth.className = "previousButton";
+    this._previousMonth.setAttribute("type", "button");
+    td.appendChild(this._previousMonth);
+    tr.appendChild(td);
+
+    td = doc.createElement("td");
+    td.className = "labelContainer";
+    tr.appendChild(td);
+
+    this._topLabel = doc.createElement("a");
+    this._topLabel.className = "topLabel";
+    this._topLabel.href = "#";
+    this._topLabel.appendChild(doc.createTextNode(String.fromCharCode(160)));
+    td.appendChild(this._topLabel);
+
+    this._labelPopup = doc.createElement("div");
+    this._labelPopup.className = "labelPopup";
+	// no insertion
+
+    td = doc.createElement("td");
+    this._nextMonth = doc.createElement("button");
+    this._nextMonth.className = "nextButton";
+    this._nextMonth.setAttribute("type", "button");
+    td.appendChild(this._nextMonth);
+    tr.appendChild(td);
+
+	// grid
+    div = doc.createElement("div");
+    div.className = "grid";
+    this._el.appendChild(div);
+    this._table = div;
+
+	// footer
+    div = doc.createElement("div");
+    div.className = "footer";
+    this._el.appendChild(div);
+
+    var footerTable = doc.createElement("table");
+    footerTable.className = "footerTable";
+    footerTable.cellSpacing = 0;
+    div.appendChild(footerTable);
+
+    tBody = doc.createElement("tbody");
+    footerTable.appendChild(tBody);
+
+    tr = doc.createElement("tr");
+    tBody.appendChild(tr);
+
+    td = doc.createElement("td");
+    this._todayButton = doc.createElement("button");
+    this._todayButton.className = "todayButton";
+    this._todayButton.setAttribute("type", "button");
+    this._todayButton.appendChild(doc.createTextNode("Today"));
+    td.appendChild(this._todayButton);
+    tr.appendChild(td);
+
+    td = doc.createElement("td");
+    td.className = "filler";
+    td.appendChild(doc.createTextNode(String.fromCharCode(160)));
+    tr.appendChild(td);
+
+    td = doc.createElement("td");
+    this._noneButton = doc.createElement("button");
+    this._noneButton.className = "noneButton";
+    this._noneButton.setAttribute("type", "button");
+    this._noneButton.appendChild(doc.createTextNode("None"));
+    td.appendChild(this._noneButton);
+    tr.appendChild(td);
+
+
+    this._createTable(doc);
+
+    this._updateTable();
+    this._setTopLabel();
+
+    if (!this._showNone)
+        this._noneButton.style.visibility = "hidden";
+    if (!this._showToday)
+        this._todayButton.style.visibility = "hidden";
+
+	// IE55+ extension
+    this._previousMonth.hideFocus = true;
+    this._nextMonth.hideFocus = true;
+    this._todayButton.hideFocus = true;
+    this._noneButton.hideFocus = true;
+	// end IE55+ extension
+
+    // hook up events
+    var dp = this;
+	// buttons
+    this._previousMonth.onclick = function ()
+    {
+        dp.goToPreviousMonth();
+    };
+    this._nextMonth.onclick = function ()
+    {
+        dp.goToNextMonth();
+    };
+    this._todayButton.onclick = function ()
+    {
+        dp.goToToday();
+    };
+    this._noneButton.onclick = function ()
+    {
+        //this should always clear the date and trigger onselected... 
+        dp.setDate(null, true);
+    };
+
+    this._el.onselectstart = function ()
+    {
+        return false;
+    };
+
+    this._table.onclick = function (e)
+    {
+        // find event
+        if (e == null) e = doc.parentWindow.event;
+
+		// find td
+        var el = e.target != null ? e.target : e.srcElement;
+        while (el.nodeType != 1)
+            el = el.parentNode;
+        while (el != null && el.tagName && el.tagName.toLowerCase() != "td")
+            el = el.parentNode;
+
+		// if no td found, return
+        if (el == null || el.tagName == null || el.tagName.toLowerCase() != "td")
+            return;
+
+        var d = new Date(dp._calendarDate);
+        var n = Number(el.firstChild.data);
+        if (isNaN(n) || n <= 0 || n == null)
+            return;
+
+        d.setDate(n);
+        dp.setDate(d);
+    };
+
+	// show popup
+    this._topLabel.onclick = function (e)
+    {
+        dp._showLabelPopup();
+        return false;
+    };
+
+    this._el.onkeydown = function (e)
+    {
+        if (e == null) e = doc.parentWindow.event;
+        var kc = e.keyCode != null ? e.keyCode : e.charCode;
+
+        if (kc < 37 || kc > 40) return true;
+
+        var d = new Date(dp._calendarDate).valueOf();
+        if (kc == 37) // left
+            d -= 24 * 60 * 60 * 1000;
+        else if (kc == 39) // right
+            d += 24 * 60 * 60 * 1000;
+        else if (kc == 38) // up
+            d -= 7 * 24 * 60 * 60 * 1000;
+        else if (kc == 40) // down
+            d += 7 * 24 * 60 * 60 * 1000;
+
+        dp.setCalendarDate(new Date(d));
+        return false;
+    }
+
+	// ie6 extension
+    this._el.onmousewheel = function (e)
+    {
+        if (e == null) e = doc.parentWindow.event;
+        var n = - e.wheelDelta / 120;
+        var d = new Date(dp._calendarDate);
+        var m = d.getMonth() + n;
+        d.setMonth(m);
+
+
+        dp.setCalendarDate(d);
+
+        return false;
+    }
+
+    doc.onclick  =  function (e) {
+        var targ;
+        
+         // find event
+        if (e == null) e = doc.parentWindow.event;
+        
+        if (e.target) targ = e.target;
+        else if (e.srcElement) targ = e.srcElement;
+        // find classname 'datePicker' as parent
+        var insideDatePicker = null;
+        var parent = targ.parentNode;
+        while (parent != null) {
+            if (parent.className == 'datePicker' || parent.className == 'labelPopup') {
+                insideDatePicker = parent;
+                break;
+            }
+            parent = parent.parentNode;
+        }
+        
+        if (Tapestry.DateField.activeDateField !=  null) {
+        
+            if (insideDatePicker == null && targ.className != 't-calendar-trigger') {
+                Tapestry.DateField.activeDateField.hidePopup();
+                Tapestry.DateField.activeDateField = null;
+            }
+        }
+    }
+    return this._el;
+};
+
+DatePicker.prototype.setCalendarDate = function(oDate)
+{
+    if (oDate != null) 
+    {
+        //note that calendarDate should never be null!
+        this._calendarDate = oDate;
+    }
+    this._hideLabelPopup();
+    this._setTopLabel();
+    this._updateTable();
+}
+
+DatePicker.prototype.setDate = function (oDate, forceOnSelect)
+{
+
+	// if null then set None
+    if (oDate == null)
+    {
+        //if _selectedDate isn't null, then this is an actual change...
+        //but if it /is/ null, we have to see if we were inited or not. If we weren't inited, then we're 
+        //setting this to null now, and we shouldn't fire a select...
+        //but the problem occurs on subsequent... hm...
+        if (this._selectedDate != null)
+        {
+            this._selectedDate = null;
+            if (typeof this.onchange == "function")
+                this.onchange();
+            this.onselect();
+        } else if (forceOnSelect)
+            this.onselect();
+        //note: setDate must inherently set the calendar date
+        this._selectedInited=true;
+        this.setCalendarDate(null);
+
+        return;
+    }
+
+	// if string or number create a Date object
+    if (typeof oDate == "string" || typeof oDate == "number")
+    {
+        oDate = new Date(oDate);
+    }
+
+	// do not update if not really changed
+    if (this._selectedDate == null || !this._datesAreSame(this._selectedDate, oDate))
+    {
+        this._selectedDate = new Date(oDate);
+    
+        if (typeof this.onchange == "function")
+            this.onchange();
+
+        //so if _selectedInited is false, then the value is different only because we set the value programmatically, post-initialization.
+        //that handles the creation + set event. Subsequent reveals will set it to whatever _selectedDate already was, so it's handled.
+        if (this._selectedInited)
+            this.onselect();
+        else
+            this._selectedInited=true;
+    } else if (forceOnSelect)
+        this.onselect();
+    //note: setDate must inherently set the calendar date
+    this.setCalendarDate(oDate);
+
+}
+
+
+DatePicker.prototype.getDate = function ()
+{
+    if (!this._selectedDate) return null;
+    return new Date(this._selectedDate);	// create a new instance
+}
+
+// creates the table elements and inserts them into the date picker
+DatePicker.prototype._createTable = function (doc)
+{
+    var str, i;
+    var rows = 6;
+    var cols = 7;
+    var currentWeek = 0;
+
+    var table = doc.createElement("table");
+    table.className = "gridTable";
+    table.cellSpacing = 0;
+
+    var tBody = doc.createElement("tbody");
+    table.appendChild(tBody);
+
+	// days row
+    var tr = doc.createElement("tr");
+    tr.className = "daysRow";
+
+    var td, tn;
+    var nbsp = String.fromCharCode(160);
+    for (i = 0; i < cols; i++)
+    {
+        td = doc.createElement("td");
+        td.appendChild(doc.createTextNode(nbsp));
+        tr.appendChild(td);
+    }
+    tBody.appendChild(tr);
+
+	// upper line
+    tr = doc.createElement("tr");
+    td = doc.createElement("td");
+    td.className = "upperLine";
+    td.colSpan = 7;
+    tr.appendChild(td);
+    tBody.appendChild(tr);
+
+	// rest
+    for (i = 0; i < rows; i++)
+    {
+        tr = doc.createElement("tr");
+        for (var j = 0; j < cols; j++)
+        {
+            td = doc.createElement("td");
+            td.appendChild(doc.createTextNode(nbsp));
+            tr.appendChild(td);
+        }
+        tBody.appendChild(tr);
+    }
+    str += "</table>";
+
+    if (this._table != null)
+        this._table.appendChild(table)
+};
+// this method updates all the text nodes inside the table as well
+// as all the classNames on the tds
+DatePicker.prototype._updateTable = function ()
+{
+    // if no element no need to continue
+    if (this._table == null) return;
+
+    var i;
+    var str = "";
+    var rows = 6;
+    var cols = 7;
+    var currentWeek = 0;
+
+    var cells = new Array(rows);
+    this._matrix = new Array(rows)
+    for (i = 0; i < rows; i++)
+    {
+        cells[i] = new Array(cols);
+        this._matrix[i] = new Array(cols);
+    }
+
+	// Set the tmpDate to this month
+    var tmpDate = new Date(this._calendarDate.getFullYear(),
+            this._calendarDate.getMonth(), 1);
+    var today = new Date();
+	// go thorugh all days this month and store the text
+    // and the class name in the cells matrix
+    for (i = 1; i < 32; i++)
+    {
+        tmpDate.setDate(i);
+		// convert to ISO, Monday is 0 and 6 is Sunday
+        var weekDay = ( tmpDate.getDay() + 6 ) % 7;
+        var colIndex = ( weekDay - this._firstWeekDay + 7 ) % 7;
+        if (tmpDate.getMonth() == this._calendarDate.getMonth())
+        {
+
+            var isToday = this._datesAreSame(tmpDate, today);
+
+            cells[currentWeek][colIndex] = { text: "", className: "" };
+
+            if (this._datesAreSame(this._selectedDate, tmpDate)) 
+                cells[currentWeek][colIndex].className += "selected ";
+            if (isToday)
+                cells[currentWeek][colIndex].className += "today ";
+            if (( tmpDate.getDay() + 6 ) % 7 == this._redWeekDay) // ISO
+                cells[currentWeek][colIndex].className += "red";
+
+            cells[currentWeek][colIndex].text =
+            this._matrix[currentWeek][colIndex] = tmpDate.getDate();
+
+            if (colIndex == 6)
+                currentWeek++;
+        }
+    }
+
+	// fix day letter order if not standard
+    var weekDays = DatePicker.days;
+    if (this._firstWeekDay != 0)
+    {
+        weekDays = new Array(7);
+        for (i = 0; i < 7; i++)
+            weekDays[i] = DatePicker.days[ (i + this._firstWeekDay) % 7];
+    }
+
+	// update text in days row
+    var tds = this._table.firstChild.tBodies[0].rows[0].cells;
+    for (i = 0; i < cols; i++)
+        tds[i].firstChild.data = weekDays[i];
+
+	// update the text nodes and class names
+    var trs = this._table.firstChild.tBodies[0].rows;
+    var tmpCell;
+    var nbsp = String.fromCharCode(160);
+    for (var y = 0; y < rows; y++)
+    {
+        for (var x = 0; x < cols; x++)
+        {
+            tmpCell = trs[y + 2].cells[x];
+            if (typeof cells[y][x] != "undefined")
+            {
+                tmpCell.className = cells[y][x].className;
+                tmpCell.firstChild.data = cells[y][x].text;
+            }
+            else
+            {
+                tmpCell.className = "";
+                tmpCell.firstChild.data = nbsp;
+            }
+        }
+    }
+}
+
+// sets the label showing the year and selected month
+DatePicker.prototype._setTopLabel = function ()
+{
+    var str = this._calendarDate.getFullYear() + " " + DatePicker.months[ this._calendarDate.getMonth() ];
+    if (this._topLabel != null)
+        this._topLabel.lastChild.data = str;
+}
+
+DatePicker.prototype.goToNextMonth = function ()
+{
+    var d = new Date(this._calendarDate);
+    d.setDate(Math.min(d.getDate(), DatePicker.getDaysPerMonth(d.getMonth() + 1,
+            d.getFullYear()))); // no need to catch dec -> jan for the year
+    d.setMonth(d.getMonth() + 1);
+    this.setCalendarDate(d);
+}
+
+DatePicker.prototype.goToPreviousMonth = function ()
+{
+    var d = new Date(this._calendarDate);
+    d.setDate(Math.min(d.getDate(), DatePicker.getDaysPerMonth(d.getMonth() - 1,
+            d.getFullYear()))); // no need to catch jan -> dec for the year
+    d.setMonth(d.getMonth() - 1);
+    this.setCalendarDate(d);
+}
+
+DatePicker.prototype.goToToday = function ()
+{
+    //note: small tweak here so that clicking the "Today" button will properly update the selected date and trigger selected
+    //but note that we want this behavior iff "today" is already selected and visible. 
+    //For instance: If you're looking at some date months away from today and want to jump back to today AND today is the selectedDate
+    //then we don't want that to close the calendar.
+    var today = new Date();
+    var forceOnSelect=false;
+    if (this._selectedDate == null || (this._datesAreSame(today, this._selectedDate) && this._calendarDate.getMonth() == today.getMonth() && this._calendarDate.getFullYear() == today.getFullYear())) {
+        //then go ahead and force the selection...
+        forceOnSelect=true;
+    }
+    this.setDate(new Date(), forceOnSelect);//note that setDate calls setCalendarDate...
+}
+
+DatePicker.prototype.setShowToday = function (bShowToday)
+{
+    if (typeof bShowToday == "string")
+        bShowToday = !/false|0|no/i.test(bShowToday);
+
+    if (this._todayButton != null)
+        this._todayButton.style.visibility = bShowToday ? "visible" : "hidden";
+    this._showToday = bShowToday;
+}
+
+DatePicker.prototype.getShowToday = function ()
+{
+    return this._showToday;
+}
+
+DatePicker.prototype.setShowNone = function (bShowNone)
+{
+    if (typeof bShowNone == "string")
+        bShowNone = !/false|0|no/i.test(bShowNone);
+
+    if (this._noneButton != null)
+        this._noneButton.style.visibility = bShowNone ? "visible" : "hidden";
+    this._showNone = bShowNone;
+}
+
+DatePicker.prototype.getShowNone = function ()
+{
+    return this._showNone;
+}
+
+// 0 is monday and 6 is sunday as in the ISO standard
+DatePicker.prototype.setFirstWeekDay = function (nFirstWeekDay)
+{
+    if (this._firstWeekDay != nFirstWeekDay)
+    {
+        this._firstWeekDay = nFirstWeekDay;
+        this._updateTable();
+    }
+}
+
+DatePicker.prototype.getFirstWeekDay = function ()
+{
+    return this._firstWeekDay;
+}
+
+// 0 is monday and 6 is sunday as in the ISO standard
+DatePicker.prototype.setRedWeekDay = function (nRedWeekDay)
+{
+    if (this._redWeekDay != nRedWeekDay)
+    {
+        this._redWeekDay = nRedWeekDay;
+        this._updateTable();
+    }
+}
+
+DatePicker.prototype.getRedWeekDay = function ()
+{
+    return this._redWeekDay;
+}
+
+
+DatePicker.prototype._showLabelPopup = function ()
+{
+
+    var dateContext = function (dp, d)
+    {
+        return function (e)
+        {
+            dp._hideLabelPopup();
+            dp.setCalendarDate(d);
+            return false;
+        };
+    };
+
+    var dp = this;
+
+	// clear all old elements in the popup
+    while (this._labelPopup.hasChildNodes())
+        this._labelPopup.removeChild(this._labelPopup.firstChild);
+
+    var a, tmp, tmp2;
+    for (var i = -3; i < 4; i++)
+    {
+        tmp = new Date(this._calendarDate);
+        tmp2 = new Date(this._calendarDate);	// need another tmp to catch year change when checking leap
+        tmp2.setDate(1);
+        tmp2.setMonth(tmp2.getMonth() + i);
+        tmp.setDate(Math.min(tmp.getDate(), DatePicker.getDaysPerMonth(tmp.getMonth() + i,
+                tmp2.getFullYear())));
+        tmp.setMonth(tmp.getMonth() + i);
+
+        a = this._document.createElement("a");
+        a.href = "javascript:void 0;";
+        a.onclick = dateContext(dp, tmp);
+        a.appendChild(this._document.createTextNode(tmp.getFullYear() + " " +
+                                                    DatePicker.months[ tmp.getMonth() ]));
+        if (i == 0)
+            a.className = "selected";
+        this._labelPopup.appendChild(a);
+    }
+
+    this._topLabel.parentNode.insertBefore(this._labelPopup, this._topLabel.parentNode.firstChild);
+};
+
+DatePicker.prototype._hideLabelPopup = function ()
+{
+    if (this._labelPopup.parentNode)
+        this._labelPopup.parentNode.removeChild(this._labelPopup);
+};
+
+DatePicker.prototype._datesAreSame = function(d1,d2)
+{
+    if (d1 == null && d2 == null)
+        return true;
+    else if (d1 == null)
+        return false;
+    else if (d2 == null)
+        return false;
+    return d1.getDate() == d2.getDate() && d1.getMonth() == d2.getMonth() && d1.getFullYear() == d2.getFullYear();    
+}
+
+DatePicker._daysPerMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
+DatePicker.getDaysPerMonth = function (nMonth, nYear)
+{
+    nMonth = (nMonth + 12) % 12;
+    var res = DatePicker._daysPerMonth[nMonth];
+    if (nMonth == 1)
+    {
+        res += nYear % 4 == 0 && !(nYear % 400 == 0) ? 1 : 0;
+    }
+    return res;
+};

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/02ed252a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/default.css
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/default.css b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/default.css
new file mode 100644
index 0000000..9d4e693
--- /dev/null
+++ b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/default.css
@@ -0,0 +1,498 @@
+/* Tapestry styles all start with "t-" */
+
+
+/** NOTE: No longer used.  Part of transition to Bootstrap. */
+
+DIV.t-error {
+    border: 1px solid red;
+    padding: 0px;
+    margin: 4px 0px;
+}
+
+DIV.t-error DIV.t-banner {
+    padding: 2px;
+    display: block;
+    margin: 0px;
+    background-color: red;
+    color: white;
+    font-weight: bold;
+}
+
+DIV.t-error UL {
+    margin: 2px 0px;
+    background-color: white;
+    color: red;
+}
+
+DIV.t-error LI {
+    margin-left: 20px;
+}
+
+DIV.t-error-single {
+    padding: 2px;
+    display: block;
+    margin: 0px;
+    background-color: red;
+    color: white;
+}
+
+HTML>BODY DIV.t-error LI {
+    margin-left: -20px;
+}
+
+.t-invisible {
+    display: none;
+}
+
+LABEL.t-error {
+    color: red;
+}
+
+INPUT.t-error, TEXTAREA.t-error, SELECT.t-error {
+    border-color: red;
+    font-style: italic;
+    color: red;
+}
+
+IMG.t-error-icon {
+    margin-left: 4px;
+    width: 16px;
+    height: 16px;
+    background: url(field-error-marker.gif);
+}
+
+IMG.t-autoloader-icon {
+    margin-left: 4px;
+    width: 16px;
+    height: 16px;
+    background: url(ajax-loader.gif);
+}
+
+IMG.t-sort-icon {
+    margin-left: 4px;
+}
+
+DIV.t-exception-message {
+    font-style: italic;
+    font-size: 12pt;
+    border: thin dotted silver;
+    margin: 5px 0px;
+    padding: 3px;
+}
+
+DIV.t-exception-report, DIV.t-env-data {
+    font-family: "Trebuchet MS", Arial, sans-serif;
+}
+
+DIV.t-exception-report LI {
+    margin-left: -40px;
+}
+
+DIV.t-exception-report DT, DIV.t-env-data DT {
+    color: green;
+    padding-left: 2px;
+    background-color: #FFFFCF;
+}
+
+DIV.t-exception-report LI {
+    list-style: none;
+}
+
+SPAN.t-exception-class-name {
+    display: block;
+    margin-top: 15px;
+    font-size: 12pt;
+    background-color: #E1E1E1;
+    color: blue;
+    padding: 2px 3px;
+    font-weight: bold;
+}
+
+SPAN.t-exception-stack-controls {
+    display: block;
+    float: right;
+}
+
+UL.t-stack-trace LI {
+    font-family: Monaco, Times, monospace;
+    font-size: 10pt;
+    margin-left: -25px;
+    list-style: square;
+}
+
+LI.t-usercode-frame {
+    font-weight: bold;
+    color: blue;
+}
+
+LI.t-omitted-frame {
+    display: none;
+    color: gray;
+    list-style: square;
+}
+
+H1.t-exception-report {
+    font-family: "Trebuchet MS", Arial, sans-serif;
+    color: red;
+}
+
+DIV.t-exception-report DT:after {
+    content: ":";
+}
+
+DIV.t-exception-report DD, DIV.t-env-data DD {
+    margin-left: 10px;
+}
+
+TABLE.t-data-table {
+    border-collapse: collapse;
+    margin: 0px;
+    padding: 2px;
+}
+
+TABLE.t-data-table TH {
+    background-color: black;
+    color: white;
+}
+
+TABLE.t-data-table TD {
+    border: 1px solid silver;
+    margin: 0px;
+}
+
+DIV.t-beaneditor {
+    display: block;
+    background: #ffc;
+    border: 2px outset brown;
+    padding: 2px;
+    font-family: "Trebuchet MS", Arial, sans-serif;
+}
+
+DIV.t-beaneditor-row {
+    padding: 4px 0px 2px 0px;
+}
+
+DIV.t-beaneditor-row LABEL:after {
+    content: ":";
+}
+
+DL.t-beandisplay {
+    display: block;
+    padding: 2px;
+    font-family: "Trebuchet MS", Arial, sans-serif;
+    background: #CCBE99;
+    border: 2px outset black;
+    width: auto;
+}
+
+DL.t-beandisplay DT {
+    width: 250px;
+    display: inline;
+    float: left;
+    text-align: right;
+    clear: left;
+    padding-right: 3px;
+    vertical-align: middle;
+}
+
+DL.t-beandisplay DT:after {
+    content: ":";
+}
+
+DIV.t-beaneditor-row LABEL {
+    width: 250px;
+    display: block;
+    float: left;
+    text-align: right;
+    clear: left;
+    padding-right: 3px;
+    vertical-align: middle;
+}
+
+DIV.t-checklist-row {
+    padding: 4px 0px 2px 0px;
+}
+
+DIV.t-checklist-row LABEL {
+    text-align: right;
+    padding-left: 5px;
+    vertical-align: middle;
+}
+
+INPUT.t-number {
+    text-align: right;
+}
+
+DIV.t-beandisplay DIV.t-beandisplay-label {
+    padding-right: 5px;
+}
+
+TABLE.t-data-grid THEAD TR {
+    color: white;
+    background-color: #809FFF;
+}
+
+TABLE.t-data-grid THEAD TR TH {
+    text-align: left;
+    padding: 3px;
+    white-space: nowrap;
+    border-right: 1px solid silver;
+    border-bottom: 1px solid silver;
+}
+
+TABLE.t-data-grid {
+    border-collapse: collapse;
+    border-left: 1px solid silver;
+}
+
+TABLE.t-data-grid TBODY TR TD {
+    border-right: 1px solid silver;
+    border-bottom: 1px solid silver;
+    padding: 2px;
+}
+
+DIV.t-data-grid {
+    font-family: "Trebuchet MS", Arial, sans-serif;
+}
+
+DIV.t-data-grid-pager {
+    margin: 8px 0px;
+}
+
+DIV.t-data-grid-pager A, DIV.t-data-grid-pager SPAN.current {
+    text-decoration: none;
+    color: black;
+    padding: 2px 5px;
+    font-size: medium;
+    border: 1px solid silver;
+    margin-right: 5px;
+}
+
+DIV.t-data-grid-pager A:hover {
+    border: 1px solid black;
+}
+
+DIV.t-data-grid-pager SPAN.current {
+    color: white;
+    background-color: #809FFF;
+}
+
+TABLE.t-data-grid TR TH A {
+    color: white;
+}
+
+IMG {
+    border: none;
+}
+
+DIV.t-env-data-section {
+    padding-left: 5px;
+}
+
+DIV.t-env-data DD, DIV.t-exception-report DD {
+    margin-left: 25px;
+    margin-bottom: 10px;
+}
+
+DIV.t-env-data LI {
+    margin-left: -25px;
+}
+
+DIV.t-env-data-section {
+    font-size: 12pt;
+    background-color: #E1E1E1;
+    color: blue;
+    padding: 2px 3px;
+    font-weight: bold;
+}
+
+TABLE.t-location-outer {
+    padding: 5px;
+    border-collapse: collapse;
+    border: 1px solid black;
+    width: 100%;
+}
+
+TD.t-location-line {
+    width: 40px;
+    text-align: right;
+    padding: 0px;
+    background-color: #E1E1E1;
+    padding-right: 3px;
+    border-right: 1px solid black;
+}
+
+TD.t-location-content {
+    border-top: 1px solid silver;
+    border-right: 1px solid black;
+    white-space: pre;
+}
+
+TD.t-location-current {
+    background-color: #FFFFCF;
+}
+
+TD.t-location-content-first {
+    border-top: 1px solid black;
+}
+
+DIV.t-palette {
+    display: inline;
+}
+
+DIV.t-palette SELECT {
+    margin-bottom: 2px;
+    width: 200px;
+}
+
+DIV.t-palette-title {
+    color: white;
+    background-color: #809FFF;
+    text-align: center;
+    font-weight: bold;
+    margin-bottom: 3px;
+    display: block;
+}
+
+DIV.t-palette-available {
+    float: left;
+}
+
+DIV.t-palette-controls {
+    margin: 5px 5px;
+    float: left;
+    text-align: center;
+}
+
+DIV.t-palette-controls BUTTON {
+    display: block;
+    margin-bottom: 3px;
+    cursor: pointer;
+}
+
+DIV.t-palette-controls BUTTON[disabled] IMG {
+    filter: alpha(opacity = 25);
+    -moz-opacity: .25;
+    opacity: .25;
+    cursor: default;
+}
+
+DIV.t-palette-selected {
+    float: left;
+    clear: right;
+}
+
+DIV.t-palette-spacer {
+    clear: left;
+}
+
+IMG.t-calendar-trigger {
+    padding-left: 3px;
+    cursor: pointer;
+}
+
+DIV.t-autocomplete-menu {
+    z-index: 9999;
+}
+
+DIV.t-autocomplete-menu UL {
+    border: 2px outset #cc9933;
+    background-color: #cc9933;
+    padding: 4px 6px;
+    overflow: auto;
+}
+
+DIV.t-autocomplete-menu LI {
+    color: white;
+    list-style-type: none;
+    padding: 0px;
+    margin: 0px;
+    border-bottom: 1px solid black;
+    cursor: pointer;
+}
+
+DIV.t-autocomplete-menu LI.selected {
+    color: black;
+    font-weight: bold;
+}
+
+DIV.t-error-popup SPAN {
+    background: transparent url('error-bevel-left.gif') no-repeat;
+    display: block;
+    line-height: 28px;
+    margin-left: 0px;
+    padding: 0px 5px 10px 22px;
+}
+
+HTML>BODY DIV.t-error-popup SPAN {
+    background: transparent url('error-bevel-left.png') no-repeat;
+}
+
+DIV.t-error-popup {
+    background: transparent url('error-bevel-right.gif') no-repeat scroll top right;
+    cursor: pointer;
+    color: #FFF;
+    display: block;
+    float: left;
+    font: normal 12px arial, sans-serif;
+    height: 39px;
+    margin-right: 6px;
+    padding-right: 29px;
+    text-decoration: none;
+}
+
+HTML>BODY DIV.t-error-popup {
+    background: transparent url('error-bevel-right.png') no-repeat scroll top right;
+}
+
+UL.t-data-list LI {
+    list-style-type: square;
+}
+
+DIV.t-loading {
+    display: inline;
+    width: auto;
+    font-weight: bold;
+    padding-right: 20px;
+    background: transparent url(ajax-loader.gif) no-repeat right top;
+}
+
+SPAN.t-render-object-error {
+    font-weight: bold;
+    font: italic;
+    color: red;
+}
+
+DIV.t-available-values UL LI {
+    list-style-type: disc;
+    margin-left: 0px;
+}
+
+DIV.t-exception-container {
+    background: white;
+    border: 1px solid black;
+    position: fixed;
+    top: 50px;
+    left: 50px;
+    -moz-box-shadow: 6px 6px 3px #888;
+    -webkit-box-shadow: 6px 6px 3px #888;
+    box-shadow: 6px 6px 3px #888;
+
+}
+
+DIV.t-exception-frame {
+}
+
+DIV.t-exception-container .t-exception-close {
+    display: block;
+    float: right;
+    margin: 5px;
+    padding-right: 2px;
+    padding-left: 22px;
+    height: 18px;
+    cursor: pointer;
+    background: #e8e8e8 url("../../../org/apache/tapestry5/silk/delete.png") no-repeat;
+    border-radius: 5px;
+    -moz-border-radius: 5px;
+    -webkit-border-radius: 5px;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/02ed252a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/deselect.png
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/META-INF/assets/tapestry5/deselect.png b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/deselect.png
new file mode 100644
index 0000000..083612d
Binary files /dev/null and b/tapestry-core/src/main/resources/META-INF/assets/tapestry5/deselect.png differ