The actual 4.1.3 release version.

git-svn-id: https://svn.apache.org/repos/asf/tapestry/tapestry4/tags/4.1.3/tapestry@574990 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/pom.xml b/pom.xml
index 6f82a8e..d6bba38 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
     <groupId>org.apache.tapestry</groupId>
     <artifactId>tapestry-project</artifactId>
     <packaging>pom</packaging>
-    <version>4.1.3-SNAPSHOT</version>
+    <version>4.1.3</version>
     <description>Java Web Application Framework</description>
     <name>Tapestry</name>
     <inceptionYear>2006</inceptionYear>
@@ -170,7 +170,7 @@
             <dependency>
                 <groupId>ognl</groupId>
                 <artifactId>ognl</artifactId>
-                <version>2.7.1-SNAPSHOT</version>
+                <version>2.7.1</version>
             </dependency>
             <dependency>
                 <groupId>javax.servlet</groupId>
diff --git a/src/site/xdoc/components/dojo/dialog.xml b/src/site/xdoc/components/dojo/dialog.xml
index 6315aee..6e8e4df 100644
--- a/src/site/xdoc/components/dojo/dialog.xml
+++ b/src/site/xdoc/components/dojo/dialog.xml
@@ -95,6 +95,62 @@
                             valid values would range from <code>0.1 - 1</code>.
                         </td>
                     </tr>
+                    <tr>
+                        <td>followScroll</td>
+                        <td>boolean</td>
+                        <td>no</td>
+                        <td>true</td>
+                        <td>
+                            Whether ot not the dialog should follow the scroll remaining centered on the browser viewport.
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>closeOnBackgroundClick</td>
+                        <td>boolean</td>
+                        <td>no</td>
+                        <td>false</td>
+                        <td>
+                            Whether ot not the dialog should close when clicking on the background.
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>blockDuration</td>
+                        <td>int</td>
+                        <td>no</td>
+                        <td>0</td>
+                        <td>
+                            Number of seconds for which the user cannot dismiss the dialog.
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>lifeTime</td>
+                        <td>int</td>
+                        <td>no</td>
+                        <td>0</td>
+                        <td>
+                            The number of seconds the dialog will be displayed before automatically disappearing.
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>toggle</td>
+                        <td>String</td>
+                        <td>no</td>
+                        <td>literal:fade</td>
+                        <td>
+                            The type of effect to be used on dialog show/hide. Possible values are:
+                            <code>litera:plain</code>, <code>literal:wipe</code>, <code>literal:fade</code>, <code>literal:explode</code>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>toggleDuration</td>
+                        <td>int</td>
+                        <td>no</td>
+                        <td>150</td>
+                        <td>
+                            Controls how opaque the background is. This parameter is given in the form of a percent, so
+                            valid values would range from <code>0.1 - 1</code>.
+                        </td>
+                    </tr>
                 </table>
 
                 <p>
diff --git a/src/site/xdoc/release-notes.xml b/src/site/xdoc/release-notes.xml
index 9182d8f..1c22ca9 100644
--- a/src/site/xdoc/release-notes.xml
+++ b/src/site/xdoc/release-notes.xml
@@ -10,6 +10,102 @@
 
         <section name="Tapestry 4 Releases">
 
+            <subsection name="Release Notes - Tapestry - Version 4.1.3">
+                <h2>        Bug
+                </h2>
+                <ul>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-340'>TAPESTRY-340</a>] -         url-encoded parameters are not considered in multipart-requests
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-399'>TAPESTRY-399</a>] -         If a RedirectException is thrown after IEngine.setLocale(...) has been called, the cookie org.apache.tapestry.locale is not being set
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1522'>TAPESTRY-1522</a>] -         @EventListener is not been called if target ids contains _
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1527'>TAPESTRY-1527</a>] -         @Dialog component triggers a lot a javascript errors on scroll after show/hide by EventListener
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1540'>TAPESTRY-1540</a>] -         no response with dojo ajax responsebuilder
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1551'>TAPESTRY-1551</a>] -         404 in some dojo bundles
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1575'>TAPESTRY-1575</a>] -         @EventListener doesn't work with multi-part forms
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1580'>TAPESTRY-1580</a>] -         AJAX response to update a component doesn't include the updated component's root tag
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1616'>TAPESTRY-1616</a>] -         Tap 4.1.2 PageNotFoundException not caught
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1622'>TAPESTRY-1622</a>] -         IE 6 doesn't update a component, if its new content is empty.
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1638'>TAPESTRY-1638</a>] -         ImageSubmit doesn't trigger it's listener/action when called asynchronously
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1640'>TAPESTRY-1640</a>] -         FieldLabel + IFormComponent update in ajax request fails because of prerender
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1651'>TAPESTRY-1651</a>] -         ComponentSpecificationResolverImpl not checking app namespace
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1654'>TAPESTRY-1654</a>] -         Contrib:Timeout caused TimeoutConfirm is not defined js error
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1660'>TAPESTRY-1660</a>] -         inject script xml declaration forces context relative paths
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1663'>TAPESTRY-1663</a>] -         @RadioGroup client-side validation does not work
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1680'>TAPESTRY-1680</a>] -         Anchors are missing in usersguide/spec.html
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1681'>TAPESTRY-1681</a>] -         Workbench pom.xml is buggy this patch fixes it
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1682'>TAPESTRY-1682</a>] -         Parameters with defined with a default-value counted as &quot;invariant&quot;
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1685'>TAPESTRY-1685</a>] -         Examples in documentation for @Script are incomplete
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1687'>TAPESTRY-1687</a>] -         Autocompleter handles null values in a wrong way
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1701'>TAPESTRY-1701</a>] -         Wrong link in Hidden component documentation
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1705'>TAPESTRY-1705</a>] -         form focus errors out on ie if focusing on a dialog form before it is displayed
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1706'>TAPESTRY-1706</a>] -         Rounded corner service fails with 0 byte image buffer.
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1740'>TAPESTRY-1740</a>] -         Error in documentation of Custom Exception Pages
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1744'>TAPESTRY-1744</a>] -         tab doesn't close time list drop down on gtimepicker
+                    </li>
+                </ul>
+
+                <h2>        Improvement
+                </h2>
+                <ul>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-400'>TAPESTRY-400</a>] -         LinkSubmit and Rollover should be able to play together.
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1448'>TAPESTRY-1448</a>] -         Ability to set the default @Persist property persistence strategy
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1656'>TAPESTRY-1656</a>] -         InlineEditBox needs a listener parameter
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1661'>TAPESTRY-1661</a>] -         Specless component html template needs a package based resolution strategy
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1688'>TAPESTRY-1688</a>] -         the tapestry form.js script has an unnecessary call to eval
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1693'>TAPESTRY-1693</a>] -         exception pages documentation example wanted and minor mistakes
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1707'>TAPESTRY-1707</a>] -         Note in rounded services documentation that tapestry-contrib must be installed.
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1708'>TAPESTRY-1708</a>] -         Document all rounded service parameters.
+                    </li>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1729'>TAPESTRY-1729</a>] -         Additional bindings for Dialog component
+                    </li>
+                </ul>
+
+                <h2>        New Feature
+                </h2>
+                <ul>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-394'>TAPESTRY-394</a>] -         Default for listener parameter of DirectLink, etc.
+                    </li>
+                </ul>
+
+                <h2>        Wish
+                </h2>
+                <ul>
+                    <li>[<a href='https://issues.apache.org/jira/browse/TAPESTRY-1202'>TAPESTRY-1202</a>] -         EventListener - send custom data in the same way browser event data is sent
+                    </li>
+                </ul>
+            </subsection>
+
             <subsection name="Release Notes - Tapestry - Version 4.1.2">
                 <h2>        Sub-task
                 </h2>
diff --git a/tapestry-annotations/pom.xml b/tapestry-annotations/pom.xml
index 028e9ee..ac83853 100644
--- a/tapestry-annotations/pom.xml
+++ b/tapestry-annotations/pom.xml
@@ -4,12 +4,12 @@
     <groupId>org.apache.tapestry</groupId>
     <artifactId>tapestry-annotations</artifactId>
     <packaging>jar</packaging>
-    <version>4.1.3-SNAPSHOT</version>
+    <version>4.1.3</version>
     <!-- This should change to tapestry-project -->
     <parent>
         <groupId>org.apache.tapestry</groupId>
         <artifactId>tapestry-project</artifactId>
-        <version>4.1.3-SNAPSHOT</version>
+        <version>4.1.3</version>
     </parent>
     <name>Annotations</name>
     <inceptionYear>2006</inceptionYear>
@@ -18,7 +18,7 @@
         <dependency>
             <groupId>org.apache.tapestry</groupId>
             <artifactId>tapestry-framework</artifactId>
-            <version>4.1.3-SNAPSHOT</version>
+            <version>4.1.3</version>
         </dependency>
         <dependency>
             <groupId>hivemind</groupId>
diff --git a/tapestry-contrib/pom.xml b/tapestry-contrib/pom.xml
index 2543729..bbcf71f 100644
--- a/tapestry-contrib/pom.xml
+++ b/tapestry-contrib/pom.xml
@@ -5,12 +5,12 @@
     <groupId>org.apache.tapestry</groupId>
     <artifactId>tapestry-contrib</artifactId>
     <packaging>jar</packaging>
-    <version>4.1.3-SNAPSHOT</version>
+    <version>4.1.3</version>
     
     <parent>
         <groupId>org.apache.tapestry</groupId>
         <artifactId>tapestry-project</artifactId>
-        <version>4.1.3-SNAPSHOT</version>
+        <version>4.1.3</version>
     </parent>
     <name>Contrib</name>
     <inceptionYear>2006</inceptionYear>
@@ -19,7 +19,7 @@
         <dependency>
             <groupId>org.apache.tapestry</groupId>
             <artifactId>tapestry-framework</artifactId>
-            <version>4.1.3-SNAPSHOT</version>
+            <version>4.1.3</version>
         </dependency>
         <dependency>
             <groupId>jboss</groupId>
diff --git a/tapestry-contrib/src/java/org/apache/tapestry/contrib/table/model/simple/SimpleTableColumn.java b/tapestry-contrib/src/java/org/apache/tapestry/contrib/table/model/simple/SimpleTableColumn.java
index 91d573c..c3f9d11 100644
--- a/tapestry-contrib/src/java/org/apache/tapestry/contrib/table/model/simple/SimpleTableColumn.java
+++ b/tapestry-contrib/src/java/org/apache/tapestry/contrib/table/model/simple/SimpleTableColumn.java
@@ -158,7 +158,7 @@
     public void setDisplayName(String displayName)
     {
         if (displayName != null)
-            displayName = displayName.replace(".", "_");
+            displayName = displayName.replace("_", ".");
         
         m_strDisplayName = displayName;
     }
@@ -225,7 +225,7 @@
      */
     public void loadSettings(IComponent objSettingsContainer)
     {
-        String strDisplayName = objSettingsContainer.getMessages().getMessage(getColumnName());
+        String strDisplayName = objSettingsContainer.getMessages().getMessage(getDisplayName());
 
         // Hack! the Messages inteface needs to restore the getMessage(key,
         // default), or needs
diff --git a/tapestry-examples/TimeTracker/pom.xml b/tapestry-examples/TimeTracker/pom.xml
index f7043d8..ebdd47a 100644
--- a/tapestry-examples/TimeTracker/pom.xml
+++ b/tapestry-examples/TimeTracker/pom.xml
@@ -4,12 +4,12 @@
     <groupId>org.apache.tapestry</groupId>
     <artifactId>tapestry-TimeTracker</artifactId>
     <packaging>war</packaging>
-    <version>4.1.3-SNAPSHOT</version>
+    <version>4.1.3</version>
     <!-- This should change to tapestry-project -->
     <parent>
         <groupId>org.apache.tapestry</groupId>
         <artifactId>tapestry-examples</artifactId>
-        <version>4.1.3-SNAPSHOT</version>
+        <version>4.1.3</version>
     </parent>
     <name>Tapestry Time Tracker</name>
     <inceptionYear>2006</inceptionYear>
@@ -18,17 +18,17 @@
         <dependency>
             <groupId>org.apache.tapestry</groupId>
             <artifactId>tapestry-framework</artifactId>
-            <version>4.1.3-SNAPSHOT</version>
+            <version>4.1.3</version>
         </dependency>
         <dependency>
             <groupId>org.apache.tapestry</groupId>
             <artifactId>tapestry-annotations</artifactId>
-            <version>4.1.3-SNAPSHOT</version>
+            <version>4.1.3</version>
         </dependency>
         <dependency>
             <groupId>org.apache.tapestry</groupId>
             <artifactId>tapestry-contrib</artifactId>
-            <version>4.1.3-SNAPSHOT</version>
+            <version>4.1.3</version>
         </dependency>
         <dependency>
             <groupId>hivemind</groupId>
diff --git a/tapestry-examples/Workbench/pom.xml b/tapestry-examples/Workbench/pom.xml
index 88dd493..2ac9427 100644
--- a/tapestry-examples/Workbench/pom.xml
+++ b/tapestry-examples/Workbench/pom.xml
@@ -4,13 +4,13 @@
     <groupId>org.apache.tapestry</groupId>
     <artifactId>tapestry-Workbench</artifactId>
     <packaging>war</packaging>
-    <version>4.1.3-SNAPSHOT</version>
+    <version>4.1.3</version>
 
     <!-- This should change to tapestry-project -->
     <parent>
         <groupId>org.apache.tapestry</groupId>
         <artifactId>tapestry-examples</artifactId>
-        <version>4.1.3-SNAPSHOT</version>
+        <version>4.1.3</version>
     </parent>
 
     <name>Tapestry Workbench</name>
diff --git a/tapestry-examples/pom.xml b/tapestry-examples/pom.xml
index 419e226..9f8549b 100644
--- a/tapestry-examples/pom.xml
+++ b/tapestry-examples/pom.xml
@@ -4,12 +4,12 @@
     <groupId>org.apache.tapestry</groupId>
     <artifactId>tapestry-examples</artifactId>
     <packaging>pom</packaging>
-    <version>4.1.3-SNAPSHOT</version>
+    <version>4.1.3</version>
     <!-- This should change to tapestry-project -->
     <parent>
         <groupId>org.apache.tapestry</groupId>
         <artifactId>tapestry-project</artifactId>
-        <version>4.1.3-SNAPSHOT</version>
+        <version>4.1.3</version>
     </parent>
     <name>Examples</name>
     <inceptionYear>2006</inceptionYear>
@@ -24,17 +24,17 @@
             <dependency>
                 <groupId>org.apache.tapestry</groupId>
                 <artifactId>tapestry-framework</artifactId>
-                <version>4.1.3-SNAPSHOT</version>
+                <version>4.1.3</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.tapestry</groupId>
                 <artifactId>tapestry-annotations</artifactId>
-                <version>4.1.3-SNAPSHOT</version>
+                <version>4.1.3</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.tapestry</groupId>
                 <artifactId>tapestry-contrib</artifactId>
-                <version>4.1.3-SNAPSHOT</version>
+                <version>4.1.3</version>
             </dependency>
         </dependencies>
     </dependencyManagement>
diff --git a/tapestry-framework/pom.xml b/tapestry-framework/pom.xml
index e7d7c36..a899aa1 100644
--- a/tapestry-framework/pom.xml
+++ b/tapestry-framework/pom.xml
@@ -4,12 +4,12 @@
     <groupId>org.apache.tapestry</groupId>
     <artifactId>tapestry-framework</artifactId>
     <packaging>jar</packaging>
-    <version>4.1.3-SNAPSHOT</version>
+    <version>4.1.3</version>
     <!-- This should change to tapestry-project -->
     <parent>
         <groupId>org.apache.tapestry</groupId>
         <artifactId>tapestry-project</artifactId>
-        <version>4.1.3-SNAPSHOT</version>
+        <version>4.1.3</version>
     </parent>
     <name>Tapestry Core Library - ${version}</name>
     <inceptionYear>2006</inceptionYear>
diff --git a/tapestry-framework/src/java/org/apache/tapestry/dojo/html/Dialog.java b/tapestry-framework/src/java/org/apache/tapestry/dojo/html/Dialog.java
index bcf018e..f6d6ee4 100644
--- a/tapestry-framework/src/java/org/apache/tapestry/dojo/html/Dialog.java
+++ b/tapestry-framework/src/java/org/apache/tapestry/dojo/html/Dialog.java
@@ -37,6 +37,18 @@
     
     public abstract float getOpacity();
     
+    public abstract boolean getFollowScroll();
+    
+    public abstract boolean getCloseOnBackgroundClick();
+    
+    public abstract int getBlockDuration();
+    
+    public abstract int getLifeTime();
+    
+    public abstract String getToggle();
+    
+    public abstract int getToggleDuration();
+    
     public void show()
     {
         setHidden(false);
@@ -69,6 +81,12 @@
             JSONObject json = new JSONObject();
             json.put("bgColor", getBackgroundColor());
             json.put("bgOpacity", getOpacity());
+            json.put("followScroll", getFollowScroll());
+            json.put("closeOnBackgroundClick", getCloseOnBackgroundClick());
+            json.put("blockDuration", getBlockDuration());
+            json.put("lifeTime", getLifeTime());
+            json.put("toggle", getToggle());
+            json.put("toggleDuration", getToggleDuration());
 
             Map parms = new HashMap();
             parms.put("component", this);
@@ -77,7 +95,7 @@
             getScript().execute(this, cycle, TapestryUtils.getPageRenderSupport(cycle, this), parms);
         }
     }
-    
+        
     /** injected. */
     public abstract IScript getScript();
 }
diff --git a/tapestry-framework/src/java/org/apache/tapestry/dojo/html/Dialog.jwc b/tapestry-framework/src/java/org/apache/tapestry/dojo/html/Dialog.jwc
index 4b74cc1..e23117d 100644
--- a/tapestry-framework/src/java/org/apache/tapestry/dojo/html/Dialog.jwc
+++ b/tapestry-framework/src/java/org/apache/tapestry/dojo/html/Dialog.jwc
@@ -31,7 +31,19 @@
     <parameter name="backgroundColor" default-value="literal:black" />
 
     <parameter name="opacity" default-value="0.4" />
+        
+    <parameter name="followScroll" default-value="true" />
+    
+    <parameter name="closeOnBackgroundClick" default-value="false" />
 
+    <parameter name="blockDuration" default-value="0" />
+    
+    <parameter name="lifeTime" default-value="0" />
+            
+    <parameter name="toggle" default-value="literal:fade" />
+            
+    <parameter name="toggleDuration" default-value="150" />
+    
     <inject property="script" type="script" object="Dialog.script"/>
 
 </component-specification>
diff --git a/tapestry-framework/src/js/tapestry/widget/TimePicker.js b/tapestry-framework/src/js/tapestry/widget/TimePicker.js
index 5c540d8..814b93f 100644
--- a/tapestry-framework/src/js/tapestry/widget/TimePicker.js
+++ b/tapestry-framework/src/js/tapestry/widget/TimePicker.js
@@ -6,6 +6,8 @@
 dojo.require("dojo.html.metrics");
 dojo.require("dojo.html.iframe");
 
+tapestry.widget.currentTimePicker=null;
+
 dojo.widget.defineWidget(
         "tapestry.widget.TimePicker",
         dojo.widget.HtmlWidget,
@@ -19,6 +21,7 @@
 
     inputNode:null, // form input text node
     selectedNode:null, // currently selected node
+    hoveredNode:null, // current node being hovered over with mouse - ie has background color changed
     dropdownNode:null, // drop down div container
     bgIframe:null,
     options:[], // option div nodes
@@ -80,7 +83,9 @@
         
         dojo.event.connect(this.inputNode, "onclick", this, "onInputClick");
         dojo.event.connect(this.inputNode, "onblur", this, "onInputBlur");
-
+        dojo.event.connect(this.inputNode, "onkeyup", this, "onInputKeyUp");
+        dojo.event.connect(this.inputNode, "onkeydown", this, "onInputKeyDown");
+        
         dojo.event.connect(this.dropdownNode, "onmouseover", this, "onDropdownMouseOver");
         dojo.event.connect(this.dropdownNode, "onmouseout", this, "onDropdownMouseOut");
         
@@ -88,14 +93,11 @@
     },
 
     onOptionMouseOver: function(evt) {
-        this.preventBlur=true;
-        if (!dojo.html.hasClass(evt.target, this.optionHoverClass)) {
-            dojo.html.addClass(evt.target, this.optionHoverClass);
-        }
+        this._selectOption(evt.target);
     },
 
     onOptionMouseOut: function(evt) {
-        dojo.html.removeClass(evt.target, this.optionHoverClass);
+        this._clearOptionSelection(evt.target);
     },
 
     onChange:function() {},
@@ -116,12 +118,10 @@
             return;
         }
 
-        this.hasFocus=true;
-        this.preventBlur=true;
         this.show();
 
         if (this.selectedNode){
-            dojo.html.scrollIntoView(this.selectedNode);
+            this.selectedNode.scrollIntoView(true);
         }
     },
 
@@ -139,6 +139,7 @@
     },
 
     onDropdownMouseOut: function(evt) {
+        if (!this.showing){return;}
         this.preventBlur=false;
 
         if (this.isWidgetNode(evt["relatedTarget"])){
@@ -155,7 +156,31 @@
         }
     },
 
-    hide: function(evt) {
+    onInputKeyUp: function(evt) {
+        switch(evt.keyCode){
+            case evt.KEY_TAB:
+                this.show();
+                break;
+           /* case evt.KEY_UP_ARROW:
+                this.inputNode.focus();
+                this._selectPreviousOption();
+                break;
+            case evt.KEY_DOWN_ARROW:
+                this.inputNode.focus();
+                this._selectNextOption();
+                break;
+                */
+        }
+    },
+
+    onInputKeyDown: function(evt) {
+        switch(evt.keyCode){
+            case evt.KEY_TAB:
+                if (this.showing){this.hide();}
+        }
+    },
+
+    hide: function() {
         dojo.html.hide(this.dropdownNode);
 
         if (this.bgIframe){
@@ -165,9 +190,15 @@
         this.hasFocus=false;
         this.preventBlur=false;
         this.showing=false;
+        this.hoveredNode=null;
     },
 
-    show: function(evt) {
+    show: function() {
+
+        if (tapestry.widget.currentTimePicker &&
+                tapestry.widget.currentTimePicker != this){
+            tapestry.widget.currentTimePicker.hide();
+        }
 
         var oldDisplay = this.inputNode.style.display;
         var mb = dojo.html.getElementBox(this.inputNode, dojo.html.boxSizing.BORDER_BOX);
@@ -195,7 +226,7 @@
 
         this.dropdownNode.style["top"]=ddY+'px';
         this.dropdownNode.style["left"]=ddX+'px';
-
+        
         dojo.html.show(this.dropdownNode);
         
         if (this.bgIframe){
@@ -204,6 +235,13 @@
         }
 
         this.showing=true;
+        this.hasFocus=true;
+        this.preventBlur=true;
+        tapestry.widget.currentTimePicker=this;
+    },
+
+    getValue:function(){
+        return this.inputNode.value;
     },
 
     isWidgetNode: function(node){
@@ -219,6 +257,8 @@
 
             dojo.event.disconnect(this.inputNode, "onclick", this, "onInputClick");
             dojo.event.disconnect(this.inputNode, "onblur", this, "onInputBlur");
+            dojo.event.disconnect(this.inputNode, "onkeyup", this, "onInputKeyUp");
+            dojo.event.disconnect(this.inputNode, "onkeydown", this, "onInputKeyDown");
             dojo.event.browser.clean(this.inputNode);
 
             dojo.event.disconnect(this.dropdownNode, "onmouseover", this, "onDropdownMouseOver");
@@ -235,8 +275,47 @@
         } catch (e) { }
     },
 
-    getValue:function(){
-        return this.inputNode.value;
+    _selectOption:function(node){
+        if (!node) { return; }
+        
+        this.preventBlur=true;
+        if (!dojo.html.hasClass(node, this.optionHoverClass)) {
+            dojo.html.addClass(node, this.optionHoverClass);
+        }
+
+        this.hoveredNode=node;
+    },
+
+    _clearOptionSelection:function(node){
+        dojo.html.removeClass(node, this.optionHoverClass);
+    },
+
+    _selectPreviousOption:function(){
+        var prevNode;
+        if (!this.hoveredNode){
+            this.hoveredNode=this.options[0];
+            prevNode = this.hoveredNode;
+        } else {
+            prevNode = this.hoveredNode.previousSibling;
+        }
+
+        prevNode.scrollIntoView(true);
+        this._clearOptionSelection(this.hoveredNode);
+        this._selectOption(prevNode);
+    },
+
+    _selectNextOption:function() {
+        var nextNode;
+        if (!this.hoveredNode){
+            this.hoveredNode=this.options[0];
+            nextNode = this.hoveredNode;
+        } else {
+            nextNode = this.hoveredNode.nextSibling;
+        }
+
+        nextNode.scrollIntoView(true);
+        this._clearOptionSelection(this.hoveredNode);
+        this._selectOption(nextNode);
     }
 }
 );
diff --git a/tapestry-framework/src/js/tests/widget/test_TimePicker.html b/tapestry-framework/src/js/tests/widget/test_TimePicker.html
index a77daca..7e14eda 100644
--- a/tapestry-framework/src/js/tests/widget/test_TimePicker.html
+++ b/tapestry-framework/src/js/tests/widget/test_TimePicker.html
@@ -74,7 +74,7 @@
     }
 
     .optionHover {
-        background: cornflowerblue;
+        background-color: cornflowerblue;
         color: #ffffff;
     }
 </style>
diff --git a/tapestry-portlet/pom.xml b/tapestry-portlet/pom.xml
index ce96123..19913f0 100644
--- a/tapestry-portlet/pom.xml
+++ b/tapestry-portlet/pom.xml
@@ -3,21 +3,21 @@
     <parent>
         <groupId>org.apache.tapestry</groupId>
         <artifactId>tapestry-project</artifactId>
-        <version>4.1.3-SNAPSHOT</version>
+        <version>4.1.3</version>
     </parent>
     
     <modelVersion>4.0.0</modelVersion>
     <groupId>org.apache.tapestry</groupId>
     <artifactId>tapestry-portlet</artifactId>
     <name>Portlet</name>
-    <version>4.1.3-SNAPSHOT</version>
+    <version>4.1.3</version>
     <inceptionYear>2006</inceptionYear>
 
     <dependencies>
         <dependency>
             <groupId>org.apache.tapestry</groupId>
             <artifactId>tapestry-framework</artifactId>
-            <version>4.1.3-SNAPSHOT</version>
+            <version>4.1.3</version>
         </dependency>
         <dependency>
             <groupId>hivemind</groupId>