<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>click-commits@incubator.apache.org Archives</title>
<link rel="self" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/?format=atom"/>
<link href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/"/>
<id>http://mail-archives.apache.org/mod_mbox/incubator-click-commits/</id>
<updated>2009-12-09T00:26:45Z</updated>
<entry>
<title>svn commit: r887510 - /incubator/click/trunk/click/framework/src/org/apache/click/Page.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200912.mbox/%3c20091205073952.E790B238898B@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091205073952-E790B238898B@eris-apache-org%3e</id>
<updated>2009-12-05T07:39:52Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Sat Dec  5 07:39:52 2009
New Revision: 887510

URL: http://svn.apache.org/viewvc?rev=887510&amp;view=rev
Log:
doco

Modified:
    incubator/click/trunk/click/framework/src/org/apache/click/Page.java

Modified: incubator/click/trunk/click/framework/src/org/apache/click/Page.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/Page.java?rev=887510&amp;r1=887509&amp;r2=887510&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/Page.java (original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/Page.java Sat Dec  5 07:39:52
2009
@@ -1052,8 +1052,9 @@
      * &lt;p/&gt;
      * It is worth noting that Click checks a Page's stateful property after
      * each request. Thus it becomes possible to enable a stateful Page for a
-     * number of request and then setting it to &lt;tt&gt;false&lt;/tt&gt; again. Click will
-     * remove the Page from the HttpSession, freeing up memory for the server.
+     * number of requests and then setting it to &lt;tt&gt;false&lt;/tt&gt; again at which
+     * point Click will remove the Page from the HttpSession, freeing up memory
+     * for the server.
      *
      * @param stateful the flag indicating whether the page should be saved
      *         between user requests




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r887506 - /incubator/click/trunk/click/framework/src/org/apache/click/element/JsScript.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200912.mbox/%3c20091205062229.C084323889B3@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091205062229-C084323889B3@eris-apache-org%3e</id>
<updated>2009-12-05T06:22:29Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Sat Dec  5 06:22:28 2009
New Revision: 887506

URL: http://svn.apache.org/viewvc?rev=887506&amp;view=rev
Log:
doco

Modified:
    incubator/click/trunk/click/framework/src/org/apache/click/element/JsScript.java

Modified: incubator/click/trunk/click/framework/src/org/apache/click/element/JsScript.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/element/JsScript.java?rev=887506&amp;r1=887505&amp;r2=887506&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/element/JsScript.java (original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/element/JsScript.java Sat Dec
 5 06:22:28 2009
@@ -398,7 +398,7 @@
 
         renderContent(buffer, context);
 
-        // Render the DOM ready function suffic for non-ajax requests
+        // Render the DOM ready function suffix for non-ajax requests
         if (!isAjaxRequest) {
             renderDomReadySuffix(buffer);
         }




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r883977 - /incubator/click/trunk/click/framework/src/org/apache/click/service/VelocityTemplateService.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091125044906.454562388996@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091125044906-454562388996@eris-apache-org%3e</id>
<updated>2009-11-25T04:49:06Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Wed Nov 25 04:49:05 2009
New Revision: 883977

URL: http://svn.apache.org/viewvc?rev=883977&amp;view=rev
Log:
add nullcheck directory. CLK-597

Modified:
    incubator/click/trunk/click/framework/src/org/apache/click/service/VelocityTemplateService.java

Modified: incubator/click/trunk/click/framework/src/org/apache/click/service/VelocityTemplateService.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/service/VelocityTemplateService.java?rev=883977&amp;r1=883976&amp;r2=883977&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/service/VelocityTemplateService.java
(original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/service/VelocityTemplateService.java
Wed Nov 25 04:49:05 2009
@@ -526,6 +526,8 @@
         velProps.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
                      LogChuteAdapter.class.getName());
 
+        velProps.put("directive.if.tostring.nullcheck", "false");
+
         // Use 'macro.vm' exists set it as default VM library
         ServletContext servletContext = configService.getServletContext();
         URL macroURL = servletContext.getResource("/" + MACRO_VM_FILE_NAME);




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r883976 - /incubator/click/trunk/click/lib/</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091125043327.8F2B223889B3@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091125043327-8F2B223889B3@eris-apache-org%3e</id>
<updated>2009-11-25T04:33:27Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Wed Nov 25 04:33:27 2009
New Revision: 883976

URL: http://svn.apache.org/viewvc?rev=883976&amp;view=rev
Log:
ignore velocity 1.6.3

Modified:
    incubator/click/trunk/click/lib/   (props changed)

Propchange: incubator/click/trunk/click/lib/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Wed Nov 25 04:33:27 2009
@@ -4,25 +4,26 @@
 hibernate-3.0.5.jar
 commons-io-1.1.jar
 cayenne-*.jar
+checkstyle-all-5.0.jar
 spring-*.jar
 concurrent-1.3.4.jar
 commons-codec-1.3.jar
 freemarker-2.3.8.jar
 servlet-api-2.3.jar
 junit-3.8.1.jar
+velocity-1.6.3.jar
 commons-lang-2.1.jar
+velocity-1.6.2.jar
 commons-collections-3.1.jar
-commons-*.jar
+slf4j-api-1.5.6.jar
 cayenne-nodeps-1.2B1.jar
+commons-*.jar
 ognl-2.6.7.jar
 spring-1.2.6.jar
 commons-fileupload-1.1.jar
 hibernate-3.1.3.jar
-checkstyle-all-4.4.jar
 velocity-1.5-beta2.jar
+checkstyle-all-4.4.jar
 hibernate-2.1.8.jar
-log4j-1.2.14.jar
 hibernate-3.2.6.ga.jar
-velocity-1.6.2.jar
-slf4j-api-1.5.6.jar
-checkstyle-all-5.0.jar
+log4j-1.2.14.jar




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r883265 - /incubator/click/trunk/click/extras/src/org/apache/click/extras/control/PickList.htm</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091123075304.E2F5223888D1@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091123075304-E2F5223888D1@eris-apache-org%3e</id>
<updated>2009-11-23T07:53:04Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Mon Nov 23 07:53:03 2009
New Revision: 883265

URL: http://svn.apache.org/viewvc?rev=883265&amp;view=rev
Log:
set id on PickList buttons

Modified:
    incubator/click/trunk/click/extras/src/org/apache/click/extras/control/PickList.htm

Modified: incubator/click/trunk/click/extras/src/org/apache/click/extras/control/PickList.htm
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/org/apache/click/extras/control/PickList.htm?rev=883265&amp;r1=883264&amp;r2=883265&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/org/apache/click/extras/control/PickList.htm (original)
+++ incubator/click/trunk/click/extras/src/org/apache/click/extras/control/PickList.htm Mon
Nov 23 07:53:03 2009
@@ -43,25 +43,25 @@
   &lt;/select&gt;
 &lt;/td&gt;
 &lt;td valign="middle"&gt;
-  &lt;input type="button" value="&amp;gt;" style="width:60px;"
+  &lt;input id="${id}_add" type="button" value="&amp;gt;" style="width:60px;"
          onclick="pickListMove(document.getElementById('${id}_unselected'), document.getElementById('$id'),
document.getElementById('${id}_hidden'), true)"
     #if($readOnly || $disabled)
       disabled="disabled"
     #end
   /&gt;&lt;br/&gt;
-  &lt;input type="button" value="&amp;lt;" style="width:60px;"
+  &lt;input id="${id}_remove" type="button" value="&amp;lt;" style="width:60px;"
          onclick="pickListMove(document.getElementById('$id'), document.getElementById('${id}_unselected'),
document.getElementById('${id}_hidden'), false)"
     #if($readOnly || $disabled)
       disabled="disabled"
     #end
   /&gt;&lt;br/&gt;
-  &lt;input type="button" value="&amp;gt;&amp;gt;" style="width:60px;"
+  &lt;input id="${id}_add_all" type="button" value="&amp;gt;&amp;gt;" style="width:60px;"
          onclick="pickListMoveAll(document.getElementById('${id}_unselected'), document.getElementById('$id'),
document.getElementById('${id}_hidden'), true)"
     #if($readOnly || $disabled)
       disabled="disabled"
     #end
   /&gt;&lt;br/&gt;
-  &lt;input type="button" value="&amp;lt;&amp;lt;" style="width:60px;"
+  &lt;input id="${id}_remove_all" type="button" value="&amp;lt;&amp;lt;" style="width:60px;"
          onclick="pickListMoveAll(document.getElementById('$id'), document.getElementById('${id}_unselected'),
document.getElementById('${id}_hidden'), false)"
     #if($readOnly || $disabled)
       disabled="disabled"




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r883264 - in /incubator/click/trunk/click: build/build.properties build/click-nodeps.pom documentation/docs/roadmap-changes.html</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091123075049.A314223888D1@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091123075049-A314223888D1@eris-apache-org%3e</id>
<updated>2009-11-23T07:50:49Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Mon Nov 23 07:50:48 2009
New Revision: 883264

URL: http://svn.apache.org/viewvc?rev=883264&amp;view=rev
Log:
updated to commons collection 3.2.1

Modified:
    incubator/click/trunk/click/build/build.properties
    incubator/click/trunk/click/build/click-nodeps.pom
    incubator/click/trunk/click/documentation/docs/roadmap-changes.html

Modified: incubator/click/trunk/click/build/build.properties
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/build/build.properties?rev=883264&amp;r1=883263&amp;r2=883264&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/build/build.properties (original)
+++ incubator/click/trunk/click/build/build.properties Mon Nov 23 07:50:48 2009
@@ -43,7 +43,7 @@
 cayenne.version=3.0M6
 checkstyle.version=5.0
 commons-codec.version=1.3
-commons-collections.version=3.1
+commons-collections.version=3.2.1
 commons-fileupload.version=1.2.1
 commons-io.version=1.4
 commons-lang.version=2.4

Modified: incubator/click/trunk/click/build/click-nodeps.pom
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/build/click-nodeps.pom?rev=883264&amp;r1=883263&amp;r2=883264&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/build/click-nodeps.pom (original)
+++ incubator/click/trunk/click/build/click-nodeps.pom Mon Nov 23 07:50:48 2009
@@ -37,7 +37,7 @@
     &lt;dependency&gt;
       &lt;groupId&gt;commons-collections&lt;/groupId&gt;
       &lt;artifactId&gt;commons-collections&lt;/artifactId&gt;
-      &lt;version&gt;3.1&lt;/version&gt;
+      &lt;version&gt;3.2.1&lt;/version&gt;
     &lt;/dependency&gt;
     &lt;dependency&gt;
       &lt;groupId&gt;commons-fileupload&lt;/groupId&gt;

Modified: incubator/click/trunk/click/documentation/docs/roadmap-changes.html
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/documentation/docs/roadmap-changes.html?rev=883264&amp;r1=883263&amp;r2=883264&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/documentation/docs/roadmap-changes.html (original)
+++ incubator/click/trunk/click/documentation/docs/roadmap-changes.html Mon Nov 23 07:50:48
2009
@@ -465,6 +465,9 @@
           Updated Cayenne library to version 3.0M6.
       &lt;/li&gt;
       &lt;li class="change"&gt;
+          Updated Commons Collection library to version 3.2.1.
+      &lt;/li&gt;
+      &lt;li class="change"&gt;
           Updated Prototype.js library to version 1.6.1.
       &lt;/li&gt;
     &lt;/ul&gt;




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r835697 - /incubator/click/trunk/click/extras/src/org/apache/click/extras/control/AutoCompleteTextField.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091113013628.D78CC23888CF@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091113013628-D78CC23888CF@eris-apache-org%3e</id>
<updated>2009-11-13T01:36:28Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Fri Nov 13 01:36:28 2009
New Revision: 835697

URL: http://svn.apache.org/viewvc?rev=835697&amp;view=rev
Log:
explicitly close autocomplete field div

Modified:
    incubator/click/trunk/click/extras/src/org/apache/click/extras/control/AutoCompleteTextField.java

Modified: incubator/click/trunk/click/extras/src/org/apache/click/extras/control/AutoCompleteTextField.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/org/apache/click/extras/control/AutoCompleteTextField.java?rev=835697&amp;r1=835696&amp;r2=835697&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/org/apache/click/extras/control/AutoCompleteTextField.java
(original)
+++ incubator/click/trunk/click/extras/src/org/apache/click/extras/control/AutoCompleteTextField.java
Fri Nov 13 01:36:28 2009
@@ -331,7 +331,8 @@
         buffer.elementStart("div");
         buffer.appendAttribute("class", "auto_complete");
         buffer.appendAttribute("id", getId() + "_auto_complete_div");
-        buffer.elementEnd();
+        buffer.closeTag();
+        buffer.elementEnd("div");
     }
 
     // --------------------------------------------------------- Event Handlers




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r834242 - /incubator/click/trunk/click/extras/src/org/apache/click/extras/control/LinkDecorator.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091109212025.224E5238887A@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091109212025-224E5238887A@eris-apache-org%3e</id>
<updated>2009-11-09T21:20:25Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Mon Nov  9 21:20:24 2009
New Revision: 834242

URL: http://svn.apache.org/viewvc?rev=834242&amp;view=rev
Log:
added missing constructor for ActionButtons, and ensure  parameter name is always present
as request parameter, if speciified

Modified:
    incubator/click/trunk/click/extras/src/org/apache/click/extras/control/LinkDecorator.java

Modified: incubator/click/trunk/click/extras/src/org/apache/click/extras/control/LinkDecorator.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/org/apache/click/extras/control/LinkDecorator.java?rev=834242&amp;r1=834241&amp;r2=834242&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/org/apache/click/extras/control/LinkDecorator.java
(original)
+++ incubator/click/trunk/click/extras/src/org/apache/click/extras/control/LinkDecorator.java
Mon Nov  9 21:20:24 2009
@@ -174,8 +174,8 @@
     /** The method cached for rendering column values. */
     protected transient Map methodCache;
 
-    /** The parameter name of the target object identifier property. */
-    protected String targetIdProperty;
+    /** An optional parameter name for the {@link #idProperty}. */
+    protected String parameterName;
 
     /**
      * Create a new AbstractLink table column Decorator with the given actionLink
@@ -211,8 +211,7 @@
      * For the PostCode "NSW" the PageLink will render as follows:
      *
      * &lt;pre class="prettyprint"&gt;
-     * &amp;lt;a href="/mycorp/postcodes.htm?state=NSW&amp;gt;Select&amp;lt;/a&amp;gt;
-     * &lt;/pre&gt;
+     * &amp;lt;a href="/mycorp/postcodes.htm?state=NSW&amp;gt;Select&amp;lt;/a&amp;gt; &lt;/pre&gt;
      *
      * @param table the table to render the links for
      * @param link the AbstractLink to render
@@ -265,39 +264,44 @@
 
     /**
      * Create a new AbstractLink table column Decorator with the given
-     * AbstractLinks array, row object identifier property name and a target object identifier
property.
+     * AbstractLinks array, &lt;tt&gt;row object identifier&lt;/tt&gt; property name and
+     * &lt;tt&gt;parameter name&lt;/tt&gt;.
      * &lt;p/&gt;
-     * This approach is very useful for tables that have columns from various entities, to
be able to point
-     * to those entities directly (since e.g. the ID is already available).
+     * When the link is rendered, the &lt;tt&gt;parameter name&lt;/tt&gt; is set as the
+     * &lt;tt&gt;row object identifier&lt;/tt&gt; parameter. For example:
      *
      * &lt;pre class="prettyprint"&gt;
-     *   // e.g. for a Table that various data, but a column with related users too.
-     *   ...
-     *   Column userName = new Column("toUser.userName");
-     *   userName.setHeaderTitle("User Name");
-     *   table.addColumn(userName);
-     *   ...
-     *
-     *   // to be able to point with the action from the table to that user directly:
-     *   ...
-     *   column.setDecorator(new LinkDecorator(table,links,"toUser.userName","id"));
-     *   // or if a type converter is used:
-     *   column.setDecorator(new LinkDecorator(table,links,"toUser.userName","user"));
-     *   ...
-     * &lt;/pre&gt;
+     *   // PageLink links to a Page where customers can be edited -&gt; EditCustomerPage
+     *   PageLink editLink = new PageLink("edit", EditCustomerPage.class);
+     *   AbstractLink[] actions = new AbstractLink[] {editLink};
+     *   Column column = new Column("id");
+     *   table.addColumn(column);
+     *   column.setDecorator(new LinkDecorator(table, actions, "id", "idParam")); &lt;/pre&gt;
+     *
+     * If the table displayed a list of customers, the customer with &lt;tt&gt;id&lt;/tt&gt;,
+     * &lt;tt&gt;"123"&lt;/tt&gt;, will render the following editLink:
      *
-     * Or in any case where the same entity need to be referenced from two different directions.
+     * &lt;pre class="codeHtml"&gt;
+     * &amp;lt;a href="/mycorp/edit-customer.htm?&lt;span class="red"&gt;idParam=123&lt;/span&gt;"&amp;gt;edit&amp;lt;/a&amp;gt;
&lt;/pre&gt;
+     *
+     * If the &lt;tt&gt;parameter name&lt;/tt&gt; was not specified the &lt;tt&gt;row object
identifier&lt;/tt&gt;
+     * parameter will default to the given &lt;tt&gt;idProperty&lt;/tt&gt;, in this case
&lt;tt&gt;"id"&lt;/tt&gt;:
+     *
+     * &lt;pre class="codeHtml"&gt;
+     * &amp;lt;a href="/mycorp/edit-customer.htm?&lt;span class="red"&gt;id=123&lt;/span&gt;"&amp;gt;edit&amp;lt;/a&amp;gt;
&lt;/pre&gt;
      *
      * @see LinkDecorator#LinkDecorator(org.apache.click.control.Table, org.apache.click.control.AbstractLink,
java.lang.String)
      *
      * @param table the table to render the links for
      * @param links the array of AbstractLinks to render
      * @param idProperty the row object identifier property name
-     * @param targetIdProperty the parameter name for the target identifier property
+     * @param parameterName a parameter name for the row object identifier
      */
-    public LinkDecorator(Table table, AbstractLink[] links, String idProperty, String targetIdProperty)
{
+    public LinkDecorator(Table table, AbstractLink[] links, String idProperty,
+        String parameterName) {
+
         this(table, links, idProperty);
-        this.targetIdProperty = targetIdProperty;
+        this.parameterName = parameterName;
     }
 
     /**
@@ -332,6 +336,48 @@
 
     /**
      * Create a new ActionButton table column Decorator with the given
+     * ActionButton array, &lt;tt&gt;row object identifier&lt;/tt&gt; property name and
+     * &lt;tt&gt;parameter name&lt;/tt&gt;.
+     * &lt;p/&gt;
+     * When the button is rendered, the &lt;tt&gt;parameter name&lt;/tt&gt; is set as the
+     * &lt;tt&gt;row object identifier&lt;/tt&gt; parameter. For example:
+     *
+     * &lt;pre class="prettyprint"&gt;
+     *   // PageButton links to a Page where customers can be edited -&gt; EditCustomerPage
+     *   PageButton editButton = new PageButton("edit", EditCustomerPage.class);
+     *   ActionButton[] actions = new ActionButton[] {editButton};
+     *   Column column = new Column("id");
+     *   table.addColumn(column);
+     *   column.setDecorator(new LinkDecorator(table, actions, "id", "idParam")); &lt;/pre&gt;
+     *
+     * If the table displayed a list of customers, the customer with &lt;tt&gt;id&lt;/tt&gt;,
+     * &lt;tt&gt;"123"&lt;/tt&gt;, will render the following editButton:
+     *
+     * &lt;pre class="codeHtml"&gt;
+     * &amp;lt;input onclick="javascript:document.location.href='/mycorp/edit-customer.htm?actionButton=edit&amp;value=123&amp;&lt;span
class="red"&gt;idParam=123&lt;/span&gt;';"/&amp;gt; &lt;/pre&gt;
+     *
+     * If the &lt;tt&gt;parameter name&lt;/tt&gt; was not specified the &lt;tt&gt;row object
identifier&lt;/tt&gt;
+     * parameter will default to {@value org.apache.click.control.ActionButton#VALUE}:
+     *
+     * &lt;pre class="codeHtml"&gt;
+     * &amp;lt;input onclick="javascript:document.location.href='/mycorp/edit-customer.htm?actionButton=edit&amp;amp;&lt;span
class="red"&gt;value=123&lt;/span&gt;';"/&amp;gt; &lt;/pre&gt;
+     *
+     * @see LinkDecorator#LinkDecorator(org.apache.click.control.Table, org.apache.click.control.ActionButton,
java.lang.String)
+     *
+     * @param table the table to render the buttons for
+     * @param buttons the array of ActionButtons to render
+     * @param idProperty the row object identifier property name
+     * @param parameterName a parameter name for the row object identifier
+     */
+    public LinkDecorator(Table table, ActionButton[] buttons, String idProperty,
+        String parameterName) {
+
+        this(table, buttons, idProperty);
+        this.parameterName = parameterName;
+    }
+
+    /**
+     * Create a new ActionButton table column Decorator with the given
      * ActionButtons array and row object identifier property name.
      * The default linkSeparator for buttons is &lt;tt&gt;" "&lt;/tt&gt;.
      *
@@ -613,11 +659,14 @@
 
         if (link instanceof ActionLink) {
             ((ActionLink) link).setValueObject(value);
+            if (parameterName != null) {
+                link.setParameter(parameterName, value.toString());
+            }
 
         } else {
             if (value != null) {
-                if (targetIdProperty != null) {
-                    link.setParameter(targetIdProperty, value.toString());
+                if (parameterName != null) {
+                    link.setParameter(parameterName, value.toString());
                 } else {
                     link.setParameter(idProperty, value.toString());
                 }
@@ -648,6 +697,9 @@
      */
     protected void initButton(ActionButton button, Context context, Object value) {
         button.setValueObject(value);
+        if (parameterName != null) {
+            button.setParameter(parameterName, value.toString());
+        }
 
         button.setParameter(Table.PAGE, String.valueOf(table.getPageNumber()));
 




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r834240 - /incubator/click/trunk/click/extras/src/org/apache/click/extras/cayenne/DataContextFilter.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091109211835.8922D238890A@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091109211835-8922D238890A@eris-apache-org%3e</id>
<updated>2009-11-09T21:18:35Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Mon Nov  9 21:18:35 2009
New Revision: 834240

URL: http://svn.apache.org/viewvc?rev=834240&amp;view=rev
Log:
formatting

Modified:
    incubator/click/trunk/click/extras/src/org/apache/click/extras/cayenne/DataContextFilter.java

Modified: incubator/click/trunk/click/extras/src/org/apache/click/extras/cayenne/DataContextFilter.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/org/apache/click/extras/cayenne/DataContextFilter.java?rev=834240&amp;r1=834239&amp;r2=834240&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/org/apache/click/extras/cayenne/DataContextFilter.java
(original)
+++ incubator/click/trunk/click/extras/src/org/apache/click/extras/cayenne/DataContextFilter.java
Mon Nov  9 21:18:35 2009
@@ -82,19 +82,19 @@
  *
  *
  * &lt;h3&gt;OSCache Enabled&lt;/h3&gt;
- * 
- * This option enables you to specify whether 
+ *
+ * This option enables you to specify whether
  * &lt;a href="http://www.opensymphony.com/oscache/"&gt;OSCache&lt;/a&gt; should be used
- * as the query cache for the DataDomain. By default OSCache is not enabled. 
+ * as the query cache for the DataDomain. By default OSCache is not enabled.
  * &lt;p/&gt;
  * OSCache enables you to significantly
- * increase the performance of your applications with in-memory query caching. 
- * OSCache provides fine grain control over query caching, expiry and supports 
+ * increase the performance of your applications with in-memory query caching.
+ * OSCache provides fine grain control over query caching, expiry and supports
  * clustered cache invalidation.
  * &lt;p/&gt;
- * See 
+ * See
  * Cayenne &lt;a href="http://cayenne.apache.org/doc/query-result-caching.html"&gt;Query
Result Caching&lt;/a&gt;
- * for more details. 
+ * for more details.
  *
  * &lt;h3&gt;Lifecycle Listener&lt;/h3&gt;
  *




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r834038 - /incubator/click/trunk/click/extras/src/org/apache/click/extras/control/PageButton.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091109124805.98C2823888D8@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091109124805-98C2823888D8@eris-apache-org%3e</id>
<updated>2009-11-09T12:48:05Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Mon Nov  9 12:48:05 2009
New Revision: 834038

URL: http://svn.apache.org/viewvc?rev=834038&amp;view=rev
Log:
redirect supports parameters

Modified:
    incubator/click/trunk/click/extras/src/org/apache/click/extras/control/PageButton.java

Modified: incubator/click/trunk/click/extras/src/org/apache/click/extras/control/PageButton.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/org/apache/click/extras/control/PageButton.java?rev=834038&amp;r1=834037&amp;r2=834038&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/org/apache/click/extras/control/PageButton.java
(original)
+++ incubator/click/trunk/click/extras/src/org/apache/click/extras/control/PageButton.java
Mon Nov  9 12:48:05 2009
@@ -52,9 +52,6 @@
  *      &lt;li&gt;Over {@link org.apache.click.control.ActionButton ActionButton} + forward/redirect
trick:
  *          &lt;ul&gt;
  *               &lt;li&gt;there's no roundtrip to the server.&lt;/li&gt;
- *               &lt;li&gt;&lt;code&gt;org.apache.click.Page#redirect(Class) does not support
parameters&lt;/code&gt; and
- *               &lt;code&gt;org.apache.click.Page#redirect(String)&lt;/code&gt; is prone
to errors when hardcoding
- *               them in the &lt;code&gt;String&lt;/code&gt;.&lt;/li&gt;
  *          &lt;/ul&gt;
  *      &lt;/li&gt;
  * &lt;/ul&gt;




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r833822 - in /incubator/click/trunk/click/framework/src/org/apache/click/service: DeployUtils.java XmlConfigService.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091108042031.796F4238887A@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091108042031-796F4238887A@eris-apache-org%3e</id>
<updated>2009-11-08T04:20:31Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Sun Nov  8 04:20:30 2009
New Revision: 833822

URL: http://svn.apache.org/viewvc?rev=833822&amp;view=rev
Log:
added trace logging

Modified:
    incubator/click/trunk/click/framework/src/org/apache/click/service/DeployUtils.java
    incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java

Modified: incubator/click/trunk/click/framework/src/org/apache/click/service/DeployUtils.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/service/DeployUtils.java?rev=833822&amp;r1=833821&amp;r2=833822&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/service/DeployUtils.java (original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/service/DeployUtils.java Sun
Nov  8 04:20:30 2009
@@ -174,7 +174,7 @@
             }
         }
         catch (IOException ioe) {
-            logService.error("Could not read package: " + packageName + " -- " + ioe);
+            logService.error("could not read package: " + packageName + " -- " + ioe);
         }
 
         return this;
@@ -195,7 +195,7 @@
      */
     protected List&lt;String&gt; listClassResources(URL url, String path) throws IOException
{
         if (logService.isDebugEnabled()) {
-            logService.debug("Listing classes in " + url);
+            logService.debug("listing classes in " + url);
         }
 
         InputStream is = null;
@@ -223,7 +223,7 @@
                         JarInputStream jarInput = new JarInputStream(is);
                         for (JarEntry entry; (entry = jarInput.getNextJarEntry()) != null;)
{
                             if (logService.isTraceEnabled()) {
-                                logService.trace("Jar entry: " + entry.getName());
+                                logService.trace("jar entry: " + entry.getName());
                             }
 
                             if (isRelevantResource(entry.getName())) {
@@ -249,7 +249,7 @@
                             BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                             for (String line; (line = reader.readLine()) != null;) {
                                 if (logService.isTraceEnabled()) {
-                                    logService.trace("Reader entry: " + line);
+                                    logService.trace("reader entry: " + line);
                                 }
                                 if (isRelevantResource(line)) {
                                     children.add(line);
@@ -274,7 +274,7 @@
                         }
                     } else {
                         // No idea where the exception came from so log it
-                        logService.error("Could not deploy the resources from"
+                        logService.error("could not deploy the resources from"
                             + " the url '" + url + "'. You will need to"
                             + " manually included resources from this url in"
                             + " your application.");
@@ -291,7 +291,7 @@
                     String resourcePath = path + "/" + child;
                     if (child.indexOf(".") != -1) {
                         if (logService.isTraceEnabled()) {
-                            logService.trace("Found deployable resource: " + resourcePath);
+                            logService.trace("found deployable resource: " + resourcePath);
                         }
                         resources.add(resourcePath);
                     }
@@ -360,7 +360,7 @@
      */
     protected URL findJarForResource(URL url, String path) throws MalformedURLException {
         if (logService.isTraceEnabled()) {
-            logService.trace("Find JAR URL: " + url);
+            logService.trace("find jar url: " + url);
         }
 
         // If the file part of the URL is itself a URL, then that URL probably points to
the JAR
@@ -368,7 +368,7 @@
             for (;;) {
                 url = new URL(url.getFile());
                 if (logService.isTraceEnabled()) {
-                    logService.trace("Inner URL: " + url);
+                    logService.trace("inner url: " + url);
                 }
             }
         } catch (MalformedURLException e) {
@@ -381,11 +381,11 @@
         if (index &gt;= 0) {
             jarUrl.setLength(index + 4);
             if (logService.isTraceEnabled()) {
-                logService.trace("Extracted JAR URL: " + jarUrl);
+                logService.trace("extracted jar url: " + jarUrl);
             }
         } else {
             if (logService.isTraceEnabled()) {
-                logService.trace("Not a JAR: " + jarUrl);
+                logService.trace("not a jar: " + jarUrl);
             }
             return null;
         }
@@ -398,7 +398,7 @@
             } else {
                 // WebLogic fix: check if the URL's file exists in the filesystem.
                 if (logService.isTraceEnabled()) {
-                    logService.trace("Not a JAR: " + jarUrl);
+                    logService.trace("not a jar: " + jarUrl);
                 }
 
                 jarUrl.replace(0, jarUrl.length(), testUrl.getFile());
@@ -407,7 +407,7 @@
                 File file = new File(ClickUtils.decodeURL(jarUrl.toString()));
                 if (file.exists()) {
                     if (logService.isTraceEnabled()) {
-                        logService.trace("Trying real file: " + file.getAbsolutePath());
+                        logService.trace("trying real file: " + file.getAbsolutePath());
                     }
                     testUrl =  file.toURI().toURL();
                     if (isJar(testUrl)) {
@@ -417,11 +417,11 @@
             }
         }
         catch (MalformedURLException e) {
-            logService.warn("Invalid JAR URL: " + e.getMessage());
+            logService.warn("invalid jar url: " + e.getMessage());
         }
 
         if (logService.isTraceEnabled()) {
-            logService.trace("Not a JAR: " + jarUrl);
+            logService.trace("not a jar: " + jarUrl);
         }
         return null;
     }
@@ -471,7 +471,7 @@
             is.read(buffer, 0, JAR_MAGIC.length);
             if (Arrays.equals(buffer, JAR_MAGIC)) {
                 if (logService.isInfoEnabled()) {
-                    logService.info("Found JAR: " + url);
+                    logService.info("found jar: " + url);
                 }
                 return true;
             }
@@ -505,7 +505,7 @@
             }
         }
         catch (Throwable t) {
-            logService.error("Could not examine class '" + fqn + "'" + " due to a "
+            logService.error("could not examine class '" + fqn + "'" + " due to a "
                 + t.getClass().getName() + " with message: " + t.getMessage());
         }
     }

Modified: incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java?rev=833822&amp;r1=833821&amp;r2=833822&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java
(original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java
Sun Nov  8 04:20:30 2009
@@ -1244,6 +1244,12 @@
     private void deployFiles(Element rootElm) throws Exception {
 
         if (isResourcesDeployable()) {
+            if (getLogService().isTraceEnabled()) {
+                String deployTarget = servletContext.getRealPath("/");
+                getLogService().trace("resource deploy folder: "
+                    + deployTarget);
+            }
+
             deployControls(getResourceRootElement("/click-controls.xml"));
             deployControls(getResourceRootElement("/extras-controls.xml"));
             deployControls(rootElm);




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r833653 - /incubator/click/trunk/click/build/build.xml</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091107084130.25136238888E@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091107084130-25136238888E@eris-apache-org%3e</id>
<updated>2009-11-07T08:41:30Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Sat Nov  7 08:41:29 2009
New Revision: 833653

URL: http://svn.apache.org/viewvc?rev=833653&amp;view=rev
Log:
removed duplicate entry

Modified:
    incubator/click/trunk/click/build/build.xml

Modified: incubator/click/trunk/click/build/build.xml
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/build/build.xml?rev=833653&amp;r1=833652&amp;r2=833653&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/build/build.xml (original)
+++ incubator/click/trunk/click/build/build.xml Sat Nov  7 08:41:29 2009
@@ -550,10 +550,6 @@
 
  
    &lt;target name="get-deps" description="download JAR dependencies"&gt;
-       &lt;ant antfile="build.xml"
-           dir="examples"
-           target="get-deps"
-           inheritall="false"/&gt;
       &lt;downloadMacro name="${jar.codec}" path="commons-codec/commons-codec/${commons-codec.version}"/&gt;
       &lt;downloadMacro name="${jar.collections}" path="commons-collections/commons-collections/${commons-collections.version}"/&gt;
       &lt;downloadMacro name="${jar.io}" path="commons-io/commons-io/${commons-io.version}"/&gt;




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r833367 - /incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091106115903.EE86523888E2@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091106115903-EE86523888E2@eris-apache-org%3e</id>
<updated>2009-11-06T11:59:03Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Fri Nov  6 11:59:03 2009
New Revision: 833367

URL: http://svn.apache.org/viewvc?rev=833367&amp;view=rev
Log:
implemented resource service to use lazy loading instead

Modified:
    incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java

Modified: incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java?rev=833367&amp;r1=833366&amp;r2=833367&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
(original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
Fri Nov  6 11:59:03 2009
@@ -18,30 +18,21 @@
  */
 package org.apache.click.service;
 
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.net.URL;
 import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
+import java.util.concurrent.ConcurrentHashMap;
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.click.util.ClickUtils;
-import org.apache.commons.io.FileUtils;
+import org.apache.click.util.HtmlStringBuffer;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.filefilter.TrueFileFilter;
 
 /**
  * Provides a default Click static resource service class. This class will
@@ -50,12 +41,12 @@
  * web root.
  * &lt;p/&gt;
  * This service is useful for application servers which do not allow Click to
- * automatically deploy resources to the web root /click/ directory.
+ * automatically deploy resources to the web root directory.
  */
 public class ClickResourceService implements ResourceService {
 
     /** The click resources cache. */
-    protected Map&lt;String, byte[]&gt; resourceCache = new HashMap&lt;String, byte[]&gt;();
+    protected Map&lt;String, byte[]&gt; resourceCache = new ConcurrentHashMap&lt;String,
byte[]&gt;();
 
     /** The application log service. */
     protected LogService logService;
@@ -73,18 +64,6 @@
 
         configService = ClickUtils.getConfigService(servletContext);
         logService = configService.getLogService();
-
-        // Load all JAR resources
-        List&lt;String&gt; cacheables = getCacheableDirs();
-        for (String cacheable : cacheables) {
-            loadJarResources(cacheable);
-        }
-
-        // Load file system resources. File system resources override JAR
-        // resources
-        for (String cacheable : cacheables) {
-            loadDirResources(servletContext, cacheable);
-        }
     }
 
     /**
@@ -120,9 +99,16 @@
 
         String resourcePath = ClickUtils.getResourcePath(request);
 
-        if (!resourceCache.containsKey(resourcePath)) {
-            response.sendError(HttpServletResponse.SC_NOT_FOUND);
-            return;
+        byte[] resourceData = resourceCache.get(resourcePath);
+
+        if (resourceData == null) {
+            // Lazily load resource
+            resourceData = loadResourceData(resourcePath);
+
+            if (resourceData == null) {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                return;
+            }
         }
 
         String mimeType = ClickUtils.getMimeType(resourcePath);
@@ -130,7 +116,14 @@
             response.setContentType(mimeType);
         }
 
-        byte[] resourceData = resourceCache.get(resourcePath);
+        if (logService.isDebugEnabled()) {
+            HtmlStringBuffer buffer = new HtmlStringBuffer(200);
+            buffer.append("handleRequest: ");
+            buffer.append(request.getMethod());
+            buffer.append(" ");
+            buffer.append(request.getRequestURL());
+            logService.debug(buffer);
+        }
         renderResource(response, resourceData);
     }
 
@@ -165,30 +158,30 @@
      * &lt;pre class="prettyprint"&gt;
      * &amp;lt;-- The default Click *.htm mapping --&amp;gt;
      * &amp;lt;servlet-mapping&amp;gt;
-		 *   &amp;lt;servlet-name&amp;gt;ClickServlet&amp;lt;/servlet-name&amp;gt;
-		 *   &amp;lt;url-pattern&amp;gt;*.htm&amp;lt;/url-pattern&amp;gt;
-	   * &amp;lt;/servlet-mapping&amp;gt;
+         *   &amp;lt;servlet-name&amp;gt;ClickServlet&amp;lt;/servlet-name&amp;gt;
+         *   &amp;lt;url-pattern&amp;gt;*.htm&amp;lt;/url-pattern&amp;gt;
+       * &amp;lt;/servlet-mapping&amp;gt;
      *
      * &amp;lt;-- Add a mapping to serve all resources under /click directly from
      * the JARs. --&amp;gt;
-	   * &amp;lt;servlet-mapping&amp;gt;
-		 *   &amp;lt;servlet-name&amp;gt;ClickServlet&amp;lt;/servlet-name&amp;gt;
-		 *   &amp;lt;url-pattern&amp;gt;/click/*&amp;lt;/url-pattern&amp;gt;
-	   * &amp;lt;/servlet-mapping&amp;gt;
+       * &amp;lt;servlet-mapping&amp;gt;
+         *   &amp;lt;servlet-name&amp;gt;ClickServlet&amp;lt;/servlet-name&amp;gt;
+         *   &amp;lt;url-pattern&amp;gt;/click/*&amp;lt;/url-pattern&amp;gt;
+       * &amp;lt;/servlet-mapping&amp;gt;
      *
      * &amp;lt;-- Add another mapping to serve all resources under /clickclick
      * from the JARs. --&amp;gt;
-	   * &amp;lt;servlet-mapping&amp;gt;
-		 *   &amp;lt;servlet-name&amp;gt;ClickServlet&amp;lt;/servlet-name&amp;gt;
-		 *   &amp;lt;url-pattern&amp;gt;/clickclick/*&amp;lt;/url-pattern&amp;gt;
-	   * &amp;lt;/servlet-mapping&amp;gt;
+       * &amp;lt;servlet-mapping&amp;gt;
+         *   &amp;lt;servlet-name&amp;gt;ClickServlet&amp;lt;/servlet-name&amp;gt;
+         *   &amp;lt;url-pattern&amp;gt;/clickclick/*&amp;lt;/url-pattern&amp;gt;
+       * &amp;lt;/servlet-mapping&amp;gt;
      *
      * &amp;lt;-- Add a mapping to serve all resources under /mycorp
      * from the JARs. --&amp;gt;
-	   * &amp;lt;servlet-mapping&amp;gt;
-		 *   &amp;lt;servlet-name&amp;gt;ClickServlet&amp;lt;/servlet-name&amp;gt;
-		 *   &amp;lt;url-pattern&amp;gt;/mycorp/*&amp;lt;/url-pattern&amp;gt;
-	   * &amp;lt;/servlet-mapping&amp;gt;
+       * &amp;lt;servlet-mapping&amp;gt;
+         *   &amp;lt;servlet-name&amp;gt;ClickServlet&amp;lt;/servlet-name&amp;gt;
+         *   &amp;lt;url-pattern&amp;gt;/mycorp/*&amp;lt;/url-pattern&amp;gt;
+       * &amp;lt;/servlet-mapping&amp;gt;
      * &lt;/pre&gt;
      *
      * @return list of directories that should be cached
@@ -201,225 +194,47 @@
 
     // Private Methods --------------------------------------------------------
 
-    private void loadJarResources(String resourceDir) throws IOException {
-        if (resourceDir == null) {
-            throw new IllegalArgumentException("resource directory cannot be null");
-        }
-
-        long startTime = System.currentTimeMillis();
-
-        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-
-        if (!resourceDir.startsWith("/")) {
-            resourceDir = '/' + resourceDir;
-        }
-
-        // Find all jars and directories on the classpath that contains the
-        // directory "META-INF/resources/&lt;resourceDir&gt;", and deploy those resources
-        String resourceDirectory = "META-INF/resources" + resourceDir;
-        Enumeration&lt;URL&gt; en = classLoader.getResources(resourceDirectory);
-        while (en.hasMoreElements()) {
-            URL url = en.nextElement();
-            loadResourcesOnClasspath(url, resourceDirectory);
-        }
-
-        if (logService.isTraceEnabled()) {
-            logService.trace("loaded files from jars and folders - "
-                + (System.currentTimeMillis() - startTime) + " ms");
-        }
-    }
-
     /**
-     * Deploy from the url all resources found under the prefix.
+     * Store the resource under the given resource path.
      *
-     * @param url the url of the jar or folder which resources to deploy
-     * @param resourceDirectory the directory under which resources are found
-     * @throws IOException if resources from the url cannot be deployed
+     * @param resourcePath the path to store the resource under
+     * @param data the resource byte array
      */
-    private void loadResourcesOnClasspath(URL url, String resourceDirectory)
-        throws IOException {
-
-        String path = url.getFile();
-
-        // Decode the url, esp on Windows where file paths can have their
-        // spaces encoded. decodeURL will convert C:\Program%20Files\project
-        // to C:\Program Files\project
-        path = ClickUtils.decodeURL(path);
-
-        // Strip file prefix
-        if (path.startsWith("file:")) {
-            path = path.substring(5);
-        }
-
-        String jarPath = null;
-
-        // Check if path represents a jar
-        if (path.indexOf('!') &gt; 0) {
-            jarPath = path.substring(0, path.indexOf('!'));
-
-            File jar = new File(jarPath);
-
-            if (jar.exists()) {
-                loadFilesInJar(jar, resourceDirectory);
-
-            } else {
-                logService.error("Could not load the jar '" + jarPath
-                    + "'. Please ensure this file exists in the specified"
-                    + " location.");
-            }
-        } else {
-            File dir = new File(path);
-            loadFilesInJarDir(dir, resourceDirectory);
+    private void storeResourceData(String resourcePath, byte[] data) {
+        // Only cache in production modes
+        if (configService.isProductionMode() || configService.isProfileMode()) {
+            resourceCache.put(resourcePath, data);
         }
     }
 
-    private void loadFilesInJar(File jar, String resourceDirectory)
-        throws IOException {
-
-        if (jar == null) {
-            throw new IllegalArgumentException("Jar cannot be null");
-        }
-
-        InputStream inputStream = null;
-        JarInputStream jarInputStream = null;
-
-        try {
-
-            inputStream = new FileInputStream(jar);
-            jarInputStream = new JarInputStream(inputStream);
-            JarEntry jarEntry = null;
-
-            // Indicates whether feedback should be logged about the files deployed
-            // from jar
-            boolean logFeedback = true;
-            while ((jarEntry = jarInputStream.getNextJarEntry()) != null) {
-
-                // Guard against loading folders -&gt; META-INF/resources/click/
-                if (jarEntry.isDirectory()) {
-                    continue;
-                }
-
-                // jarEntryName example -&gt; META-INF/resources/click/table.css
-                String jarEntryName = jarEntry.getName();
-
-                // Only deploy resources from "META-INF/resources/"
-                int pathIndex = jarEntryName.indexOf(resourceDirectory);
-                if (pathIndex == 0) {
-                    if (logFeedback &amp;&amp; logService.isTraceEnabled()) {
-                        logService.trace("loaded files from jar -&gt; "
-                                         + jar.getCanonicalPath());
-
-                        // Only provide feedback once per jar
-                        logFeedback = false;
-                    }
-                    loadJarFile(jarEntryName, resourceDirectory);
-                }
-            }
-        } finally {
-            ClickUtils.close(jarInputStream);
-            ClickUtils.close(inputStream);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private void loadFilesInJarDir(File dir, String resourceDirectory)
-        throws IOException {
-
-        if (dir == null) {
-            throw new IllegalArgumentException("Dir cannot be null");
-        }
-
-        if (!dir.exists()) {
-            logService.trace("No resources deployed from the folder '" + dir.getAbsolutePath()
-                + "' as it does not exist.");
-            return;
-        }
+    /**
+     * Load the resource for the given resourcePath. This method will load the
+     * resource from the servlet context, and if not found, load it from the
+     * classpath under the folder 'META-INF/resources'.
+     *
+     * @param resourcePath the path to the resource to load
+     * @return the resource as a byte array
+     * @throws IOException if the resources cannot be loaded
+     */
+    private byte[] loadResourceData(String resourcePath) throws IOException {
 
-        Iterator files = FileUtils.iterateFiles(dir,
-                                                TrueFileFilter.INSTANCE,
-                                                TrueFileFilter.INSTANCE);
-
-        boolean logFeedback = true;
-        while (files.hasNext()) {
-            // file example -&gt; META-INF/resources/click/table.css
-            File file = (File) files.next();
-
-            // Guard against loading folders -&gt; META-INF/resources/click/
-            if (file.isDirectory()) {
-                continue;
-            }
+        byte[] resourceData = null;
 
-            String fileName = file.getCanonicalPath().replace('\\', '/');
+        ServletContext servletContext = configService.getServletContext();
 
-            // Only deploy resources from "META-INF/resources/"
-            int pathIndex = fileName.indexOf(resourceDirectory);
-            if (pathIndex != -1) {
-                if (logFeedback &amp;&amp; logService.isTraceEnabled()) {
-                    logService.trace("loaded files from folder -&gt; "
-                        + dir.getAbsolutePath());
-
-                    // Only provide feedback once per dir
-                    logFeedback = false;
-                }
-                fileName = fileName.substring(pathIndex);
-                loadJarFile(fileName, resourceDirectory);
-            }
-        }
-    }
+        resourceData = getServletResourceData(servletContext, resourcePath);
+        if (resourceData != null) {
+            storeResourceData(resourcePath, resourceData);
+        } else {
+            resourceData = getClasspathResourceData("META-INF/resources"
+                + resourcePath);
 
-    private void loadJarFile(String file, String prefix) throws IOException {
-        // Only deploy resources containing the prefix
-        int pathIndex = file.indexOf(prefix);
-        if (pathIndex == 0) {
-            pathIndex += prefix.length();
-
-            // resourceName example -&gt; click/table.css
-            String resourceName = file.substring(pathIndex);
-
-            if (resourceName.length() &gt; 0) {
-                byte[] resourceBytes = getClasspathResourceData(file);
-
-                if (resourceBytes != null) {
-                    resourceCache.put("/" + resourceName, resourceBytes);
-                }
+            if (resourceData != null) {
+                storeResourceData(resourcePath, resourceData);
             }
         }
-    }
-
-    @SuppressWarnings("unchecked")
-    private void loadDirResources(ServletContext servletContext, String resourceDir)
-        throws IOException {
-
-        if (resourceDir == null) {
-            throw new IllegalArgumentException("resource directory cannot be null");
-        }
-
-        Set resources = servletContext.getResourcePaths(resourceDir);
 
-        if (resources != null) {
-            // Add all resources withtin web application
-            for (Iterator i = resources.iterator(); i.hasNext();) {
-                String resource = (String) i.next();
-
-                // If resource is a folder, recursively look for resources in
-                // that folder
-                if (resource.endsWith("/")) {
-
-                    loadDirResources(servletContext, resource);
-                } else {
-
-                    if (!configService.isTemplate(resource)) {
-
-                        byte[] resourceData =
-                            getServletResourceData(servletContext, resource);
-
-                        if (resourceData != null) {
-                            resourceCache.put(resource, resourceData);
-                        }
-                    }
-                }
-            }
-        }
+        return resourceData;
     }
 
     /**




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r833366 - /incubator/click/trunk/click/documentation/docs/roadmap-changes.html</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091106115819.6F48623888E2@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091106115819-6F48623888E2@eris-apache-org%3e</id>
<updated>2009-11-06T11:58:19Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Fri Nov  6 11:58:18 2009
New Revision: 833366

URL: http://svn.apache.org/viewvc?rev=833366&amp;view=rev
Log:
roadmap

Modified:
    incubator/click/trunk/click/documentation/docs/roadmap-changes.html

Modified: incubator/click/trunk/click/documentation/docs/roadmap-changes.html
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/documentation/docs/roadmap-changes.html?rev=833366&amp;r1=833365&amp;r2=833366&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/documentation/docs/roadmap-changes.html (original)
+++ incubator/click/trunk/click/documentation/docs/roadmap-changes.html Fri Nov  6 11:58:18
2009
@@ -257,6 +257,20 @@
           [&lt;a target='_blank' href="https://issues.apache.org/click/browse/CLK-406"&gt;406&lt;/a&gt;].
       &lt;/li&gt;
       &lt;li class="change"&gt;
+          Added an Ant task, called DeployTask, for deploying static resources
+          at build time. This task is useful when deploying Click applications
+          in restricted environments. For more details see the section:
+          &lt;a href="user-guide/html/ch04s03.html#deploying-restricted-env"&gt;deploying
resources in a restricted environment&lt;/a&gt;.
+      &lt;/li&gt;
+      &lt;li class="change"&gt;
+          Added a &lt;a href="click-api/org/apache/click/service/ResourceService.html"&gt;ResourceService&lt;/a&gt;,
+          for serving static resources at runtime. This service is useful when
+          deploying Click applications in restricted environments. For more details
+          see the section:
+          &lt;a href="user-guide/html/ch04s03.html#deploying-restricted-env"&gt;deploying
resources in a restricted environment&lt;/a&gt;
+          [&lt;a target='_blank' href="https://issues.apache.org/click/browse/CLK-564"&gt;564&lt;/a&gt;].
+      &lt;/li&gt;
+      &lt;li class="change"&gt;
           Added method,
           &lt;a href="click-api/org/apache/click/util/ClickUtils.html#createTemplateModel(org.apache.click.Page,
org.apache.click.Context)"&gt;ClickUtils.createTemplateModel&lt;/a&gt;,
           which returns a template model containing objects such as the Context




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r833352 - /incubator/click/trunk/click/documentation/docs/roadmap-changes.html</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091106113109.DBB42238897A@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091106113109-DBB42238897A@eris-apache-org%3e</id>
<updated>2009-11-06T11:31:09Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Fri Nov  6 11:31:09 2009
New Revision: 833352

URL: http://svn.apache.org/viewvc?rev=833352&amp;view=rev
Log:
roadmap

Modified:
    incubator/click/trunk/click/documentation/docs/roadmap-changes.html

Modified: incubator/click/trunk/click/documentation/docs/roadmap-changes.html
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/documentation/docs/roadmap-changes.html?rev=833352&amp;r1=833351&amp;r2=833352&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/documentation/docs/roadmap-changes.html (original)
+++ incubator/click/trunk/click/documentation/docs/roadmap-changes.html Fri Nov  6 11:31:09
2009
@@ -378,6 +378,12 @@
           [&lt;a target='_blank' href="https://issues.apache.org/jira/browse/CLK-535"&gt;535&lt;/a&gt;].
       &lt;/li&gt;
       &lt;li class="change"&gt;
+          Fixed resource deployment on JBoss 5 and up. The solution is based on
+          the work done by the &lt;a class="external" target="_blank" href="http://www.stripesframework.org"&gt;Stripes
Framework&lt;/a&gt;
+          developers
+          [&lt;a target='_blank' href="https://issues.apache.org/jira/browse/CLK-589"&gt;589&lt;/a&gt;].
+      &lt;/li&gt;
+      &lt;li class="change"&gt;
           Fixed &lt;a class="external" target="_blank" href="http://code.google.com/p/click-calendar/"&gt;Click
Calendar&lt;/a&gt;
           memory leak in calendar popup with version 1.0.1 released
           [&lt;a target='_blank' href="https://issues.apache.org/jira/browse/CLK-499"&gt;499&lt;/a&gt;].




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r833349 - in /incubator/click/trunk/click: LICENSE.txt NOTICE.txt framework/src/org/apache/click/service/DeployUtils.java framework/src/org/apache/click/service/XmlConfigService.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091106112307.4116923888E2@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091106112307-4116923888E2@eris-apache-org%3e</id>
<updated>2009-11-06T11:23:07Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Fri Nov  6 11:23:06 2009
New Revision: 833349

URL: http://svn.apache.org/viewvc?rev=833349&amp;view=rev
Log:
fixed resource deployment for JBoss 5. CLK-589

Added:
    incubator/click/trunk/click/framework/src/org/apache/click/service/DeployUtils.java
Modified:
    incubator/click/trunk/click/LICENSE.txt
    incubator/click/trunk/click/NOTICE.txt
    incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java

Modified: incubator/click/trunk/click/LICENSE.txt
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/LICENSE.txt?rev=833349&amp;r1=833348&amp;r2=833349&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/LICENSE.txt (original)
+++ incubator/click/trunk/click/LICENSE.txt Fri Nov  6 11:23:06 2009
@@ -804,3 +804,10 @@
          here. Licensor shall not be bound by any additional provisions that
          may appear in any communication from You. This License may not be
          modified without the mutual written agreement of the Licensor and You.
+
+======================================================================
+
+STRIPES FRAMEWORK LICENSE
+
+org.apache.click.service.DeployUtils is taken from the Stripes Framework
+distributed under the terms of the Apache Software License 2.0.

Modified: incubator/click/trunk/click/NOTICE.txt
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/NOTICE.txt?rev=833349&amp;r1=833348&amp;r2=833349&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/NOTICE.txt (original)
+++ incubator/click/trunk/click/NOTICE.txt Fri Nov  6 11:23:06 2009
@@ -82,4 +82,8 @@
 
 This project includes the FamFamFam icons by Mark James, distributed
 under the terms of the Creative Commons Attribution 2.5 License.
-http://www.famfamfam.com/lab/icons
\ No newline at end of file
+http://www.famfamfam.com/lab/icons
+
+This product includes the class org.apache.click.service.DeployUtils.java
+from the Stripes Framework, released under the Apache 2.0 license.
+http://stripesframework.org
\ No newline at end of file

Added: incubator/click/trunk/click/framework/src/org/apache/click/service/DeployUtils.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/service/DeployUtils.java?rev=833349&amp;view=auto
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/service/DeployUtils.java (added)
+++ incubator/click/trunk/click/framework/src/org/apache/click/service/DeployUtils.java Fri
Nov  6 11:23:06 2009
@@ -0,0 +1,552 @@
+/* Copyright 2005-2006 Tim Fennell
+ *
+ * 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.
+ */
+package org.apache.click.service;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.jar.JarEntry;
+import java.util.jar.JarInputStream;
+import org.apache.click.util.ClickUtils;
+
+/**
+ * &lt;p&gt;ResolverUtil is used to locate classes that are available in the/a class path
and meet
+ * arbitrary conditions. The two most common conditions are that a class implements/extends
+ * another class, or that is it annotated with a specific annotation. However, through the
use
+ * of the {@link Test} class it is possible to search using arbitrary conditions.&lt;/p&gt;
+ *
+ * &lt;p&gt;A ClassLoader is used to locate all locations (directories and jar files) in
the class
+ * path that contain classes within certain packages, and then to load those classes and
+ * check them. By default the ClassLoader returned by
+ *  {@code Thread.currentThread().getContextClassLoader()} is used, but this can be overridden
+ * by calling {@link #setClassLoader(ClassLoader)} prior to invoking any of the {@code find()}
+ * methods.&lt;/p&gt;
+ *
+ * &lt;p&gt;General searches are initiated by calling the
+ * {@link #find(net.sourceforge.stripes.util.ResolverUtil.Test, String)} ()} method and supplying
+ * a package name and a Test instance. This will cause the named package &lt;b&gt;and all
sub-packages&lt;/b&gt;
+ * to be scanned for classes that meet the test. There are also utility methods for the common
+ * use cases of scanning multiple packages for extensions of particular classes, or classes
+ * annotated with a specific annotation.&lt;/p&gt;
+ *
+ * &lt;p&gt;The standard usage pattern for the ResolverUtil class is as follows:&lt;/p&gt;
+ *
+ *&lt;pre&gt;
+ *ResolverUtil&amp;lt;ActionBean&amp;gt; resolver = new ResolverUtil&amp;lt;ActionBean&amp;gt;();
+ *resolver.findImplementation(ActionBean.class, pkg1, pkg2);
+ *resolver.find(new CustomTest(), pkg1);
+ *resolver.find(new CustomTest(), pkg2);
+ *Collection&amp;lt;ActionBean&amp;gt; beans = resolver.getClasses();
+ *&lt;/pre&gt;
+ *
+ * This class was copied and adpated from the Stripes Framework -
+ * &lt;a href="http://www.stripesframework.org"&gt;Stripes&lt;/a&gt;.
+ *
+ * @author Tim Fennell
+ */
+class DeployUtils&lt;T&gt; {
+
+    // -------------------------------------------------------------- Constants
+
+    /** The magic header that indicates a JAR (ZIP) file. */
+    private static final byte[] JAR_MAGIC = { 'P', 'K', 3, 4 };
+
+    // -------------------------------------------------------------- Variables
+
+    /** The set of matches being accumulated. */
+    private List&lt;String&gt; matches = new ArrayList&lt;String&gt;();
+
+    /** The log service to log output to. */
+    private LogService logService;
+
+    /**
+     * The ClassLoader to use when looking for classes. If null then the ClassLoader
+     * returned by Thread.currentThread().getContextClassLoader() will be used.
+     */
+    private ClassLoader classloader;
+
+    // ----------------------------------------------------------- Constructors
+
+    /**
+     * Create a new DeployUtils instance.
+     *
+     * @param logService the logService to log output to
+     */
+    public DeployUtils(LogService logService) {
+        this.logService = logService;
+    }
+
+    // --------------------------------------------------------- Public Methods
+
+    /**
+     * Provides access to the resources discovered so far. If no calls have been
+     * made to any of the {@code find()} methods, this list will be empty.
+     *
+     * @return the list of resources that have been discovered.
+     */
+    public List&lt;String&gt; getResources() {
+        return matches;
+    }
+
+    /**
+     * Returns the classloader that will be used for scanning for classes. If no explicit
+     * ClassLoader has been set by the calling, the context class loader will be used.
+     *
+     * @return the ClassLoader that will be used to scan for classes
+     */
+    public ClassLoader getClassLoader() {
+        return classloader == null ? Thread.currentThread().getContextClassLoader() : classloader;
+    }
+
+    /**
+     * Sets an explicit ClassLoader that should be used when scanning for classes. If none
+     * is set then the context classloader will be used.
+     *
+     * @param classloader a ClassLoader to use when scanning for classes
+     */
+    public void setClassLoader(ClassLoader classloader) {
+        this.classloader = classloader;
+    }
+
+    /**
+     * Attemp to discover resources inside the given directory. Accumulated
+     * resources can be accessed by calling {@link #getResources()}.
+     *
+     * @param dirs one or more directories to scan (including sub-directories)
+     * for resources
+     * @return instance of DeployUtils allows for chaining calls
+     */
+    public DeployUtils&lt;T&gt; findResources(String... dirs) {
+        if (dirs == null) {
+            return this;
+        }
+
+        Test test = new IsDeployable();
+        for (String dir : dirs) {
+            find(test, dir);
+        }
+
+        return this;
+    }
+
+    /**
+     * Scans for classes starting at the package provided and descending into subpackages.
+     * Each class is offered up to the Test as it is discovered, and if the Test returns
+     * true the class is retained.  Accumulated classes can be fetched by calling
+     * {@link #getClasses()}.
+     *
+     * @param test an instance of {@link Test} that will be used to filter classes
+     * @param packageName the name of the package from which to start scanning for
+     *        classes, e.g. {@code net.sourceforge.stripes}
+     */
+    public DeployUtils&lt;T&gt; find(Test test, String packageName) {
+        String path = getPackagePath(packageName);
+
+        try {
+            List&lt;URL&gt; urls = Collections.list(getClassLoader().getResources(path));
+            for (URL url : urls) {
+                List&lt;String&gt; children = listClassResources(url, path);
+                for (String child : children) {
+                    addIfMatching(test, child);
+                }
+            }
+        }
+        catch (IOException ioe) {
+            logService.error("Could not read package: " + packageName + " -- " + ioe);
+        }
+
+        return this;
+    }
+
+    // ------------------------------------------------------ Protected Methods
+
+    /**
+     * Recursively list all resources under the given URL that appear to define a Java class.
+     * Matching resources will have a name that ends in ".class" and have a relative path
such that
+     * each segment of the path is a valid Java identifier. The resource paths returned will
be
+     * relative to the URL and begin with the specified path.
+     *
+     * @param url The URL of the parent resource to search.
+     * @param path The path with which each matching resource path must begin, relative to
the URL.
+     * @return A list of matching resources. The list may be empty.
+     * @throws IOException
+     */
+    protected List&lt;String&gt; listClassResources(URL url, String path) throws IOException
{
+        if (logService.isDebugEnabled()) {
+            logService.debug("Listing classes in " + url);
+        }
+
+        InputStream is = null;
+        try {
+            List&lt;String&gt; resources = new ArrayList&lt;String&gt;();
+
+            // First, try to find the URL of a JAR file containing the requested
+            // resource. If a JAR file is found, then we'll list child resources
+            // by reading the JAR.
+            URL jarUrl = findJarForResource(url, path);
+            if (jarUrl != null) {
+                // example jarUrl : jar:c:/dev/mylib.jar
+                is = jarUrl.openStream();
+                resources = listClassResources(new JarInputStream(is), path);
+
+            } else {
+                List&lt;String&gt; children = new ArrayList&lt;String&gt;();
+                try {
+                    if (isJar(url)) {
+                        // example url : jar:c:/dev/mylib.jar/META-INF/resources
+
+                        // Some versions of JBoss VFS might give a JAR stream even
+                        // if the resource referenced by the URL isn't actually a JAR
+                        is = url.openStream();
+                        JarInputStream jarInput = new JarInputStream(is);
+                        for (JarEntry entry; (entry = jarInput.getNextJarEntry()) != null;)
{
+                            if (logService.isTraceEnabled()) {
+                                logService.trace("Jar entry: " + entry.getName());
+                            }
+
+                            if (isRelevantResource(entry.getName())) {
+                                children.add(entry.getName());
+                            }
+                        }
+                    } else {
+                        // Some servlet containers allow reading from "directory"
+                        // resources like text file, listing the child resources
+                        // one per line.
+                        is = url.openStream();
+
+                        // There is the possibility that a file doesn't have an
+                        // extension and would be seen as a directory. Guard against
+                        // that by checking that the url is a file and adding it
+                        // to the list of resources
+                        File file = new File(url.getFile());
+                        if (file.isFile()) {
+                            if (isRelevantResource(file.getName())) {
+                                resources.add(path);
+                            }
+                        } else {
+                            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+                            for (String line; (line = reader.readLine()) != null;) {
+                                if (logService.isTraceEnabled()) {
+                                    logService.trace("Reader entry: " + line);
+                                }
+                                if (isRelevantResource(line)) {
+                                    children.add(line);
+                                }
+                            }
+                        }
+                    }
+                } catch (FileNotFoundException e) {
+                    /*
+                     * For file URLs the openStream() call might fail, depending on the servlet
+                     * container, because directories can't be opened for reading. If that
happens,
+                     * then list the directory directly instead.
+                     */
+                    if ("file".equals(url.getProtocol())) {
+                        File file = new File(url.getFile());
+                        if (file.isDirectory()) {
+                            children = Arrays.asList(file.list(new FilenameFilter() {
+                                public boolean accept(File dir, String name) {
+                                    return isRelevantResource(name);
+                                }
+                            }));
+                        }
+                    } else {
+                        // No idea where the exception came from so log it
+                        logService.error("Could not deploy the resources from"
+                            + " the url '" + url + "'. You will need to"
+                            + " manually included resources from this url in"
+                            + " your application.");
+                    }
+                }
+
+                // The URL prefix to use when recursively listing child resources
+                String prefix = url.toExternalForm();
+                if (!prefix.endsWith("/"))
+                    prefix = prefix + "/";
+
+                // Iterate over each immediate child, adding classes and recursing into directories
+                for (String child : children) {
+                    String resourcePath = path + "/" + child;
+                    if (child.indexOf(".") != -1) {
+                        if (logService.isTraceEnabled()) {
+                            logService.trace("Found deployable resource: " + resourcePath);
+                        }
+                        resources.add(resourcePath);
+                    }
+                    else {
+                        URL childUrl = new URL(prefix + child);
+                        resources.addAll(listClassResources(childUrl, resourcePath));
+                    }
+                }
+            }
+
+            return resources;
+        }
+        finally {
+            try {
+                is.close();
+            }
+            catch (Exception e) {
+            }
+        }
+    }
+
+    /**
+     * List the names of the entries in the given {@link JarInputStream} that begin with
the
+     * specified {@code path}. Entries will match with or without a leading slash.
+     *
+     * @param jar The JAR input stream
+     * @param path The leading path to match
+     * @return The names of all the matching entries
+     * @throws IOException
+     */
+    protected List&lt;String&gt; listClassResources(JarInputStream jar, String path) throws
IOException {
+        // Include the leading and trailing slash when matching names
+        if (!path.startsWith("/"))
+            path = "/" + path;
+        if (!path.endsWith("/"))
+            path = path + "/";
+
+        // Iterate over the entries and collect those that begin with the requested path
+        List&lt;String&gt; resources = new ArrayList&lt;String&gt;();
+        for (JarEntry entry; (entry = jar.getNextJarEntry()) != null;) {
+            if (!entry.isDirectory()) {
+                // Add leading slash if it's missing
+                String name = entry.getName();
+                if (!name.startsWith("/"))
+                    name = "/" + name;
+
+                // Check resource name
+                if (name.startsWith(path)) {
+                    resources.add(name.substring(1)); // Trim leading slash
+                }
+            }
+        }
+        return resources;
+    }
+
+    /**
+     * Attempts to deconstruct the given URL to find a JAR file containing the resource referenced
+     * by the URL. That is, assuming the URL references a JAR entry, this method will return
a URL
+     * that references the JAR file containing the entry. If the JAR cannot be located, then
this
+     * method returns null.
+     *
+     * @param url The URL of the JAR entry.
+     * @param path The path by which the URL was requested from the class loader.
+     * @return The URL of the JAR file, if one is found. Null if not.
+     * @throws MalformedURLException
+     */
+    protected URL findJarForResource(URL url, String path) throws MalformedURLException {
+        if (logService.isTraceEnabled()) {
+            logService.trace("Find JAR URL: " + url);
+        }
+
+        // If the file part of the URL is itself a URL, then that URL probably points to
the JAR
+        try {
+            for (;;) {
+                url = new URL(url.getFile());
+                if (logService.isTraceEnabled()) {
+                    logService.trace("Inner URL: " + url);
+                }
+            }
+        } catch (MalformedURLException e) {
+            // This will happen at some point and serves a break in the loop
+        }
+
+        // Look for the .jar extension and chop off everything after that
+        StringBuilder jarUrl = new StringBuilder(url.toExternalForm());
+        int index = jarUrl.lastIndexOf(".jar");
+        if (index &gt;= 0) {
+            jarUrl.setLength(index + 4);
+            if (logService.isTraceEnabled()) {
+                logService.trace("Extracted JAR URL: " + jarUrl);
+            }
+        } else {
+            if (logService.isTraceEnabled()) {
+                logService.trace("Not a JAR: " + jarUrl);
+            }
+            return null;
+        }
+
+        // Try to open and test it
+        try {
+            URL testUrl = new URL(jarUrl.toString());
+            if (isJar(testUrl)) {
+                return testUrl;
+            } else {
+                // WebLogic fix: check if the URL's file exists in the filesystem.
+                if (logService.isTraceEnabled()) {
+                    logService.trace("Not a JAR: " + jarUrl);
+                }
+
+                jarUrl.replace(0, jarUrl.length(), testUrl.getFile());
+
+                // File name might be URL-encoded
+                File file = new File(ClickUtils.decodeURL(jarUrl.toString()));
+                if (file.exists()) {
+                    if (logService.isTraceEnabled()) {
+                        logService.trace("Trying real file: " + file.getAbsolutePath());
+                    }
+                    testUrl =  file.toURI().toURL();
+                    if (isJar(testUrl)) {
+                        return testUrl;
+                    }
+                }
+            }
+        }
+        catch (MalformedURLException e) {
+            logService.warn("Invalid JAR URL: " + e.getMessage());
+        }
+
+        if (logService.isTraceEnabled()) {
+            logService.trace("Not a JAR: " + jarUrl);
+        }
+        return null;
+    }
+
+    /**
+     * Converts a Java package name to a path that can be looked up with a call to
+     * {@link ClassLoader#getResources(String)}.
+     *
+     * @param packageName The Java package name to convert to a path
+     */
+    protected String getPackagePath(String packageName) {
+        return packageName == null ? null : packageName.replace('.', '/');
+    }
+
+    /**
+     * Returns true if the name of a resource (file or directory) is one that matters in
the search
+     * for classes. Relevant resources would be class files themselves (file names that end
with
+     * ".class") and directories that might be a Java package name segment (java identifiers).
+     *
+     * @param resourceName The resource name, without path information
+     */
+    protected boolean isRelevantResource(String resourceName) {
+        return resourceName != null &amp;&amp; !resourceName.equals("");
+    }
+
+    /**
+     * Returns true if the resource located at the given URL is a JAR file.
+     *
+     * @param url The URL of the resource to test.
+     */
+    protected boolean isJar(URL url) {
+        return isJar(url, new byte[JAR_MAGIC.length]);
+    }
+
+    /**
+     * Returns true if the resource located at the given URL is a JAR file.
+     *
+     * @param url The URL of the resource to test.
+     * @param buffer A buffer into which the first few bytes of the resource are read. The
buffer
+     *            must be at least the size of {@link #JAR_MAGIC}. (The same buffer may be
reused
+     *            for multiple calls as an optimization.)
+     */
+    protected boolean isJar(URL url, byte[] buffer) {
+        InputStream is = null;
+        try {
+            is = url.openStream();
+            is.read(buffer, 0, JAR_MAGIC.length);
+            if (Arrays.equals(buffer, JAR_MAGIC)) {
+                if (logService.isInfoEnabled()) {
+                    logService.info("Found JAR: " + url);
+                }
+                return true;
+            }
+        }
+        catch (Exception e) {
+            // Failure to read the stream means this is not a JAR
+        }
+        finally {
+            try {
+                is.close();
+            }
+            catch (Exception e) {
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Add the class designated by the fully qualified class name provided to the set of
+     * resolved classes if and only if it is approved by the Test supplied.
+     *
+     * @param test the test used to determine if the class matches
+     * @param fqn the fully qualified name of a class
+     */
+    @SuppressWarnings("unchecked")
+    protected void addIfMatching(Test test, String fqn) {
+        try {
+            if (test.matches(fqn) ) {
+                matches.add(fqn);
+            }
+        }
+        catch (Throwable t) {
+            logService.error("Could not examine class '" + fqn + "'" + " due to a "
+                + t.getClass().getName() + " with message: " + t.getMessage());
+        }
+    }
+
+    // ---------------------------------------------------------- Inner classes
+
+    /**
+     * A simple interface that specifies how to test classes to determine if they
+     * are to be included in the results produced by the ResolverUtil.
+     */
+    static interface Test {
+        /**
+         * Will be called repeatedly with candidate classes. Must return True if a class
+         * is to be included in the results, false otherwise.
+         */
+        boolean matches(String resource);
+    }
+
+    /**
+     * This test matches deployable resources.
+     */
+    static class IsDeployable implements Test {
+
+        /**
+         * Default constructor.
+         */
+        IsDeployable() {
+        }
+
+        /**
+         * Return true if the given resource should be included in the results,
+         * false otherwise.
+         *
+         * @param resource the resource to be included in the results
+         * @return true if the resource should be included in the results, false
+         * otherwise
+         */
+        @SuppressWarnings("unchecked")
+        public boolean matches(String resource) {
+            // If a resource is found, it must be deployed
+            return true;
+        }
+    }
+}

Modified: incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java?rev=833349&amp;r1=833348&amp;r2=833349&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java
(original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java
Fri Nov  6 11:23:06 2009
@@ -18,8 +18,6 @@
  */
 package org.apache.click.service;
 
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Field;
@@ -28,7 +26,6 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -37,8 +34,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.StringTokenizer;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
 
 import javax.servlet.ServletContext;
 
@@ -50,8 +45,6 @@
 import org.apache.click.util.ClickUtils;
 import org.apache.click.util.Format;
 import org.apache.click.util.HtmlStringBuffer;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.filefilter.TrueFileFilter;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.Validate;
 import org.w3c.dom.Document;
@@ -880,6 +873,26 @@
         return pageClass;
     }
 
+    /**
+     * Returns true if Click resources (JavaScript, CSS, images etc) packaged
+     * in jars can be deployed to the root directory of the webapp, false
+     * otherwise.
+     * &lt;p/&gt;
+     * By default this method will return false in restricted environments where
+     * write access to the underlying file system is disallowed. Example
+     * environments where write access is not allowed include the WebLogic JEE
+     * server and Google App Engine. (Note: WebLogic provides the property
+     * &lt;tt&gt;"Archived Real Path Enabled"&lt;/tt&gt; that controls whether web
+     * applications can access the file system or not. See the Click user manual
+     * for details).
+     *
+     * @return true if resources can be deployed, false otherwise
+     */
+    protected boolean isResourcesDeployable() {
+        // Only deploy if writes are allowed
+        return ClickUtils.isResourcesDeployable(servletContext);
+    }
+
     // ------------------------------------------------ Package Private Methods
 
     /**
@@ -1230,29 +1243,22 @@
      */
     private void deployFiles(Element rootElm) throws Exception {
 
-        // Deploy application files if they are not already present.
-        // Only deploy if writes are allowed
-        boolean isResourcesDeployable =
-            ClickUtils.isResourcesDeployable(servletContext);
-
-        if (isResourcesDeployable) {
+        if (isResourcesDeployable()) {
             deployControls(getResourceRootElement("/click-controls.xml"));
             deployControls(getResourceRootElement("/extras-controls.xml"));
             deployControls(rootElm);
             deployControlSets(rootElm);
-
             deployResourcesOnClasspath();
+
         } else {
-            String msg = "Could not auto deploy files to the 'click' web folder."
-                + " This can occur if the call to ServletContext.getRealPath(\"/\") "
-                + " returns null, which means the web application cannot determine"
-                + " the file system path to deploy files to. Another common problem"
-                + " is if the web application is not allowed to write to the file"
-                + " system. To resolve this issue you need to manually include"
-                + " click resources in your web application at build time. You"
-                + " can use the Ant 'DeployTask' that is shipped with Click"
-                + " to include resources at build time. The 'DeployTask' is"
-                + " included in the jar 'lib\\click-dev-tasks.jar'";
+            String msg = "WARNING: could not deploy Click resources to the"
+                + " 'click' web folder.\nThis can occur if the call to"
+                + " ServletContext.getRealPath(\"/\") returns null, which means"
+                + " the web application cannot determine the file system path"
+                + " to deploy files to. Another common problem is if the web"
+                + " application is not allowed to write to the file"
+                + " system.\nTo resolve this issue please see the Click user-guide: "
+                + "http://incubator.apache.org/click/docs/user-guide/html/ch04s03.html#deploying-restricted-env";
             getLogService().warn(msg);
         }
     }
@@ -1267,179 +1273,28 @@
      * @throws java.lang.IOException if the resources cannot be deployed
      */
     private void deployResourcesOnClasspath() throws IOException {
-
         long startTime = System.currentTimeMillis();
 
-        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-
         // Find all jars and directories on the classpath that contains the
         // directory "META-INF/resources/", and deploy those resources
-        String resourceDirectory = "META-INF/resources/";
+        String resourceDirectory = "META-INF/resources";
 
-        // TODO: finding resources in jars and META-INF/classes might not always
-        // work on all servers. Might need to strip the final '/' from resourceDirectory
-        Enumeration&lt;URL&gt; en = classLoader.getResources(resourceDirectory);
-        while (en.hasMoreElements()) {
-            URL url = en.nextElement();
-            deployResourcesOnClasspath(url, resourceDirectory);
+        List&lt;String&gt; resources = new DeployUtils(logService).findResources(resourceDirectory).getResources();
+        for (String resource : resources) {
+            deployFile(resource, resourceDirectory);
         }
 
         // For backward compatibility, find all jars and directories on the
         // classpath that contains the directory "META-INF/web/", and deploy those
         // resources
-        resourceDirectory = "META-INF/web/";
-        en = classLoader.getResources(resourceDirectory);
-        while (en.hasMoreElements()) {
-            URL url = en.nextElement();
-            deployResourcesOnClasspath(url, resourceDirectory);
+        resourceDirectory = "META-INF/web";
+        resources = new DeployUtils(logService).findResources(resourceDirectory).getResources();
+        for (String resource : resources) {
+            deployFile(resource, resourceDirectory);
         }
 
-        if (logService.isTraceEnabled()) {
-            logService.trace("deployed files from jars and folders - "
-                + (System.currentTimeMillis() - startTime) + " ms");
-        }
-    }
-
-    /**
-     * Deploy from the url all resources found under the prefix.
-     *
-     * @param url the url of the jar or folder which resources to deploy
-     * @param resourceDirectory the directory under which resources are found
-     * @throws IOException if resources from the url cannot be deployed
-     */
-    private void deployResourcesOnClasspath(URL url, String resourceDirectory)
-        throws IOException {
-
-        String path = url.getFile();
-
-        // Decode the url, esp on Windows where file paths can have their
-        // spaces encoded. decodeURL will convert C:\Program%20Files\project
-        // to C:\Program Files\project
-        path = ClickUtils.decodeURL(path);
-
-        // Strip file prefix
-        if (path.startsWith("file:")) {
-            path = path.substring(5);
-        }
-
-        String jarPath = null;
-
-        // Check if path represents a jar
-        if (path.indexOf('!') &gt; 0) {
-            jarPath = path.substring(0, path.indexOf('!'));
-
-            File jar = new File(jarPath);
-
-            if (jar.exists()) {
-                deployFilesInJar(jar, resourceDirectory);
-
-            } else {
-                logService.error("Could not deploy the jar '" + jarPath
-                    + "'. Please ensure this file exists in the specified"
-                    + " location.");
-            }
-        } else {
-            File dir = new File(path);
-            deployFilesInDir(dir, resourceDirectory);
-        }
-    }
-
-    /**
-     * Deploy files from the specified directory which are stored under the given
-     * resourceDirectory.
-     *
-     * @param dir the directory which resources will be deployed
-     * @param resourceDirectory the directory under which resources are found
-     * @throws java.lang.IOException if for some reason the files cannot be
-     * deployed
-     */
-    private void deployFilesInDir(File dir, String resourceDirectory)
-        throws IOException {
-
-        if (dir == null) {
-            throw new IllegalArgumentException("Dir cannot be null");
-        }
-
-        if (!dir.exists()) {
-            logService.trace("No resources deployed from the folder '" + dir.getAbsolutePath()
-                + "' as it does not exist.");
-            return;
-        }
-
-        Iterator files = FileUtils.iterateFiles(dir, TrueFileFilter.INSTANCE,
-            TrueFileFilter.INSTANCE);
-
-        boolean logFeedback = true;
-        while (files.hasNext()) {
-            // file example -&gt; META-INF/resources/click/table.css
-            File file = (File) files.next();
-            String fileName = file.getCanonicalPath().replace('\\', '/');
-
-            // Only deploy resources from "META-INF/resources/"
-            int pathIndex = fileName.indexOf(resourceDirectory);
-            if (pathIndex != -1) {
-                if (logFeedback &amp;&amp; logService.isTraceEnabled()) {
-                    logService.trace("deploy files from folder -&gt; "
-                        + dir.getAbsolutePath());
-
-                    // Only provide feedback once per dir
-                    logFeedback = false;
-                }
-                fileName = fileName.substring(pathIndex);
-                deployFile(fileName, resourceDirectory);
-            }
-        }
-    }
-
-    /**
-     * Deploy files from the specified jar which are stored under the given
-     * resourceDirectory.
-     *
-     * @param jar the jar which resources will be deployed
-     * @param resourceDirectory the directory under which resources are found
-     * @throws java.lang.IOException if for some reason the files cannot be
-     * deployed
-     */
-    private void deployFilesInJar(File jar, String resourceDirectory)
-        throws IOException {
-
-        if (jar == null) {
-            throw new IllegalArgumentException("Jar cannot be null");
-        }
-
-        InputStream inputStream = null;
-        JarInputStream jarInputStream = null;
-
-        try {
-
-            inputStream = new FileInputStream(jar);
-            jarInputStream = new JarInputStream(inputStream);
-            JarEntry jarEntry = null;
-
-            // Indicates whether feedback should be logged about the files deployed
-            // from jar
-            boolean logFeedback = true;
-            while ((jarEntry = jarInputStream.getNextJarEntry()) != null) {
-                // jarEntryName example -&gt; META-INF/resources/click/table.css
-                String jarEntryName = jarEntry.getName();
-
-                // Only deploy resources from "META-INF/resources/"
-                int pathIndex = jarEntryName.indexOf(resourceDirectory);
-                if (pathIndex == 0) {
-                    if (logFeedback &amp;&amp; logService.isTraceEnabled()) {
-                        logService.trace("deploy files from jar -&gt; "
-                                         + jar.getCanonicalPath());
-
-                        // Only provide feedback once per jar
-                        logFeedback = false;
-                    }
-                    deployFile(jarEntryName, resourceDirectory);
-                }
-            }
-        } finally {
-            ClickUtils.close(jarInputStream);
-            ClickUtils.close(inputStream);
-        }
+        logService.trace("deployed files from jars and folders - "
+            + (System.currentTimeMillis() - startTime) + " ms");
     }
 
     /**




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r833345 - /incubator/click/trunk/click/framework/src/org/apache/click/control/AbstractLink.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091106111251.E9FDC23888E2@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091106111251-E9FDC23888E2@eris-apache-org%3e</id>
<updated>2009-11-06T11:12:51Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Fri Nov  6 11:12:51 2009
New Revision: 833345

URL: http://svn.apache.org/viewvc?rev=833345&amp;view=rev
Log:
trim spaces

Modified:
    incubator/click/trunk/click/framework/src/org/apache/click/control/AbstractLink.java

Modified: incubator/click/trunk/click/framework/src/org/apache/click/control/AbstractLink.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/control/AbstractLink.java?rev=833345&amp;r1=833344&amp;r2=833345&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/control/AbstractLink.java (original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/control/AbstractLink.java Fri
Nov  6 11:12:51 2009
@@ -597,7 +597,7 @@
         }
 
         buffer.elementEnd();
-    }    
+    }
 
     /**
      * Render the given link parameters to the buffer.




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r833342 - /incubator/click/trunk/click/extras/src/org/apache/click/extras/control/AbstractContainerField.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091106110849.DB64323888E2@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091106110849-DB64323888E2@eris-apache-org%3e</id>
<updated>2009-11-06T11:08:49Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Fri Nov  6 11:08:49 2009
New Revision: 833342

URL: http://svn.apache.org/viewvc?rev=833342&amp;view=rev
Log:
fix javadoc path

Modified:
    incubator/click/trunk/click/extras/src/org/apache/click/extras/control/AbstractContainerField.java

Modified: incubator/click/trunk/click/extras/src/org/apache/click/extras/control/AbstractContainerField.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/org/apache/click/extras/control/AbstractContainerField.java?rev=833342&amp;r1=833341&amp;r2=833342&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/org/apache/click/extras/control/AbstractContainerField.java
(original)
+++ incubator/click/trunk/click/extras/src/org/apache/click/extras/control/AbstractContainerField.java
Fri Nov  6 11:08:49 2009
@@ -183,7 +183,7 @@
     /**
      * Returns true if this container has existing controls, false otherwise.
      *
-     * @see AbstractContainer#hasControls()
+     * @see org.apache.click.control.AbstractContainer#hasControls()
      *
      * @return true if the container has existing controls, false otherwise.
      */




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r833042 - /incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091105125213.EDF9B23888D0@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091105125213-EDF9B23888D0@eris-apache-org%3e</id>
<updated>2009-11-05T12:51:55Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Thu Nov  5 12:51:23 2009
New Revision: 833042

URL: http://svn.apache.org/viewvc?rev=833042&amp;view=rev
Log:
cleanup

Modified:
    incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java

Modified: incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java?rev=833042&amp;r1=833041&amp;r2=833042&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
(original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
Thu Nov  5 12:51:23 2009
@@ -60,9 +60,6 @@
     /** The application log service. */
     protected LogService logService;
 
-    /** The application template service. */
-    protected TemplateService templateService;
-
     /** The application configuration service. */
     protected ConfigService configService;
 
@@ -76,7 +73,6 @@
 
         configService = ClickUtils.getConfigService(servletContext);
         logService = configService.getLogService();
-        templateService = configService.getTemplateService();
 
         // Load all JAR resources
         List&lt;String&gt; cacheables = getCacheableDirs();




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r832593 - /incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091103230728.6AA3D23888D8@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091103230728-6AA3D23888D8@eris-apache-org%3e</id>
<updated>2009-11-03T23:07:27Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Tue Nov  3 23:07:25 2009
New Revision: 832593

URL: http://svn.apache.org/viewvc?rev=832593&amp;view=rev
Log:
cleanup

Modified:
    incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java

Modified: incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java?rev=832593&amp;r1=832592&amp;r2=832593&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
(original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
Tue Nov  3 23:07:25 2009
@@ -214,11 +214,12 @@
 
         ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
 
-        // Find all jars and directories on the classpath that contains the
-        // directory "META-INF/resources/", and deploy those resources
         if (!resourceDir.startsWith("/")) {
             resourceDir = '/' + resourceDir;
         }
+
+        // Find all jars and directories on the classpath that contains the
+        // directory "META-INF/resources/&lt;resourceDir&gt;", and deploy those resources
         String resourceDirectory = "META-INF/resources" + resourceDir;
         Enumeration&lt;URL&gt; en = classLoader.getResources(resourceDirectory);
         while (en.hasMoreElements()) {




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r832394 [2/2] - in /incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype: builder.js controls.js dragdrop.js effects.js scriptaculous.js slider.js unittest.js</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091103112014.3589023888CE@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091103112014-3589023888CE@eris-apache-org%3e</id>
<updated>2009-11-03T11:19:50Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Modified: incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/slider.js
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/slider.js?rev=832394&amp;r1=832393&amp;r2=832394&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/slider.js (original)
+++ incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/slider.js Tue
Nov  3 11:19:01 2009
@@ -1,6 +1,6 @@
-// script.aculo.us slider.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008
+// script.aculo.us slider.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
 
-// Copyright (c) 2005-2007 Marty Haught, Thomas Fuchs 
+// Copyright (c) 2005-2009 Marty Haught, Thomas Fuchs
 //
 // script.aculo.us is freely distributable under the terms of an MIT-style license.
 // For details, see the script.aculo.us web site: http://script.aculo.us/
@@ -16,13 +16,13 @@
 Control.Slider = Class.create({
   initialize: function(handle, track, options) {
     var slider = this;
-    
+
     if (Object.isArray(handle)) {
       this.handles = handle.collect( function(e) { return $(e) });
     } else {
       this.handles = [$(handle)];
     }
-    
+
     this.track   = $(track);
     this.options = options || { };
 
@@ -30,7 +30,7 @@
     this.increment = this.options.increment || 1;
     this.step      = parseInt(this.options.step || '1');
     this.range     = this.options.range || $R(0,1);
-    
+
     this.value     = 0; // assure backwards compat
     this.values    = this.handles.map( function() { return 0 });
     this.spans     = this.options.spans ? this.options.spans.map(function(s){ return $(s)
}) : false;
@@ -45,13 +45,13 @@
     // Will be used to align the handle onto the track, if necessary
     this.alignX = parseInt(this.options.alignX || '0');
     this.alignY = parseInt(this.options.alignY || '0');
-    
+
     this.trackLength = this.maximumOffset() - this.minimumOffset();
 
-    this.handleLength = this.isVertical() ? 
-      (this.handles[0].offsetHeight != 0 ? 
-        this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :

-      (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth : 
+    this.handleLength = this.isVertical() ?
+      (this.handles[0].offsetHeight != 0 ?
+        this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
+      (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
         this.handles[0].style.width.replace(/px$/,""));
 
     this.active   = false;
@@ -75,20 +75,20 @@
     this.handles.each( function(h,i) {
       i = slider.handles.length-1-i;
       slider.setValue(parseFloat(
-        (Object.isArray(slider.options.sliderValue) ? 
-          slider.options.sliderValue[i] : slider.options.sliderValue) || 
+        (Object.isArray(slider.options.sliderValue) ?
+          slider.options.sliderValue[i] : slider.options.sliderValue) ||
          slider.range.start), i);
       h.makePositioned().observe("mousedown", slider.eventMouseDown);
     });
-    
+
     this.track.observe("mousedown", this.eventMouseDown);
     document.observe("mouseup", this.eventMouseUp);
     document.observe("mousemove", this.eventMouseMove);
-    
+
     this.initialized = true;
   },
   dispose: function() {
-    var slider = this;    
+    var slider = this;
     Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
     Event.stopObserving(document, "mouseup", this.eventMouseUp);
     Event.stopObserving(document, "mousemove", this.eventMouseMove);
@@ -101,12 +101,12 @@
   },
   setEnabled: function(){
     this.disabled = false;
-  },  
+  },
   getNearestValue: function(value){
     if (this.allowedValues){
       if (value &gt;= this.allowedValues.max()) return(this.allowedValues.max());
       if (value &lt;= this.allowedValues.min()) return(this.allowedValues.min());
-      
+
       var offset = Math.abs(this.allowedValues[0] - value);
       var newValue = this.allowedValues[0];
       this.allowedValues.each( function(v) {
@@ -114,7 +114,7 @@
         if (currentOffset &lt;= offset){
           newValue = v;
           offset = currentOffset;
-        } 
+        }
       });
       return newValue;
     }
@@ -138,28 +138,28 @@
     sliderValue = this.getNearestValue(sliderValue);
     this.values[handleIdx] = sliderValue;
     this.value = this.values[0]; // assure backwards compat
-    
-    this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = 
+
+    this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
       this.translateToPx(sliderValue);
-    
+
     this.drawSpans();
     if (!this.dragging || !this.event) this.updateFinished();
   },
   setValueBy: function(delta, handleIdx) {
-    this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, 
+    this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
       handleIdx || this.activeHandleIdx || 0);
   },
   translateToPx: function(value) {
     return Math.round(
-      ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * 
+      ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
       (value - this.range.start)) + "px";
   },
   translateToValue: function(offset) {
-    return ((offset/(this.trackLength-this.handleLength) * 
+    return ((offset/(this.trackLength-this.handleLength) *
       (this.range.end-this.range.start)) + this.range.start);
   },
   getRange: function(range) {
-    var v = this.values.sortBy(Prototype.K); 
+    var v = this.values.sortBy(Prototype.K);
     range = range || 0;
     return $R(v[range],v[range+1]);
   },
@@ -167,12 +167,12 @@
     return(this.isVertical() ? this.alignY : this.alignX);
   },
   maximumOffset: function(){
-    return(this.isVertical() ? 
+    return(this.isVertical() ?
       (this.track.offsetHeight != 0 ? this.track.offsetHeight :
-        this.track.style.height.replace(/px$/,"")) - this.alignY : 
-      (this.track.offsetWidth != 0 ? this.track.offsetWidth : 
+        this.track.style.height.replace(/px$/,"")) - this.alignY :
+      (this.track.offsetWidth != 0 ? this.track.offsetWidth :
         this.track.style.width.replace(/px$/,"")) - this.alignX);
-  },  
+  },
   isVertical:  function(){
     return (this.axis == 'vertical');
   },
@@ -184,7 +184,7 @@
       this.setSpan(this.options.startSpan,
         $R(0, this.values.length&gt;1 ? this.getRange(0).min() : this.value ));
     if (this.options.endSpan)
-      this.setSpan(this.options.endSpan, 
+      this.setSpan(this.options.endSpan,
         $R(this.values.length&gt;1 ? this.getRange(this.spans.length-1).max() : this.value,
this.maximum));
   },
   setSpan: function(span, range) {
@@ -204,30 +204,30 @@
     if (Event.isLeftClick(event)) {
       if (!this.disabled){
         this.active = true;
-        
+
         var handle = Event.element(event);
         var pointer  = [Event.pointerX(event), Event.pointerY(event)];
         var track = handle;
         if (track==this.track) {
-          var offsets  = Position.cumulativeOffset(this.track); 
+          var offsets  = this.track.cumulativeOffset();
           this.event = event;
-          this.setValue(this.translateToValue( 
+          this.setValue(this.translateToValue(
            (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
           ));
-          var offsets  = Position.cumulativeOffset(this.activeHandle);
+          var offsets  = this.activeHandle.cumulativeOffset();
           this.offsetX = (pointer[0] - offsets[0]);
           this.offsetY = (pointer[1] - offsets[1]);
         } else {
           // find the handle (prevents issues with Safari)
-          while((this.handles.indexOf(handle) == -1) &amp;&amp; handle.parentNode) 
+          while((this.handles.indexOf(handle) == -1) &amp;&amp; handle.parentNode)
             handle = handle.parentNode;
-            
+
           if (this.handles.indexOf(handle)!=-1) {
             this.activeHandle    = handle;
             this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
             this.updateStyles();
-            
-            var offsets  = Position.cumulativeOffset(this.activeHandle);
+
+            var offsets  = this.activeHandle.cumulativeOffset();
             this.offsetX = (pointer[0] - offsets[0]);
             this.offsetY = (pointer[1] - offsets[1]);
           }
@@ -246,7 +246,7 @@
   },
   draw: function(event) {
     var pointer = [Event.pointerX(event), Event.pointerY(event)];
-    var offsets = Position.cumulativeOffset(this.track);
+    var offsets = this.track.cumulativeOffset();
     pointer[0] -= this.offsetX + offsets[0];
     pointer[1] -= this.offsetY + offsets[1];
     this.event = event;
@@ -261,15 +261,15 @@
     }
     this.active = false;
     this.dragging = false;
-  },  
+  },
   finishDrag: function(event, success) {
     this.active = false;
     this.dragging = false;
     this.updateFinished();
   },
   updateFinished: function() {
-    if (this.initialized &amp;&amp; this.options.onChange) 
+    if (this.initialized &amp;&amp; this.options.onChange)
       this.options.onChange(this.values.length&gt;1 ? this.values : this.value, this);
     this.event = null;
   }
-});
+});
\ No newline at end of file

Modified: incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/unittest.js
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/unittest.js?rev=832394&amp;r1=832393&amp;r2=832394&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/unittest.js
(original)
+++ incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/unittest.js
Tue Nov  3 11:19:01 2009
@@ -1,8 +1,8 @@
-// script.aculo.us unittest.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008
+// script.aculo.us unittest.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
 
-// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//           (c) 2005-2007 Jon Tirsen (http://www.tirsen.com)
-//           (c) 2005-2007 Michael Schuerig (http://www.schuerig.de/michael/)
+// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005-2009 Jon Tirsen (http://www.tirsen.com)
+//           (c) 2005-2009 Michael Schuerig (http://www.schuerig.de/michael/)
 //
 // script.aculo.us is freely distributable under the terms of an MIT-style license.
 // For details, see the script.aculo.us web site: http://script.aculo.us/
@@ -32,8 +32,8 @@
   this.mark.style.left = options.pointerX + "px";
   this.mark.style.width = "5px";
   this.mark.style.height = "5px;";
-  this.mark.style.borderTop = "1px solid red;"
-  this.mark.style.borderLeft = "1px solid red;"
+  this.mark.style.borderTop = "1px solid red;";
+  this.mark.style.borderLeft = "1px solid red;";
   
   if(this.step)
     alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));
@@ -67,7 +67,7 @@
   }
 };
 
-var Test = {}
+var Test = {};
 Test.Unit = {};
 
 // security exception workaround
@@ -117,7 +117,7 @@
     '&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Status&lt;/th&gt;&lt;th&gt;Test&lt;/th&gt;&lt;th&gt;Message&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;'
+
     '&lt;tbody id="loglines"&gt;&lt;/tbody&gt;' +
     '&lt;/table&gt;';
-    this.logsummary = $('logsummary')
+    this.logsummary = $('logsummary');
     this.loglines = $('loglines');
   },
   _toHTML: function(txt) {
@@ -125,15 +125,15 @@
   },
   addLinksToResults: function(){ 
     $$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log
-      td.title = "Run only this test"
+      td.title = "Run only this test";
       Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;});
     });
     $$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log
-      td.title = "Run all tests"
+      td.title = "Run all tests";
       Event.observe(td, 'click', function(){ window.location.search = "";});
     });
   }
-}
+};
 
 Test.Unit.Runner = Class.create();
 Test.Unit.Runner.prototype = {
@@ -246,7 +246,7 @@
       failures   + " failures, " +
       errors     + " errors");
   }
-}
+};
 
 Test.Unit.Assertions = Class.create();
 Test.Unit.Assertions.prototype = {
@@ -331,7 +331,7 @@
     catch(e) { this.error(e); } 
   },
   assertNull: function(obj) {
-    var message = arguments[1] || 'assertNull'
+    var message = arguments[1] || 'assertNull';
     try { (obj==null) ? this.pass() : 
       this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
     catch(e) { this.error(e); }
@@ -461,7 +461,7 @@
        iterations + ' iterations in ' + (timeTaken/1000)+'s' );
     return timeTaken;
   }
-}
+};
 
 Test.Unit.Testcase = Class.create();
 Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype),
{
@@ -526,7 +526,7 @@
   };
   var makeAssertion = function(assertion, args, object) { 
    	this[assertion].apply(this,(args || []).concat([object]));
-  }
+  };
   
   Test.BDDMethods = {};   
   $H(METHODMAP).each(function(pair) { 
@@ -539,7 +539,7 @@
   [Array.prototype, String.prototype, Number.prototype, Boolean.prototype].each(
     function(p){ Object.extend(p, Test.BDDMethods) }
   );
-}
+};
 
 Test.context = function(name, spec, log){
   Test.setupBDDExtensionMethods();




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r832394 [1/2] - in /incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype: builder.js controls.js dragdrop.js effects.js scriptaculous.js slider.js unittest.js</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091103112014.2F06B2388874@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091103112014-2F06B2388874@eris-apache-org%3e</id>
<updated>2009-11-03T11:19:50Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Tue Nov  3 11:19:01 2009
New Revision: 832394

URL: http://svn.apache.org/viewvc?rev=832394&amp;view=rev
Log:
upgraded to scriptaculous 1.8.3

Modified:
    incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/builder.js
    incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/controls.js
    incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/dragdrop.js
    incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/effects.js
    incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/scriptaculous.js
    incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/slider.js
    incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/unittest.js

Modified: incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/builder.js
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/builder.js?rev=832394&amp;r1=832393&amp;r2=832394&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/builder.js (original)
+++ incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/builder.js Tue Nov  3 11:19:01 2009
@@ -1,6 +1,6 @@
-// script.aculo.us builder.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008
+// script.aculo.us builder.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
 
-// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
 //
 // script.aculo.us is freely distributable under the terms of an MIT-style license.
 // For details, see the script.aculo.us web site: http://script.aculo.us/
@@ -26,7 +26,7 @@
   //       due to a Firefox bug
   node: function(elementName) {
     elementName = elementName.toUpperCase();
-    
+
     // try innerHTML approach
     var parentTag = this.NODEMAP[elementName] || 'div';
     var parentElement = document.createElement(parentTag);
@@ -34,14 +34,14 @@
       parentElement.innerHTML = "&lt;" + elementName + "&gt;&lt;/" + elementName + "&gt;";
     } catch(e) {}
     var element = parentElement.firstChild || null;
-      
+
     // see if browser added wrapping tags
     if(element &amp;&amp; (element.tagName.toUpperCase() != elementName))
       element = element.getElementsByTagName(elementName)[0];
-    
+
     // fallback to createElement approach
     if(!element) element = document.createElement(elementName);
-    
+
     // abort if nothing could be created
     if(!element) return;
 
@@ -62,19 +62,19 @@
             // workaround firefox 1.0.X bug
             if(!element) {
               element = document.createElement(elementName);
-              for(attr in arguments[1]) 
+              for(attr in arguments[1])
                 element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
             }
             if(element.tagName.toUpperCase() != elementName)
               element = parentElement.getElementsByTagName(elementName)[0];
           }
-        } 
+        }
 
     // text, or array of children
     if(arguments[2])
       this._children(element, arguments[2]);
 
-     return element;
+     return $(element);
   },
   _text: function(text) {
      return document.createTextNode(text);
@@ -100,7 +100,7 @@
     if(typeof children=='object') { // array can hold nodes and text
       children.flatten().each( function(e) {
         if(typeof e=='object')
-          element.appendChild(e)
+          element.appendChild(e);
         else
           if(Builder._isStringOrNumber(e))
             element.appendChild(Builder._text(e));
@@ -117,20 +117,20 @@
     $(element).update(html.strip());
     return element.down();
   },
-  dump: function(scope) { 
-    if(typeof scope != 'object' &amp;&amp; typeof scope != 'function') scope = window; //global scope 
-  
+  dump: function(scope) {
+    if(typeof scope != 'object' &amp;&amp; typeof scope != 'function') scope = window; //global scope
+
     var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
       "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
       "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
       "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
       "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
       "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
-  
-    tags.each( function(tag){ 
-      scope[tag] = function() { 
-        return Builder.node.apply(Builder, [tag].concat($A(arguments)));  
-      } 
+
+    tags.each( function(tag){
+      scope[tag] = function() {
+        return Builder.node.apply(Builder, [tag].concat($A(arguments)));
+      };
     });
   }
-}
+};
\ No newline at end of file

Modified: incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/controls.js
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/controls.js?rev=832394&amp;r1=832393&amp;r2=832394&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/controls.js (original)
+++ incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/controls.js Tue Nov  3 11:19:01 2009
@@ -1,24 +1,24 @@
-// script.aculo.us controls.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008
+// script.aculo.us controls.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
 
-// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//           (c) 2005-2007 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
-//           (c) 2005-2007 Jon Tirsen (http://www.tirsen.com)
+// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005-2009 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
+//           (c) 2005-2009 Jon Tirsen (http://www.tirsen.com)
 // Contributors:
 //  Richard Livsey
 //  Rahul Bhargava
 //  Rob Wills
-// 
+//
 // script.aculo.us is freely distributable under the terms of an MIT-style license.
 // For details, see the script.aculo.us web site: http://script.aculo.us/
 
-// Autocompleter.Base handles all the autocompletion functionality 
+// Autocompleter.Base handles all the autocompletion functionality
 // that's independent of the data source for autocompletion. This
 // includes drawing the autocompletion menu, observing keyboard
 // and mouse events, and similar.
 //
-// Specific autocompleters need to provide, at the very least, 
+// Specific autocompleters need to provide, at the very least,
 // a getUpdatedChoices function that will be invoked every time
-// the text inside the monitored textbox changes. This method 
+// the text inside the monitored textbox changes. This method
 // should get the text for which to provide autocompletion by
 // invoking this.getToken(), NOT by directly accessing
 // this.element.value. This is to allow incremental tokenized
@@ -32,23 +32,23 @@
 // will incrementally autocomplete with a comma as the token.
 // Additionally, ',' in the above example can be replaced with
 // a token array, e.g. { tokens: [',', '\n'] } which
-// enables autocompletion on multiple tokens. This is most 
-// useful when one of the tokens is \n (a newline), as it 
+// enables autocompletion on multiple tokens. This is most
+// useful when one of the tokens is \n (a newline), as it
 // allows smart autocompletion after linebreaks.
 
 if(typeof Effect == 'undefined')
   throw("controls.js requires including script.aculo.us' effects.js library");
 
-var Autocompleter = { }
+var Autocompleter = { };
 Autocompleter.Base = Class.create({
   baseInitialize: function(element, update, options) {
-    element          = $(element)
-    this.element     = element; 
-    this.update      = $(update);  
-    this.hasFocus    = false; 
-    this.changed     = false; 
-    this.active      = false; 
-    this.index       = 0;     
+    element          = $(element);
+    this.element     = element;
+    this.update      = $(update);
+    this.hasFocus    = false;
+    this.changed     = false;
+    this.active      = false;
+    this.index       = 0;
     this.entryCount  = 0;
     this.oldElementValue = this.element.value;
 
@@ -61,28 +61,28 @@
     this.options.tokens       = this.options.tokens || [];
     this.options.frequency    = this.options.frequency || 0.4;
     this.options.minChars     = this.options.minChars || 1;
-    this.options.onShow       = this.options.onShow || 
-      function(element, update){ 
+    this.options.onShow       = this.options.onShow ||
+      function(element, update){
         if(!update.style.position || update.style.position=='absolute') {
           update.style.position = 'absolute';
           Position.clone(element, update, {
-            setHeight: false, 
+            setHeight: false,
             offsetTop: element.offsetHeight
           });
         }
         Effect.Appear(update,{duration:0.15});
       };
-    this.options.onHide = this.options.onHide || 
+    this.options.onHide = this.options.onHide ||
       function(element, update){ new Effect.Fade(update,{duration:0.15}) };
 
-    if(typeof(this.options.tokens) == 'string') 
+    if(typeof(this.options.tokens) == 'string')
       this.options.tokens = new Array(this.options.tokens);
     // Force carriage returns as token delimiters anyway
     if (!this.options.tokens.include('\n'))
       this.options.tokens.push('\n');
 
     this.observer = null;
-    
+
     this.element.setAttribute('autocomplete','off');
 
     Element.hide(this.update);
@@ -93,10 +93,10 @@
 
   show: function() {
     if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
-    if(!this.iefix &amp;&amp; 
+    if(!this.iefix &amp;&amp;
       (Prototype.Browser.IE) &amp;&amp;
       (Element.getStyle(this.update, 'position')=='absolute')) {
-      new Insertion.After(this.update, 
+      new Insertion.After(this.update,
        '&lt;iframe id="' + this.update.id + '_iefix" '+
        'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
        'src="javascript:false;" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;');
@@ -104,7 +104,7 @@
     }
     if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
   },
-  
+
   fixIEOverlapping: function() {
     Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
     this.iefix.style.zIndex = 1;
@@ -152,15 +152,15 @@
          Event.stop(event);
          return;
       }
-     else 
-       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || 
+     else
+       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
          (Prototype.Browser.WebKit &gt; 0 &amp;&amp; event.keyCode == 0)) return;
 
     this.changed = true;
     this.hasFocus = true;
 
     if(this.observer) clearTimeout(this.observer);
-      this.observer = 
+      this.observer =
         setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
   },
 
@@ -172,35 +172,35 @@
 
   onHover: function(event) {
     var element = Event.findElement(event, 'LI');
-    if(this.index != element.autocompleteIndex) 
+    if(this.index != element.autocompleteIndex)
     {
         this.index = element.autocompleteIndex;
         this.render();
     }
     Event.stop(event);
   },
-  
+
   onClick: function(event) {
     var element = Event.findElement(event, 'LI');
     this.index = element.autocompleteIndex;
     this.selectEntry();
     this.hide();
   },
-  
+
   onBlur: function(event) {
     // needed to make click events working
     setTimeout(this.hide.bind(this), 250);
     this.hasFocus = false;
-    this.active = false;     
-  }, 
-  
+    this.active = false;
+  },
+
   render: function() {
     if(this.entryCount &gt; 0) {
       for (var i = 0; i &lt; this.entryCount; i++)
-        this.index==i ? 
-          Element.addClassName(this.getEntry(i),"selected") : 
+        this.index==i ?
+          Element.addClassName(this.getEntry(i),"selected") :
           Element.removeClassName(this.getEntry(i),"selected");
-      if(this.hasFocus) { 
+      if(this.hasFocus) {
         this.show();
         this.active = true;
       }
@@ -209,27 +209,27 @@
       this.hide();
     }
   },
-  
+
   markPrevious: function() {
-    if(this.index &gt; 0) this.index--
+    if(this.index &gt; 0) this.index--;
       else this.index = this.entryCount-1;
     this.getEntry(this.index).scrollIntoView(true);
   },
-  
+
   markNext: function() {
-    if(this.index &lt; this.entryCount-1) this.index++
+    if(this.index &lt; this.entryCount-1) this.index++;
       else this.index = 0;
     this.getEntry(this.index).scrollIntoView(false);
   },
-  
+
   getEntry: function(index) {
     return this.update.firstChild.childNodes[index];
   },
-  
+
   getCurrentEntry: function() {
     return this.getEntry(this.index);
   },
-  
+
   selectEntry: function() {
     this.active = false;
     this.updateElement(this.getCurrentEntry());
@@ -246,7 +246,7 @@
       if(nodes.length&gt;0) value = Element.collectTextNodes(nodes[0], this.options.select);
     } else
       value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
-    
+
     var bounds = this.getTokenBounds();
     if (bounds[0] != -1) {
       var newValue = this.element.value.substr(0, bounds[0]);
@@ -259,7 +259,7 @@
     }
     this.oldElementValue = this.element.value;
     this.element.focus();
-    
+
     if (this.options.afterUpdateElement)
       this.options.afterUpdateElement(this.element, selectedElement);
   },
@@ -271,20 +271,20 @@
       Element.cleanWhitespace(this.update.down());
 
       if(this.update.firstChild &amp;&amp; this.update.down().childNodes) {
-        this.entryCount = 
+        this.entryCount =
           this.update.down().childNodes.length;
         for (var i = 0; i &lt; this.entryCount; i++) {
           var entry = this.getEntry(i);
           entry.autocompleteIndex = i;
           this.addObservers(entry);
         }
-      } else { 
+      } else {
         this.entryCount = 0;
       }
 
       this.stopIndicator();
       this.index = 0;
-      
+
       if(this.entryCount==1 &amp;&amp; this.options.autoSelect) {
         this.selectEntry();
         this.hide();
@@ -300,7 +300,7 @@
   },
 
   onObserverEvent: function() {
-    this.changed = false;   
+    this.changed = false;
     this.tokenBounds = null;
     if(this.getToken().length&gt;=this.options.minChars) {
       this.getUpdatedChoices();
@@ -353,16 +353,16 @@
 
   getUpdatedChoices: function() {
     this.startIndicator();
-    
-    var entry = encodeURIComponent(this.options.paramName) + '=' + 
+
+    var entry = encodeURIComponent(this.options.paramName) + '=' +
       encodeURIComponent(this.getToken());
 
     this.options.parameters = this.options.callback ?
       this.options.callback(this.element, entry) : entry;
 
-    if(this.options.defaultParams) 
+    if(this.options.defaultParams)
       this.options.parameters += '&amp;' + this.options.defaultParams;
-    
+
     new Ajax.Request(this.url, this.options);
   },
 
@@ -384,7 +384,7 @@
 // - choices - How many autocompletion choices to offer
 //
 // - partialSearch - If false, the autocompleter will match entered
-//                    text only at the beginning of strings in the 
+//                    text only at the beginning of strings in the
 //                    autocomplete array. Defaults to true, which will
 //                    match text at the beginning of any *word* in the
 //                    strings in the autocomplete array. If you want to
@@ -401,7 +401,7 @@
 // - ignoreCase - Whether to ignore case when autocompleting.
 //                 Defaults to true.
 //
-// It's possible to pass in a custom function as the 'selector' 
+// It's possible to pass in a custom function as the 'selector'
 // option, if you prefer to write your own autocompletion logic.
 // In that case, the other options above will not apply unless
 // you support them.
@@ -429,20 +429,20 @@
         var entry     = instance.getToken();
         var count     = 0;
 
-        for (var i = 0; i &lt; instance.options.array.length &amp;&amp;  
-          ret.length &lt; instance.options.choices ; i++) { 
+        for (var i = 0; i &lt; instance.options.array.length &amp;&amp;
+          ret.length &lt; instance.options.choices ; i++) {
 
           var elem = instance.options.array[i];
-          var foundPos = instance.options.ignoreCase ? 
-            elem.toLowerCase().indexOf(entry.toLowerCase()) : 
+          var foundPos = instance.options.ignoreCase ?
+            elem.toLowerCase().indexOf(entry.toLowerCase()) :
             elem.indexOf(entry);
 
           while (foundPos != -1) {
-            if (foundPos == 0 &amp;&amp; elem.length != entry.length) { 
-              ret.push("&lt;li&gt;&lt;strong&gt;" + elem.substr(0, entry.length) + "&lt;/strong&gt;" + 
+            if (foundPos == 0 &amp;&amp; elem.length != entry.length) {
+              ret.push("&lt;li&gt;&lt;strong&gt;" + elem.substr(0, entry.length) + "&lt;/strong&gt;" +
                 elem.substr(entry.length) + "&lt;/li&gt;");
               break;
-            } else if (entry.length &gt;= instance.options.partialChars &amp;&amp; 
+            } else if (entry.length &gt;= instance.options.partialChars &amp;&amp;
               instance.options.partialSearch &amp;&amp; foundPos != -1) {
               if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
                 partial.push("&lt;li&gt;" + elem.substr(0, foundPos) + "&lt;strong&gt;" +
@@ -452,14 +452,14 @@
               }
             }
 
-            foundPos = instance.options.ignoreCase ? 
-              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : 
+            foundPos = instance.options.ignoreCase ?
+              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
               elem.indexOf(entry, foundPos + 1);
 
           }
         }
         if (partial.length)
-          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
+          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length));
         return "&lt;ul&gt;" + ret.join('') + "&lt;/ul&gt;";
       }
     }, options || { });
@@ -476,7 +476,7 @@
   setTimeout(function() {
     Field.activate(field);
   }, 1);
-}
+};
 
 Ajax.InPlaceEditor = Class.create({
   initialize: function(element, url, options) {
@@ -606,7 +606,7 @@
     this.triggerCallback('onEnterHover');
   },
   getText: function() {
-    return this.element.innerHTML;
+    return this.element.innerHTML.unescapeHTML();
   },
   handleAJAXFailure: function(transport) {
     this.triggerCallback('onFailure', transport);
@@ -782,7 +782,7 @@
       onSuccess: function(transport) {
         var js = transport.responseText.strip();
         if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check
-          throw 'Server returned an invalid collection representation.';
+          throw('Server returned an invalid collection representation.');
         this._collection = eval(js);
         this.checkForExternalText();
       }.bind(this),
@@ -939,7 +939,7 @@
   loadingCollectionText: 'Loading options...'
 };
 
-// Delayed observer, like Form.Element.Observer, 
+// Delayed observer, like Form.Element.Observer,
 // but waits for delay after last key input
 // Ideal for live-search fields
 
@@ -949,7 +949,7 @@
     this.element   = $(element);
     this.callback  = callback;
     this.timer     = null;
-    this.lastValue = $F(this.element); 
+    this.lastValue = $F(this.element);
     Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
   },
   delayedListener: function(event) {
@@ -962,4 +962,4 @@
     this.timer = null;
     this.callback(this.element, $F(this.element));
   }
-});
+});
\ No newline at end of file

Modified: incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/dragdrop.js
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/dragdrop.js?rev=832394&amp;r1=832393&amp;r2=832394&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/dragdrop.js (original)
+++ incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/dragdrop.js Tue Nov  3 11:19:01 2009
@@ -1,8 +1,7 @@
-// script.aculo.us dragdrop.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008
+// script.aculo.us dragdrop.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
 
-// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//           (c) 2005-2007 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
-// 
+// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
 // script.aculo.us is freely distributable under the terms of an MIT-style license.
 // For details, see the script.aculo.us web site: http://script.aculo.us/
 
@@ -34,7 +33,7 @@
         options._containers.push($(containment));
       }
     }
-    
+
     if(options.accept) options.accept = [options.accept].flatten();
 
     Element.makePositioned(element); // fix IE
@@ -42,34 +41,34 @@
 
     this.drops.push(options);
   },
-  
+
   findDeepestChild: function(drops) {
     deepest = drops[0];
-      
+
     for (i = 1; i &lt; drops.length; ++i)
       if (Element.isParent(drops[i].element, deepest.element))
         deepest = drops[i];
-    
+
     return deepest;
   },
 
   isContained: function(element, drop) {
     var containmentNode;
     if(drop.tree) {
-      containmentNode = element.treeNode; 
+      containmentNode = element.treeNode;
     } else {
       containmentNode = element.parentNode;
     }
     return drop._containers.detect(function(c) { return containmentNode == c });
   },
-  
+
   isAffected: function(point, element, drop) {
     return (
       (drop.element!=element) &amp;&amp;
       ((!drop._containers) ||
         this.isContained(element, drop)) &amp;&amp;
       ((!drop.accept) ||
-        (Element.classNames(element).detect( 
+        (Element.classNames(element).detect(
           function(v) { return drop.accept.include(v) } ) )) &amp;&amp;
       Position.within(drop.element, point[0], point[1]) );
   },
@@ -89,12 +88,12 @@
   show: function(point, element) {
     if(!this.drops.length) return;
     var drop, affected = [];
-    
+
     this.drops.each( function(drop) {
       if(Droppables.isAffected(point, element, drop))
         affected.push(drop);
     });
-        
+
     if(affected.length&gt;0)
       drop = Droppables.findDeepestChild(affected);
 
@@ -103,7 +102,7 @@
       Position.within(drop.element, point[0], point[1]);
       if(drop.onHover)
         drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
-      
+
       if (drop != this.last_active) Droppables.activate(drop);
     }
   },
@@ -114,8 +113,8 @@
 
     if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
       if (this.last_active.onDrop) {
-        this.last_active.onDrop(element, this.last_active.element, event); 
-        return true; 
+        this.last_active.onDrop(element, this.last_active.element, event);
+        return true;
       }
   },
 
@@ -123,25 +122,25 @@
     if(this.last_active)
       this.deactivate(this.last_active);
   }
-}
+};
 
 var Draggables = {
   drags: [],
   observers: [],
-  
+
   register: function(draggable) {
     if(this.drags.length == 0) {
       this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
       this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
       this.eventKeypress  = this.keyPress.bindAsEventListener(this);
-      
+
       Event.observe(document, "mouseup", this.eventMouseUp);
       Event.observe(document, "mousemove", this.eventMouseMove);
       Event.observe(document, "keypress", this.eventKeypress);
     }
     this.drags.push(draggable);
   },
-  
+
   unregister: function(draggable) {
     this.drags = this.drags.reject(function(d) { return d==draggable });
     if(this.drags.length == 0) {
@@ -150,24 +149,24 @@
       Event.stopObserving(document, "keypress", this.eventKeypress);
     }
   },
-  
+
   activate: function(draggable) {
-    if(draggable.options.delay) { 
-      this._timeout = setTimeout(function() { 
-        Draggables._timeout = null; 
-        window.focus(); 
-        Draggables.activeDraggable = draggable; 
-      }.bind(this), draggable.options.delay); 
+    if(draggable.options.delay) {
+      this._timeout = setTimeout(function() {
+        Draggables._timeout = null;
+        window.focus();
+        Draggables.activeDraggable = draggable;
+      }.bind(this), draggable.options.delay);
     } else {
       window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
       this.activeDraggable = draggable;
     }
   },
-  
+
   deactivate: function() {
     this.activeDraggable = null;
   },
-  
+
   updateDrag: function(event) {
     if(!this.activeDraggable) return;
     var pointer = [Event.pointerX(event), Event.pointerY(event)];
@@ -175,36 +174,36 @@
     // the same coordinates, prevent needless redrawing (moz bug?)
     if(this._lastPointer &amp;&amp; (this._lastPointer.inspect() == pointer.inspect())) return;
     this._lastPointer = pointer;
-    
+
     this.activeDraggable.updateDrag(event, pointer);
   },
-  
+
   endDrag: function(event) {
-    if(this._timeout) { 
-      clearTimeout(this._timeout); 
-      this._timeout = null; 
+    if(this._timeout) {
+      clearTimeout(this._timeout);
+      this._timeout = null;
     }
     if(!this.activeDraggable) return;
     this._lastPointer = null;
     this.activeDraggable.endDrag(event);
     this.activeDraggable = null;
   },
-  
+
   keyPress: function(event) {
     if(this.activeDraggable)
       this.activeDraggable.keyPress(event);
   },
-  
+
   addObserver: function(observer) {
     this.observers.push(observer);
     this._cacheObserverCallbacks();
   },
-  
+
   removeObserver: function(element) {  // element instead of observer fixes mem leaks
     this.observers = this.observers.reject( function(o) { return o.element==element });
     this._cacheObserverCallbacks();
   },
-  
+
   notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'
     if(this[eventName+'Count'] &gt; 0)
       this.observers.each( function(o) {
@@ -212,7 +211,7 @@
       });
     if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
   },
-  
+
   _cacheObserverCallbacks: function() {
     ['onStart','onEnd','onDrag'].each( function(eventName) {
       Draggables[eventName+'Count'] = Draggables.observers.select(
@@ -220,7 +219,7 @@
       ).length;
     });
   }
-}
+};
 
 /*--------------------------------------------------------------------------*/
 
@@ -236,12 +235,12 @@
       },
       endeffect: function(element) {
         var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;
-        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, 
+        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
           queue: {scope:'_draggable', position:'end'},
-          afterFinish: function(){ 
-            Draggable._dragging[element] = false 
+          afterFinish: function(){
+            Draggable._dragging[element] = false
           }
-        }); 
+        });
       },
       zindex: 1000,
       revert: false,
@@ -252,57 +251,57 @@
       snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] }
       delay: 0
     };
-    
+
     if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
       Object.extend(defaults, {
         starteffect: function(element) {
           element._opacity = Element.getOpacity(element);
           Draggable._dragging[element] = true;
-          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); 
+          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
         }
       });
-    
+
     var options = Object.extend(defaults, arguments[1] || { });
 
     this.element = $(element);
-    
+
     if(options.handle &amp;&amp; Object.isString(options.handle))
       this.handle = this.element.down('.'+options.handle, 0);
-    
+
     if(!this.handle) this.handle = $(options.handle);
     if(!this.handle) this.handle = this.element;
-    
+
     if(options.scroll &amp;&amp; !options.scroll.scrollTo &amp;&amp; !options.scroll.outerHTML) {
       options.scroll = $(options.scroll);
       this._isScrollChild = Element.childOf(this.element, options.scroll);
     }
 
-    Element.makePositioned(this.element); // fix IE    
+    Element.makePositioned(this.element); // fix IE
 
     this.options  = options;
-    this.dragging = false;   
+    this.dragging = false;
 
     this.eventMouseDown = this.initDrag.bindAsEventListener(this);
     Event.observe(this.handle, "mousedown", this.eventMouseDown);
-    
+
     Draggables.register(this);
   },
-  
+
   destroy: function() {
     Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
     Draggables.unregister(this);
   },
-  
+
   currentDelta: function() {
     return([
       parseInt(Element.getStyle(this.element,'left') || '0'),
       parseInt(Element.getStyle(this.element,'top') || '0')]);
   },
-  
+
   initDrag: function(event) {
     if(!Object.isUndefined(Draggable._dragging[this.element]) &amp;&amp;
       Draggable._dragging[this.element]) return;
-    if(Event.isLeftClick(event)) {    
+    if(Event.isLeftClick(event)) {
       // abort on form elements, fixes a Firefox issue
       var src = Event.element(event);
       if((tag_name = src.tagName.toUpperCase()) &amp;&amp; (
@@ -311,34 +310,34 @@
         tag_name=='OPTION' ||
         tag_name=='BUTTON' ||
         tag_name=='TEXTAREA')) return;
-        
+
       var pointer = [Event.pointerX(event), Event.pointerY(event)];
-      var pos     = Position.cumulativeOffset(this.element);
+      var pos     = this.element.cumulativeOffset();
       this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
-      
+
       Draggables.activate(this);
       Event.stop(event);
     }
   },
-  
+
   startDrag: function(event) {
     this.dragging = true;
     if(!this.delta)
       this.delta = this.currentDelta();
-    
+
     if(this.options.zindex) {
       this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
       this.element.style.zIndex = this.options.zindex;
     }
-    
+
     if(this.options.ghosting) {
       this._clone = this.element.cloneNode(true);
-      this.element._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
-      if (!this.element._originallyAbsolute)
+      this._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
+      if (!this._originallyAbsolute)
         Position.absolutize(this.element);
       this.element.parentNode.insertBefore(this._clone, this.element);
     }
-    
+
     if(this.options.scroll) {
       if (this.options.scroll == window) {
         var where = this._getWindowScroll(this.options.scroll);
@@ -349,28 +348,28 @@
         this.originalScrollTop = this.options.scroll.scrollTop;
       }
     }
-    
+
     Draggables.notify('onStart', this, event);
-        
+
     if(this.options.starteffect) this.options.starteffect(this.element);
   },
-  
+
   updateDrag: function(event, pointer) {
     if(!this.dragging) this.startDrag(event);
-    
+
     if(!this.options.quiet){
       Position.prepare();
       Droppables.show(pointer, this.element);
     }
-    
+
     Draggables.notify('onDrag', this, event);
-    
+
     this.draw(pointer);
     if(this.options.change) this.options.change(this);
-    
+
     if(this.options.scroll) {
       this.stopScrolling();
-      
+
       var p;
       if (this.options.scroll == window) {
         with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
@@ -388,16 +387,16 @@
       if(pointer[1] &gt; (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
       this.startScrolling(speed);
     }
-    
+
     // fix AppleWebKit rendering
     if(Prototype.Browser.WebKit) window.scrollBy(0,0);
-    
+
     Event.stop(event);
   },
-  
+
   finishDrag: function(event, success) {
     this.dragging = false;
-    
+
     if(this.options.quiet){
       Position.prepare();
       var pointer = [Event.pointerX(event), Event.pointerY(event)];
@@ -405,24 +404,24 @@
     }
 
     if(this.options.ghosting) {
-      if (!this.element._originallyAbsolute)
+      if (!this._originallyAbsolute)
         Position.relativize(this.element);
-      delete this.element._originallyAbsolute;
+      delete this._originallyAbsolute;
       Element.remove(this._clone);
       this._clone = null;
     }
 
-    var dropped = false; 
-    if(success) { 
-      dropped = Droppables.fire(event, this.element); 
-      if (!dropped) dropped = false; 
+    var dropped = false;
+    if(success) {
+      dropped = Droppables.fire(event, this.element);
+      if (!dropped) dropped = false;
     }
     if(dropped &amp;&amp; this.options.onDropped) this.options.onDropped(this.element);
     Draggables.notify('onEnd', this, event);
 
     var revert = this.options.revert;
     if(revert &amp;&amp; Object.isFunction(revert)) revert = revert(this.element);
-    
+
     var d = this.currentDelta();
     if(revert &amp;&amp; this.options.reverteffect) {
       if (dropped == 0 || revert != 'failure')
@@ -435,67 +434,67 @@
     if(this.options.zindex)
       this.element.style.zIndex = this.originalZ;
 
-    if(this.options.endeffect) 
+    if(this.options.endeffect)
       this.options.endeffect(this.element);
-      
+
     Draggables.deactivate(this);
     Droppables.reset();
   },
-  
+
   keyPress: function(event) {
     if(event.keyCode!=Event.KEY_ESC) return;
     this.finishDrag(event, false);
     Event.stop(event);
   },
-  
+
   endDrag: function(event) {
     if(!this.dragging) return;
     this.stopScrolling();
     this.finishDrag(event, true);
     Event.stop(event);
   },
-  
+
   draw: function(point) {
-    var pos = Position.cumulativeOffset(this.element);
+    var pos = this.element.cumulativeOffset();
     if(this.options.ghosting) {
       var r   = Position.realOffset(this.element);
       pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
     }
-    
+
     var d = this.currentDelta();
     pos[0] -= d[0]; pos[1] -= d[1];
-    
+
     if(this.options.scroll &amp;&amp; (this.options.scroll != window &amp;&amp; this._isScrollChild)) {
       pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
       pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
     }
-    
-    var p = [0,1].map(function(i){ 
-      return (point[i]-pos[i]-this.offset[i]) 
+
+    var p = [0,1].map(function(i){
+      return (point[i]-pos[i]-this.offset[i])
     }.bind(this));
-    
+
     if(this.options.snap) {
       if(Object.isFunction(this.options.snap)) {
         p = this.options.snap(p[0],p[1],this);
       } else {
       if(Object.isArray(this.options.snap)) {
         p = p.map( function(v, i) {
-          return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this))
+          return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this));
       } else {
         p = p.map( function(v) {
-          return (v/this.options.snap).round()*this.options.snap }.bind(this))
+          return (v/this.options.snap).round()*this.options.snap }.bind(this));
       }
     }}
-    
+
     var style = this.element.style;
     if((!this.options.constraint) || (this.options.constraint=='horizontal'))
       style.left = p[0] + "px";
     if((!this.options.constraint) || (this.options.constraint=='vertical'))
       style.top  = p[1] + "px";
-    
+
     if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
   },
-  
+
   stopScrolling: function() {
     if(this.scrollInterval) {
       clearInterval(this.scrollInterval);
@@ -503,14 +502,14 @@
       Draggables._lastScrollPointer = null;
     }
   },
-  
+
   startScrolling: function(speed) {
     if(!(speed[0] || speed[1])) return;
     this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
     this.lastScrolled = new Date();
     this.scrollInterval = setInterval(this.scroll.bind(this), 10);
   },
-  
+
   scroll: function() {
     var current = new Date();
     var delta = current - this.lastScrolled;
@@ -526,7 +525,7 @@
       this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
       this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000;
     }
-    
+
     Position.prepare();
     Droppables.show(Draggables._lastPointer, this.element);
     Draggables.notify('onDrag', this);
@@ -540,10 +539,10 @@
         Draggables._lastScrollPointer[1] = 0;
       this.draw(Draggables._lastScrollPointer);
     }
-    
+
     if(this.options.change) this.options.change(this);
   },
-  
+
   _getWindowScroll: function(w) {
     var T, L, W, H;
     with (w.document) {
@@ -562,7 +561,7 @@
         H = documentElement.clientHeight;
       } else {
         W = body.offsetWidth;
-        H = body.offsetHeight
+        H = body.offsetHeight;
       }
     }
     return { top: T, left: L, width: W, height: H };
@@ -579,11 +578,11 @@
     this.observer  = observer;
     this.lastValue = Sortable.serialize(this.element);
   },
-  
+
   onStart: function() {
     this.lastValue = Sortable.serialize(this.element);
   },
-  
+
   onEnd: function() {
     Sortable.unmark();
     if(this.lastValue != Sortable.serialize(this.element))
@@ -593,11 +592,11 @@
 
 var Sortable = {
   SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
-  
+
   sortables: { },
-  
+
   _findRootElement: function(element) {
-    while (element.tagName.toUpperCase() != "BODY") {  
+    while (element.tagName.toUpperCase() != "BODY") {
       if(element.id &amp;&amp; Sortable.sortables[element.id]) return element;
       element = element.parentNode;
     }
@@ -608,22 +607,23 @@
     if(!element) return;
     return Sortable.sortables[element.id];
   },
-  
+
   destroy: function(element){
-    var s = Sortable.options(element);
-    
+    element = $(element);
+    var s = Sortable.sortables[element.id];
+
     if(s) {
       Draggables.removeObserver(s.element);
       s.droppables.each(function(d){ Droppables.remove(d) });
       s.draggables.invoke('destroy');
-      
+
       delete Sortable.sortables[s.element.id];
     }
   },
 
   create: function(element) {
     element = $(element);
-    var options = Object.extend({ 
+    var options = Object.extend({
       element:     element,
       tag:         'li',       // assumes li children, override with tag: 'tagname'
       dropOnEmpty: false,
@@ -637,17 +637,17 @@
       delay:       0,
       hoverclass:  null,
       ghosting:    false,
-      quiet:       false, 
+      quiet:       false,
       scroll:      false,
       scrollSensitivity: 20,
       scrollSpeed: 15,
       format:      this.SERIALIZE_RULE,
-      
-      // these take arrays of elements or ids and can be 
+
+      // these take arrays of elements or ids and can be
       // used for better initialization performance
       elements:    false,
       handles:     false,
-      
+
       onChange:    Prototype.emptyFunction,
       onUpdate:    Prototype.emptyFunction
     }, arguments[1] || { });
@@ -684,24 +684,24 @@
     if(options.zindex)
       options_for_draggable.zindex = options.zindex;
 
-    // build options for the droppables  
+    // build options for the droppables
     var options_for_droppable = {
       overlap:     options.overlap,
       containment: options.containment,
       tree:        options.tree,
       hoverclass:  options.hoverclass,
       onHover:     Sortable.onHover
-    }
-    
+    };
+
     var options_for_tree = {
       onHover:      Sortable.onEmptyHover,
       overlap:      options.overlap,
       containment:  options.containment,
       hoverclass:   options.hoverclass
-    }
+    };
 
     // fix for gecko engine
-    Element.cleanWhitespace(element); 
+    Element.cleanWhitespace(element);
 
     options.draggables = [];
     options.droppables = [];
@@ -714,14 +714,14 @@
 
     (options.elements || this.findElements(element, options) || []).each( function(e,i) {
       var handle = options.handles ? $(options.handles[i]) :
-        (options.handle ? $(e).select('.' + options.handle)[0] : e); 
+        (options.handle ? $(e).select('.' + options.handle)[0] : e);
       options.draggables.push(
         new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
       Droppables.add(e, options_for_droppable);
       if(options.tree) e.treeNode = element;
-      options.droppables.push(e);      
+      options.droppables.push(e);
     });
-    
+
     if(options.tree) {
       (Sortable.findTreeElements(element, options) || []).each( function(e) {
         Droppables.add(e, options_for_tree);
@@ -731,7 +731,7 @@
     }
 
     // keep reference
-    this.sortables[element.id] = options;
+    this.sortables[element.identify()] = options;
 
     // for onupdate
     Draggables.addObserver(new SortableObserver(element, options.onUpdate));
@@ -743,7 +743,7 @@
     return Element.findChildren(
       element, options.only, options.tree ? true : false, options.tag);
   },
-  
+
   findTreeElements: function(element, options) {
     return Element.findChildren(
       element, options.only, options.tree ? true : false, options.treeTag);
@@ -760,7 +760,7 @@
         var oldParentNode = element.parentNode;
         element.style.visibility = "hidden"; // fix gecko rendering
         dropon.parentNode.insertBefore(element, dropon);
-        if(dropon.parentNode!=oldParentNode) 
+        if(dropon.parentNode!=oldParentNode)
           Sortable.options(oldParentNode).onChange(element);
         Sortable.options(dropon.parentNode).onChange(element);
       }
@@ -771,26 +771,26 @@
         var oldParentNode = element.parentNode;
         element.style.visibility = "hidden"; // fix gecko rendering
         dropon.parentNode.insertBefore(element, nextElement);
-        if(dropon.parentNode!=oldParentNode) 
+        if(dropon.parentNode!=oldParentNode)
           Sortable.options(oldParentNode).onChange(element);
         Sortable.options(dropon.parentNode).onChange(element);
       }
     }
   },
-  
+
   onEmptyHover: function(element, dropon, overlap) {
     var oldParentNode = element.parentNode;
     var droponOptions = Sortable.options(dropon);
-        
+
     if(!Element.isParent(dropon, element)) {
       var index;
-      
+
       var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
       var child = null;
-            
+
       if(children) {
         var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
-        
+
         for (index = 0; index &lt; children.length; index += 1) {
           if (offset - Element.offsetSize (children[index], droponOptions.overlap) &gt;= 0) {
             offset -= Element.offsetSize (children[index], droponOptions.overlap);
@@ -803,9 +803,9 @@
           }
         }
       }
-      
+
       dropon.insertBefore(element, child);
-      
+
       Sortable.options(oldParentNode).onChange(element);
       droponOptions.onChange(element);
     }
@@ -818,34 +818,34 @@
   mark: function(dropon, position) {
     // mark on ghosting only
     var sortable = Sortable.options(dropon.parentNode);
-    if(sortable &amp;&amp; !sortable.ghosting) return; 
+    if(sortable &amp;&amp; !sortable.ghosting) return;
 
     if(!Sortable._marker) {
-      Sortable._marker = 
+      Sortable._marker =
         ($('dropmarker') || Element.extend(document.createElement('DIV'))).
           hide().addClassName('dropmarker').setStyle({position:'absolute'});
       document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
-    }    
-    var offsets = Position.cumulativeOffset(dropon);
+    }
+    var offsets = dropon.cumulativeOffset();
     Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
-    
+
     if(position=='after')
-      if(sortable.overlap == 'horizontal') 
+      if(sortable.overlap == 'horizontal')
         Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
       else
         Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
-    
+
     Sortable._marker.show();
   },
-  
+
   _tree: function(element, options, parent) {
     var children = Sortable.findElements(element, options) || [];
-  
+
     for (var i = 0; i &lt; children.length; ++i) {
       var match = children[i].id.match(options.format);
 
       if (!match) continue;
-      
+
       var child = {
         id: encodeURIComponent(match ? match[1] : null),
         element: element,
@@ -853,16 +853,16 @@
         children: [],
         position: parent.children.length,
         container: $(children[i]).down(options.treeTag)
-      }
-      
+      };
+
       /* Get the element containing the children and recurse over it */
       if (child.container)
-        this._tree(child.container, options, child)
-      
+        this._tree(child.container, options, child);
+
       parent.children.push (child);
     }
 
-    return parent; 
+    return parent;
   },
 
   tree: function(element) {
@@ -875,15 +875,15 @@
       name: element.id,
       format: sortableOptions.format
     }, arguments[1] || { });
-    
+
     var root = {
       id: null,
       parent: null,
       children: [],
       container: element,
       position: 0
-    }
-    
+    };
+
     return Sortable._tree(element, options, root);
   },
 
@@ -899,7 +899,7 @@
   sequence: function(element) {
     element = $(element);
     var options = Object.extend(this.options(element), arguments[1] || { });
-    
+
     return $(this.findElements(element, options) || []).map( function(item) {
       return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
     });
@@ -908,14 +908,14 @@
   setSequence: function(element, new_sequence) {
     element = $(element);
     var options = Object.extend(this.options(element), arguments[2] || { });
-    
+
     var nodeMap = { };
     this.findElements(element, options).each( function(n) {
         if (n.id.match(options.format))
             nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
         n.parentNode.removeChild(n);
     });
-   
+
     new_sequence.each(function(ident) {
       var n = nodeMap[ident];
       if (n) {
@@ -924,16 +924,16 @@
       }
     });
   },
-  
+
   serialize: function(element) {
     element = $(element);
     var options = Object.extend(Sortable.options(element), arguments[1] || { });
     var name = encodeURIComponent(
       (arguments[1] &amp;&amp; arguments[1].name) ? arguments[1].name : element.id);
-    
+
     if (options.tree) {
       return Sortable.tree(element, arguments[1]).children.map( function (item) {
-        return [name + Sortable._constructIndex(item) + "[id]=" + 
+        return [name + Sortable._constructIndex(item) + "[id]=" +
                 encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
       }).flatten().join('&amp;');
     } else {
@@ -942,16 +942,16 @@
       }).join('&amp;');
     }
   }
-}
+};
 
 // Returns true if child is contained within element
 Element.isParent = function(child, element) {
   if (!child.parentNode || child == element) return false;
   if (child.parentNode == element) return true;
   return Element.isParent(child.parentNode, element);
-}
+};
 
-Element.findChildren = function(element, only, recursive, tagName) {   
+Element.findChildren = function(element, only, recursive, tagName) {
   if(!element.hasChildNodes()) return null;
   tagName = tagName.toUpperCase();
   if(only) only = [only].flatten();
@@ -967,8 +967,8 @@
   });
 
   return (elements.length&gt;0 ? elements.flatten() : []);
-}
+};
 
 Element.offsetSize = function (element, type) {
   return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
-}
+};
\ No newline at end of file

Modified: incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/effects.js
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/effects.js?rev=832394&amp;r1=832393&amp;r2=832394&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/effects.js (original)
+++ incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/effects.js Tue Nov  3 11:19:01 2009
@@ -1,50 +1,50 @@
-// script.aculo.us effects.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008
+// script.aculo.us effects.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
 
-// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
 // Contributors:
 //  Justin Palmer (http://encytemedia.com/)
 //  Mark Pilgrim (http://diveintomark.org/)
 //  Martin Bialasinki
-// 
+//
 // script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/ 
+// For details, see the script.aculo.us web site: http://script.aculo.us/
 
-// converts rgb() and #xxx to #xxxxxx format,  
-// returns self (or first argument) if not convertable  
-String.prototype.parseColor = function() {  
+// converts rgb() and #xxx to #xxxxxx format,
+// returns self (or first argument) if not convertable
+String.prototype.parseColor = function() {
   var color = '#';
-  if (this.slice(0,4) == 'rgb(') {  
-    var cols = this.slice(4,this.length-1).split(',');  
-    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i&lt;3);  
-  } else {  
-    if (this.slice(0,1) == '#') {  
-      if (this.length==4) for(var i=1;i&lt;4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
-      if (this.length==7) color = this.toLowerCase();  
-    }  
-  }  
-  return (color.length==7 ? color : (arguments[0] || this));  
+  if (this.slice(0,4) == 'rgb(') {
+    var cols = this.slice(4,this.length-1).split(',');
+    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i&lt;3);
+  } else {
+    if (this.slice(0,1) == '#') {
+      if (this.length==4) for(var i=1;i&lt;4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
+      if (this.length==7) color = this.toLowerCase();
+    }
+  }
+  return (color.length==7 ? color : (arguments[0] || this));
 };
 
 /*--------------------------------------------------------------------------*/
 
-Element.collectTextNodes = function(element) {  
+Element.collectTextNodes = function(element) {
   return $A($(element).childNodes).collect( function(node) {
-    return (node.nodeType==3 ? node.nodeValue : 
+    return (node.nodeType==3 ? node.nodeValue :
       (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
   }).flatten().join('');
 };
 
-Element.collectTextNodesIgnoreClass = function(element, className) {  
+Element.collectTextNodesIgnoreClass = function(element, className) {
   return $A($(element).childNodes).collect( function(node) {
-    return (node.nodeType==3 ? node.nodeValue : 
-      ((node.hasChildNodes() &amp;&amp; !Element.hasClassName(node,className)) ? 
+    return (node.nodeType==3 ? node.nodeValue :
+      ((node.hasChildNodes() &amp;&amp; !Element.hasClassName(node,className)) ?
         Element.collectTextNodesIgnoreClass(node, className) : ''));
   }).flatten().join('');
 };
 
 Element.setContentZoom = function(element, percent) {
-  element = $(element);  
-  element.setStyle({fontSize: (percent/100) + 'em'});   
+  element = $(element);
+  element.setStyle({fontSize: (percent/100) + 'em'});
   if (Prototype.Browser.WebKit) window.scrollBy(0,0);
   return element;
 };
@@ -72,28 +72,23 @@
   Transitions: {
     linear: Prototype.K,
     sinoidal: function(pos) {
-      return (-Math.cos(pos*Math.PI)/2) + 0.5;
+      return (-Math.cos(pos*Math.PI)/2) + .5;
     },
     reverse: function(pos) {
       return 1-pos;
     },
     flicker: function(pos) {
-      var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
+      var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4;
       return pos &gt; 1 ? 1 : pos;
     },
     wobble: function(pos) {
-      return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
+      return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5;
     },
-    pulse: function(pos, pulses) { 
-      pulses = pulses || 5; 
-      return (
-        ((pos % (1/pulses)) * pulses).round() == 0 ? 
-              ((pos * pulses * 2) - (pos * pulses * 2).floor()) : 
-          1 - ((pos * pulses * 2) - (pos * pulses * 2).floor())
-        );
+    pulse: function(pos, pulses) {
+      return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5;
     },
-    spring: function(pos) { 
-      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); 
+    spring: function(pos) {
+      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));
     },
     none: function(pos) {
       return 0;
@@ -114,14 +109,14 @@
   tagifyText: function(element) {
     var tagifyStyle = 'position:relative';
     if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';
-    
+
     element = $(element);
     $A(element.childNodes).each( function(child) {
       if (child.nodeType==3) {
         child.nodeValue.toArray().each( function(character) {
           element.insertBefore(
             new Element('span', {style: tagifyStyle}).update(
-              character == ' ' ? String.fromCharCode(160) : character), 
+              character == ' ' ? String.fromCharCode(160) : character),
               child);
         });
         Element.remove(child);
@@ -130,13 +125,13 @@
   },
   multiple: function(element, effect) {
     var elements;
-    if (((typeof element == 'object') || 
-        Object.isFunction(element)) &amp;&amp; 
+    if (((typeof element == 'object') ||
+        Object.isFunction(element)) &amp;&amp;
        (element.length))
       elements = element;
     else
       elements = $(element).childNodes;
-      
+
     var options = Object.extend({
       speed: 0.1,
       delay: 0.0
@@ -152,14 +147,13 @@
     'blind':  ['BlindDown','BlindUp'],
     'appear': ['Appear','Fade']
   },
-  toggle: function(element, effect) {
+  toggle: function(element, effect, options) {
     element = $(element);
-    effect = (effect || 'appear').toLowerCase();
-    var options = Object.extend({
+    effect  = (effect || 'appear').toLowerCase();
+    
+    return Effect[ Effect.PAIRS[ effect ][ element.visible() ? 1 : 0 ] ](element, Object.extend({
       queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
-    }, arguments[2] || { });
-    Effect[element.visible() ? 
-      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
+    }, options || {}));
   }
 };
 
@@ -170,20 +164,20 @@
 Effect.ScopedQueue = Class.create(Enumerable, {
   initialize: function() {
     this.effects  = [];
-    this.interval = null;    
+    this.interval = null;
   },
   _each: function(iterator) {
     this.effects._each(iterator);
   },
   add: function(effect) {
     var timestamp = new Date().getTime();
-    
-    var position = Object.isString(effect.options.queue) ? 
+
+    var position = Object.isString(effect.options.queue) ?
       effect.options.queue : effect.options.queue.position;
-    
+
     switch(position) {
       case 'front':
-        // move unstarted effects after this effect  
+        // move unstarted effects after this effect
         this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
             e.startOn  += effect.finishOn;
             e.finishOn += effect.finishOn;
@@ -197,13 +191,13 @@
         timestamp = this.effects.pluck('finishOn').max() || timestamp;
         break;
     }
-    
+
     effect.startOn  += timestamp;
     effect.finishOn += timestamp;
 
     if (!effect.options.queue.limit || (this.effects.length &lt; effect.options.queue.limit))
       this.effects.push(effect);
-    
+
     if (!this.interval)
       this.interval = setInterval(this.loop.bind(this), 15);
   },
@@ -216,7 +210,7 @@
   },
   loop: function() {
     var timePos = new Date().getTime();
-    for(var i=0, len=this.effects.length;i&lt;len;i++) 
+    for(var i=0, len=this.effects.length;i&lt;len;i++)
       this.effects[i] &amp;&amp; this.effects[i].loop(timePos);
   }
 });
@@ -225,7 +219,7 @@
   instances: $H(),
   get: function(queueName) {
     if (!Object.isString(queueName)) return queueName;
-    
+
     return this.instances.get(queueName) ||
       this.instances.set(queueName, new Effect.ScopedQueue());
   }
@@ -235,12 +229,6 @@
 Effect.Base = Class.create({
   position: null,
   start: function(options) {
-    function codeForEvent(options,eventName){
-      return (
-        (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +
-        (options[eventName] ? 'this.options.'+eventName+'(this);' : '')
-      );
-    }
     if (options &amp;&amp; options.transition === false) options.transition = Effect.Transitions.linear;
     this.options      = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });
     this.currentFrame = 0;
@@ -250,23 +238,35 @@
     this.fromToDelta  = this.options.to-this.options.from;
     this.totalTime    = this.finishOn-this.startOn;
     this.totalFrames  = this.options.fps*this.options.duration;
-    
-    eval('this.render = function(pos){ '+
-      'if (this.state=="idle"){this.state="running";'+
-      codeForEvent(this.options,'beforeSetup')+
-      (this.setup ? 'this.setup();':'')+ 
-      codeForEvent(this.options,'afterSetup')+
-      '};if (this.state=="running"){'+
-      'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+
-      'this.position=pos;'+
-      codeForEvent(this.options,'beforeUpdate')+
-      (this.update ? 'this.update(pos);':'')+
-      codeForEvent(this.options,'afterUpdate')+
-      '}}');
-    
+
+    this.render = (function() {
+      function dispatch(effect, eventName) {
+        if (effect.options[eventName + 'Internal'])
+          effect.options[eventName + 'Internal'](effect);
+        if (effect.options[eventName])
+          effect.options[eventName](effect);
+      }
+
+      return function(pos) {
+        if (this.state === "idle") {
+          this.state = "running";
+          dispatch(this, 'beforeSetup');
+          if (this.setup) this.setup();
+          dispatch(this, 'afterSetup');
+        }
+        if (this.state === "running") {
+          pos = (this.options.transition(pos) * this.fromToDelta) + this.options.from;
+          this.position = pos;
+          dispatch(this, 'beforeUpdate');
+          if (this.update) this.update(pos);
+          dispatch(this, 'afterUpdate');
+        }
+      };
+    })();
+
     this.event('beforeStart');
     if (!this.options.sync)
-      Effect.Queues.get(Object.isString(this.options.queue) ? 
+      Effect.Queues.get(Object.isString(this.options.queue) ?
         'global' : this.options.queue.scope).add(this);
   },
   loop: function(timePos) {
@@ -275,9 +275,9 @@
         this.render(1.0);
         this.cancel();
         this.event('beforeFinish');
-        if (this.finish) this.finish(); 
+        if (this.finish) this.finish();
         this.event('afterFinish');
-        return;  
+        return;
       }
       var pos   = (timePos - this.startOn) / this.totalTime,
           frame = (pos * this.totalFrames).round();
@@ -289,7 +289,7 @@
   },
   cancel: function() {
     if (!this.options.sync)
-      Effect.Queues.get(Object.isString(this.options.queue) ? 
+      Effect.Queues.get(Object.isString(this.options.queue) ?
         'global' : this.options.queue.scope).remove(this);
     this.state = 'finished';
   },
@@ -327,10 +327,10 @@
 Effect.Tween = Class.create(Effect.Base, {
   initialize: function(object, from, to) {
     object = Object.isString(object) ? $(object) : object;
-    var args = $A(arguments), method = args.last(), 
+    var args = $A(arguments), method = args.last(),
       options = args.length == 5 ? args[3] : null;
     this.method = Object.isFunction(method) ? method.bind(object) :
-      Object.isFunction(object[method]) ? object[method].bind(object) : 
+      Object.isFunction(object[method]) ? object[method].bind(object) :
       function(value) { object[method] = value };
     this.start(Object.extend({ from: from, to: to }, options || { }));
   },
@@ -394,7 +394,7 @@
 
 // for backwards compatibility
 Effect.MoveBy = function(element, toTop, toLeft) {
-  return new Effect.Move(element, 
+  return new Effect.Move(element,
     Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));
 };
 
@@ -416,15 +416,15 @@
   setup: function() {
     this.restoreAfterFinish = this.options.restoreAfterFinish || false;
     this.elementPositioning = this.element.getStyle('position');
-    
+
     this.originalStyle = { };
     ['top','left','width','height','fontSize'].each( function(k) {
       this.originalStyle[k] = this.element.style[k];
     }.bind(this));
-      
+
     this.originalTop  = this.element.offsetTop;
     this.originalLeft = this.element.offsetLeft;
-    
+
     var fontSize = this.element.getStyle('font-size') || '100%';
     ['em','px','%','pt'].each( function(fontSizeType) {
       if (fontSize.indexOf(fontSizeType)&gt;0) {
@@ -432,9 +432,9 @@
         this.fontSizeType = fontSizeType;
       }
     }.bind(this));
-    
+
     this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
-    
+
     this.dims = null;
     if (this.options.scaleMode=='box')
       this.dims = [this.element.offsetHeight, this.element.offsetWidth];
@@ -509,17 +509,16 @@
 
 Effect.ScrollTo = function(element) {
   var options = arguments[1] || { },
-    scrollOffsets = document.viewport.getScrollOffsets(),
-    elementOffsets = $(element).cumulativeOffset(),
-    max = (window.height || document.body.scrollHeight) - document.viewport.getHeight();  
+  scrollOffsets = document.viewport.getScrollOffsets(),
+  elementOffsets = $(element).cumulativeOffset();
 
   if (options.offset) elementOffsets[1] += options.offset;
 
   return new Effect.Tween(null,
     scrollOffsets.top,
-    elementOffsets[1] &gt; max ? max : elementOffsets[1],
+    elementOffsets[1],
     options,
-    function(p){ scrollTo(scrollOffsets.left, p.round()) }
+    function(p){ scrollTo(scrollOffsets.left, p.round()); }
   );
 };
 
@@ -531,9 +530,9 @@
   var options = Object.extend({
     from: element.getOpacity() || 1.0,
     to:   0.0,
-    afterFinishInternal: function(effect) { 
+    afterFinishInternal: function(effect) {
       if (effect.options.to!=0) return;
-      effect.element.hide().setStyle({opacity: oldOpacity}); 
+      effect.element.hide().setStyle({opacity: oldOpacity});
     }
   }, arguments[1] || { });
   return new Effect.Opacity(element,options);
@@ -549,15 +548,15 @@
     effect.element.forceRerendering();
   },
   beforeSetup: function(effect) {
-    effect.element.setOpacity(effect.options.from).show(); 
+    effect.element.setOpacity(effect.options.from).show();
   }}, arguments[1] || { });
   return new Effect.Opacity(element,options);
 };
 
 Effect.Puff = function(element) {
   element = $(element);
-  var oldStyle = { 
-    opacity: element.getInlineOpacity(), 
+  var oldStyle = {
+    opacity: element.getInlineOpacity(),
     position: element.getStyle('position'),
     top:  element.style.top,
     left: element.style.left,
@@ -565,12 +564,12 @@
     height: element.style.height
   };
   return new Effect.Parallel(
-   [ new Effect.Scale(element, 200, 
-      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
-     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
-     Object.extend({ duration: 1.0, 
+   [ new Effect.Scale(element, 200,
+      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
+     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
+     Object.extend({ duration: 1.0,
       beforeSetupInternal: function(effect) {
-        Position.absolutize(effect.effects[0].element)
+        Position.absolutize(effect.effects[0].element);
       },
       afterFinishInternal: function(effect) {
          effect.effects[0].element.hide().setStyle(oldStyle); }
@@ -582,12 +581,12 @@
   element = $(element);
   element.makeClipping();
   return new Effect.Scale(element, 0,
-    Object.extend({ scaleContent: false, 
-      scaleX: false, 
+    Object.extend({ scaleContent: false,
+      scaleX: false,
       restoreAfterFinish: true,
       afterFinishInternal: function(effect) {
         effect.element.hide().undoClipping();
-      } 
+      }
     }, arguments[1] || { })
   );
 };
@@ -595,15 +594,15 @@
 Effect.BlindDown = function(element) {
   element = $(element);
   var elementDimensions = element.getDimensions();
-  return new Effect.Scale(element, 100, Object.extend({ 
-    scaleContent: false, 
+  return new Effect.Scale(element, 100, Object.extend({
+    scaleContent: false,
     scaleX: false,
     scaleFrom: 0,
     scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
     restoreAfterFinish: true,
     afterSetup: function(effect) {
-      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
-    },  
+      effect.element.makeClipping().setStyle({height: '0px'}).show();
+    },
     afterFinishInternal: function(effect) {
       effect.element.undoClipping();
     }
@@ -618,16 +617,16 @@
     from: 0,
     transition: Effect.Transitions.flicker,
     afterFinishInternal: function(effect) {
-      new Effect.Scale(effect.element, 1, { 
+      new Effect.Scale(effect.element, 1, {
         duration: 0.3, scaleFromCenter: true,
         scaleX: false, scaleContent: false, restoreAfterFinish: true,
-        beforeSetup: function(effect) { 
+        beforeSetup: function(effect) {
           effect.element.makePositioned().makeClipping();
         },
         afterFinishInternal: function(effect) {
           effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
         }
-      })
+      });
     }
   }, arguments[1] || { }));
 };
@@ -639,16 +638,16 @@
     left: element.getStyle('left'),
     opacity: element.getInlineOpacity() };
   return new Effect.Parallel(
-    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
+    [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
       new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
     Object.extend(
       { duration: 0.5,
         beforeSetup: function(effect) {
-          effect.effects[0].element.makePositioned(); 
+          effect.effects[0].element.makePositioned();
         },
         afterFinishInternal: function(effect) {
           effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
-        } 
+        }
       }, arguments[1] || { }));
 };
 
@@ -676,7 +675,7 @@
     new Effect.Move(effect.element,
       { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {
         effect.element.undoPositioned().setStyle(oldStyle);
-  }}) }}) }}) }}) }}) }});
+  }}); }}); }}); }}); }}); }});
 };
 
 Effect.SlideDown = function(element) {
@@ -684,9 +683,9 @@
   // SlideDown need to have the content of the element wrapped in a container element with fixed height!
   var oldInnerBottom = element.down().getStyle('bottom');
   var elementDimensions = element.getDimensions();
-  return new Effect.Scale(element, 100, Object.extend({ 
-    scaleContent: false, 
-    scaleX: false, 
+  return new Effect.Scale(element, 100, Object.extend({
+    scaleContent: false,
+    scaleX: false,
     scaleFrom: window.opera ? 0 : 1,
     scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
     restoreAfterFinish: true,
@@ -694,11 +693,11 @@
       effect.element.makePositioned();
       effect.element.down().makePositioned();
       if (window.opera) effect.element.setStyle({top: ''});
-      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
+      effect.element.makeClipping().setStyle({height: '0px'}).show();
     },
     afterUpdateInternal: function(effect) {
       effect.element.down().setStyle({bottom:
-        (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
+        (effect.dims[0] - effect.element.clientHeight) + 'px' });
     },
     afterFinishInternal: function(effect) {
       effect.element.undoClipping().undoPositioned();
@@ -712,8 +711,8 @@
   var oldInnerBottom = element.down().getStyle('bottom');
   var elementDimensions = element.getDimensions();
   return new Effect.Scale(element, window.opera ? 0 : 1,
-   Object.extend({ scaleContent: false, 
-    scaleX: false, 
+   Object.extend({ scaleContent: false,
+    scaleX: false,
     scaleMode: 'box',
     scaleFrom: 100,
     scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
@@ -723,7 +722,7 @@
       effect.element.down().makePositioned();
       if (window.opera) effect.element.setStyle({top: ''});
       effect.element.makeClipping().show();
-    },  
+    },
     afterUpdateInternal: function(effect) {
       effect.element.down().setStyle({bottom:
         (effect.dims[0] - effect.element.clientHeight) + 'px' });
@@ -736,15 +735,15 @@
   );
 };
 
-// Bug in opera makes the TD containing this element expand for a instance after finish 
+// Bug in opera makes the TD containing this element expand for a instance after finish
 Effect.Squish = function(element) {
-  return new Effect.Scale(element, window.opera ? 1 : 0, { 
+  return new Effect.Scale(element, window.opera ? 1 : 0, {
     restoreAfterFinish: true,
     beforeSetup: function(effect) {
-      effect.element.makeClipping(); 
-    },  
+      effect.element.makeClipping();
+    },
     afterFinishInternal: function(effect) {
-      effect.element.hide().undoClipping(); 
+      effect.element.hide().undoClipping();
     }
   });
 };
@@ -764,13 +763,13 @@
     width: element.style.width,
     opacity: element.getInlineOpacity() };
 
-  var dims = element.getDimensions();    
+  var dims = element.getDimensions();
   var initialMoveX, initialMoveY;
   var moveX, moveY;
-  
+
   switch (options.direction) {
     case 'top-left':
-      initialMoveX = initialMoveY = moveX = moveY = 0; 
+      initialMoveX = initialMoveY = moveX = moveY = 0;
       break;
     case 'top-right':
       initialMoveX = dims.width;
@@ -795,11 +794,11 @@
       moveY = -dims.height / 2;
       break;
   }
-  
+
   return new Effect.Move(element, {
     x: initialMoveX,
     y: initialMoveY,
-    duration: 0.01, 
+    duration: 0.01,
     beforeSetup: function(effect) {
       effect.element.hide().makeClipping().makePositioned();
     },
@@ -808,17 +807,17 @@
         [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
           new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
           new Effect.Scale(effect.element, 100, {
-            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
+            scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
             sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
         ], Object.extend({
              beforeSetup: function(effect) {
-               effect.effects[0].element.setStyle({height: '0px'}).show(); 
+               effect.effects[0].element.setStyle({height: '0px'}).show();
              },
              afterFinishInternal: function(effect) {
-               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 
+               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
              }
            }, options)
-      )
+      );
     }
   });
 };
@@ -840,7 +839,7 @@
 
   var dims = element.getDimensions();
   var moveX, moveY;
-  
+
   switch (options.direction) {
     case 'top-left':
       moveX = moveY = 0;
@@ -857,19 +856,19 @@
       moveX = dims.width;
       moveY = dims.height;
       break;
-    case 'center':  
+    case 'center':
       moveX = dims.width / 2;
       moveY = dims.height / 2;
       break;
   }
-  
+
   return new Effect.Parallel(
     [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
       new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
       new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
-    ], Object.extend({            
+    ], Object.extend({
          beforeStartInternal: function(effect) {
-           effect.effects[0].element.makePositioned().makeClipping(); 
+           effect.effects[0].element.makePositioned().makeClipping();
          },
          afterFinishInternal: function(effect) {
            effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
@@ -879,12 +878,14 @@
 
 Effect.Pulsate = function(element) {
   element = $(element);
-  var options    = arguments[1] || { };
-  var oldOpacity = element.getInlineOpacity();
-  var transition = options.transition || Effect.Transitions.sinoidal;
-  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
-  reverser.bind(transition);
-  return new Effect.Opacity(element, 
+  var options    = arguments[1] || { },
+    oldOpacity = element.getInlineOpacity(),
+    transition = options.transition || Effect.Transitions.linear,
+    reverser   = function(pos){
+      return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5);
+    };
+
+  return new Effect.Opacity(element,
     Object.extend(Object.extend({  duration: 2.0, from: 0,
       afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
     }, options), {transition: reverser}));
@@ -898,12 +899,12 @@
     width: element.style.width,
     height: element.style.height };
   element.makeClipping();
-  return new Effect.Scale(element, 5, Object.extend({   
+  return new Effect.Scale(element, 5, Object.extend({
     scaleContent: false,
     scaleX: false,
     afterFinishInternal: function(effect) {
-    new Effect.Scale(element, 1, { 
-      scaleContent: false, 
+    new Effect.Scale(element, 1, {
+      scaleContent: false,
       scaleY: false,
       afterFinishInternal: function(effect) {
         effect.element.hide().undoClipping().setStyle(oldStyle);
@@ -918,7 +919,7 @@
     var options = Object.extend({
       style: { }
     }, arguments[1] || { });
-    
+
     if (!Object.isString(options.style)) this.style = $H(options.style);
     else {
       if (options.style.include(':'))
@@ -936,18 +937,18 @@
           effect.transforms.each(function(transform) {
             effect.element.style[transform.style] = '';
           });
-        }
+        };
       }
     }
     this.start(options);
   },
-  
+
   setup: function(){
     function parseColor(color){
       if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
       color = color.parseColor();
       return $R(0,2).map(function(i){
-        return parseInt( color.slice(i*2+1,i*2+3), 16 ) 
+        return parseInt( color.slice(i*2+1,i*2+3), 16 );
       });
     }
     this.transforms = this.style.map(function(pair){
@@ -967,9 +968,9 @@
       }
 
       var originalValue = this.element.getStyle(property);
-      return { 
-        style: property.camelize(), 
-        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 
+      return {
+        style: property.camelize(),
+        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
         targetValue: unit=='color' ? parseColor(value) : value,
         unit: unit
       };
@@ -980,13 +981,13 @@
           transform.unit != 'color' &amp;&amp;
           (isNaN(transform.originalValue) || isNaN(transform.targetValue))
         )
-      )
+      );
     });
   },
   update: function(position) {
     var style = { }, transform, i = this.transforms.length;
     while(i--)
-      style[(transform = this.transforms[i]).style] = 
+      style[(transform = this.transforms[i]).style] =
         transform.unit=='color' ? '#'+
           (Math.round(transform.originalValue[0]+
             (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
@@ -995,7 +996,7 @@
           (Math.round(transform.originalValue[2]+
             (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
         (transform.originalValue +
-          (transform.targetValue - transform.originalValue) * position).toFixed(3) + 
+          (transform.targetValue - transform.originalValue) * position).toFixed(3) +
             (transform.unit === null ? '' : transform.unit);
     this.element.setStyle(style, true);
   }
@@ -1032,7 +1033,7 @@
 });
 
 Element.CSS_PROPERTIES = $w(
-  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 
+  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
   'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
   'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
   'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
@@ -1041,7 +1042,7 @@
   'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
   'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
   'right textIndent top width wordSpacing zIndex');
-  
+
 Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
 
 String.__parseStyleElement = document.createElement('div');
@@ -1053,11 +1054,11 @@
     String.__parseStyleElement.innerHTML = '&lt;div style="' + this + '"&gt;&lt;/div&gt;';
     style = String.__parseStyleElement.childNodes[0].style;
   }
-  
+
   Element.CSS_PROPERTIES.each(function(property){
-    if (style[property]) styleRules.set(property, style[property]); 
+    if (style[property]) styleRules.set(property, style[property]);
   });
-  
+
   if (Prototype.Browser.IE &amp;&amp; this.include('opacity'))
     styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);
 
@@ -1083,7 +1084,7 @@
     if (!styles.opacity) styles.opacity = element.getOpacity();
     return styles;
   };
-};
+}
 
 Effect.Methods = {
   morph: function(element, style) {
@@ -1092,7 +1093,7 @@
     return element;
   },
   visualEffect: function(element, effect, options) {
-    element = $(element)
+    element = $(element);
     var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);
     new Effect[klass](element, options);
     return element;
@@ -1106,17 +1107,17 @@
 
 $w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
   'pulsate shake puff squish switchOff dropOut').each(
-  function(effect) { 
+  function(effect) {
     Effect.Methods[effect] = function(element, options){
       element = $(element);
       Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);
       return element;
-    }
+    };
   }
 );
 
-$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( 
+$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(
   function(f) { Effect.Methods[f] = Element[f]; }
 );
 
-Element.addMethods(Effect.Methods);
+Element.addMethods(Effect.Methods);
\ No newline at end of file

Modified: incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/scriptaculous.js
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/scriptaculous.js?rev=832394&amp;r1=832393&amp;r2=832394&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/scriptaculous.js (original)
+++ incubator/click/trunk/click/extras/src/META-INF/resources/click/prototype/scriptaculous.js Tue Nov  3 11:19:01 2009
@@ -1,7 +1,7 @@
-// script.aculo.us scriptaculous.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008
+// script.aculo.us scriptaculous.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
 
-// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// 
+// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
 // "Software"), to deal in the Software without restriction, including
@@ -9,7 +9,7 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
 //
@@ -24,36 +24,45 @@
 // For details, see the script.aculo.us web site: http://script.aculo.us/
 
 var Scriptaculous = {
-  Version: '1.8.1',
+  Version: '1.8.3',
   require: function(libraryName) {
-    // inserting via DOM fails in Safari 2.0, so brute force approach
-    document.write('&lt;script type="text/javascript" src="'+libraryName+'"&gt;&lt;\/script&gt;');
+    try{
+      // inserting via DOM fails in Safari 2.0, so brute force approach
+      document.write('&lt;script type="text/javascript" src="'+libraryName+'"&gt;&lt;\/script&gt;');
+    } catch(e) {
+      // for xhtml+xml served content, fall back to DOM methods
+      var script = document.createElement('script');
+      script.type = 'text/javascript';
+      script.src = libraryName;
+      document.getElementsByTagName('head')[0].appendChild(script);
+    }
   },
-  REQUIRED_PROTOTYPE: '1.6.0',
+  REQUIRED_PROTOTYPE: '1.6.0.3',
   load: function() {
-    function convertVersionString(versionString){
-      var r = versionString.split('.');
-      return parseInt(r[0])*100000 + parseInt(r[1])*1000 + parseInt(r[2]);
+    function convertVersionString(versionString) {
+      var v = versionString.replace(/_.*|\./g, '');
+      v = parseInt(v + '0'.times(4-v.length));
+      return versionString.indexOf('_') &gt; -1 ? v-1 : v;
     }
- 
-    if((typeof Prototype=='undefined') || 
-       (typeof Element == 'undefined') || 
+
+    if((typeof Prototype=='undefined') ||
+       (typeof Element == 'undefined') ||
        (typeof Element.Methods=='undefined') ||
-       (convertVersionString(Prototype.Version) &lt; 
+       (convertVersionString(Prototype.Version) &lt;
         convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE)))
        throw("script.aculo.us requires the Prototype JavaScript framework &gt;= " +
         Scriptaculous.REQUIRED_PROTOTYPE);
-    
-    $A(document.getElementsByTagName("script")).findAll( function(s) {
-      return (s.src &amp;&amp; s.src.match(/scriptaculous\.js(\?.*)?$/))
-    }).each( function(s) {
-      var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
-	  alert(path);
-      var includes = s.src.match(/\?.*load=([a-z,]*)/);
+
+    var js = /scriptaculous\.js(\?.*)?$/;
+    $$('head script[src]').findAll(function(s) {
+      return s.src.match(js);
+    }).each(function(s) {
+      var path = s.src.replace(js, ''),
+      includes = s.src.match(/\?.*load=([a-z,]*)/);
       (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider,sound').split(',').each(
        function(include) { Scriptaculous.require(path+include+'.js') });
     });
   }
-}
+};
 
 Scriptaculous.load();
\ No newline at end of file




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r832380 - /incubator/click/trunk/click/documentation/xdocs/src/docbook/click/chapter-configuration.xml</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091103103246.37F1323888CE@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091103103246-37F1323888CE@eris-apache-org%3e</id>
<updated>2009-11-03T10:32:44Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Tue Nov  3 10:32:40 2009
New Revision: 832380

URL: http://svn.apache.org/viewvc?rev=832380&amp;view=rev
Log:
document DeployTask nested FileSets

Modified:
    incubator/click/trunk/click/documentation/xdocs/src/docbook/click/chapter-configuration.xml

Modified: incubator/click/trunk/click/documentation/xdocs/src/docbook/click/chapter-configuration.xml
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/documentation/xdocs/src/docbook/click/chapter-configuration.xml?rev=832380&amp;r1=832379&amp;r2=832380&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/documentation/xdocs/src/docbook/click/chapter-configuration.xml
(original)
+++ incubator/click/trunk/click/documentation/xdocs/src/docbook/click/chapter-configuration.xml
Tue Nov  3 10:32:40 2009
@@ -1083,7 +1083,7 @@
           that can be found in your Click distribution under the &lt;emphasis&gt;lib&lt;/emphasis&gt;
           folder.
           &lt;/para&gt;
-          &lt;para&gt;Here is an example:
+          &lt;para&gt;Here is a basic example:
           &lt;/para&gt;
           &lt;programlisting language="xml"&gt;&lt;![CDATA[&lt;target name="deploy" description="Deploy
static resources"&gt;
     &lt;taskdef name="deploy"
@@ -1125,10 +1125,31 @@
           will be served from.
           &lt;/para&gt;
 
+          &lt;para&gt;The DeployTask also supports nested
+          &lt;ulink url="http://ant.apache.org/manual/CoreTypes/fileset.html"&gt;FileSets&lt;/ulink&gt;
+          if you need to deploy resources from multiple source locations. For
+          example:&lt;/para&gt;
+          &lt;programlisting language="xml"&gt;&lt;![CDATA[&lt;target name="deploy" description="Deploy
static resources"&gt;
+    &lt;taskdef name="deploy"
+             classname="org.apache.click.tools.deploy.DeployTask"
+             classpath="&lt;click-distribution&gt;/lib/click-dev-tasks-1.1.jar"/&gt;
+
+    &lt;deploy todir="${dir.webapp}"&gt;
+        &lt;fileset dir="&lt;webapp-root&gt;/WEB-INF"&gt;
+            &lt;include name="**/classes"/&gt;
+            &lt;include name="**/*.jar"/&gt;
+        &lt;/fileset&gt;
+        &lt;fileset dir="/some/folder/with/jars"&gt;
+            &lt;include name="lib-with-resources.jar"/&gt;
+            &lt;include name="another-lib-with-resources.jar"/&gt;
+        &lt;/fileset&gt;
+    &lt;/deploy&gt;
+&lt;/target&gt;]]&gt; &lt;/programlisting&gt;
+
           &lt;para&gt;The DeployTask also generates an HTML report in the same folder
           where the build script is executed from. The report will indicate
           which resources was deployed successfully and which resources
-          in your webapp root directory is outdated. (An outdated resource mean
+          in your webapp root directory is outdated. (An outdated resource means
           that the resource in the &lt;emphasis&gt;click-xxx.jar&lt;/emphasis&gt; differs
           from the resource currently present in your webapp root directory.
           This can happen when upgrading to a new version of Click)




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r832372 - /incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091103101514.3823223888BB@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091103101514-3823223888BB@eris-apache-org%3e</id>
<updated>2009-11-03T10:15:13Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Tue Nov  3 10:15:12 2009
New Revision: 832372

URL: http://svn.apache.org/viewvc?rev=832372&amp;view=rev
Log:
only load resources from jars specified by getDeployableDirs

Modified:
    incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java

Modified: incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java?rev=832372&amp;r1=832371&amp;r2=832372&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
(original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
Tue Nov  3 10:15:12 2009
@@ -79,13 +79,15 @@
         templateService = configService.getTemplateService();
 
         // Load all JAR resources
-        loadAllJarResources();
+        List&lt;String&gt; cacheables = getCacheableDirs();
+        for (String cacheable : cacheables) {
+            loadJarResources(cacheable);
+        }
 
         // Load file system resources. File system resources override JAR
         // resources
-        List&lt;String&gt; cacheables = getCacheableDirs();
         for (String cacheable : cacheables) {
-            loadClickDirResources(servletContext, cacheable);
+            loadDirResources(servletContext, cacheable);
         }
     }
 
@@ -136,17 +138,66 @@
         renderResource(response, resourceData);
     }
 
-    // ------------------------------------------------ Package Private Methods
+    // ------------------------------------------------------ Protected Methods
 
     /**
      * Return the list of directories that contains cacheable resources.
      * &lt;p/&gt;
-     * By default only resource under the "&lt;tt&gt;/click&lt;/tt&gt;" directory will be
-     * cached.
+     * By default only resource packaged under the "&lt;tt&gt;/click&lt;/tt&gt;" directory
+     * will be processed. To serve resources from other directories you need to
+     * override this method and return a list of directories to process.
+     * &lt;p/&gt;
+     * For example:
+     *
+     * &lt;pre class="prettyprint"&gt;
+     * public class MyResourceService extends ClickResourceService {
+     *
+     *     protected List&lt;String&gt; getCacheableDirs() {
+     *         // Get default dirs which includes /click
+     *         List list = super.getCacheableDirs();
+     *
+     *         // Add resources packaged under the folder /clickclick
+     *         list.add("/clickclick");
+     *         // Add resources packaged under the folder /mycorp
+     *         list.add("/mycorp");
+     *     }
+     * } &lt;/pre&gt;
+     *
+     * You also need to add a mapping in your &lt;tt&gt;web.xml&lt;/tt&gt; to forward
+     * requests for these resources on to Click:
+     *
+     * &lt;pre class="prettyprint"&gt;
+     * &amp;lt;-- The default Click *.htm mapping --&amp;gt;
+     * &amp;lt;servlet-mapping&amp;gt;
+		 *   &amp;lt;servlet-name&amp;gt;ClickServlet&amp;lt;/servlet-name&amp;gt;
+		 *   &amp;lt;url-pattern&amp;gt;*.htm&amp;lt;/url-pattern&amp;gt;
+	   * &amp;lt;/servlet-mapping&amp;gt;
+     *
+     * &amp;lt;-- Add a mapping to serve all resources under /click directly from
+     * the JARs. --&amp;gt;
+	   * &amp;lt;servlet-mapping&amp;gt;
+		 *   &amp;lt;servlet-name&amp;gt;ClickServlet&amp;lt;/servlet-name&amp;gt;
+		 *   &amp;lt;url-pattern&amp;gt;/click/*&amp;lt;/url-pattern&amp;gt;
+	   * &amp;lt;/servlet-mapping&amp;gt;
+     *
+     * &amp;lt;-- Add another mapping to serve all resources under /clickclick
+     * from the JARs. --&amp;gt;
+	   * &amp;lt;servlet-mapping&amp;gt;
+		 *   &amp;lt;servlet-name&amp;gt;ClickServlet&amp;lt;/servlet-name&amp;gt;
+		 *   &amp;lt;url-pattern&amp;gt;/clickclick/*&amp;lt;/url-pattern&amp;gt;
+	   * &amp;lt;/servlet-mapping&amp;gt;
+     *
+     * &amp;lt;-- Add a mapping to serve all resources under /mycorp
+     * from the JARs. --&amp;gt;
+	   * &amp;lt;servlet-mapping&amp;gt;
+		 *   &amp;lt;servlet-name&amp;gt;ClickServlet&amp;lt;/servlet-name&amp;gt;
+		 *   &amp;lt;url-pattern&amp;gt;/mycorp/*&amp;lt;/url-pattern&amp;gt;
+	   * &amp;lt;/servlet-mapping&amp;gt;
+     * &lt;/pre&gt;
      *
      * @return list of directories that should be cached
      */
-    List&lt;String&gt; getCacheableDirs() {
+    protected List&lt;String&gt; getCacheableDirs() {
        List list = new ArrayList();
        list.add("/click");
        return list;
@@ -154,7 +205,10 @@
 
     // Private Methods --------------------------------------------------------
 
-    private void loadAllJarResources() throws IOException {
+    private void loadJarResources(String resourceDir) throws IOException {
+        if (resourceDir == null) {
+            throw new IllegalArgumentException("resource directory cannot be null");
+        }
 
         long startTime = System.currentTimeMillis();
 
@@ -162,7 +216,10 @@
 
         // Find all jars and directories on the classpath that contains the
         // directory "META-INF/resources/", and deploy those resources
-        String resourceDirectory = "META-INF/resources/";
+        if (!resourceDir.startsWith("/")) {
+            resourceDir = '/' + resourceDir;
+        }
+        String resourceDirectory = "META-INF/resources" + resourceDir;
         Enumeration&lt;URL&gt; en = classLoader.getResources(resourceDirectory);
         while (en.hasMoreElements()) {
             URL url = en.nextElement();
@@ -333,21 +390,25 @@
     }
 
     @SuppressWarnings("unchecked")
-    private void loadClickDirResources(ServletContext servletContext, String dir)
+    private void loadDirResources(ServletContext servletContext, String resourceDir)
         throws IOException {
 
-        Set resources = servletContext.getResourcePaths(dir);
+        if (resourceDir == null) {
+            throw new IllegalArgumentException("resource directory cannot be null");
+        }
+
+        Set resources = servletContext.getResourcePaths(resourceDir);
 
         if (resources != null) {
             // Add all resources withtin web application
             for (Iterator i = resources.iterator(); i.hasNext();) {
                 String resource = (String) i.next();
 
-                // If resource is a folder and a valid cacheable resource,
-                // recursively look for resources in that folder
+                // If resource is a folder, recursively look for resources in
+                // that folder
                 if (resource.endsWith("/")) {
 
-                    loadClickDirResources(servletContext, resource);
+                    loadDirResources(servletContext, resource);
                 } else {
 
                     if (!configService.isTemplate(resource)) {




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r832111 - /incubator/click/trunk/click/extras/src/org/apache/click/extras/filter/PerformanceFilter.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091102212609.E0F7B238888A@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091102212609-E0F7B238888A@eris-apache-org%3e</id>
<updated>2009-11-02T21:26:09Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Mon Nov  2 21:26:08 2009
New Revision: 832111

URL: http://svn.apache.org/viewvc?rev=832111&amp;view=rev
Log:
added switch to disable compression

Modified:
    incubator/click/trunk/click/extras/src/org/apache/click/extras/filter/PerformanceFilter.java

Modified: incubator/click/trunk/click/extras/src/org/apache/click/extras/filter/PerformanceFilter.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/org/apache/click/extras/filter/PerformanceFilter.java?rev=832111&amp;r1=832110&amp;r2=832111&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/org/apache/click/extras/filter/PerformanceFilter.java
(original)
+++ incubator/click/trunk/click/extras/src/org/apache/click/extras/filter/PerformanceFilter.java
Mon Nov  2 21:26:08 2009
@@ -124,6 +124,9 @@
  * through the &lt;tt&gt;init-param&lt;/tt&gt; &lt;span class="blue"&gt;"compression-threshold"&lt;/span&gt;.
  * &lt;p/&gt;
  * Click *.htm pages are automatically compressed by the filter.
+ * &lt;p/&gt;
+ * It is also possible to disable GZIP compression by setting the
+ * &lt;tt&gt;init-param&lt;/tt&gt; &lt;span class="blue"&gt;"compression-enabled"&lt;/span&gt;
to false.
  *
  * &lt;h3&gt;Page Template Import References&lt;/h3&gt;
  *
@@ -275,6 +278,9 @@
     /** The threshold number to compress, default value is 384 bytes. */
     protected int compressionThreshold = MIN_COMPRESSION_THRESHOLD;
 
+    /** Indicates if compression is enabled or not, default value is true. */
+    protected boolean compressionEnabled = true;
+
     /** The fitler has been configured flag. */
     protected boolean configured;
 
@@ -457,8 +463,14 @@
         ServletContext servletContext = getFilterConfig().getServletContext();
         configService = ClickUtils.getConfigService(servletContext);
 
+        // Get gzip enabled parameter
+        String param = filterConfig.getInitParameter("compression-enabled");
+        if (StringUtils.isNotBlank(param)) {
+            compressionEnabled = Boolean.parseBoolean(param);
+        }
+
         // Get compression threshold
-        String param = filterConfig.getInitParameter("compression-threshold");
+        param = filterConfig.getInitParameter("compression-threshold");
         if (param != null) {
             compressionThreshold = Integer.parseInt(param);
             if (compressionThreshold != 0
@@ -694,6 +706,10 @@
     protected boolean useGzipCompression(HttpServletRequest request,
         HttpServletResponse response, String path) {
 
+        if (!compressionEnabled) {
+            return false;
+        }
+
         // If Content-Encoding header is already set on response, skip compression
         if (response.containsHeader("Content-Encoding")) {
             return false;




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r831849 - in /incubator/click/trunk/click: build/ examples/build.xml examples/webapp/WEB-INF/web.xml lib/click-dev-tasks-1.1.jar</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091102102735.8D34F238890A@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091102102735-8D34F238890A@eris-apache-org%3e</id>
<updated>2009-11-02T10:27:35Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Mon Nov  2 10:27:34 2009
New Revision: 831849

URL: http://svn.apache.org/viewvc?rev=831849&amp;view=rev
Log:
migrated click-examples to use build time deployment

Modified:
    incubator/click/trunk/click/build/   (props changed)
    incubator/click/trunk/click/examples/build.xml
    incubator/click/trunk/click/examples/webapp/WEB-INF/web.xml
    incubator/click/trunk/click/lib/click-dev-tasks-1.1.jar

Propchange: incubator/click/trunk/click/build/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Mon Nov  2 10:27:34 2009
@@ -1,2 +1,3 @@
-tomcat.bat
-publish.bat
+publish.bat
+tomcat.bat
+deployed.html

Modified: incubator/click/trunk/click/examples/build.xml
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/build.xml?rev=831849&amp;r1=831848&amp;r2=831849&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/build.xml (original)
+++ incubator/click/trunk/click/examples/build.xml Mon Nov  2 10:27:34 2009
@@ -87,6 +87,14 @@
          &lt;fileset dir="${dir.webapp}/javadoc" includes="**/*"/&gt;
       &lt;/delete&gt;
       &lt;delete dir="${dir.webapp}/click"/&gt;
+      &lt;delete dir="${dir.webapp}/images"/&gt;
+
+      &lt;!-- Delete all deployed.html reports --&gt;
+      &lt;delete&gt;
+          &lt;fileset dir="${basedir}" includes="deployed*.html"/&gt;
+          &lt;fileset dir="../build" includes="deployed*.html"/&gt;
+      &lt;/delete&gt;
+
       &lt;javadoc sourcepath="src"
                destdir="${dir.webapp}/javadoc"
                author="true"
@@ -105,6 +113,22 @@
       	    tofile="${dir.webapp}/javadoc/stylesheet.css"/&gt;
       &lt;delete file="${dir.deploy}/${name}.war"/&gt;
       &lt;mkdir dir="${dir.deploy}"/&gt;
+
+      &lt;taskdef name="deploy"
+            classname="org.apache.click.tools.deploy.DeployTask"
+            classpath="../lib/click-dev-tasks-1.1.jar"/&gt;
+
+      &lt;deploy todir="${dir.webapp}"&gt;
+        &lt;fileset dir="${dir.webapp}/WEB-INF"&gt;
+            &lt;include name="**/classes"/&gt;
+            &lt;include name="**/*.jar"/&gt;
+        &lt;/fileset&gt;
+        &lt;fileset dir="../dist"&gt;
+            &lt;include name="${jar.click}"/&gt;
+            &lt;include name="${jar.click-extras}"/&gt;
+        &lt;/fileset&gt;
+      &lt;/deploy&gt;
+
       &lt;war destfile="${dir.deploy}/${name}.war"
            webxml="${dir.webapp}/WEB-INF/web.xml"&gt;
          &lt;manifest&gt;

Modified: incubator/click/trunk/click/examples/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/webapp/WEB-INF/web.xml?rev=831849&amp;r1=831848&amp;r2=831849&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/webapp/WEB-INF/web.xml (original)
+++ incubator/click/trunk/click/examples/webapp/WEB-INF/web.xml Mon Nov  2 10:27:34 2009
@@ -158,10 +158,11 @@
   Please note, you only need this mapping in restricted environments where Click
   cannot deploy resources to the file system.
   --&gt;
+  &lt;!--
 	&lt;servlet-mapping&gt;
 		&lt;servlet-name&gt;ClickServlet&lt;/servlet-name&gt;
 		&lt;url-pattern&gt;/click/*&lt;/url-pattern&gt;
-	&lt;/servlet-mapping&gt;
+	&lt;/servlet-mapping&gt;--&gt;
 	
 	&lt;!-- Wecome Files --&gt;
 

Modified: incubator/click/trunk/click/lib/click-dev-tasks-1.1.jar
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/lib/click-dev-tasks-1.1.jar?rev=831849&amp;r1=831848&amp;r2=831849&amp;view=diff
==============================================================================
Binary files - no diff available.




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r831848 - /incubator/click/trunk/tools/standalone/README.txt</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091102102429.3BD8E238890A@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091102102429-3BD8E238890A@eris-apache-org%3e</id>
<updated>2009-11-02T10:24:29Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Mon Nov  2 10:24:28 2009
New Revision: 831848

URL: http://svn.apache.org/viewvc?rev=831848&amp;view=rev
Log:
added support for nested fileSets

Modified:
    incubator/click/trunk/tools/standalone/README.txt

Modified: incubator/click/trunk/tools/standalone/README.txt
URL: http://svn.apache.org/viewvc/incubator/click/trunk/tools/standalone/README.txt?rev=831848&amp;r1=831847&amp;r2=831848&amp;view=diff
==============================================================================
--- incubator/click/trunk/tools/standalone/README.txt (original)
+++ incubator/click/trunk/tools/standalone/README.txt Mon Nov  2 10:24:28 2009
@@ -14,5 +14,25 @@
     &lt;deploy dir="C:/dev/myapp/web/WEB-INF" todir="c:/dev/myapp/web/"/&gt;
   &lt;/target&gt;
 
+
+  The deploy task also supports nested filesets:
+
+  &lt;target name="deploy" description="Deploy Click static resources" depends="build"&gt;
+    &lt;taskdef name="deploy"
+      classname="org.apache.click.tools.deploy.DeployTask"
+      classpath="C:/dev/click-2.1.0/lib/click-dev-tasks-1.1.jar"/&gt;
+
+    &lt;deploy todir="c:/dev/myapp/web/"&gt;
+        &lt;fileset dir="C:/dev/myapp/web/WEB-INF"&gt;
+            &lt;include name="**/classes"/&gt;
+            &lt;include name="**/*.jar"/&gt;
+        &lt;/fileset&gt;
+        &lt;fileset dir="C:/dev/myjars/lib"&gt;
+            &lt;include name="click-xxx.jar"/&gt;
+            &lt;include name="click-extras-xxx.jar"/&gt;
+        &lt;/fileset&gt;
+    &lt;/deploy&gt;
+  &lt;/target&gt;
+
 * devtasks - a set of ANT tasks to help in the development of Click Framework
   itself, Click based 3rd party controls and Click based webapplications.




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r831841 - in /incubator/click/trunk/tools/standalone/dev-tasks/src: org/apache/click/tools/deploy/DeployTask.java report-template.html</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091102101010.21AFF23888A6@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091102101010-21AFF23888A6@eris-apache-org%3e</id>
<updated>2009-11-02T10:10:09Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Mon Nov  2 10:10:09 2009
New Revision: 831841

URL: http://svn.apache.org/viewvc?rev=831841&amp;view=rev
Log:
added support for nested fileSets

Modified:
    incubator/click/trunk/tools/standalone/dev-tasks/src/org/apache/click/tools/deploy/DeployTask.java
    incubator/click/trunk/tools/standalone/dev-tasks/src/report-template.html

Modified: incubator/click/trunk/tools/standalone/dev-tasks/src/org/apache/click/tools/deploy/DeployTask.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/tools/standalone/dev-tasks/src/org/apache/click/tools/deploy/DeployTask.java?rev=831841&amp;r1=831840&amp;r2=831841&amp;view=diff
==============================================================================
--- incubator/click/trunk/tools/standalone/dev-tasks/src/org/apache/click/tools/deploy/DeployTask.java
(original)
+++ incubator/click/trunk/tools/standalone/dev-tasks/src/org/apache/click/tools/deploy/DeployTask.java
Mon Nov  2 10:10:09 2009
@@ -24,6 +24,8 @@
 import java.io.InputStream;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.jar.JarFile;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.DirectoryScanner;
@@ -53,8 +55,23 @@
     /** The exclude filter to use when scanning {@link #dir}. */
     private String excludes;
 
-    /** FileSet that specifies jars and folders to check for filenames. */
-    private FileSet fileSet;
+    /**
+     * Default FileSet associated with the DeployTask element that specifies
+     * jars and folders to check for filenames.
+     */
+    private FileSet defaultFileSet;
+
+    /** List of nested FileSets. */
+    private List&lt;FileSet&gt; fileSets = new ArrayList&lt;FileSet&gt;();
+
+    /**
+     * Buffer containing a listing of all the jar and folder sources that
+     * contained deployable resources.
+     */
+    private StringBuilder deployableSourceListing = new StringBuilder();
+
+    /** The report content. */
+    private Writer reportContent = new StringWriter();
 
     // ----------------------------------------------------------- Constructors
 
@@ -62,12 +79,32 @@
      * Creates a default DeployTask instance.
      */
     public DeployTask() {
-        fileSet = new FileSet();
+        defaultFileSet = new FileSet();
     }
 
     // ------------------------------------------------------ Public properties
 
     /**
+     * Add the given fileSet to the list of {@link #fileSets}.
+     *
+     * @param fileSet the fileSet to add to the list of {@link #fileSets}.
+     */
+    public void addFileSet(FileSet fileSet) {
+        if (!fileSets.contains(fileSet)) {
+            fileSets.add(fileSet);
+        }
+    }
+
+    /**
+     * Return the list of the {@link #fileSets}.
+     *
+     * @return the list of fileSets
+     */
+    public List&lt;FileSet&gt; getFileSets() {
+        return fileSets;
+    }
+
+    /**
      * Set the directory consisting of JARs and folders where filenames are
      * deployed from.
      *
@@ -95,7 +132,7 @@
      */
     public void setExcludes(String excludes) {
         this.excludes = excludes;
-        fileSet.setExcludes(excludes);
+        defaultFileSet.setExcludes(excludes);
     }
 
     /**
@@ -106,7 +143,7 @@
      */
     public void setIncludes(String includes) {
         this.includes = includes;
-        fileSet.setIncludes(includes);
+        defaultFileSet.setIncludes(includes);
     }
 
     /**
@@ -125,16 +162,8 @@
      *
      * @throws BuildException if the build fails
      */
+    @Override
     public void execute() throws BuildException {
-        if(dir == null) {
-            throw new BuildException("dir attribute must be set!");
-        }
-        if(!dir.exists()) {
-            throw new BuildException("dir does not exist!");
-        }
-        if(!dir.isDirectory()) {
-            throw new BuildException("dir is not a directory!");
-        }
 
         if(toDir == null) {
             throw new BuildException("todir attribute must be set!");
@@ -149,18 +178,30 @@
             throw new BuildException("todir is not a directory!");
         }
 
-        fileSet.setDir(dir);
-        fileSet.setDefaultexcludes(true);
-        if (getIncludes() == null) {
-            // Set default standard includes
-            fileSet.setIncludes("**/*.jar, classes");
-        }
-        DirectoryScanner directoryScanner = fileSet.getDirectoryScanner(getProject());
-        String files[] = directoryScanner.getIncludedFiles();
-        String dirs[] = directoryScanner.getIncludedDirectories();
-        String resources[] = (String[]) TaskUtils.addAll(files, dirs);
+        if (!isDir(dir) &amp;&amp; getFileSets().isEmpty()) {
+            throw new BuildException("no input dirs specified.");
+        }
 
-        deployResources(resources);
+        if (dir != null &amp;&amp; dir.exists()) {
+            defaultFileSet.setDir(dir);
+            getFileSets().add(defaultFileSet);
+            defaultFileSet.setDefaultexcludes(true);
+            if (TaskUtils.isBlank(getIncludes())) {
+                // Set default standard includes
+                defaultFileSet.setIncludes("**/*.jar, classes");
+            }
+        }
+
+        for (FileSet fileSet : getFileSets()) {
+            DirectoryScanner directoryScanner = fileSet.getDirectoryScanner(
+                getProject());
+            String files[] = directoryScanner.getIncludedFiles();
+            String dirs[] = directoryScanner.getIncludedDirectories();
+            String resources[] = (String[]) TaskUtils.addAll(files, dirs);
+            deployResources(fileSet.getDir(), resources);
+        }
+
+        writeReport();
     }
 
     // -------------------------------------------------------- Private Methods
@@ -170,25 +211,13 @@
      *
      * @param filenames the filenames for the resources to deploy.
      */
-    private void deployResources(String filenames[]) {
-        Writer reportWriter = null;
+    private void deployResources(File dir, String filenames[]) {
         try {
-
-            InputStream is = TaskUtils.getResourceAsStream("/report-template.html", DeployTask.class);
-            String template = null;
-
-            if (is == null) {
-                System.out.println("The report template 'report-template.html' could not
be found on the classpath. No report will be generated.");
-            } else {
-                template = TaskUtils.toString(is);
-            }
-
             DeployReport report = new DeployReport();
 
-            StringWriter writer = new StringWriter();
             for (int i = 0; i &lt; filenames.length; i++) {
                 String filename = filenames[i];
-                String path = getCurrentPath();
+                String path = getCanonicalPath(dir);
                 File file = new File(dir, filename);
 
                 Deploy deploy = new Deploy();
@@ -203,31 +232,45 @@
 
                 if (deployed) {
                     report.writeReport(path + filename, toDir.getCanonicalPath(),
-                        deploy.getDeployed(), deploy.getOutdated(), writer);
+                        deploy.getDeployed(), deploy.getOutdated(), reportContent);
                 }
             }
 
+            appendResourceListing(dir, filenames);
+
+        } catch(IOException ioe) {
+            throw new BuildException(ioe.getClass().getName() + ":" + ioe.getMessage(), ioe);
+        }
+    }
+
+    /**
+     * Write the deploy report to a report file.
+     *
+     * @throws BuildException if the build fails
+     */
+    private void writeReport() {
+        Writer reportWriter = null;
+        try {
+            InputStream is = TaskUtils.getResourceAsStream("/report-template.html", DeployTask.class);
+            String template = null;
+
+            if (is == null) {
+                System.out.println("The report template 'report-template.html' could not
be found on the classpath. No report will be generated.");
+            } else {
+                template = TaskUtils.toString(is);
+            }
+
             if (template != null) {
                 String reportContent = template;
-                reportContent = reportContent.replace("{0}", dir.getCanonicalPath());
-                reportContent = reportContent.replace("{1}", toDir.getCanonicalPath());
-                reportContent = reportContent.replace("{2}", toHtml(filenames));
-
-                String reportEntries = writer.toString();
-
-                // If no report entries were made, print a success message
-                if (TaskUtils.isBlank(reportEntries)) {
-                    reportContent = reportContent.replace("{3}", "&lt;h3 class='success'&gt;All
resources are successfully deployed&lt;/h3&gt;");
-                } else {
-                    reportContent = reportContent.replace("{3}", writer.toString());
-                }
+                reportContent = reportContent.replace("{0}", toDir.getCanonicalPath());
+                reportContent = reportContent.replace("{1}", getDeployableSourceListingAsHtml());
+                reportContent = reportContent.replace("{2}", getReportContentAsHtml());
 
-                File reportFile = new File("report.html");
+                File reportFile = getUniqueReportFile();
                 reportWriter = new FileWriter(reportFile);
                 reportWriter.append(reportContent);
                 System.out.println("See report: " + reportFile.getCanonicalPath());
             }
-
         } catch(IOException ioe) {
             throw new BuildException(ioe.getClass().getName() + ":" + ioe.getMessage(), ioe);
 
@@ -237,12 +280,31 @@
     }
 
     /**
-     * Returns the current path.
+     * Return a unique file where the report can be written to.
+     *
+     * @return the file the report can be written to
+     */
+    private File getUniqueReportFile() {
+        String reportName = "deployed";
+        File reportFile = new File(reportName + ".html");
+
+        // Find unique report name
+        int count = 0;
+        while (reportFile.exists()) {
+            count++;
+            reportFile = new File(reportName + "-" + count + ".html");
+        }
+        return reportFile;
+    }
+
+    /**
+     * Returns the canonical path of the given dir.
      *
-     * @return the current path
-     * @throws IOException if the path cannot be looked up
+     * @param dir the dir from which to return the canonical path of
+     * @return the canonical path of the given dir
+     * @throws IOException if the canonical path cannot be looked up
      */
-    private String getCurrentPath() throws IOException {
+    private String getCanonicalPath(File dir) throws IOException {
         String path = dir.getCanonicalPath();
         return path.endsWith(File.separator) ? path : path + File.separator;
     }
@@ -255,11 +317,11 @@
      * @return return HTML representation of the given filenames
      * @throws IOException if an IO exception occurs
      */
-    private String toHtml(String[] filenames) throws IOException {
+    private void appendResourceListing(File dir, String[] filenames) throws IOException {
         StringBuilder buffer = new StringBuilder();
 
         if (filenames != null &amp;&amp; filenames.length &gt; 0) {
-            String path = getCurrentPath();
+            String path = getCanonicalPath(dir);
 
             for (String filename : filenames) {
                 if (filename.endsWith(".jar")) {
@@ -284,7 +346,7 @@
             }
         }
 
-        return buffer.toString();
+        deployableSourceListing.append(buffer.toString());
     }
 
     /**
@@ -300,4 +362,55 @@
         buffer.append(filename);
         buffer.append("&lt;/a&gt;&lt;/li&gt;");
     }
+
+    /**
+     * Return true if the given file is a directory, false otherwise.
+     *
+     * @param file file to check if its a directory
+     * @return true if the given file is a directory, false otherwise
+     */
+    private boolean isDir(File file) {
+        if (file == null || !file.exists() || !file.isDirectory()) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Return the HTML representation of the report content generated by the
+     * deployed resources.
+     *
+     * @return the HTML representation of the report content generated by the
+     * deployed resources
+     */
+    private String getReportContentAsHtml() {
+        String result = reportContent.toString();
+
+        // If no report entries were made, print a feedback message
+        if (TaskUtils.isBlank(result)) {
+
+            if (deployableSourceListing.length() == 0) {
+                // If no deployable sources were found, print a warning message
+                result = "&lt;h3 class='warning'&gt;No deployable resources were found&lt;/h3&gt;";
+            } else {
+                // Otherwise we assume that all resources are already deployed
+                // in the target folder
+                result = "&lt;h3 class='success'&gt;All resources are successfully deployed&lt;/h3&gt;";
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Return the HTML representation of the list of deployable sources.
+     *
+     * @return the HTML representation of the list of deployable sources
+     */
+    private String getDeployableSourceListingAsHtml() {
+        String listingAsString = deployableSourceListing.toString();
+        if (listingAsString.length() == 0) {
+            listingAsString = "&lt;li&gt;&lt;span style=\"color:blue\"&gt;No jars or folders
were found with deployable resources.&lt;/span&gt;&lt;/li&gt;";
+        }
+        return listingAsString;
+    }
 }

Modified: incubator/click/trunk/tools/standalone/dev-tasks/src/report-template.html
URL: http://svn.apache.org/viewvc/incubator/click/trunk/tools/standalone/dev-tasks/src/report-template.html?rev=831841&amp;r1=831840&amp;r2=831841&amp;view=diff
==============================================================================
--- incubator/click/trunk/tools/standalone/dev-tasks/src/report-template.html (original)
+++ incubator/click/trunk/tools/standalone/dev-tasks/src/report-template.html Mon Nov  2 10:10:09
2009
@@ -11,6 +11,13 @@
                 padding: 3px;
                 float: left;
             }
+            .warning {
+                padding: 3px;
+                float: left;
+                background-color: #ff9900;
+                color: white;
+                font-weight: bold;
+            }
             .success, .deployed {
                 background-color: #0F8800;
                 color: white;
@@ -62,17 +69,16 @@
 
         &lt;h3&gt;Apache Click - Resource Deployment Report&lt;/h3&gt;
 
-        This report shows the JavaScript, CSS, images and other resources found
-        under the folder "&lt;tt&gt;{0}&lt;/tt&gt;" that was deployed to the target folder
-        "&lt;tt&gt;{1}&lt;/tt&gt;".
+        This report shows the JavaScript, CSS, images and other resources
+        that was deployed to the target folder "&lt;tt&gt;{0}&lt;/tt&gt;".
 
         &lt;p/&gt;
 
         The following JARs and folders contains deployable resources
-        (deployable resources are found in JARs and folders under &lt;tt&gt;WEB-INF/web&lt;/tt&gt;):
+        (deployable resources are found in JARs and folders under &lt;tt&gt;WEB-INF/resources&lt;/tt&gt;):
 
         &lt;ul&gt;
-            {2}
+            {1}
         &lt;/ul&gt;
 
         Resources can have one of three states:
@@ -92,10 +98,10 @@
 
         &lt;p/&gt;
 
-        Below is the detailed report for the resources that was &lt;tt&gt;Deployed Successfully
-        &lt;/tt&gt; or &lt;tt&gt;Outdated&lt;/tt&gt;.
+        Below is the detailed report for the resources that was deployed &lt;tt&gt;successfully
+        &lt;/tt&gt; or are &lt;tt&gt;outdated&lt;/tt&gt;.
 
-        {3}
+        {2}
         
     &lt;/body&gt;
 &lt;/html&gt;




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r831836 - in /incubator/click/trunk/click/examples/src/org/apache/click/examples: control/exporter/ page/general/</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091102095337.7855B23888DA@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091102095337-7855B23888DA@eris-apache-org%3e</id>
<updated>2009-11-02T09:53:37Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Mon Nov  2 09:53:35 2009
New Revision: 831836

URL: http://svn.apache.org/viewvc?rev=831836&amp;view=rev
Log:
renamed TableExportBanner to TableExportContainer instead

Added:
    incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportContainer.java
      - copied, changed from r831682, incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java
Removed:
    incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java
Modified:
    incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/AbstractTableExporter.java
    incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/ExcelTableExporter.java
    incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/ExportTable.java
    incubator/click/trunk/click/examples/src/org/apache/click/examples/page/general/ExcelTableExportPage.java

Modified: incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/AbstractTableExporter.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/AbstractTableExporter.java?rev=831836&amp;r1=831835&amp;r2=831836&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/AbstractTableExporter.java
(original)
+++ incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/AbstractTableExporter.java
Mon Nov  2 09:53:35 2009
@@ -31,9 +31,6 @@
 import org.apache.click.util.ClickUtils;
 import org.apache.commons.lang.StringUtils;
 
-/**
- *
- */
 public abstract class AbstractTableExporter {
 
     protected String label;

Modified: incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/ExcelTableExporter.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/ExcelTableExporter.java?rev=831836&amp;r1=831835&amp;r2=831836&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/ExcelTableExporter.java
(original)
+++ incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/ExcelTableExporter.java
Mon Nov  2 09:53:35 2009
@@ -43,9 +43,6 @@
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.DataFormat;
 
-/**
- *
- */
 public class ExcelTableExporter extends AbstractTableExporter {
 
     private DataFormat cellFormat;

Modified: incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/ExportTable.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/ExportTable.java?rev=831836&amp;r1=831835&amp;r2=831836&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/ExportTable.java
(original)
+++ incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/ExportTable.java
Mon Nov  2 09:53:35 2009
@@ -51,7 +51,7 @@
 
     protected List excludedExportColumns;
 
-    protected TableExportBanner exporter;
+    protected TableExportContainer exportContainer;
 
     private List exportColumnList;
 
@@ -62,15 +62,15 @@
         super(name);
     }
 
-    public TableExportBanner getExporter() {
-        if (exporter == null) {
-            exporter = new TableExportBanner(this);
+    public TableExportContainer getExportContainer() {
+        if (exportContainer == null) {
+            exportContainer = new TableExportContainer(this);
         }
-        return exporter;
+        return exportContainer;
     }
 
-    public void setExporter(TableExportBanner exporter) {
-        this.exporter = exporter;
+    public void setExportContainer(TableExportContainer exportContainer) {
+        this.exportContainer = exportContainer;
     }
 
     /**
@@ -178,20 +178,20 @@
     @Override
     public void onInit() {
         super.onInit();
-        getExporter().onInit();
+        getExportContainer().onInit();
     }
 
     @Override
     public void onRender() {
         super.onRender();
-        getExporter().onRender();
+        getExportContainer().onRender();
     }
 
     @Override
     public boolean onProcess() {
         boolean continueProcessing = super.onProcess();
-        TableExportBanner tableExporter = getExporter();
-        if (!tableExporter.onProcess()) {
+        TableExportContainer exportContainer = getExportContainer();
+        if (!exportContainer.onProcess()) {
             continueProcessing = false;
         }
         return continueProcessing;
@@ -201,7 +201,7 @@
         if (getExportAttachment() == EXPORTER_ATTACHED) {
             if (getExportBannerPosition() == POSITION_BOTH ||
                 getExportBannerPosition() == POSITION_TOP) {
-                getExporter().render(buffer);
+                getExportContainer().render(buffer);
             }
         }
 
@@ -210,7 +210,7 @@
         if (getExportAttachment() == EXPORTER_ATTACHED) {
             if (getExportBannerPosition() == POSITION_BOTH ||
                 getExportBannerPosition() == POSITION_BOTTOM) {
-                getExporter().render(buffer);
+                getExportContainer().render(buffer);
             }
         }
     }
@@ -225,7 +225,7 @@
                 buffer.append(getColumnList().size() - getExcludedExportColumns().size());
                 buffer.append("\"&gt;");
 
-                getExporter().render(buffer);
+                getExportContainer().render(buffer);
 
                 buffer.append("&lt;/td&gt;&lt;/tr&gt;\n");
                 buffer.append("&lt;/tbody&gt;\n");
@@ -243,7 +243,7 @@
                 buffer.append(getColumnList().size() - getExcludedExportColumns().size());
                 buffer.append("\"&gt;");
 
-                getExporter().render(buffer);
+                getExportContainer().render(buffer);
 
                 buffer.append("&lt;/td&gt;&lt;/tr&gt;\n");
                 buffer.append("&lt;/tbody&gt;\n");

Copied: incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportContainer.java
(from r831682, incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java)
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportContainer.java?p2=incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportContainer.java&amp;p1=incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java&amp;r1=831682&amp;r2=831836&amp;rev=831836&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java
(original)
+++ incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportContainer.java
Mon Nov  2 09:53:35 2009
@@ -26,10 +26,7 @@
 import org.apache.click.control.Renderable;
 import org.apache.click.util.HtmlStringBuffer;
 
-/**
- *
- */
-public class TableExportBanner implements Renderable {
+public class TableExportContainer implements Renderable {
 
     private List&lt;AbstractTableExporter&gt; exporters = new ArrayList&lt;AbstractTableExporter&gt;();
 
@@ -37,7 +34,7 @@
 
     private ExportTable table;
 
-    public TableExportBanner(ExportTable table) {
+    public TableExportContainer(ExportTable table) {
         this.table = table;
     }
 
@@ -117,7 +114,7 @@
     /**
      * Render the table export banner.
      * &lt;p/&gt;
-     * See the &lt;tt&gt;TableExportBanner.properies&lt;/tt&gt; for the HTML template:
+     * See the &lt;tt&gt;TableExportContainer.properies&lt;/tt&gt; for the HTML template:
      * &lt;tt&gt;table-export-banner&lt;/tt&gt;.
      *
      * @param buffer the StringBuffer to render the paging controls to

Modified: incubator/click/trunk/click/examples/src/org/apache/click/examples/page/general/ExcelTableExportPage.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/src/org/apache/click/examples/page/general/ExcelTableExportPage.java?rev=831836&amp;r1=831835&amp;r2=831836&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/src/org/apache/click/examples/page/general/ExcelTableExportPage.java
(original)
+++ incubator/click/trunk/click/examples/src/org/apache/click/examples/page/general/ExcelTableExportPage.java
Mon Nov  2 09:53:35 2009
@@ -95,7 +95,7 @@
     private void setupExporter(ExportTable table) {
         // Setup table exporting
         ExcelTableExporter excel = new ExcelTableExporter("Excel", "/assets/images/page_excel.png");
-        table.getExporter().add(excel);
+        table.getExportContainer().add(excel);
 
         // Excluding the action column ensures the actions are not exported to
         // Excel




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r831761 - /incubator/click/trunk/tools/standalone/dev-tasks/src/org/apache/click/tools/deploy/DeployReport.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091101212121.62F292388897@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091101212121-62F292388897@eris-apache-org%3e</id>
<updated>2009-11-01T21:21:21Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Sun Nov  1 21:21:19 2009
New Revision: 831761

URL: http://svn.apache.org/viewvc?rev=831761&amp;view=rev
Log:
swapped source and destination entries

Modified:
    incubator/click/trunk/tools/standalone/dev-tasks/src/org/apache/click/tools/deploy/DeployReport.java

Modified: incubator/click/trunk/tools/standalone/dev-tasks/src/org/apache/click/tools/deploy/DeployReport.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/tools/standalone/dev-tasks/src/org/apache/click/tools/deploy/DeployReport.java?rev=831761&amp;r1=831760&amp;r2=831761&amp;view=diff
==============================================================================
--- incubator/click/trunk/tools/standalone/dev-tasks/src/org/apache/click/tools/deploy/DeployReport.java
(original)
+++ incubator/click/trunk/tools/standalone/dev-tasks/src/org/apache/click/tools/deploy/DeployReport.java
Sun Nov  1 21:21:19 2009
@@ -94,21 +94,20 @@
         if (entries.size() &gt; 0) {
             writer.append("&lt;table&gt;\n");
             writer.append("&lt;tr&gt;");
-            writer.append("&lt;th&gt;Destination - ").append(destination).append("&lt;/th&gt;");
             writer.append("&lt;th&gt;Source - ").append(source).append("&lt;/th&gt;");
+            writer.append("&lt;th&gt;Destination - ").append(destination).append("&lt;/th&gt;");
             writer.append("&lt;/tr&gt;\n");
             for (DeployReportEntry entry : entries) {
                 writer.append("&lt;tr&gt;");
                 writer.append("&lt;td&gt;");
-                writer.append(entry.destination);
+                writer.append(entry.source);
                 writer.append("&lt;/td&gt;");
                 writer.append("&lt;td&gt;");
-                writer.append(entry.source);
+                writer.append(entry.destination);
                 writer.append("&lt;/td&gt;");
                 writer.append("&lt;/tr&gt;\n");
             }
             writer.append("&lt;/table&gt;\n");
         }
-
     }
 }




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r831682 - /incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200911.mbox/%3c20091101143710.5147B23888CF@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091101143710-5147B23888CF@eris-apache-org%3e</id>
<updated>2009-11-01T14:37:10Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Sun Nov  1 14:37:09 2009
New Revision: 831682

URL: http://svn.apache.org/viewvc?rev=831682&amp;view=rev
Log:
cleanup

Modified:
    incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java

Modified: incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java?rev=831682&amp;r1=831681&amp;r2=831682&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java
(original)
+++ incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java
Sun Nov  1 14:37:09 2009
@@ -25,14 +25,13 @@
 import org.apache.click.Control;
 import org.apache.click.control.Renderable;
 import org.apache.click.util.HtmlStringBuffer;
-import org.apache.commons.collections.CollectionUtils;
 
 /**
  *
  */
 public class TableExportBanner implements Renderable {
 
-    private List&lt;AbstractTableExporter&gt; exportFormats = new ArrayList&lt;AbstractTableExporter&gt;();
+    private List&lt;AbstractTableExporter&gt; exporters = new ArrayList&lt;AbstractTableExporter&gt;();
 
     protected String separator;
 
@@ -42,52 +41,52 @@
         this.table = table;
     }
 
-    public void add(AbstractTableExporter exportFormat) {
-        getExportFormats().add(exportFormat);
+    public void add(AbstractTableExporter exporter) {
+        getExporters().add(exporter);
     }
 
-    public void remove(AbstractTableExporter exportFormat) {
-        getExportFormats().remove(exportFormat);
+    public void remove(AbstractTableExporter exporter) {
+        getExporters().remove(exporter);
     }
 
     public void render(HtmlStringBuffer buffer) {
         renderExportBanner(buffer);
     }
 
-    public List&lt;AbstractTableExporter&gt; getExportFormats() {
-        return exportFormats;
+    public List&lt;AbstractTableExporter&gt; getExporters() {
+        return exporters;
     }
 
-    public void setExportFormats(List&lt;AbstractTableExporter&gt; exporters) {
-        this.exportFormats = exporters;
+    public void setExporters(List&lt;AbstractTableExporter&gt; exporters) {
+        this.exporters = exporters;
     }
 
     public void onInit() {
         String tableName = table.getName();
-        for (AbstractTableExporter format : getExportFormats()) {
-            format.setName(tableName);
-            Control control = format.getExportLink();
+        for (AbstractTableExporter exporter : getExporters()) {
+            exporter.setName(tableName);
+            Control control = exporter.getExportLink();
             control.onInit();
         }
     }
 
     public void onRender() {
-        AbstractTableExporter selectedFormat = null;
-        for (AbstractTableExporter format : getExportFormats()) {
-            format.getExportLink().onRender();
-            if (format.isSelected()) {
-                selectedFormat = format;
+        AbstractTableExporter selectedExporter = null;
+        for (AbstractTableExporter exporter : getExporters()) {
+            exporter.getExportLink().onRender();
+            if (exporter.isSelected()) {
+                selectedExporter = exporter;
             }
         }
-        if(selectedFormat != null) {
-            export(selectedFormat);
+        if(selectedExporter != null) {
+            export(selectedExporter);
         }
     }
 
     public boolean onProcess() {
         boolean continueProcessing = true;
-        for (AbstractTableExporter format : getExportFormats()) {
-            if (!format.getExportLink().onProcess()) {
+        for (AbstractTableExporter exporter : getExporters()) {
+            if (!exporter.getExportLink().onProcess()) {
                 continueProcessing = false;
             }
         }
@@ -102,9 +101,9 @@
         this.separator = separator;
     }
 
-    public void export(AbstractTableExporter format) {
+    public void export(AbstractTableExporter exporter) {
         Context context = table.getContext();
-        format.export(table, context);
+        exporter.export(table, context);
     }
 
     public String toString() {
@@ -124,16 +123,16 @@
      * @param buffer the StringBuffer to render the paging controls to
      */
     protected void renderExportBanner(HtmlStringBuffer buffer) {
-        List exportFormats = getExportFormats();
-        if (exportFormats == null || exportFormats.isEmpty()) {
+        List exporters = getExporters();
+        if (exporters == null || exporters.isEmpty()) {
             return;
         }
 
         HtmlStringBuffer banner = new HtmlStringBuffer();
-        Iterator&lt;AbstractTableExporter&gt; it = getExportFormats().iterator();
+        Iterator&lt;AbstractTableExporter&gt; it = getExporters().iterator();
         while(it.hasNext()) {
-            AbstractTableExporter format = it.next();
-            format.getExportLink().render(banner);
+            AbstractTableExporter exporter = it.next();
+            exporter.getExportLink().render(banner);
             if (it.hasNext()) {
                 banner.append(getSeparator());
             }




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r831557 - /incubator/click/trunk/click/examples/webapp/</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200910.mbox/%3c20091031155711.BB97423888BD@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091031155711-BB97423888BD@eris-apache-org%3e</id>
<updated>2009-10-31T15:57:11Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Sat Oct 31 15:57:11 2009
New Revision: 831557

URL: http://svn.apache.org/viewvc?rev=831557&amp;view=rev
Log:
ignore images folder

Modified:
    incubator/click/trunk/click/examples/webapp/   (props changed)

Propchange: incubator/click/trunk/click/examples/webapp/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Sat Oct 31 15:57:11 2009
@@ -1,3 +1,3 @@
-
+images
 click
 javadoc




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r831540 - /incubator/click/trunk/click/documentation/xdocs/src/docbook/click/chapter-configuration.xml</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200910.mbox/%3c20091031134411.291AD23888BD@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091031134411-291AD23888BD@eris-apache-org%3e</id>
<updated>2009-10-31T13:44:11Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Sat Oct 31 13:44:10 2009
New Revision: 831540

URL: http://svn.apache.org/viewvc?rev=831540&amp;view=rev
Log:
updated doco

Modified:
    incubator/click/trunk/click/documentation/xdocs/src/docbook/click/chapter-configuration.xml

Modified: incubator/click/trunk/click/documentation/xdocs/src/docbook/click/chapter-configuration.xml
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/documentation/xdocs/src/docbook/click/chapter-configuration.xml?rev=831540&amp;r1=831539&amp;r2=831540&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/documentation/xdocs/src/docbook/click/chapter-configuration.xml
(original)
+++ incubator/click/trunk/click/documentation/xdocs/src/docbook/click/chapter-configuration.xml
Sat Oct 31 13:44:10 2009
@@ -1044,90 +1044,46 @@
     &lt;sect2 id="deploying-restricted-env" remap="h3"&gt;
       &lt;title&gt;Deploying resources in a restricted environment&lt;/title&gt;
 
-      &lt;para&gt;It is generally easier to work with unpacked WARs and most servlet
-      containers do just that. However some containers such as WebLogic (at least
-      version 10) does not. To enable WebLogic to unpack the WAR go to the
-      &lt;emphasis&gt;Admin Console &amp;gt; server node &amp;gt; Web Applications&lt;/emphasis&gt;
-      tab and check the &lt;emphasis&gt;Archived Real Path Enabled&lt;/emphasis&gt; parameter.
+      &lt;para&gt;Some environments place restrictions on the file system and
+      Click won't be able to deploy its resources. WebLogic and
+      Google App Engine are examples of such environments. (Note that WebLogic has
+      a property to allow access to the file system. From the Admin Console go
+      to the &lt;emphasis&gt;Server node &amp;gt; Web Applications&lt;/emphasis&gt;
+      tab and check the &lt;emphasis&gt;Archived Real Path Enabled&lt;/emphasis&gt; parameter.)
       &lt;/para&gt;
 
-      &lt;para&gt;If Click cannot deploy resources because the WAR/EAR is not unpacked
-      or because of restricted file system permissions, warning messages will be
-      logged.
+      &lt;para&gt;If Click cannot deploy its resources because of limited file system
+      access or permissions, warning messages will be logged.
       &lt;/para&gt;
 
       &lt;para&gt;&lt;emphasis role="bold"&gt;Note: &lt;/emphasis&gt;if your application
is
       running on a &lt;emphasis&gt;Servlet 3.0&lt;/emphasis&gt; compliant server, there is
-      no need to deploy resources in restricted environments. Servlet 3.0
-      provide a feature where if the server cannot find a resource in the root
-      directory of the webapp, it will look for the resource under
-      &lt;emphasis&gt;'META-INF/resources'&lt;/emphasis&gt;, and if found, serve it up.
-      Since Click packages its resources under
-      &lt;emphasis&gt;'META-INF/resources'&lt;/emphasis&gt; as well, there is no need to
-      deploy the resources.
+      no need to deploy resources. Servlet 3.0 specifies that if the server
+      cannot find a resource in the root directory of the webapp, it will look
+      for the resource under &lt;emphasis&gt;'META-INF/resources'&lt;/emphasis&gt;, and if
+      found, serve it up. Click is Servlet 3.0 compliant and packages its
+      resources under &lt;emphasis&gt;'META-INF/resources'&lt;/emphasis&gt;.
       &lt;/para&gt;
 
-      &lt;para&gt;Click also provides a number of options to make resources available
+      &lt;para&gt;Click provides a number of options to make resources available
       in restricted environments which is covered below:
       &lt;/para&gt;
 
       &lt;itemizedlist&gt;
         &lt;listitem&gt;
-          &lt;para&gt;Add a mapping in &lt;emphasis&gt;web.xml&lt;/emphasis&gt; to inform
-          ClickServlet to serve static resources. This feature is made available
-          through the &lt;ulink url="../../click-api/org/apache/click/service/ResourceService.html"&gt;ResourceService&lt;/ulink&gt;
-          interface and its default implementation,
-          &lt;ulink url="../../click-api/org/apache/click/service/ClickResourceService.html"&gt;ClickResourceService&lt;/ulink&gt;.
-          Below is an example:
-          &lt;/para&gt;
-          &lt;programlisting language="xml"&gt;&lt;![CDATA[&lt;servlet&gt;
-  &lt;servlet-name&gt;ClickServlet&lt;/servlet-name&gt;
-  &lt;servlet-class&gt;org.apache.click.ClickServlet&lt;/servlet-class&gt;
-  &lt;load-on-startup&gt;0&lt;/load-on-startup&gt;
-&lt;/servlet&gt;
-
-&lt;servlet-mapping&gt;
-  &lt;servlet-name&gt;ClickServlet&lt;/servlet-name&gt;
-  &lt;url-pattern&gt;*.htm&lt;/url-pattern&gt;
-&lt;/servlet-mapping&gt;
-
- &lt;!-- Inform ClickServlet to serve static resources contained under the /click/*
-       directory directly from Click's JAR files. --&gt;
-&lt;servlet-mapping&gt;
-  &lt;servlet-name&gt;ClickServlet&lt;/servlet-name&gt;
-  &lt;url-pattern&gt;/click/*&lt;/url-pattern&gt;
-&lt;/servlet-mapping&gt;]]&gt;&lt;/programlisting&gt;
-
-          &lt;para&gt;Now ClickServlet will serve all static &lt;varname&gt;/click/*&lt;/varname&gt;
-          resources directly from Click's JAR files.
-          &lt;/para&gt;
-
-          &lt;para&gt;One restriction of ClickResourceService is it only serves
-          resources from the &lt;emphasis&gt;/click/*&lt;/emphasis&gt; folder. So if you
use
-          third-party Click libraries that serve their resources from a different
-          folder e.g. &lt;emphasis&gt;/clickclick/*&lt;/emphasis&gt;, this option won't work
-          out-of-the-box.
-          &lt;/para&gt;
-
-          &lt;para&gt;Also note that with this option Click's resources are served
-          directly from the JAR files, you won't be able to customize the resources,
-          if for example you want change the default styling through CSS.
-          &lt;/para&gt;
-        &lt;/listitem&gt;
-        &lt;listitem&gt;
-          &lt;para&gt;Use the Ant based DeployTask to deploy Click's static resources at
-          build time to your web application. With this option Click's static
-          resources can be copied to the root directory of your webapp, where you
-          can customize the resources as you see fit. The DeployTask is an Ant Task
-          you can incorporate into your build script.
+          &lt;para&gt;The first option (which will work in all environments) is to deploy
+          the resources at build time. Click ships with an Ant Task
+          called DeployTask that deploys Click static resources to a web
+          application. With this option Click's static resources can be copied
+          to the root directory of your webapp, where you can customize the
+          resources further if needed. The DeployTask can easily be incorporated
+          into your build script.
           &lt;/para&gt;
           &lt;para&gt;Currently the DeployTask is part of the &lt;filename&gt;click-dev-tools-xxx.jar&lt;/filename&gt;
-          which can be found in your Click distribution under the &lt;emphasis&gt;lib&lt;/emphasis&gt;
+          that can be found in your Click distribution under the &lt;emphasis&gt;lib&lt;/emphasis&gt;
           folder.
           &lt;/para&gt;
-          &lt;para&gt;To use this Ant Task, ensure the &lt;filename&gt;click-dev-tools-xxx.jar&lt;/filename&gt;
-          is available on your build classpath and add the following target to your
-          &lt;filename&gt;build.xml&lt;/filename&gt;:
+          &lt;para&gt;Here is an example:
           &lt;/para&gt;
           &lt;programlisting language="xml"&gt;&lt;![CDATA[&lt;target name="deploy" description="Deploy
static resources"&gt;
     &lt;taskdef name="deploy"
@@ -1171,25 +1127,73 @@
 
           &lt;para&gt;The DeployTask also generates an HTML report in the same folder
           where the build script is executed from. The report will indicate
-          which resources was deployed and also which resources in your webapp
-          root directory is outdated. Resources can become outdated if you
-          upgrade to a new version of Click and certain Click resources were
-          updated.
+          which resources was deployed successfully and which resources
+          in your webapp root directory is outdated. (An outdated resource mean
+          that the resource in the &lt;emphasis&gt;click-xxx.jar&lt;/emphasis&gt; differs
+          from the resource currently present in your webapp root directory.
+          This can happen when upgrading to a new version of Click)
+          &lt;/para&gt;
+        &lt;/listitem&gt;
+        &lt;listitem&gt;
+          &lt;para&gt;Another option is to add a mapping in &lt;emphasis&gt;web.xml&lt;/emphasis&gt;
+          to inform ClickServlet to serve static resources. This feature is made
+          available through the
+          &lt;ulink url="../../click-api/org/apache/click/service/ResourceService.html"&gt;ResourceService&lt;/ulink&gt;
+          interface and its default implementation,
+          &lt;ulink url="../../click-api/org/apache/click/service/ClickResourceService.html"&gt;ClickResourceService&lt;/ulink&gt;.
+          Below is an example:
+          &lt;/para&gt;
+          &lt;programlisting language="xml"&gt;&lt;![CDATA[&lt;servlet&gt;
+  &lt;servlet-name&gt;ClickServlet&lt;/servlet-name&gt;
+  &lt;servlet-class&gt;org.apache.click.ClickServlet&lt;/servlet-class&gt;
+  &lt;load-on-startup&gt;0&lt;/load-on-startup&gt;
+&lt;/servlet&gt;
+
+&lt;servlet-mapping&gt;
+  &lt;servlet-name&gt;ClickServlet&lt;/servlet-name&gt;
+  &lt;url-pattern&gt;*.htm&lt;/url-pattern&gt;
+&lt;/servlet-mapping&gt;
+
+ &lt;!-- Inform ClickServlet to serve static resources contained under the /click/*
+       directory directly from Click's JAR files. --&gt;
+&lt;servlet-mapping&gt;
+  &lt;servlet-name&gt;ClickServlet&lt;/servlet-name&gt;
+  &lt;url-pattern&gt;/click/*&lt;/url-pattern&gt;
+&lt;/servlet-mapping&gt;]]&gt;&lt;/programlisting&gt;
+
+          &lt;para&gt;With this setup, ClickServlet will serve all static
+          &lt;varname&gt;/click/*&lt;/varname&gt; resources directly from Click's JAR files.
+          &lt;/para&gt;
+
+          &lt;para&gt;One restriction of ClickResourceService is it only serves
+          resources from the &lt;emphasis&gt;/click/*&lt;/emphasis&gt; folder. So if you
use
+          third-party Click libraries that serve their resources from a different
+          folder e.g. &lt;emphasis&gt;/clickclick/*&lt;/emphasis&gt;, this option won't work
+          out-of-the-box.
+          &lt;/para&gt;
+
+          &lt;para&gt;Also note that with this option Click's resources are served
+          directly from the JAR files, you won't be able to customize the resources,
+          if for example you want change the default styling through CSS.
           &lt;/para&gt;
         &lt;/listitem&gt;
         &lt;listitem&gt;
-          &lt;para&gt;Click resources are packaged in JARs under the directory
-          &lt;emphasis&gt;META-INF/resources&lt;/emphasis&gt;. You can use your favorite
IDE
+          &lt;para&gt;Another option is to manually deploy the resources. Click
+          resources are packaged in JARs under the directory
+          &lt;emphasis&gt;META-INF/resources&lt;/emphasis&gt;. You can use your IDE
           to navigate into the JARs and copy all the resources from
           &lt;emphasis&gt;META-INF/resources&lt;/emphasis&gt; to your webapp root directory.
-          Just remember to copy the resources in the same structure as they
-          appear under &lt;emphasis&gt;META-INF/resources&lt;/emphasis&gt;.
+          &lt;/para&gt;
+
+          &lt;para&gt;For example, to deploy the resources from
+          &lt;emphasis&gt;click-core.jar&lt;/emphasis&gt;, copy the &lt;emphasis&gt;/click&lt;/emphasis&gt;
+          folder and its contents to your web application root folder.
           &lt;/para&gt;
         &lt;/listitem&gt;
         &lt;listitem&gt;
-          &lt;para&gt;You can also access Click's resources by deploying your
+          &lt;para&gt;And finally you can access Click's resources by deploying your
           application on a development machine where there are no file system
-          restrictions and the WAR/EAR is unpacked. Then you can copy the
+          restrictions and the WAR/EAR can be unpacked. You can then copy the
           deployed resources to your webapp root directory.
           &lt;/para&gt;
         &lt;/listitem&gt;




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r831511 - in /incubator/click/trunk/click/documentation: docs/faq.html images/netbeans-create-page.png</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200910.mbox/%3c20091031023933.8168F23888DD@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091031023933-8168F23888DD@eris-apache-org%3e</id>
<updated>2009-10-31T02:39:33Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Sat Oct 31 02:39:33 2009
New Revision: 831511

URL: http://svn.apache.org/viewvc?rev=831511&amp;view=rev
Log:
updated netbeans ide faq

Added:
    incubator/click/trunk/click/documentation/images/netbeans-create-page.png   (with props)
Modified:
    incubator/click/trunk/click/documentation/docs/faq.html

Modified: incubator/click/trunk/click/documentation/docs/faq.html
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/documentation/docs/faq.html?rev=831511&amp;r1=831510&amp;r2=831511&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/documentation/docs/faq.html (original)
+++ incubator/click/trunk/click/documentation/docs/faq.html Sat Oct 31 02:39:33 2009
@@ -149,9 +149,12 @@
      &lt;br/&gt;
     &lt;/li&gt;
     &lt;li&gt;
-     &lt;a target="blank" class="external" href="https://nbclick.dev.java.net/"&gt;NBClick&lt;/a&gt;

+     &lt;a target="blank" class="external" href="http://kenai.com/projects/nbx/"&gt;Netbeans
Plug-in&lt;/a&gt;
      &lt;p/&gt;
-     NetBeans plug-in for Click is under development by Geertjan Wielenga and Ahmed Mohombe.
+     NetBeans plug-in for Click is under development by
+     &lt;a href="http://hantsy.blogspot.com/" class="external" target="_blank"&gt;Hantsy
Bai&lt;/a&gt;.
+     &lt;p/&gt;
+     &lt;img alt="Create page wizard" src="../images/netbeans-create-page.png"/&gt;
     &lt;/li&gt;
     &lt;li&gt;
      &lt;a target="blank" class="external" href="http://velocitywebedit.sourceforge.net"&gt;Velocitywebedit&lt;/a&gt;

Added: incubator/click/trunk/click/documentation/images/netbeans-create-page.png
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/documentation/images/netbeans-create-page.png?rev=831511&amp;view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/click/trunk/click/documentation/images/netbeans-create-page.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r830881 - in /incubator/click/trunk/click/examples/webapp: border-template.htm border-template.jsp general/broken-border.htm</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200910.mbox/%3c20091029102140.E782423888FD@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091029102140-E782423888FD@eris-apache-org%3e</id>
<updated>2009-10-29T10:21:40Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Thu Oct 29 10:21:40 2009
New Revision: 830881

URL: http://svn.apache.org/viewvc?rev=830881&amp;view=rev
Log:
fixed favicon for ie

Modified:
    incubator/click/trunk/click/examples/webapp/border-template.htm
    incubator/click/trunk/click/examples/webapp/border-template.jsp
    incubator/click/trunk/click/examples/webapp/general/broken-border.htm

Modified: incubator/click/trunk/click/examples/webapp/border-template.htm
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/webapp/border-template.htm?rev=830881&amp;r1=830880&amp;r2=830881&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/webapp/border-template.htm (original)
+++ incubator/click/trunk/click/examples/webapp/border-template.htm Thu Oct 29 10:21:40 2009
@@ -22,12 +22,13 @@
 &lt;html&gt;
 &lt;head&gt;
 &lt;meta http-equiv="Content-type" content="text/html; charset=utf-8"&gt;
+&lt;meta http-equiv="X-UA-Compatible" content="IE=8" /&gt;
 &lt;title&gt;$title : Click Examples&lt;/title&gt;
 &lt;link type="text/css" rel="stylesheet" href="${context}/assets/css/style.css" title="Style"/&gt;
 
 ${headElements}
 
-&lt;link rel="Click icon" href="$context/favicon.ico" type="image/ico"/&gt;
+&lt;link rel="shortcut icon" href="$context/favicon.ico" type="image/ico"/&gt;
 &lt;/head&gt;
 &lt;body&gt;
 

Modified: incubator/click/trunk/click/examples/webapp/border-template.jsp
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/webapp/border-template.jsp?rev=830881&amp;r1=830880&amp;r2=830881&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/webapp/border-template.jsp (original)
+++ incubator/click/trunk/click/examples/webapp/border-template.jsp Thu Oct 29 10:21:40 2009
@@ -25,10 +25,11 @@
 &lt;html&gt;
 &lt;head&gt;
 &lt;meta http-equiv="Content-type" content="text/html; charset=utf-8"&gt;
+&lt;meta http-equiv="X-UA-Compatible" content="IE=8" /&gt;
 &lt;title&gt;${title} : Click Examples&lt;/title&gt;
 &lt;link type="text/css" rel="stylesheet" href="${context}/assets/css/style.css" title="Style"/&gt;
 ${headElements}
-&lt;link rel="Click icon" href="$context/favicon.ico" type="image/ico"/&gt;
+&lt;link rel="shortcut icon" href="$context/favicon.ico" type="image/ico"/&gt;
 &lt;/head&gt;
 &lt;body&gt;
 

Modified: incubator/click/trunk/click/examples/webapp/general/broken-border.htm
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/webapp/general/broken-border.htm?rev=830881&amp;r1=830880&amp;r2=830881&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/webapp/general/broken-border.htm (original)
+++ incubator/click/trunk/click/examples/webapp/general/broken-border.htm Thu Oct 29 10:21:40
2009
@@ -22,11 +22,12 @@
 &lt;html&gt;
 &lt;head&gt;
 &lt;meta http-equiv="Content-type" content="text/html; charset=utf-8"&gt;
+&lt;meta http-equiv="X-UA-Compatible" content="IE=8" /&gt;
 &lt;title&gt;Click Examples - $title&lt;/title&gt;
 &lt;link rel="stylesheet" type="text/css" href="style.css" title="Style"/&gt;
 $headElements
 $jsElements
-&lt;link rel="Click icon" href="$context/favicon.ico" type="image/ico"/&gt;
+&lt;link rel="shortcut icon" href="$context/favicon.ico" type="image/ico"/&gt;
 &lt;/head&gt;	
 &lt;body&gt;
  	




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r830877 - in /incubator/click/trunk/click/examples/webapp: border-template.htm border-template.jsp general/broken-border.htm jsp/dummy.jsp jsp/hello-world.jsp jsp/multi-path-demo.jsp pageflow/invalid-submit.html redirect.html</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200910.mbox/%3c20091029095522.6819A2388904@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091029095522-6819A2388904@eris-apache-org%3e</id>
<updated>2009-10-29T09:55:22Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Thu Oct 29 09:55:21 2009
New Revision: 830877

URL: http://svn.apache.org/viewvc?rev=830877&amp;view=rev
Log:
adddc charset meta tags

Modified:
    incubator/click/trunk/click/examples/webapp/border-template.htm
    incubator/click/trunk/click/examples/webapp/border-template.jsp
    incubator/click/trunk/click/examples/webapp/general/broken-border.htm
    incubator/click/trunk/click/examples/webapp/jsp/dummy.jsp
    incubator/click/trunk/click/examples/webapp/jsp/hello-world.jsp
    incubator/click/trunk/click/examples/webapp/jsp/multi-path-demo.jsp
    incubator/click/trunk/click/examples/webapp/pageflow/invalid-submit.html
    incubator/click/trunk/click/examples/webapp/redirect.html

Modified: incubator/click/trunk/click/examples/webapp/border-template.htm
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/webapp/border-template.htm?rev=830877&amp;r1=830876&amp;r2=830877&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/webapp/border-template.htm (original)
+++ incubator/click/trunk/click/examples/webapp/border-template.htm Thu Oct 29 09:55:21 2009
@@ -21,6 +21,7 @@
 
 &lt;html&gt;
 &lt;head&gt;
+&lt;meta http-equiv="Content-type" content="text/html; charset=utf-8"&gt;
 &lt;title&gt;$title : Click Examples&lt;/title&gt;
 &lt;link type="text/css" rel="stylesheet" href="${context}/assets/css/style.css" title="Style"/&gt;
 

Modified: incubator/click/trunk/click/examples/webapp/border-template.jsp
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/webapp/border-template.jsp?rev=830877&amp;r1=830876&amp;r2=830877&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/webapp/border-template.jsp (original)
+++ incubator/click/trunk/click/examples/webapp/border-template.jsp Thu Oct 29 09:55:21 2009
@@ -24,6 +24,7 @@
 
 &lt;html&gt;
 &lt;head&gt;
+&lt;meta http-equiv="Content-type" content="text/html; charset=utf-8"&gt;
 &lt;title&gt;${title} : Click Examples&lt;/title&gt;
 &lt;link type="text/css" rel="stylesheet" href="${context}/assets/css/style.css" title="Style"/&gt;
 ${headElements}

Modified: incubator/click/trunk/click/examples/webapp/general/broken-border.htm
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/webapp/general/broken-border.htm?rev=830877&amp;r1=830876&amp;r2=830877&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/webapp/general/broken-border.htm (original)
+++ incubator/click/trunk/click/examples/webapp/general/broken-border.htm Thu Oct 29 09:55:21
2009
@@ -20,7 +20,8 @@
 --&gt;
 
 &lt;html&gt;
-&lt;head&gt;	
+&lt;head&gt;
+&lt;meta http-equiv="Content-type" content="text/html; charset=utf-8"&gt;
 &lt;title&gt;Click Examples - $title&lt;/title&gt;
 &lt;link rel="stylesheet" type="text/css" href="style.css" title="Style"/&gt;
 $headElements

Modified: incubator/click/trunk/click/examples/webapp/jsp/dummy.jsp
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/webapp/jsp/dummy.jsp?rev=830877&amp;r1=830876&amp;r2=830877&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/webapp/jsp/dummy.jsp (original)
+++ incubator/click/trunk/click/examples/webapp/jsp/dummy.jsp Thu Oct 29 09:55:21 2009
@@ -23,6 +23,7 @@
 &lt;%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%&gt;
 &lt;html&gt;
 &lt;head&gt;
+&lt;meta http-equiv="Content-type" content="text/html; charset=utf-8"&gt;
 &lt;title&gt;Click Examples&lt;/title&gt;
 &lt;link rel="stylesheet" type="text/css" href="${context}/assets/css/style.css" title="Style"/&gt;
 &lt;/head&gt;

Modified: incubator/click/trunk/click/examples/webapp/jsp/hello-world.jsp
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/webapp/jsp/hello-world.jsp?rev=830877&amp;r1=830876&amp;r2=830877&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/webapp/jsp/hello-world.jsp (original)
+++ incubator/click/trunk/click/examples/webapp/jsp/hello-world.jsp Thu Oct 29 09:55:21 2009
@@ -23,6 +23,7 @@
 &lt;%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%&gt;
 &lt;html&gt;
 &lt;head&gt;
+&lt;meta http-equiv="Content-type" content="text/html; charset=utf-8"&gt;
 &lt;title&gt;Click Examples&lt;/title&gt;
 &lt;link rel="stylesheet" type="text/css" href="${context}/assets/css/style.css" title="Style"/&gt;
 &lt;style type="text/css"&gt;body { background: white; font-size: 10pt; }&lt;/style&gt;

Modified: incubator/click/trunk/click/examples/webapp/jsp/multi-path-demo.jsp
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/webapp/jsp/multi-path-demo.jsp?rev=830877&amp;r1=830876&amp;r2=830877&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/webapp/jsp/multi-path-demo.jsp (original)
+++ incubator/click/trunk/click/examples/webapp/jsp/multi-path-demo.jsp Thu Oct 29 09:55:21
2009
@@ -23,6 +23,7 @@
 &lt;%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%&gt;
 &lt;html&gt;
 &lt;head&gt;
+&lt;meta http-equiv="Content-type" content="text/html; charset=utf-8"&gt;
 &lt;title&gt;Click Examples&lt;/title&gt;
 &lt;link rel="stylesheet" type="text/css" href="${context}/assets/css/style.css" title="Style"/&gt;
 &lt;/head&gt;

Modified: incubator/click/trunk/click/examples/webapp/pageflow/invalid-submit.html
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/webapp/pageflow/invalid-submit.html?rev=830877&amp;r1=830876&amp;r2=830877&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/webapp/pageflow/invalid-submit.html (original)
+++ incubator/click/trunk/click/examples/webapp/pageflow/invalid-submit.html Thu Oct 29 09:55:21
2009
@@ -21,6 +21,7 @@
 
 &lt;html&gt;
 &lt;head&gt;
+ &lt;meta http-equiv="Content-type" content="text/html; charset=utf-8"&gt;
  &lt;title&gt;Click Examples&lt;/title&gt;
  &lt;link rel="stylesheet" type="text/css" href="/click-examples/assets/css/style.css"/&gt;
 &lt;/head&gt;

Modified: incubator/click/trunk/click/examples/webapp/redirect.html
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/webapp/redirect.html?rev=830877&amp;r1=830876&amp;r2=830877&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/webapp/redirect.html (original)
+++ incubator/click/trunk/click/examples/webapp/redirect.html Thu Oct 29 09:55:21 2009
@@ -19,5 +19,8 @@
    under the License.*#
  --&gt;
 &lt;html&gt;
-&lt;head&gt;&lt;meta http-equiv="Refresh" content="0;URL=home.htm"&gt;&lt;/head&gt;
+&lt;head&gt;
+&lt;meta http-equiv="Content-type" content="text/html; charset=utf-8"&gt;
+&lt;meta http-equiv="Refresh" content="0;URL=home.htm"&gt;
+&lt;/head&gt;
 &lt;/html&gt;




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r830845 - in /incubator/click/trunk/click/framework/src/org/apache/click/service: ClickResourceService.java XmlConfigService.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200910.mbox/%3c20091029044704.ADF0423888EA@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091029044704-ADF0423888EA@eris-apache-org%3e</id>
<updated>2009-10-29T04:47:04Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Thu Oct 29 04:47:04 2009
New Revision: 830845

URL: http://svn.apache.org/viewvc?rev=830845&amp;view=rev
Log:
improved messages

Modified:
    incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
    incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java

Modified: incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java?rev=830845&amp;r1=830844&amp;r2=830845&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
(original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/service/ClickResourceService.java
Thu Oct 29 04:47:04 2009
@@ -276,8 +276,8 @@
         }
 
         if (!dir.exists()) {
-            logService.trace("The folder '" + dir.getAbsolutePath()
-                + "' does not exist.");
+            logService.trace("No resources deployed from the folder '" + dir.getAbsolutePath()
+                + "' as it does not exist.");
             return;
         }
 

Modified: incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java?rev=830845&amp;r1=830844&amp;r2=830845&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java
(original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/service/XmlConfigService.java
Thu Oct 29 04:47:04 2009
@@ -1243,9 +1243,16 @@
 
             deployResourcesOnClasspath();
         } else {
-            String msg = "Could not auto deploy files to 'click' web folder."
-                + " You may need to manually include click resources in your"
-                + " web application.";
+            String msg = "Could not auto deploy files to the 'click' web folder."
+                + " This can occur if the call to ServletContext.getRealPath(\"/\") "
+                + " returns null, which means the web application cannot determine"
+                + " the file system path to deploy files to. Another common problem"
+                + " is if the web application is not allowed to write to the file"
+                + " system. To resolve this issue you need to manually include"
+                + " click resources in your web application at build time. You"
+                + " can use the Ant 'DeployTask' that is shipped with Click"
+                + " to include resources at build time. The 'DeployTask' is"
+                + " included in the jar 'lib\\click-dev-tasks.jar'";
             getLogService().warn(msg);
         }
     }
@@ -1354,8 +1361,8 @@
         }
 
         if (!dir.exists()) {
-            logService.trace("The folder '" + dir.getAbsolutePath()
-                + "' does not exist.");
+            logService.trace("No resources deployed from the folder '" + dir.getAbsolutePath()
+                + "' as it does not exist.");
             return;
         }
 




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r830419 - /incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200910.mbox/%3c20091028011154.E4E1E238889C@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091028011154-E4E1E238889C@eris-apache-org%3e</id>
<updated>2009-10-28T01:11:54Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Wed Oct 28 01:11:54 2009
New Revision: 830419

URL: http://svn.apache.org/viewvc?rev=830419&amp;view=rev
Log:
don't render banner if no exporters are defined

Modified:
    incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java

Modified: incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java?rev=830419&amp;r1=830418&amp;r2=830419&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java
(original)
+++ incubator/click/trunk/click/examples/src/org/apache/click/examples/control/exporter/TableExportBanner.java
Wed Oct 28 01:11:54 2009
@@ -25,6 +25,7 @@
 import org.apache.click.Control;
 import org.apache.click.control.Renderable;
 import org.apache.click.util.HtmlStringBuffer;
+import org.apache.commons.collections.CollectionUtils;
 
 /**
  *
@@ -123,6 +124,10 @@
      * @param buffer the StringBuffer to render the paging controls to
      */
     protected void renderExportBanner(HtmlStringBuffer buffer) {
+        List exportFormats = getExportFormats();
+        if (exportFormats == null || exportFormats.isEmpty()) {
+            return;
+        }
 
         HtmlStringBuffer banner = new HtmlStringBuffer();
         Iterator&lt;AbstractTableExporter&gt; it = getExportFormats().iterator();




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r830139 - /incubator/click/trunk/click/framework/src/org/apache/click/control/Select.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200910.mbox/%3c20091027113809.6B5D1238898D@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091027113809-6B5D1238898D@eris-apache-org%3e</id>
<updated>2009-10-27T11:38:09Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Tue Oct 27 11:38:08 2009
New Revision: 830139

URL: http://svn.apache.org/viewvc?rev=830139&amp;view=rev
Log:
cleanup

Modified:
    incubator/click/trunk/click/framework/src/org/apache/click/control/Select.java

Modified: incubator/click/trunk/click/framework/src/org/apache/click/control/Select.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/control/Select.java?rev=830139&amp;r1=830138&amp;r2=830139&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/control/Select.java (original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/control/Select.java Tue Oct
27 11:38:08 2009
@@ -168,7 +168,7 @@
  * When a Select control's required property is set to true, then the user has
  * to select a value other than the first value in the option list. The  first
  * value represents a non-selection by the user. In the example below an
- * Empty Option as set as the first value in the option list.
+ * Empty Option is set as the first value in the option list.
  *
  * &lt;pre class="prettyprint"&gt;
  * public MyPage extends Page {




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r830089 - /incubator/click/trunk/click/framework/src/org/apache/click/control/Column.java</title>
<author><name>sabob@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/incubator-click-commits/200910.mbox/%3c20091027080758.59EE8238888A@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091027080758-59EE8238888A@eris-apache-org%3e</id>
<updated>2009-10-27T08:07:58Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sabob
Date: Tue Oct 27 08:07:57 2009
New Revision: 830089

URL: http://svn.apache.org/viewvc?rev=830089&amp;view=rev
Log:
cleanup

Modified:
    incubator/click/trunk/click/framework/src/org/apache/click/control/Column.java

Modified: incubator/click/trunk/click/framework/src/org/apache/click/control/Column.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/control/Column.java?rev=830089&amp;r1=830088&amp;r2=830089&amp;view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/control/Column.java (original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/control/Column.java Tue Oct
27 08:07:57 2009
@@ -1262,12 +1262,11 @@
      * Return the column name property value from the given row object.
      * &lt;p/&gt;
      * If the row object is a &lt;tt&gt;Map&lt;/tt&gt; this method will attempt to return
-     * the map value for the column name.
-     * &lt;p/&gt;
-     * The row map lookup will be performed using the property name,
-     * if a value is not found the property name in uppercase will be used,
-     * if a value is still not found the property name in lowercase will be used.
-     * If a map value is still not found then this method will return null.
+     * the map value for the column name. The row map lookup will be performed
+     * using the property name, if a value is not found the property name in
+     * uppercase will be used, if a value is still not found the property name
+     * in lowercase will be used. If a map value is still not found then this
+     * method will return null.
      * &lt;p/&gt;
      * Object property values can also be specified using a path expression.
      *
@@ -1283,12 +1282,11 @@
      * Return the column property value from the given row object and property name.
      * &lt;p/&gt;
      * If the row object is a &lt;tt&gt;Map&lt;/tt&gt; this method will attempt to return
-     * the map value for the column.
-     * &lt;p/&gt;
-     * The row map lookup will be performed using the property name,
-     * if a value is not found the property name in uppercase will be used,
-     * if a value is still not found the property name in lowercase will be used.
-     * If a map value is still not found then this method will return null.
+     * the map value for the column. The row map lookup will be performed using
+     * the property name, if a value is not found the property name in uppercase
+     * will be used, if a value is still not found the property name in lowercase
+     * will be used. If a map value is still not found then this method will
+     * return null.
      * &lt;p/&gt;
      * Object property values can also be specified using a path expression.
      *




</pre>
</div>
</content>
</entry>
</feed>
