WW-3764 WW-1832 Adds small demo app to demonstrate possible usage of 
struts.ui.templateDir


Project: http://git-wip-us.apache.org/repos/asf/struts-examples/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts-examples/commit/111b1a7c
Tree: http://git-wip-us.apache.org/repos/asf/struts-examples/tree/111b1a7c
Diff: http://git-wip-us.apache.org/repos/asf/struts-examples/diff/111b1a7c

Branch: refs/heads/master
Commit: 111b1a7c3f03b72a2c6dcb5dffb5188c012671b8
Parents: c73eae6
Author: Lukasz Lenart <lukasz.len...@gmail.com>
Authored: Thu Jul 10 09:40:29 2014 +0200
Committer: Lukasz Lenart <lukasz.len...@gmail.com>
Committed: Thu Jul 10 09:40:29 2014 +0200

----------------------------------------------------------------------
 pom.xml                                         |   1 +
 themes_override/README.txt                      |  16 +
 themes_override/pom.xml                         |  54 ++++
 .../apache/struts/edit/action/EditAction.java   |  96 ++++++
 .../org/apache/struts/edit/model/Person.java    |  96 ++++++
 .../org/apache/struts/edit/model/State.java     |  39 +++
 .../apache/struts/edit/service/EditService.java |  12 +
 .../edit/service/EditServiceInMemory.java       |  51 ++++
 themes_override/src/main/resources/log4j.dtd    | 227 ++++++++++++++
 themes_override/src/main/resources/log4j.xml    |  28 ++
 .../struts/edit/action/EditAction.properties    |   8 +
 themes_override/src/main/resources/struts.xml   |  30 ++
 .../src/main/webapp/META-INF/MANIFEST.MF        |   3 +
 .../webapp/WEB-INF/template/simple/a-close.ftl  |  45 +++
 .../main/webapp/WEB-INF/template/simple/a.ftl   |  22 ++
 .../WEB-INF/template/simple/actionerror.ftl     |  43 +++
 .../WEB-INF/template/simple/actionmessage.ftl   |  43 +++
 .../webapp/WEB-INF/template/simple/checkbox.ftl |  50 +++
 .../WEB-INF/template/simple/checkboxlist.ftl    | 113 +++++++
 .../webapp/WEB-INF/template/simple/combobox.ftl | 103 +++++++
 .../template/simple/common-attributes.ftl       |  25 ++
 .../WEB-INF/template/simple/controlfooter.ftl   |  22 ++
 .../WEB-INF/template/simple/controlheader.ftl   |  22 ++
 .../main/webapp/WEB-INF/template/simple/css.ftl |  35 +++
 .../webapp/WEB-INF/template/simple/debug.ftl    |  82 +++++
 .../WEB-INF/template/simple/div-close.ftl       |  23 ++
 .../main/webapp/WEB-INF/template/simple/div.ftl |  32 ++
 .../WEB-INF/template/simple/doubleselect.ftl    | 198 ++++++++++++
 .../template/simple/dynamic-attributes.ftl      |  34 +++
 .../webapp/WEB-INF/template/simple/empty.ftl    |  22 ++
 .../WEB-INF/template/simple/fielderror.ftl      |  82 +++++
 .../webapp/WEB-INF/template/simple/file.ftl     |  48 +++
 .../WEB-INF/template/simple/form-close.ftl      | 113 +++++++
 .../WEB-INF/template/simple/form-common.ftl     |  67 +++++
 .../webapp/WEB-INF/template/simple/form.ftl     |  27 ++
 .../webapp/WEB-INF/template/simple/head.ftl     |  23 ++
 .../webapp/WEB-INF/template/simple/hidden.ftl   |  41 +++
 .../template/simple/inputtransferselect.ftl     | 124 ++++++++
 .../webapp/WEB-INF/template/simple/label.ftl    |  45 +++
 .../webapp/WEB-INF/template/simple/optgroup.ftl |  51 ++++
 .../template/simple/optiontransferselect.ftl    | 301 +++++++++++++++++++
 .../webapp/WEB-INF/template/simple/password.ftl |  53 ++++
 .../webapp/WEB-INF/template/simple/radiomap.ftl |  94 ++++++
 .../webapp/WEB-INF/template/simple/reset.ftl    |  76 +++++
 .../template/simple/scripting-events.ftl        |  64 ++++
 .../webapp/WEB-INF/template/simple/select.ftl   | 140 +++++++++
 .../WEB-INF/template/simple/submit-close.ftl    |   6 +
 .../webapp/WEB-INF/template/simple/submit.ftl   |  93 ++++++
 .../webapp/WEB-INF/template/simple/table.ftl    |  76 +++++
 .../webapp/WEB-INF/template/simple/text.ftl     |  54 ++++
 .../webapp/WEB-INF/template/simple/textarea.ftl |  53 ++++
 .../webapp/WEB-INF/template/simple/token.ftl    |  24 ++
 .../WEB-INF/template/simple/updownselect.ftl    |  57 ++++
 .../webapp/WEB-INF/template/xhtml/checkbox.ftl  | 129 ++++++++
 .../WEB-INF/template/xhtml/checkboxlist.ftl     |  25 ++
 .../webapp/WEB-INF/template/xhtml/combobox.ftl  |  25 ++
 .../WEB-INF/template/xhtml/control-close.ftl    |  23 ++
 .../webapp/WEB-INF/template/xhtml/control.ftl   |  26 ++
 .../WEB-INF/template/xhtml/controlfooter.ftl    |  38 +++
 .../template/xhtml/controlheader-core.ftl       |  81 +++++
 .../WEB-INF/template/xhtml/controlheader.ftl    |  28 ++
 .../WEB-INF/template/xhtml/doubleselect.ftl     |  25 ++
 .../main/webapp/WEB-INF/template/xhtml/file.ftl |  25 ++
 .../template/xhtml/form-close-validate.ftl      | 158 ++++++++++
 .../WEB-INF/template/xhtml/form-close.ftl       |  35 +++
 .../WEB-INF/template/xhtml/form-validate.ftl    |  31 ++
 .../main/webapp/WEB-INF/template/xhtml/form.ftl |  33 ++
 .../main/webapp/WEB-INF/template/xhtml/head.ftl |  24 ++
 .../webapp/WEB-INF/template/xhtml/hidden.ftl    |  27 ++
 .../template/xhtml/inputtransferselect.ftl      |  25 ++
 .../webapp/WEB-INF/template/xhtml/label.ftl     |  25 ++
 .../template/xhtml/optiontransferselect.ftl     |  25 ++
 .../webapp/WEB-INF/template/xhtml/password.ftl  |  25 ++
 .../webapp/WEB-INF/template/xhtml/radiomap.ftl  |  25 ++
 .../webapp/WEB-INF/template/xhtml/reset.ftl     |  31 ++
 .../webapp/WEB-INF/template/xhtml/select.ftl    |  25 ++
 .../webapp/WEB-INF/template/xhtml/styles.css    |  29 ++
 .../WEB-INF/template/xhtml/submit-close.ftl     |  25 ++
 .../webapp/WEB-INF/template/xhtml/submit.ftl    |  29 ++
 .../main/webapp/WEB-INF/template/xhtml/text.ftl |  25 ++
 .../webapp/WEB-INF/template/xhtml/textarea.ftl  |  25 ++
 .../WEB-INF/template/xhtml/theme.properties     |  21 ++
 .../webapp/WEB-INF/template/xhtml/tooltip.ftl   |  41 +++
 .../WEB-INF/template/xhtml/updownselect.ftl     |  25 ++
 .../webapp/WEB-INF/template/xhtml/validation.js | 139 +++++++++
 themes_override/src/main/webapp/WEB-INF/web.xml |  19 ++
 themes_override/src/main/webapp/edit.jsp        |  29 ++
 themes_override/src/main/webapp/index.jsp       |  16 +
 themes_override/src/main/webapp/thankyou.jsp    |  21 ++
 89 files changed, 4645 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 5065411..1c7bde1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -58,6 +58,7 @@
         <module>exclude_parameters</module>
         <module>restful2actionmapper</module>
         <module>bean_validation</module>
+        <module>themes_override</module>
     </modules>
 
 

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/README.txt
----------------------------------------------------------------------
diff --git a/themes_override/README.txt b/themes_override/README.txt
new file mode 100644
index 0000000..2ef262e
--- /dev/null
+++ b/themes_override/README.txt
@@ -0,0 +1,16 @@
+This is the example project referred to in the
+Struts 2 documentation, Struts 2 Themes tutorial.
+See:  http://struts.apache.org.
+
+To build the application's war file run mvn clean package
+from the project's root folder.
+
+The war file is created in the target sub-folder.
+
+Copy the war file to your Servlet container (e.g. Tomcat, GlassFish) and 
+then startup the Servlet container.
+
+In a web browser go to:  http://localhost:8080/themes_override/index.action.
+
+You should see a web page with Welcome to Struts 2!
+

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/pom.xml
----------------------------------------------------------------------
diff --git a/themes_override/pom.xml b/themes_override/pom.xml
new file mode 100644
index 0000000..b0e33cc
--- /dev/null
+++ b/themes_override/pom.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";
+         xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
+    <modelVersion>4.0.0</modelVersion>
+<!--
+    FIXME: this is temporary solution to use the latest snapshot version
+    <parent>
+        <groupId>struts.apache.org</groupId>
+        <artifactId>struts2examples</artifactId>
+        <version>1.0.0</version>
+    </parent>
+-->
+    <groupId>struts.apache.org</groupId>
+    <version>1.0.0</version>
+
+    <artifactId>themes_override</artifactId>
+
+    <name>Struts 2 Themes Override</name>
+
+    <description>Struts 2 themes override example application for the
+        Struts 2 getting started tutorials
+    </description>
+
+    <packaging>war</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.struts</groupId>
+            <artifactId>struts2-core</artifactId>
+            <version>2.3.18-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <finalName>themes_override</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.mortbay.jetty</groupId>
+                <artifactId>jetty-maven-plugin</artifactId>
+                <version>8.1.7.v20120910</version>
+                <configuration>
+                    <stopKey>CTRL+C</stopKey>
+                    <stopPort>8999</stopPort>
+                    <scanIntervalSeconds>10</scanIntervalSeconds>
+                    <scanTargets>
+                        
<scanTarget>src/main/webapp/WEB-INF/web.xml</scanTarget>
+                    </scanTargets>
+                </configuration>
+            </plugin>
+        </plugins>
+
+    </build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/java/org/apache/struts/edit/action/EditAction.java
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/java/org/apache/struts/edit/action/EditAction.java 
b/themes_override/src/main/java/org/apache/struts/edit/action/EditAction.java
new file mode 100644
index 0000000..aa07ff2
--- /dev/null
+++ 
b/themes_override/src/main/java/org/apache/struts/edit/action/EditAction.java
@@ -0,0 +1,96 @@
+package org.apache.struts.edit.action;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.struts.edit.model.Person;
+import org.apache.struts.edit.model.State;
+import org.apache.struts.edit.service.EditService;
+import org.apache.struts.edit.service.EditServiceInMemory;
+
+import com.opensymphony.xwork2.ActionSupport;
+
+/**
+ * Acts as a controller to handle actions
+ * related to editing a Person.
+ * @author bruce phillips
+ *
+ */
+public class EditAction extends ActionSupport {
+       
+       private static final long serialVersionUID = 1L;
+       
+       private EditService editService = new EditServiceInMemory();
+       
+       private Person personBean;
+       
+       private String [] sports = {"football", "baseball", "basketball" };
+       
+       private String [] genders = {"male", "female", "not sure" };
+       
+       private List<State> states ;
+
+       private String [] carModelsAvailable = 
{"Ford","Chrysler","Toyota","Nissan"};
+
+       public String execute() throws Exception {
+               
+           editService.savePerson( getPersonBean() );
+               
+               return SUCCESS;
+               
+       }
+       
+       
+       public String input() throws Exception {
+               
+               setPersonBean( editService.getPerson() );
+               
+               return INPUT;
+       }
+       
+       public Person getPersonBean() {
+               
+               
+               return personBean;
+               
+       }
+       
+       public void setPersonBean(Person person) {
+               
+               personBean = person;
+               
+       }
+
+
+       public List<String> getSports() {
+               return Arrays.asList(sports);
+       }
+       
+       public List<String> getGenders() {
+               
+               return Arrays.asList(genders);
+               
+       }
+
+
+
+       public List<State> getStates() {
+               
+               states = new ArrayList<State>();
+               states.add( new State("AZ", "Arizona") );
+               states.add( new State("CA", "California") );
+               states.add( new State("FL", "Florida") );
+               states.add( new State("KS", "Kansas") );
+               states.add( new State("NY", "New York") );
+               
+               return states;
+       }
+
+
+
+       public String [] getCarModelsAvailable() {
+               return carModelsAvailable;
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/java/org/apache/struts/edit/model/Person.java
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/java/org/apache/struts/edit/model/Person.java 
b/themes_override/src/main/java/org/apache/struts/edit/model/Person.java
new file mode 100644
index 0000000..392a8de
--- /dev/null
+++ b/themes_override/src/main/java/org/apache/struts/edit/model/Person.java
@@ -0,0 +1,96 @@
+package org.apache.struts.edit.model;
+
+import java.util.Arrays;
+
+
+/**
+ * Models a Person who registers.
+ * @author bruce phillips
+ *
+ */
+public class Person
+{
+    private String firstName;
+    private String lastName;
+    private String sport;
+    private String gender;
+    private String residency;
+    private boolean over21;
+    private String [] carModels;
+ 
+
+    public String getFirstName()
+    {
+        return firstName;
+    }
+
+    public void setFirstName(String firstName)
+    {
+        this.firstName = firstName;
+    }
+
+    public String getLastName()
+    {
+        return lastName;
+    }
+
+    public void setLastName(String lastName)
+    {
+        this.lastName = lastName;
+    }
+
+
+
+
+       public void setSport(String sport) {
+               this.sport = sport;
+       }
+
+       public void setGender(String gender) {
+               this.gender = gender;
+       }
+
+       public String getGender() {
+               return gender;
+       }
+
+       public String getSport() {
+               return sport;
+       }
+
+       public void setResidency(String residency) {
+               this.residency = residency;
+       }
+
+       public String getResidency() {
+               return residency;
+       }
+
+       public void setOver21(boolean over21) {
+               this.over21 = over21;
+       }
+
+       public boolean isOver21() {
+               return over21;
+       }
+
+       public void setCarModels(String [] carModels) {
+               this.carModels = carModels;
+       }
+
+       public String [] getCarModels() {
+               return carModels;
+       }
+
+       public String toString()
+    {
+        return "First Name: " + getFirstName() + " | " +
+        " Last Name:  " + getLastName() + " | " +
+        " Favorite Sport: " + getSport() + " | " +
+        " Gender: " + getGender() + " | " +  
+        " Residency: " + getResidency() + " | " +
+        " Over 21: " + isOver21()  + " | " +
+        " Car models: " + Arrays.asList( getCarModels() ) ;
+        
+    }
+}

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/java/org/apache/struts/edit/model/State.java
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/java/org/apache/struts/edit/model/State.java 
b/themes_override/src/main/java/org/apache/struts/edit/model/State.java
new file mode 100644
index 0000000..bb927e1
--- /dev/null
+++ b/themes_override/src/main/java/org/apache/struts/edit/model/State.java
@@ -0,0 +1,39 @@
+package org.apache.struts.edit.model;
+
+public class State {
+       
+       private String stateAbbr;
+       
+       private String stateName;
+       
+       public State (String stateAbbr, String stateName) {
+               
+               this.stateAbbr = stateAbbr;
+               this.stateName = stateName;
+               
+       }
+
+       public void setStateAbbr(String stateAbbr) {
+               this.stateAbbr = stateAbbr;
+       }
+
+       public String getStateAbbr() {
+               return stateAbbr;
+       }
+
+       public void setStateName(String stateName) {
+               this.stateName = stateName;
+       }
+
+       public String getStateName() {
+               return stateName;
+       }
+       
+       public String toString() {
+               
+               return getStateAbbr() ;
+               
+       }
+       
+
+}

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/java/org/apache/struts/edit/service/EditService.java
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/java/org/apache/struts/edit/service/EditService.java 
b/themes_override/src/main/java/org/apache/struts/edit/service/EditService.java
new file mode 100644
index 0000000..79d759a
--- /dev/null
+++ 
b/themes_override/src/main/java/org/apache/struts/edit/service/EditService.java
@@ -0,0 +1,12 @@
+package org.apache.struts.edit.service;
+
+import org.apache.struts.edit.model.Person;
+
+public interface EditService {
+       
+       
+       Person getPerson() ;
+
+       void savePerson(Person personBean);
+
+}

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/java/org/apache/struts/edit/service/EditServiceInMemory.java
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/java/org/apache/struts/edit/service/EditServiceInMemory.java
 
b/themes_override/src/main/java/org/apache/struts/edit/service/EditServiceInMemory.java
new file mode 100644
index 0000000..7638152
--- /dev/null
+++ 
b/themes_override/src/main/java/org/apache/struts/edit/service/EditServiceInMemory.java
@@ -0,0 +1,51 @@
+package org.apache.struts.edit.service;
+
+import org.apache.struts.edit.model.Person;
+
+/**
+ * Implement Services needed to edit and save
+ * a Person object's state.  In this implementation
+ * the Person object's state is stored in memory
+ * @author brucephillips
+ *
+ */
+public class EditServiceInMemory implements EditService {
+       
+       
+       private static Person person ;
+       private static String [] carModels = {"Ford","Nissan"};
+
+       
+       static {
+               
+               person = new Person();
+               person.setFirstName("Bruce");
+               person.setLastName("Phillips");
+               person.setSport("basketball");
+               person.setGender("not sure");
+               person.setResidency("KS");
+               person.setOver21(true);         
+               person.setCarModels( carModels);                
+
+       }
+
+       
+       public Person getPerson() {
+               
+               return EditServiceInMemory.person;
+       }
+
+
+       public void savePerson(Person personBean) {
+
+               
EditServiceInMemory.person.setFirstName(personBean.getFirstName() );
+               EditServiceInMemory.person.setLastName(personBean.getLastName() 
);
+               EditServiceInMemory.person.setSport(personBean.getSport() );
+               EditServiceInMemory.person.setGender( personBean.getGender() );
+               EditServiceInMemory.person.setResidency( 
personBean.getResidency() );
+               EditServiceInMemory.person.setOver21( personBean.isOver21() );
+               
EditServiceInMemory.person.setCarModels(personBean.getCarModels() );
+
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/resources/log4j.dtd
----------------------------------------------------------------------
diff --git a/themes_override/src/main/resources/log4j.dtd 
b/themes_override/src/main/resources/log4j.dtd
new file mode 100644
index 0000000..1aabd96
--- /dev/null
+++ b/themes_override/src/main/resources/log4j.dtd
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+
+<!-- Authors: Chris Taylor, Ceki Gulcu. -->
+
+<!-- Version: 1.2 -->
+
+<!-- A configuration element consists of optional renderer
+elements,appender elements, categories and an optional root
+element. -->
+
+<!ELEMENT log4j:configuration (renderer*, appender*,plugin*, 
(category|logger)*,root?,
+                               (categoryFactory|loggerFactory)?)>
+
+<!-- The "threshold" attribute takes a level value below which -->
+<!-- all logging statements are disabled. -->
+
+<!-- Setting the "debug" enable the printing of internal log4j logging   -->
+<!-- statements.                                                         -->
+
+<!-- By default, debug attribute is "null", meaning that we not do touch -->
+<!-- internal log4j logging settings. The "null" value for the threshold -->
+<!-- attribute can be misleading. The threshold field of a repository   -->
+<!-- cannot be set to null. The "null" value for the threshold attribute -->
+<!-- simply means don't touch the threshold field, the threshold field   --> 
+<!-- keeps its old value.                                                -->
+     
+<!ATTLIST log4j:configuration
+  xmlns:log4j              CDATA #FIXED "http://jakarta.apache.org/log4j/"; 
+  threshold                (all|trace|debug|info|warn|error|fatal|off|null) 
"null"
+  debug                    (true|false|null)  "null"
+  reset                    (true|false) "false"
+>
+
+<!-- renderer elements allow the user to customize the conversion of  -->
+<!-- message objects to String.                                       -->
+
+<!ELEMENT renderer EMPTY>
+<!ATTLIST renderer
+  renderedClass  CDATA #REQUIRED
+  renderingClass CDATA #REQUIRED
+>
+
+<!-- Appenders must have a name and a class. -->
+<!-- Appenders may contain an error handler, a layout, optional parameters -->
+<!-- and filters. They may also reference (or include) other appenders. -->
+<!ELEMENT appender (errorHandler?, param*,
+      rollingPolicy?, triggeringPolicy?, connectionSource?,
+      layout?, filter*, appender-ref*)>
+<!ATTLIST appender
+  name                 CDATA   #REQUIRED
+  class        CDATA   #REQUIRED
+>
+
+<!ELEMENT layout (param*)>
+<!ATTLIST layout
+  class                CDATA   #REQUIRED
+>
+
+<!ELEMENT filter (param*)>
+<!ATTLIST filter
+  class                CDATA   #REQUIRED
+>
+
+<!-- ErrorHandlers can be of any class. They can admit any number of -->
+<!-- parameters. -->
+
+<!ELEMENT errorHandler (param*, root-ref?, logger-ref*,  appender-ref?)> 
+<!ATTLIST errorHandler
+   class        CDATA   #REQUIRED 
+>
+
+<!ELEMENT root-ref EMPTY>
+
+<!ELEMENT logger-ref EMPTY>
+<!ATTLIST logger-ref
+  ref CDATA #REQUIRED
+>
+
+<!ELEMENT param EMPTY>
+<!ATTLIST param
+  name         CDATA   #REQUIRED
+  value                CDATA   #REQUIRED
+>
+
+
+<!-- The priority class is org.apache.log4j.Level by default -->
+<!ELEMENT priority (param*)>
+<!ATTLIST priority
+  class   CDATA        #IMPLIED
+  value          CDATA #REQUIRED
+>
+
+<!-- The level class is org.apache.log4j.Level by default -->
+<!ELEMENT level (param*)>
+<!ATTLIST level
+  class   CDATA        #IMPLIED
+  value          CDATA #REQUIRED
+>
+
+
+<!-- If no level element is specified, then the configurator MUST not -->
+<!-- touch the level of the named category. -->
+<!ELEMENT category (param*,(priority|level)?,appender-ref*)>
+<!ATTLIST category
+  class         CDATA   #IMPLIED
+  name         CDATA   #REQUIRED
+  additivity   (true|false) "true"  
+>
+
+<!-- If no level element is specified, then the configurator MUST not -->
+<!-- touch the level of the named logger. -->
+<!ELEMENT logger (level?,appender-ref*)>
+<!ATTLIST logger
+  name         CDATA   #REQUIRED
+  additivity   (true|false) "true"  
+>
+
+
+<!ELEMENT categoryFactory (param*)>
+<!ATTLIST categoryFactory 
+   class        CDATA #REQUIRED>
+
+<!ELEMENT loggerFactory (param*)>
+<!ATTLIST loggerFactory
+   class        CDATA #REQUIRED>
+
+<!ELEMENT appender-ref EMPTY>
+<!ATTLIST appender-ref
+  ref CDATA #REQUIRED
+>
+
+<!-- plugins must have a name and class and can have optional parameters -->
+<!ELEMENT plugin (param*, connectionSource?)>
+<!ATTLIST plugin
+  name                 CDATA      #REQUIRED
+  class        CDATA  #REQUIRED
+>
+
+<!ELEMENT connectionSource (dataSource?, param*)>
+<!ATTLIST connectionSource
+  class        CDATA  #REQUIRED
+>
+
+<!ELEMENT dataSource (param*)>
+<!ATTLIST dataSource
+  class        CDATA  #REQUIRED
+>
+
+<!ELEMENT triggeringPolicy ((param|filter)*)>
+<!ATTLIST triggeringPolicy
+  name                 CDATA  #IMPLIED
+  class        CDATA  #REQUIRED
+>
+
+<!ELEMENT rollingPolicy (param*)>
+<!ATTLIST rollingPolicy
+  name                 CDATA  #IMPLIED
+  class        CDATA  #REQUIRED
+>
+
+
+<!-- If no priority element is specified, then the configurator MUST not -->
+<!-- touch the priority of root. -->
+<!-- The root category always exists and cannot be subclassed. -->
+<!ELEMENT root (param*, (priority|level)?, appender-ref*)>
+
+
+<!-- ==================================================================== -->
+<!--                       A logging event                                -->
+<!-- ==================================================================== -->
+<!ELEMENT log4j:eventSet (log4j:event*)>
+<!ATTLIST log4j:eventSet
+  xmlns:log4j             CDATA #FIXED "http://jakarta.apache.org/log4j/"; 
+  version                (1.1|1.2) "1.2" 
+  includesLocationInfo   (true|false) "true"
+>
+
+
+
+<!ELEMENT log4j:event (log4j:message, log4j:NDC?, log4j:throwable?, 
+                       log4j:locationInfo?, log4j:properties?) >
+
+<!-- The timestamp format is application dependent. -->
+<!ATTLIST log4j:event
+    logger     CDATA #REQUIRED
+    level      CDATA #REQUIRED
+    thread     CDATA #REQUIRED
+    timestamp  CDATA #REQUIRED
+    time       CDATA #IMPLIED
+>
+
+<!ELEMENT log4j:message (#PCDATA)>
+<!ELEMENT log4j:NDC (#PCDATA)>
+
+<!ELEMENT log4j:throwable (#PCDATA)>
+
+<!ELEMENT log4j:locationInfo EMPTY>
+<!ATTLIST log4j:locationInfo
+  class  CDATA #REQUIRED
+  method CDATA #REQUIRED
+  file   CDATA #REQUIRED
+  line   CDATA #REQUIRED
+>
+
+<!ELEMENT log4j:properties (log4j:data*)>
+
+<!ELEMENT log4j:data EMPTY>
+<!ATTLIST log4j:data
+  name   CDATA #REQUIRED
+  value  CDATA #REQUIRED
+>

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/resources/log4j.xml
----------------------------------------------------------------------
diff --git a/themes_override/src/main/resources/log4j.xml 
b/themes_override/src/main/resources/log4j.xml
new file mode 100644
index 0000000..2100cb2
--- /dev/null
+++ b/themes_override/src/main/resources/log4j.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" 
"log4j.dtd">
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/";>
+    
+    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
+       <layout class="org.apache.log4j.PatternLayout"> 
+          <param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n"/> 
+       </layout> 
+    </appender>
+ 
+    <!-- specify the logging level for loggers from other libraries -->
+    <logger name="com.opensymphony">
+       <level value="DEBUG" />
+    </logger>
+
+    <logger name="org.apache.struts2">
+        <level value="DEBUG" />
+    </logger>
+  
+   <!-- for all other loggers log only debug and above log messages -->
+     <root>
+        <priority value="INFO"/> 
+        <appender-ref ref="STDOUT" /> 
+     </root> 
+    
+</log4j:configuration> 
+

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/resources/org/apache/struts/edit/action/EditAction.properties
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/resources/org/apache/struts/edit/action/EditAction.properties
 
b/themes_override/src/main/resources/org/apache/struts/edit/action/EditAction.properties
new file mode 100644
index 0000000..0f08667
--- /dev/null
+++ 
b/themes_override/src/main/resources/org/apache/struts/edit/action/EditAction.properties
@@ -0,0 +1,8 @@
+personBean.firstName=First name
+personBean.lastName=Last name
+personBean.sport=Favorite sport
+personBean.gender=Gender
+personBean.residency=State resident
+personBean.over21=21 or older
+personBean.carModels=Car models owned
+submit=Save Changes
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/resources/struts.xml
----------------------------------------------------------------------
diff --git a/themes_override/src/main/resources/struts.xml 
b/themes_override/src/main/resources/struts.xml
new file mode 100644
index 0000000..5c37a7b
--- /dev/null
+++ b/themes_override/src/main/resources/struts.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE struts PUBLIC
+    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
+    "http://struts.apache.org/dtds/struts-2.0.dtd";>
+
+<struts>
+
+       <constant name="struts.devMode" value="true" />
+    <constant name="struts.ui.templateDir" value="WEB-INF/template"/>
+
+       <package name="basicstruts2" extends="struts-default">
+
+        <!-- If no class attribute is specified the framework will assume 
success and 
+        render the result index.jsp -->
+        <!-- If no name value for the result node is specified the success 
value is the default -->
+               <action name="index">
+                       <result>/index.jsp</result>
+               </action>
+
+           <action name="edit" 
class="org.apache.struts.edit.action.EditAction" method="input">
+               <result name="input">/edit.jsp</result>
+           </action>
+           
+           <action name="save" 
class="org.apache.struts.edit.action.EditAction" method="execute">
+               <result name="success">/thankyou.jsp</result>
+           </action>
+
+       </package>
+
+</struts>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/META-INF/MANIFEST.MF
----------------------------------------------------------------------
diff --git a/themes_override/src/main/webapp/META-INF/MANIFEST.MF 
b/themes_override/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..254272e
--- /dev/null
+++ b/themes_override/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path: 
+

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/a-close.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/a-close.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/a-close.ftl
new file mode 100644
index 0000000..84b5aae
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/a-close.ftl
@@ -0,0 +1,45 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<a<#rt/>
+<#if parameters.id?if_exists != "">
+ id="${parameters.id?html}"<#rt/>
+</#if>
+<#if parameters.href?if_exists != "">
+ href="${parameters.href}"<#rt/>
+</#if>
+<#if parameters.tabindex??>
+ tabindex="${parameters.tabindex?html}"<#rt/>
+</#if>
+<#if parameters.cssClass??>
+ class="${parameters.cssClass?html}"<#rt/>
+</#if>
+<#if parameters.cssStyle??>
+ style="${parameters.cssStyle?html}"<#rt/>
+</#if>
+<#if parameters.title??>
+ title="${parameters.title?html}"<#rt/>
+</#if>
+<#include 
"/${parameters.templateDir}/${parameters.expandTheme}/scripting-events.ftl" />
+<#include 
"/${parameters.templateDir}/${parameters.expandTheme}/common-attributes.ftl" />
+<#include 
"/${parameters.templateDir}/${parameters.expandTheme}/dynamic-attributes.ftl" />
+>${parameters.body}</a>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/a.ftl
----------------------------------------------------------------------
diff --git a/themes_override/src/main/webapp/WEB-INF/template/simple/a.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/a.ftl
new file mode 100644
index 0000000..dcf27d2
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/a.ftl
@@ -0,0 +1,22 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/actionerror.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/actionerror.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/actionerror.ftl
new file mode 100644
index 0000000..6563876
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/actionerror.ftl
@@ -0,0 +1,43 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<#if (actionErrors?? && actionErrors?size > 0)>
+       <ul<#rt/>
+<#if parameters.id?if_exists != "">
+ id="${parameters.id?html}"<#rt/>
+</#if>            
+<#if parameters.cssClass??>
+ class="${parameters.cssClass?html}"<#rt/>
+<#else>
+ class="errorMessage"<#rt/>
+</#if>
+<#if parameters.cssStyle??>
+ style="${parameters.cssStyle?html}"<#rt/>
+</#if>
+>
+       <#list actionErrors as error>
+               <#if error?if_exists != "">
+            <li><span><#if 
parameters.escape>${error!?html}<#else>${error!}</#if></span><#rt/></li><#rt/>
+        </#if>
+       </#list>
+       </ul>
+</#if>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/actionmessage.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/actionmessage.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/actionmessage.ftl
new file mode 100644
index 0000000..07174dd
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/actionmessage.ftl
@@ -0,0 +1,43 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<#if (actionMessages?? && actionMessages?size > 0 && !parameters.isEmptyList)>
+       <ul<#rt/>
+<#if parameters.id?if_exists != "">
+ id="${parameters.id?html}"<#rt/>
+</#if>
+<#if parameters.cssClass??>
+ class="${parameters.cssClass?html}"<#rt/>
+<#else>
+ class="actionMessage"<#rt/>
+</#if>
+<#if parameters.cssStyle??>
+ style="${parameters.cssStyle?html}"<#rt/>
+</#if>
+>
+               <#list actionMessages as message>
+            <#if message?if_exists != "">
+                <li><span><#if 
parameters.escape>${message!?html}<#else>${message!}</#if></span></li>
+            </#if>
+               </#list>
+       </ul>
+</#if>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/checkbox.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/checkbox.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/checkbox.ftl
new file mode 100644
index 0000000..1ef6b03
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/checkbox.ftl
@@ -0,0 +1,50 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<input type="checkbox" name="${parameters.name?html}" 
value="${parameters.fieldValue?html}"<#rt/>
+<#if parameters.nameValue?? && parameters.nameValue>
+ checked="checked"<#rt/>
+</#if>
+<#if parameters.disabled?default(false)>
+ disabled="disabled"<#rt/>
+</#if>
+<#if parameters.readonly?default(false)>
+ readonly="readonly"<#rt/>
+</#if>
+<#if parameters.tabindex??>
+ tabindex="${parameters.tabindex?html}"<#rt/>
+</#if>
+<#if parameters.id??>
+ id="${parameters.id?html}"<#rt/>
+</#if>
+<#include "/${parameters.templateDir}/${parameters.expandTheme}/css.ftl" />
+<#if parameters.title??>
+ title="${parameters.title?html}"<#rt/>
+</#if>
+<#include 
"/${parameters.templateDir}/${parameters.expandTheme}/scripting-events.ftl" />
+<#include 
"/${parameters.templateDir}/${parameters.expandTheme}/common-attributes.ftl" />
+<#include 
"/${parameters.templateDir}/${parameters.expandTheme}/dynamic-attributes.ftl" />
+/><input type="hidden" id="__checkbox_${parameters.id?html}" 
name="__checkbox_${parameters.name?html}" 
value="${parameters.fieldValue?html}"<#rt/>
+<#if parameters.disabled?default(false)>
+ disabled="disabled"<#rt/>
+</#if>
+ />

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/checkboxlist.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/checkboxlist.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/checkboxlist.ftl
new file mode 100644
index 0000000..3ce8686
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/checkboxlist.ftl
@@ -0,0 +1,113 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<#assign itemCount = 0/>
+<#if parameters.list??>
+<@s.iterator value="parameters.list">
+    <#assign itemCount = itemCount + 1/>
+    <#if parameters.listKey??>
+        <#assign itemKey = stack.findValue(parameters.listKey)/>
+        <#else>
+            <#assign itemKey = stack.findValue('top')/>
+    </#if>
+    <#if parameters.listValue??>
+        <#assign itemValue = 
stack.findString(parameters.listValue)?default("")/>
+        <#else>
+            <#assign itemValue = stack.findString('top')/>
+    </#if>
+    <#if parameters.listCssClass??>
+        <#if stack.findString(parameters.listCssClass)??>
+          <#assign itemCssClass= stack.findString(parameters.listCssClass)/>
+        <#else>
+          <#assign itemCssClass = ''/>
+        </#if>
+    </#if>
+    <#if parameters.listCssStyle??>
+        <#if stack.findString(parameters.listCssStyle)??>
+          <#assign itemCssStyle= stack.findString(parameters.listCssStyle)/>
+        <#else>
+          <#assign itemCssStyle = ''/>
+        </#if>
+    </#if>
+    <#if parameters.listTitle??>
+        <#if stack.findString(parameters.listTitle)??>
+          <#assign itemTitle= stack.findString(parameters.listTitle)/>
+        <#else>
+          <#assign itemTitle = ''/>
+        </#if>
+    </#if>
+    <#assign itemKeyStr=itemKey.toString() />
+<input type="checkbox" name="${parameters.name?html}" 
value="${itemKeyStr?html}"<#rt/>
+    <#if parameters.id??>
+       id="${parameters.id?html}-${itemCount}"<#rt/>
+    <#else>
+       id="${parameters.name?html}-${itemCount}"<#rt/>
+    </#if>
+    <#if tag.contains(parameters.nameValue, itemKey)>
+       checked="checked"<#rt/>
+    </#if>
+    <#if parameters.disabled?default(false)>
+       disabled="disabled"<#rt/>
+    </#if>
+    <#if itemCssClass?if_exists != "">
+     class="${itemCssClass?html}"<#rt/>
+    <#else>
+        <#if parameters.cssClass??>
+     class="${parameters.cssClass?html}"<#rt/>
+        </#if>
+    </#if>
+    <#if itemCssStyle?if_exists != "">
+     style="${itemCssStyle?html}"<#rt/>
+    <#else>
+        <#if parameters.cssStyle??>
+     style="${parameters.cssStyle?html}"<#rt/>
+        </#if>
+    </#if>
+    <#if itemTitle?if_exists != "">
+     title="${itemTitle?html}"<#rt/>
+    <#else>
+        <#if parameters.title??>
+     title="${parameters.title?html}"<#rt/>
+        </#if>
+    </#if>
+    <#include "/${parameters.templateDir}/${parameters.expandTheme}/css.ftl" />
+    <#include 
"/${parameters.templateDir}/${parameters.expandTheme}/scripting-events.ftl" />
+    <#include 
"/${parameters.templateDir}/${parameters.expandTheme}/common-attributes.ftl" />
+    <#include 
"/${parameters.templateDir}/${parameters.expandTheme}/dynamic-attributes.ftl" />
+        />
+<label<#rt/> 
+    <#if parameters.id??>
+        for="${parameters.id?html}-${itemCount}"<#rt/>
+    <#else>
+        for="${parameters.name?html}-${itemCount}"<#rt/>
+    </#if>
+        class="checkboxLabel">${itemValue?html}</label>
+</@s.iterator>
+    <#else>
+    &nbsp;
+</#if>
+<input type="hidden" id="__multiselect_${parameters.id?html}" 
name="__multiselect_${parameters.name?html}"
+       value=""<#rt/>
+<#if parameters.disabled?default(false)>
+       disabled="disabled"<#rt/>
+</#if>
+        />

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/combobox.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/combobox.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/combobox.ftl
new file mode 100644
index 0000000..760ad71
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/combobox.ftl
@@ -0,0 +1,103 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<script type="text/javascript">
+       function autoPopulate_${parameters.escapedId?html}(targetElement) {
+               <#if parameters.headerKey?? && parameters.headerValue??>
+               if (targetElement.options[targetElement.selectedIndex].value == 
'${parameters.headerKey?html}') {
+                       return;
+               }
+               </#if>
+               <#if parameters.emptyOption?default(false)>
+               if (targetElement.options[targetElement.selectedIndex].value == 
'') {
+                   return;
+               }
+               </#if>
+               
targetElement.form.elements['${parameters.name?html}'].value=targetElement.options[targetElement.selectedIndex].value;
+       }
+</script>
+<#include "/${parameters.templateDir}/simple/text.ftl" />
+<br />
+<#if parameters.list??>
+<select onChange="autoPopulate_${parameters.escapedId?html}(this);"<#rt/>
+<#include "/${parameters.templateDir}/${parameters.expandTheme}/css.ftl" />
+    <#if parameters.disabled?default(false)>
+ disabled="disabled"<#rt/>
+    </#if>
+>
+       <#if (parameters.headerKey?? && parameters.headerValue??)>
+               <option 
value="${parameters.headerKey?html}">${parameters.headerValue?html}</option>
+       </#if>
+       <#if parameters.emptyOption?default(false)>
+           <option value=""></option>
+       </#if>
+    <@s.iterator value="parameters.list">
+    <#if parameters.listKey??>
+       <#assign tmpListKey = stack.findString(parameters.listKey) />
+    <#else>
+       <#assign tmpListKey = stack.findString('top') />
+    </#if>
+    <#if parameters.listValue??>
+       <#assign tmpListValue = stack.findString(parameters.listValue) />
+    <#else>
+       <#assign tmpListValue = stack.findString('top') />
+    </#if>
+    <#if parameters.listCssClass??>
+        <#if stack.findString(parameters.listCssClass)??>
+          <#assign itemCssClass= stack.findString(parameters.listCssClass)/>
+        <#else>
+          <#assign itemCssClass = ''/>
+        </#if>
+    </#if>
+    <#if parameters.listCssStyle??>
+        <#if stack.findString(parameters.listCssStyle)??>
+          <#assign itemCssStyle= stack.findString(parameters.listCssStyle)/>
+        <#else>
+          <#assign itemCssStyle = ''/>
+        </#if>
+    </#if>
+    <#if parameters.listTitle??>
+        <#if stack.findString(parameters.listTitle)??>
+          <#assign itemTitle= stack.findString(parameters.listTitle)/>
+        <#else>
+          <#assign itemTitle = ''/>
+        </#if>
+    </#if>
+    <option value="${tmpListKey?html}"<#rt/>
+        <#if (parameters.nameValue == tmpListKey)>
+ selected="selected"<#rt/>
+        </#if>
+        <#if itemCssClass?if_exists != "">
+ class="${itemCssClass?html}"<#rt/>
+        </#if>
+        <#if itemCssStyle?if_exists != "">
+ style="${itemCssStyle?html}"<#rt/>
+        </#if>
+        <#if itemTitle?if_exists != "">
+ title="${itemTitle?html}"<#rt/>
+        </#if>
+    ><#t/>
+            ${tmpListValue?html}<#t/>
+    </option><#lt/>
+    </@s.iterator>
+</select>
+</#if>

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/common-attributes.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/common-attributes.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/common-attributes.ftl
new file mode 100644
index 0000000..6056654
--- /dev/null
+++ 
b/themes_override/src/main/webapp/WEB-INF/template/simple/common-attributes.ftl
@@ -0,0 +1,25 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<#if parameters.accesskey??>
+ accesskey="${parameters.accesskey?html}" 
+</#if>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/controlfooter.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/controlfooter.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/controlfooter.ftl
new file mode 100644
index 0000000..32bba27
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/controlfooter.ftl
@@ -0,0 +1,22 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/controlheader.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/controlheader.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/controlheader.ftl
new file mode 100644
index 0000000..32bba27
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/controlheader.ftl
@@ -0,0 +1,22 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/css.ftl
----------------------------------------------------------------------
diff --git a/themes_override/src/main/webapp/WEB-INF/template/simple/css.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/css.ftl
new file mode 100644
index 0000000..6623c1d
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/css.ftl
@@ -0,0 +1,35 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<#assign hasFieldErrors = parameters.name?? && fieldErrors?? && 
fieldErrors[parameters.name]??/>
+<#if parameters.cssClass?? && !(hasFieldErrors && parameters.cssErrorClass??)>
+ class="${parameters.cssClass?html}"<#rt/>
+<#elseif parameters.cssClass?? && (hasFieldErrors && 
parameters.cssErrorClass??)>
+ class="${parameters.cssClass?html} ${parameters.cssErrorClass?html}"<#rt/>
+<#elseif !(parameters.cssClass??) && (hasFieldErrors && 
parameters.cssErrorClass??)>
+ class="${parameters.cssErrorClass?html}"<#rt/>
+</#if>
+<#if parameters.cssStyle?? && !(hasFieldErrors && (parameters.cssErrorStyle?? 
|| parameters.cssErrorClass??))>
+ style="${parameters.cssStyle?html}"<#rt/>
+<#elseif hasFieldErrors && parameters.cssErrorStyle??>
+ style="${parameters.cssErrorStyle?html}"<#rt/>
+</#if>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/debug.ftl
----------------------------------------------------------------------
diff --git a/themes_override/src/main/webapp/WEB-INF/template/simple/debug.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/debug.ftl
new file mode 100644
index 0000000..8b2db3d
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/debug.ftl
@@ -0,0 +1,82 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<script type="text/javascript">
+<!--
+    function toggleDebug(debugId) {
+        var debugDiv = document.getElementById(debugId);
+        if (debugDiv) {
+            var display = debugDiv.style.display;
+            if (display == 'none') {
+                debugDiv.style.display = 'block';
+            } else if (display == 'block') {
+                debugDiv.style.display = 'none';
+            }
+        }
+    }
+-->
+</script>
+<p />
+
+<a href="#" onclick="toggleDebug('<#if parameters.id?if_exists != 
"">${parameters.id?html}<#else>debug</#if>');return false;">[Debug]</a>
+<div style="display:none" id="<#if parameters.id?if_exists != 
"">${parameters.id?html}<#else>debug</#if>">
+<h2>Struts ValueStack Debug</h2>
+<p />
+
+<h3>Value Stack Contents</h3>
+<table border="0" cellpadding="2" cellspacing="0" bgcolor="#DDDDDD">
+    <tr><th>Object</th><th>Property Name</th><th>Property Value</th></tr>
+
+    <#assign index=1>
+    <#list parameters.stackValues as stackObject>
+    <tr>
+        <td rowspan="${stackObject.value.size()}">${stackObject.key}</td>
+
+        <#assign renderRow=false>
+        <#list stackObject.value.keySet() as propertyName>
+            <#if renderRow==true></tr><tr><#else> <#assign renderRow=false> 
</#if>
+            <td bgcolor="<#if (index % 2) == 
0>#BBBBBB<#else>#CCCCCC</#if>">${propertyName}</td>
+            <td bgcolor="<#if (index % 2) == 
0>#BBBBBB<#else>#CCCCCC</#if>"><#if 
stackObject.value.get(propertyName)??>${stackObject.value.get(propertyName).toString()?html}<#else>null</#if></td>
+    </tr>
+            <#assign index= index + 1>
+        </#list>
+    </#list>
+</table>
+<p />
+
+<h3>Stack Context</h3>
+<i>These items are available using the #key notation</i>
+<table border="0" cellpadding="2" cellspacing="0" bgcolor="#DDDDDD">
+    <tr>
+        <th>Key</th><th>Value</th>
+    </tr>
+
+    <#assign index=1>
+    <#list stack.context.keySet() as contextKey>
+    <tr bgcolor="<#if (index % 2) == 0>#BBBBBB<#else>#CCCCCC</#if>">
+        <td>${contextKey}</td>
+        <td><#if 
stack.context.get(contextKey)??>${struts.toStringSafe(stack.context.get(contextKey))?html}<#else>null</#if></td>
+    </tr>
+        <#assign index= index + 1>
+    </#list>
+</table>
+</div>

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/div-close.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/div-close.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/div-close.ftl
new file mode 100644
index 0000000..1957b64
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/div-close.ftl
@@ -0,0 +1,23 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/div.ftl
----------------------------------------------------------------------
diff --git a/themes_override/src/main/webapp/WEB-INF/template/simple/div.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/div.ftl
new file mode 100644
index 0000000..5c9365a
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/div.ftl
@@ -0,0 +1,32 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<div<#rt/>
+<#if parameters.id??> id="${parameters.id?html}"<#rt/></#if>
+<#if parameters.name??> name="${parameters.name?html}"<#rt/></#if>
+<#if parameters.cssClass??> class="${parameters.cssClass?html}"<#rt/></#if>
+<#if parameters.cssStyle??> style="${parameters.cssStyle?html}"<#rt/></#if>
+<#if parameters.title??> title="${parameters.title?html}"<#rt/></#if>
+<#include 
"/${parameters.templateDir}/${parameters.expandTheme}/scripting-events.ftl" />
+<#include 
"/${parameters.templateDir}/${parameters.expandTheme}/common-attributes.ftl" />
+<#include 
"/${parameters.templateDir}/${parameters.expandTheme}/dynamic-attributes.ftl" />
+>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/doubleselect.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/doubleselect.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/doubleselect.ftl
new file mode 100644
index 0000000..8880377
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/doubleselect.ftl
@@ -0,0 +1,198 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<#include "/${parameters.templateDir}/simple/select.ftl" />
+<#assign startCount = 0/>
+<#if parameters.headerKey?? && parameters.headerValue??>
+    <#assign startCount = startCount + 1/>
+</#if>
+<#if parameters.emptyOption??>
+    <#assign startCount = startCount + 1/>
+</#if>
+
+<br/>
+<select<#rt/>
+        name="${parameters.doubleName?default("")?html}"<#rt/>
+<#if parameters.disabled?default(false)>
+        disabled="disabled"<#rt/>
+</#if>
+<#if parameters.doubleTabindex??>
+        tabindex="${parameters.doubleTabindex?html}"<#rt/>
+</#if>
+<#if parameters.doubleId??>
+        id="${parameters.doubleId?html}"<#rt/>
+</#if>
+<#if parameters.doubleCss??>
+        class="${parameters.doubleCss?html}"<#rt/>
+</#if>
+<#if parameters.doubleStyle??>
+        style="${parameters.doubleStyle?html}"<#rt/>
+</#if>
+<#if parameters.title??>
+        title="${parameters.title?html}"<#rt/>
+</#if>
+<#if parameters.multiple?default(false)>
+        multiple="multiple"<#rt/>
+</#if>
+<#if parameters.get("doubleSize")??>
+        size="${parameters.get("doubleSize")?html}"<#rt/>
+</#if>
+<#if parameters.doubleMultiple?default(false)>
+        multiple="multiple"<#rt/>
+</#if>
+<#if parameters.doubleDisabled?default(false)>
+        disabled="disabled"<#rt/>
+</#if>
+        >
+</select>
+<#if parameters.doubleMultiple?default(false)>
+<input type="hidden" id="__multiselect_${parameters.doubleId?html}"
+       name="__multiselect_${parameters.doubleName?default("")?html}" 
value=""<#rt/>
+    <#if parameters.doubleDisabled?default(false)>
+       disabled="disabled"<#rt/>
+    </#if>
+        />
+</#if>
+<script type="text/javascript">
+    <#assign itemCount = startCount/>
+    var ${parameters.id}Group = new Array(${parameters.listSize} + 
${startCount});
+    for (i = 0; i < (${parameters.listSize} + ${startCount}); i++)
+        ${parameters.id}Group[i] = new Array();
+
+    <@s.iterator value="parameters.list">
+        <#if parameters.listKey??>
+            <#assign itemKey = stack.findValue(parameters.listKey)/>
+            <#else>
+                <#assign itemKey = stack.findValue('top')/>
+        </#if>
+        <#if parameters.listValue??>
+            <#assign itemValue = stack.findString(parameters.listValue)/>
+            <#else>
+                <#assign itemValue = stack.findString('top')/>
+        </#if>
+        <#assign doubleItemCount = 0/>
+        <#if parameters.doubleHeaderKey?? && parameters.doubleHeaderValue??>
+        ${parameters.id}Group[${itemCount}][${doubleItemCount}] = new 
Option("${doubleHeaderValue?js_string}", "${doubleHeaderKey?js_string}");
+            <#assign doubleItemCount = doubleItemCount + 1/>
+        </#if>
+        <#if parameters.doubleEmptyOption??>
+        ${parameters.id}Group[${itemCount}][${doubleItemCount}] = new 
Option("", "");
+            <#assign doubleItemCount = doubleItemCount + 1/>
+        </#if>
+    <@s.iterator value="${parameters.doubleList}">
+        <#if parameters.doubleListKey??>
+            <#assign doubleItemKey = 
stack.findValue(parameters.doubleListKey)/>
+            <#else>
+                <#assign doubleItemKey = stack.findValue('top')/>
+        </#if>
+        <#assign doubleItemKeyStr = doubleItemKey.toString() />
+        <#if parameters.doubleListValue??>
+            <#assign doubleItemValue = 
stack.findString(parameters.doubleListValue)/>
+            <#else>
+                <#assign doubleItemValue = stack.findString('top')/>
+        </#if>
+        <#if parameters.doubleListCssClass??>
+            <#if stack.findString(parameters.doubleListCssClass)??>
+              <#assign itemDoubleCssClass= 
stack.findString(parameters.doubleListCssClass)/>
+            <#else>
+              <#assign itemDoubleCssClass = ''/>
+            </#if>
+        </#if>
+        <#if parameters.doubleListCssStyle??>
+            <#if stack.findString(parameters.doubleListCssStyle)??>
+              <#assign itemDoubleCssStyle= 
stack.findString(parameters.doubleListCssStyle)/>
+            <#else>
+              <#assign itemDoubleCssStyle = ''/>
+            </#if>
+        </#if>
+        <#if parameters.doubleListTitle??>
+            <#if stack.findString(parameters.doubleListTitle)??>
+              <#assign itemDoubleTitle= 
stack.findString(parameters.doubleListTitle)/>
+            <#else>
+              <#assign itemDoubleTitle = ''/>
+            </#if>
+        </#if>
+    ${parameters.id}Group[${itemCount}][${doubleItemCount}] = new 
Option("${doubleItemValue?js_string}", "${doubleItemKeyStr?js_string}");
+        <#if itemDoubleCssClass?if_exists != "">
+    
${parameters.id}Group[${itemCount}][${doubleItemCount}].setAttribute("class","${itemDoubleCssClass?html}");
+        </#if>
+        <#if itemDoubleCssStyle?if_exists != "">
+        
${parameters.id}Group[${itemCount}][${doubleItemCount}].setAttribute("style","${itemDoubleCssStyle?html}");
+        </#if>
+        <#if itemDoubleTitle?if_exists != "">
+        
${parameters.id}Group[${itemCount}][${doubleItemCount}].setAttribute("title","${itemDoubleTitle?html}");
+        </#if>
+
+        <#assign doubleItemCount = doubleItemCount + 1/>
+    </@s.iterator>
+        <#assign itemCount = itemCount + 1/>
+    </@s.iterator>
+
+    var ${parameters.id}Temp = 
document.${parameters.formName}.${parameters.doubleId};
+    <#assign itemCount = startCount/>
+    <#assign redirectTo = 0/>
+    <@s.iterator value="parameters.list">
+        <#if parameters.listKey??>
+            <#assign itemKey = stack.findValue(parameters.listKey)/>
+            <#else>
+                <#assign itemKey = stack.findValue('top')/>
+        </#if>
+        <#if tag.contains(parameters.nameValue, itemKey)>
+            <#assign redirectTo = itemCount/>
+        </#if>
+        <#assign itemCount = itemCount + 1/>
+    </@s.iterator>
+    ${parameters.id}Redirect(${redirectTo});
+    function ${parameters.id}Redirect(x) {
+        var selected = false;
+        for (m = ${parameters.id}Temp.options.length - 1; m >= 0; m--) {
+            ${parameters.id}Temp.remove(m);
+        }
+
+        for (i = 0; i < ${parameters.id}Group[x].length; i++) {
+            ${parameters.id}Temp.options[i] = new 
Option(${parameters.id}Group[x][i].text, ${parameters.id}Group[x][i].value);
+        <#if parameters.doubleNameValue?exists>
+            <#if parameters.doubleMultiple?exists>
+                for (j = 0; j < ${parameters.doubleNameValue}.
+                length;
+                j++
+            )
+                {
+                    if (${parameters.id}Temp.options[i].value == 
${parameters.doubleNameValue?js_string}[j]) {
+                        ${parameters.id}Temp.options[i].selected = true;
+                        selected = true;
+                    }
+                }
+                <#else>
+                    if (${parameters.id}Temp.options[i].value == 
'${parameters.doubleNameValue?js_string}') {
+                        ${parameters.id}Temp.options[i].selected = true;
+                        selected = true;
+                    }
+            </#if>
+        </#if>
+        }
+
+        if ((${parameters.id}Temp.options.length > 0) && (! selected)) {
+            ${parameters.id}Temp.options[0].selected = true;
+        }
+    }
+</script>

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/dynamic-attributes.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/dynamic-attributes.ftl
 
b/themes_override/src/main/webapp/WEB-INF/template/simple/dynamic-attributes.ftl
new file mode 100644
index 0000000..485c20c
--- /dev/null
+++ 
b/themes_override/src/main/webapp/WEB-INF/template/simple/dynamic-attributes.ftl
@@ -0,0 +1,34 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<#if (parameters.dynamicAttributes?? && parameters.dynamicAttributes?size > 
0)><#rt/>
+<#assign aKeys = parameters.dynamicAttributes.keySet()><#rt/>
+<#list aKeys as aKey><#rt/>
+  <#assign keyValue = parameters.dynamicAttributes[aKey]/>
+  <#if keyValue?is_string>
+      <#assign value = struts.translateVariables(keyValue)!keyValue/>
+  <#else>
+      <#assign value = keyValue?string/>
+  </#if>
+ ${aKey}="${value?html}"<#rt/>
+</#list><#rt/>
+</#if><#rt/>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/empty.ftl
----------------------------------------------------------------------
diff --git a/themes_override/src/main/webapp/WEB-INF/template/simple/empty.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/empty.ftl
new file mode 100644
index 0000000..32bba27
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/empty.ftl
@@ -0,0 +1,22 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/fielderror.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/fielderror.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/fielderror.ftl
new file mode 100644
index 0000000..a37ff1f
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/fielderror.ftl
@@ -0,0 +1,82 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<#if fieldErrors??><#t/>
+    <#assign eKeys = fieldErrors.keySet()><#t/>
+    <#assign eKeysSize = eKeys.size()><#t/>
+    <#assign doneStartUlTag=false><#t/>
+    <#assign doneEndUlTag=false><#t/>
+    <#assign haveMatchedErrorField=false><#t/>
+    <#if (fieldErrorFieldNames?size > 0) ><#t/>
+        <#list fieldErrorFieldNames as fieldErrorFieldName><#t/>
+            <#list eKeys as eKey><#t/>
+                <#if (eKey = fieldErrorFieldName)><#t/>
+                    <#assign haveMatchedErrorField=true><#t/>
+                    <#assign eValue = fieldErrors[fieldErrorFieldName]><#t/>
+                    <#if (haveMatchedErrorField && (!doneStartUlTag))><#t/>
+                    <ul<#rt/>
+                        <#if parameters.id?if_exists != "">
+                                id="${parameters.id?html}"<#rt/>
+                        </#if>
+                        <#if parameters.cssClass??>
+                                class="${parameters.cssClass?html}"<#rt/>
+                            <#else>
+                                class="errorMessage"<#rt/>
+                        </#if>
+                        <#if parameters.cssStyle??>
+                                style="${parameters.cssStyle?html}"<#rt/>
+                        </#if>
+                            >
+                        <#assign doneStartUlTag=true><#t/>
+                    </#if><#t/>
+                    <#list eValue as eEachValue><#t/>
+                        <li><span><#if 
parameters.escape>${eEachValue!?html}<#else>${eEachValue!}</#if></span></li>
+                    </#list><#t/>
+                </#if><#t/>
+            </#list><#t/>
+        </#list><#t/>
+        <#if (haveMatchedErrorField && (!doneEndUlTag))><#t/>
+        </ul>
+            <#assign doneEndUlTag=true><#t/>
+        </#if><#t/>
+        <#else><#t/>
+        <#if (eKeysSize > 0)><#t/>
+        <ul<#rt/>
+            <#if parameters.cssClass??>
+                    class="${parameters.cssClass?html}"<#rt/>
+                <#else>
+                    class="errorMessage"<#rt/>
+            </#if>
+            <#if parameters.cssStyle??>
+                    style="${parameters.cssStyle?html}"<#rt/>
+            </#if>
+                >
+            <#list eKeys as eKey><#t/>
+                <#assign eValue = fieldErrors[eKey]><#t/>
+                <#list eValue as eEachValue><#t/>
+                    <li><span><#if 
parameters.escape>${eEachValue!?html}<#else>${eEachValue!}</#if></span></li>
+                </#list><#t/>
+            </#list><#t/>
+        </ul>
+        </#if><#t/>
+    </#if><#t/>
+</#if><#t/>

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/file.ftl
----------------------------------------------------------------------
diff --git a/themes_override/src/main/webapp/WEB-INF/template/simple/file.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/file.ftl
new file mode 100644
index 0000000..c7b7a83
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/file.ftl
@@ -0,0 +1,48 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<input type="file"<#rt/>
+ name="${parameters.name?default("")?html}"<#rt/>
+<#if parameters.get("size")??>
+ size="${parameters.get("size")?html}"<#rt/>
+</#if>
+ value=""<#rt/>
+<#if parameters.disabled?default(false)>
+ disabled="disabled"<#rt/>
+</#if>
+<#if parameters.accept??>
+ accept="${parameters.accept?html}"<#rt/>
+</#if>
+<#if parameters.tabindex??>
+ tabindex="${parameters.tabindex?html}"<#rt/>
+</#if>
+<#if parameters.id??>
+ id="${parameters.id?html}"<#rt/>
+</#if>
+<#include "/${parameters.templateDir}/${parameters.expandTheme}/css.ftl" />
+<#if parameters.title??>
+ title="${parameters.title?html}"<#rt/>
+</#if>
+<#include 
"/${parameters.templateDir}/${parameters.expandTheme}/scripting-events.ftl" />
+<#include 
"/${parameters.templateDir}/${parameters.expandTheme}/common-attributes.ftl" />
+<#include 
"/${parameters.templateDir}/${parameters.expandTheme}/dynamic-attributes.ftl" />
+/>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/form-close.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/form-close.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/form-close.ftl
new file mode 100644
index 0000000..360eef9
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/form-close.ftl
@@ -0,0 +1,113 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+</form>
+
+<#if (parameters.customOnsubmitEnabled?if_exists)>
+<script type="text/javascript">
+<#-- 
+  Enable auto-select of optiontransferselect tag's entries upon containing 
form's 
+  submission.
+-->
+<#if (parameters.optiontransferselectIds?if_exists?size > 0)>
+       var containingForm = document.getElementById("${parameters.id}");
+       <#assign selectObjIds = parameters.optiontransferselectIds.keySet() />
+       <#list selectObjIds as selectObjectId>
+               StrutsUtils.addEventListener(containingForm, "submit", 
+                       function(evt) {
+                               var selectObj = 
document.getElementById("${selectObjectId}");
+                               <#if 
parameters.optiontransferselectIds.get(selectObjectId)??>
+                                       <#assign selectTagHeaderKey = 
parameters.optiontransferselectIds.get(selectObjectId)/>
+                                       selectAllOptionsExceptSome(selectObj, 
"key", "${selectTagHeaderKey}");
+                               <#else>
+                                       selectAllOptionsExceptSome(selectObj, 
"key", "");
+                               </#if>
+                       }, true);
+       </#list>
+</#if>
+<#if (parameters.inputtransferselectIds?if_exists?size > 0)>
+       var containingForm = document.getElementById("${parameters.id}");
+       <#assign selectObjIds = parameters.inputtransferselectIds.keySet() />
+       <#list selectObjIds as selectObjectId>
+               StrutsUtils.addEventListener(containingForm, "submit",
+                       function(evt) {
+                               var selectObj = 
document.getElementById("${selectObjectId}");
+                               <#if 
parameters.inputtransferselectIds.get(selectObjectId)??>
+                                       <#assign selectTagHeaderKey = 
parameters.inputtransferselectIds.get(selectObjectId)/>
+                                       selectAllOptionsExceptSome(selectObj, 
"key", "${selectTagHeaderKey}");
+                               <#else>
+                                       selectAllOptionsExceptSome(selectObj, 
"key", "");
+                               </#if>
+                       }, true);
+       </#list>
+</#if>
+<#if (parameters.optiontransferselectDoubleIds?if_exists?size > 0)>
+       var containingForm = document.getElementById("${parameters.id}");
+       <#assign selectDoubleObjIds = 
parameters.optiontransferselectDoubleIds.keySet() />
+       <#list selectDoubleObjIds as selectObjId>
+               StrutsUtils.addEventListener(containingForm, "submit", 
+                       function(evt) {
+                               var selectObj = 
document.getElementById("${selectObjId}");
+                               <#if 
parameters.optiontransferselectDoubleIds.get(selectObjId)??>
+                                       <#assign selectTagHeaderKey = 
parameters.optiontransferselectDoubleIds.get(selectObjId)/>
+                                       selectAllOptionsExceptSome(selectObj, 
"key", "${selectTagHeaderKey}");
+                               <#else>
+                                       selectAllOptionsExceptSome(selectObj, 
"key", "");
+                               </#if>
+                       }, true);
+       </#list>
+</#if>
+
+
+<#--
+       Enable auto-select of all elements of updownselect tag upon its 
containing form
+       submission
+-->
+<#if (parameters.updownselectIds?if_exists?size > 0)>
+       var containingForm = document.getElementById("${parameters.id}");
+       <#assign tmpIds = parameters.updownselectIds.keySet() />
+       <#list tmpIds as tmpId>
+               StrutsUtils.addEventListener(containingForm, "submit", 
+                       function(evt) {
+                               var updownselectObj = 
document.getElementById("${tmpId}");
+                               <#if parameters.updownselectIds.get(tmpId)??>
+                                       <#assign tmpHeaderKey = 
parameters.updownselectIds.get(tmpId) />
+                                       
selectAllOptionsExceptSome(updownselectObj, "key", "${tmpHeaderKey}");
+                               <#else>
+                                       
selectAllOptionsExceptSome(updownselectObj, "key", "");
+                               </#if>
+                       }, true);
+       </#list>
+</#if>
+</script>
+</#if>
+
+
+<#-- 
+ Code that will add javascript needed for tooltips
+--><#t/>
+<#if (parameters.hasTooltip?default(false))><#t/>
+       <#lt/><!-- javascript that is needed for tooltips -->
+       <#lt/><script type="text/javascript" src='<@s.url 
value="/struts/domTT.js" includeParams="none" encode="false" />'></script>
+       <#lt/><link rel="stylesheet" type="text/css" href="<@s.url 
value="/struts/domTT.css" includeParams="none" encode="false" />"/>
+       
+</#if><#t/>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/form-common.ftl
----------------------------------------------------------------------
diff --git 
a/themes_override/src/main/webapp/WEB-INF/template/simple/form-common.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/form-common.ftl
new file mode 100644
index 0000000..9b46381
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/form-common.ftl
@@ -0,0 +1,67 @@
+<#--
+/*
+ * $Id: form.ftl 590812 2007-10-31 20:32:54Z apetrelli $
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<#if (parameters.validate?default(false) == false)><#rt/>
+    <#if parameters.onsubmit??><#rt/>
+        ${tag.addParameter('onsubmit', "${parameters.onsubmit}") }
+    </#if>
+</#if>
+<form<#rt/>
+<#if parameters.id??>
+ id="${parameters.id?html}"<#rt/>
+</#if>
+<#if parameters.name??>
+ name="${parameters.name?html}"<#rt/>
+</#if>
+<#if parameters.onsubmit??>
+ onsubmit="${parameters.onsubmit?html}"<#rt/>
+</#if>
+<#if parameters.onreset??>
+ onreset="${parameters.onreset?html}"<#rt/>
+</#if>
+<#if parameters.action??>
+ action="${parameters.action?html}"<#rt/>
+</#if>
+<#if parameters.target??>
+ target="${parameters.target?html}"<#rt/>
+</#if>
+<#if parameters.method??>
+ method="${parameters.method?html}"<#rt/>
+<#else>
+ method="post"<#rt/>
+</#if>
+<#if parameters.enctype??>
+ enctype="${parameters.enctype?html}"<#rt/>
+</#if>
+<#if parameters.cssClass??>
+ class="${parameters.cssClass?html}"<#rt/>
+</#if>
+<#if parameters.cssStyle??>
+ style="${parameters.cssStyle?html}"<#rt/>
+</#if>
+<#if parameters.title??>
+ title="${parameters.title?html}"<#rt/>
+</#if>
+<#if parameters.acceptcharset??>
+ accept-charset="${parameters.acceptcharset?html}"<#rt/>
+</#if>
+<#include 
"/${parameters.templateDir}/${parameters.expandTheme}/dynamic-attributes.ftl" />
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-examples/blob/111b1a7c/themes_override/src/main/webapp/WEB-INF/template/simple/form.ftl
----------------------------------------------------------------------
diff --git a/themes_override/src/main/webapp/WEB-INF/template/simple/form.ftl 
b/themes_override/src/main/webapp/WEB-INF/template/simple/form.ftl
new file mode 100644
index 0000000..f02eea9
--- /dev/null
+++ b/themes_override/src/main/webapp/WEB-INF/template/simple/form.ftl
@@ -0,0 +1,27 @@
+<#--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<#include 
"/${parameters.templateDir}/${parameters.expandTheme}/form-common.ftl" />
+<#if parameters.onreset??>
+ onreset="${parameters.onreset?html}"<#rt/>
+</#if>
+>

Reply via email to