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