roller-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From snoopd...@apache.org
Subject [24/24] roller git commit: Merge branch 'roller-5.2.0' into bootstrap-ui
Date Sun, 08 Oct 2017 17:33:17 GMT
Merge branch 'roller-5.2.0' into bootstrap-ui

# Conflicts:
#	README.md
#	app/pom.xml
#	app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java
#	app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java
#	app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp
#	app/src/main/webapp/WEB-INF/jsps/core/CreateWeblog.jsp
#	app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp
#	app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp
#	app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp
#	app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp
#	app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp
#	app/src/main/webapp/WEB-INF/jsps/editor/MediaFileSidebar.jsp
#	app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp
#	app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp


Project: http://git-wip-us.apache.org/repos/asf/roller/repo
Commit: http://git-wip-us.apache.org/repos/asf/roller/commit/129af05a
Tree: http://git-wip-us.apache.org/repos/asf/roller/tree/129af05a
Diff: http://git-wip-us.apache.org/repos/asf/roller/diff/129af05a

Branch: refs/heads/bootstrap-ui
Commit: 129af05ac3db7a5cc4951bfbe650bc0cf8974f85
Parents: a175b0d 6173b33
Author: Dave Johnson <snoopdave@gmail.com>
Authored: Sun Oct 8 13:32:48 2017 -0400
Committer: Dave Johnson <snoopdave@gmail.com>
Committed: Sun Oct 8 13:32:48 2017 -0400

----------------------------------------------------------------------
 .gitignore                                      |   2 +-
 NOTICE.txt                                      |   2 +-
 README.md                                       |  54 +++-
 app/pom.xml                                     | 318 +++++++++++--------
 .../weblogger/planet/ui/PlanetConfig.java       |   2 +
 .../weblogger/planet/ui/PlanetGroups.java       |   2 +
 .../planet/ui/PlanetSubscriptions.java          |   2 +
 .../roller/weblogger/ui/core/RollerContext.java | 154 ++++-----
 .../weblogger/ui/struts2/admin/CacheInfo.java   |   2 +
 .../struts2/admin/GlobalCommentManagement.java  |   2 +
 .../ui/struts2/admin/GlobalConfig.java          |   2 +
 .../ui/struts2/admin/PingTargetEdit.java        |   2 +
 .../weblogger/ui/struts2/admin/PingTargets.java |   2 +
 .../weblogger/ui/struts2/admin/UserAdmin.java   |   2 +
 .../weblogger/ui/struts2/admin/UserEdit.java    |   2 +
 .../weblogger/ui/struts2/core/CreateWeblog.java |   2 +
 .../weblogger/ui/struts2/core/Install.java      |   2 +
 .../roller/weblogger/ui/struts2/core/Login.java |   2 +
 .../weblogger/ui/struts2/core/MainMenu.java     |   2 +
 .../ui/struts2/core/OAuthAuthorize.java         |   2 +
 .../weblogger/ui/struts2/core/OAuthKeys.java    |   2 +
 .../weblogger/ui/struts2/core/Profile.java      |   2 +
 .../weblogger/ui/struts2/core/Register.java     |   2 +
 .../roller/weblogger/ui/struts2/core/Setup.java |   2 +
 .../ui/struts2/editor/BookmarkEdit.java         |   5 +-
 .../weblogger/ui/struts2/editor/Bookmarks.java  |   2 +
 .../ui/struts2/editor/BookmarksImport.java      |   2 +
 .../weblogger/ui/struts2/editor/Categories.java |   2 +
 .../ui/struts2/editor/CategoryEdit.java         |   2 +
 .../ui/struts2/editor/CategoryRemove.java       |   2 +
 .../weblogger/ui/struts2/editor/Comments.java   |   2 +
 .../weblogger/ui/struts2/editor/Entries.java    |   2 +
 .../struts2/editor/EntryAddWithMediaFile.java   |   2 +
 .../weblogger/ui/struts2/editor/EntryEdit.java  |   2 +
 .../ui/struts2/editor/EntryRemove.java          |   2 +
 .../weblogger/ui/struts2/editor/FolderEdit.java |   4 +-
 .../ui/struts2/editor/Maintenance.java          |   2 +
 .../ui/struts2/editor/MediaFileAdd.java         |   2 +
 .../ui/struts2/editor/MediaFileEdit.java        |   2 +
 .../struts2/editor/MediaFileImageChooser.java   |   2 +
 .../ui/struts2/editor/MediaFileImageDim.java    |   2 +
 .../ui/struts2/editor/MediaFileView.java        |   2 +
 .../ui/struts2/editor/MemberResign.java         |   2 +
 .../weblogger/ui/struts2/editor/Members.java    |   2 +
 .../ui/struts2/editor/MembersInvite.java        |   2 +
 .../weblogger/ui/struts2/editor/Pings.java      |   2 +
 .../ui/struts2/editor/StylesheetEdit.java       |   2 +
 .../ui/struts2/editor/TemplateEdit.java         |   2 +
 .../ui/struts2/editor/TemplateRemove.java       |   2 +
 .../weblogger/ui/struts2/editor/Templates.java  |   2 +
 .../ui/struts2/editor/TemplatesRemove.java      |   2 +
 .../weblogger/ui/struts2/editor/ThemeEdit.java  |   2 +
 .../ui/struts2/editor/WeblogConfig.java         |   2 +
 .../ui/struts2/editor/WeblogRemove.java         |   2 +
 .../roller/weblogger/util/PasswordUtility.java  |   2 +-
 app/src/main/resources/log4j2.xml               |  32 ++
 .../roller/weblogger/config/roller.properties   |   2 +-
 .../main/resources/sql/510-to-520-migration.vm  |   2 +-
 app/src/main/resources/struts.xml               | 223 ++++++++-----
 .../webapp/WEB-INF/jsps/admin/CacheInfo.jsp     |   4 +-
 .../webapp/WEB-INF/jsps/admin/GlobalConfig.jsp  |   4 +-
 .../webapp/WEB-INF/jsps/admin/PingTargets.jsp   |   2 +-
 .../webapp/WEB-INF/jsps/admin/PlanetConfig.jsp  |   4 +-
 .../webapp/WEB-INF/jsps/admin/PlanetGroups.jsp  |   2 +-
 .../WEB-INF/jsps/admin/PlanetSubscriptions.jsp  |   4 +-
 .../webapp/WEB-INF/jsps/admin/UserAdmin.jsp     |   2 +-
 .../main/webapp/WEB-INF/jsps/admin/UserEdit.jsp |   8 +-
 .../main/webapp/WEB-INF/jsps/core/MainMenu.jsp  |  30 +-
 .../webapp/WEB-INF/jsps/editor/Bookmarks.jsp    |   6 +-
 .../webapp/WEB-INF/jsps/editor/Categories.jsp   |   8 +-
 .../webapp/WEB-INF/jsps/editor/Comments.jsp     |   3 +-
 .../main/webapp/WEB-INF/jsps/editor/Entries.jsp |   2 +-
 .../webapp/WEB-INF/jsps/editor/EntryEdit.jsp    |   2 +-
 .../webapp/WEB-INF/jsps/editor/EntrySidebar.jsp |  18 +-
 .../WEB-INF/jsps/editor/MediaFileAddSuccess.jsp |   4 +-
 .../WEB-INF/jsps/editor/MediaFileEdit.jsp       |  23 +-
 .../jsps/editor/MediaFileImageChooser.jsp       |   6 +-
 .../WEB-INF/jsps/editor/MediaFileSidebar.jsp    |   2 +-
 .../WEB-INF/jsps/editor/MediaFileView.jsp       |   4 +-
 .../WEB-INF/jsps/editor/MediaFileViewLight.jsp  |   4 +-
 .../main/webapp/WEB-INF/jsps/editor/Members.jsp |   2 +-
 .../WEB-INF/jsps/editor/MembersSidebar.jsp      |   2 +-
 .../main/webapp/WEB-INF/jsps/editor/Pings.jsp   |   2 +-
 .../webapp/WEB-INF/jsps/editor/Templates.jsp    |   2 +-
 .../WEB-INF/jsps/editor/TemplatesRemove.jsp     |   2 +-
 .../webapp/WEB-INF/jsps/taglibs-struts2.jsp     |   4 +
 app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp |   3 +-
 .../main/webapp/WEB-INF/jsps/tiles/messages.jsp |  10 +-
 .../WEB-INF/jsps/tiles/tiles-tabbedpage.jsp     |   2 +-
 app/src/main/webapp/WEB-INF/web.xml             |   9 +-
 assembly-release/pom.xml                        |   4 +-
 assembly-release/sign-release.sh                |  12 +-
 assembly-release/src/main/assembly/standard.xml |   2 +-
 .../groovy/examples/rollerapi/createtestdata.gy |  34 +-
 .../scripting/groovy/examples/rollerapi/groovy  |  14 +-
 .../groovy/examples/rollerapi/listusers.gy      |   8 +-
 .../examples/rollerapi/roller-custom.properties |   8 +-
 docs/roller-install-guide.odt                   | Bin 1623069 -> 1618019 bytes
 docs/roller-template-guide.odt                  | Bin 245040 -> 238805 bytes
 docs/roller-user-guide.odt                      | Bin 2744390 -> 2740075 bytes
 it-selenium/pom.xml                             |  44 ++-
 .../roller/selenium/AbstractRollerPage.java     |  29 +-
 .../roller/selenium/InitialLoginTestIT.java     |   5 +-
 .../roller/selenium/core/CreateWeblogPage.java  |   4 +-
 .../apache/roller/selenium/core/LoginPage.java  |   4 +-
 .../roller/selenium/core/MainMenuPage.java      |   6 +-
 .../roller/selenium/core/RegisterPage.java      |  13 +-
 .../apache/roller/selenium/core/SetupPage.java  |   9 +-
 .../roller/selenium/core/WelcomePage.java       |   5 +-
 .../roller/selenium/editor/EntryAddPage.java    |   3 +-
 .../roller/selenium/editor/EntryEditPage.java   |   3 +-
 .../roller/selenium/view/BlogHomePage.java      |   3 +-
 .../selenium/view/SingleBlogEntryPage.java      |   2 +-
 .../test/resources/roller-jettyrun.properties   |   2 +-
 pom.xml                                         |  28 +-
 115 files changed, 865 insertions(+), 451 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/README.md
----------------------------------------------------------------------
diff --cc README.md
index 97ef69e,0953102..19f2f68
--- a/README.md
+++ b/README.md
@@@ -1,17 -1,54 +1,69 @@@
 -# Apache Roller
 +Rollarcus: bootstrap-ui branch
 +===
 +
 +This branch __bootstrap-ui__ re-writes the Roller editor/admin user-interface (UI) using Bootstrap.
 +
 +Status
 +---
 +The Edit-Entry and Entries pages have been converted over and you can see screen-shots of what they look like below. 
 +
 +That's all
 +---
 +Want to contribute? Shoot me a PR.
 +
 +Screen-shots
 +---
- You can find some screenshots of the work so far on Flickr: 
++
++You can find some screenshots of the work so far on Flickr:
 +[Roller UI with Bootstrap](https://www.flickr.com/photos/snoopdave/albums/72157666773620323)
++
++
++# A Branch of Apache Roller
+ 
+ [Apache Roller](http://roller.apache.org) is a Java-based, full-featured,
+ multi-user and group-blog server suitable for blog sites large and small.
+ Roller is typically run with Apache Tomcat and MySQL.
+ Roller is made up of the following Maven projects:
+ 
+ * _roller-project_:         Top level project
+ * _app_:                    Roller Weblogger webapp, JSP pages, Velocity templates
+ * _assembly-release_:       Used to create official distributions of Roller
+ * _docs_:                   Roller documentation in ODT format
+ * _it-selenium_:            Integrated browser tests for Roller using Selenium
+ 
+ ## Documentation
+ 
+ The Roller Install, User and Template Guides are available in ODT format
+ (for OpenOffice or LibraOffice):
+ 
+ * https://github.com/apache/roller/tree/master/docs
+ 
+ ## For more information
+ 
+ Hit the Roller Confluence wiki:
+ 
+ * How to build and run Roller: https://cwiki.apache.org/confluence/x/EM4
+ * How to contribute to Roller: https://cwiki.apache.org/confluence/x/2hsB
+ * How to make a release of Roller: https://cwiki.apache.org/confluence/x/gycB
+ * Other developer resources: https://cwiki.apache.org/confluence/x/D84
+ 
+ ## Quick start
+ 
+ Assuming you've got a UNIX shell, Java, Maven and Git:
+ 
+ Get the code:
+ 
+     $ git clone https://github.com/apache/roller.git
+ 
+ Build and test the code:
+ 
+     $ cd roller
+     $ mvn clean install
+ 
+ Run Roller in Jetty with Derby database:
+ 
+     $ cd app
+     $ mvn jetty:run
+ 
+ Browse to http://localhost:8080/roller
+ 
 -
 -
 -
 -
 -

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/pom.xml
----------------------------------------------------------------------
diff --cc app/pom.xml
index ab06f3d,1875d32..f762d6d
--- a/app/pom.xml
+++ b/app/pom.xml
@@@ -262,23 -351,17 +351,22 @@@ limitations under the License
          </dependency>
  
          <dependency>
 -            <groupId>com.rometools</groupId>
 -            <artifactId>rome-fetcher</artifactId>
 -            <version>${rome.version}</version>
 -            <scope>compile</scope>
 +            <groupId>com.jgeppert.struts2.bootstrap</groupId>
 +            <artifactId>struts2-bootstrap-plugin</artifactId>
 +            <version>2.0.3</version>
 +        </dependency>
 +
 +        <dependency>
 +            <groupId>xml-security</groupId>
 +            <artifactId>xmlsec</artifactId>
 +            <version>1.3.0</version>
          </dependency>
  
-         <!-- Java EE deps -->
- 
          <dependency>
-             <groupId>javax.servlet</groupId>
-             <artifactId>jstl</artifactId>
-             <version>1.2</version>
+             <groupId>com.rometools</groupId>
+             <artifactId>rome-fetcher</artifactId>
+             <version>${rome.version}</version>
+             <scope>compile</scope>
          </dependency>
  
          <dependency>

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java
----------------------------------------------------------------------
diff --cc app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java
index 9ab3d79,39c3a0b..b730b2d
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java
@@@ -45,22 -47,23 +46,23 @@@ import org.apache.struts2.interceptor.S
  /**
   * Action which handles editing of global configuration.
   */
+ @AllowedMethods({"execute","save"})
  public class GlobalConfig extends UIAction implements ParameterAware, ServletRequestAware {
 -    
 +
      private static Log log = LogFactory.getLog(GlobalConfig.class);
 -    
 +
      // the request parameters
      private Map<String, String[]> params = Collections.emptyMap();
 -    
 +
      // map of config properties
      private Map<String, RuntimeConfigProperty> properties = Collections.emptyMap();
 -    
 +
      // the runtime config def used to populate the display
      private ConfigDef globalConfigDef = null;
 -    
 +
      // list of comment plugins
      private List<WeblogEntryCommentPlugin> pluginsList = Collections.emptyList();
 -    
 +
      // comment plugins that are enabled.  this is what the html form submits to
      private String[] commentPlugins = new String[0];
  

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java
----------------------------------------------------------------------
diff --cc app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java
index bbecdfa,b2a8084..d947e49
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/FolderEdit.java
@@@ -27,17 -27,16 +27,19 @@@ import org.apache.roller.weblogger.busi
  import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder;
  import org.apache.roller.weblogger.ui.struts2.util.UIAction;
  import org.apache.roller.weblogger.util.cache.CacheManager;
 +import org.apache.struts2.interceptor.ServletResponseAware;
+ import org.apache.struts2.convention.annotation.AllowedMethods;
  import org.apache.struts2.interceptor.validation.SkipValidation;
  
 +import javax.servlet.http.HttpServletResponse;
 +
  
  /**
   * Edit a new or existing folder.
   */
+ @AllowedMethods({"execute","save"})
 -public class FolderEdit extends UIAction {
 -    
 +public class FolderEdit extends UIAction implements ServletResponseAware {
-     
++
      private static Log log = LogFactory.getLog(FolderEdit.class);
  
      // bean for managing form data

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/resources/struts.xml
----------------------------------------------------------------------
diff --cc app/src/main/resources/struts.xml
index 8020f7c,125dc14..39489c4
--- a/app/src/main/resources/struts.xml
+++ b/app/src/main/resources/struts.xml
@@@ -157,12 -173,25 +173,26 @@@
      
      
      <!-- Weblogger Admin UI (includes planet) -->
-     <package name="weblogger-admin" namespace="/roller-ui/admin" extends="weblogger">
-         
-         <action name="globalConfig!*" method="{1}"
+     <package name="weblogger-admin" namespace="/roller-ui/admin" extends="weblogger" >
+ 
+         <global-allowed-methods>
+             clear,
+             disable,
+             delete,
+             deleteConfirm,
+             enable,
+             execute,
+             firstSave,
+             save,
+             query,
+             delete,
+             update
+         </global-allowed-methods>
+         
+         <action name="globalConfig"
                  class="org.apache.roller.weblogger.ui.struts2.admin.GlobalConfig">
              <result name="success" type="tiles">.GlobalConfig</result>
 +            <result name="error" type="tiles">.GlobalConfig</result>
          </action>
                 
          <action name="userAdmin"

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp
----------------------------------------------------------------------
diff --cc app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp
index 6097456,7ec9c39..3f668c4
--- a/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp
@@@ -17,127 -17,96 +17,127 @@@
  --%>
  <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
  
 -<p class="subtitle"><s:text name="configForm.subtitle" /></p>
 -<p><s:text name="configForm.prompt" /></p>
 +<p class="subtitle"><s:text name="configForm.subtitle"/></p>
 +<p><s:text name="configForm.prompt"/></p>
  
 -<s:form action="globalConfig!save">
 -	<s:hidden name="salt" />
  
 -    <table class="formtableNoDesc">
 -    
 +<s:form action="globalConfig!save" theme="bootstrap" cssClass="form-horizontal">
 +
 +    <s:hidden name="salt"/>
 +
-     <s:iterator id="dg" value="globalConfigDef.displayGroups">
+     <s:iterator var="dg" value="globalConfigDef.displayGroups">
 -    
 -        <tr>
 -            <td colspan="3"><h2><s:text name="%{#dg.key}" /></h2></td>
 -        </tr>
 -    
 +
 +        <h2><s:text name="%{#dg.key}"/></h2>
 +
-         <s:iterator id="pd" value="#dg.propertyDefs">
+         <s:iterator var="pd" value="#dg.propertyDefs">
 -            
 -            <tr>
 -                <td class="label"><s:text name="%{#pd.key}" /></td>
 -                
 -                  <%-- special condition for comment plugins --%>
 -                  <s:if test="#pd.name == 'users.comments.plugins'">
 -                      <td class="field"><s:checkboxlist theme="roller" list="pluginsList"
 -                        name="commentPlugins" listKey="id" listValue="name" /></td>
 -                  </s:if>
 -
 -                  <%-- special condition for front page blog --%>
 -                  <s:elseif test="#pd.name == 'site.frontpage.weblog.handle'">
 -                      <td class="field">
 -                          <select name='<s:property value="#pd.name"/>'>
 -                                <option value=''>
 -                                    <s:text name="configForm.none" />
 -                                </option>                              <s:iterator var="weblog" value="weblogs">
 -                                <option value='<s:property value="#weblog.handle"/>'
 -                                    <s:if test='properties[#pd.name].value == #weblog.handle'>selected='true'</s:if> >
 -                                    <s:property value="#weblog.name"/>
 -                                </option>
 -                              </s:iterator>
 -                          </select>
 -                      </td>
 -                  </s:elseif>
 -
 -                  <%-- "string" type means use a simple textbox --%>
 -                  <s:elseif test="#pd.type == 'string'">
 -                    <td class="field"><input type="text" name='<s:property value="#pd.name"/>'
 -                        value='<s:property value="properties[#pd.name].value"/>' size="35" /></td>
 -                  </s:elseif>
 -                  
 -                  <%-- "text" type means use a full textarea --%>
 -                  <s:elseif test="#pd.type == 'text'">
 -                    <td class="field">
 -                      <textarea name='<s:property value="#pd.name"/>'
 -                                rows="<s:property value="#pd.rows"/>"
 -                                cols="<s:property value="#pd.cols"/>"><s:property value="properties[#pd.name].value"/>
 -                      </textarea>
 -                    </td>
 -                  </s:elseif>
 -                  
 -                  <%-- "boolean" type means use a checkbox --%>
 -                  <s:elseif test="#pd.type == 'boolean'">
 -                      <s:if test="properties[#pd.name].value == 'true'">
 -                          <td class="field"><input type="checkbox" 
 -                            name='<s:property value="#pd.name"/>' CHECKED></td>
 -                      </s:if>
 -                      <s:else>
 -                          <td class="field"><input type="checkbox"
 -                            name='<s:property value="#pd.name"/>'></td>
 -                      </s:else>
 -                  </s:elseif>
 -                  
 -                  <%-- if it's something we don't understand then use textbox --%>
 -                  <s:else>
 -                    <td class="field"><input type="text"
 -                        name='<s:property value="#pd.name"/>' size="50" /></td>
 -                  </s:else>
 -                
 -                <td class="description"><%-- <s:text name="" /> --%></td>
 -            </tr>
 -          
 +
 +            <%-- special condition for comment plugins --%>
 +            <s:if test="#pd.name == 'users.comments.plugins'">
 +                <s:checkboxlist label="%{getText(#pd.key)}" name="commentPlugins"
 +                                list="pluginsList" listKey="id" listValue="name"/>
 +            </s:if>
 +
 +            <%-- special condition for front page blog --%>
 +            <s:elseif test="#pd.name == 'site.frontpage.weblog.handle'">
 +                <s:select name="%{#pd.name}" label="%{getText(#pd.key)}"
 +                          list="weblogs" listKey="handle" listValue="name"/>
 +            </s:elseif>
 +
 +            <%-- "string" type means use a simple textbox --%>
 +            <s:elseif test="#pd.type == 'string'">
 +                <s:textfield name="%{#pd.name}" label="%{getText(#pd.key)}" size="35"
 +                             value="%{properties[#pd.name].value}"/>
 +            </s:elseif>
 +
 +            <%-- "text" type means use a full textarea --%>
 +            <s:elseif test="#pd.type == 'text'">
 +                <s:textarea name="%{#pd.name}" label="%{getText(#pd.key)}" rows="#pd.rows" cols="#pd.cols"
 +                            value="%{properties[#pd.name].value}"/>
 +            </s:elseif>
 +
 +            <%-- "boolean" type means use a checkbox --%>
 +            <s:elseif test="#pd.type == 'boolean'">
 +                <s:if test="properties[#pd.name].value == 'true'">
 +                    <s:checkbox name="%{#pd.name}" label="%{getText(#pd.key)}" checked="checked" />
 +                </s:if>
 +                <s:if test="properties[#pd.name].value == 'false'">
 +                    <s:checkbox name="%{#pd.name}" label="%{getText(#pd.key)}" />
 +                </s:if>
 +            </s:elseif>
 +
 +            <s:elseif test="#pd.type == 'integer'">
 +                <div class="form-group ">
 +                    <label class="col-sm-3 control-label"
 +                        for='globalConfig_<s:property value="#pd.nameWithUnderbars" />'>
 +                        <s:text name="%{#pd.key}"/>
 +                    </label>
 +                    <div class="col-sm-9 controls">
 +                        <input type="number" name='<s:property value="#pd.name" />'
 +                            size="35" value="30" id='globalConfig_<s:property value="#pd.nameWithUnderbars" />'
 +                            class="form-control integer" onkeyup="formChanged()" />
 +                    </div>
 +                </div>
 +            </s:elseif>
 +
 +            <s:elseif test="#pd.type == 'float'">
 +                <div class="form-group ">
 +                    <label class="col-sm-3 control-label"
 +                        for='globalConfig_<s:property value="#pd.nameWithUnderbars" />'>
 +                        <s:text name="%{#pd.key}"/>
 +                    </label>
 +                    <div class="col-sm-9 controls">
 +                        <input type="number" name='<s:property value="#pd.name" />'
 +                            size="35" value="30" id='globalConfig_<s:property value="#pd.nameWithUnderbars" />'
 +                            class="form-control float" onkeyup="formChanged()" />
 +                    </div>
 +                </div>
 +            </s:elseif>
 +
 +            <%-- if it's something we don't understand then use textbox --%>
 +            <s:else>
 +                <s:textfield name="%{#pd.name}" label="%{getText(#pd.key)}" size="35"
 +                             value="%{properties[#pd.name].value}" />
 +            </s:else>
 +
          </s:iterator>
 -      
 -        <tr>
 -            <td colspan="2">&nbsp;</td>
 -        </tr>
 -        
      </s:iterator>
  
 -    </table>
 -    
 -    <div class="control">
 -        <input class="buttonBox" type="submit" value="<s:text name="generic.save"/>"/>
 -    </div>
 -    
 +    <input id="saveButton" class="btn" type="submit" value="<s:text name="generic.save"/>"/>
 +
  </s:form>
 +
 +
 +<script type="text/javascript">
 +
 +    function formChanged() {
 +
 +        var saveBookmarkButton = $('#saveButton:first');
 +
 +        var error = false;
 +
 +        $("input").each( function() {
 +
 +            var isInteger = $(this).hasClass("integer");
 +
 +            if ( $(this).attr("type") == "number") {
 +
 +                if ( isNaN( this.valueAsNumber )) {
 +                    $(this).css("background", "#FBB")
 +                    error = true;
 +
 +                } else if ( isInteger && !Number.isInteger( this.valueAsNumber ) ) {
 +                    $(this).css("background", "#FBB")
 +                    error = true;
 +
 +                } else {
 +                    $(this).css("background", "white")
 +                }
 +            }
 +
 +        });
 +
 +        saveBookmarkButton.attr("disabled", error );
 +    }
 +
 +</script>
 +

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp
----------------------------------------------------------------------
diff --cc app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp
index da126a9,eb565f8..f042398
--- a/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp
@@@ -57,115 -57,125 +57,115 @@@
  <%-- if we have weblogs, then loop through and list them --%>
  <s:if test="! existingPermissions.isEmpty">
      
-     <s:iterator id="perms" value="existingPermissions">
+     <s:iterator var="perms" value="existingPermissions">
  
-         <div class="well yourWeblogBox">  
 -        <div class="yourWeblogBox">  
 -
 -            <span class="mm_weblog_name"><img src='<c:url value="/images/folder.png"/>' />&nbsp;<s:property value="#perms.weblog.name" /></span>
 -                
 -            <table class="mm_table" width="100%" cellpadding="0" cellspacing="0">
 -               <tr>
 -               <td valign="top">
 -
 -                   <table cellpadding="0" cellspacing="0">
 -                       
 -                       <tr>
 -                           <td class="mm_subtable_label"><s:text name='yourWebsites.weblog'/></td>
 -                           <td><a href='<s:property value="#perms.weblog.absoluteURL" />'>
 -                               <s:property value="#perms.weblog.absoluteURL" />
 -                           </a></td>                          
 -                       </tr>
 -                       
 -                       <tr>
 -                           <td class="mm_subtable_label"><s:text name='yourWebsites.permission'/></td>
 -                           <td><s:if test='#perms.hasAction("admin")'  >ADMIN</s:if>
 -                           <s:if test='#perms.hasAction("post")'       >AUTHOR</s:if>
 -                           <s:if test='#perms.hasAction("edit_draft")' >LIMITED</s:if></td>
 -                       </tr>
 -                       
 -                       <tr>
 -                           <td class="mm_subtable_label"><s:text name='generic.description' /></td>
 -                           <td><s:property value="#perms.weblog.about" escapeHtml="false" /></td>
 -                       </tr>
 -
 -                       <tr>
 -                           <td class="mm_subtable_label"><s:text name='yourWebsites.userCount' /></td>   
 -                           <td><s:property value="#perms.weblog.userCount" /></td>
 -                       </tr>
 -
 -                       <tr>
 -                           <td class="mm_subtable_label"><s:text name='yourWebsites.todaysHits' /></td>   
 -                           <td><s:property value="#perms.weblog.todaysHits" /></td>
 -                       </tr>
 -                       
 -                   </table>
 -
 -               </td>
 -               
 -               <td class="mm_table_actions" width="20%" align="left" >
 -
 -                       <s:url action="entryAdd" namespace="/roller-ui/authoring" var="newEntry">
 -                           <s:param name="weblog" value="#perms.weblog.handle" />
 -                       </s:url>
 -                       <img src='<s:url value="/images/table_edit.png"/>' />
 -                       <s:a href="%{newEntry}"><s:text name="yourWebsites.newEntry" /></s:a>
 -                       <br />
 -
 -                       <%-- Show Entries link with count for users above LIMITED permission --%>
 -                       <s:if test='!(#perms.hasAction("edit_draft"))'>
 -                           <s:url action="entries" namespace="/roller-ui/authoring" var="editEntries">
 -                               <s:param name="weblog" value="#perms.weblog.handle" />
 -                           </s:url>
 -                           <img src='<s:url value="/images/table_multiple.png"/>' />
 -                           <s:a href="%{editEntries}"><s:text name="yourWebsites.editEntries" /> (<s:property value="#perms.weblog.entryCount" />)</s:a>
 -                           <br />
 -                       </s:if>
 -
 -                       <%-- Show Comments link with count for users above LIMITED permission --%>
 -                       <s:if test='!(#perms.hasAction("edit_draft"))'>
 -                           <s:url action="comments" namespace="/roller-ui/authoring" var="manageComments">
 -                               <s:param name="weblog" value="#perms.weblog.handle" />
 -                           </s:url>
 -                           <img src='<s:url value="/images/page_white_edit.png"/>' />
 -                           <s:a href="%{manageComments}"><s:text name="yourWebsites.manageComments" /> (<s:property value="#perms.weblog.commentCount" />)</s:a>
 -                           <br />
 -                       </s:if>
 -
 -                       <%-- Only admins get access to theme and config settings --%>
 -                       <s:if test='#perms.hasAction("admin")'>
 -                           
 -                           <%-- And only show theme option if custom themes are enabled --%>
 -                           <s:if test="getProp('themes.customtheme.allowed')">
 -                               <s:if test="#perms.weblog.editorTheme == 'custom'">
 -                                   <s:url action="templates" namespace="/roller-ui/authoring" var="weblogTheme">
 -                                       <s:param name="weblog" value="#perms.weblog.handle" />
 -                                   </s:url>
 -                               </s:if>
 -                               <s:else>
 -                                   <s:url action="themeEdit" namespace="/roller-ui/authoring" var="weblogTheme">
 -                                       <s:param name="weblog" value="#perms.weblog.handle" />
 -                                   </s:url>
 -                               </s:else>
 -                               <img src='<s:url value="/roller-ui/images/layout.png"/>' />
 -                               <a href='<s:property value="weblogTheme" />'>
 -                                   <s:text name="yourWebsites.theme" /></a> 
 -                               <br />
 -                           </s:if>
 -                           
 -                           <s:url action="weblogConfig" namespace="/roller-ui/authoring" var="manageWeblog">
 -                               <s:param name="weblog" value="#perms.weblog.handle" />
 -                           </s:url>
 -                           <img src='<s:url value="/images/cog.png"/>' />
 -                           <a href='<s:property value="manageWeblog" />'>
 -                               <s:text name="yourWebsites.manage" /></a> 
 -                           <br />
 -                       </s:if>
 -
 -                       <%-- don't allow last admin to resign from blog --%>
 -                       <s:if test='!(#perms.hasAction("admin") && #perms.weblog.adminUserCount == 1)'>
 -                          <img src='<c:url value="/images/delete.png"/>' />
 -                          <s:url action="memberResign" namespace="/roller-ui/authoring" var="resignWeblog">
 -                              <s:param name="weblog" value="#perms.weblog.handle" />
 -                          </s:url>
 -                          <a href='<s:property value="resignWeblog" />'>
 -                              <s:text name='yourWebsites.resign' />
 -                          </a>
 -                       </s:if>
 -
 -               </td>
 -               </tr>
 -            </table>
++        <div class="well yourWeblogBox">
 +
 +            <h3 class="mm_weblog_name">
 +                <span class="glyphicon glyphicon-folder-open" aria-hidden="true"></span>
 +                &nbsp;<s:property value="#perms.weblog.name" />
 +            </h3>
 +
 +            <p> <a href='<s:property value="#perms.weblog.absoluteURL" />'>
 +            <s:property value="#perms.weblog.absoluteURL" /></a></p>
 +
-             <p><s:property value="#perms.weblog.about" escape="false" /></p>
-             
++            <p><s:property value="#perms.weblog.about" escapeHtml="false" /></p>
++
 +            <p>You have 
 +            <s:if test='#perms.hasAction("admin")'>ADMIN</s:if>
 +            <s:if test='#perms.hasAction("post")'>AUTHOR</s:if>
 +            <s:if test='#perms.hasAction("edit_draft")'>LIMITED</s:if>
 +            <s:text name='yourWebsites.permission'/></p>
              
 +            <div class="btn-group" role="group" aria-label="...">
 +
 +                <%-- New entry button --%>
-                 <s:url action="entryAdd" namespace="/roller-ui/authoring" id="newEntry">
++                <s:url action="entryAdd" namespace="/roller-ui/authoring" var="newEntry">
 +                    <s:param name="weblog" value="#perms.weblog.handle"/>
 +                </s:url>
 +                <s:a href="%{newEntry}" cssClass="btn btn-default">
 +                    <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
 +                    <s:text name="yourWebsites.newEntry"/>
 +                </s:a>
 +
 +                <s:if test='!(#perms.hasAction("edit_draft"))'>
 +                    
 +                    <%-- Show Entries button with count for users above LIMITED permission --%>
-                     <s:url action="entries" namespace="/roller-ui/authoring" id="editEntries">
++                    <s:url action="entries" namespace="/roller-ui/authoring" var="editEntries">
 +                        <s:param name="weblog" value="#perms.weblog.handle"/>
 +                    </s:url>
 +                    <s:a href="%{editEntries}" cssClass="btn btn-default">
 +                        <span class="glyphicon glyphicon-list" aria-hidden="true"></span>
 +                        <s:text name="yourWebsites.editEntries"/>
 +                        <span class="badge"><s:property value="#perms.weblog.entryCount"/></span>
 +                    </s:a>
 +
 +                </s:if>
 +
 +                <s:if test='!(#perms.hasAction("edit_draft"))'>
 +                    
 +                    <%-- Show Comments button with count for users above LIMITED permission --%>
-                     <s:url action="comments" namespace="/roller-ui/authoring" id="manageComments">
++                    <s:url action="comments" namespace="/roller-ui/authoring" var="manageComments">
 +                        <s:param name="weblog" value="#perms.weblog.handle"/>
 +                    </s:url>
 +                    <s:a href="%{manageComments}" cssClass="btn btn-default">
 +                        <span class="glyphicon glyphicon-comment" aria-hidden="true"></span>
 +                        <s:text name="yourWebsites.manageComments"/>
 +                        <span class="badge"><s:property value="#perms.weblog.commentCount"/></span>
 +                    </s:a>
 +
 +                </s:if>
 +
 +
 +                <%-- Only admins get access to theme and config settings --%>
 +                <s:if test='#perms.hasAction("admin")'>
 +
 +                    <%-- And only show theme option if custom themes are enabled --%>
 +                    <s:if test="getProp('themes.customtheme.allowed')">
 +                        <s:if test="#perms.weblog.editorTheme == 'custom'">
-                             <s:url action="templates" namespace="/roller-ui/authoring" id="weblogTheme">
++                            <s:url action="templates" namespace="/roller-ui/authoring" var="weblogTheme">
 +                                <s:param name="weblog" value="#perms.weblog.handle" />
 +                            </s:url>
 +                        </s:if>
 +                        <s:else>
-                             <s:url action="themeEdit" namespace="/roller-ui/authoring" id="weblogTheme">
++                            <s:url action="themeEdit" namespace="/roller-ui/authoring" var="weblogTheme">
 +                                <s:param name="weblog" value="#perms.weblog.handle" />
 +                            </s:url>
 +                        </s:else>
 +                        <a href='<s:property value="weblogTheme" />' class="btn btn-default">
 +                            <span class="glyphicon glyphicon-eye-open" aria-hidden="true"></span>
 +                            <s:text name="yourWebsites.theme" />
 +                        </a>
 +                    </s:if>
 +                    
 +                    <%-- settings button --%>
-                     <s:url action="weblogConfig" namespace="/roller-ui/authoring" id="manageWeblog">
++                    <s:url action="weblogConfig" namespace="/roller-ui/authoring" var="manageWeblog">
 +                        <s:param name="weblog" value="#perms.weblog.handle"/>
 +                    </s:url>
 +                    <a href='<s:property value="manageWeblog" />' class="btn btn-default">
 +                        <span class="glyphicon glyphicon-cog" aria-hidden="true"></span>
 +                        <s:text name="yourWebsites.manage"/>
 +                    </a>
 +
 +                </s:if>
 +
 +                <%-- don't allow last admin to resign from blog --%>
 +                <s:if test='!(#perms.hasAction("admin") && #perms.weblog.adminUserCount == 1)'>
 +
 +                    <button type="button" class="btn btn-default">
 +                        <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
-                         <s:url action="memberResign" namespace="/roller-ui/authoring" id="resignWeblog">
++                        <s:url action="memberResign" namespace="/roller-ui/authoring" var="resignWeblog">
 +                            <s:param name="weblog" value="#perms.weblog.handle"/>
 +                        </s:url>
 +                        <a href='<s:property value="resignWeblog" />'>
 +                            <s:text name='yourWebsites.resign'/>
 +                        </a>
 +                    </button>
 +
 +                </s:if>
 +
 +            </div>
 +
          </div>
          
      </s:iterator>

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp
----------------------------------------------------------------------
diff --cc app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp
index 0f159ff,ed9c43f..6140a4b
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp
@@@ -23,244 -35,71 +23,244 @@@
      </s:text>
  </p>
  <p class="pagetip">
 -    <s:text name="categoriesForm.rootPrompt" />
 +    <s:text name="categoriesForm.rootPrompt"/>
  </p>
  
 -
  <%-- Form is a table of categories each with checkbox --%>
  <s:form action="categories!move">
 -	<s:hidden name="salt" />
 -    <s:hidden name="weblog" />
 -    <s:hidden name="categoryId" /> 
 +    <s:hidden name="salt"/>
 +    <s:hidden name="weblog"/>
 +    <s:hidden name="categoryId"/>
 +
 +    <table class="rollertable table table-striped" width="100%">
  
 -    <table class="rollertable">
 -        
          <tr class="rollertable">
 -            <th class="rollertable" width="15%"><s:text name="generic.name" /></th>
 -            <th class="rollertable" width="40%"><s:text name="generic.description" /></th>
 -            <th class="rollertable" width="31%"><s:text name="categoriesForm.imageUrl" /></th>
 -            <th class="rollertable" width="7%"><s:text name="generic.edit" /></th>
 -            <th class="rollertable" width="7%"><s:text name="categoriesForm.remove" /></th>
 +            <th width="30%"><s:text name="generic.name"/></th>
 +            <th width="50%"><s:text name="generic.description"/></th>
 +            <th width="10%"><s:text name="generic.edit"/></th>
 +            <th width="10%"><s:text name="categoriesForm.remove"/></th>
          </tr>
 -        
 +
          <s:if test="AllCategories != null && !AllCategories.isEmpty">
 -        
 -        <%-- Categories --%>
 -        <s:iterator var="category" value="AllCategories" status="rowstatus">
 -            <s:if test="#rowstatus.odd == true">
 -                <tr class="rollertable_odd">
 -            </s:if>
 -            <s:else>
 -                <tr class="rollertable_even">
 -            </s:else>
 -            
 -                <td class="rollertable"><s:property value="#category.name" /></td>
 -                
 -                <td class="rollertable"><s:property value="#category.description" /></td>
 -                
 -                <td class="rollertable"><s:property value="#category.image" /></td>
 -
 -                <td class="rollertable" align="center">
 -                    <s:url var="editUrl" action="categoryEdit">
 -                        <s:param name="weblog" value="%{actionWeblog.handle}" />
 -                        <s:param name="bean.id" value="#category.id" />
 -                    </s:url>
 -                    <s:a href="%{editUrl}"><img src='<s:url value="/images/page_white_edit.png"/>' border="0" alt="icon" /></s:a>
 -                </td>
 -                
 -                <td class="rollertable" align="center">
 -                    <s:if test="AllCategories.size() > 1">
 -                        <s:url var="removeUrl" action="categoryRemove">
 -                            <s:param name="weblog" value="%{actionWeblog.handle}" />
 -                            <s:param name="removeId" value="#category.id" />
 -                        </s:url>
 -                        <s:a href="%{removeUrl}"><img src='<s:url value="/images/delete.png"/>' border="0" alt="icon" /></s:a>
 -                    </s:if>
 -                </td>
 -                
 -            </tr>
 -        </s:iterator>
 -        
 +
-             <s:iterator id="category" value="AllCategories" status="rowstatus">
++            <s:iterator var="category" value="AllCategories" status="rowstatus">
 +                <tr>
 +                    <td><s:property value="#category.name"/></td>
 +
 +                    <td><s:property value="#category.description"/></td>
 +
 +                    <td align="center">
 +
 +                        <s:set name="categoryId"    value="#category.id" />
 +                        <s:set name="categoryName"  value="#category.name" />
 +                        <s:set name="categoryDesc"  value="#category.description" />
 +                        <s:set name="categoryImage" value="#category.image" />
 +                        <a href="#" onclick="showCategoryEditModal(
 +                                '<s:property value="categoryId" />',
 +                                '<s:property value="categoryName"/>',
 +                                '<s:property value="categoryDesc"/>',
 +                                '<s:property value="categoryImage"/>' )">
 +                            <span class="glyphicon glyphicon-edit"></span>
 +                        </a>
-                         
++
 +                    </td>
 +
 +                    <td class="rollertable" align="center">
 +                        <s:if test="AllCategories.size() > 1">
-                             
++
 +                            <s:set name="categoryId"    value="#category.id" />
 +                            <s:set name="categoryName"  value="#category.name" />
 +                            <s:set name="categoryInUse" value="#category.inUse.toString()" />
 +                            <a href="#" onclick="showCategoryDeleteModal(
 +                                    '<s:property value="categoryId" />',
 +                                    '<s:property value="categoryName" />',
 +                                    <s:property value="categoryInUse"/> )" >
 +                                <span class="glyphicon glyphicon-trash"></span>
 +                            </a>
-                             
++
 +                        </s:if>
 +                    </td>
 +
 +                </tr>
 +            </s:iterator>
 +
          </s:if>
 +
          <s:else>
              <tr>
 -                <td style="vertical-align:middle" colspan="6"><s:text name="categoriesForm.noresults" /></td>
 +                <td style="vertical-align:middle" colspan="6"><s:text name="categoriesForm.noresults"/></td>
              </tr>
          </s:else>
 -        
 +
      </table>
 -    
 +
  </s:form>
 +
 +
 +<%-- ============================================================= --%>
 +<%-- add/edit category modal --%>
 +
 +<div id="category-edit-modal" class="modal fade category-edit-modal" tabindex="-1" role="dialog">
 +
 +    <div class="modal-dialog modal-lg">
 +
 +        <div class="modal-content">
 +
 +            <div class="modal-header">
 +                <h3 id="category-edit-title"></h3>
 +            </div>
 +
 +            <div class="modal-body">
 +                <s:form action="#" id="categoryEditForm" theme="bootstrap" cssClass="form-horizontal">
 +                    <s:hidden name="salt"/>
 +                    <s:hidden name="weblog"/>
 +                    <s:hidden name="bean.id"/>
 +
 +                    <%-- action needed here because we are using AJAX to post this form --%>
 +                    <s:hidden name="action:categoryEdit!save" value="save"/>
 +
 +                    <s:textfield name="bean.name" label="%{getText('generic.name')}" maxlength="255"/>
 +                    <s:textfield name="bean.description" label="%{getText('generic.description')}"/>
 +                    <s:textfield name="bean.image" label="%{getText('categoryForm.image')}"/>
 +                </s:form>
 +            </div>
 +
 +            <div class="modal-footer">
 +                <p id="feedback-area-edit"></p>
 +                <button onclick="submitEditedCategory()" class="btn btn-primary">
 +                    <s:text name="generic.save"/>
 +                </button>
 +                <button type="button" class="btn" data-dismiss="modal">
 +                    <s:text name="generic.cancel"/>
 +                </button>
 +            </div>
 +
 +        </div>
 +    </div>
 +</div>
 +
 +<script>
 +
 +    var feedbackAreaEdit = $("#feedback-area-edit");
 +
 +    function showCategoryEditModal( id, name, desc, image ) {
 +        feedbackAreaEdit.html("");
 +        $('#category-edit-title').html('<s:text name="categoryForm.edit.title" />');
 +
 +        $('#categoryEditForm_bean_id').val(id);
 +        $('#categoryEditForm_bean_name').val(name);
 +        $('#categoryEditForm_bean_description').val(desc);
 +        $('#categoryEditForm_bean_image').val(image);
 +
 +        $('#category-edit-modal').modal({show: true});
 +    }
 +
 +    function submitEditedCategory() {
 +
 +        // if name is empty reject and show error message
 +        if ($("#categoryEditForm_bean_name").val().trim() == "") {
 +            feedbackAreaEdit.html('<s:text name="categoryForm.requiredFields" />');
 +            feedbackAreaEdit.css("color", "red");
 +            return;
 +        }
 +
 +        // post category via AJAX
 +        $.ajax({
 +            method: 'post',
 +            url: "categoryEdit!save.rol",
 +            data: $("#categoryEditForm").serialize(),
 +            context: document.body
 +
 +        }).done(function (data) {
 +
 +            // kludge: scrape response status from HTML returned by Struts
 +            var alertEnd = data.indexOf("ALERT_END");
 +            if (data.indexOf('<s:text name="categoryForm.error.duplicateName" />') < alertEnd) {
 +                feedbackAreaEdit.css("color", "red");
 +                feedbackAreaEdit.html('<s:text name="categoryForm.error.duplicateName" />');
 +
 +            } else {
 +                feedbackAreaEdit.css("color", "green");
 +                feedbackAreaEdit.html('<s:text name="generic.success" />');
 +                $('#category-edit-modal').modal("hide");
 +                location.reload(true);
 +            }
 +
 +        }).error(function (data) {
 +            feedbackAreaEdit.html('<s:text name="generic.error.check.logs" />');
 +            feedbackAreaEdit.css("color", "red");
 +        });
 +    }
 +
 +</script>
 +
 +
 +<%-- ============================================================= --%>
 +<%-- delete confirmation modal --%>
 +
 +<div id="delete-category-modal" class="modal fade delete-category-modal" tabindex="-1" role="dialog">
 +
 +    <div class="modal-dialog modal-lg">
 +
 +        <div class="modal-content">
 +
 +            <div class="modal-header">
 +                <h3>
 +                    <s:text name="categoryDeleteOK.removeCategory"/>:
 +                    <span id="category-name"></span>
 +                </h3>
 +            </div>
 +
 +            <s:form action="categoryRemove!remove" theme="bootstrap" cssClass="form-horizontal">
 +                <s:hidden name="salt"/>
 +                <s:hidden name="weblog"/>
 +                <s:hidden name="removeId"/>
 +                
 +                <div class="modal-body">
 +
 +                    <div id="category-in-use" class="alert alert-danger" role="alert" style="display:none">
 +                        <p>
 +                            <s:text name="categoryDeleteOK.warningCatInUse"/>
 +                            <s:text name="categoryDeleteOK.youMustMoveEntries"/>
 +                        </p>
 +                        <s:text name="categoryDeleteOK.moveToWhere"/>
 +                        <s:select name="targetCategoryId" list="allCategories" listKey="id" listValue="name"/>
 +                    </div>
 +
 +                    <div id="category-empty" style="display:none">
 +                        <p><s:text name="categoryDeleteOK.noEntriesInCat"/></p>
 +                    </div>
 +                    
 +                    <p> <strong><s:text name="categoryDeleteOK.areYouSure"/></strong> </p>
 +                </div>
 +
 +                <div class="modal-footer">
 +                    <s:submit cssClass="btn" value="%{getText('generic.yes')}"/>&nbsp;
 +                    <button type="button" class="btn btn-default btn-primary" data-dismiss="modal">
 +                        <s:text name="generic.no" />
 +                    </button>
 +                </div>
 +
 +            </s:form>
 +
 +        </div>
 +    </div>
 +</div>
 +
 +<script>
 +
 +    function showCategoryDeleteModal( id, name, inUse ) {
 +        $('#categoryRemove_removeId').val(id);
 +        $('#categoryEdit_bean_name').val(name);
 +        $('#category-name').html(name);
 +        if ( inUse ) {
 +            $('#category-in-use').css('display','block');
 +            $('#category-emtpy').css('display', 'none');
 +        } else {
 +            $('#category-in-use').css('display', 'none');
 +            $('#category-emtpy').css('display', 'block');
 +        }
 +        $('#delete-category-modal').modal({show: true});
 +    }
 +
 +</script>

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp
----------------------------------------------------------------------
diff --cc app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp
index e950843,929d72e..03dedcf
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp
@@@ -200,144 -246,122 +200,143 @@@
              </tr>
  
  
 -            <%-- ========================================================= --%>
 -<%-- Loop through comments --%>
 -<%-- ========================================================= --%>
 +                <%-- ========================================================= --%>
 +                <%-- Loop through comments --%>
 +
 +                <%-- it is a bit funky to use checkbox list here, but using checkbox didn't work for me :( 
 +                we are effectively just creating a checkbox list of 1 item for each iteration of our collection. --%>
  
-             <s:iterator id="comment" value="pager.items" status="rowstatus">
+             <s:iterator var="comment" value="pager.items" status="rowstatus">
                  <tr>
                      <s:if test="actionName == 'comments'">
 +                        <%-- only blog admins (not the global admin) can approve blog comments --%>
                          <td>
 -                            <%-- a bit funky to use checkbox list here, but using checkbox didn't work for me :(
 -                 we are effectively just creating a checkbox list of 1 item for each iteration of our collection --%>
 -                            <s:checkboxlist name="bean.approvedComments" list="{#comment}" listKey="id" listValue="name" />
 +                            <s:checkboxlist name="bean.approvedComments" theme="simple" cssClass="comment-select"
 +                                            list="{#comment}" listKey="id" listValue="name"/>
                          </td>
                      </s:if>
                      <td>
 -                        <%-- a bit funky to use checkbox list here, but using checkbox didn't work for me :(
 -             we are effectively just creating a checkbox list of 1 item for each iteration of our collection --%>
 -                        <s:checkboxlist name="bean.spamComments" list="{#comment}" listKey="id" listValue="name" />
 +                        <s:checkboxlist name="bean.spamComments" label="" theme="simple" cssClass="comment-select" 
 +                                        list="{#comment}" listKey="id" listValue="name"/>
                      </td>
                      <td>
 -                        <%-- a bit funky to use checkbox list here, but using checkbox didn't work for me :(
 -             we are effectively just creating a checkbox list of 1 item for each iteration of our collection --%>
 -                        <s:checkboxlist name="bean.deleteComments" list="{#comment}" listKey="id" listValue="name" />
 +                        <s:checkboxlist name="bean.deleteComments" label="" theme="simple" cssClass="comment-select" 
 +                                        list="{#comment}" listKey="id" listValue="name"/>
                      </td>
  
 -                    <%-- ======================================================== --%>
 -    <%-- Display comment details and text --%>
 +                        <%-- ======================================================== --%>
 +                        <%-- Display comment details and text --%>
  
 -    <%-- <td> with style if comment is spam or pending --%>
 +                        <%-- <td> with style if comment is spam or pending --%>
                      <s:if test="#comment.status.name() == 'SPAM'">
 -                        <td class="spamcomment">
 -                    </s:if>
 -                    <s:elseif test="#comment.status.name() == 'PENDING'">
 -                        <td class="pendingcomment">
 -                    </s:elseif>
 -                    <s:else>
 -                        <td>
 -                    </s:else>
 +                    <td class="spamcomment">
 +                        </s:if>
 +                        <s:elseif test="#comment.status.name() == 'PENDING'">
 +                    <td class="pendingcomment">
 +                        </s:elseif>
 +                        <s:else>
 +                    <td>
 +                        </s:else>
  
 -                        <%-- comment details table in table --%>
 -                        <table class="innertable" >
 +                            <%-- comment details table in table --%>
 +                        <table class="innertable">
                              <tr>
                                  <td class="viewbody">
 -                                <div class="viewdetails bot">
 -                                    <div class="details">
 -                                        <s:text name="commentManagement.entryTitled" />&nbsp;:&nbsp;
 -                                        <a href='<s:property value="#comment.weblogEntry.permalink" />'>
 -                                        <s:property value="#comment.weblogEntry.title" /></a>
 -                                    </div>
 -                                    <div class="details">
 -                                        <s:text name="commentManagement.commentBy" />&nbsp;:&nbsp;
 -                                        <s:if test="#comment.email != null && #comment.name != null">
 -                                        <s:text name="commentManagement.commentByBoth" >
 -                                            <s:param><s:property value="#comment.name" /></s:param>
 -                                            <s:param><s:property value="#comment.email" /></s:param>
 -                                            <s:param><s:property value="#comment.email" /></s:param>
 -                                            <s:param><s:property value="#comment.remoteHost" /></s:param>
 -                                        </s:text>
 +
 +                                    <div class="viewdetails bot">
 +
 +                                        <div class="details">
 +                                            <s:text name="commentManagement.entryTitled"/>&nbsp;:&nbsp;
 +                                            <a href='<s:property value="#comment.weblogEntry.permalink" />'>
 +                                                <s:property value="#comment.weblogEntry.title"/></a>
 +                                        </div>
 +
 +                                        <div class="details">
 +                                            <s:text name="commentManagement.commentBy"/>&nbsp;:&nbsp;
 +                                            <s:if test="#comment.email != null && #comment.name != null">
 +                                                <s:text name="commentManagement.commentByBoth">
 +                                                    <s:param><s:property value="#comment.name"/></s:param>
 +                                                    <s:param><s:property value="#comment.email"/></s:param>
 +                                                    <s:param><s:property value="#comment.email"/></s:param>
 +                                                    <s:param><s:property value="#comment.remoteHost"/></s:param>
 +                                                </s:text>
 +                                            </s:if>
 +                                            <s:elseif test="#comment.email == null && #comment.name == null">
 +                                                <s:text name="commentManagement.commentByIP">
 +                                                    <s:param><s:property value="#comment.remoteHost"/></s:param>
 +                                                </s:text>
 +                                            </s:elseif>
 +                                            <s:else>
 +                                                <s:text name="commentManagement.commentByName">
 +                                                    <s:param><s:property value="#comment.name"/></s:param>
 +                                                    <s:param><s:property value="#comment.remoteHost"/></s:param>
 +                                                </s:text>
 +                                            </s:else>
 +                                        </div>
 +
 +                                        <s:if test="#comment.url != null && !#comment.url.equals('')">
 +                                            <div class="details">
 +                                                <s:text name="commentManagement.commentByURL"/>&nbsp;:&nbsp;
 +                                                <a href='<s:property value="#comment.url" />'>
 +                                                    <str:truncateNicely upper="60" appendToEnd="..."><s:property
 +                                                            value="#comment.url"/></str:truncateNicely></a>
 +                                            </div>
                                          </s:if>
 -                                        <s:elseif test="#comment.email == null && #comment.name == null">
 -                                            <s:text name="commentManagement.commentByIP" >
 -                                                <s:param><s:property value="#comment.remoteHost" /></s:param>
 -                                            </s:text>
 -                                        </s:elseif>
 -                                        <s:else>
 -                                            <s:text name="commentManagement.commentByName" >
 -                                                <s:param><s:property value="#comment.name" /></s:param>
 -                                                <s:param><s:property value="#comment.remoteHost" /></s:param>
 -                                            </s:text>
 -                                        </s:else>
 -                                    </div>
 -                                    <s:if test="#comment.url != null && !#comment.url.equals('')">
 +
                                          <div class="details">
 -                                            <s:text name="commentManagement.commentByURL" />&nbsp;:&nbsp;
 -                                            <a href='<s:property value="#comment.url" />'>
 -                                            <str:truncateNicely upper="60" appendToEnd="..."><s:property value="#comment.url" /></str:truncateNicely></a>
 +                                            <s:text name="commentManagement.postTime"/>&nbsp;:&nbsp;
 +                                            <s:date name="#comment.postTime"/>
                                          </div>
 -                                    </s:if>
 -                                    <div class="details">
 -                                        <s:text name="commentManagement.postTime" />&nbsp;:&nbsp;
 -                                        <s:date name="#comment.postTime"/>
 +
                                      </div>
- 
 -                                </div>
 -                                <div class="viewdetails bot">
 -                                     <div class="details bot">
 -                                          <s:if test="#comment.content.length() > 1000">
 -                                               <div class="bot" id="comment-<s:property value="#comment.id"/>">
 -                                                   <str:truncateNicely upper="1000" appendToEnd="...">
 -                                                       <s:property value="#comment.content" escapeHtml="true" />
 -                                                   </str:truncateNicely>
 -                                               </div>
 -                                               <div id="link-<s:property value="#comment.id"/>">
 -                                                    <a onclick='readMoreComment("<s:property value="#comment.id"/>")'><s:text name="commentManagement.readmore" /></a>
 -                                               </div>
 -                                          </s:if>
 -                                          <s:else>
 -                                               <span width="200px" id="comment-<s:property value="#comment.id"/>"><s:property value="#comment.content" escapeHtml="true" /></span>
 -                                          </s:else>
 -                                     </div>
 -                                     <s:if test="actionName == 'comments'">
 -                                         <div class="details">
 -                                              <a id="editlink-<s:property value="#comment.id"/>" onclick='editComment("<s:property value="#comment.id"/>")'>
 -                                                   <s:text name="generic.edit" />
 -                                              </a>
 -                                         </div>
 -                                         <div class="details">
 -                                              <span id="savelink-<s:property value="#comment.id"/>" style="display: none">
 -                                                   <a onclick='saveComment("<s:property value="#comment.id"/>")'><s:text name="generic.save" /></a> &nbsp;|&nbsp;
 +                                    <div class="viewdetails bot">
 +
 +                                        <div class="details bot">
 +
 +                                            <s:if test="#comment.content.length() > 1000">
 +                                                <div class="bot" id="comment-<s:property value="#comment.id"/>">
 +                                                    <str:truncateNicely upper="1000" appendToEnd="...">
 +                                                        <s:property value="#comment.content" escape="true"/>
 +                                                    </str:truncateNicely>
 +                                                </div>
 +                                                <div id="link-<s:property value="#comment.id"/>">
 +                                                    <a onclick='readMoreComment("<s:property
 +                                                            value="#comment.id"/>")'><s:text
 +                                                            name="commentManagement.readmore"/></a>
 +                                                </div>
 +                                            </s:if>
 +                                            <s:else>
 +                                                <span width="200px"
 +                                                      id="comment-<s:property value="#comment.id"/>"><s:property
 +                                                        value="#comment.content" escape="true"/></span>
 +                                            </s:else>
 +                                        </div>
 +
 +                                        <s:if test="actionName == 'comments'">
 +                                            <div class="details">
 +                                                <a id="editlink-<s:property value="#comment.id"/>"
 +                                                   onclick='editComment("<s:property value="#comment.id"/>")'>
 +                                                    <s:text name="generic.edit"/>
 +                                                </a>
 +                                            </div>
 +                                            <div class="details">
 +                                              <span id="savelink-<s:property value="#comment.id"/>"
 +                                                    style="display: none">
 +                                                   <a onclick='saveComment("<s:property value="#comment.id"/>")'><s:text
 +                                                           name="generic.save"/></a> &nbsp;|&nbsp;
                                                </span>
 -                                              <span id="cancellink-<s:property value="#comment.id"/>" style="display: none">
 -                                                   <a onclick='editCommentCancel("<s:property value="#comment.id"/>")'><s:text name="generic.cancel" /></a>
 +                                              <span id="cancellink-<s:property value="#comment.id"/>"
 +                                                    style="display: none">
 +                                                   <a onclick='editCommentCancel("<s:property
 +                                                           value="#comment.id"/>")'><s:text name="generic.cancel"/></a>
                                                </span>
 -                                         </div>
 -                                     </s:if>
 -                                </div>
 +                                            </div>
 +                                        </s:if>
 +
 +                                    </div>
                              </tr>
 -                        </table> <%-- end comment details table in table --%>
 +                        </table>
 +                            <%-- end comment details table in table --%>
                      </td>
                  </tr>
              </s:iterator>

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/Entries.jsp
----------------------------------------------------------------------
diff --cc app/src/main/webapp/WEB-INF/jsps/editor/Entries.jsp
index 3dbc294,eac0689..198de1d
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Entries.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Entries.jsp
@@@ -77,9 -121,15 +77,9 @@@
      <th class="rollertable" width="5%">
          <s:text name="weblogEntryQuery.category" />
      </th>
 -    <th class="rollertable" width="5%">
 -    </th>
 -    <th class="rollertable" width="5%">
 -    </th>
 -    <th class="rollertable" width="5%">
 -    </th>
  </tr>
  
- <s:iterator id="post" value="pager.items">
+ <s:iterator var="post" value="pager.items">
      <%-- <td> with style if comment is spam or pending --%>
      <s:if test="#post.status.name() == 'DRAFT'">
          <tr class="draftentry"> 

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp
----------------------------------------------------------------------
diff --cc app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp
index c489d0e,7d00385..5867b02
--- a/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp
@@@ -336,28 -277,26 +336,28 @@@
          <s:if test="actionName == 'entryEdit'">
              <span style="float:right">
                  <s:url var="removeUrl" action="entryRemove">
 -                    <s:param name="weblog" value="actionWeblog.handle" />
 -                    <s:param name="removeId" value="%{entry.id}" />
 +                    <s:param name="weblog" value="actionWeblog.handle"/>
 +                    <s:param name="removeId" value="%{entry.id}"/>
                  </s:url>
 -                <input type="button" value="<s:text name='weblogEdit.deleteEntry'/>" onclick="window.location='<s:property value="removeUrl" escapeHtml="false" />'" />
 +                <input class="btn btn-danger" type="button"
 +                       value="<s:text name='weblogEdit.deleteEntry'/>"
-                        onclick="window.location='<s:property value="removeUrl" escape="false"/>'"/>
++                       onclick="window.location='<s:property value="removeUrl" escapeHtml="false"/>'"/>
              </span>
          </s:if>
 -    </div>
  
 -    
 +
      <%-- ================================================================== --%>
 -    <%-- Trackback control --%>
 +    <%-- Trackback control 
      <s:if test="actionName == 'entryEdit' && userAnAuthor">
 -        <br />
 -        <h2><s:text name="weblogEdit.trackback" /></h2>
 -        <s:text name="weblogEdit.trackbackUrl" />
 -        <br />
 +        <br/>
 +        <h2><s:text name="weblogEdit.trackback"/></h2>
 +        <s:text name="weblogEdit.trackbackUrl"/>
 +        <br/>
          <s:textfield name="trackbackUrl" size="80" maxlength="255" style="width:35%"/>
  
 -        <s:submit value="%{getText('weblogEdit.sendTrackback')}" action="entryEdit!trackback" />
 +        <s:submit value="%{getText('weblogEdit.sendTrackback')}" action="entryEdit!trackback"/>
      </s:if>
 +    --%>
  
  </s:form>
  

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/EntrySidebar.jsp
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileSidebar.jsp
----------------------------------------------------------------------
diff --cc app/src/main/webapp/WEB-INF/jsps/editor/MediaFileSidebar.jsp
index 89bc95d,f80a084..9de1166
--- a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileSidebar.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileSidebar.jsp
@@@ -32,8 -32,8 +32,8 @@@
                      <s:param name="weblog" value="%{actionWeblog.handle}" />
                      <s:param name="directoryName" value="%{directoryName}" />
                  </s:url>
-                 <a href='<s:property escape="false" value="%{mediaFileAddURL}" />'
+                 <a href='<s:property escapeHtml="false" value="%{mediaFileAddURL}" />'
 -                    <s:if test="actionName.equals('mediaFileAdd')">style='font-weight:bold;'</s:if> >
 +                    <s:if test="actionName.equals('mediaFileAdd')"> style='font-weight:bold;'</s:if> >
                      <s:text name="mediaFileSidebar.add" />
                  </a>
  

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileView.jsp
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp
----------------------------------------------------------------------
diff --cc app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp
index 9156adc,2520111..75144a0
--- a/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp
@@@ -15,18 -15,14 +15,22 @@@
    copyright in this work, please see the NOTICE file in the top level
    directory of this distribution.
  --%>
++
+ <meta charset="UTF-8">
+ <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
 -<% response.setContentType("text/html;charset=UTF-8"); %>
 -<%@ page language="java" contentType="text/html;charset=UTF-8" %>
++
 +<% response.setContentType("text/html; charset=UTF-8"); %>
 +
 +<%@ page language="java" contentType="text/html; charset=UTF-8" %>
 +
  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt" %>
 -<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
  <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
 -<%@ taglib uri="/struts-tags" prefix="s" %>
 +
 +<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
  <%@ taglib uri="http://jakarta.apache.org/taglibs/string-1.1" prefix="str" %>
 -<%@ taglib tagdir="/WEB-INF/tags" prefix="tags"%>
 +
 +<%@ taglib uri="/struts-tags" prefix="s" %>
 +<%@ taglib uri="/struts-bootstrap-tags" prefix="sboo" %>
 +
 +<%@ taglib tagdir="/WEB-INF/tags" prefix="tags" %>

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp
----------------------------------------------------------------------
diff --cc app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp
index 6166efb,d75f34f..5579f8d
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp
@@@ -17,50 -17,44 +17,51 @@@
  --%>
  <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
  
- <s:set name="tabMenu" value="menu"/>
+ <s:set var="tabMenu" value="menu"/>
  <s:if test="#tabMenu != null">
  
 -<table class="menuTabTable" cellspacing="0" >
 -<tr>
 -<s:iterator var="tab" value="#tabMenu.tabs" >
 -    <s:if test="#tab.selected">
 -        <s:set var="selectedTab" value="#tab" />
 -        <td class="menuTabSelected">
 -    </s:if>
 -    <s:else>
 -        <td class="menuTabUnselected">
 -    </s:else>
 -    <div class="menu-tr">
 -        <div class="menu-tl">
 -            &nbsp;&nbsp;<a href="<s:url action="%{#tab.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>"><s:text name="%{#tab.key}" /></a>&nbsp;&nbsp;
 -        </div>
 -    </div>
 -    </td>
 -    <td class="menuTabSeparator"></td>
 -</s:iterator>
 -</tr>
 -</table>
 -
 -<table class="menuItemTable" cellspacing="0" >
 -    <tr>
 -        <td class="padleft">
 -            <s:iterator var="tabItem" value="#selectedTab.items" status="stat">
 -                <s:if test="!#stat.first">|</s:if>
 -                <s:if test="#tabItem.selected">
 -                    <a class="menuItemSelected" href="<s:url action="%{#tabItem.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>"><s:text name="%{#tabItem.key}" /></a>
 -                </s:if>
 -                <s:else>
 -                    <a class="menuItemUnselected" href="<s:url action="%{#tabItem.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>"><s:text name="%{#tabItem.key}" /></a>
 -                </s:else>
++<<<<<<< HEAD
 +    <%-- 
 +    <nav class="navbar navbar-default">
 +        <div class="container-fluid">
 +            <div id="navbar" class="navbar-collapse collapse">
 +                <ul class="nav navbar-nav">
 +
 +                    <s:iterator id="tab" value="#tabMenu.tabs">
 +                        <li class="dropdown">
 +                            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" 
 +                                aria-haspopup="true" aria-expanded="false">
 +                                <s:text name="%{#tab.key}"/> <span class="caret"></span>
 +                            </a>
 +                            <ul class="dropdown-menu">
 +                                <s:iterator id="tabItem" value="#tab.items" status="stat">
 +                                    <li>
 +                                        <a href="<s:url action="%{#tabItem.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>">
 +                                            <s:text name="%{#tabItem.key}"/>
 +                                        </a>
 +                                    </li>
 +                                </s:iterator>
 +                            </ul>
 +                        </li>
 +                    </s:iterator>
 +                    
 +                </ul>
 +            </div> <!--/.nav-collapse -->
 +        </div> <!--/.container-fluid -->
 +    </nav>
 +
 +    <s:iterator id="tab" value="#tabMenu.tabs">
 +
 +        <h3><s:text name="%{#tab.key}"/></h3>
 +
 +        <div class="list-group">
 +            <s:iterator id="tabItem" value="#tab.items" status="stat">
 +                <a class="list-group-item" href="<s:url action="%{#tabItem.action}"><s:param name="weblog" value="actionWeblog.handle"/></s:url>">
 +                    <s:text name="%{#tabItem.key}"/></a>
              </s:iterator>
 -        </td>
 -    </tr>
 -</table>
 +        </div>
  
 +    </s:iterator>
 +    --%>
 +        
  </s:if>

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp
----------------------------------------------------------------------
diff --cc app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp
index ad2e9c6,f881191..8716ddc
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp
@@@ -26,14 -26,14 +26,14 @@@
  
  <%-- Error Messages --%>
  <s:if test="!actionErrors.isEmpty || !fieldErrors.isEmpty">
 -    <div id="errors" class="errors">
 +    <div id="errors" class="alert alert-danger">
          <ul>
-             <s:iterator id="actionError" value="actionErrors">
-                 <li><s:property value="#actionError" escape="false" /></li>
+             <s:iterator var="actionError" value="actionErrors">
+                 <li><s:property value="#actionError" escapeHtml="false" /></li>
              </s:iterator>
-             <s:iterator id="fieldErrorName" value="fieldErrors.keySet()">
-                 <s:iterator id="fieldErrorValue" value="fieldErrors[#fieldErrorName]">
-                     <li><s:property value="#fieldErrorValue" escape="false" /></li>
+             <s:iterator var="fieldErrorName" value="fieldErrors.keySet()">
+                 <s:iterator var="fieldErrorValue" value="fieldErrors[#fieldErrorName]">
+                     <li><s:property value="#fieldErrorValue" escapeHtml="false" /></li>
                  </s:iterator>
              </s:iterator>
          </ul>

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp
----------------------------------------------------------------------
diff --cc app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp
index 7a735d1,1299132..8073292
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp
@@@ -16,51 -16,52 +16,51 @@@
    directory of this distribution.
  --%>
  <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
- <!doctype html>
+ <!DOCTYPE html>
  <html>
 -    <head>
 -        <meta charset="utf-8">
 -        <meta http-equiv="X-UA-Compatible" content="IE=edge">
 -        <link rel="icon" href="<%= request.getContextPath() %>/favicon.ico" type="image/x-icon">
 -        <title><s:property value="getProp('site.shortName')"/>: <s:property value="pageTitle" /></title>
 +<head>
 +    <meta charset="utf-8">
 +    <meta http-equiv="X-UA-Compatible" content="IE=edge">
 +    <link rel="icon" href="<%= request.getContextPath() %>/favicon.ico" type="image/x-icon">
 +    <title><s:property value="getProp('site.shortName')"/>: <s:property value="pageTitle"/></title>
 +    <tiles:insertAttribute name="head"/>
 +    <style> <tiles:insertAttribute name="styles" /> </style>
 +</head>
 +<body>
  
 -        <tiles:insertAttribute name="head" />     
 -        <style>
 -            <tiles:insertAttribute name="styles" />
 -        </style>
 -    </head>
 -    <body>
 -        <div id="banner">
 -            <tiles:insertAttribute name="bannerStatus" />
 -        </div>
 -        
 -        <div id="menu">
 -            <h1><s:property value="pageTitle" /></h1>
 -            <tiles:insertAttribute name="menu" />
 -        </div>
 -        
 -        <div id="content"> 
 -            <div id="leftcontent_wrap">
 -                <div id="leftcontent"> 
 -                </div>
 -            </div>
 -            
 -            <div id="centercontent_wrap">
 -                <div id="centercontent">   
 -                    <tiles:insertAttribute name="messages" /> 
 -                    <tiles:insertAttribute name="content" />    
 -                </div>
 +<tiles:insertAttribute name="bannerStatus"/>
 +
 +<div class="row">
 +    <div class="col-md-8 roller-column-left">
 +        <div class="panel panel-default">
 +            <div class="panel-body">
 +                <tiles:insertAttribute name="messages"/>
 +                <h2 class="roller-page-title"><s:property value="pageTitle"/></h2>
 +                <tiles:insertAttribute name="content"/>
              </div>
 -            
 -            <div id="rightcontent_wrap">
 -                <div id="rightcontent"> 
 -                    <tiles:insertAttribute name="sidebar" />
 -                </div>
 +        </div>
 +    </div>
 +    <div class="col-md-4 roller-column-right">
 +        <div class="panel panel-default">
 +            <div class="panel-body">
 +                <s:if test="authenticatedUser != null || actionWeblog != null">
 +                    <tiles:insertAttribute name="userStatus"/>
 +                </s:if>
              </div>
          </div>
 -        
 -        <div id="footer">
 -            <tiles:insertAttribute name="footer" />
 +        <div class="panel panel-default">
 +            <div class="panel-body">
 +                <tiles:insertAttribute name="sidebar"/>
 +            </div>
          </div>
 -        
 -    </body>
 +    </div>
 +</div>
 +
 +<footer class="footer">
 +    <div class="container">
 +        <tiles:insertAttribute name="footer"/>
 +    </div>
 +</footer>
 +
 +</body>
  </html>

http://git-wip-us.apache.org/repos/asf/roller/blob/129af05a/app/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------


Mime
View raw message