Merge branch 'master' of https://github.com/apache/roller into ROL-2138
diff --git a/.gitignore b/.gitignore
index c152e92..463a2df 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,31 @@
-./tomcat/*
+# Taken from http://gary-rowe.com/agilestack/2012/10/12/a-gitignore-file-for-intellij-and-eclipse-with-maven/
+#
+# Eclipse
+.classpath
+.project
+.settings/
+
+# Intellij
+.idea/
+*.iml
+*.iws
+
+# NetBeans
+/nb-configuration.xml
+/app/nb-configuration.xml
+/app/nbactions.xml
+
+# Mac
+.DS_Store
+
+# Maven
+log/
+target/
+
+velocity.log
+
+tomcat-base
+docker/postgresql-data
+docker/roller-data
+assembly-release/release.sh
+it-selenium/overlays/
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..53affc4
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,84 @@
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  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.  For additional information regarding
+# copyright in this work, please see the NOTICE file in the top level
+# directory of this distribution.
+
+
+# Example Dockerfile for containerizing Roller
+
+
+# STAGE 1 - BUILD ------------------------------------------------
+
+FROM maven:3.6.0-jdk-11-slim as builder
+
+COPY . /project/
+
+# Build Apache Roller
+
+WORKDIR /tmp
+RUN apt-get update && apt-get install -y git
+RUN git clone https://github.com/apache/roller.git
+WORKDIR /tmp/roller
+RUN git checkout bootstrap-ui; \
+mvn -Duser.home=/builder/home -DskipTests=true -B clean install
+
+
+# STAGE 2 - PACKAGE ------------------------------------------------
+
+FROM tomcat:9.0.20-jre11-slim
+
+# Remove existing Tomcat webapps
+
+RUN rm -rf /usr/local/tomcat/webapps/*
+
+# Add Roller configuration to environment
+
+ARG STORAGE_ROOT=/usr/local/tomcat/data
+ARG DATABASE_JDBC_DRIVERCLASS=org.postgresql.Driver
+ARG DATABASE_JDBC_CONNECTIONURL=jdbc:postgresql://postgresql/rollerdb
+ARG DATABASE_JDBC_USERNAME=scott
+ARG DATABASE_JDBC_PASSWORD=tiger
+ARG DATABASE_HOST=postgresql:5434
+
+ENV STORAGE_ROOT ${STORAGE_ROOT}
+ENV DATABASE_JDBC_DRIVERCLASS ${DATABASE_JDBC_DRIVERCLASS}
+ENV DATABASE_JDBC_CONNECTIONURL ${DATABASE_JDBC_CONNECTIONURL}
+ENV DATABASE_JDBC_USERNAME ${DATABASE_JDBC_USERNAME}
+ENV DATABASE_JDBC_PASSWORD ${DATABASE_JDBC_PASSWORD}
+ENV DATABASE_HOST ${DATABASE_HOST}
+
+# install Roller WAR as ROOT.war, create data dirs
+
+WORKDIR /usr/local/roller
+COPY --from=builder /project/app/target/roller.war /usr/local/tomcat/webapps/ROOT.war
+RUN mkdir -p data/mediafiles data/searchindex
+
+# download PostgreSQL and MySQL drivers plus Mail and Activation JARs
+
+WORKDIR /usr/local/tomcat/lib
+RUN apt-get update && apt-get install -y wget
+RUN wget -O postgresql.jar https://jdbc.postgresql.org/download/postgresql-9.4-1202.jdbc4.jar
+RUN wget http://repo2.maven.org/maven2/javax/mail/mail/1.4.1/mail-1.4.1.jar
+RUN wget http://repo2.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar
+
+# Add Roller entry-point and go!
+
+COPY --from=builder /project/docker/entry-point.sh /usr/local/tomcat/bin
+COPY --from=builder /project/docker/wait-for-it.sh /usr/local/tomcat/bin
+RUN chgrp -R 0 /usr/local/tomcat
+RUN chmod -R g+rw /usr/local/tomcat
+
+WORKDIR /usr/local/tomcat
+ENTRYPOINT /usr/local/tomcat/bin/entry-point.sh
\ No newline at end of file
diff --git a/LICENSE.txt b/LICENSE.txt
index dd7fb9d..1dea5c8 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -340,3 +340,30 @@
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 -------------------------------------------------------------------------------
+This product bundles Summernote WYSIWYG editor, which is available under a
+"MIT" license. For details, see
+/webjars/summernote/0.8.11/dist/summernote.min.js
+https://github.com/summernote/summernote/blob/develop/LICENSE
+
+The MIT License (MIT)
+
+Copyright (c) 2015~ Summernote Team (https://github.com/orgs/summernote/people)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+-------------------------------------------------------------------------------
diff --git a/README.md b/README.md
index 0953102..8b53900 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
+
 # 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.
+[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:
 
@@ -13,21 +13,21 @@
 
 ## Documentation
 
-The Roller Install, User and Template Guides are available in ODT format
-(for OpenOffice or LibraOffice):
+The Roller Install, User and Template Guides are available in ODT format (for OpenOffice or LibraOffice):
 
-* https://github.com/apache/roller/tree/master/docs
+* <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
+* 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
+
+## Quick start: Running via Maven
 
 Assuming you've got a UNIX shell, Java, Maven and Git:
 
@@ -45,10 +45,21 @@
     $ cd app
     $ mvn jetty:run
 
-Browse to http://localhost:8080/roller
+Once Jetty is up and running browse to <http://localhost:8080/roller> to try to Roller.
 
 
+## Quick start: running via Docker
 
+Assuming you've got Docker, here's how you can run Roller for demo purposes.
 
+Get the code:
 
+    $ git clone https://github.com/apache/roller.git
+
+Run Docker Compose to build and launch Roller along with a PostgreSQL database:
+
+    $ cd roller
+    $ docker-compose up
+    
+It will take a while to build the Docker image. Once it's done browse to <http://localhost:8080/roller> to try Roller.
 
diff --git a/app/pom.xml b/app/pom.xml
index b6c9d57..e382560 100644
--- a/app/pom.xml
+++ b/app/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.roller</groupId>
         <artifactId>roller-project</artifactId>
-        <version>5.2.3</version>
+        <version>6.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -33,17 +33,20 @@
     <packaging>war</packaging>
 
     <properties>
-        <angular.version>1.2.29</angular.version>
-        <ant.version>1.10.1</ant.version>
+        <servlet.version>4.0.1</servlet.version>
+        <jsp-api.version>2.2</jsp-api.version>
+        <java-activation.version>1.2.0</java-activation.version>
+        <java-mail.version>1.4.7</java-mail.version>
+        <jstl.version>1.2</jstl.version>
+
+        <angular.version>1.7.8</angular.version>
+        <ant.version>1.10.5</ant.version>
         <commons-validator.version>1.6</commons-validator.version>
         <commons-beanutils.version>1.9.3</commons-beanutils.version>
         <commons-httpclient.version>3.1</commons-httpclient.version>
-        <commons-codec.version>1.10</commons-codec.version>
-        <eclipse-link.version>2.5.2</eclipse-link.version>
-        <guice.version>4.1.0</guice.version>
-        <java-mail.version>1.4.7</java-mail.version>
-        <jsp-api.version>2.2</jsp-api.version>
-        <jstl.version>1.2</jstl.version>
+        <commons-codec.version>1.12</commons-codec.version>
+        <eclipse-link.version>2.7.4</eclipse-link.version>
+        <guice.version>4.2.2</guice.version>
         <log4j.version>1.2.17</log4j.version>
         <log4j2.version>2.10.0</log4j2.version>
         <lucene.version>4.10.4</lucene.version>
@@ -51,22 +54,21 @@
         <maven-war.version>3.1.0</maven-war.version>
         <maven-surefire.version>2.17</maven-surefire.version>
         <maven-antrun.version>1.0b3</maven-antrun.version>
-        <rome.version>1.7.4</rome.version>
-        <servlet.version>3.0.1</servlet.version>
-        <slf4j.version>1.7.25</slf4j.version>
+        <rome.version>1.12.0</rome.version>
+        <slf4j.version>1.7.26</slf4j.version>
         <spring.version>4.1.4.RELEASE</spring.version>
         <spring.security.version>3.2.5.RELEASE</spring.security.version>
-        <struts.version>2.5.17</struts.version>
+        <struts.version>2.5.20</struts.version>
         <velocity.version>1.7</velocity.version>
         <webjars.version>1.5</webjars.version>
         <ws-commons-util.version>1.0.2</ws-commons-util.version>
         <xml-security.version>1.3.0</xml-security.version>
         <xmlrpc-version>3.1.3</xmlrpc-version>
+
     </properties>
 
     <dependencies>
 
-
         <!-- Java EE deps -->
 
         <dependency>
@@ -94,12 +96,18 @@
             <artifactId>mail</artifactId>
             <version>${java-mail.version}</version>
             <scope>provided</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>javax.activation</groupId>
-                    <artifactId>activation</artifactId>
-                </exclusion>
-            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sun.activation</groupId>
+            <artifactId>javax.activation</artifactId>
+            <version>${java-activation.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.xml.bind</groupId>
+            <artifactId>jaxb-api</artifactId>
+            <version>2.3.1</version>
         </dependency>
 
         <!-- Eclipselink JPA is the default JPA implementation used by
@@ -107,12 +115,11 @@
              to use that stack instead.
 
              Logging, other special configuration during JUnit tests can be
-             placed in the src/test/resources/roller-custom.properties
-             file.
+             placed in the src/test/resources/roller-custom.properties file.
          -->
         <dependency>
             <groupId>org.eclipse.persistence</groupId>
-            <artifactId>eclipselink</artifactId>
+            <artifactId>org.eclipse.persistence.jpa</artifactId>
             <version>${eclipse-link.version}</version>
         </dependency>
 
@@ -158,9 +165,41 @@
             <groupId>org.apache.velocity</groupId>
             <artifactId>velocity</artifactId>
             <version>${velocity.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>commons-collections</groupId>
+                    <artifactId>commons-collections</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+            <version>3.2.2</version>
+        </dependency>
+        
+        <!-- explicitly adding newest asm lib to improve compatibility with latest JDKs -->
+
+        <dependency>
+            <groupId>org.ow2.asm</groupId>
+            <artifactId>asm</artifactId>
+            <version>7.0</version>
         </dependency>
 
         <dependency>
+            <groupId>org.ow2.asm</groupId>
+            <artifactId>asm-commons</artifactId>
+            <version>7.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.ow2.asm</groupId>
+            <artifactId>asm-tree</artifactId>
+            <version>7.0</version>
+        </dependency>
+        
+        <dependency>
             <groupId>org.apache.struts</groupId>
             <artifactId>struts2-core</artifactId>
             <version>${struts.version}</version>
@@ -185,6 +224,36 @@
         </dependency>
 
         <dependency>
+            <groupId>org.webjars</groupId>
+            <artifactId>bootstrap</artifactId>
+            <version>3.3.7</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.webjars</groupId>
+            <artifactId>clipboard.js</artifactId>
+            <version>2.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.webjars</groupId>
+            <artifactId>jquery</artifactId>
+            <version>3.3.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.webjars</groupId>
+            <artifactId>jquery-ui</artifactId>
+            <version>1.12.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.webjars.bower</groupId>
+            <artifactId>summernote</artifactId>
+            <version>0.8.11</version>
+        </dependency>
+
+        <dependency>
             <groupId>org.apache.lucene</groupId>
             <artifactId>lucene-analyzers-common</artifactId>
             <scope>compile</scope>
@@ -357,6 +426,12 @@
         </dependency>
 
         <dependency>
+            <groupId>com.jgeppert.struts2.bootstrap</groupId>
+            <artifactId>struts2-bootstrap-plugin</artifactId>
+            <version>2.5.2</version>
+        </dependency>
+
+        <dependency>
             <groupId>com.rometools</groupId>
             <artifactId>rome-fetcher</artifactId>
             <version>${rome.version}</version>
@@ -387,24 +462,17 @@
         </dependency>
 
         <dependency>
-            <groupId>org.webjars.npm</groupId>
-            <artifactId>angular</artifactId>
-            <version>${angular.version}</version>
-        </dependency>
-
-        <dependency>
             <groupId>net.oauth.core</groupId>
             <artifactId>oauth-provider</artifactId>
             <scope>compile</scope>
             <version>${oauth-core.version}</version>
         </dependency>
 
-
         <!-- Test deps -->
 
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
             <scope>test</scope>
         </dependency>
 
@@ -593,7 +661,7 @@
 
             <plugin>
                 <artifactId>maven-surefire-plugin</artifactId>
-                <version>2.17</version>
+                <version>2.22.0</version>
                 <configuration>
                     <systemProperties>
                         <property>
@@ -601,15 +669,12 @@
                             <value>${basedir}/target</value>
                         </property>
                     </systemProperties>
-                    <!--excludes>
-                        <exclude>**/??.java</exclude>
-                    </excludes-->
                 </configuration>
             </plugin>
 
             <plugin>
                 <artifactId>maven-antrun-plugin</artifactId>
-                <version>1.7</version>
+                <version>1.8</version>
                 <dependencies>
                     <dependency>
                         <groupId>ant-contrib</groupId>
diff --git a/app/src/main/java/org/apache/roller/weblogger/TestUtils.java b/app/src/main/java/org/apache/roller/weblogger/TestUtils.java
index b37ad72..125d3f2 100644
--- a/app/src/main/java/org/apache/roller/weblogger/TestUtils.java
+++ b/app/src/main/java/org/apache/roller/weblogger/TestUtils.java
@@ -412,8 +412,7 @@
     public static void teardownWeblogEntry(String id) throws Exception {
 
         // lookup the entry
-        WeblogEntryManager mgr = WebloggerFactory.getWeblogger()
-                .getWeblogEntryManager();
+        WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
         WeblogEntry entry = mgr.getWeblogEntry(id);
 
         // remove the entry
diff --git a/app/src/main/java/org/apache/roller/weblogger/business/MediaFileManager.java b/app/src/main/java/org/apache/roller/weblogger/business/MediaFileManager.java
index 71a7bcd..e345ddd 100644
--- a/app/src/main/java/org/apache/roller/weblogger/business/MediaFileManager.java
+++ b/app/src/main/java/org/apache/roller/weblogger/business/MediaFileManager.java
@@ -53,6 +53,13 @@
             RollerMessages errors) throws WebloggerException;
 
     /**
+     * Create theme media file.
+     * Same as createMediaFile() except no checks are done for uploads disabled, etc.
+     */
+    void createThemeMediaFile(Weblog weblog, MediaFile mediaFile,
+            RollerMessages errors) throws WebloggerException;
+
+    /**
      * Update metadata for a media file
      */
     void updateMediaFile(Weblog weblog, MediaFile mediaFile)
diff --git a/app/src/main/java/org/apache/roller/weblogger/business/WebloggerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/WebloggerImpl.java
index 476ad89..be6be1a 100644
--- a/app/src/main/java/org/apache/roller/weblogger/business/WebloggerImpl.java
+++ b/app/src/main/java/org/apache/roller/weblogger/business/WebloggerImpl.java
@@ -18,9 +18,6 @@
 
 package org.apache.roller.weblogger.business;
 
-import org.apache.roller.weblogger.business.plugins.PluginManager;
-import java.io.IOException;
-import java.util.Properties;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.business.PlanetManager;
@@ -29,8 +26,9 @@
 import org.apache.roller.weblogger.business.pings.AutoPingManager;
 import org.apache.roller.weblogger.business.pings.PingQueueManager;
 import org.apache.roller.weblogger.business.pings.PingTargetManager;
-import org.apache.roller.weblogger.business.search.IndexManager;
+import org.apache.roller.weblogger.business.plugins.PluginManager;
 import org.apache.roller.weblogger.business.runnable.ThreadManager;
+import org.apache.roller.weblogger.business.search.IndexManager;
 import org.apache.roller.weblogger.business.themes.ThemeManager;
 import org.apache.roller.weblogger.config.PingConfig;
 import org.apache.roller.weblogger.config.WebloggerConfig;
@@ -43,6 +41,9 @@
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParserFactory;
 
+import java.io.IOException;
+import java.util.Properties;
+
 
 /**
  * The abstract version of the Weblogger implementation.
diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAMediaFileManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAMediaFileManagerImpl.java
index ab3dc7b..4ebc046 100644
--- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAMediaFileManagerImpl.java
+++ b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAMediaFileManagerImpl.java
@@ -221,6 +221,27 @@
         }
     }
 
+    public void createThemeMediaFile(Weblog weblog, MediaFile mediaFile,
+                                RollerMessages errors) throws WebloggerException {
+
+        FileContentManager cmgr = WebloggerFactory.getWeblogger().getFileContentManager();
+        strategy.store(mediaFile);
+
+        // Refresh associated parent for changes
+        roller.flush();
+        strategy.refresh(mediaFile.getDirectory());
+
+        // update weblog last modified date. date updated by saveWeblog()
+        roller.getWeblogManager().saveWeblog(weblog);
+
+        cmgr.saveFileContent(weblog, mediaFile.getId(),
+            mediaFile.getInputStream());
+
+        if (mediaFile.isImageFile()) {
+            updateThumbnail(mediaFile);
+        }
+    }
+
     private void updateThumbnail(MediaFile mediaFile) {
         try {
             FileContentManager cmgr = WebloggerFactory.getWeblogger()
diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWeblogEntryManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWeblogEntryManagerImpl.java
index 5035f93..7fe517d 100644
--- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWeblogEntryManagerImpl.java
+++ b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWeblogEntryManagerImpl.java
@@ -288,7 +288,7 @@
         this.entryAnchorToIdMap.remove(entry.getWebsite().getHandle()+":"+entry.getAnchor());
     }
     
-    public List getNextPrevEntries(WeblogEntry current, String catName,
+    private List getNextPrevEntries(WeblogEntry current, String catName,
             String locale, int maxEntries, boolean next)
             throws WebloggerException {
 
@@ -462,13 +462,7 @@
             query.setParameter(i+1, params.get(i));
         }
         
-        if (wesc.getOffset() != 0) {
-            query.setFirstResult(wesc.getOffset());
-        }
-        if (wesc.getMaxResults() != -1) {
-            query.setMaxResults(wesc.getMaxResults());
-        }
-        
+        setFirstMax( query, wesc.getOffset(), wesc.getMaxResults() );
         return query.getResultList();
     }
     
@@ -666,12 +660,7 @@
         }
         
         TypedQuery<WeblogEntryComment> query = strategy.getDynamicQuery(queryString.toString(), WeblogEntryComment.class);
-        if (csc.getOffset() != 0) {
-            query.setFirstResult(csc.getOffset());
-        }
-        if (csc.getMaxResults() != -1) {
-            query.setMaxResults(csc.getMaxResults());
-        }
+        setFirstMax( query, csc.getOffset(), csc.getMaxResults());
         for (int i=0; i<params.size(); i++) {
             query.setParameter(i+1, params.get(i));
         }
@@ -758,7 +747,7 @@
      * @inheritDoc
      */
     public Map<Date, List<WeblogEntry>> getWeblogEntryObjectMap(WeblogEntrySearchCriteria wesc) throws WebloggerException {
-        TreeMap<Date, List<WeblogEntry>> map = new TreeMap<Date, List<WeblogEntry>>(Collections.reverseOrder());
+        TreeMap<Date, List<WeblogEntry>> map = new TreeMap<>(Collections.reverseOrder());
 
         List<WeblogEntry> entries = getWeblogEntries(wesc);
 
@@ -769,11 +758,7 @@
 
         for (WeblogEntry entry : entries) {
             Date sDate = DateUtil.getNoonOfDay(entry.getPubTime(), cal);
-            List<WeblogEntry> dayEntries = map.get(sDate);
-            if (dayEntries == null) {
-                dayEntries = new ArrayList<WeblogEntry>();
-                map.put(sDate, dayEntries);
-            }
+            List<WeblogEntry> dayEntries = map.computeIfAbsent(sDate, k -> new ArrayList<>());
             dayEntries.add(entry);
         }
         return map;
@@ -843,12 +828,7 @@
                 query.setParameter(1, end);
             }
         }
-        if (offset != 0) {
-            query.setFirstResult(offset);
-        }
-        if (length != -1) {
-            query.setMaxResults(length);
-        }
+        setFirstMax( query, offset, length);
         queryResults = query.getResultList();
         List<StatCount> results = new ArrayList<StatCount>();
         if (queryResults != null) {
@@ -951,12 +931,7 @@
                         "WeblogEntryTagAggregate.getPopularTagsByWebsiteNull", TagStat.class);
             }
         }
-        if (offset != 0) {
-            query.setFirstResult(offset);
-        }
-        if (limit != -1) {
-            query.setMaxResults(limit);
-        }
+        setFirstMax( query, offset, limit);
         queryResults = query.getResultList();
         
         double min = Integer.MAX_VALUE;
@@ -1029,12 +1004,7 @@
         for (int i=0; i<params.size(); i++) {
             query.setParameter(i+1, params.get(i));
         }
-        if (offset != 0) {
-            query.setFirstResult(offset);
-        }
-        if (limit != -1) {
-            query.setMaxResults(limit);
-        }
+        setFirstMax( query, offset, limit);
         queryResults = query.getResultList();
         
         List<TagStat> results = new ArrayList<TagStat>();
@@ -1214,26 +1184,36 @@
     throws WebloggerException {
         
         // figure out start date
-        Calendar cal = Calendar.getInstance();
-        cal.setTime(new Date());
-        cal.add(Calendar.DATE, -1 * sinceDays);
-        Date startDate = cal.getTime();
+        Date startDate = getStartDateNow(sinceDays);
 
-        TypedQuery<WeblogHitCount> query = strategy.getNamedQuery(
+        TypedQuery<WeblogHitCount> query;
+        query = strategy.getNamedQuery(
                 "WeblogHitCount.getByWeblogEnabledTrueAndActiveTrue&DailyHitsGreaterThenZero&WeblogLastModifiedGreaterOrderByDailyHitsDesc",
                 WeblogHitCount.class);
         query.setParameter(1, startDate);
-        
+        setFirstMax( query, offset, length );
+        return query.getResultList();
+    }
+
+
+    private static void setFirstMax( Query query, int offset, int length )  {
         if (offset != 0) {
             query.setFirstResult(offset);
         }
         if (length != -1) {
             query.setMaxResults(length);
-        }        
-        return query.getResultList();
+        }
     }
-    
-    
+
+
+    public static Date getStartDateNow(int sinceDays) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(new Date());
+        cal.add(Calendar.DATE, -1 * sinceDays);
+        return cal.getTime();
+    }
+
+
     /**
      * @inheritDoc
      */
diff --git a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java
index a06c4da..0cc005d 100644
--- a/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java
+++ b/app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.java
@@ -21,21 +21,12 @@
 import org.apache.roller.planet.business.PlanetURLStrategy;
 import org.apache.roller.planet.business.fetcher.FeedFetcher;
 import org.apache.roller.weblogger.WebloggerException;
-import org.apache.roller.weblogger.business.BookmarkManager;
-import org.apache.roller.weblogger.business.FileContentManager;
-import org.apache.roller.weblogger.business.OAuthManager;
-import org.apache.roller.weblogger.business.MediaFileManager;
-import org.apache.roller.weblogger.business.PropertiesManager;
-import org.apache.roller.weblogger.business.URLStrategy;
-import org.apache.roller.weblogger.business.WebloggerImpl;
-import org.apache.roller.weblogger.business.UserManager;
-import org.apache.roller.weblogger.business.WeblogEntryManager;
-import org.apache.roller.weblogger.business.WeblogManager;
-import org.apache.roller.weblogger.business.runnable.ThreadManager;
+import org.apache.roller.weblogger.business.*;
 import org.apache.roller.weblogger.business.pings.AutoPingManager;
 import org.apache.roller.weblogger.business.pings.PingQueueManager;
 import org.apache.roller.weblogger.business.pings.PingTargetManager;
 import org.apache.roller.weblogger.business.plugins.PluginManager;
+import org.apache.roller.weblogger.business.runnable.ThreadManager;
 import org.apache.roller.weblogger.business.search.IndexManager;
 import org.apache.roller.weblogger.business.themes.ThemeManager;
 
diff --git a/app/src/main/java/org/apache/roller/weblogger/business/search/IndexManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/search/IndexManagerImpl.java
index 77bd8e6..e835c4f 100644
--- a/app/src/main/java/org/apache/roller/weblogger/business/search/IndexManagerImpl.java
+++ b/app/src/main/java/org/apache/roller/weblogger/business/search/IndexManagerImpl.java
@@ -21,8 +21,11 @@
 import java.io.File;
 import java.io.IOException;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+import org.apache.commons.beanutils.ConstructorUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.lucene.analysis.Analyzer;
@@ -36,6 +39,7 @@
 import org.apache.lucene.store.FSDirectory;
 import org.apache.lucene.store.IOContext;
 import org.apache.lucene.store.RAMDirectory;
+import org.apache.lucene.util.Version;
 import org.apache.roller.weblogger.WebloggerException;
 import org.apache.roller.weblogger.business.InitializationException;
 import org.apache.roller.weblogger.business.Weblogger;
@@ -90,7 +94,7 @@
 
     /**
      * Creates a new lucene index manager. This should only be created once.
-     * Creating the index manager more than once will definately result in
+     * Creating the index manager more than once will definitely result in
      * errors. The preferred way of getting an index is through the
      * RollerContext.
      * 
@@ -236,7 +240,25 @@
      * @return Analyzer to be used in manipulating the database.
      */
     public static final Analyzer getAnalyzer() {
-        return new StandardAnalyzer(FieldConstants.LUCENE_VERSION);
+        return instantiateAnalyzer(FieldConstants.LUCENE_VERSION);
+    }
+
+    private static Analyzer instantiateAnalyzer(final Version luceneVersion) {
+        final String className = WebloggerConfig.getProperty("lucene.analyzer.class");
+        try {
+            final Class<?> clazz = Class.forName(className);
+            return (Analyzer) ConstructorUtils.invokeConstructor(clazz, luceneVersion);
+        } catch (final ClassNotFoundException e) {
+            mLogger.error("failed to lookup analyzer class: " + className, e);
+            return instantiateDefaultAnalyzer(luceneVersion);
+        } catch (final NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
+            mLogger.error("failed to instantiate analyzer: " + className, e);
+            return instantiateDefaultAnalyzer(luceneVersion);
+        }
+    }
+
+    private static Analyzer instantiateDefaultAnalyzer(final Version luceneVersion) {
+        return new StandardAnalyzer(luceneVersion);
     }
 
     private void scheduleIndexOperation(final IndexOperation op) {
diff --git a/app/src/main/java/org/apache/roller/weblogger/business/search/operations/IndexOperation.java b/app/src/main/java/org/apache/roller/weblogger/business/search/operations/IndexOperation.java
index c937978..a851327 100644
--- a/app/src/main/java/org/apache/roller/weblogger/business/search/operations/IndexOperation.java
+++ b/app/src/main/java/org/apache/roller/weblogger/business/search/operations/IndexOperation.java
@@ -169,9 +169,9 @@
     protected IndexWriter beginWriting() {
         try {
 
-            // Limit to 1000 tokens.
             LimitTokenCountAnalyzer analyzer = new LimitTokenCountAnalyzer(
-                    IndexManagerImpl.getAnalyzer(), 1000);
+                    IndexManagerImpl.getAnalyzer(),
+                    WebloggerConfig.getIntProperty("lucene.analyzer.maxTokenCount"));
 
             IndexWriterConfig config = new IndexWriterConfig(
                     FieldConstants.LUCENE_VERSION, analyzer);
diff --git a/app/src/main/java/org/apache/roller/weblogger/business/themes/SharedThemeFromDir.java b/app/src/main/java/org/apache/roller/weblogger/business/themes/SharedThemeFromDir.java
index 061f17b..cc872d1 100644
--- a/app/src/main/java/org/apache/roller/weblogger/business/themes/SharedThemeFromDir.java
+++ b/app/src/main/java/org/apache/roller/weblogger/business/themes/SharedThemeFromDir.java
@@ -194,8 +194,7 @@
         setEnabled(true);
 
         // load resource representing preview image
-        File previewFile = new File(this.themeDir + File.separator
-                + themeMetadata.getPreviewImage());
+        File previewFile = new File(this.themeDir + File.separator + themeMetadata.getPreviewImage());
         if (!previewFile.exists() || !previewFile.canRead()) {
             log.warn("Couldn't read theme [" + this.getName()
                     + "] preview image file ["
diff --git a/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java
index ed5f6a9..a90ec10 100644
--- a/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java
+++ b/app/src/main/java/org/apache/roller/weblogger/business/themes/ThemeManagerImpl.java
@@ -157,8 +157,7 @@
 
 			// otherwise we are returning a WeblogSharedTheme
 		} else {
-			SharedTheme staticTheme = (SharedTheme) this.themes.get(weblog
-					.getEditorTheme());
+			SharedTheme staticTheme = (SharedTheme) this.themes.get(weblog.getEditorTheme());
 			if (staticTheme != null) {
 				weblogTheme = new WeblogSharedTheme(weblog, staticTheme);
 			} else {
@@ -317,19 +316,15 @@
 					justName = resourcePath;
 
 				} else {
-					justPath = resourcePath.substring(0,
-							resourcePath.lastIndexOf('/'));
+					justPath = resourcePath.substring(0, resourcePath.lastIndexOf('/'));
 					if (!justPath.startsWith("/")) {
                         justPath = "/" + justPath;
                     }
-					justName = resourcePath.substring(resourcePath
-							.lastIndexOf('/') + 1);
-					mdir = fileMgr.getMediaFileDirectoryByName(weblog,
-							justPath);
+					justName = resourcePath.substring(resourcePath.lastIndexOf('/') + 1);
+					mdir = fileMgr.getMediaFileDirectoryByName(weblog, justPath);
 					if (mdir == null) {
 						log.debug("    Creating directory: " + justPath);
-						mdir = fileMgr.createMediaFileDirectory(weblog,
-								justPath);
+						mdir = fileMgr.createMediaFileDirectory(weblog, justPath);
 						roller.flush();
 					}
 				}
@@ -354,7 +349,7 @@
 				log.debug("    Saving file: " + justName);
 				log.debug("    Saving in directory = " + mf.getDirectory());
 				RollerMessages errors = new RollerMessages();
-				fileMgr.createMediaFile(weblog, mf, errors);
+				fileMgr.createThemeMediaFile(weblog, mf, errors);
 				try {
 					resource.getInputStream().close();
 				} catch (IOException ex) {
@@ -398,8 +393,7 @@
             // now go through each theme and load it into a Theme object
             for (String themeName : themenames) {
                 try {
-                    SharedTheme theme = new SharedThemeFromDir(this.themeDir
-                            + File.separator + themeName);
+                    SharedTheme theme = new SharedThemeFromDir(this.themeDir + File.separator + themeName);
                     themeMap.put(theme.getId(), theme);
                     log.info("Loaded theme '" + themeName + "'");
                 } catch (Exception unexpected) {
diff --git a/app/src/main/java/org/apache/roller/weblogger/config/runtime/ConfigDef.java b/app/src/main/java/org/apache/roller/weblogger/config/runtime/ConfigDef.java
index 7a19408..f7b583d 100644
--- a/app/src/main/java/org/apache/roller/weblogger/config/runtime/ConfigDef.java
+++ b/app/src/main/java/org/apache/roller/weblogger/config/runtime/ConfigDef.java
@@ -15,27 +15,27 @@
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */
-/*
- * ConfigDef.java
- *
- * Created on June 4, 2005, 1:10 PM
- */
-
 package org.apache.roller.weblogger.config.runtime;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+
 
 /**
  * Represents a logic grouping of runtime configuration properties.
  * Each ConfigDef may contain 0 or more DisplayGroups.
  *
+ * Created on June 4, 2005, 1:10 PM
  * @author Allen Gilliland
  */
 public class ConfigDef {
     
     private List<DisplayGroup> displayGroups = null;
     private String name = null;
+
+    Map<String, PropertyDef> propertyDefs = null;
     
     
     public ConfigDef() {
@@ -53,8 +53,8 @@
     public boolean removeDisplayGroup(DisplayGroup group) {
         return this.displayGroups.remove(group);
     }
-    
-    
+
+
     public String toString() {
         return name;
     }
@@ -74,5 +74,16 @@
     public void setName(String name) {
         this.name = name;
     }
-    
+
+    public PropertyDef getPropertyDef( String name ) {
+        if ( propertyDefs == null ) {
+            propertyDefs = new HashMap<>();
+            for (DisplayGroup displayGroup : getDisplayGroups()) {
+                for (PropertyDef propertyDef : displayGroup.getPropertyDefs()) {
+                    propertyDefs.put( propertyDef.getName(), propertyDef );
+                }
+            }
+        }
+        return propertyDefs.get( name );
+    }
 }
diff --git a/app/src/main/java/org/apache/roller/weblogger/config/runtime/PropertyDef.java b/app/src/main/java/org/apache/roller/weblogger/config/runtime/PropertyDef.java
index 636d754..032bd15 100644
--- a/app/src/main/java/org/apache/roller/weblogger/config/runtime/PropertyDef.java
+++ b/app/src/main/java/org/apache/roller/weblogger/config/runtime/PropertyDef.java
@@ -52,11 +52,15 @@
     public String toString() {
         return "["+name+","+key+","+type+","+defaultValue+","+rows+","+cols+"]";
     }
-    
+
     public String getName() {
         return name;
     }
 
+    public String getNameWithUnderbars() {
+        return name.replace(".", "_");
+    }
+
     public void setName(String name) {
         this.name = name;
     }
diff --git a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java
index afa97cf..d110e69 100644
--- a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java
+++ b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java
@@ -18,9 +18,6 @@
 
 package org.apache.roller.weblogger.planet.ui;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.RollerException;
@@ -33,9 +30,12 @@
 import org.apache.roller.weblogger.config.runtime.RuntimeConfigDefs;
 import org.apache.roller.weblogger.pojos.GlobalPermission;
 import org.apache.roller.weblogger.pojos.RuntimeConfigProperty;
-import org.apache.struts2.convention.annotation.AllowedMethods;
 import org.apache.struts2.interceptor.ParameterAware;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
 
 /**
  * Planet Config Action.
diff --git a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupSubs.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupSubs.java
new file mode 100644
index 0000000..26586d0
--- /dev/null
+++ b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupSubs.java
@@ -0,0 +1,343 @@
+/*
+ * Copyright 2005 Sun Microsystems, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.roller.weblogger.planet.ui;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.RollerException;
+import org.apache.roller.planet.business.PlanetManager;
+import org.apache.roller.planet.business.fetcher.FeedFetcher;
+import org.apache.roller.planet.business.fetcher.FetcherException;
+import org.apache.roller.planet.pojos.Planet;
+import org.apache.roller.planet.pojos.PlanetGroup;
+import org.apache.roller.planet.pojos.Subscription;
+import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.apache.roller.weblogger.pojos.GlobalPermission;
+import org.apache.struts2.interceptor.ServletRequestAware;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+
+/**
+ * Manage planet group subscriptions, default group is "all".
+ */
+// TODO: make this work @AllowedMethods({"execute","saveSubscription","saveGroup","deleteSubscription"})
+public class PlanetGroupSubs extends PlanetUIAction implements ServletRequestAware {
+
+    private static final Log log = LogFactory.getLog(PlanetGroupSubs.class);
+
+    // the planet group we are working in
+    private PlanetGroup group = null;
+
+    // the subscription to deal with
+    private String subUrl = null;
+
+    private Boolean createNew = null;
+
+    public PlanetGroupSubs() {
+        this.actionName = "planetGroupSubs";
+        this.desiredMenu = "admin";
+    }
+
+
+    @Override
+    public List<String> requiredGlobalPermissionActions() {
+        return Collections.singletonList(GlobalPermission.ADMIN);
+    }
+
+    @Override
+    public boolean isWeblogRequired() {
+        return false;
+    }
+
+
+    @Override
+    public void setServletRequest(HttpServletRequest request) {
+        if (request.getParameter("createNew") != null) {
+            group = new PlanetGroup();
+        } else {
+            group = getGroupFromRequest(request, getPlanet());
+        }
+    }
+
+
+    static PlanetGroup getGroupFromRequest(HttpServletRequest request, Planet planet) {
+        PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager();
+        PlanetGroup planetGroup = null;
+        String action = null;
+        try {
+            if (request.getParameter("group.id") != null) {
+                String groupId = request.getParameter("group.id");
+                action = "looking up planet group by id: " + groupId;
+                planetGroup = pmgr.getGroupById(groupId);
+
+            } else if (request.getParameter("group.handle") != null) {
+                String groupHandle = request.getParameter("group.handle");
+                action = "looking up planet group by handle: " + groupHandle;
+                planetGroup = pmgr.getGroup(planet, groupHandle);
+
+            } else {
+                action = "getting default group";
+                planetGroup = pmgr.getGroup(planet, "all");
+            }
+        } catch (Exception ex) {
+            log.error("Error " + action, ex);
+        }
+        return planetGroup;
+    }
+
+    /**
+     * Populate page model and forward to subscription page
+     */
+    public String execute() {
+        return LIST;
+    }
+
+    /**
+     * Save group.
+     */
+    public String saveGroup() {
+
+        validateGroup();
+
+        if (!hasActionErrors()) {
+            try {
+                PlanetManager planetManager = WebloggerFactory.getWeblogger().getPlanetManager();
+
+                PlanetGroup existingGroup = planetManager.getGroup(getPlanet(), getGroup().getHandle());
+
+                if (existingGroup == null) {
+                    log.debug("Adding New Group: " + getGroup().getHandle());
+                    planetManager.saveNewPlanetGroup(getPlanet(), getGroup());
+
+                } else {
+                    log.debug("Updating Existing Group: " + existingGroup.getHandle());
+                    existingGroup.setTitle( getGroup().getTitle() );
+                    existingGroup.setHandle( getGroup().getHandle() );
+                    planetManager.saveGroup(existingGroup);
+                }
+
+                WebloggerFactory.getWeblogger().flush();
+                addMessage("planetGroups.success.saved");
+
+            } catch (Exception ex) {
+                log.error("Error saving planet group", ex);
+                addError("planetGroups.error.saved");
+            }
+        }
+
+        return LIST;
+    }
+
+    /**
+     * Validate posted group
+     */
+    private void validateGroup() {
+
+        if (StringUtils.isEmpty(getGroup().getTitle())) {
+            addError("planetGroups.error.title");
+        }
+
+        if (StringUtils.isEmpty(getGroup().getHandle())) {
+            addError("planetGroups.error.handle");
+        }
+
+        if (getGroup().getHandle() != null && "all".equals(getGroup().getHandle())) {
+            addError("planetGroups.error.nameReserved");
+        }
+
+        // make sure duplicate group handles are prevented
+    }
+
+
+    /**
+     * Save subscription, add to current group
+     */
+    public String saveSubscription() {
+
+        valudateNewSub();
+
+        if (!hasActionErrors()) {
+            try {
+                PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager();
+
+                // check if this subscription already exists before adding it
+                Subscription sub = pmgr.getSubscription(getSubUrl());
+                if (sub == null) {
+                    log.debug("Adding New Subscription - " + getSubUrl());
+
+                    // sub doesn't exist yet, so we need to fetch it
+                    FeedFetcher fetcher = WebloggerFactory.getWeblogger().getFeedFetcher();
+                    sub = fetcher.fetchSubscription(getSubUrl());
+
+                    // save new sub
+                    pmgr.saveSubscription(sub);
+
+                } else {
+                    // Subscription already exists
+                    log.debug("Adding Existing Subscription - " + getSubUrl());
+                }
+
+                // add the sub to the group
+                group.getSubscriptions().add(sub);
+                sub.getGroups().add(group);
+                pmgr.saveGroup(group);
+                WebloggerFactory.getWeblogger().flush();
+
+                // clear field after success
+                setSubUrl(null);
+
+                addMessage("planetSubscription.success.saved");
+
+            } catch (FetcherException ex) {
+                addError("planetGroupSubs.error.fetchingFeed", ex.getRootCauseMessage());
+
+            } catch (RollerException ex) {
+                log.error("Unexpected error saving subscription", ex);
+                addError("planetGroupSubs.error.duringSave", ex.getRootCauseMessage());
+            }
+        }
+
+        return LIST;
+    }
+
+
+    /**
+     * Delete subscription, reset form
+     */
+    public String deleteSubscription() {
+
+        if (getSubUrl() != null) {
+            try {
+
+                PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager();
+
+                Subscription sub = pmgr.getSubscription(getSubUrl());
+
+                // remove sub from group
+                getGroup().getSubscriptions().remove(sub);
+                pmgr.saveGroup(getGroup());
+
+                // remove group from sub
+                sub.getGroups().remove(getGroup());
+                pmgr.saveSubscription(sub);
+
+                WebloggerFactory.getWeblogger().flush();
+
+                // clear field after success
+                setSubUrl(null);
+
+                addMessage("planetSubscription.success.deleted");
+
+            } catch (RollerException ex) {
+                log.error("Error removing planet subscription", ex);
+                addError("planetSubscription.error.deleting");
+            }
+        }
+
+        return LIST;
+    }
+
+
+    /**
+     * Validate posted subscription
+     */
+    private void valudateNewSub() {
+
+        if (StringUtils.isEmpty(getSubUrl())) {
+            addError("planetSubscription.error.feedUrl");
+        }
+    }
+
+
+    @Override
+    public String getPageTitle() {
+        if (pageTitle == null) {
+            if (getCreateNew()) {
+                pageTitle = getText("planetGroupSubs.custom.title.new");
+            } else if (getGroup().getHandle().equals("all")) {
+                pageTitle = getText("planetGroupSubs.default.title");
+            } else {
+                pageTitle = getText("planetGroupSubs.custom.title", new String[]{getGroup().getHandle()});
+            }
+        }
+        return pageTitle;
+    }
+
+
+    public List<Subscription> getSubscriptions() {
+
+        List<Subscription> subs = Collections.emptyList();
+        if (getGroup() != null) {
+            Set<Subscription> subsSet = getGroup().getSubscriptions();
+
+            // iterate over list and build display list
+            subs = new ArrayList<>();
+            for (Subscription sub : subsSet) {
+                // only include external subs for display
+                if (!sub.getFeedURL().startsWith("weblogger:")) {
+                    subs.add(sub);
+                }
+            }
+        }
+
+        return subs;
+    }
+
+    public PlanetGroup getGroup() {
+        return group;
+    }
+
+    public void setGroup(PlanetGroup group) {
+        this.group = group;
+    }
+
+    public String getSubUrl() {
+        return subUrl;
+    }
+
+    public void setSubUrl(String subUrl) {
+        this.subUrl = subUrl;
+    }
+
+    public boolean getCreateNew() {
+        if (createNew == null) {
+            PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager();
+            PlanetGroup existingGroup = null;
+            try {
+                existingGroup = pmgr.getGroupById(group.getId());
+            } catch (RollerException e) {
+                log.error("Error getting group by ID", e);
+            }
+            createNew = (existingGroup == null);
+        }
+        return createNew;
+    }
+
+    public void setCreateNew(boolean createNew) {
+        // no op
+    }
+
+    public String getGroupHandle() {
+        return group.getHandle();
+    }
+
+}
+
+
diff --git a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java
index f65c480..ee3dff9 100644
--- a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java
+++ b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java
@@ -16,186 +16,76 @@
 
 package org.apache.roller.weblogger.planet.ui;
 
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.business.PlanetManager;
-import org.apache.roller.planet.pojos.Planet;
 import org.apache.roller.planet.pojos.PlanetGroup;
-import org.apache.roller.weblogger.business.Weblogger;
 import org.apache.roller.weblogger.business.WebloggerFactory;
-import org.apache.struts2.convention.annotation.AllowedMethods;
+import org.apache.struts2.interceptor.ServletRequestAware;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
 
 
 /**
  * Manage planet groups.
  */
 // TODO: make this work @AllowedMethods({"execute","save","delete"})
-public class PlanetGroups extends PlanetUIAction {
-    
+public class PlanetGroups extends PlanetUIAction  implements ServletRequestAware {
+
     private static Log log = LogFactory.getLog(PlanetGroups.class);
-    
-    // a bean to manage submitted data
-    private PlanetGroupsBean bean = new PlanetGroupsBean();
-    
-    // the planet group we are working on
+
+    /** Group being deleted */
     private PlanetGroup group = null;
-    
-    
+
     public PlanetGroups() {
         this.actionName = "planetGroups";
         this.desiredMenu = "admin";
         this.pageTitle = "planetGroups.pagetitle";
     }
-    
-    
+
     @Override
     public boolean isWeblogRequired() {
         return false;
     }
-    
-    
+
     @Override
-    public void myPrepare() {
-        
-        if(getPlanet() != null && getBean().getId() != null) {
-            try {
-                PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager();
-                setGroup(pmgr.getGroupById(getBean().getId()));
-            } catch(Exception ex) {
-                log.error("Error looking up planet group - " + getBean().getId(), ex);
-            }
-        }
+    public void setServletRequest(HttpServletRequest request) {
+        group = PlanetGroupSubs.getGroupFromRequest(request, getPlanet());
     }
 
-    
-    /** 
+    /**
      * Show planet groups page.
      */
     public String execute() {
-        
-        // if we are loading an existing group then populate the bean
-        if(getGroup() != null) {
-            getBean().copyFrom(getGroup());
-        }
-        
         return LIST;
     }
 
-
     /**
-     * Save group.
-     */
-    public String save() {
-
-        myValidate();
-
-        if (!hasActionErrors()) {
-            try {
-                PlanetManager planetManager = WebloggerFactory.getWeblogger().getPlanetManager();
-
-                Planet planet = getPlanet();
-                PlanetGroup planetGroup = getGroup();
-
-                if (planetGroup == null) {
-                    planetGroup = new PlanetGroup();
-                    planetGroup.setPlanet(planet);
-                    getBean().copyTo(planetGroup);
-
-                    log.debug("Adding New Group: " + planetGroup.getHandle());
-                    planetManager.saveNewPlanetGroup(getPlanet(), planetGroup);
-
-                } else {
-                    log.debug("Updating Existing Group: " + planetGroup.getHandle());
-                    getBean().copyTo(planetGroup);
-                    planetManager.saveGroup(planetGroup);
-                }
-
-                WebloggerFactory.getWeblogger().flush();
-                addMessage("planetGroups.success.saved");
-
-                setGroup(null);
-
-            } catch (Exception ex) {
-                log.error("Error saving planet group - " + getBean().getId(), ex);
-                addError("planetGroups.error.saved");
-            }
-        }
-
-        return LIST;
-    }
-
-    
-    /** 
-     * Delete group, reset form  
+     * Delete group
      */
     public String delete() {
-        
-        if(getGroup() != null) {
+
+        if (getGroup() != null) {
             try {
                 PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager();
                 pmgr.deleteGroup(getGroup());
                 WebloggerFactory.getWeblogger().flush();
-                
+
                 addMessage("planetSubscription.success.deleted");
 
                 setGroup(null);
 
-            } catch(Exception ex) {
-                log.error("Error deleting planet group - "+getBean().getId());
+            } catch (Exception ex) {
+                log.error("Error deleting planet group - " + getGroup().getId());
                 addError("Error deleting planet group");
             }
         }
-        
+
         return LIST;
     }
-    
-    
-    /** 
-     * Validate posted group 
-     */
-    private void myValidate() {
-        
-        if(StringUtils.isEmpty(getBean().getTitle())) {
-            addError("planetGroups.error.title");
-        }
-        
-        if(StringUtils.isEmpty(getBean().getHandle())) {
-            addError("planetGroups.error.handle");
-        }
-        
-        if(getBean().getHandle() != null && "all".equals(getBean().getHandle())) {
-            addError("planetGroups.error.nameReserved");
-        }
-        
-        // make sure duplicate group handles are prevented
-    }
-    
-    
-    public List<PlanetGroup> getGroups() {
-        List<PlanetGroup> displayGroups = new ArrayList<PlanetGroup>();
-        
-        for (PlanetGroup planetGroup : getPlanet().getGroups()) {
-            // The "all" group is considered a special group and cannot be
-            // managed independently
-            if (!planetGroup.getHandle().equals("all")) {
-                displayGroups.add(planetGroup);
-            }
-        }
-        return displayGroups;
-    }
-    
-    
-    public PlanetGroupsBean getBean() {
-        return bean;
-    }
 
-    public void setBean(PlanetGroupsBean bean) {
-        this.bean = bean;
-    }
-    
     public PlanetGroup getGroup() {
         return group;
     }
@@ -203,5 +93,19 @@
     public void setGroup(PlanetGroup group) {
         this.group = group;
     }
-    
+
+    public List<PlanetGroup> getGroups() {
+        List<PlanetGroup> displayGroups = new ArrayList<PlanetGroup>();
+
+        for (PlanetGroup planetGroup : getPlanet().getGroups()) {
+            // The "all" group is considered a special group and cannot be managed independently
+            if (!planetGroup.getHandle().equals("all")) {
+                displayGroups.add(planetGroup);
+            }
+        }
+        return displayGroups;
+    }
+
+
+
 }
diff --git a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupsBean.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupsBean.java
deleted file mode 100644
index 10ef516..0000000
--- a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetGroupsBean.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  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.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- */
-
-package org.apache.roller.weblogger.planet.ui;
-
-import org.apache.roller.planet.pojos.PlanetGroup;
-
-
-/**
- * A simple bean for managing the form data used by the PlanetGroups.
- */
-public class PlanetGroupsBean {
-    
-    private String id = null;
-    private String title = null;
-    private String handle = null;
-    
-    
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getTitle() {
-        return title;
-    }
-
-    public void setTitle(String title) {
-        this.title = title;
-    }
-
-    public String getHandle() {
-        return handle;
-    }
-
-    public void setHandle(String handle) {
-        this.handle = handle;
-    }
-    
-    
-    public void copyTo(PlanetGroup dataHolder) {
-        
-        dataHolder.setTitle(getTitle());
-        dataHolder.setHandle(getHandle());
-    }
-    
-    
-    public void copyFrom(PlanetGroup dataHolder) {
-        
-        setId(dataHolder.getId());
-        setTitle(dataHolder.getTitle());
-        setHandle(dataHolder.getHandle());
-    }
-    
-}
diff --git a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetSubscriptions.java b/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetSubscriptions.java
deleted file mode 100644
index 899eaa2..0000000
--- a/app/src/main/java/org/apache/roller/weblogger/planet/ui/PlanetSubscriptions.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright 2005 Sun Microsystems, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.roller.weblogger.planet.ui;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.roller.RollerException;
-import org.apache.roller.planet.business.PlanetManager;
-import org.apache.roller.planet.business.fetcher.FeedFetcher;
-import org.apache.roller.planet.pojos.PlanetGroup;
-import org.apache.roller.planet.pojos.Subscription;
-import org.apache.roller.weblogger.business.WebloggerFactory;
-import org.apache.roller.weblogger.pojos.GlobalPermission;
-import org.apache.struts2.convention.annotation.AllowedMethods;
-
-
-/**
- * Manage planet group subscriptions, default group is "all".
- */
-// TODO: make this work @AllowedMethods({"execute","save","delete"})
-public class PlanetSubscriptions extends PlanetUIAction {
-    
-    private static final Log LOGGER = LogFactory.getLog(PlanetSubscriptions.class);
-    
-    // id of the group we are working in
-    private String groupHandle = null;
-    
-    // the planet group we are working in
-    private PlanetGroup group = null;
-    
-    // the subscription to deal with
-    private String subUrl = null;
-    
-    
-    public PlanetSubscriptions() {
-        this.actionName = "planetSubscriptions";
-        this.desiredMenu = "admin";
-        this.pageTitle = "planetSubscriptions.title";
-    }
-    
-    
-    @Override
-    public List<String> requiredGlobalPermissionActions() {
-        return Collections.singletonList(GlobalPermission.ADMIN);
-    }
-    
-    @Override
-    public boolean isWeblogRequired() {
-        return false;
-    }
-    
-    
-    @Override
-    public void myPrepare() {
-        
-        PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager();
-        
-        // lookup group we are operating on, if none specified then use default
-        if (getGroupHandle() == null) {
-            setGroupHandle("all");
-        }
-        
-        try {
-            setGroup(pmgr.getGroup(getPlanet(), getGroupHandle()));
-        } catch (RollerException ex) {
-            LOGGER.error("Error looking up planet group - " + getGroupHandle(), ex);
-        }
-    }
-    
-    
-    /**
-     * Populate page model and forward to subscription page
-     */
-    public String execute() {
-        return LIST;
-    }
-
-    
-    /** 
-     * Save subscription, add to current group 
-     */
-    public String save() {
-        
-        myValidate();
-        
-        if(!hasActionErrors()) {
-            try {
-                PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager();
-
-                // check if this subscription already exists before adding it
-                Subscription sub = pmgr.getSubscription(getSubUrl());
-                if(sub == null) {
-                    LOGGER.debug("Adding New Subscription - " + getSubUrl());
-
-                    // sub doesn't exist yet, so we need to fetch it
-                    FeedFetcher fetcher = WebloggerFactory.getWeblogger().getFeedFetcher();
-                    sub = fetcher.fetchSubscription(getSubUrl());
-
-                    // save new sub
-                    pmgr.saveSubscription(sub);
-                } else {
-                    LOGGER.debug("Adding Existing Subscription - " + getSubUrl());
-
-                    // Subscription already exists
-                    addMessage("planetSubscription.foundExisting", sub.getTitle());
-                }
-
-                // add the sub to the group
-                group.getSubscriptions().add(sub);
-                sub.getGroups().add(group);
-                pmgr.saveGroup(group);
-
-                // flush changes
-                WebloggerFactory.getWeblogger().flush();
-
-                // clear field after success
-                setSubUrl(null);
-
-                addMessage("planetSubscription.success.saved");
-
-            } catch (RollerException ex) {
-                LOGGER.error("Unexpected error saving subscription", ex);
-                addError("planetSubscriptions.error.duringSave", ex.getRootCauseMessage());
-            }
-        }
-        
-        return LIST;
-    }
-
-    
-    /** 
-     * Delete subscription, reset form  
-     */
-    public String delete() {
-        
-        if(getSubUrl() != null) {
-            try {
-
-                PlanetManager pmgr = WebloggerFactory.getWeblogger().getPlanetManager();
-
-                // remove subscription
-                Subscription sub = pmgr.getSubscription(getSubUrl());
-                getGroup().getSubscriptions().remove(sub);
-                sub.getGroups().remove(getGroup());
-                pmgr.saveGroup(getGroup());
-                WebloggerFactory.getWeblogger().flush();
-
-                // clear field after success
-                setSubUrl(null);
-
-                addMessage("planetSubscription.success.deleted");
-
-            } catch (RollerException ex) {
-                LOGGER.error("Error removing planet subscription", ex);
-                addError("planetSubscription.error.deleting");
-            }
-        }
-
-        return LIST;
-    }
-    
-    
-    /** 
-     * Validate posted subscription
-     */
-    private void myValidate() {
-        
-        if(StringUtils.isEmpty(getSubUrl())) {
-            addError("planetSubscription.error.feedUrl");
-        }
-    }
-    
-    
-    public List<Subscription> getSubscriptions() {
-        
-        List<Subscription> subs = Collections.emptyList();
-        if(getGroup() != null) {
-            Set<Subscription> subsSet = getGroup().getSubscriptions();
-            
-            // iterate over list and build display list
-            subs = new ArrayList<Subscription>();
-            for (Subscription sub : subsSet) {
-                // only include external subs for display
-                if(!sub.getFeedURL().startsWith("weblogger:")) {
-                    subs.add(sub);
-                }
-            }
-        }
-        
-        return subs;
-    }
-    
-    
-    public String getGroupHandle() {
-        return groupHandle;
-    }
-
-    public void setGroupHandle(String groupHandle) {
-        this.groupHandle = groupHandle;
-    }
-    
-    public PlanetGroup getGroup() {
-        return group;
-    }
-
-    public void setGroup(PlanetGroup group) {
-        this.group = group;
-    }
-
-    public String getSubUrl() {
-        return subUrl;
-    }
-
-    public void setSubUrl(String subUrl) {
-        this.subUrl = subUrl;
-    }    
-}
diff --git a/app/src/main/java/org/apache/roller/weblogger/pojos/ThemeTemplate.java b/app/src/main/java/org/apache/roller/weblogger/pojos/ThemeTemplate.java
index 82121f3..c4b8842 100644
--- a/app/src/main/java/org/apache/roller/weblogger/pojos/ThemeTemplate.java
+++ b/app/src/main/java/org/apache/roller/weblogger/pojos/ThemeTemplate.java
@@ -26,7 +26,7 @@
  */
 public interface ThemeTemplate extends Template {
 
-    public enum ComponentType {
+    enum ComponentType {
         WEBLOG("Weblog"),
         PERMALINK("Permalink"),
         SEARCH("Search"),
diff --git a/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntryComment.java b/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntryComment.java
index b28dc52..1138ae9 100644
--- a/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntryComment.java
+++ b/app/src/main/java/org/apache/roller/weblogger/pojos/WeblogEntryComment.java
@@ -50,7 +50,6 @@
     private String    plugins = null;
     private String    contentType = "text/plain";
 
-    
     // associations
     private WeblogEntry weblogEntry = null;
     
@@ -292,6 +291,10 @@
     public Boolean getApproved() {
         return ApprovalStatus.APPROVED.equals(getStatus());
     }
+
+    public String getEmptyString() {
+        return "";
+    }
     
     
     /**
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/XinhaEditor.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/Summernote.java
similarity index 86%
rename from app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/XinhaEditor.java
rename to app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/Summernote.java
index 4d8d8c8..cfeb4cb 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/XinhaEditor.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/Summernote.java
@@ -18,14 +18,13 @@
 
 package org.apache.roller.weblogger.ui.core.plugins;
 
-
 /**
- * A rich text WYSIWYG editor using Xinha.
+ * Summernote rich text editor
  */
-public class XinhaEditor implements WeblogEntryEditor {
-    
-    
-    public XinhaEditor() {}
+public class Summernote implements WeblogEntryEditor {
+
+
+    public Summernote() {}
     
     
     public String getId() {
@@ -33,7 +32,7 @@
     }
     
     public String getName() {
-        return "editor.xinha.name";
+        return "editor.summernote.name";
     }
     
     public String getJspPage() {
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/UIPluginManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/UIPluginManagerImpl.java
index 6b16009..0cff8ec 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/UIPluginManagerImpl.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/UIPluginManagerImpl.java
@@ -39,7 +39,7 @@
     private static UIPluginManagerImpl instance = null;
     
     // list of configured WeblogEntryEditor classes
-    Map editors = new LinkedHashMap();
+    private Map editors = new LinkedHashMap();
     
     // the default WeblogEntryEditor
     WeblogEntryEditor defaultEditor = null;
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/Menu.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/Menu.java
index 8e9804e..dfa330d 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/Menu.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/Menu.java
@@ -27,10 +27,10 @@
  */
 public class Menu {
     
-    private List<MenuTab> tabs = new ArrayList<MenuTab>();
+    private List<MenuTab> tabs = new ArrayList<>();
     
     
-    public void addTab(MenuTab tab) {
+    void addTab(MenuTab tab) {
         this.tabs.add(tab);
     }
     
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/MenuHelper.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/MenuHelper.java
index fff06dd..e416bf5 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/MenuHelper.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/util/menu/MenuHelper.java
@@ -67,17 +67,13 @@
 
             // parse menus and cache so we can efficiently reuse them
             String menu = "editor";
-            ParsedMenu editorMenu = unmarshall(
-                    menu,
-                    MenuHelper.class
-                            .getResourceAsStream("/org/apache/roller/weblogger/ui/struts2/editor/editor-menu.xml"));
+            ParsedMenu editorMenu = unmarshall( menu,
+                MenuHelper.class.getResourceAsStream("/org/apache/roller/weblogger/ui/struts2/editor/editor-menu.xml"));
             menus.put(menu, editorMenu);
 
             menu = "admin";
-            ParsedMenu adminMenu = unmarshall(
-                    menu,
-                    MenuHelper.class
-                            .getResourceAsStream("/org/apache/roller/weblogger/ui/struts2/admin/admin-menu.xml"));
+            ParsedMenu adminMenu = unmarshall( menu,
+                MenuHelper.class.getResourceAsStream("/org/apache/roller/weblogger/ui/struts2/admin/admin-menu.xml"));
             menus.put(menu, adminMenu);
 
         } catch (Exception ex) {
@@ -112,8 +108,7 @@
         ParsedMenu menuConfig = menus.get(menuId);
         if (menuConfig != null) {
             try {
-                menu = buildMenu(menuId, menuConfig, currentAction, user,
-                        weblog);
+                menu = buildMenu(menuId, menuConfig, currentAction, user, weblog);
             } catch (WebloggerException ex) {
                 log.error("ERROR: fethcing user roles", ex);
             }
@@ -167,16 +162,14 @@
             if (configTab.getEnabledProperty() != null) {
                 includeTab = getBooleanProperty(configTab.getEnabledProperty());
             } else if (configTab.getDisabledProperty() != null) {
-                includeTab = !getBooleanProperty(configTab
-                        .getDisabledProperty());
+                includeTab = !getBooleanProperty(configTab.getDisabledProperty());
             }
 
             // user roles check
             if (includeTab && configTab.getGlobalPermissionActions() != null
                     && !configTab.getGlobalPermissionActions().isEmpty()) {
                 try {
-                    GlobalPermission perm = new GlobalPermission(
-                            configTab.getGlobalPermissionActions());
+                    GlobalPermission perm = new GlobalPermission( configTab.getGlobalPermissionActions());
                     if (!umgr.checkPermission(perm, user)) {
                         includeTab = false;
                     }
@@ -189,8 +182,7 @@
             // weblog permissions check
             if (includeTab && configTab.getWeblogPermissionActions() != null
                     && !configTab.getWeblogPermissionActions().isEmpty()) {
-                WeblogPermission perm = new WeblogPermission(weblog,
-                        configTab.getWeblogPermissionActions());
+                WeblogPermission perm = new WeblogPermission(weblog, configTab.getWeblogPermissionActions());
                 includeTab = umgr.checkPermission(perm, user);
             }
 
@@ -211,18 +203,15 @@
                     boolean includeItem = true;
 
                     if (configTabItem.getEnabledProperty() != null) {
-                        includeItem = getBooleanProperty(configTabItem
-                                .getEnabledProperty());
+                        includeItem = getBooleanProperty(configTabItem.getEnabledProperty());
                     } else if (configTabItem.getDisabledProperty() != null) {
-                        includeItem = !getBooleanProperty(configTabItem
-                                .getDisabledProperty());
+                        includeItem = !getBooleanProperty(configTabItem.getDisabledProperty());
                     }
 
                     // user roles check
                     if (includeItem
                             && configTabItem.getGlobalPermissionActions() != null
-                            && !configTabItem.getGlobalPermissionActions()
-                                    .isEmpty()) {
+                            && !configTabItem.getGlobalPermissionActions() .isEmpty()) {
                         GlobalPermission perm = new GlobalPermission(
                                 configTabItem.getGlobalPermissionActions());
                         if (!umgr.checkPermission(perm, user)) {
@@ -233,10 +222,8 @@
                     // weblog permissions check
                     if (includeItem
                             && configTabItem.getWeblogPermissionActions() != null
-                            && !configTabItem.getWeblogPermissionActions()
-                                    .isEmpty()) {
-                        WeblogPermission perm = new WeblogPermission(weblog,
-                                configTabItem.getWeblogPermissionActions());
+                            && !configTabItem.getWeblogPermissionActions().isEmpty()) {
+                        WeblogPermission perm = new WeblogPermission(weblog, configTabItem.getWeblogPermissionActions());
                         includeItem = umgr.checkPermission(perm, user);
                     }
 
@@ -461,8 +448,7 @@
                     element.getAttributeValue("globalPerms"), ","));
         }
         tabItem.setEnabledProperty(element.getAttributeValue("enabledProperty"));
-        tabItem.setDisabledProperty(element
-                .getAttributeValue("disabledProperty"));
+        tabItem.setDisabledProperty(element.getAttributeValue("disabledProperty"));
 
         return tabItem;
     }
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/WeblogRequestMapper.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/WeblogRequestMapper.java
index cf3ec65..ad8c170 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/WeblogRequestMapper.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/WeblogRequestMapper.java
@@ -19,6 +19,7 @@
 package org.apache.roller.weblogger.ui.rendering;
 
 import java.io.IOException;
+import java.net.URL;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
@@ -133,12 +134,19 @@
             return false;
         }
 
-        String weblogAbsoluteURL =
-            WebloggerConfig.getProperty("weblog.absoluteurl." + weblogHandle);
-        // If an absolute URL is specified for this weblog, make sure request URL matches
-        if (weblogAbsoluteURL != null && !request.getRequestURL().toString().startsWith(weblogAbsoluteURL)) {
-            log.debug("SKIPPED " + weblogHandle);
-            return false;
+        // is there a special hostname for the specified hostname?
+        String multiHostNameURL =  WebloggerConfig.getProperty("weblog.absoluteurl." + weblogHandle);
+        if ( multiHostNameURL != null ) {
+
+            // there is, so check that configured hostname matches the one in the request
+            URL weblogAbsoluteURL = new URL( multiHostNameURL );
+            String headerHost = request.getHeader("Host");
+            String configHost = weblogAbsoluteURL.getHost();
+
+            if (headerHost != null && configHost != null && !headerHost.equals(configHost)) {
+                log.debug("SKIPPED " + weblogHandle);
+                return false;
+            }
         }
         
         log.debug("WEBLOG_URL "+request.getServletPath());
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/SiteModel.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/SiteModel.java
index ada1b24..e3fd7b3 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/SiteModel.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/SiteModel.java
@@ -33,6 +33,7 @@
 import org.apache.roller.weblogger.business.WebloggerFactory;
 import org.apache.roller.weblogger.business.UserManager;
 import org.apache.roller.weblogger.business.WeblogEntryManager;
+import org.apache.roller.weblogger.business.jpa.JPAWeblogEntryManagerImpl;
 import org.apache.roller.weblogger.pojos.TagStat;
 import org.apache.roller.weblogger.pojos.WeblogHitCount;
 import org.apache.roller.weblogger.pojos.StatCount;
@@ -389,10 +390,7 @@
      */
     public List<WeblogWrapper> getNewWeblogs(int sinceDays, int length) {
         List<WeblogWrapper> results = new ArrayList<WeblogWrapper>();
-        Calendar cal = Calendar.getInstance();
-        cal.setTime(new Date());
-        cal.add(Calendar.DATE, -1 * sinceDays);
-        Date startDate = cal.getTime();
+        Date startDate = JPAWeblogEntryManagerImpl.getStartDateNow(sinceDays);
         try {            
             List<Weblog> weblogs = WebloggerFactory.getWeblogger().getWeblogManager().getWeblogs(
                 Boolean.TRUE, Boolean.TRUE, startDate, null, 0, length);
@@ -466,10 +464,7 @@
      */
     public List getMostCommentedWeblogs(int sinceDays , int length) {
         List results = new ArrayList();
-        Calendar cal = Calendar.getInstance();
-        cal.setTime(new Date());
-        cal.add(Calendar.DATE, -1 * sinceDays);
-        Date startDate = cal.getTime();
+        Date startDate = JPAWeblogEntryManagerImpl.getStartDateNow(sinceDays);
         try {            
             results = WebloggerFactory.getWeblogger().getWeblogManager().getMostCommentedWeblogs(
                     startDate, new Date(), 0, length);
@@ -490,10 +485,7 @@
     public List getMostCommentedWeblogEntries(
             List cats, int sinceDays, int length) {
         List results = new ArrayList();
-        Calendar cal = Calendar.getInstance();
-        cal.setTime(new Date());
-        cal.add(Calendar.DATE, -1 * sinceDays);
-        Date startDate = cal.getTime();
+        Date startDate = JPAWeblogEntryManagerImpl.getStartDateNow(sinceDays);
         try {            
             Weblogger roller = WebloggerFactory.getWeblogger();
             WeblogEntryManager wmgr = roller.getWeblogEntryManager();
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/CreateUserBean.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/CreateUserBean.java
index 29df348..5a130db 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/CreateUserBean.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/CreateUserBean.java
@@ -18,7 +18,10 @@
 
 package org.apache.roller.weblogger.ui.struts2.admin;
 
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.List;
+
 import org.apache.roller.weblogger.WebloggerException;
 import org.apache.roller.weblogger.business.WebloggerFactory;
 import org.apache.roller.weblogger.pojos.GlobalPermission;
@@ -42,8 +45,16 @@
     private Boolean enabled = Boolean.TRUE;
     private String activationCode = null;
     private boolean administrator = false;
-    
-    
+    private List<String> list = new ArrayList<>();
+
+    public List<String> getList() {
+        return list;
+    }
+
+    public void setList(List<String> list) {
+        this.list = list;
+    }
+
     public String getId() {
         return id;
     }
@@ -140,7 +151,6 @@
         this.administrator = administrator;
     }
     
-    
     public void copyTo(User dataHolder) {
         
         dataHolder.setScreenName(this.screenName);
diff --git 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
index 0ee3641..1efcd8a 100644
--- 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
@@ -18,11 +18,9 @@
 
 package org.apache.roller.weblogger.ui.struts2.admin;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import javax.servlet.http.HttpServletRequest;
+
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -34,12 +32,13 @@
 import org.apache.roller.weblogger.business.plugins.comment.WeblogEntryCommentPlugin;
 import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
 import org.apache.roller.weblogger.config.runtime.ConfigDef;
+import org.apache.roller.weblogger.config.runtime.PropertyDef;
 import org.apache.roller.weblogger.config.runtime.RuntimeConfigDefs;
 import org.apache.roller.weblogger.pojos.GlobalPermission;
 import org.apache.roller.weblogger.pojos.RuntimeConfigProperty;
 import org.apache.roller.weblogger.pojos.Weblog;
 import org.apache.roller.weblogger.ui.struts2.util.UIAction;
-import org.apache.struts2.convention.annotation.AllowedMethods;
+import org.apache.roller.weblogger.util.Utilities;
 import org.apache.struts2.interceptor.ParameterAware;
 import org.apache.struts2.interceptor.ServletRequestAware;
 
@@ -49,21 +48,21 @@
  */
 // TODO: make this work @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];
 
@@ -71,28 +70,30 @@
     // GET on the GlobalConfig!save URL and thus sets all checkboxes to false
     private String httpMethod = "GET";
 
+    private ResourceBundle bundle = ResourceBundle.getBundle("ApplicationResources");
+
     // weblogs for frontpage blog chooser
     private Collection<Weblog> weblogs;
 
-    
+
     public GlobalConfig() {
         this.actionName = "globalConfig";
         this.desiredMenu = "admin";
         this.pageTitle = "configForm.title";
     }
-    
-    
+
+
     @Override
     public boolean isWeblogRequired() {
         return false;
     }
-    
+
     @Override
     public List<String> requiredGlobalPermissionActions() {
         return Collections.singletonList(GlobalPermission.ADMIN);
     }
-    
-    
+
+
     /**
      * Prepare action by loading runtime properties map.
      */
@@ -106,9 +107,9 @@
             log.error("Error getting runtime properties map", ex);
             addError("Unexpected error accessing Roller properties");
         }
-        
+
         try {
-            WeblogManager mgr =  WebloggerFactory.getWeblogger().getWeblogManager();
+            WeblogManager mgr = WebloggerFactory.getWeblogger().getWeblogManager();
             setWeblogs(mgr.getWeblogs(true, null, null, null, 0, -1));
         } catch (WebloggerException ex) {
             log.error("Error getting weblogs", ex);
@@ -123,28 +124,28 @@
                 setGlobalConfigDef(configDef);
             }
         }
-        
+
         // load plugins list
         PluginManager pmgr = WebloggerFactory.getWeblogger().getPluginManager();
         setPluginsList(pmgr.getCommentPlugins());
     }
-    
-    
+
+
     /**
      * Display global properties editor form.
      */
     @Override
     public String execute() {
-        
+
         // setup array of configured plugins
         if (!StringUtils.isEmpty(WebloggerRuntimeConfig.getProperty("users.comments.plugins"))) {
             setCommentPlugins(StringUtils.split(WebloggerRuntimeConfig.getProperty("users.comments.plugins"), ","));
         }
-        
+
         return SUCCESS;
     }
-    
-    
+
+
     /**
      * Save global properties.
      */
@@ -152,98 +153,135 @@
         if (!"POST".equals(httpMethod)) {
             return ERROR;
         }
-        
+
         // only set values for properties that are already defined
         RuntimeConfigProperty updProp;
         String incomingProp;
         for (String propName : getProperties().keySet()) {
             updProp = getProperties().get(propName);
             incomingProp = this.getParameter(updProp.getName());
-            
-            log.debug("Checking property ["+propName+"]");
-            log.debug("Request value is ["+incomingProp+"]");
-            
-            // some special treatment for booleans
-            // this is a bit hacky since we are assuming that any prop
-            // with a value of "true" or "false" is meant to be a boolean
-            // it may not always be the case, but we should be okay for now
-            // null check below needed w/Oracle
-            if( updProp.getValue() != null
-                    && (   updProp.getValue().equals("true") || updProp.getValue().equals("false")
-                        || updProp.getValue().equals("on")   || updProp.getValue().equals("off")
-                       )) {
-                if (incomingProp != null && (incomingProp.equalsIgnoreCase("true") || incomingProp.equalsIgnoreCase("on"))) {
-                    incomingProp = "true";
-                }
-                else {
-                    incomingProp = "false";
-                }
+
+            PropertyDef propertyDef = globalConfigDef.getPropertyDef( propName );
+            if ( propertyDef == null) {
+                // we're only processing defined properties, i.e. ones shown in the UI
+                continue;
             }
 
-            // only work on props that were submitted with the request
-            if(incomingProp != null) {
-                log.debug("Setting new value for ["+propName+"]");
-                
-                // NOTE: the old way had some locale sensitive way to do this??
-                updProp.setValue(incomingProp.trim());
+            if ( propertyDef.getType().equals("boolean") ) {
+
+                try {
+                    if (incomingProp == null) {
+                        updProp.setValue("false");
+                    } else {
+                        boolean value = Boolean.parseBoolean(incomingProp);
+                        updProp.setValue(Boolean.toString(value));
+                    }
+                    log.debug("Set boolean " + propName + " = " + incomingProp);
+                } catch ( Exception nfe ) {
+                    String propDesc = bundle.getString( propertyDef.getKey() );
+                    addError("ConfigForm.invalidBooleanProperty",
+                            Arrays.asList(propDesc, propName));
+                }
+
+            } else if ( incomingProp != null && propertyDef.getType().equals("integer") ) {
+
+                try {
+                    Integer.parseInt(incomingProp);
+                    updProp.setValue(incomingProp);
+                    log.debug("Set integer " + propName + " = " + incomingProp);
+                } catch ( NumberFormatException nfe ) {
+                    String propDesc = bundle.getString( propertyDef.getKey() );
+                    addError("ConfigForm.invalidIntegerProperty",
+                            Arrays.asList(propDesc, propName));
+                }
+
+            } else if ( incomingProp != null && propertyDef.getType().equals("float") ) {
+
+                try {
+                    Float.parseFloat(incomingProp);
+                    updProp.setValue(incomingProp);
+                    log.debug("Set float " + propName + " = " + incomingProp);
+                } catch ( NumberFormatException nfe ) {
+                    String propDesc = bundle.getString(propertyDef.getKey());
+                    addError("ConfigForm.invalidFloatProperty",
+                        Arrays.asList(propDesc, propName));
+                }
+
+            } else if ( incomingProp != null ){
+                updProp.setValue( incomingProp.trim() );
+                log.debug("Set something " + propName + " = " + incomingProp);
+
+            } else if ( propertyDef.getName().equals("users.comments.plugins") ) {
+                // not a problem
+
+            } else {
+                addError("ConfigForm.invalidProperty", propName);
             }
+
         }
-        
+
+        if ( this.hasActionErrors() ) {
+            return ERROR;
+        }
+
         // special handling for comment plugins
         String enabledPlugins = "";
-        if(getCommentPlugins().length > 0) {
+        if (getCommentPlugins().length > 0) {
             enabledPlugins = StringUtils.join(getCommentPlugins(), ",");
         }
         RuntimeConfigProperty prop = getProperties().get("users.comments.plugins");
         prop.setValue(enabledPlugins);
-            
+
         try {
             // save 'em and flush
             PropertiesManager mgr = WebloggerFactory.getWeblogger().getPropertiesManager();
             mgr.saveProperties(getProperties());
             WebloggerFactory.getWeblogger().flush();
-            
+
             // notify user of our success
             addMessage("generic.changes.saved");
-            
+
         } catch (WebloggerException ex) {
             log.error("Error saving roller properties", ex);
             addError("generic.error.check.logs");
         }
-                
+
         return SUCCESS;
     }
-    
-    
+
+
     public void setParameters(Map<String, String[]> parameters) {
         this.params = parameters;
-        
+
         if (log.isDebugEnabled()) {
             log.debug("Parameter map:");
 
             for (Map.Entry<String, String[]> entry : parameters.entrySet()) {
-                log.debug(entry.getKey() + " = " + entry.getValue());
+                log.debug(entry.getKey() + " = " + Utilities.stringArrayToString(entry.getValue(),","));
             }
         }
     }
-    
+
     // convenience method for getting a single parameter as a String
     private String getParameter(String key) {
-        
+
         String[] p = this.params.get(key);
-        if(p != null && p.length > 0) {
+        if (p != null && p.length > 0) {
             return p[0];
         }
         return null;
     }
-    
-    
+
+
     public Map<String, RuntimeConfigProperty> getProperties() {
         return properties;
     }
 
     public void setProperties(Map<String, RuntimeConfigProperty> properties) {
         this.properties = properties;
+        for (Map.Entry<String, RuntimeConfigProperty> entry : properties.entrySet()) {
+            log.debug("Got " + entry.getKey() + " = " + entry.getValue().getValue());
+        }
     }
 
     public ConfigDef getGlobalConfigDef() {
@@ -253,7 +291,7 @@
     public void setGlobalConfigDef(ConfigDef globalConfigDef) {
         this.globalConfigDef = globalConfigDef;
     }
-    
+
     public List<WeblogEntryCommentPlugin> getPluginsList() {
         return pluginsList;
     }
@@ -261,7 +299,7 @@
     public void setPluginsList(List<WeblogEntryCommentPlugin> pluginsList) {
         this.pluginsList = pluginsList;
     }
-    
+
     public String[] getCommentPlugins() {
         return commentPlugins.clone();
     }
@@ -273,7 +311,7 @@
     public void setServletRequest(HttpServletRequest req) {
         httpMethod = req.getMethod();
     }
-    
+
     public Collection<Weblog> getWeblogs() {
         return weblogs;
     }
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetEdit.java
index 1b5d13c..fb7dd4b 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetEdit.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/PingTargetEdit.java
@@ -77,17 +77,10 @@
         }
     }
 
-    public String execute() {
-        if (!isAdd()) {
-            getBean().copyFrom(pingTarget);
-        }
-        return INPUT;
-    }
-
     /**
      * Save ping target.
      */
-    public String save() {
+    public String execute() {
         myValidate();
 
         if (!hasActionErrors()) {
@@ -98,8 +91,7 @@
                 pingTargetMgr.savePingTarget(pingTarget);
                 WebloggerFactory.getWeblogger().flush();
 
-                addMessage(isAdd() ? "pingTarget.created" : "pingTarget.updated",
-                        pingTarget.getName());
+                addMessage(isAdd() ? "pingTarget.created" : "pingTarget.updated", pingTarget.getName());
 
                 return SUCCESS;
             } catch (WebloggerException ex) {
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserAdmin.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserAdmin.java
index 63613a5..29b0e24 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserAdmin.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserAdmin.java
@@ -18,6 +18,7 @@
 
 package org.apache.roller.weblogger.ui.struts2.admin;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -33,7 +34,8 @@
  */
 // TODO: make this work @AllowedMethods({"execute"})
 public class UserAdmin extends UIAction {
-    
+    private CreateUserBean bean = new CreateUserBean();
+
     public UserAdmin() {
         this.actionName = "userAdmin";
         this.desiredMenu = "admin";
@@ -52,15 +54,24 @@
         return false;
     }
 
-    /**
-     * Show user admin search page.
-     */
+    // show user admin search page
     public String execute() {
         return SUCCESS;
     }
 
+    public String edit() {
+        return "edit";
+    }
+
     public String getAuthMethod() {
         return authMethod.name();
     }
 
+    public CreateUserBean getBean() {
+        return bean;
+    }
+
+    public void setBean(CreateUserBean bean) {
+        this.bean = bean;
+    }
 }
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserEdit.java
index afdc522..73d5b01 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserEdit.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/UserEdit.java
@@ -80,20 +80,25 @@
 
     // prepare for action by loading user object we are modifying
     public void myPrepare() {
+
         if (isAdd()) {
-            // create new User
             user = new User();
+
         } else {
             try {
                 // load the user object we are modifying
                 UserManager mgr = WebloggerFactory.getWeblogger().getUserManager();
-                if (bean.getId() != null) {
+                if ( !StringUtils.isEmpty( getBean().getId() ) ) {
+
                     // action came from CreateUser or return from ModifyUser
                     user = mgr.getUser(getBean().getId());
-                } else if (bean.getUserName() != null) {
+
+                } else if ( !StringUtils.isEmpty( bean.getUserName())) {
+
                     // action came from UserAdmin screen.
                     user = mgr.getUserByUserName(getBean().getUserName(), null);
                 }
+
             } catch (Exception e) {
                 log.error("Error looking up user (id/username) :" + bean.getId() + "/" + bean.getUserName(), e);
             }
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/ThemeDataServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/ThemeDataServlet.java
index 3c674c9..97bff15 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/ThemeDataServlet.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/ajax/ThemeDataServlet.java
@@ -57,8 +57,7 @@
 
         themeId = request.getParameter("theme");
 
-        ThemeManager themeMgr = WebloggerFactory.getWeblogger()
-                .getThemeManager();
+        ThemeManager themeMgr = WebloggerFactory.getWeblogger().getThemeManager();
         if (themeId == null) {
             themes = themeMgr.getEnabledThemesList();
         } else {
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Install.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Install.java
index e67cc85..12de267 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Install.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Install.java
@@ -38,7 +38,7 @@
 /**
  * Walk user through install process.
  */
-// TODO: make this work @AllowedMethods({"execute","create","update","bootstrap"})
+// TODO: make this work @AllowedMethods({"execute","create","upgrade","bootstrap"})
 public class Install extends UIAction {
 
     private static Log log = LogFactory.getLog(Install.class);
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Register.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Register.java
index f3b906c..baadc5e 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Register.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/Register.java
@@ -211,26 +211,7 @@
                     // Create & save the activation data
                     String inActivationCode = UUID.randomUUID().toString();
 
-                    if (mgr.getUserByActivationCode(inActivationCode) != null) {
-                        // In the *extremely* unlikely event that we generate an
-                        // activation code that is already use, we'll retry 3 times.
-                        int numOfRetries = 3;
-                        if (numOfRetries < 1) {
-                            numOfRetries = 1;
-                        }
-                        for (int i = 0; i < numOfRetries; i++) {
-                            inActivationCode = UUID.randomUUID().toString();
-                            if (mgr.getUserByActivationCode(inActivationCode) == null) {
-                                break;
-                            } else {
-                                inActivationCode = null;
-                            }
-                        }
-                        // In more unlikely event that three retries isn't enough
-                        if (inActivationCode == null){
-                            throw new WebloggerException("error.add.user.activationCodeInUse");
-                        }
-                    }
+                    inActivationCode = retryActivationCode(mgr, inActivationCode);
                     ud.setActivationCode(inActivationCode);
                 }
 
@@ -248,16 +229,7 @@
                 WebloggerFactory.getWeblogger().flush();
 
                 // now send activation email if necessary
-                if (activationEnabled && ud.getActivationCode() != null) {
-                    try {
-                        // send activation mail to the user
-                        MailUtil.sendUserActivationEmail(ud);
-                    } catch (WebloggerException ex) {
-                        log.error("Error sending activation email to - " + ud.getEmailAddress(), ex);
-                    }
-
-                    setActivationStatus("pending");
-                }
+                sendActivationMailIfNeeded(ud, activationEnabled);
 
                 // Invalidate session, otherwise new user who was originally
                 // authenticated via LDAP/SSO will remain logged in but
@@ -278,6 +250,43 @@
         
         return INPUT;
     }
+
+	private String retryActivationCode(UserManager mgr, String inActivationCode) throws WebloggerException {
+		if (mgr.getUserByActivationCode(inActivationCode) != null) {
+		    // In the *extremely* unlikely event that we generate an
+		    // activation code that is already use, we'll retry 3 times.
+		    int numOfRetries = 3;
+		    if (numOfRetries < 1) {
+		        numOfRetries = 1;
+		    }
+		    for (int i = 0; i < numOfRetries; i++) {
+		        inActivationCode = UUID.randomUUID().toString();
+		        if (mgr.getUserByActivationCode(inActivationCode) == null) {
+		            break;
+		        } else {
+		            inActivationCode = null;
+		        }
+		    }
+		    // In more unlikely event that three retries isn't enough
+		    if (inActivationCode == null){
+		        throw new WebloggerException("error.add.user.activationCodeInUse");
+		    }
+		}
+		return inActivationCode;
+	}
+
+	private void sendActivationMailIfNeeded(User ud, boolean activationEnabled) {
+		if (activationEnabled && ud.getActivationCode() != null) {
+		    try {
+		        // send activation mail to the user
+		        MailUtil.sendUserActivationEmail(ud);
+		    } catch (WebloggerException ex) {
+		        log.error("Error sending activation email to - " + ud.getEmailAddress(), ex);
+		    }
+
+		    setActivationStatus("pending");
+		}
+	}
     
     
     @SkipValidation
@@ -331,19 +340,7 @@
             String unusedPassword = WebloggerConfig.getProperty("users.passwords.externalAuthValue", "<externalAuth>");
             
             // Preserve username and password, Spring Security case
-            User fromSSOUser = CustomUserRegistry.getUserDetailsFromAuthentication(getServletRequest());
-            if (fromSSOUser != null) {
-                getBean().setPasswordText(unusedPassword);
-                getBean().setPasswordConfirm(unusedPassword);
-                getBean().setUserName(fromSSOUser.getUserName());
-            }
-
-            // Preserve username and password, CMA case             
-            else if (getServletRequest().getUserPrincipal() != null) {
-                getBean().setUserName(getServletRequest().getUserPrincipal().getName());
-                getBean().setPasswordText(unusedPassword);
-                getBean().setPasswordConfirm(unusedPassword);
-            }
+            preserveUsernameAndPassword(unusedPassword);
         }
         
         String allowed = WebloggerConfig.getProperty("username.allowedChars");
@@ -378,7 +375,30 @@
         }
         
         // check that username is not taken
-        if (!StringUtils.isEmpty(getBean().getUserName())) {
+        checkUsername();
+
+        // check that OpenID, if provided, is not taken
+        checkOpenID();
+    }
+
+	private void preserveUsernameAndPassword(String unusedPassword) {
+		User fromSSOUser = CustomUserRegistry.getUserDetailsFromAuthentication(getServletRequest());
+		if (fromSSOUser != null) {
+		    getBean().setPasswordText(unusedPassword);
+		    getBean().setPasswordConfirm(unusedPassword);
+		    getBean().setUserName(fromSSOUser.getUserName());
+		}
+
+		// Preserve username and password, CMA case             
+		else if (getServletRequest().getUserPrincipal() != null) {
+		    getBean().setUserName(getServletRequest().getUserPrincipal().getName());
+		    getBean().setPasswordText(unusedPassword);
+		    getBean().setPasswordConfirm(unusedPassword);
+		}
+	}
+
+	private void checkUsername() {
+		if (!StringUtils.isEmpty(getBean().getUserName())) {
             try {
                 UserManager mgr = WebloggerFactory.getWeblogger().getUserManager();
                 if (mgr.getUserByUserName(getBean().getUserName(), null) != null) {
@@ -391,9 +411,10 @@
                 addError("generic.error.check.logs");
             }
         }
+	}
 
-        // check that OpenID, if provided, is not taken
-        if (!StringUtils.isEmpty(getBean().getOpenIdUrl())) {
+	private void checkOpenID() {
+		if (!StringUtils.isEmpty(getBean().getOpenIdUrl())) {
             try {
                 UserManager mgr = WebloggerFactory.getWeblogger().getUserManager();
                 if (mgr.getUserByOpenIdUrl(getBean().getOpenIdUrl()) != null) {
@@ -406,7 +427,7 @@
                 addError("generic.error.check.logs");
             }
         }
-    }
+	}
     
     
     public HttpServletRequest getServletRequest() {
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java
index 852ec72..c3e5642 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/BookmarkEdit.java
@@ -97,15 +97,14 @@
     public String save() {
         myValidate();
 
-        if(!hasActionErrors()) {
+        if (!hasActionErrors()) {
             try {
                 getBean().copyTo(bookmark);
                 BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager();
                 bmgr.saveBookmark(bookmark);
                 WebloggerFactory.getWeblogger().flush();
                 CacheManager.invalidate(bookmark);
-                addMessage(isAdd() ? "bookmarkForm.created" : "bookmarkForm.updated",
-                        getBookmark().getName());
+                addMessage(isAdd() ? "bookmarkForm.created" : "bookmarkForm.updated", getBookmark().getName());
                 return SUCCESS;
 
             } catch(Exception ex) {
@@ -149,4 +148,5 @@
     public WeblogBookmark getBookmark() {
         return bookmark;
     }
+
 }
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java
index f695072..cc86b44 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Bookmarks.java
@@ -69,8 +69,7 @@
 
     public void myPrepare() {
         try {
-            BookmarkManager bmgr = WebloggerFactory.getWeblogger()
-                    .getBookmarkManager();
+            BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager();
             if (!StringUtils.isEmpty(getFolderId())) {
                 setFolder(bmgr.getFolder(getFolderId()));
             } else {
@@ -160,7 +159,13 @@
         try {
             BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager();
             WeblogBookmarkFolder fd = bmgr.getFolder(getFolderId());
+
             if (fd != null) {
+
+                if ( "default".equals( fd.getName() ) ) {
+                    addError("Cannot delete default bookmark");
+                    return execute();
+                }
                 bmgr.removeFolder(fd);
 
                 // flush changes
@@ -173,6 +178,7 @@
                 setFolder(bmgr.getDefaultFolder(getActionWeblog()));
                 setFolderId(getFolder().getId());
             }
+
         } catch (WebloggerException ex) {
             log.error("Error deleting folder", ex);
         }
@@ -210,17 +216,16 @@
     public String move() {
 
         try {
-            BookmarkManager bmgr = WebloggerFactory.getWeblogger()
-                    .getBookmarkManager();
+            BookmarkManager bmgr = WebloggerFactory.getWeblogger().getBookmarkManager();
 
             if (log.isDebugEnabled()) {
-                log.debug("Moving bookmarks to folder - "
-                        + getTargetFolderId());
+                log.debug("Moving bookmarks to folder - " + getTargetFolderId());
             }
 
             // Move bookmarks to new parent folder.
             WeblogBookmarkFolder newFolder = bmgr.getFolder(getTargetFolderId());
             String bookmarks[] = getSelectedBookmarks();
+
             if (null != bookmarks && bookmarks.length > 0) {
                 for (int j = 0; j < bookmarks.length; j++) {
                     WeblogBookmark bd = bmgr.getBookmark(bookmarks[j]);
@@ -283,6 +288,9 @@
 
     public void setFolder(WeblogBookmarkFolder folder) {
         this.folder = folder;
+        if ( folder != null ) {
+            this.folderId = folder.getId();
+        }
     }
 
     public String getViewFolderId() {
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java
index 9d2c517..17dc99a 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/CategoryEdit.java
@@ -30,7 +30,6 @@
 import org.apache.roller.weblogger.pojos.WeblogPermission;
 import org.apache.roller.weblogger.ui.struts2.util.UIAction;
 import org.apache.roller.weblogger.util.cache.CacheManager;
-import org.apache.struts2.convention.annotation.AllowedMethods;
 import org.apache.struts2.interceptor.validation.SkipValidation;
 
 
@@ -64,10 +63,12 @@
     
     
     public void myPrepare() {
-        if (StringUtils.isEmpty(bean.getId())) {
+
+        if ( isAdd() ) {
             // Create and initialize new, not-yet-saved category
             category = new WeblogCategory();
             category.setWeblog(getActionWeblog());
+
         } else {
             try {
                 WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -92,7 +93,7 @@
     }
 
     private boolean isAdd() {
-        return actionName.equals("categoryAdd");
+        return StringUtils.isEmpty( bean.getId() );
     }
 
     /**
@@ -134,10 +135,16 @@
     }
 
     public void myValidate() {
-        // make sure new name is not a duplicate of an existing category
-        if ((isAdd() || !category.getName().equals(bean.getName())) &&
-            category.getWeblog().hasCategory(bean.getName())) {
-            addError("categoryForm.error.duplicateName", bean.getName());
+
+        if ( isAdd() ) {
+            if ( getActionWeblog().hasCategory( bean.getName() ) ) {
+                addError("categoryForm.error.duplicateName", bean.getName());
+            }
+        } else {
+            WeblogCategory wc = getActionWeblog().getWeblogCategory(bean.getName());
+            if ( wc != null && !wc.getId().equals( bean.getId() )) {
+                addError("categoryForm.error.duplicateName", bean.getName());
+            }
         }
     }
 
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Comments.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Comments.java
index 10c663a..3aee5df 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Comments.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Comments.java
@@ -105,14 +105,7 @@
                 setQueryEntry(wmgr.getWeblogEntry(getBean().getEntryId()));
             }
 
-            CommentSearchCriteria csc = new CommentSearchCriteria();
-            csc.setWeblog(getActionWeblog());
-            csc.setEntry(getQueryEntry());
-            csc.setSearchText(getBean().getSearchString());
-            csc.setStartDate(getBean().getStartDate());
-            csc.setEndDate(getBean().getEndDate());
-            csc.setStatus(getBean().getStatus());
-            csc.setReverseChrono(true);
+            CommentSearchCriteria csc = getCommentSearchCriteria();
             csc.setOffset(getBean().getPage() * COUNT);
             csc.setMaxResults(COUNT + 1);
 
@@ -162,11 +155,8 @@
             params.put("bean.approvedString", getBean().getApprovedString());
         }
 
-        return WebloggerFactory
-                .getWeblogger()
-                .getUrlStrategy()
-                .getActionURL("comments", "/roller-ui/authoring",
-                        getActionWeblog().getHandle(), params, false);
+        return WebloggerFactory.getWeblogger().getUrlStrategy()
+            .getActionURL("comments", "/roller-ui/authoring", getActionWeblog().getHandle(), params, false);
     }
 
     public String execute() {
@@ -192,16 +182,9 @@
         getBean().loadCheckboxes(getPager().getItems());
 
         try {
-            WeblogEntryManager wmgr = WebloggerFactory.getWeblogger()
-                    .getWeblogEntryManager();
+            WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
 
-            CommentSearchCriteria csc = new CommentSearchCriteria();
-            csc.setWeblog(getActionWeblog());
-            csc.setSearchText(getBean().getSearchString());
-            csc.setStartDate(getBean().getStartDate());
-            csc.setEndDate(getBean().getEndDate());
-            csc.setStatus(getBean().getStatus());
-            csc.setReverseChrono(true);
+            CommentSearchCriteria csc = getCommentSearchCriteria();
 
             List<WeblogEntryComment> allMatchingComments = wmgr.getComments(csc);
             if (allMatchingComments.size() > COUNT) {
@@ -216,28 +199,33 @@
         return LIST;
     }
 
+    private CommentSearchCriteria getCommentSearchCriteria() {
+        CommentSearchCriteria commentSearchCriteria = new CommentSearchCriteria();
+        commentSearchCriteria.setWeblog(getActionWeblog());
+        commentSearchCriteria.setEntry(getQueryEntry());
+        commentSearchCriteria.setSearchText(getBean().getSearchString());
+        commentSearchCriteria.setStartDate(getBean().getStartDate());
+        commentSearchCriteria.setEndDate(getBean().getEndDate());
+        commentSearchCriteria.setStatus(getBean().getStatus());
+        commentSearchCriteria.setReverseChrono(true);
+        return commentSearchCriteria;
+    }
+
+
     /**
      * Bulk delete all comments matching query criteria.
      */
     public String delete() {
 
         try {
-            WeblogEntryManager wmgr = WebloggerFactory.getWeblogger()
-                    .getWeblogEntryManager();
+            WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
 
             // if search is enabled, we will need to re-index all entries with
             // comments that have been deleted, so build a list of those entries
             Set<WeblogEntry> reindexEntries = new HashSet<WeblogEntry>();
             if (WebloggerConfig.getBooleanProperty("search.enabled")) {
 
-                CommentSearchCriteria csc = new CommentSearchCriteria();
-                csc.setWeblog(getActionWeblog());
-                csc.setEntry(getQueryEntry());
-                csc.setSearchText(getBean().getSearchString());
-                csc.setStartDate(getBean().getStartDate());
-                csc.setEndDate(getBean().getEndDate());
-                csc.setStatus(getBean().getStatus());
-                csc.setReverseChrono(true);
+                CommentSearchCriteria csc = getCommentSearchCriteria();
 
                 List<WeblogEntryComment> targetted = wmgr.getComments(csc);
                 for (WeblogEntryComment comment : targetted) {
@@ -251,8 +239,7 @@
 
             // if we've got entries to reindex then do so
             if (!reindexEntries.isEmpty()) {
-                IndexManager imgr = WebloggerFactory.getWeblogger()
-                        .getIndexManager();
+                IndexManager imgr = WebloggerFactory.getWeblogger().getIndexManager();
                 for (WeblogEntry entry : reindexEntries) {
                     imgr.addEntryReIndexOperation(entry);
                 }
@@ -280,8 +267,7 @@
     public String update() {
 
         try {
-            WeblogEntryManager wmgr = WebloggerFactory.getWeblogger()
-                    .getWeblogEntryManager();
+            WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
 
             List<WeblogEntryComment> flushList = new ArrayList<WeblogEntryComment>();
 
@@ -310,8 +296,7 @@
             }
 
             // loop through IDs of all comments displayed on page
-            List<String> approvedIds = Arrays.asList(getBean()
-                    .getApprovedComments());
+            List<String> approvedIds = Arrays.asList(getBean().getApprovedComments());
             List<String> spamIds = Arrays.asList(getBean().getSpamComments());
             log.debug(spamIds.size() + " comments marked as spam");
 
@@ -426,14 +411,10 @@
         List<KeyValueObject> opts = new ArrayList<KeyValueObject>();
 
         opts.add(new KeyValueObject("ALL", getText("generic.all")));
-        opts.add(new KeyValueObject("ONLY_PENDING",
-                getText("commentManagement.onlyPending")));
-        opts.add(new KeyValueObject("ONLY_APPROVED",
-                getText("commentManagement.onlyApproved")));
-        opts.add(new KeyValueObject("ONLY_DISAPPROVED",
-                getText("commentManagement.onlyDisapproved")));
-        opts.add(new KeyValueObject("ONLY_SPAM",
-                getText("commentManagement.onlySpam")));
+        opts.add(new KeyValueObject("ONLY_PENDING", getText("commentManagement.onlyPending")));
+        opts.add(new KeyValueObject("ONLY_APPROVED", getText("commentManagement.onlyApproved")));
+        opts.add(new KeyValueObject("ONLY_DISAPPROVED", getText("commentManagement.onlyDisapproved")));
+        opts.add(new KeyValueObject("ONLY_SPAM", getText("commentManagement.onlySpam")));
 
         return opts;
     }
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryBean.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryBean.java
index c58d6a7..6e92898 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryBean.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/EntryBean.java
@@ -189,6 +189,9 @@
     
     public void setCommentDays(Integer commentDays) {
         this.commentDays = commentDays;
+        if (commentDays == -1) {
+            allowComments = false;
+        }
     }
     
     public int getCommentCount() {
diff --git 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
index 141c1c2..c3658c2 100644
--- 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,16 +27,19 @@
 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.
  */
 // TODO: make this work @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
@@ -48,6 +51,9 @@
     // the folder we are adding or editing
     private WeblogBookmarkFolder folder = null;
 
+    private HttpServletResponse httpServletResponse;
+
+
     public FolderEdit() {
         this.desiredMenu = "editor";
     }
@@ -74,6 +80,11 @@
         }
     }
 
+    @Override
+    public void setServletResponse(HttpServletResponse httpServletResponse) {
+        this.httpServletResponse = httpServletResponse;
+    }
+
     /**
      * Show folder edit page.
      */
@@ -114,6 +125,8 @@
                     addMessage("folderForm.updated");
                 }
 
+                httpServletResponse.addHeader("folderId", folderId );
+
                 return SUCCESS;
 
             } catch(Exception ex) {
@@ -127,7 +140,7 @@
 
     public void myValidate() {
         // make sure new name is not a duplicate of an existing folder
-        if((isAdd() || !folder.getName().equals(getBean().getName()))) {
+        if ( isAdd() || !getBean().getName().equals(folder.getName()) ) {
             if (folder.getWeblog().hasBookmarkFolder(getBean().getName())) {
                 addError("folderForm.error.duplicateName", getBean().getName());
             }
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileAdd.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileAdd.java
index dc75df8..d13247d 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileAdd.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileAdd.java
@@ -131,8 +131,7 @@
 
         if (!hasActionErrors()) {
 
-            MediaFileManager manager = WebloggerFactory.getWeblogger()
-                    .getMediaFileManager();
+            MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager();
 
             RollerMessages errors = new RollerMessages();
             List<MediaFile> uploaded = new ArrayList();
@@ -176,27 +175,22 @@
                         mediaFile
                                 .setContentType(this.uploadedFilesContentType[i]);
 
-                        // insome cases Struts2 is not able to guess the content
+                        // in some cases Struts2 is not able to guess the content
                         // type correctly and assigns the default, which is
                         // octet-stream. So in cases where we see octet-stream
                         // we double check and see if we can guess the content
                         // type via the Java MIME type facilities.
-                        mediaFile
-                                .setContentType(this.uploadedFilesContentType[i]);
+                        mediaFile.setContentType(this.uploadedFilesContentType[i]);
                         if (mediaFile.getContentType() == null
-                                || mediaFile.getContentType().endsWith(
-                                        "/octet-stream")) {
+                                || mediaFile.getContentType().endsWith("/octet-stream")) {
 
-                            String ctype = Utilities
-                                    .getContentTypeFromFileName(mediaFile
-                                            .getName());
+                            String ctype = Utilities.getContentTypeFromFileName(mediaFile.getName());
                             if (null != ctype) {
                                 mediaFile.setContentType(ctype);
                             }
                         }
 
-                        manager.createMediaFile(getActionWeblog(), mediaFile,
-                                errors);
+                        manager.createMediaFile(getActionWeblog(), mediaFile, errors);
                         WebloggerFactory.getWeblogger().flush();
 
                         if (mediaFile.isImageFile()) {
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileBase.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileBase.java
index f0102f7..38c4ef9 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileBase.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileBase.java
@@ -135,7 +135,7 @@
     /**

      * Move selected media files to a directory.

      */

-    protected void doMoveSelected() {

+    void doMoveSelected() {

         String[] fileIds = getSelectedMediaFiles();

         String[] dirIds = getSelectedMediaFileDirectories();

         try {

@@ -175,16 +175,16 @@
     /**

      * Refresh the list of directories.

      */

-    protected void refreshAllDirectories() {

+    void refreshAllDirectories() {

         try {

-            MediaFileManager mgr = WebloggerFactory.getWeblogger()

-                    .getMediaFileManager();

+            MediaFileManager mgr = WebloggerFactory.getWeblogger().getMediaFileManager();

+

             List<MediaFileDirectory> directories = mgr.getMediaFileDirectories(getActionWeblog());

-            List<MediaFileDirectory> sortedDirList = new ArrayList<MediaFileDirectory>();

-            sortedDirList.addAll(directories);

-            Collections.sort(sortedDirList, new MediaFileDirectoryComparator(

-                    DirectoryComparatorType.NAME));

+            List<MediaFileDirectory> sortedDirList = new ArrayList<>(directories);

+            sortedDirList.sort(new MediaFileDirectoryComparator(DirectoryComparatorType.NAME));

+

             setAllDirectories(sortedDirList);

+

         } catch (WebloggerException ex) {

             log.error("Error looking up media file directories", ex);

         }

diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileEdit.java
index f6045d4..810648e 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileEdit.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileEdit.java
@@ -64,8 +64,7 @@
     public void myPrepare() {

         refreshAllDirectories();

         try {

-            MediaFileManager mgr = WebloggerFactory.getWeblogger()

-                    .getMediaFileManager();

+            MediaFileManager mgr = WebloggerFactory.getWeblogger().getMediaFileManager();

             if (!StringUtils.isEmpty(bean.getDirectoryId())) {

                 setDirectory(mgr.getMediaFileDirectory(bean.getDirectoryId()));

             }

@@ -79,10 +78,8 @@
      * Validates media file metadata to be updated.

      */

     public void myValidate() {

-        MediaFile fileWithSameName = getDirectory().getMediaFile(

-                getBean().getName());

-        if (fileWithSameName != null

-                && !fileWithSameName.getId().equals(getMediaFileId())) {

+        MediaFile fileWithSameName = getDirectory().getMediaFile(getBean().getName());

+        if (fileWithSameName != null && !fileWithSameName.getId().equals(getMediaFileId())) {

             addError("MediaFile.error.duplicateName", getBean().getName());

         }

     }

@@ -94,8 +91,7 @@
      */

     @SkipValidation

     public String execute() {

-        MediaFileManager manager = WebloggerFactory.getWeblogger()

-                .getMediaFileManager();

+        MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager();

         try {

             MediaFile mediaFile = manager.getMediaFile(getMediaFileId());

             this.bean.copyFrom(mediaFile);

@@ -119,8 +115,7 @@
     public String save() {

         myValidate();

         if (!hasActionErrors()) {

-            MediaFileManager manager = WebloggerFactory.getWeblogger()

-                    .getMediaFileManager();

+            MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager();

             try {

                 MediaFile mediaFile = manager.getMediaFile(getMediaFileId());

                 bean.copyTo(mediaFile);

diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileImageChooser.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileImageChooser.java
index 4e90654..399d39d 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileImageChooser.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileImageChooser.java
@@ -60,6 +60,7 @@
      * Prepares view action
      */
     public void myPrepare() {
+        refreshAllDirectories();
     }
 
     @Override
@@ -75,58 +76,44 @@
      */
     @SkipValidation
     public String execute() {
-        MediaFileManager manager = WebloggerFactory.getWeblogger()
-                .getMediaFileManager();
+        MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager();
         try {
+
             MediaFileDirectory directory;
             if (this.directoryId != null) {
                 directory = manager.getMediaFileDirectory(this.directoryId);
             } else if (this.directoryName != null) {
-                directory = manager.getMediaFileDirectoryByName(
-                        getActionWeblog(), this.directoryName);
+                directory = manager.getMediaFileDirectoryByName(getActionWeblog(), this.directoryName);
                 this.directoryId = directory.getId();
             } else {
-                directory = manager
-                        .getDefaultMediaFileDirectory(getActionWeblog());
+                directory = manager.getDefaultMediaFileDirectory(getActionWeblog());
                 this.directoryId = directory.getId();
             }
 
-            this.childFiles = new ArrayList<MediaFile>();
-
-            for (MediaFile mf : directory.getMediaFiles()) {
-                this.childFiles.add(mf);
-            }
-
-            Collections.sort(this.childFiles, new MediaFileComparator(
-                    MediaFileComparatorType.NAME));
-
+            this.childFiles = new ArrayList<>();
+            this.childFiles.addAll(directory.getMediaFiles());
+            this.childFiles.sort(new MediaFileComparator( MediaFileComparatorType.NAME));
             this.currentDirectory = directory;
 
             // List of available directories
-            List<MediaFileDirectory> sortedDirList = new ArrayList<MediaFileDirectory>();
-            List<MediaFileDirectory> directories = manager
-                    .getMediaFileDirectories(getActionWeblog());
+            List<MediaFileDirectory> sortedDirList = new ArrayList<>();
+            List<MediaFileDirectory> directories = manager.getMediaFileDirectories(getActionWeblog());
             for (MediaFileDirectory mediaFileDirectory : directories) {
-                if (!"default".equals(mediaFileDirectory.getName())
-                        && "default".equals(directory.getName())
-                        || !"default".equals(directory.getName())) {
+                if (!"default".equals(mediaFileDirectory.getName()) || !"default".equals(directory.getName())) {
                     sortedDirList.add(mediaFileDirectory);
                 }
             }
 
-            Collections.sort(sortedDirList, new MediaFileDirectoryComparator(
-                    DirectoryComparatorType.NAME));
+            sortedDirList.sort(new MediaFileDirectoryComparator(
+                DirectoryComparatorType.NAME));
             setAllDirectories(sortedDirList);
 
             return SUCCESS;
 
-        } catch (FileIOException ex) {
+        } catch (Exception ex) {
             log.error("Error viewing media file directory ", ex);
             addError("MediaFile.error.view");
 
-        } catch (Exception e) {
-            log.error("Error viewing media file directory ", e);
-            addError("MediaFile.error.view");
         }
         return SUCCESS;
     }
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileView.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileView.java
index 62644c0..f6801f1 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileView.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/MediaFileView.java
@@ -194,8 +194,7 @@
      */

     @SkipValidation

     public String execute() {

-        MediaFileManager manager = WebloggerFactory.getWeblogger()

-                .getMediaFileManager();

+        MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager();

         try {

             MediaFileDirectory directory;

             if (StringUtils.isNotEmpty(this.directoryId)) {

@@ -206,8 +205,7 @@
                         getActionWeblog(), this.directoryName);

 

             } else {

-                directory = manager

-                        .getDefaultMediaFileDirectory(getActionWeblog());

+                directory = manager.getDefaultMediaFileDirectory(getActionWeblog());

             }

             this.directoryId = directory.getId();

             this.directoryName = directory.getName();

@@ -258,8 +256,7 @@
                     .getMediaFileManager();

             if (!StringUtils.isEmpty(viewDirectoryId)) {

                 setDirectoryId(viewDirectoryId);

-                setCurrentDirectory(manager

-                        .getMediaFileDirectory(viewDirectoryId));

+                setCurrentDirectory(manager.getMediaFileDirectory(viewDirectoryId));

             }

         } catch (WebloggerException ex) {

             log.error("Error looking up directory", ex);

@@ -279,11 +276,9 @@
         if (valSuccess) {

             MediaFileFilter filter = new MediaFileFilter();

             bean.copyTo(filter);

-            MediaFileManager manager = WebloggerFactory.getWeblogger()

-                    .getMediaFileManager();

+            MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager();

             try {

-                List<MediaFile> rawResults = manager.searchMediaFiles(

-                        getActionWeblog(), filter);

+                List<MediaFile> rawResults = manager.searchMediaFiles(getActionWeblog(), filter);

                 boolean hasMore = false;

                 List<MediaFile> results = new ArrayList<MediaFile>();

                 results.addAll(rawResults);

@@ -329,8 +324,7 @@
     public String deleteFolder() {

 

         try {

-            MediaFileManager manager = WebloggerFactory.getWeblogger()

-                    .getMediaFileManager();

+            MediaFileManager manager = WebloggerFactory.getWeblogger().getMediaFileManager();

             if (directoryId != null) {

                 log.debug("Deleting media file folder - " + directoryId + " ("

                         + directoryName + ")");

diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java
index a206b05..ce7956a 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/StylesheetEdit.java
@@ -18,31 +18,27 @@
 
 package org.apache.roller.weblogger.ui.struts2.editor;
 
-import java.util.Date;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.WebloggerException;
 import org.apache.roller.weblogger.business.WeblogManager;
+import org.apache.roller.weblogger.business.Weblogger;
 import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.apache.roller.weblogger.business.themes.SharedTheme;
 import org.apache.roller.weblogger.business.themes.ThemeManager;
-import org.apache.roller.weblogger.pojos.CustomTemplateRendition;
+import org.apache.roller.weblogger.pojos.*;
 import org.apache.roller.weblogger.pojos.TemplateRendition.RenditionType;
-import org.apache.roller.weblogger.pojos.TemplateRendition;
-import org.apache.roller.weblogger.pojos.Theme;
-import org.apache.roller.weblogger.pojos.ThemeTemplate;
 import org.apache.roller.weblogger.pojos.ThemeTemplate.ComponentType;
-import org.apache.roller.weblogger.pojos.Weblog;
-import org.apache.roller.weblogger.pojos.WeblogTemplate;
-import org.apache.roller.weblogger.pojos.WeblogTheme;
 import org.apache.roller.weblogger.ui.struts2.util.UIAction;
 import org.apache.roller.weblogger.util.cache.CacheManager;
 import org.apache.struts2.convention.annotation.AllowedMethods;
 
+import java.util.Date;
+
 /**
  * Action which handles editing for a weblog stylesheet override template.
  */
-// TODO: make this work @AllowedMethods({"execute","move","delete","revert"})
+// TODO: make this work @AllowedMethods({"execute","copyStylesheet","delete","revert"})
 public class StylesheetEdit extends UIAction {
 
     private static final long serialVersionUID = 4657591015852311907L;
@@ -56,13 +52,8 @@
     private String contentsStandard = null;
     private String contentsMobile = null;
 
-    private boolean sharedTheme;
-
-    // read by JSP to determine if user just deleted his shared theme customized stylesheet
-    private boolean sharedStylesheetDeleted;
-
-    // Do we have a custom stylesheet already for a shared theme
-    private boolean sharedThemeCustomStylesheet = false;
+    // if shared theme, is a stylesheet supported?
+    private boolean sharedThemeStylesheet = false;
 
     public StylesheetEdit() {
         this.actionName = "stylesheetEdit";
@@ -72,91 +63,26 @@
 
     @Override
     public void myPrepare() {
-        sharedTheme = !WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme());
-        sharedStylesheetDeleted = false;
 
-        ThemeTemplate stylesheet = null;
-        try {
-            stylesheet = getActionWeblog().getTheme().getStylesheet();
-        } catch (WebloggerException ex) {
-            log.error("Error looking up stylesheet on weblog - "
-                    + getActionWeblog().getHandle(), ex);
-        }
+        sharedThemeStylesheet = false;
 
-        if (stylesheet != null) {
-            log.debug("custom stylesheet path is - " + stylesheet.getLink());
+        WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager();
+        ThemeManager themeManager = WebloggerFactory.getWeblogger().getThemeManager();
+
+        if ( isSharedTheme() ) {
             try {
-                setTemplate(WebloggerFactory.getWeblogger().getWeblogManager()
-                        .getTemplateByLink(getActionWeblog(), stylesheet.getLink()));
+                SharedTheme themeName = themeManager.getTheme(getActionWeblog().getEditorTheme());
+                sharedThemeStylesheet = themeName.getStylesheet() != null;
 
-                if (getTemplate() == null) {
-                    log.debug("custom stylesheet not found, creating it");
+                ThemeTemplate themeStylesheet  = themeName.getStylesheet();
 
-                    // template doesn't exist yet, so create it
-                    WeblogTemplate stylesheetTmpl = new WeblogTemplate();
-                    stylesheetTmpl.setWeblog(getActionWeblog());
-                    stylesheetTmpl.setAction(ThemeTemplate.ComponentType.STYLESHEET);
-                    stylesheetTmpl.setName(stylesheet.getName());
-                    stylesheetTmpl.setDescription(stylesheet.getDescription());
-                    stylesheetTmpl.setLink(stylesheet.getLink());
-                    stylesheetTmpl.setHidden(false);
-                    stylesheetTmpl.setNavbar(false);
-                    stylesheetTmpl.setLastModified(new Date());
+                WeblogTemplate weblogStylesheet =
+                    weblogManager.getTemplateByLink(getActionWeblog(), themeStylesheet.getLink());
 
-                    // create renditions for available rendition types
-                    TemplateRendition sCode = stylesheet.getTemplateRendition(RenditionType.STANDARD);
-                    if (sCode != null) {
-                        CustomTemplateRendition standardRendition = new CustomTemplateRendition(
-                                stylesheetTmpl, RenditionType.STANDARD);
-                        standardRendition.setTemplate(sCode.getTemplate());
-                        standardRendition.setTemplateLanguage(sCode.getTemplateLanguage());
-                        WebloggerFactory.getWeblogger().getWeblogManager()
-                                .saveTemplateRendition(standardRendition);
-                    }
-
-                    TemplateRendition mCode = stylesheet.getTemplateRendition(RenditionType.MOBILE);
-                    if (mCode != null) {
-                        CustomTemplateRendition mobileRendition = new CustomTemplateRendition(
-                                stylesheetTmpl, RenditionType.MOBILE);
-                        mobileRendition.setTemplate(mCode.getTemplate());
-                        mobileRendition.setTemplateLanguage(mCode
-                                .getTemplateLanguage());
-                        WebloggerFactory.getWeblogger().getWeblogManager()
-                                .saveTemplateRendition(mobileRendition);
-                    }
-
-                    WebloggerFactory.getWeblogger().getWeblogManager()
-                            .saveTemplate(stylesheetTmpl);
-                    setTemplate(stylesheetTmpl);
-                    WebloggerFactory.getWeblogger().flush();
-
-
-                    // success message
-                    addMessage("stylesheetEdit.create.success");
-                }
-
-                // See if we're using a shared theme with a custom stylesheet
-                if (!WeblogTheme.CUSTOM.equals(getActionWeblog()
-                        .getEditorTheme())
-                        && getActionWeblog().getTheme().getStylesheet() != null) {
-
-                    ThemeTemplate override = WebloggerFactory
-                            .getWeblogger()
-                            .getWeblogManager()
-                            .getTemplateByLink(
-                                    getActionWeblog(),
-                                    getActionWeblog().getTheme()
-                                            .getStylesheet().getLink());
-
-                    if (override != null) {
-                        sharedThemeCustomStylesheet = true;
-                    }
-                }
+                setTemplate( weblogStylesheet );
 
             } catch (WebloggerException ex) {
-                log.error(
-                        "Error finding/adding stylesheet template from weblog - "
-                                + getActionWeblog().getHandle(), ex);
+                log.error("Error looking up shared theme name on weblog - " + getActionWeblog().getHandle(), ex);
             }
         }
     }
@@ -165,21 +91,19 @@
      * Show stylesheet edit page.
      */
     public String execute() {
+
         if (template != null) {
             try {
                 if (getTemplate().getTemplateRendition(RenditionType.STANDARD) != null) {
-                    setContentsStandard(getTemplate().getTemplateRendition(
-                            RenditionType.STANDARD).getTemplate());
+                    setContentsStandard(getTemplate().getTemplateRendition( RenditionType.STANDARD).getTemplate());
                 } else {
                     setContentsStandard("");
                 }
                 if (getTemplate().getTemplateRendition(RenditionType.MOBILE) != null) {
-                    setContentsMobile(getTemplate().getTemplateRendition(
-                            RenditionType.MOBILE).getTemplate());
+                    setContentsMobile(getTemplate().getTemplateRendition( RenditionType.MOBILE).getTemplate());
                 }
                 if (log.isDebugEnabled()) {
-                    log.debug("Standard: " + getContentsStandard() + " Mobile: "
-                            + getContentsMobile());
+                    log.debug("Standard: " + getContentsStandard() + " Mobile: " + getContentsMobile());
                 }
             } catch (WebloggerException e) {
                 log.error("Error loading Weblog template codes for stylesheet", e);
@@ -188,10 +112,83 @@
         return INPUT;
     }
 
+    public String copyStylesheet() {
+
+        WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager();
+        ThemeManager themeManager = WebloggerFactory.getWeblogger().getThemeManager();
+
+        ThemeTemplate stylesheet = null;
+
+        try {
+            SharedTheme themeName = themeManager.getTheme(getActionWeblog().getEditorTheme());
+            stylesheet = themeName.getStylesheet();
+
+        } catch (WebloggerException ex) {
+
+        }
+
+        log.debug("custom stylesheet path is - " + stylesheet.getLink());
+        try {
+            setTemplate( weblogManager.getTemplateByLink(getActionWeblog(), stylesheet.getLink()));
+
+            if (getTemplate() == null) {
+                log.debug("custom stylesheet not found, creating it");
+
+                WeblogTemplate stylesheetTmpl = new WeblogTemplate();
+                stylesheetTmpl.setWeblog(getActionWeblog());
+                stylesheetTmpl.setAction(ComponentType.STYLESHEET);
+                stylesheetTmpl.setName(stylesheet.getName());
+                stylesheetTmpl.setDescription(stylesheet.getDescription());
+                stylesheetTmpl.setLink(stylesheet.getLink());
+                stylesheetTmpl.setHidden(false);
+                stylesheetTmpl.setNavbar(false);
+                stylesheetTmpl.setLastModified(new Date());
+
+                // create renditions for available rendition types: standard and mobile
+
+                TemplateRendition sCode = stylesheet.getTemplateRendition(RenditionType.STANDARD);
+                if (sCode != null) {
+                    CustomTemplateRendition standardRendition = new CustomTemplateRendition(
+                        stylesheetTmpl, RenditionType.STANDARD);
+                    standardRendition.setTemplate(sCode.getTemplate());
+                    standardRendition.setTemplateLanguage(sCode.getTemplateLanguage());
+                    weblogManager.saveTemplateRendition(standardRendition);
+                }
+
+                TemplateRendition mCode = stylesheet.getTemplateRendition(RenditionType.MOBILE);
+                if (mCode != null) {
+                    CustomTemplateRendition mobileRendition =
+                        new CustomTemplateRendition(stylesheetTmpl, RenditionType.MOBILE);
+                    mobileRendition.setTemplate(mCode.getTemplate());
+                    mobileRendition.setTemplateLanguage(mCode.getTemplateLanguage());
+                    weblogManager.saveTemplateRendition(mobileRendition);
+                }
+
+                weblogManager.saveTemplate(stylesheetTmpl);
+                setTemplate(stylesheetTmpl);
+
+                WebloggerFactory.getWeblogger().flush();
+
+                // success message
+                addMessage("stylesheetEdit.create.success");
+            }
+
+        } catch (WebloggerException ex) {
+            log.error("Error finding/adding stylesheet template from weblog - "
+                + getActionWeblog().getHandle(), ex);
+            addError("generic.error.check.logs");
+        }
+
+        return revert();
+    }
+
     /**
      * Save an existing stylesheet.
      */
     public String save() {
+
+        WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager();
+
         if (!hasActionErrors()) {
             try {
 
@@ -202,26 +199,21 @@
 
                 if (stylesheet.getTemplateRendition(RenditionType.STANDARD) != null) {
                     // if we have a template, then set it
-                    CustomTemplateRendition tc = stylesheet
-                            .getTemplateRendition(RenditionType.STANDARD);
+                    CustomTemplateRendition tc = stylesheet.getTemplateRendition(RenditionType.STANDARD);
                     tc.setTemplate(getContentsStandard());
-                    WebloggerFactory.getWeblogger().getWeblogManager()
-                            .saveTemplateRendition(tc);
+                    weblogManager.saveTemplateRendition(tc);
+
                 } else {
                     // otherwise create it, then set it
-                    CustomTemplateRendition tc = new CustomTemplateRendition(
-                            stylesheet, RenditionType.STANDARD);
+                    CustomTemplateRendition tc = new CustomTemplateRendition( stylesheet, RenditionType.STANDARD);
                     tc.setTemplate("");
-                    WebloggerFactory.getWeblogger().getWeblogManager()
-                            .saveTemplateRendition(tc);
+                    weblogManager.saveTemplateRendition(tc);
                 }
 
                 if (stylesheet.getTemplateRendition(RenditionType.MOBILE) != null) {
-                    CustomTemplateRendition tc = stylesheet
-                            .getTemplateRendition(RenditionType.MOBILE);
+                    CustomTemplateRendition tc = stylesheet.getTemplateRendition(RenditionType.MOBILE);
                     tc.setTemplate(getContentsMobile());
-                    WebloggerFactory.getWeblogger().getWeblogManager()
-                            .saveTemplateRendition(tc);
+                    weblogManager.saveTemplateRendition(tc);
                 }
 
                 // save template and flush
@@ -248,53 +240,54 @@
      * Revert the stylesheet to its original state.  UI provides this only for shared themes.
      */
     public String revert() {
-        if (sharedTheme && !hasActionErrors()) {
+
+        WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager();
+
+        if (isSharedTheme() && !hasActionErrors()) {
             try {
 
                 WeblogTemplate stylesheet = getTemplate();
 
                 // lookup the theme used by this weblog
-                ThemeManager tmgr = WebloggerFactory.getWeblogger()
-                        .getThemeManager();
+                ThemeManager tmgr = WebloggerFactory.getWeblogger() .getThemeManager();
                 Theme theme = tmgr.getTheme(getActionWeblog().getEditorTheme());
 
                 stylesheet.setLastModified(new Date());
 
                 if (stylesheet.getTemplateRendition(RenditionType.STANDARD) != null) {
-                    TemplateRendition templateCode = theme.getStylesheet()
-                            .getTemplateRendition(RenditionType.STANDARD);
+
+                    TemplateRendition templateCode =
+                        theme.getStylesheet().getTemplateRendition(RenditionType.STANDARD);
+
                     // if we have a template, then set it
-                    CustomTemplateRendition existingTemplateCode = stylesheet
-                            .getTemplateRendition(RenditionType.STANDARD);
-                    existingTemplateCode
-                            .setTemplate(templateCode.getTemplate());
-                    WebloggerFactory.getWeblogger().getWeblogManager()
-                            .saveTemplateRendition(existingTemplateCode);
+                    CustomTemplateRendition existingTemplateCode =
+                        stylesheet.getTemplateRendition(RenditionType.STANDARD);
+
+                    existingTemplateCode.setTemplate(templateCode.getTemplate());
+                    weblogManager.saveTemplateRendition(existingTemplateCode);
                 }
                 if (stylesheet.getTemplateRendition(RenditionType.MOBILE) != null) {
-                    TemplateRendition templateCode = theme.getStylesheet()
-                            .getTemplateRendition(RenditionType.MOBILE);
-                    CustomTemplateRendition existingTemplateCode = stylesheet
-                            .getTemplateRendition(RenditionType.MOBILE);
-                    existingTemplateCode
-                            .setTemplate(templateCode.getTemplate());
+
+                    TemplateRendition templateCode =
+                        theme.getStylesheet().getTemplateRendition(RenditionType.MOBILE);
+                    CustomTemplateRendition existingTemplateCode =
+                        stylesheet.getTemplateRendition(RenditionType.MOBILE);
+
+                    existingTemplateCode.setTemplate(templateCode.getTemplate());
                 }
 
                 // save template and flush
-                WebloggerFactory.getWeblogger().getWeblogManager()
-                        .saveTemplate(stylesheet);
+                weblogManager.saveTemplate(stylesheet);
                 WebloggerFactory.getWeblogger().flush();
 
                 // notify caches
                 CacheManager.invalidate(stylesheet);
 
                 // success message
-                addMessage("stylesheetEdit.revert.success",
-                        stylesheet.getName());
+                addMessage("stylesheetEdit.revert.success", stylesheet.getName());
 
             } catch (WebloggerException ex) {
-                log.error("Error updating stylesheet template for weblog - "
-                        + getActionWeblog().getHandle(), ex);
+                log.error("Error updating stylesheet template for weblog - " + getActionWeblog().getHandle(), ex);
                 addError("generic.error.check.logs");
             }
         }
@@ -305,19 +298,18 @@
      * set theme to default stylesheet, ie delete it.
      */
     public String delete() {
-        if (template != null && sharedTheme && !hasActionErrors()) {
+        if (template != null && isSharedTheme() && !hasActionErrors()) {
             try {
                 // Delete template and flush
-                WeblogManager mgr = WebloggerFactory.getWeblogger()
-                        .getWeblogManager();
+                WeblogManager weblogManager = WebloggerFactory.getWeblogger().getWeblogManager();
 
                 // Remove template and page codes
-                mgr.removeTemplate(template);
+                weblogManager.removeTemplate(template);
 
                 Weblog weblog = getActionWeblog();
 
                 // save updated weblog and flush
-                mgr.saveWeblog(weblog);
+                weblogManager.saveWeblog(weblog);
 
                 // notify caches
                 CacheManager.invalidate(template);
@@ -326,15 +318,12 @@
                 WebloggerFactory.getWeblogger().flush();
 
                 // success message
-                addMessage("stylesheetEdit.default.success",
-                        template.getName());
+                addMessage("stylesheetEdit.default.success", template.getName());
 
                 template = null;
-                sharedStylesheetDeleted = true;
 
             } catch (Exception e) {
-                log.error("Error deleting stylesheet template for weblog - "
-                        + getActionWeblog().getHandle(), e);
+                log.error("Error deleting stylesheet template for weblog - " + getActionWeblog().getHandle(), e);
                 addError("generic.error.check.logs");
             }
         }
@@ -343,7 +332,6 @@
 
     /**
      * Checks if is custom theme.
-     * 
      * @return true, if is custom theme
      */
     public boolean isCustomTheme() {
@@ -351,8 +339,19 @@
     }
 
     /**
+     * Checks if is shared theme.
+     * @return true, if is shared theme
+     */
+    public boolean isSharedTheme() {
+        return !isCustomTheme();
+    }
+
+    public boolean isSharedThemeStylesheet() {
+        return sharedThemeStylesheet;
+    }
+
+    /**
      * Gets the template.
-     * 
      * @return the template
      */
     public WeblogTemplate getTemplate() {
@@ -361,9 +360,7 @@
 
     /**
      * Sets the template.
-     * 
-     * @param template
-     *            the new template
+     * @param template the new template
      */
     public void setTemplate(WeblogTemplate template) {
         this.template = template;
@@ -371,7 +368,6 @@
 
     /**
      * Gets the contents standard.
-     * 
      * @return the contents standard
      */
     public String getContentsStandard() {
@@ -380,9 +376,7 @@
 
     /**
      * Sets the contents standard.
-     * 
-     * @param contents
-     *            the new contents standard
+     * @param contents the new contents standard
      */
     public void setContentsStandard(String contents) {
         this.contentsStandard = contents;
@@ -390,7 +384,6 @@
 
     /**
      * Gets the contents mobile.
-     * 
      * @return the contents mobile
      */
     public String getContentsMobile() {
@@ -399,29 +392,9 @@
 
     /**
      * Sets the contents mobile.
-     * 
-     * @param contents
-     *            the new contents mobile
+     * @param contents the new contents mobile
      */
     public void setContentsMobile(String contents) {
         this.contentsMobile = contents;
     }
-
-    /**
-     * Checks if using a shared theme with a custom stylesheet.
-     * 
-     * @return true, if checks if shared theme and custom stylesheet
-     */
-    public boolean isSharedThemeCustomStylesheet() {
-        return sharedThemeCustomStylesheet;
-    }
-
-    /**
-     * Checks if user just deleted his custom shared stylesheet
-     *
-     * @return true, if custom shared stylesheet was deleted.
-     */
-    public boolean isSharedStylesheetDeleted() {
-        return sharedStylesheetDeleted;
-    }
 }
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEdit.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEdit.java
index 19d34ff..4642808 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEdit.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateEdit.java
@@ -114,8 +114,7 @@
                 getBean().copyTo(templateToSave);
                 templateToSave.setLastModified(new Date());
 
-                if (getBean().getAutoContentType() == null ||
-                        !getBean().getAutoContentType()) {
+                if (getBean().getAutoContentType() == null || !getBean().getAutoContentType()) {
                     templateToSave.setOutputContentType(getBean().getManualContentType());
                 } else {
                     // empty content-type indicates that template uses auto content-type detection
@@ -151,7 +150,7 @@
         if (!getTemplate().getName().equals(getBean().getName())) {
             try {
                 if (WebloggerFactory.getWeblogger().getWeblogManager()
-                    .getTemplateByName(getActionWeblog(), getBean().getName()) != null) {
+                        .getTemplateByName(getActionWeblog(), getBean().getName()) != null) {
                     addError("pagesForm.error.alreadyExists", getBean().getName());
                 }
             } catch (WebloggerException ex) {
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateRemove.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateRemove.java
index 4f9a82b..7446826 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateRemove.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplateRemove.java
@@ -18,6 +18,7 @@
 
 package org.apache.roller.weblogger.ui.struts2.editor;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.WebloggerException;
@@ -28,6 +29,7 @@
 import org.apache.roller.weblogger.pojos.WeblogTemplate;
 import org.apache.roller.weblogger.pojos.WeblogTheme;
 import org.apache.roller.weblogger.ui.struts2.util.UIAction;
+import org.apache.roller.weblogger.util.Utilities;
 import org.apache.roller.weblogger.util.cache.CacheManager;
 import org.apache.struts2.convention.annotation.AllowedMethods;
 
@@ -37,72 +39,67 @@
 // TODO: make this work @AllowedMethods({"execute","remove","cancel"})
 public class TemplateRemove extends UIAction {
 
-	private static Log log = LogFactory.getLog(TemplateRemove.class);
+    private static Log log = LogFactory.getLog(TemplateRemove.class);
 
-	// id of template to remove
-	private String removeId = null;
+    // id of template to remove
+    private String removeId = null;
 
-	// template object that we will remove
-	private WeblogTemplate template = null;
+    // template object that we will remove
+    private WeblogTemplate template = null;
 
-	public TemplateRemove() {
-		this.actionName = "templateRemove";
-		this.desiredMenu = "editor";
-		this.pageTitle = "editPages.title.removeOK";
-	}
+    public TemplateRemove() {
+        this.actionName = "templateRemove";
+        this.desiredMenu = "editor";
+        this.pageTitle = "editPages.title.removeOK";
+    }
 
-	public void myPrepare() {
-		if (getRemoveId() != null) {
+    public void myPrepare() {
+        if (StringUtils.isNotEmpty(getRemoveId())) {
             try {
-                setTemplate(WebloggerFactory.getWeblogger().getWeblogManager()
-                        .getTemplate(getRemoveId()));
+                setTemplate(
+                    WebloggerFactory.getWeblogger().getWeblogManager().getTemplate(getRemoveId()));
             } catch (WebloggerException ex) {
-                log.error("Error looking up template by id - " + getRemoveId(),
-                        ex);
+                log.error("Error looking up template by id - " + getRemoveId(), ex);
                 addError("editPages.remove.notFound", getRemoveId());
             }
         }
-	}
+    }
 
-	/**
-	 * Display the remove template confirmation.
-	 */
-	public String execute() {
-		return "confirm";
-	}
+    /**
+     * Display the remove template confirmation.
+     */
+    public String execute() {
+        return "confirm";
+    }
 
-	/**
-	 * Remove a new template.
-	 */
-	public String remove() {
+    /**
+     * Remove a new template.
+     */
+    public String remove() {
 
-		if (getTemplate() != null) {
+        if (getTemplate() != null) {
             try {
                 if (!getTemplate().isRequired()
-                        || !WeblogTheme.CUSTOM.equals(getActionWeblog()
-                        .getEditorTheme())) {
+                    || !WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())) {
 
-                    WeblogManager mgr = WebloggerFactory.getWeblogger()
-                            .getWeblogManager();
+                    WeblogManager mgr = WebloggerFactory.getWeblogger().getWeblogManager();
 
                     // if weblog template remove custom style sheet also
-                    if (getTemplate().getName().equals(
-                            WeblogTemplate.DEFAULT_PAGE)) {
+                    if (getTemplate().getName().equals(WeblogTemplate.DEFAULT_PAGE)) {
 
                         Weblog weblog = getActionWeblog();
 
-                        ThemeTemplate stylesheet = getActionWeblog().getTheme()
-                                .getStylesheet();
+                        ThemeTemplate stylesheet = getActionWeblog().getTheme().getStylesheet();
 
                         // Delete style sheet if the same name
                         if (stylesheet != null
-                                && getActionWeblog().getTheme().getStylesheet() != null
-                                && stylesheet.getLink().equals(
-                                getActionWeblog().getTheme()
-                                        .getStylesheet().getLink())) {
+                            && getActionWeblog().getTheme().getStylesheet() != null
+                            && stylesheet.getLink().equals(
+                            getActionWeblog().getTheme().getStylesheet().getLink())) {
+
                             // Same so OK to delete
-                            WeblogTemplate css = mgr.getTemplateByLink(
-                                    getActionWeblog(), stylesheet.getLink());
+                            WeblogTemplate css =
+                                mgr.getTemplateByLink(getActionWeblog(), stylesheet.getLink());
 
                             if (css != null) {
                                 mgr.removeTemplate(css);
@@ -126,32 +123,28 @@
             }
         }
 
-		return "confirm";
-	}
-	
-    /**
-     * Cancel.
-     * 
-     * @return the string
-     */
+        return "confirm";
+    }
+
+
     public String cancel() {
         return CANCEL;
     }
 
-	public String getRemoveId() {
-		return removeId;
-	}
+    public String getRemoveId() {
+        return removeId;
+    }
 
-	public void setRemoveId(String removeId) {
-		this.removeId = removeId;
-	}
+    public void setRemoveId(String removeId) {
+        this.removeId = removeId;
+    }
 
-	public WeblogTemplate getTemplate() {
-		return template;
-	}
+    public WeblogTemplate getTemplate() {
+        return template;
+    }
 
-	public void setTemplate(WeblogTemplate template) {
-		this.template = template;
-	}
+    public void setTemplate(WeblogTemplate template) {
+        this.template = template;
+    }
 
 }
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java
index 4793e11..2621d2f 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/Templates.java
@@ -46,103 +46,99 @@
 // TODO: make this work @AllowedMethods({"execute","add"})
 public class Templates extends UIAction {
 
-	private static Log log = LogFactory.getLog(Templates.class);
+    private static Log log = LogFactory.getLog(Templates.class);
 
-	// list of templates to display
-	private List<WeblogTemplate> templates = Collections.emptyList();
+    // list of templates to display
+    private List<WeblogTemplate> templates = Collections.emptyList();
 
-	// list of template action types user is allowed to create
-	private Map<ComponentType, String> availableActions = Collections.emptyMap();
+    // list of template action types user is allowed to create
+    private Map<ComponentType, String> availableActions = Collections.emptyMap();
 
-	// name and action of new template if we are adding a template
-	private String newTmplName = null;
-	private ComponentType newTmplAction = null;
+    // name and action of new template if we are adding a template
+    private String newTmplName = null;
+    private ComponentType newTmplAction = null;
 
-	public Templates() {
-		this.actionName = "templates";
-		this.desiredMenu = "editor";
-		this.pageTitle = "pagesForm.title";
-	}
+    public Templates() {
+        this.actionName = "templates";
+        this.desiredMenu = "editor";
+        this.pageTitle = "pagesForm.title";
+    }
 
-	public String execute() {
+    public String execute() {
 
-		// query for templates list
-		try {
+        // query for templates list
+        try {
 
-			// get current list of templates, minus custom stylesheet
-			List<WeblogTemplate> raw = WebloggerFactory.getWeblogger()
-					.getWeblogManager().getTemplates(getActionWeblog());
-			List<WeblogTemplate> pages = new ArrayList<WeblogTemplate>();
-			pages.addAll(raw);
-			// Remove style sheet from list so not to show when theme is
-			// selected in shared theme mode
-			if (getActionWeblog().getTheme().getStylesheet() != null) {
-				pages.remove(WebloggerFactory
-						.getWeblogger()
-						.getWeblogManager()
-						.getTemplateByLink(
-								getActionWeblog(),
-								getActionWeblog().getTheme().getStylesheet()
-										.getLink()));
-			}
-			setTemplates(pages);
+            // get current list of templates, minus custom stylesheet
+            List<WeblogTemplate> raw = WebloggerFactory.getWeblogger()
+                .getWeblogManager().getTemplates(getActionWeblog());
+            List<WeblogTemplate> pages = new ArrayList<WeblogTemplate>();
+            pages.addAll(raw);
 
-			// build list of action types that may be added
-			Map<ComponentType, String> actionsMap = new EnumMap<ComponentType, String>(ComponentType.class);
-			addComponentTypeToMap(actionsMap, ComponentType.CUSTOM);
+            // Remove style sheet from list so not to show when theme is
+            // selected in shared theme mode
+            if (getActionWeblog().getTheme().getStylesheet() != null) {
+                pages.remove(WebloggerFactory.getWeblogger().getWeblogManager()
+                    .getTemplateByLink(getActionWeblog(), getActionWeblog().getTheme().getStylesheet().getLink()));
+            }
+            setTemplates(pages);
 
-			if (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())) {
-				// if the weblog is using a custom theme then determine which
-				// action templates are still available to be created
-				addComponentTypeToMap(actionsMap, ComponentType.PERMALINK);
-				addComponentTypeToMap(actionsMap, ComponentType.SEARCH);
-				addComponentTypeToMap(actionsMap, ComponentType.WEBLOG);
-				addComponentTypeToMap(actionsMap, ComponentType.TAGSINDEX);
+            // build list of action types that may be added
+            Map<ComponentType, String> actionsMap = new EnumMap<ComponentType, String>(ComponentType.class);
+            addComponentTypeToMap(actionsMap, ComponentType.CUSTOM);
 
-				for (WeblogTemplate tmpPage : getTemplates()) {
-					if (!ComponentType.CUSTOM.equals(tmpPage
-							.getAction())) {
-						actionsMap.remove(tmpPage.getAction());
-					}
-				}
-			} else {
-				// Make sure we have an option for the default web page
-				addComponentTypeToMap(actionsMap, ComponentType.WEBLOG);
-				if (getNewTmplAction() == null) {
-					setNewTmplAction(ComponentType.WEBLOG);
-				}
-				for (WeblogTemplate tmpPage : getTemplates()) {
-					if (ComponentType.WEBLOG.equals(tmpPage.getAction())) {
-						actionsMap.remove(ComponentType.WEBLOG);
-						setNewTmplAction(null);
-						break;
-					}
-				}
-			}
-			setAvailableActions(actionsMap);
+            if (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())) {
 
-		} catch (WebloggerException ex) {
-			log.error("Error getting templates for weblog - "
-					+ getActionWeblog().getHandle(), ex);
-			addError("Error getting template list - check Roller logs");
-		}
+                // if the weblog is using a custom theme then determine which
+                // action templates are still available to be created
+                addComponentTypeToMap(actionsMap, ComponentType.PERMALINK);
+                addComponentTypeToMap(actionsMap, ComponentType.SEARCH);
+                addComponentTypeToMap(actionsMap, ComponentType.WEBLOG);
+                addComponentTypeToMap(actionsMap, ComponentType.TAGSINDEX);
 
-		return LIST;
-	}
+                for (WeblogTemplate tmpPage : getTemplates()) {
+                    if (!ComponentType.CUSTOM.equals(tmpPage.getAction())) {
+                        actionsMap.remove(tmpPage.getAction());
+                    }
+                }
+            } else {
+                // Make sure we have an option for the default web page
+                addComponentTypeToMap(actionsMap, ComponentType.WEBLOG);
+                if (getNewTmplAction() == null) {
+                    setNewTmplAction(ComponentType.WEBLOG);
+                }
+                for (WeblogTemplate tmpPage : getTemplates()) {
+                    if (ComponentType.WEBLOG.equals(tmpPage.getAction())) {
+                        actionsMap.remove(ComponentType.WEBLOG);
+                        setNewTmplAction(null);
+                        break;
+                    }
+                }
+            }
+            setAvailableActions(actionsMap);
+
+        } catch (WebloggerException ex) {
+            log.error("Error getting templates for weblog - "
+                + getActionWeblog().getHandle(), ex);
+            addError("Error getting template list - check Roller logs");
+        }
+
+        return LIST;
+    }
 
     private void addComponentTypeToMap(Map<ComponentType, String> map, ComponentType component) {
         map.put(component, component.getReadableName());
     }
 
-	/**
-	 * Save a new template.
-	 */
-	public String add() {
+    /**
+     * Save a new template.
+     */
+    public String add() {
 
-		// validation
-		myValidate();
+        // validation
+        myValidate();
 
-		if (!hasActionErrors()) {
+        if (!hasActionErrors()) {
             try {
 
                 WeblogTemplate newTemplate = new WeblogTemplate();
@@ -164,18 +160,16 @@
                 }
 
                 // save the new Template
-                WebloggerFactory.getWeblogger().getWeblogManager()
-                        .saveTemplate(newTemplate);
+                WebloggerFactory.getWeblogger().getWeblogManager().saveTemplate(newTemplate);
 
-                // Create weblog template codes for available types.
-                CustomTemplateRendition standardRendition = new CustomTemplateRendition(
-                        newTemplate, RenditionType.STANDARD);
+                // Create weblog template renditions for available types.
+                CustomTemplateRendition standardRendition =
+                    new CustomTemplateRendition( newTemplate, RenditionType.STANDARD);
                 standardRendition.setTemplate(getText("pageForm.newTemplateContent"));
                 standardRendition.setTemplateLanguage(TemplateLanguage.VELOCITY);
-                WebloggerFactory.getWeblogger().getWeblogManager()
-                        .saveTemplateRendition(standardRendition);
+                WebloggerFactory.getWeblogger().getWeblogManager().saveTemplateRendition(standardRendition);
 
-                /* TBI -- need a way for user to specify dual or single template
+                /* TODO: need a way for user to specify dual or single template via UI
                 CustomTemplateRendition mobileRendition = new CustomTemplateRendition(
                         newTemplate.getId(), RenditionType.MOBILE);
                 mobileRendition.setTemplate(newTemplate.getContents());
@@ -185,11 +179,9 @@
                 */
 
                 // if this person happened to create a Weblog template from
-                // scratch then make sure and set the defaultPageId. What does
-                // this do????
+                // scratch then make sure and set the defaultPageId.
                 if (WeblogTemplate.DEFAULT_PAGE.equals(newTemplate.getName())) {
-                    WebloggerFactory.getWeblogger().getWeblogManager()
-                            .saveWeblog(getActionWeblog());
+                    WebloggerFactory.getWeblogger().getWeblogManager().saveWeblog(getActionWeblog());
                 }
 
                 // flush results to db
@@ -200,83 +192,81 @@
                 setNewTmplAction(null);
 
             } catch (WebloggerException ex) {
-                log.error("Error adding new template for weblog - "
-                        + getActionWeblog().getHandle(), ex);
+                log.error("Error adding new template for weblog - " + getActionWeblog().getHandle(), ex);
                 addError("Error adding new template - check Roller logs");
             }
         }
 
-		return execute();
-	}
+        return execute();
+    }
 
-	// validation when adding a new template
-	private void myValidate() {
+    // validation when adding a new template
+    private void myValidate() {
 
-		// make sure name is non-null and within proper size
-		if (StringUtils.isEmpty(getNewTmplName())) {
-			addError("Template.error.nameNull");
-		} else if (getNewTmplName().length() > RollerConstants.TEXTWIDTH_255) {
-			addError("Template.error.nameSize");
-		}
+        // make sure name is non-null and within proper size
+        if (StringUtils.isEmpty(getNewTmplName())) {
+            addError("Template.error.nameNull");
+        } else if (getNewTmplName().length() > RollerConstants.TEXTWIDTH_255) {
+            addError("Template.error.nameSize");
+        }
 
-		// make sure action is a valid
-		if (getNewTmplAction() == null) {
-			addError("Template.error.actionNull");
-		}
+        // make sure action is a valid
+        if (getNewTmplAction() == null) {
+            addError("Template.error.actionNull");
+        }
 
-		// check if template by that name already exists
-		try {
-			WeblogTemplate existingPage = WebloggerFactory.getWeblogger()
-					.getWeblogManager()
-					.getTemplateByName(getActionWeblog(), getNewTmplName());
-			if (existingPage != null) {
-				addError("pagesForm.error.alreadyExists", getNewTmplName());
-			}
-		} catch (WebloggerException ex) {
-			log.error("Error checking for existing template", ex);
-		}
+        // check if template by that name already exists
+        try {
+            WeblogTemplate existingPage = WebloggerFactory.getWeblogger().getWeblogManager()
+                .getTemplateByName(getActionWeblog(), getNewTmplName());
+            if (existingPage != null) {
+                addError("pagesForm.error.alreadyExists", getNewTmplName());
+            }
+        } catch (WebloggerException ex) {
+            log.error("Error checking for existing template", ex);
+        }
 
-	}
+    }
 
-	/**
-	 * Checks if is custom theme.
-	 * 
-	 * @return true, if is custom theme
-	 */
-	public boolean isCustomTheme() {
-		return (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme()));
-	}
+    /**
+     * Checks if is custom theme.
+     *
+     * @return true, if is custom theme
+     */
+    public boolean isCustomTheme() {
+        return (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme()));
+    }
 
-	public List<WeblogTemplate> getTemplates() {
-		return templates;
-	}
+    public List<WeblogTemplate> getTemplates() {
+        return templates;
+    }
 
-	public void setTemplates(List<WeblogTemplate> templates) {
-		this.templates = templates;
-	}
+    public void setTemplates(List<WeblogTemplate> templates) {
+        this.templates = templates;
+    }
 
-	public Map<ComponentType, String> getAvailableActions() {
-		return availableActions;
-	}
+    public Map<ComponentType, String> getAvailableActions() {
+        return availableActions;
+    }
 
-	public void setAvailableActions(Map<ComponentType, String> availableActions) {
-		this.availableActions = availableActions;
-	}
+    public void setAvailableActions(Map<ComponentType, String> availableActions) {
+        this.availableActions = availableActions;
+    }
 
-	public String getNewTmplName() {
-		return newTmplName;
-	}
+    public String getNewTmplName() {
+        return newTmplName;
+    }
 
-	public void setNewTmplName(String newTmplName) {
-		this.newTmplName = newTmplName;
-	}
+    public void setNewTmplName(String newTmplName) {
+        this.newTmplName = newTmplName;
+    }
 
-	public ComponentType getNewTmplAction() {
-		return newTmplAction;
-	}
+    public ComponentType getNewTmplAction() {
+        return newTmplAction;
+    }
 
-	public void setNewTmplAction(ComponentType newTmplAction) {
-		this.newTmplAction = newTmplAction;
-	}
+    public void setNewTmplAction(ComponentType newTmplAction) {
+        this.newTmplAction = newTmplAction;
+    }
 
 }
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplatesRemove.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplatesRemove.java
deleted file mode 100644
index 7fd3e26..0000000
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/TemplatesRemove.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  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.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- */
-
-package org.apache.roller.weblogger.ui.struts2.editor;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.roller.weblogger.business.WeblogManager;
-import org.apache.roller.weblogger.business.WebloggerFactory;
-import org.apache.roller.weblogger.pojos.ThemeTemplate;
-import org.apache.roller.weblogger.pojos.Weblog;
-import org.apache.roller.weblogger.pojos.WeblogTemplate;
-import org.apache.roller.weblogger.ui.struts2.util.UIAction;
-import org.apache.roller.weblogger.util.Utilities;
-import org.apache.roller.weblogger.util.cache.CacheManager;
-import org.apache.struts2.convention.annotation.AllowedMethods;
-
-/**
- * Remove templates.
- */
-// TODO: make this work @AllowedMethods({"execute","remove","cancel"})
-public class TemplatesRemove extends UIAction {
-
-    private static final long serialVersionUID = 895186156151331087L;
-    private static Log log = LogFactory.getLog(TemplatesRemove.class);
-
-    // Templates to remove
-    private String[] idSelections = null;
-
-    // Limit updates to just this set of comma-separated IDs
-    private String ids = null;
-
-    // list of templates to display
-    private List<WeblogTemplate> templates = Collections.emptyList();
-
-    public TemplatesRemove() {
-        this.actionName = "templatesRemove";
-        this.desiredMenu = "editor";
-        this.pageTitle = "editPages.title.removeOK";
-    }
-
-    public void myPrepare() {
-
-        if (getIdSelections() != null) {
-
-            // query for templates list
-            try {
-
-                WeblogManager mgr = WebloggerFactory.getWeblogger()
-                        .getWeblogManager();
-
-                List<WeblogTemplate> pages = new ArrayList<WeblogTemplate>();
-                WeblogTemplate template = null;
-
-                String[] idsToDelete = getIdSelections();
-                if (idsToDelete != null && idsToDelete.length > 0) {
-
-                    for (String id : idsToDelete) {
-                        if (!id.equals("")) {
-                            template = mgr.getTemplate(id);
-                            if (template != null) {
-                                pages.add(template);
-                            }
-                        }
-                    }
-
-                }
-
-                // Set page data
-                setTemplates(pages);
-                setIds(Utilities.stringArrayToString(idsToDelete, ","));
-
-                // Flush for operation
-                WebloggerFactory.getWeblogger().flush();
-
-            } catch (Exception ex) {
-                log.error("Error getting templates for weblog - "
-                        + getActionWeblog().getHandle(), ex);
-                addError("error.unexpected");
-            }
-
-        }
-    }
-
-    /**
-     * Display the remove template confirmation.
-     */
-    public String execute() {
-
-        if (getIds() != null && getTemplates() != null
-                && getTemplates().size() > 0) {
-            return "confirm";
-        } else {
-            return SUCCESS;
-        }
-
-    }
-
-    /**
-     * Remove Selected templates
-     */
-    public String remove() {
-
-        if (getIds() != null) {
-            try {
-
-                String[] idsToDelete = Utilities.stringToStringArray(getIds(),
-                        ",");
-                if (idsToDelete != null && idsToDelete.length > 0) {
-
-                    WeblogManager mgr = WebloggerFactory.getWeblogger()
-                            .getWeblogManager();
-
-                    Weblog weblog = getActionWeblog();
-                    WeblogTemplate template;
-
-                    for (String id : idsToDelete) {
-                        if (!id.equals("")) {
-                            template = mgr.getTemplate(id);
-                            if (!template.isRequired()
-                                    || !"custom".equals(getActionWeblog().getEditorTheme())) {
-
-                                // if weblog template remove custom style sheet
-                                // also
-                                if (template.getName().equals(
-                                        WeblogTemplate.DEFAULT_PAGE)) {
-
-                                    ThemeTemplate stylesheet = getActionWeblog()
-                                            .getTheme().getStylesheet();
-
-                                    // Delete style sheet if the same name
-                                    if (stylesheet != null
-                                            && getActionWeblog().getTheme()
-                                                    .getStylesheet() != null
-                                            && stylesheet.getLink().equals(
-                                                    getActionWeblog()
-                                                            .getTheme()
-                                                            .getStylesheet()
-                                                            .getLink())) {
-                                        // Same so OK to delete
-                                        WeblogTemplate css = mgr.getTemplateByLink(
-                                                getActionWeblog(),
-                                                stylesheet.getLink());
-
-                                        if (css != null) {
-                                            mgr.removeTemplate(css);
-                                        }
-                                    }
-                                }
-                                mgr.removeTemplate(template);
-                            }
-                        }
-                    }
-
-                    // Save for changes
-                    mgr.saveWeblog(weblog);
-
-                    WebloggerFactory.getWeblogger().flush();
-
-                    // notify caches
-                    CacheManager.invalidate(getActionWeblog());
-
-                }
-
-                return SUCCESS;
-
-            } catch (Exception e) {
-                log.error("Error deleting templates for weblog - "
-                        + getActionWeblog().getHandle(), e);
-
-                addError("error.unexpected");
-
-            }
-        }
-
-        return "confirm";
-    }
-
-    /**
-     * Cancel.
-     * 
-     * @return the string
-     */
-    public String cancel() {
-        return CANCEL;
-    }
-
-    /**
-     * Gets the templates.
-     * 
-     * @return the templates
-     */
-    public List<WeblogTemplate> getTemplates() {
-        return templates;
-    }
-
-    /**
-     * Sets the templates.
-     * 
-     * @param templates
-     *            the new templates
-     */
-    public void setTemplates(List<WeblogTemplate> templates) {
-        this.templates = templates;
-    }
-
-    /**
-     * Select check boxes for deleting records
-     */
-    public String[] getIdSelections() {
-        return idSelections;
-    }
-
-    /**
-     * Select check boxes for deleting records
-     */
-    public void setIdSelections(String[] idSelections) {
-        this.idSelections = idSelections;
-    }
-
-    /**
-     * Comma separated list if ids to remove
-     */
-    public String getIds() {
-        return ids;
-    }
-
-    /**
-     * Comma separated list if ids to remove
-     */
-    public void setIds(String ids) {
-        this.ids = ids;
-    }
-
-}
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogConfig.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogConfig.java
index bcc9f57..9a7fde6 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogConfig.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/editor/WeblogConfig.java
@@ -66,8 +66,7 @@
         this.desiredMenu = "editor";
         this.pageTitle = "websiteSettings.title";
     }
-    
-    
+
     public void myPrepare() {
         
         try {
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java
index cfafbc2..9fdc74e 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UIAction.java
@@ -379,8 +379,9 @@
     
     public List<KeyValueObject> getCommentDaysList() {
         
-        List<KeyValueObject> opts = new ArrayList<KeyValueObject>();
-        
+        List<KeyValueObject> opts = new ArrayList<>();
+
+        opts.add(new KeyValueObject(-1, getText("weblogEdit.commentsNotAllowed")));
         opts.add(new KeyValueObject(0, getText("weblogEdit.unlimitedCommentDays")));
         opts.add(new KeyValueObject(3, getText("weblogEdit.days3")));
         opts.add(new KeyValueObject(7, getText("weblogEdit.days7")));
diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UISecurityInterceptor.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UISecurityInterceptor.java
index 7ba142d..d4c8e8c 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UISecurityInterceptor.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/util/UISecurityInterceptor.java
@@ -67,7 +67,7 @@
                     if (log.isDebugEnabled()) {
                         log.debug("DENIED: required user not found");
                     }
-                    return "access-denied";
+                    return UIAction.DENIED;
                 }
 
                 // are we also enforcing global permissions?
@@ -78,10 +78,9 @@
                             theAction.requiredGlobalPermissionActions());
                     if (!umgr.checkPermission(perm, authenticatedUser)) {
                         if (log.isDebugEnabled()) {
-                            log.debug("DENIED: user does not have permission = "
-                                    + perm.toString());
+                            log.debug("DENIED: user does not have permission = " + perm.toString());
                         }
-                        return "access-denied";
+                        return UIAction.DENIED;
                     }
                 }
 
@@ -96,7 +95,7 @@
                                     " unable to process action \"" + ((UIAction) theAction).getActionName() +
                                     "\" because no weblog was defined (Check JSP form provides weblog value.)");
                         }
-                        return "access-denied";
+                        return UIAction.DENIED;
                     }
 
                     // are we also enforcing a specific weblog permission?
@@ -112,7 +111,7 @@
                                 log.debug("DENIED: user does not have required weblog permissions = "
                                         + required);
                             }
-                            return "access-denied";
+                            return UIAction.DENIED;
                         }
                     }
                 }
diff --git a/app/src/main/resources/ApplicationResources.properties b/app/src/main/resources/ApplicationResources.properties
index 8a68c56..2673f6e 100644
--- a/app/src/main/resources/ApplicationResources.properties
+++ b/app/src/main/resources/ApplicationResources.properties
@@ -19,37 +19,46 @@
 #
 # When to use double-apostrophe for an apostrophe in resource strings?  If they're being rendered
 # via Struts s:text or JSTL fmt:message *with* parameters -- see http://tinyurl.com/m5bqn2h
-#
+
+
 # -- Common terms used to reduce the number of strings that need translation.
 generic.all=All
 generic.none=None
 generic.cancel=Cancel
 generic.done=Done
 generic.yes=Yes
+generic.yesRemove=Yes Remove
 generic.no=No
 generic.name=Name
 generic.description=Description
+generic.action=Action
 generic.save=Save
+generic.rename=Rename
 generic.edit=Edit
 generic.delete=Delete
 generic.tagline=Tagline
-generic.error.check.logs=Roller system error - Have administrator check Roller logs for more information.
+generic.error.check.logs=System error - check logs for more information.
 generic.changes.saved=Changes saved
 generic.toggle=Toggle
+generic.success=Success
+generic.looksGood=Looks good!
+generic.poweredBy=Powered by Apache Roller
 
 # ------------------------------------------------------------- BookmarkForm.jsp
 
 bookmarkForm.add.title=Add New Bookmark
-bookmarkForm.add.subtitle=Adding new bookmark in folder [{0}]
+bookmarkForm.add.subtitle=Adding new bookmark in folder:
 bookmarkForm.edit.title=Edit Bookmark
-bookmarkForm.edit.subtitle=Editing bookmark in folder [{0}]
+bookmarkForm.edit.subtitle=Editing bookmark in folder:
 bookmarkForm.image=Image URL
 bookmarkForm.rssUrl=Newsfeed URL
 bookmarkForm.url=Bookmark URL
 bookmarkForm.created=Bookmark "{0}" created
 bookmarkForm.updated=Bookmark "{0}" updated
+bookmarkForm.required=Name and Bookmark URL are required.
+bookmarkForm.badUrls=These URLs are invalid:
 
-bookmarkForm.requiredFields=The {0} and {1} fields are required.
+bookmarkForm.requiredFields=Name and Bookmark URL are required.
 
 # errors from validation
 Bookmark.error.nameNull=Name is a required field
@@ -67,38 +76,44 @@
 bookmarksForm.root=root
 bookmarksForm.rootTitle=Blogroll
 
-bookmarksForm.rootPrompt=\
-This is your blog''s main bookmarks folder. \
-The bookmarks you keep here will appear in the blogroll section of your blog \
-(assuming that you are using one of the default themes). You can create \
-additional bookmark folders, but you will have to add corresponding bookmark display \
-macros to your weblog''s templates if you wish to display their contents.
+bookmarksForm.subtitle=Manage blogrolls in weblog <span>{0}</span>
 
-bookmarksForm.subtitle=Manage bookmarks in weblog <span>{0}</span>
+bookmarksForm.rootPrompt=This is your blog''s default blogroll. Most blog themes display these links (previously known as bookmarks) in the sidebar of the blog. You can also define new blogroll, but you will have to edit your theme templates if you wish to display them.
+bookmarksForm.otherPrompt=This is a custom blogroll. If you wish to display these links on your blog you will have to edit your blog theme templates.
 
-bookmarksForm.addBookmark=Add Bookmark
-bookmarksForm.addFolder=New Bookmark Folder
+bookmarksForm.path=Blogroll
+bookmarksForm.blogrollName=Blogroll name
+bookmarksForm.switchTo=Switch to blogroll
+bookmarksForm.deleteFolder=Delete current blogroll
+bookmarksForm.newBlogroll=New blogroll...
+
+bookmarksForm.addBookmark=Add blogroll link
+bookmarksForm.addFolder=New blogroll
 bookmarksForm.delete=Delete selected
-bookmarksForm.delete.confirm=Delete selected bookmarks?
-bookmarksForm.deleteFolder.confirm=Delete entire folder including all its bookmarks?
+bookmarksForm.delete.confirm=Confirm Selected Link Delete
+bookmarksForm.delete.areYouSure=Are you sure you want to delete the selected blogroll links?
 bookmarksForm.url=URL
 bookmarksForm.feedurl=Newsfeed URL
-bookmarksForm.folder=Bookmark Folder
-bookmarksForm.deleteFolder=Delete folder
-bookmarksForm.viewFolder=Switch to Folder
-bookmarksForm.edit.tip=Click to modify this bookmark
-bookmarksForm.folder.edit.tip=Click to edit folder
-bookmarksForm.move=Move selected to:
-bookmarksForm.move.confirm=Move selected bookmarks?
-bookmarksForm.path=Folder
-bookmarksForm.selectAllLabel=Select all bookmarks
-bookmarksForm.selectOneLabel=Select bookmark named {0}
+bookmarksForm.folder=Blogroll
+bookmarksForm.edit.tip=Click to modify this link
+bookmarksForm.folder.edit.tip=Click to edit blogroll
+bookmarksForm.move=Move selected to
+bookmarksForm.move.confirm=Move selected link?
+bookmarksForm.selectAllLabel=Select all links
+bookmarksForm.selectOneLabel=Select blogroll named {0}
 bookmarksForm.visitLink=Visit
 bookmarksForm.visitLink.tip=Click to visit this site
 
 bookmarksForm.error.move=Error performing move, parent to child moves not allowed
-bookmarksForm.importBookmarks=Import bookmarks via OPML
-bookmarksForm.noresults=There are currently no folders or bookmarks
+bookmarksForm.importBookmarks=Import Blogroll via OPML
+bookmarksForm.noresults=There are currently no Blogroll links
+
+bookmarksForm.addBlogroll.title=Add New Blogroll
+bookmarksForm.editBlogroll.title=Edit Blogroll
+bookmarksForm.blogroll.requiredFields=You must specify a blogroll name
+
+blogrollDeleteOK.removeBlogroll=Confirm Blogroll Delete
+blogrollDeleteOK.areYouSure=Are you sure you want to delete blogroll and all of its links?
 
 # --------------------------------------------------------- Bookmarks import.jsp
 
@@ -135,11 +150,11 @@
 categoryForm.add.title=Add Category
 categoryForm.add.subtitle=Adding category
 categoryForm.image=Image URL
-categoryForm.created=Category "{0}" created
+categoryForm.created=Category  created
 categoryForm.changesSaved=Category "{0}" updated
-categoryForm.error.duplicateName=Category name "{0}" already in use, please choose another
+categoryForm.error.duplicateName=Category name already in use
 categoryForm.removed=Category "{0}" deleted
-categoryForm.requiredFields={0} is required.
+categoryForm.requiredFields=Name is required.
 
 # errors from validation
 Category.error.nameNull=Name is a required field
@@ -158,12 +173,13 @@
 These are your top-level weblog categories. Roller requires at least one \
 category to be defined. \
 Categories are used to organize your weblog entries and your readers can \
-choose to subscribe to separate newsfeeds for each of your categories.
+choose to subscribe to separate feeds for each of your categories.
 categoriesForm.addCategory=Add Category
 categoriesForm.move=Move
 categoriesForm.move.confirm=Move selected categories?
 categoriesForm.remove=Remove
 categoriesForm.imageUrl=Image URL
+categoryForm.badURL=Image URL is invalid
 
 # --------------------------------------------------------- CategoryDeleteOK.jsp
 
@@ -296,10 +312,10 @@
 
 configForm.title=Roller Configuration
 configForm.subtitle=Change site-wide configuration settings.
-configForm.prompt=Changes you make here apply to the entire site. Note that \
-these are <i>runtime</i> properties only. Please refer to the Roller documentation \
-for information on overriding Roller''s <i>startup</i> properties (in the \
-roller.properties file).
+configForm.prompt=<p>Make the changes you wish and then use the <b>Save</b> button below. \
+Changes you make here apply to the entire site.<p> \
+<p>Note that there is also a Roller configuration file that contains additional settings. \
+Talk to your systems administrator or refer to the Roller documentation for more information.</p>
 
 configForm.siteSettings=Site Settings
 configForm.siteName=Site Name (for main page and RSS feed)
@@ -326,8 +342,8 @@
 
 configForm.weblogSettings=Weblog Rendering Settings
 configForm.pageMaxEntries=Max number of entries to allow per page
-configForm.newsfeedMaxEntries=Number of entries to provide in newsfeeds
-configForm.styledFeeds=Display styled newsfeeds for browsers
+configForm.newsfeedMaxEntries=Number of entries to provide in feeds
+configForm.styledFeeds=Display styled feeds for browsers
 
 configForm.commentSettings=Comment and Trackback Settings
 configForm.enableComments=Allow weblog comments?
@@ -335,7 +351,7 @@
 configForm.enableTrackbacks=Allow weblog trackbacks?
 configForm.ignoreSpamTrackbacks=Don''t save trackbacks thought to be spam
 configForm.commentHtmlAllowed=Allow html in comments?
-configForm.commentPlugins=Enabled/Disable comment formatting plugins
+configForm.commentPlugins=Enabled comment formatting plugins
 configForm.emailComments=Allow email notification of comments?
 configForm.moderationRequired=Require comment moderation for all weblogs
 configForm.enableTrackbackValidation=Enable verification of trackback links?
@@ -364,10 +380,10 @@
 
 createWebsite.tip.name=The name is the title of your weblog, it will be \
 displayed at the top of your weblog page, and in the title field of your \
-weblog''s newsfeed. This field should not include HTML.
+weblog''s feed. This field should not include HTML.
 createWebsite.tip.description=The description of your weblog may be displayed \
 at the top of your weblog (depending on the theme you choose), and it will be \
-used in description or subtitle field of your newsfeed. This field should not \
+used in description or subtitle field of your feed. This field should not \
 include HTML.
 createWebsite.tip.handle=The handle is a short one-word name for your \
 weblog. It will be used in your URL, so please limit it to simple ASCII \
@@ -385,7 +401,7 @@
 createWebsite.handle=Handle
 createWebsite.emailAddress=Email Address
 createWebsite.locale=Locale
-createWebsite.timeZone=Timezone
+createWebsite.timezone=Timezone
 createWebsite.theme=Theme
 createWebsite.weblogUrl=URL
 createWebsite.button.save=Create Weblog
@@ -413,7 +429,7 @@
 # --------------------------------------------------------------- Entry editors
 
 editor.text.name=Plain HTML
-editor.xinha.name=Rich Text Editor (Xinha)
+editor.summernote.name=Rich Text Editor (Summernote)
 
 # --------------------------------------------------------------- Comment emails
 
@@ -568,7 +584,7 @@
 
 # ------------------------------------------------------------------- Installer
 
-installer.bannerTitleLeft=Apache Roller Weblogger
+installer.bannerTitleLeft=Apache Roller
 installer.bannerTitleRight=Auto-Installer
 
 # database error
@@ -640,9 +656,9 @@
 # ----------------------------------------------------------------------- Login
 
 loginPage.title=Welcome to Roller
-loginPage.prompt=Please enter your username and password to login.
-loginPage.openIdPrompt=Please login via OpenID
-loginPage.openIdHybridPrompt=Or, login with your username and password
+loginPage.prompt=Please login
+loginPage.openIdPrompt=Login with OpenID
+loginPage.openIdHybridPrompt=Or with username
 loginPage.userName=Username
 loginPage.password=Password
 loginPage.openID=OpenID username
@@ -707,8 +723,8 @@
 mainPage.category=Category
 mainPage.searchWeblogs=Search for blogs
 mainPage.actions=Actions
-mainPage.loggedInAs=logged in as
-mainPage.currentWebsite=editing weblog
+mainPage.loggedInAs=Logged in as
+mainPage.currentWebsite=Editing weblog
 mainPage.mainMenu=Main Menu
 
 # ------------------------------------------------------------------ Maintenance
@@ -730,19 +746,14 @@
 
 # ----------------------------------------------------------- Media file management
 
-mediaFileImageChooser.subtitle=Choose an image
-mediaFileImageChooser.rootPageTip=Click to choose an image or click on a \
-directory to enter it.
-mediaFileImageChooser.dirPageTip=Click to choose an image or use the Switch to Folder \
-drop-down to move to another directory.
-
+mediaFileImageChooser.subtitle=Choose a Media File to be inserted
+mediaFileImageChooser.pageTip=Select an image and it will be included as a thumbnail, or select a file and it will be included as a link.
 
 # -- Media File Add
 
-mediaFileAdd.title=Add new media file(s)
-mediaFileAdd.pageTip=Use this page to upload up to five new media files. \
-Form fields that you set below will be applied to all files uploaded.
-mediaFileAdd.fileLocation=Choose file to upload
+mediaFileAdd.title=Add new media file
+mediaFileAdd.pageTip=Use this page to upload up to five new media files. The name, description, tags and other properties will be applied to all files uploaded.
+mediaFileAdd.fileLocation=Choose media files to upload
 mediaFileAdd.tags=Tags (space separated)
 mediaFileAdd.copyright=Copyright statement
 mediaFileAdd.directory=Folder
@@ -754,21 +765,8 @@
 #--- Media File Success
 
 mediaFileAddSuccess.title=Media File Upload Complete
-mediaFileSuccess.subtitle=Create a new weblog entry?
-mediaFileSuccess.pageTip=Your upload was successful. If you would like to \
-create a new weblog entry including your newly uploaded files then use the \
-form below to select the file(s) to be included. For images, we will include \
-them in your post as thumbnails. For other file types you can choose one to \
-be attached to the new post as an enclosure (i.e. a podcast).
-mediaFileSuccess.createPost=Create a weblog post using your new upload
-mediaFileSuccess.addAnother=Upload another media file
-mediaFileSuccess.createPostPrompt=Once you have selected the file(s) you want, \
-click the button to create your new weblog entry.
-mediaFileSuccess.noEnclosure=No enclosure
-mediaFileSuccess.selectEnclosure=You can select one file (or none) to be \
-included in the weblog entry as an RSS/Atom enclosure (i.e. as a podcast):
-mediaFileSuccess.selectImages=Select the the images that you would like to \
-include in your new weblog entry:
+mediaFileSuccess.subtitle=Your upload was successful
+mediaFileSuccess.pageTip=If you wish, you can now create a new weblog post including images or files you just uploaded.
 
 mediaFileSuccess.name=Name:
 mediaFileSuccess.size=Size:
@@ -777,13 +775,19 @@
 mediaFileSuccess.pixels=pixels
 mediaFileSuccess.bytes=bytes
 
-mediaFileSuccess.noThanks=<b>Not interested?</b> Here are some other options:
-mediaFileSuccess.mediaFileView=Return to Media File View
+mediaFileSuccess.selectImagesTitle=Select images
+mediaFileSuccess.selectImages=Select the the images that you would like to include in your new weblog entry as thumbnails.
 
+mediaFileSuccess.selectEnclosureTitle=Select file enclosure
+mediaFileSuccess.selectEnclosure=You can select one file to be included in the new weblog entry as an RSS/Atom enclosure.
+mediaFileSuccess.noEnclosure=No enclosure
+
+mediaFileSuccess.createPost=Create new weblog post
+mediaFileSuccess.uploadMore=Upload more...
 
 # -- Media File Edit
 
-mediaFileEdit.subtitle=Editing media file <span>{0}</span>
+mediaFileEdit.subtitle=Editing media file 
 mediaFileEdit.pagetip=You may edit the information stored about this media \
 file. Each file must have a name, but all other fields are optional.
 mediaFileEdit.tags=Tags (space separated)
@@ -792,7 +796,7 @@
 mediaFileEdit.fileInfo=File info
 mediaFileEdit.fileTypeSize=<b>Type</b>: {0} <b>Size</b>: {1} bytes
 mediaFileEdit.fileDimensions=<b>Image</b>: {0} X {1} pixels
-mediaFileEdit.includeGallery=Include in Gallery?
+mediaFileEdit.includeGallery=Include in Gallery
 mediaFileEdit.includeGalleryHelp=Check this box if you would like this media \
 file included in the new media file RSS and Atom feeds for your weblog.
 mediaFileEdit.updateFileContents=Update File Contents
@@ -814,7 +818,7 @@
 URLs" when you move or rename files.
 mediaFileView.dirPageTip=This is a media file subfolder.
 
-mediaFileView.viewFolder=View Folder
+mediaFileView.viewFolder=Folder
 
 mediaFileView.sortBy=Sort by
 
@@ -968,7 +972,7 @@
 # -------------------------------------------------------------- Page management
 
 pagesForm.title=Templates
-pagesForm.subtitle=Manage templates that define weblog <span>{0}</span>
+pagesForm.subtitle=Manage templates that define weblog <b>{0}</b>
 pagesForm.tip=You can edit the templates that define the layout, colors and \
 fonts of your weblog. You can also create new templates to define entirely \
 new pages. This is for advanced users only, if you''re not comfortable \
@@ -1005,11 +1009,13 @@
 users only, if you''re not comfortable with HTML, you might want to leave \
 your templates alone. NOTE: this is a required weblog template, you cannot \
 change the name, link or description.
-pageForm.link=Link
+pageForm.link=Link (path)
+pageForm.resultingUrlWillBe=Resulting URL will be: 
+pageForm.noUrl=No link! Will be unable to access this new page via the web
 pageForm.hidden=Hidden
-pageForm.hidden.tip=Hidden pages cannot be accessed via a weblog URL
-pageForm.navbar=Include in page menu
-pageForm.navbar.tip=Include in menu produced by showPageMenu() macro
+pageForm.hidden.tip=Hidden pages cannot be accessed via URL
+pageForm.navbar=Include in page menu 
+pageForm.navbar.tip=Include in menu produced by <pre>showPageMenu()</pre> macro 
 pageForm.template=Template
 pageForm.newTemplateContent=<html><body></body></html>
 pageForm.save.success=Template updated successfully.
@@ -1021,14 +1027,7 @@
 pageForm.templateLanguage=Template Language
 pageForm.outputContentType=Content-Type
 
-pageRemove.subtitle=Confirm removal of page
-pageRemoves.subtitle=Confirm removal of pages
-pageRemove.youSure=Are you sure you want to remove this page?
-pageRemoves.youSure=Are you sure you want to remove these pages?
-pageRemoves.youSureWarning=<b>WARNING</b>: This may remove custom html/css design and is <b>NOT REVERSIBLE</b>. \
-You might want to <b>backup your stylesheet</b> if you are not sure.
-pageRemove.pageId=Page ID
-pageRemove.pageName=Page Name
+pageRemove.confirm=Are you sure you want to remove this template: 
 
 # errors from validation
 Template.error.nameNull=Name is a required field
@@ -1105,18 +1104,16 @@
 pingTarget.unknownHost=The hostname in this URL doesn''t seem to exist.
 pingTarget.notFound=Ping target id {0} was not found
 
-# --------------------------------------------------------------- Planet Roller
+# --------------------------------------------------------------- Planet Roller: config
 
 planetConfig.title=Planet Configuration
-planetConfig.subtitle=Configure Roller''s built-in newsfeed aggregator.
-planetConfig.prompt=Set the title, description, email address and site URL \
-to be included in newsfeeds produced by the aggregator. You can also setup a \
-proxy if one is required required by your network.
+planetConfig.subtitle=Configure Roller\'s built-in RSS/Atom feed aggregator.
+planetConfig.prompt=Roller's Planet feature gives you a way to aggregate all of the weblogs on your site along with feeds from other sites. On this page you can set title, description and email addresses that are to be displayed in the RSS or Atom feeds for your aggregation, and to be used in weblog templates that display your site. You can also configure a proxy if you Roller site requires one.
 
 ConfigForm.siteSettings=Planet Settings
-ConfigForm.title=Planet title\t
-ConfigForm.description=Planet description\t\t
-ConfigForm.adminName=Name of Planet administrator \t\t
+ConfigForm.title=Planet title
+ConfigForm.description=Planet description
+ConfigForm.adminName=Name of Planet administrator
 ConfigForm.adminEmail=Email of Planet administrator
 ConfigForm.absoluteUrl=Absolute URL to Planet page
 ConfigForm.proxyHost=Proxy host for feed fetcher
@@ -1125,57 +1122,72 @@
 ConfigForm.message.saveSucceeded=Saved Planet configuration
 ConfigForm.error.saveFailed=Error saving Planet configuration
 
+ConfigForm.invalidBooleanProperty=Property {0} must be a boolean: {1}
+ConfigForm.invalidIntegerProperty=Property {0} must be an integer: {1}
+ConfigForm.invalidFloatProperty=Property {0} must be a float: {1}
+ConfigForm.invalidProperty=Property {0} is null
 
-# ----------------------------------------------------- PlanetSubscriptions.jsp
+# ----------------------------------------------------- Planet Roller: group subscriptions
 
-planetSubscriptions.title=Subscriptions
+planetGroupSubs.default.title=Default Planet Group Subscriptions
+planetGroupSubs.default.subtitle=Manage feed subscriptions for Roller's Default Planet Group
+planetGroupSubs.default.desc=By default, Roller's Planet feature includes all weblogs on this Roller site in the aggregation. On this page you can add RSS and Atom feeds from other sites to this aggregation.
 
-planetSubscriptions.subtitle.add=\
-Manage newsfeed subscriptions in group [<b>{0}</b>].
-planetSubscriptions.prompt.add=To add a new subscription simply enter a \
-newsfeed URL then click the Save button.
+planetGroupSubs.custom.title=Custom Planet Group {0}
+planetGroupSubs.custom.title.new=New Custom Planet Group
+planetGroupSubs.custom.subtitle=Manage feed subscriptions for Custom Planet Group {0}
+planetGroupSubs.custom.desc=This is a Custom Planet Group. Once you have added one or more RSS/Atom feeds here Roller will create an aggregated feed that containing entries from all of the feeds you add. You can display that aggregated feed in a blog template or access it via URL.
 
-planetSubscriptions.subtitle.addMain=\
-Managing the main list of newsfeed subscriptions.
-planetSubscriptions.prompt.addMain=Use this page to add \
-subscriptions to the list of newsfeeds that are to be included on the main \
-Planet aggregator page. To add a new subscription simply enter a \
-newsfeed URL then click the Save button.
+planetGroupSubs.custom.subtitle.new=Creating a new Custom Planet Group
 
-planetSubscriptions.existingTitle=Existing Subscriptions
-planetSubscriptions.column.title=Title
-planetSubscriptions.column.feedUrl=Feed URL
-planetSubscription.feedUrl=Newsfeed URL
+planetGroupSubs.addFeed=Add a new RSS/Atom feed subscription
+planetGroupSubs.creatingNewGroup=Before you can add subscriptions you must set a name and handle for your new Custom Planet Feed.
+planetGroupSubs.editingExistingGroup=You can edit the name and handle for the group, but be aware that changing the handle will change the URL of the Planet Group.
+
+planetGroupSubs.noneDefinedCustom=No feed subscriptions exist for this Custom Planet Group
+planetGroupSubs.noneDefinedDefault=No additional feeds have been added to the Default Planet Group
+
+planetGroupSubs.properties=Properties
+planetGroupSubs.subscriptions=Subscriptions
+planetGroupSubs.column.title=Title
+planetGroupSubs.column.feedUrl=Feed URL
+planetSubscription.feedUrl=Feed URL
 planetSubscription.success.deleted=Subscription successfully deleted
 planetSubscription.foundExisting=Found existing subscription [{0}], adding it instead
 planetSubscription.success.saved=Saved subscription
-planetSubscription.error=Must specify newfeed URL
-planetSubscription.error.feedUrl=Newsfeed URL is required
-planetSubscriptions.error.duringSave=Duplicate subscription? - {0}
+planetSubscription.error=Must specify feed URL
+planetSubscription.error.feedUrl=Feed URL is required
+planetGroupSubs.error.duringSave=Unexpected error saving subscription: {0}
+planetGroupSubs.error.fetchingFeed=Error fetching subscription: {0}
 planetSubscription.error.deleting=Error deleting object
 
-# ------------------------------------------------------------ PlanetGroups.jsp
+planetGroupSubs.badFeedURL=Invalid URL
+
+planetGroupSubs.delete.confirm=Are you sure you want to delete this subscription?
+
+# ------------------------------------------------------------ Planet Roller: groups
 
 planetGroups.pagetitle=Custom Planet Groups
-planetGroups.subtitle=Add custom aggregation groups, each available as a newsfeed.
+planetGroups.subtitle=Manage Custom Planet Groups, each available for use in weblog templates or as a feed.
 
-planetGroups.prompt.add=To create a group, \
-just enter a display name and a unique handle to be used in the newsfeed URL \
-then click Save.
-planetGroups.prompt.edit=You are editing a custom aggregation group. Make \
-your changes and then click Save. Or, use click Delete to remove it.
+planetGroups.prompt.add=To create a group, just enter a display name and a unique handle to be used in the feed URL then click Save.
+planetGroups.prompt.edit=You are editing a custom aggregation group. Make your changes and then click Save. Or, use click Delete to remove it.
 
 planetGroups.existingTitle=Existing Custom Aggregation Groups
 planetGroups.existingPrompt=Select an existing custom aggregation group to edit.
 
+planetGroups.noneDefined=No Custom Planet Groups defined.
+
 planetGroups.column.title=Title
 planetGroups.column.subscriptions=Subscriptions
 planetGroups.column.handle=Handle
 
-planetGroups.tip.title=Title of group
-planetGroups.tip.handle=Handle of this group
+planetGroups.tip.title=Title of the group for display purposes.
+planetGroups.tip.handle=Handle of this group. A simple string with no spaces to be used in the group's URL.
 planetGroups.edit.tip=Edit this group
 
+planetGroupSubs.subscriptionDesc=Add subscriptions to this group via the form on the right.
+
 planetGroups.title=Title
 planetGroups.handle=Handle
 
@@ -1188,6 +1200,8 @@
 planetGroups.error.handle=Handle is required
 planetGroups.error.nameReserved=Can''t use handle ''all''
 
+planetGroups.delete.confirm=Are you sure you want to remove this group?
+
 # ------------------------------------------------------------------ Statistics
 
 statCount.weblogCommentCountType=Weblog comment count
@@ -1197,30 +1211,53 @@
 # ------------------------------------------------------------------ Stylesheet Editor
 
 stylesheetEdit.title=Stylesheet
-stylesheetEdit.subtitle=Edit weblog custom stylesheet
-stylesheetEdit.tip=This form allows you to edit the stylesheet for your theme.
-stylesheetEdit.revertTip=If you run into any problems you don''t know how to \
-fix you can start over at any time by clicking the restore button.  Please <b>backup</b> your stylesheet!
-stylesheetEdit.revertTip1=<font color="red">If you have not customized your stylesheet here, \
-please use the <em>Shared Theme</em> default by clicking the delete stylesheet button. \
-This will ensure you are using the latest version and any changes will be picked up.</font> 
 
-stylesheetEdit.revert=Restore Stylesheet
-stylesheetEdit.delete=Delete Stylesheet
+stylesheetEdit.subtitle=Edit weblog custom stylesheet
+
+stylesheetEdit.copyStylesheet=Copy Stylesheet
+stylesheetEdit.copyStylesheetTip=Copy Shared Theme's stylesheet into your weblog so you can edit it.
+
+stylesheetEdit.standard=Standard
+
+stylesheetEdit.mobile=Mobile
+
+stylesheetEdit.tip=This form allows you to edit the customizable CSS Stylesheet for your theme.
+
+stylesheetEdit.youCanCustomize=\
+  <p><b>You can customize!</b> \
+  The theme you are using provides a customizable stylesheet. If you make changes to it \
+  here you will see those changes reflected in the theme pages that include the stylesheet.</p> \
+  <p>You can also choose to <b>Revert</b> your copy of the stylesheet so that it matches the default one from \
+  the theme. Or you can <b>Delete</b> your copy so that this weblog will use the Shared Theme's stylesheet instead.</p>
+
+stylesheetEdit.sharedThemeWithStylesheet=\
+ <p>The <b>Shared Theme</b> you are using provides a customizable stylesheet.</p> \
+ <p>Would you like to copy that stylesheet into your weblog so you can edit it?</p>
+
+stylesheetEdit.sharedThemeNoStylesheetSupport=\
+  <p>The <b>Shared Theme</b> you are using does not provide a customizable stylesheet.</p> \
+  <p>Choose another theme if you want to be able to customize your CSS.</p>
+
+stylesheetEdit.customThemeNoStylesheet=\
+  The <b>Custom Theme</b> you are using does not provide a customizable stylesheet, but since \
+  you are using a Custom Theme, you can add any stylesheets and new templates that you wish.
+
+stylesheetEdit.revert=Revert
+stylesheetEdit.revertTip=Reverts this weblog's copy to match the Shared Theme's default stylesheet.
+
+stylesheetEdit.delete=Delete
+stylesheetEdit.deleteTip=Delete's this weblog's copy setup weblog to use the Shared Theme's default stylesheet.
 
 stylesheetEdit.create.success=Custom stylesheet created successfully.
+
 stylesheetEdit.save.success=Stylesheet updated successfully.
+
 stylesheetEdit.revert.success=Stylesheet reverted successfully.
-stylesheetEdit.default.success=Stylesheet deleted successfully.  Your theme is now using the Shared Theme default.
 
-stylesheetEdit.noOverridableStylesheetAvailable=\
-The theme you''re using does not define a customizable stylesheet in its descriptor.  You can choose another shared theme, or for \
-  custom themes, create the stylesheet on the templates tab instead.
+stylesheetEdit.default.success=Stylesheet deleted successfully. Your theme is now using the Shared Theme default.
 
-stylesheetEdit.canRecreateStylesheetOverride=Note: clicking the stylesheet tab again will \
-recreate a custom override stylesheet from the theme default.
+stylesheetEdit.confirmDelete=Are you sure you want to delete your stylesheet and use the themes default instead?
 
-stylesheetEdit.confirmDelete=Are you sure you want to delete your stylesheet?
 stylesheetEdit.confirmRevert=Are you sure you want to revert your stylesheet to the theme default?
 
 # ------------------------------------------------------------------ Tabbed Menu
@@ -1253,7 +1290,7 @@
 
 tabbedmenu.planet=Planet Admin
 tabbedmenu.admin.planetConfig=Configuration
-tabbedmenu.admin.planetSubscriptions=Subscriptions
+tabbedmenu.admin.planetGroupSubs=Subscriptions
 tabbedmenu.admin.planetGroups=Custom Groups
 
 # ---------------------------------------------------------------------- Search
@@ -1266,7 +1303,7 @@
 # ----------------------------------------------------------------------- Theme
 
 themeEditor.title=Weblog Theme
-themeEditor.subtitle=Select theme for weblog <span>{0}</span>
+themeEditor.subtitle=Define the theme for weblog <span>{0}</span>.
 
 themeEditor.sharedTheme=Shared Theme
 themeEditor.sharedThemeDescription=This option is for users who don''t \
@@ -1281,21 +1318,37 @@
 themeEditor.yourCurrentTheme=Your current theme is
 themeEditor.yourCustomStylesheet=using <em style="color:red">custom</em> override stylesheet.
 themeEditor.yourThemeStyleSheet=using the <em>Shared Theme</em> default stylesheet.
-themeEditor.selectTheme=Select a new shared theme for your blog
+
+themeEditor.youAreUsingACustomTheme=This weblog is using a custom theme.
+
+themeEditor.thisTheme=This theme:
+
+themeEditor.proposedChangeToShared=You are proposing to switch from a Custom Theme to a new Shared Theme.
+
+themeEditor.proposedSharedThemeChange=You are proposing to switch to a new Shared Theme.
+
+themeEditor.proposedSharedChangeToCustom=You are proposing to switch from a Shared Theme to a Custom Theme.
+
+themeEditor.selectTheme=Select a new shared theme for your blog:
 
 themeEditor.preview=Preview Theme
 themeEditor.save=Update Theme
 
-themeEditor.previewDescription=Prior to changing your theme, the preview option below \
-can be used to see how your blog''s main front page would look with the new theme.
+themeEditor.previewDescription=Before you update your theme you can use <b>Preview Theme</b> \
+  to launch a new browser window and see what your blog will look like with the new theme.
 
-themeEditor.importWarning=WARNING: Updating your custom theme may overwrite some of your existing templates.
-themeEditor.importRequired=Since this is the first time you are going to try a \
-custom theme you must first copy templates from an existing theme.
-themeEditor.importAndOverwriteTemplates=Also import a theme into my already existing custom templates, overwriting any with the same name.
-themeEditor.importAndOverwriteTemplates.tooltip=This blog already has custom templates defined on the Templates tab. \
-  Select this option to import a shared theme's templates, overwriting any of your existing templates that have the same name as the shared theme's \
-  templates.  Leave this unchecked to just switch to custom with your present templates.
+themeEditor.importWarning=WARNING: Updating your custom theme <b>will overwrite</b> \
+  some of your existing templates.
+
+themeEditor.importRequired=Since this is the first time using a  custom theme, \
+  Roller will copy the templates from your existing Shared Theme so you can edit them.
+
+themeEditor.importAndOverwriteTemplates=Import the Shared Theme selected above and overwrite \
+  existing custom theme.
+
+themeEditor.existingTemplatesWarning=<b>This blog already has a custom theme defined so you need to \
+  make a choice</b>. Do you want to switch back to using that theme, or do you want to over write that \
+  theme with the Shared Theme currently in use?
 themeEditor.setTheme.success=Theme set to {0}
 themeEditor.setCustomTheme.success=Shared theme {0} imported into custom templates
 themeEditor.setCustomTheme.instructions=Use the Stylesheet and Templates tabs above to edit your custom theme.
@@ -1326,6 +1379,8 @@
 # ----------------------------------------------------------------- Your profile (profile.jsp)
 
 yourProfile.title=Your Profile
+yourProfile.passwordsNotSame=Password and Password (confirm) do not match
+yourProfile.requiredFields=Screen name, full name and email are required
 
 # ------------------------------------------------------------------- User admin
 
@@ -1418,7 +1473,8 @@
 specify your OpenID identifier below. For more information about OpenID see \
 <a href=\"http://openid.net\">http://openid.net</a>.
 
-userRegister.tip.password=Your password.  Fill in only if you wish to change it.
+userRegister.tip.password=Your password.  
+userSettings.tip.password=Your password. Fill-in only if you wish to change it.  
 userRegister.tip.passwordConfirm=Confirm your password.
 userRegister.tip.openIdUrl=Your OpenID identifier (in the form of a URL).
 
@@ -1495,7 +1551,7 @@
 weblogEdit.post=Post to Weblog
 weblogEdit.permaLink=Permalink
 weblogEdit.published=Published
-weblogEdit.pubTime=Pub&nbsp;Time&nbsp;
+weblogEdit.pubTime=Publishing Time
 weblogEdit.save=Save as Draft
 weblogEdit.scheduled=Scheduled
 weblogEdit.scheduledEntries=Scheduled Entries
@@ -1511,8 +1567,9 @@
 weblogEdit.updateTime=Last updated 
 
 weblogEdit.allowComments=Allow comments
-weblogEdit.commentDays=for
-weblogEdit.unlimitedCommentDays=unlimited days
+weblogEdit.commentDays=How long to allow comments
+weblogEdit.commentsNotAllowed=Comments not allowed
+weblogEdit.unlimitedCommentDays=Unlimited days
 weblogEdit.days3=3 days
 weblogEdit.days7=7 days
 weblogEdit.days14=14 days
@@ -1722,7 +1779,7 @@
 
 websiteRemove.title=Confirm Weblog Remove
 websiteRemove.subtitle=Weblog removal is <b>NOT REVERSIBLE</b>
-websiteRemove.youSure=Are you sure you want to remove weblog [{0}]?
+websiteRemove.youSure=Are you sure you want to remove the weblog <b style="color:red">{0}</b>?
 websiteRemove.websiteId=Weblog ID
 websiteRemove.websiteName=Weblog Name
 websiteRemove.success=Successfully removed weblog [{0}]
@@ -1751,19 +1808,20 @@
 
 # ---------------------------------------------------------------- Your Weblogs
 
-yourWebsites.title=Main Menu
- yourWebsites.actions=Actions
+yourWebsites.title=Your Weblogs
+yourWebsites.actions=Actions
 
-yourWebsites.prompt.noBlog=You''ve got a user account, but no weblog. \
+yourWebsites.prompt.noBlog=You have a user account, but no weblog. \
 Would you like to
 yourWebsites.createOne=create one?
 
-yourWebsites.prompt.hasBlog=Select a weblog to edit, manage, or configure.
+yourWebsites.prompt.hasBlog=Access your weblogs here or create a new one.
 
 yourWebsites.accept=accept
 yourWebsites.decline=decline
 
 yourWebsites.resign=Resign
+yourWebsites.youHave=You have
 yourWebsites.permission=Permission
 yourWebsites.confirmResignation=Are you sure you wish to resign from weblog [{0}]?
 yourWebsites.weblog=Link
@@ -1778,8 +1836,8 @@
 yourWebsites.createWeblog.desc=\
 Feel like you''ve got more to say? Maybe another weblog is what you need. 
 
-yourWebsites.editProfile=Edit user profile
-yourWebsites.editProfile.desc=Change user info, locale, timezone.
+yourWebsites.editProfile=Your Profile
+yourWebsites.editProfile.desc=Change user info, password, timezone
 
 yourWebsites.oauthKeys=OAuth Credentials
 yourWebsites.oauthKeys.desc=Enable other sites and programs to access your \
diff --git a/app/src/main/resources/ApplicationResources_de.properties b/app/src/main/resources/ApplicationResources_de.properties
index e5c9cfa..a4f150e 100644
--- a/app/src/main/resources/ApplicationResources_de.properties
+++ b/app/src/main/resources/ApplicationResources_de.properties
@@ -607,15 +607,15 @@
 planetSubscription.foundExisting=Abonnement [{0}] exisitiert bereits, es wurde aber trotzdem hinzugef\u00FCgt
 planetSubscription.success.deleted=Abonnement erfolgreich gel\u00F6scht
 planetSubscription.success.saved=Abonnement gespeichert
-planetSubscriptions.column.feedUrl=Feed-URL
-planetSubscriptions.column.title=Titel
-planetSubscriptions.error.duringSave=Doppeltes Abonnement? - {0}
-planetSubscriptions.existingTitle=Existierende Abonnements
-planetSubscriptions.prompt.add=Um ein neues Abonnement hinzuzuf\u00FCgen geben Sie bitte die URL des Newsfeed ein und klicken dann auf Speichern.
-planetSubscriptions.prompt.addMain=Nutzen Sie diese Seite zum Hinzuf\u00FCgen von Abonnements zu der Liste der Newsfeeds, welche in der Haupt-Planet-Aggregator-Seite enthalten sein sollen. Um ein neues Abonnement hinzuzuf\u00FCgen geben Sie einfach die Adresse des Newsfeed ein und klicken Sie auf Speichern.
-planetSubscriptions.subtitle.add=Verwaltung der Newsfeed Abonnements in der Gruppe [<b>{0}</b>].
-planetSubscriptions.subtitle.addMain=Verwalten der Hauptliste der Newsfeed Abonnements.
-planetSubscriptions.title=Abonnements
+planetGroupSubs.column.feedUrl=Feed-URL
+planetGroupSubs.column.title=Titel
+planetGroupSubs.error.duringSave=Doppeltes Abonnement? - {0}
+planetGroupSubs.existingTitle=Existierende Abonnements
+planetGroupSubs.prompt.add=Um ein neues Abonnement hinzuzuf\u00FCgen geben Sie bitte die URL des Newsfeed ein und klicken dann auf Speichern.
+planetGroupSubs.prompt.addMain=Nutzen Sie diese Seite zum Hinzuf\u00FCgen von Abonnements zu der Liste der Newsfeeds, welche in der Haupt-Planet-Aggregator-Seite enthalten sein sollen. Um ein neues Abonnement hinzuzuf\u00FCgen geben Sie einfach die Adresse des Newsfeed ein und klicken Sie auf Speichern.
+planetGroupSubs.subtitle.add=Verwaltung der Newsfeed Abonnements in der Gruppe [<b>{0}</b>].
+planetGroupSubs.subtitle.addMain=Verwalten der Hauptliste der Newsfeed Abonnements.
+planetGroupSubs.title=Abonnements
 searchPager.home=Startseite
 searchPager.next=N\u00E4chste Seite
 searchPager.prev=Vorige Seite
@@ -637,7 +637,7 @@
 tabbedmenu.admin.pingTargets=Ping Ziele
 tabbedmenu.admin.planetConfig=Konfiguration
 tabbedmenu.admin.planetGroups=Benutzerdefinierte Gruppen
-tabbedmenu.admin.planetSubscriptions=Abonnements
+tabbedmenu.admin.planetGroupSubs=Abonnements
 tabbedmenu.admin.userAdmin=Benutzerverwaltung
 tabbedmenu.bookmarks.allFolders=Blogroll
 tabbedmenu.design=Design
@@ -672,7 +672,7 @@
 uploadFiles.error.badPath=Der Pfad [{0}] ist ung\u00FCltig. Pfade d\u00FCrfen keine "/", "", oder ".." enthalten.
 uploadFiles.error.upload=Hochladen von [{0}] fehlgeschlagen
 uploadFiles.upload=Hochladen
-# ----------------------------------------------------- PlanetSubscriptions.jsp
+# ----------------------------------------------------- PlanetGroupSubs.jsp
 uploadFiles.uploadedFile={0}
 uploadFiles.uploadedFiles=Hochgeladene Datei(en):
 user.account.activation.mail.content=<html><body style="background: white; color: black; font-size: 12px"> <p>Zum Aktivieren Ihres neuen Roller-Benutzerkontos mit dem Benutzernamen [{1}] klicken Sie bitte auf den folgenden Link:</p> <p><a href="{2}">{2}</a></p></body></html>
diff --git a/app/src/main/resources/ApplicationResources_es.properties b/app/src/main/resources/ApplicationResources_es.properties
index bdf6ec7..7799536 100644
--- a/app/src/main/resources/ApplicationResources_es.properties
+++ b/app/src/main/resources/ApplicationResources_es.properties
@@ -338,20 +338,20 @@
 planetConfig.subtitle=Configurar agregador de noticias de Roller
 planetConfig.prompt=Establecer el t\u00EDtulo, direcci\u00F3n de email y URL del sitio que se incluir\u00E1n en la suscripci\u00F3n de noticias poducida por el agregador. Puede tambi\u00E9n configurar un proxy si es necesario para su red.
 planetConfig.title=Configuraci\u00F3n de Planet
-planetSubscriptions.title=Suscripciones
-planetSubscriptions.subtitle.add=Administrar suscripciones de noticias en el grupo [<b>{0}</b>].
-planetSubscriptions.prompt.add=Para a\u00F1adir una nueva suscripci\u00F3n simplemente introduzca el t\u00EDtulo, la URL de la suscripci\u00F3n de noticias y la URL del sitio, finalmente haga click en el bot\u00F3n Guardar.
-planetSubscriptions.subtitle.addMain=Administrando la lista principal de suscripciones de noticias.
-planetSubscriptions.prompt.addMain=Use esta p\u00E1gina para a\u00F1adir y editar suscripciones\: la lista de suscripciones de noticias que se incluye en la p\u00E1gina principal del agregador Planet. Para a\u00F1adir una nueva suscripci\u00F3n simplemente introduzca el t\u00EDtulo, el t\u00EDtulo, la URL de la suscripci\u00F3n de noticias y la URL del sitio, finalmente haga click en el bot\u00F3n Guardar.
-planetSubscriptions.existingTitle=Suscripciones existentes
-planetSubscriptions.column.title=T\u00EDtulo
-planetSubscriptions.column.feedUrl=URL de la suscripci\u00F3n
+planetGroupSubs.title=Suscripciones
+planetGroupSubs.subtitle.add=Administrar suscripciones de noticias en el grupo [<b>{0}</b>].
+planetGroupSubs.prompt.add=Para a\u00F1adir una nueva suscripci\u00F3n simplemente introduzca el t\u00EDtulo, la URL de la suscripci\u00F3n de noticias y la URL del sitio, finalmente haga click en el bot\u00F3n Guardar.
+planetGroupSubs.subtitle.addMain=Administrando la lista principal de suscripciones de noticias.
+planetGroupSubs.prompt.addMain=Use esta p\u00E1gina para a\u00F1adir y editar suscripciones\: la lista de suscripciones de noticias que se incluye en la p\u00E1gina principal del agregador Planet. Para a\u00F1adir una nueva suscripci\u00F3n simplemente introduzca el t\u00EDtulo, el t\u00EDtulo, la URL de la suscripci\u00F3n de noticias y la URL del sitio, finalmente haga click en el bot\u00F3n Guardar.
+planetGroupSubs.existingTitle=Suscripciones existentes
+planetGroupSubs.column.title=T\u00EDtulo
+planetGroupSubs.column.feedUrl=URL de la suscripci\u00F3n
 planetSubscription.feedUrl=URL de la suscripci\u00F3n de noticias
 planetSubscription.success.deleted=Suscripci\u00F3n eliminada con \u00E9xito
 planetSubscription.success.saved=Suscripci\u00F3n guardada
 planetSubscription.error=Debe especificar la URL de la suscripci\u00F3n de noticias
 planetSubscription.error.feedUrl=La URL de la suscripci\u00F3n de noticias es obligatoria
-planetSubscriptions.error.duringSave=\u00BFSuscripci\u00F3n repetida? - {0}
+planetGroupSubs.error.duringSave=\u00BFSuscripci\u00F3n repetida? - {0}
 planetSubscription.error.deleting=Error eliminando objeto
 planetGroups.pagetitle=Grupos Planet personalizados
 planetGroups.subtitle=A\u00F1adir agregador personalizado de grupos, disponible en forma de suscripci\u00F3n de noticias.
@@ -394,7 +394,7 @@
 tabbedmenu.admin.cacheInfo=Informaci\u00F3n de cach\u00E9
 tabbedmenu.planet=Administraci\u00F3n de Planet
 tabbedmenu.admin.planetConfig=Configuraci\u00F3n
-tabbedmenu.admin.planetSubscriptions=Suscripciones
+tabbedmenu.admin.planetGroupSubs=Suscripciones
 tabbedmenu.admin.planetGroups=Grupos personalizados
 themeEditor.title=Tema del weblog
 themeEditor.subtitle=Seleccionar tema para el weblog <span>{0}</span>
diff --git a/app/src/main/resources/ApplicationResources_fr.properties b/app/src/main/resources/ApplicationResources_fr.properties
index 32cf84a..5332039 100644
--- a/app/src/main/resources/ApplicationResources_fr.properties
+++ b/app/src/main/resources/ApplicationResources_fr.properties
@@ -709,26 +709,26 @@
 ConfigForm.proxyPort=Port du serveur Proxy
 #pour la récuperation des fils d'information
 
-# ----------------------------------------------------- PlanetSubscriptions.jsp
+# ----------------------------------------------------- PlanetGroupSubs.jsp
 
-planetSubscriptions.title=Souscriptions
+planetGroupSubs.title=Souscriptions
 
-planetSubscriptions.subtitle.add=\
+planetGroupSubs.subtitle.add=\
 Gestion des souscriptions aux fils d'information dans le groupe [<b>{0}</b>].
-planetSubscriptions.prompt.add=Pour ajouter une nouvelle souscription, entrez son titre, \
+planetGroupSubs.prompt.add=Pour ajouter une nouvelle souscription, entrez son titre, \
 l'adresse URL du fil d'information et celle du site, puis cliquez sur 'Enregistrer'.
 
-planetSubscriptions.subtitle.addMain=\
+planetGroupSubs.subtitle.addMain=\
 Gérer la liste principale de souscriptions aux fils d'information.
-planetSubscriptions.prompt.addMain=Utilisez cette page pour ajouter ou éditer les souscriptions qui \
+planetGroupSubs.prompt.addMain=Utilisez cette page pour ajouter ou éditer les souscriptions qui \
 s'ajouterons à la page d'aggrégation de Planet. \
 Pour ajouter une nouvelle souscription, entrez son titre, \
 l'adresse URL du fil d'information et celle du site, puis cliquez sur 'Enregistrer'.
 
-planetSubscriptions.existingTitle=Souscriptions existantes
+planetGroupSubs.existingTitle=Souscriptions existantes
 
-planetSubscriptions.column.title=Titre
-planetSubscriptions.column.feedUrl=URL du fil
+planetGroupSubs.column.title=Titre
+planetGroupSubs.column.feedUrl=URL du fil
 
 planetSubscription.feedUrl=URL du fil d'information
 
@@ -739,7 +739,7 @@
 
 planetSubscription.error=Vous devez specifier une adresse URL pour le fil d'information
 planetSubscription.error.feedUrl=URL du fil requise
-planetSubscriptions.error.duringSave=La souscription {0} semble déjà exister
+planetGroupSubs.error.duringSave=La souscription {0} semble déjà exister
 de la souscription.
 
 # ------------------------------------------------------------ PlanetGroups.jsp
@@ -807,7 +807,7 @@
 
 tabbedmenu.planet=Admin. Planet
 tabbedmenu.admin.planetConfig=Configuration
-tabbedmenu.admin.planetSubscriptions=Souscriptions
+tabbedmenu.admin.planetGroupSubs=Souscriptions
 tabbedmenu.admin.planetGroups=Groupes personnalisés
 
 # ---------------------------------------------------------------------- Search
diff --git a/app/src/main/resources/ApplicationResources_ja.properties b/app/src/main/resources/ApplicationResources_ja.properties
index 03b5a9d..5a210c2 100644
--- a/app/src/main/resources/ApplicationResources_ja.properties
+++ b/app/src/main/resources/ApplicationResources_ja.properties
@@ -548,7 +548,7 @@
 planetConfig.subtitle=Roller\u5185\u8535\u306E\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u30FB\u30A2\u30B0\u30EA\u30B2\u30FC\u30BF\u3092\u8A2D\u5B9A
 planetConfig.title=Planet \u8A2D\u5B9A
 
-# ----------------------------------------------------- PlanetSubscriptions.jsp
+# ----------------------------------------------------- PlanetGroupSubs.jsp
 
 planetSubscription.success.saved=\u8CFC\u8AAD\u304C\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F
 
@@ -1065,7 +1065,7 @@
 categoryForm.changesSaved=\u30AB\u30C6\u30B4\u30EA "{0}" \u304C\u66F4\u65B0\u3055\u308C\u307E\u3057\u305F
 mediaFileView.dirPageTip=\u3053\u308C\u306F\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u30B5\u30D6\u30D5\u30A9\u30EB\u30C0\u3067\u3059\u3002
 userRegister.heading.identification=\u3069\u306E\u3088\u3046\u306B\u8B58\u5225\u3055\u308C\u305F\u3044\u3067\u3059\u304B?
-planetSubscriptions.subtitle.add=\u30B0\u30EB\u30FC\u30D7 [<b>{0}</b>] \u306E\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u30FB\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u7BA1\u7406\u3057\u307E\u3059\u3002
+planetGroupSubs.subtitle.add=\u30B0\u30EB\u30FC\u30D7 [<b>{0}</b>] \u306E\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u30FB\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u7BA1\u7406\u3057\u307E\u3059\u3002
 pageForm.launch=\u8868\u793A
 error.unexpected=\u4E88\u671F\u305B\u306C\u30A8\u30E9\u30FC\u3067\u3059\u3002\u30A8\u30E9\u30FC\u304C\u518D\u767A\u3059\u308B\u5834\u5408\u3001\u7BA1\u7406\u8005\u306B\u9023\u7D61\u3057\u3066\u304F\u3060\u3055\u3044\u3002
 mediaFileView.date=\u65E5\u4ED8
@@ -1115,7 +1115,7 @@
 userRegister.tip.openIdUrl=Open ID\u8B58\u5225\u5B50(URL\u5F62\u5F0F)\u3002
 pingTarget.editTarget=Ping\u30BF\u30FC\u30B2\u30C3\u30C8\u3092\u7DE8\u96C6\u3059\u308B
 mediaFileAdd.directory=\u30D5\u30A9\u30EB\u30C0
-planetSubscriptions.title=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3
+planetGroupSubs.title=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3
 mediaFileView.size=\u30B5\u30A4\u30BA
 stylesheetEdit.tip=\u3053\u306E\u30D5\u30A9\u30FC\u30E0\u3092\u4F7F\u3063\u3066\u3001\u3042\u306A\u305F\u306E\u30C6\u30FC\u30DE\u306E\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u7DE8\u96C6\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002
 themeEditor.importAndOverwriteTemplates.tooltip=\u3053\u306E\u30D6\u30ED\u30B0\u306F\u3001\u3059\u3067\u306B\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u30FB\u30BF\u30D6\u3067\u5B9A\u7FA9\u3055\u308C\u305F\u30AB\u30B9\u30BF\u30E0\u30FB\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u6301\u3063\u3066\u3044\u307E\u3059\u3002\u5171\u6709\u30C6\u30FC\u30DE\u3068\u540C\u540D\u306E\u65E2\u5B58\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u4E0A\u66F8\u304D\u3057\u305F\u3044\u5834\u5408\u306F\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u65E2\u5B58\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u4F7F\u3063\u3066\u5358\u306B\u30AB\u30B9\u30BF\u30E0\u30FB\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u5207\u308A\u66FF\u3048\u305F\u3044\u5834\u5408\u306F\u9078\u629E\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
@@ -1157,7 +1157,7 @@
 maintenance.message.reset=\u30A2\u30AF\u30BB\u30B9\u30AB\u30A6\u30F3\u30BF\u304C\u6B63\u5E38\u306B\u30EA\u30BB\u30C3\u30C8\u3055\u308C\u307E\u3057\u305F
 email.comment.commenter.email=\u30B3\u30E1\u30F3\u30C8\u6295\u7A3F\u8005\u306E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9
 welcome.user.account.not.activated=\u30B7\u30B9\u30C6\u30E0\u306B\u30ED\u30B0\u30A4\u30F3\u3059\u308B\u306B\u306F\u3001\u30E1\u30FC\u30EB\u3067\u9001\u4FE1\u3055\u308C\u305F\u30EA\u30F3\u30AF\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u3042\u306A\u305F\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u6709\u52B9\u5316\u3057\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093\u3002
-planetSubscriptions.prompt.add=\u65B0\u3057\u3044\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u8FFD\u52A0\u3059\u308B\u306B\u306F\u3001\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL\u3092\u5165\u529B\u3057\u3066\u3001\u4FDD\u5B58\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002
+planetGroupSubs.prompt.add=\u65B0\u3057\u3044\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u8FFD\u52A0\u3059\u308B\u306B\u306F\u3001\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL\u3092\u5165\u529B\u3057\u3066\u3001\u4FDD\u5B58\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002
 MediaFile.error.view=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u8868\u793A\u3059\u308B\u969B\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002
 mediaFileAdd.multipleNames=(\u8907\u6570\u306E\u540D\u524D)
 macro.bookmark.urlFeed=\u30B5\u30A4\u30C8\u306ERSS\u30D5\u30A3\u30FC\u30C9\u306EURL
@@ -1188,10 +1188,10 @@
 weblogEdit.enclosureURL=\u30A8\u30F3\u30AF\u30ED\u30FC\u30B8\u30E3URL
 userRegister.success.ready=\u30D5\u30A9\u30FC\u30E0\u306F\u554F\u984C\u306A\u304F\u5165\u529B\u3055\u308C\u3066\u3044\u308B\u3088\u3046\u3067\u3059\u3002\u4EE5\u4E0B\u306E\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002
 pageForm.tip=\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u7DE8\u96C6\u3057\u3066\u3001\u751F\u6210\u3055\u308C\u308B\u30DA\u30FC\u30B8\u3092\u5909\u66F4\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3067\u4F7F\u7528\u3059\u308B\u3053\u3068\u306E\u3067\u304D\u308B\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u304A\u3088\u3073\u30B3\u30FC\u30C9\u306B\u3064\u3044\u3066\u306FRoller\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u30FB\u30AC\u30A4\u30C9\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u3053\u308C\u306F\u4E0A\u7D1A\u30E6\u30FC\u30B6\u30FC\u306E\u305F\u3081\u306E\u3082\u306E\u3067\u3042\u308A\u3001\u3082\u3057\u3042\u306A\u305F\u304CHTML\u306B\u8A73\u3057\u304F\u306A\u3044\u5834\u5408\u306F\u305D\u306E\u307E\u307E\u306B\u3057\u3066\u304A\u3044\u305F\u65B9\u304C\u826F\u3044\u3067\u3057\u3087\u3046\u3002
-planetSubscriptions.column.feedUrl=\u30D5\u30A3\u30FC\u30C9URL
+planetGroupSubs.column.feedUrl=\u30D5\u30A3\u30FC\u30C9URL
 mediaFileSuccess.createPost=\u65B0\u3057\u304F\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u3092\u4F7F\u3063\u3066\u65B0\u3057\u3044\u30A8\u30F3\u30C8\u30EA\u3092\u4F5C\u6210\u3059\u308B
 bookmarkForm.requiredFields={0}\u3068{1}\u306F\u5FC5\u9808\u3067\u3059\u3002
-planetSubscriptions.column.title=\u30BF\u30A4\u30C8\u30EB
+planetGroupSubs.column.title=\u30BF\u30A4\u30C8\u30EB
 bookmarksForm.deleteFolder.confirm=\u30D5\u30A9\u30EB\u30C0\u3068\u3001\u30D5\u30A9\u30EB\u30C0\u306B\u542B\u307E\u308C\u308B\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u524A\u9664\u3057\u3066\u3088\u308D\u3057\u3044\u3067\u3059\u304B?
 planetSubscription.error=\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044
 mediaFile.update.success=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306F\u6B63\u5E38\u306B\u66F4\u65B0\u3055\u308C\u307E\u3057\u305F\u3002
@@ -1241,7 +1241,7 @@
 createWebsite.disabled=\u7533\u3057\u8A33\u3042\u308A\u307E\u305B\u3093\u304C\u3001\u65B0\u3057\u3044\u30D6\u30ED\u30B0\u306E\u4F5C\u6210\u306F\u3001\u7BA1\u7406\u8005\u306B\u3088\u3063\u3066\u7121\u52B9\u306B\u3055\u308C\u3066\u3044\u307E\u3059\u3002
 macro.weblog.postcomment=\u30B3\u30E1\u30F3\u30C8\u3092\u6295\u7A3F
 Entry.error.categoryNull=\u30AB\u30C6\u30B4\u30EA\u306F\u5FC5\u9808\u9805\u76EE\u3067\u3059
-planetSubscriptions.prompt.addMain=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u3001\u30E1\u30A4\u30F3Planet\u30A2\u30B0\u30EA\u30B2\u30FC\u30BF\u30FC\u30FB\u30DA\u30FC\u30B8\u306B\u542B\u307E\u308C\u308B\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u4E00\u89A7\u306B\u8FFD\u52A0\u3059\u308B\u306B\u306F\u3053\u306E\u30DA\u30FC\u30B8\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u65B0\u3057\u3044\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u8FFD\u52A0\u3059\u308B\u306B\u306F\u3001\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL\u3092\u5165\u529B\u3057\u3066\u4FDD\u5B58\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002
+planetGroupSubs.prompt.addMain=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u3001\u30E1\u30A4\u30F3Planet\u30A2\u30B0\u30EA\u30B2\u30FC\u30BF\u30FC\u30FB\u30DA\u30FC\u30B8\u306B\u542B\u307E\u308C\u308B\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u4E00\u89A7\u306B\u8FFD\u52A0\u3059\u308B\u306B\u306F\u3053\u306E\u30DA\u30FC\u30B8\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u65B0\u3057\u3044\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3092\u8FFD\u52A0\u3059\u308B\u306B\u306F\u3001\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9URL\u3092\u5165\u529B\u3057\u3066\u4FDD\u5B58\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002
 mediaFileView.audio=\u97F3\u58F0
 weblogEdit.mediaCastResponseError=\u30A8\u30F3\u30AF\u30ED\u30FC\u30B8\u30E3\u30FB\u30B5\u30FC\u30D0\u306F\u30A8\u30E9\u30FC\u3092\u8FD4\u3057\u307E\u3057\u305F\u3002\u6B63\u3057\u3044URL\u3067\u3059\u304B?
 themeEditor.importRequired=\u4ECA\u56DE\u304C\u521D\u3081\u3066\u306E\u30AB\u30B9\u30BF\u30E0\u30FB\u30C6\u30FC\u30DE\u306E\u4F7F\u7528\u3067\u3042\u308B\u305F\u3081\u3001\u65E2\u5B58\u306E\u30C6\u30FC\u30DE\u304B\u3089\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u30B3\u30D4\u30FC\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002
@@ -1262,7 +1262,7 @@
 pageForm.templateLanguage=\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306E\u8A00\u8A9E
 mediaFile.deleteFolder.success=\u30D5\u30A9\u30EB\u30C0\u306F\u6B63\u5E38\u306B\u524A\u9664\u3055\u308C\u307E\u3057\u305F\u3002
 mediaFileEdit.includesEnclosure=\u3053\u306E\u30A8\u30F3\u30C8\u30EA\u306F\u4EE5\u4E0B\u306E\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u30FB\u30A8\u30F3\u30AF\u30ED\u30FC\u30B8\u30E3\u3092\u542B\u307F\u307E\u3059\:
-planetSubscriptions.error.duringSave=\u91CD\u8907\u3059\u308B\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3? - {0}
+planetGroupSubs.error.duringSave=\u91CD\u8907\u3059\u308B\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3? - {0}
 weblogEntry.pendingEntryContent=\u30E6\u30FC\u30B6\u30FC [{0}] \u306F\u3001\u3042\u306A\u305F\u306E\u30EC\u30D3\u30E5\u30FC\u3092\u53D7\u3051\u308B\u305F\u3081\u306B\u65B0\u3057\u3044\u30A8\u30F3\u30C8\u30EA\u30FC\u3092\u9001\u4FE1\u3057\u307E\u3057\u305F\u3002\u3053\u306E\u6295\u7A3F\u3092\u30EC\u30D3\u30E5\u30FC\u3057\u3001\u516C\u958B\u3059\u308B\u304B\u30E6\u30FC\u30B6\u30FC [{1}] \u304C\u518D\u5EA6\u7DE8\u96C6\u3067\u304D\u308B\u3088\u3046\u306B\u4E0B\u66F8\u304D\u3068\u3057\u3066\u4FDD\u5B58\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30EC\u30D3\u30E5\u30FC\u5F85\u3061\u306E\u6295\u7A3F\u3092\u7DE8\u96C6\u3059\u308B\u305F\u3081\u306E\u30EA\u30F3\u30AF\u306F\u3053\u3061\u3089\u3067\u3059\:<{2}>
 websiteSettings.analyticsTrackingCode=\u30C8\u30E9\u30C3\u30AD\u30F3\u30B0\u30FB\u30B3\u30FC\u30C9
 mediaFileView.mb=MB
@@ -1295,7 +1295,7 @@
 mediaFile.includeInGallery.error=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB {0} \u3092\u30AE\u30E3\u30E9\u30EA\u30FC\u306B\u8FFD\u52A0\u3059\u308B\u969B\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002
 WeblogConfig.error.analyticsCodeSize=\u30A2\u30CA\u30EA\u30C6\u30A3\u30AF\u30B9\u30FB\u30C8\u30E9\u30C3\u30AD\u30F3\u30B0\u30FB\u30B3\u30FC\u30C9\u306F1200\u6587\u5B57\u4EE5\u5185\u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093
 Entry.error.titleNull=\u30BF\u30A4\u30C8\u30EB\u306F\u5FC5\u9808\u9805\u76EE\u3067\u3059
-planetSubscriptions.subtitle.addMain=\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u30FB\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u306E\u30E1\u30A4\u30F3\u30FB\u30EA\u30B9\u30C8\u3092\u7BA1\u7406\u3057\u307E\u3059\u3002
+planetGroupSubs.subtitle.addMain=\u30CB\u30E5\u30FC\u30B9\u30D5\u30A3\u30FC\u30C9\u30FB\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u306E\u30E1\u30A4\u30F3\u30FB\u30EA\u30B9\u30C8\u3092\u7BA1\u7406\u3057\u307E\u3059\u3002
 mediaFile.move.errors=\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u79FB\u52D5\u3059\u308B\u969B\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002
 mediaFileSuccess.addAnother=\u4ED6\u306E\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3059\u308B
 pingTarget.pingUrlMissing=Ping URL\u306F\u5FC5\u9808\u9805\u76EE\u3067\u3059
@@ -1389,7 +1389,7 @@
 weblogEdit.enclosureLength=\u9577\u3055
 weblogEntryQuery.label.startDate=\u958B\u59CB\u65E5
 mediaFileEdit.pagetip=\u3053\u306E\u30E1\u30C7\u30A3\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u60C5\u5831\u3092\u7DE8\u96C6\u3057\u307E\u3059\u3002\u305D\u308C\u305E\u308C\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u306F\u540D\u524D\u304C\u5FC5\u8981\u3067\u3059\u304C\u3001\u4ED6\u306E\u9805\u76EE\u306F\u7701\u7565\u3067\u304D\u307E\u3059\u3002
-planetSubscriptions.existingTitle=\u65E2\u5B58\u306E\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3
+planetGroupSubs.existingTitle=\u65E2\u5B58\u306E\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3
 stylesheetEdit.default.success=\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u304C\u6B63\u5E38\u306B\u524A\u9664\u3055\u308C\u307E\u3057\u305F\u3002\u5171\u6709\u306E\u30C6\u30FC\u30DE\u30FB\u30C7\u30D5\u30A9\u30EB\u30C8\u304C\u6709\u52B9\u306B\u306A\u308A\u307E\u3057\u305F\u3002
 pageRemoves.youSure=\u3053\u306E\u30DA\u30FC\u30B8\u3092\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F
 mediaFileAdd.fileLocation=\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3059\u308B\u30D5\u30A1\u30A4\u30EB\u3092\u9078\u629E
@@ -1429,7 +1429,7 @@
 mediaFileSuccess.bytes=\u30D0\u30A4\u30C8
 mediaFileView.moveSelected=\u9078\u629E\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u3092\u30D5\u30A9\u30EB\u30C0\u306B\u79FB\u52D5\:
 oauthKeys.urls=OAuth\u306EURL
-tabbedmenu.admin.planetSubscriptions=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3
+tabbedmenu.admin.planetGroupSubs=\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3
 weblogEdit.submittedForReview=\u30A8\u30F3\u30C8\u30EA\u30FC\u304C\u30EC\u30D3\u30E5\u30FC\u3092\u53D7\u3051\u308B\u305F\u3081\u306B\u9001\u4FE1\u3055\u308C\u307E\u3057\u305F
 installer.upgradeTables=\u30C6\u30FC\u30D6\u30EB\u3092\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u3057\u307E\u3059\u304B?
 configForm.none=\u6307\u5B9A\u306A\u3057
diff --git a/app/src/main/resources/ApplicationResources_ko.properties b/app/src/main/resources/ApplicationResources_ko.properties
index 5cad3a1..cc8144a 100644
--- a/app/src/main/resources/ApplicationResources_ko.properties
+++ b/app/src/main/resources/ApplicationResources_ko.properties
@@ -778,24 +778,24 @@
 ConfigForm.message.saveSucceeded=\ud50c\ub798\ub2db \ud658\uacbd \uc124\uc815\uc774 \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
 ConfigForm.error.saveFailed=\ud50c\ub798\ub2db \ud658\uacbd \uc124\uc815\uc744 \uc800\uc7a5\ud558\ub294 \uc911\uc5d0 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.
 
-# ----------------------------------------------------- PlanetSubscriptions.jsp
+# ----------------------------------------------------- PlanetGroupSubs.jsp
 
-planetSubscriptions.title=\uad6c\ub3c5
+planetGroupSubs.title=\uad6c\ub3c5
 
-planetSubscriptions.subtitle.add=\
+planetGroupSubs.subtitle.add=\
 \uadf8\ub8f9, [<b>{0}</b>] \ub0b4\uc758 \ub274\uc2a4\ud53c\ub4dc \uad6c\ub3c5 \uad00\ub9ac.
-planetSubscriptions.prompt.add=\uc0c8\ub85c\uc6b4 \uad6c\ub3c5\uc744 \ucd94\uac00\ud558\ub824\uba74, \
+planetGroupSubs.prompt.add=\uc0c8\ub85c\uc6b4 \uad6c\ub3c5\uc744 \ucd94\uac00\ud558\ub824\uba74, \
 \ub274\uc2a4\ud53c\ub4dc URL\uc744 \uc785\ub825\ud558\uc2e0 \ud6c4 \uc800\uc7a5 \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc2ed\uc2dc\uc624.
 
-planetSubscriptions.subtitle.addMain=\ub274\uc2a4\ud53c\ub4dc \uad6c\ub3c5 \uba54\uc778 \ubaa9\ub85d \uad00\ub9ac
-planetSubscriptions.prompt.addMain=\uc774 \ud398\uc774\uc9c0\ub97c \uc0ac\uc6a9\ud558\uc5ec \
+planetGroupSubs.subtitle.addMain=\ub274\uc2a4\ud53c\ub4dc \uad6c\ub3c5 \uba54\uc778 \ubaa9\ub85d \uad00\ub9ac
+planetGroupSubs.prompt.addMain=\uc774 \ud398\uc774\uc9c0\ub97c \uc0ac\uc6a9\ud558\uc5ec \
 \uba54\uc778 \ud50c\ub798\ub2db \ud1b5\ud569 \uae30\ub2a5 \ud398\uc774\uc9c0\uc5d0 \ud3ec\ud568\ub420 \ub274\uc2a4\ud53c\ub4dc \ubaa9\ub85d\uc5d0 \uad6c\ub3c5\uc744 \ucd94\uac00\ud558\uc2ed\uc2dc\uc624. \
 \uc0c8\ub85c\uc6b4 \uad6c\ub3c5\uc744 \ucd94\uac00\ud558\uc2dc\ub824\uba74 \ub274\uc2a4\ud53c\ub4dc URL\uc744 \uc785\ub825\ud558\uc2dc\uace0 \uc800\uc7a5 \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc2ed\uc2dc\uc624.
 
-planetSubscriptions.existingTitle=\uae30\uc874 \uad6c\ub3c5
+planetGroupSubs.existingTitle=\uae30\uc874 \uad6c\ub3c5
 
-planetSubscriptions.column.title=\uc81c\ubaa9
-planetSubscriptions.column.feedUrl=\ud53c\ub4dc URL
+planetGroupSubs.column.title=\uc81c\ubaa9
+planetGroupSubs.column.feedUrl=\ud53c\ub4dc URL
 
 planetSubscription.feedUrl=\ub274\uc2a4\ud53c\ub4dc URL
 planetSubscription.success.deleted=\uad6c\ub3c5\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
@@ -804,7 +804,7 @@
 
 planetSubscription.error=\ub274\uc2a4\ud53c\ub4dc URL\uc744 \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.
 planetSubscription.error.feedUrl=\ub274\uc2a4\ud53c\ub4dc URL\uc744 \uc785\ub825\ud558\uc2ed\uc2dc\uc624.
-planetSubscriptions.error.duringSave=\uc911\ubcf5\ub41c \uad6c\ub3c5\uc785\ub2c8\ub2e4 - {0}.
+planetGroupSubs.error.duringSave=\uc911\ubcf5\ub41c \uad6c\ub3c5\uc785\ub2c8\ub2e4 - {0}.
 planetSubscription.error.deleting=\uac1d\uccb4 \uc0ad\uc81c \uc624\ub958
 
 # ------------------------------------------------------------ PlanetGroups.jsp
@@ -882,7 +882,7 @@
 tabbedmenu.admin.cacheInfo=\uce90\uc2dc \uc815\ubcf4
 tabbedmenu.planet=\ud50c\ub798\ub2db \uad00\ub9ac\uc790
 tabbedmenu.admin.planetConfig=\ud658\uacbd\uc124\uc815
-tabbedmenu.admin.planetSubscriptions=\uad6c\ub3c5
+tabbedmenu.admin.planetGroupSubs=\uad6c\ub3c5
 tabbedmenu.admin.planetGroups=\ucee4\uc2a4\ud140 \uadf8\ub8f9
 
 # ---------------------------------------------------------------------- Search
diff --git a/app/src/main/resources/ApplicationResources_ru.properties b/app/src/main/resources/ApplicationResources_ru.properties
index efa850c..ce5c695 100644
--- a/app/src/main/resources/ApplicationResources_ru.properties
+++ b/app/src/main/resources/ApplicationResources_ru.properties
@@ -464,19 +464,19 @@
 planetConfig.title=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 Planet

 planetConfig.tip.description=\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0449\u0435\u0435\u0441\u044F \u0432 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0435 \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B

 

-# ----------------------------------------------------- PlanetSubscriptions.jsp

+# ----------------------------------------------------- PlanetGroupSubs.jsp

 

-planetSubscriptions.title=\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0438

-planetSubscriptions.subtitle.add=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0430\u043C\u0438 \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u044B\u0445 \u043B\u0435\u043D\u0442 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435 [<b>{0}</b>]

-planetSubscriptions.prompt.add=\u0427\u0442\u043E\u0431\u044B \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435, URL \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B, URL \u0441\u0430\u0439\u0442\u0430 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043D\u043E\u043F\u043A\u0443 "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C"

+planetGroupSubs.title=\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0438

+planetGroupSubs.subtitle.add=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0430\u043C\u0438 \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u044B\u0445 \u043B\u0435\u043D\u0442 \u0432 \u0433\u0440\u0443\u043F\u043F\u0435 [<b>{0}</b>]

+planetGroupSubs.prompt.add=\u0427\u0442\u043E\u0431\u044B \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435, URL \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B, URL \u0441\u0430\u0439\u0442\u0430 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043D\u043E\u043F\u043A\u0443 "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C"

 

-planetSubscriptions.subtitle.addMain=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0433\u043B\u0430\u0432\u043D\u044B\u043C \u0441\u043F\u0438\u0441\u043A\u043E\u043C \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u044B\u0445 \u043F\u043E\u0434\u043F\u0438\u0441\u043E\u043A

-planetSubscriptions.prompt.addMain=\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u044D\u0442\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043F\u043E\u0434\u043F\u0438\u0441\u043E\u043A: \u0441\u043F\u0438\u0441\u043E\u043A \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u044B\u0445 \u043B\u0435\u043D\u0442 \u043D\u0430 \u0433\u043B\u0430\u0432\u043D\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043E\u0440\u0430 Planet. \u0427\u0442\u043E\u0431\u044B \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435, URL \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B, URL \u0441\u0430\u0439\u0442\u0430 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043D\u043E\u043F\u043A\u0443 "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C"

+planetGroupSubs.subtitle.addMain=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0433\u043B\u0430\u0432\u043D\u044B\u043C \u0441\u043F\u0438\u0441\u043A\u043E\u043C \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u044B\u0445 \u043F\u043E\u0434\u043F\u0438\u0441\u043E\u043A

+planetGroupSubs.prompt.addMain=\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u044D\u0442\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043F\u043E\u0434\u043F\u0438\u0441\u043E\u043A: \u0441\u043F\u0438\u0441\u043E\u043A \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u044B\u0445 \u043B\u0435\u043D\u0442 \u043D\u0430 \u0433\u043B\u0430\u0432\u043D\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043E\u0440\u0430 Planet. \u0427\u0442\u043E\u0431\u044B \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435, URL \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B, URL \u0441\u0430\u0439\u0442\u0430 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043D\u043E\u043F\u043A\u0443 "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C"

 

-planetSubscriptions.existingTitle=\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0438

+planetGroupSubs.existingTitle=\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0438

 

-planetSubscriptions.column.title=\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A, \u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435

-planetSubscriptions.column.feedUrl=URL \u043B\u0435\u043D\u0442\u044B

+planetGroupSubs.column.title=\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A, \u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435

+planetGroupSubs.column.feedUrl=URL \u043B\u0435\u043D\u0442\u044B

 planetSubscription.feedUrl=URL \u043D\u043E\u0432\u043E\u0441\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B

 

 planetSubscription.success.deleted=\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0430 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0443\u0434\u0430\u043B\u0435\u043D\u0430

@@ -484,7 +484,7 @@
 

 planetSubscription.error=\u0414\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D URL \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B

 planetSubscription.error.feedUrl=\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F URL (\u0430\u0434\u0440\u0435\u0441) \u043D\u043E\u0432\u043E\u0441\u0442\u043D\u043E\u0439 \u043B\u0435\u043D\u0442\u044B

-planetSubscriptions.error.duringSave=\u041F\u0440\u043E\u0434\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443? {0}

+planetGroupSubs.error.duringSave=\u041F\u0440\u043E\u0434\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443? {0}

 planetSubscription.error.deleting=\u041E\u0448\u0438\u0431\u043A\u0430 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u043E\u0431\u044A\u0435\u043A\u0442\u0430

 

 # ------------------------------------------------------------ PlanetGroups.jsp

@@ -537,7 +537,7 @@
 tabbedmenu.admin.pingTargets=\u0410\u0434\u0440\u0435\u0441\u0430\u0442\u044B \u043F\u0438\u043D\u0433\u0430

 tabbedmenu.planet=Planet Admin

 tabbedmenu.admin.planetConfig=\u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F

-tabbedmenu.admin.planetSubscriptions=\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0438

+tabbedmenu.admin.planetGroupSubs=\u041F\u043E\u0434\u043F\u0438\u0441\u043A\u0438

 tabbedmenu.admin.planetGroups=\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B

 

 

diff --git a/app/src/main/resources/ApplicationResources_zh_CN.properties b/app/src/main/resources/ApplicationResources_zh_CN.properties
index 470a468..77c7ec8 100644
--- a/app/src/main/resources/ApplicationResources_zh_CN.properties
+++ b/app/src/main/resources/ApplicationResources_zh_CN.properties
@@ -369,15 +369,15 @@
 planetSubscription.foundExisting=\u53D1\u73B0\u5DF2\u7ECF\u5B58\u5728\u8BA2\u9605 [{0}] \uFF0C\u66FF\u6362\u5417
 planetSubscription.success.deleted=\u8BA2\u9605\u6210\u529F\u5220\u9664
 planetSubscription.success.saved=\u8BA2\u9605\u5DF2\u4FDD\u5B58
-planetSubscriptions.column.feedUrl=\u65B0\u95FB\u79CD\u5B50URL
-planetSubscriptions.column.title=\u6807\u9898
-planetSubscriptions.error.duringSave=\u590D\u5236\u8BA2\u9605\uFF1F\uFF0D{0}
-planetSubscriptions.existingTitle=\u5B58\u5728\u7684\u8BA2\u9605
-planetSubscriptions.prompt.add=\u6DFB\u52A0\u4E00\u4E2A\u65B0\u7684\u8BA2\u9605\u5F88\u7B80\u5355\uFF1A\u8F93\u5165\u6807\u9898\u3001\u65B0\u95FB\u79CD\u5B50URL\u7136\u540E\u4FDD\u5B58\u3002
-planetSubscriptions.prompt.addMain=\u5728\u8FD9\u4E2A\u9875\u9762\u4E2D\u6DFB\u52A0\u3001\u7F16\u8F91\u8BA2\u9605\uFF1A\u65B0\u95FB\u79CD\u5B50\u5217\u8868\u5728\u884C\u661F\u65B0\u95FB\u805A\u5408\u5668\u9875\u9762\u4E4B\u4E2D\u3002\u6DFB\u52A0\u4E00\u4E2A\u65B0\u8BA2\u9605\u5F88\u7B80\u5355\uFF1A\u8F93\u5165\u6807\u9898\u3001\u65B0\u95FB\u79CD\u5B50URL\u7136\u540E\u4FDD\u5B58\u3002
-planetSubscriptions.subtitle.add=\u7BA1\u7406\u7FA4\u7EC4 [<b>{0}</b>] \u7684\u8BA2\u9605\u3002
-planetSubscriptions.subtitle.addMain=\u7BA1\u7406\u4E3B\u65B0\u95FB\u8BA2\u9605\u5217\u8868\u3002
-planetSubscriptions.title=\u8BA2\u9605
+planetGroupSubs.column.feedUrl=\u65B0\u95FB\u79CD\u5B50URL
+planetGroupSubs.column.title=\u6807\u9898
+planetGroupSubs.error.duringSave=\u590D\u5236\u8BA2\u9605\uFF1F\uFF0D{0}
+planetGroupSubs.existingTitle=\u5B58\u5728\u7684\u8BA2\u9605
+planetGroupSubs.prompt.add=\u6DFB\u52A0\u4E00\u4E2A\u65B0\u7684\u8BA2\u9605\u5F88\u7B80\u5355\uFF1A\u8F93\u5165\u6807\u9898\u3001\u65B0\u95FB\u79CD\u5B50URL\u7136\u540E\u4FDD\u5B58\u3002
+planetGroupSubs.prompt.addMain=\u5728\u8FD9\u4E2A\u9875\u9762\u4E2D\u6DFB\u52A0\u3001\u7F16\u8F91\u8BA2\u9605\uFF1A\u65B0\u95FB\u79CD\u5B50\u5217\u8868\u5728\u884C\u661F\u65B0\u95FB\u805A\u5408\u5668\u9875\u9762\u4E4B\u4E2D\u3002\u6DFB\u52A0\u4E00\u4E2A\u65B0\u8BA2\u9605\u5F88\u7B80\u5355\uFF1A\u8F93\u5165\u6807\u9898\u3001\u65B0\u95FB\u79CD\u5B50URL\u7136\u540E\u4FDD\u5B58\u3002
+planetGroupSubs.subtitle.add=\u7BA1\u7406\u7FA4\u7EC4 [<b>{0}</b>] \u7684\u8BA2\u9605\u3002
+planetGroupSubs.subtitle.addMain=\u7BA1\u7406\u4E3B\u65B0\u95FB\u8BA2\u9605\u5217\u8868\u3002
+planetGroupSubs.title=\u8BA2\u9605
 tabbedmenu.admin=\u670D\u52A1\u5668\u7BA1\u7406
 tabbedmenu.admin.cacheInfo=\u7F13\u5B58\u4FE1\u606F
 tabbedmenu.admin.commentManagement=\u8BC4\u8BBA
@@ -385,7 +385,7 @@
 tabbedmenu.admin.pingTargets=Ping\u76EE\u6807
 tabbedmenu.admin.planetConfig=\u914D\u7F6E
 tabbedmenu.admin.planetGroups=\u5B9A\u5236\u7FA4\u7EC4
-tabbedmenu.admin.planetSubscriptions=\u8BA2\u9605
+tabbedmenu.admin.planetGroupSubs=\u8BA2\u9605
 tabbedmenu.admin.userAdmin=\u7528\u6237\u7BA1\u7406
 tabbedmenu.bookmarks=\u4E66\u7B7E
 tabbedmenu.bookmarks.allFolders=\u4E66\u7B7E\u5939
diff --git a/app/src/main/resources/logback.xml b/app/src/main/resources/logback.xml
new file mode 100644
index 0000000..7d900d8
--- /dev/null
+++ b/app/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+            </pattern>
+        </encoder>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="STDOUT" />
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/app/src/main/resources/org/apache/roller/weblogger/config/roller.properties b/app/src/main/resources/org/apache/roller/weblogger/config/roller.properties
index 125520c..1be6b64 100644
--- a/app/src/main/resources/org/apache/roller/weblogger/config/roller.properties
+++ b/app/src/main/resources/org/apache/roller/weblogger/config/roller.properties
@@ -209,7 +209,7 @@
 
 # Set to true to enable the Planet aggregator. You also need to enable the 
 # RefreshRollerPlanetTask task below to get the feed fetcher running.
-planet.aggregator.enabled=false
+planet.aggregator.enabled=true
 
 # Planet backend guice module, customized for use with Weblogger
 planet.aggregator.guice.module=\
@@ -550,14 +550,14 @@
 # The list of configured WeblogEntryEditors available to users
 plugins.weblogEntryEditors=\
 org.apache.roller.weblogger.ui.core.plugins.TextEditor,\
-org.apache.roller.weblogger.ui.core.plugins.XinhaEditor
+org.apache.roller.weblogger.ui.core.plugins.Summernote
 
 # The "id" of the default editor to use. NOT the class name
-plugins.defaultEditor=editor-text.jsp
+plugins.defaultEditor=editor-summernote.jsp
 
 # Default weblog editor
 # The list of available editors is in rollerRuntimeConfigDefs.xml
-newweblog.editor=editor-text.jsp
+newweblog.editor=editor-summernote.jsp
 
 
 #-----------------------------------------------------------------------------
@@ -624,9 +624,6 @@
 # underscores instead.
 weblogentry.title.useUnderscoreSeparator=false
 
-# editor theme to be used (corresponds to directory name under /theme)
-editor.theme=tan
-
 # list of links to include in root bookmark folder of each new blog
 # format is like so: linktitle2|linkurl2,linktitle2|linkurl2,linktitle3|linkurl3
 newuser.blogroll=\
@@ -643,6 +640,10 @@
 # EclipseLink JPA properties
 eclipselink.persistence-context.flush-mode=auto
 
+# Lucene configurations
+lucene.analyzer.class=org.apache.lucene.analysis.standard.StandardAnalyzer
+lucene.analyzer.maxTokenCount=1000
+
 #-----------------------------------------------------------------------------
 # Experimental, deprecated and "undocumented" settings
 #-----------------------------------------------------------------------------
diff --git a/app/src/main/resources/org/apache/roller/weblogger/config/runtimeConfigDefs.xml b/app/src/main/resources/org/apache/roller/weblogger/config/runtimeConfigDefs.xml
index 8c84ba6..d897bca 100644
--- a/app/src/main/resources/org/apache/roller/weblogger/config/runtimeConfigDefs.xml
+++ b/app/src/main/resources/org/apache/roller/weblogger/config/runtimeConfigDefs.xml
@@ -105,7 +105,7 @@
        </property-def>
       <property-def  name="users.editor.pages"  key="configForm.editorPages">
          <type>text</type>
-         <default-value>editor-text.jsp,editor-xinha.jsp</default-value>
+         <default-value>editor-text.jsp,editor-summernote.jsp</default-value>
          <rows>3</rows>
          <cols>40</cols>
       </property-def>
@@ -136,11 +136,11 @@
    <display-group name="weblogSettings" key="configForm.weblogSettings" >
        
       <property-def  name="site.pages.maxEntries"  key="configForm.pageMaxEntries">
-         <type>string</type>
+         <type>integer</type>
          <default-value>30</default-value>
       </property-def>
       <property-def  name="site.newsfeeds.defaultEntries"  key="configForm.newsfeedMaxEntries">
-         <type>string</type>
+         <type>integer</type>
          <default-value>30</default-value>
       </property-def>
       <property-def  name="site.newsfeeds.styledFeeds"  key="configForm.styledFeeds">
@@ -210,11 +210,11 @@
          <default-value>exe</default-value>
       </property-def>
       <property-def  name="uploads.file.maxsize"  key="configForm.maxFileSize">
-         <type>string</type>
+         <type>float</type>
          <default-value>2.00</default-value>
       </property-def>
       <property-def  name="uploads.dir.maxsize"  key="configForm.maxDirSize">
-         <type>string</type>
+         <type>float</type>
          <default-value>20.00</default-value>
       </property-def>
 
diff --git a/app/src/main/resources/org/apache/roller/weblogger/ui/struts2/admin/admin-menu.xml b/app/src/main/resources/org/apache/roller/weblogger/ui/struts2/admin/admin-menu.xml
index d090bdc..2e18a81 100644
--- a/app/src/main/resources/org/apache/roller/weblogger/ui/struts2/admin/admin-menu.xml
+++ b/app/src/main/resources/org/apache/roller/weblogger/ui/struts2/admin/admin-menu.xml
@@ -42,8 +42,8 @@
                    name="tabbedmenu.admin.planetConfig" />
         
         <!-- globalPerms="admin" -->
-        <menu-item action="planetSubscriptions"
-                   name="tabbedmenu.admin.planetSubscriptions" />
+        <menu-item action="planetGroupSubs"
+                   name="tabbedmenu.admin.planetGroupSubs" />
         
         <!-- globalPerms="admin" -->
         <menu-item action="planetGroups"
diff --git a/app/src/main/resources/struts.xml b/app/src/main/resources/struts.xml
index a910901..f03c745 100644
--- a/app/src/main/resources/struts.xml
+++ b/app/src/main/resources/struts.xml
@@ -1,4 +1,21 @@
 <?xml version="1.0" encoding="UTF-8" ?>
+<!--
+        Licensed to the Apache Software Foundation (ASF) under one or more
+        contributor license agreements.  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.  For additional information regarding
+        copyright in this work,please see the NOTICE file in the top level
+        directory of this distribution.
+-->
 <!DOCTYPE struts PUBLIC
         "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
         "http://struts.apache.org/dtds/struts-2.5.dtd">
@@ -58,7 +75,7 @@
                     <param name="excludeMethods">cancel</param>
                 </interceptor-ref>
                 
-                <!-- validation interceptors, MUST come after our custom interceptors -->
+                <!-- validation interceptors,MUST come after our custom interceptors -->
                 <interceptor-ref name="validation">
                     <param name="excludeMethods">input,back,cancel,browse</param>
                 </interceptor-ref>
@@ -77,13 +94,6 @@
             <result name="access-denied" type="tiles">.denied</result>
         </global-results>
 
-        <global-allowed-methods>
-            accept,
-            activate,
-            decline,
-            execute
-        </global-allowed-methods>
-
         <!-- Simple actions which basically just replace the global-forwards from
              the old struts 1 config.  this is the only way to do it in struts 2 -->
         <action name="home">
@@ -102,11 +112,13 @@
                 class="org.apache.roller.weblogger.ui.struts2.core.Setup">
             <result name="success" type="tiles">.Setup</result>
             <result name="home" type="redirectAction">home</result>
+            <allowed-methods>activate,execute,save</allowed-methods>
         </action>
                         
         <action name="login"
                 class="org.apache.roller.weblogger.ui.struts2.core.Login">
             <result type="tiles">.Login</result>
+            <allowed-methods>execute</allowed-methods>
         </action>
         
         <action name="register"
@@ -114,23 +126,27 @@
             <result name="input" type="tiles">.Register</result>
             <result name="disabled" type="tiles">.GenericError</result>
             <result name="success" type="tiles">.Welcome</result>
+            <allowed-methods>activate,execute,save</allowed-methods>
         </action>
         
         <action name="profile"
                 class="org.apache.roller.weblogger.ui.struts2.core.Profile">
             <result name="input" type="tiles">.Profile</result>
             <result name="cancel" type="redirectAction">menu</result>
-            <result name="success" type="tiles">.Profile</result>
+            <result name="success" type="tiles">.MainMenu</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
 
         <action name="oauthKeys"
                 class="org.apache.roller.weblogger.ui.struts2.core.OAuthKeys">
             <result name="success" type="tiles">.OAuthKeys</result>
+            <allowed-methods>execute</allowed-methods>
         </action>
 
         <action name="oauthAuthorize"
                 class="org.apache.roller.weblogger.ui.struts2.core.OAuthAuthorize">
             <result name="success" type="tiles">.OAuthAuthorize</result>
+            <allowed-methods>execute</allowed-methods>
         </action>
 
         <action name="createWeblog"
@@ -138,11 +154,13 @@
             <result name="input" type="tiles">.CreateWeblog</result>
             <result name="disabled" type="tiles">.GenericError</result>
             <result name="success" type="chain">menu</result>
+            <allowed-methods>cancel,execute,save</allowed-methods>
         </action>
         
         <action name="menu"
                 class="org.apache.roller.weblogger.ui.struts2.core.MainMenu">
             <result type="tiles">.MainMenu</result>
+            <allowed-methods>accept,decline,execute</allowed-methods>
         </action>
 
     </package>
@@ -169,6 +187,7 @@
                 <param name="actionName">home</param>
                 <param name="namespace">/roller-ui</param>
             </result>
+            <allowed-methods>execute,create,upgrade,bootstrap</allowed-methods>
         </action>
             
     </package>
@@ -177,23 +196,11 @@
     <!-- Weblogger Admin UI (includes planet) -->
     <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>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
                
         <action name="userAdmin"
@@ -201,6 +208,11 @@
             <result name="success" type="tiles">.UserAdmin</result>
             <result name="error" type="tiles">.UserAdmin</result>
             <result name="input" type="tiles">.UserAdmin</result>
+            <result name="edit" type="redirectAction">
+                <param name="actionName">modifyUser</param>
+                <param name="bean.userName">${bean.userName}</param>
+            </result>
+            <allowed-methods>edit,execute</allowed-methods>
         </action>
         
         <action name="createUser"
@@ -212,6 +224,7 @@
                 <param name="actionName">modifyUser!firstSave</param>
                 <param name="bean.id">${bean.id}</param>
             </result>
+            <allowed-methods>execute,firstSave,save</allowed-methods>
         </action>
 
         <action name="modifyUser"
@@ -223,17 +236,20 @@
             <result name="cancel" type="redirectAction">
                 <param name="actionName">userAdmin</param>
             </result>
+            <allowed-methods>execute,firstSave,save</allowed-methods>
         </action>
         
         <action name="globalCommentManagement"
                 class="org.apache.roller.weblogger.ui.struts2.admin.GlobalCommentManagement">
             <result name="list" type="tiles">.GlobalCommentManagement</result>
+            <allowed-methods>execute,delete,query,update</allowed-methods>
         </action>
         
         <action name="commonPingTargets"
                 class="org.apache.roller.weblogger.ui.struts2.admin.PingTargets">
             <result name="list" type="tiles">.PingTargets</result>
             <result name="confirm" type="tiles">.PingTargetConfirm</result>
+            <allowed-methods>delete,deleteConfirm,disable,enable,execute</allowed-methods>
         </action>
         
         <action name="commonPingTargetAdd"
@@ -242,6 +258,7 @@
             <param name="pageTitle">pingTarget.addTarget</param>
             <result name="input" type="tiles">.PingTargetEdit</result>
             <result name="success" type="chain">commonPingTargets</result>
+            <allowed-methods>execute</allowed-methods>
         </action>
         
         <action name="commonPingTargetEdit"
@@ -251,27 +268,31 @@
             <result name="input" type="tiles">.PingTargetEdit</result>
             <result name="success" type="chain">commonPingTargets</result>
             <result name="error" type="chain">commonPingTargets</result>
+            <allowed-methods>execute</allowed-methods>
         </action>
         
         <action name="cacheInfo"
                 class="org.apache.roller.weblogger.ui.struts2.admin.CacheInfo">
             <result name="success" type="tiles">.CacheInfo</result>
+            <allowed-methods>execute,clear</allowed-methods>
         </action>
-        
-        
+
         <action name="planetConfig"
                 class="org.apache.roller.weblogger.planet.ui.PlanetConfig">
             <result name="input" type="tiles">.PlanetConfig</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
         
-        <action name="planetSubscriptions"
-                class="org.apache.roller.weblogger.planet.ui.PlanetSubscriptions">
-            <result name="list" type="tiles">.PlanetSubscriptions</result>
+        <action name="planetGroupSubs"
+                class="org.apache.roller.weblogger.planet.ui.PlanetGroupSubs">
+            <result name="list" type="tiles">.PlanetGroupSubs</result>
+            <allowed-methods>execute,deleteSubscription,saveGroup,saveSubscription</allowed-methods>
         </action>
         
         <action name="planetGroups"
                 class="org.apache.roller.weblogger.planet.ui.PlanetGroups">
             <result name="list" type="tiles">.PlanetGroups</result>
+            <allowed-methods>delete,execute</allowed-methods>
         </action>
     </package>
     
@@ -279,37 +300,6 @@
     <!-- Weblogger Authoring UI -->
     <package name="weblogger-authoring" namespace="/roller-ui/authoring" extends="weblogger" >
 
-        <global-allowed-methods>
-            add,
-            cancel,
-            createNewDirectory,
-            execute,
-            delete,
-            deleteConfirm,
-            deleteFolder,
-            deleteSelected,
-            disable,
-            enable,
-            entryAdd,
-            entryEdit,
-            firstSave,
-            folderCreated,
-            flushCache,
-            includeInGallery,
-            moveSelected,
-            pingNow,
-            publish,
-            query,
-            remove,
-            revert,
-            reset,
-            save,
-            saveDraft,
-            search,
-            update,
-            view
-        </global-allowed-methods>
-
         <action name="mediaFileAdd"
                 class="org.apache.roller.weblogger.ui.struts2.editor.MediaFileAdd">
             <result name="input" type="tiles">.MediaFileAdd</result>
@@ -319,12 +309,14 @@
                 <param name="actionName">mediaFileView</param>
                 <param name="weblog">${weblog}</param>
             </result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
 
         <action name="mediaFileEdit"
                 class="org.apache.roller.weblogger.ui.struts2.editor.MediaFileEdit">
             <result name="input" type="tiles">.MediaFileEdit</result>
             <result name="success" type="tiles">.MediaFileEditSuccess</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
 
         <action name="mediaFileAddExternalInclude"
@@ -332,22 +324,28 @@
             <result name="input" type="tiles">.MediaFileAddExternalInclude</result>
             <result name="success" type="tiles">.MediaFileAddExternalInclude</result>
             <result name="error" type="tiles">.MediaFileAddExternalInclude</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
 
 	    <action name="mediaFileView"
                 class="org.apache.roller.weblogger.ui.struts2.editor.MediaFileView">
             <result name="success" type="tiles">.MediaFileView</result>
             <result name="success.json" type="dispatcher">/WEB-INF/jsps/editor/MediaFileViewLight.jsp</result>
+            <allowed-methods>
+                delete,execute,createNewDirectory,deleteFolder,deleteSelected,fetchDirectoryContentLight,includeInGallery,moveSelected,search,view
+            </allowed-methods>
         </action>
 
 	    <action name="mediaFileImageDim"
                 class="org.apache.roller.weblogger.ui.struts2.editor.MediaFileImageDim">
             <result name="success" type="tiles">.MediaFileImageDimension</result>
+            <allowed-methods>execute</allowed-methods>
         </action>
 
         <action name="entryAddWithMediaFile"
                 class="org.apache.roller.weblogger.ui.struts2.editor.EntryAddWithMediaFile">
             <result name="success" type="chain">entryAdd</result>
+            <allowed-methods>execute</allowed-methods>
         </action>
 
         <action name="entryAdd"
@@ -360,6 +358,7 @@
                 <param name="weblog">${weblog}</param>
                 <param name="bean.id">${bean.id}</param>
             </result>
+            <allowed-methods>execute,firstSave,publish,saveDraft,trackback</allowed-methods>
         </action>
 
         <action name="entryEdit"
@@ -371,6 +370,7 @@
                 <param name="actionName">menu</param>
                 <param name="namespace">/roller-ui</param>
             </result>
+            <allowed-methods>execute,firstSave,publish,saveDraft,trackback</allowed-methods>
         </action>
         
         <action name="entryRemove"
@@ -382,10 +382,11 @@
                 <param name="namespace">/roller-ui</param>
             </result>
             <result name="success" type="chain">entryAdd</result>
+            <allowed-methods>execute,remove</allowed-methods>
         </action>
 
-        <!-- Below activated by Entries.jsp and EntryRemove.jsp, kept separate from
-        entryRemove above as return pages are different, both in the confirm delete
+        <!-- Below activated by Entries.jsp and EntryRemove.jsp,kept separate from
+        entryRemove above as return pages are different,both in the confirm delete
         and cancel delete scenarios.
 
         Note the different actionName parameters.  The actionName is used to determine
@@ -403,23 +404,27 @@
                 <param name="namespace">/roller-ui</param>
             </result>
           <result name="success" type="chain">entries</result>
+            <allowed-methods>execute,remove</allowed-methods>
         </action>
 
         <action name="entries"
                 class="org.apache.roller.weblogger.ui.struts2.editor.Entries">
             <result name="list" type="tiles">.Entries</result>
+            <allowed-methods>execute</allowed-methods>
         </action>
-        
+
         <action name="comments"
                 class="org.apache.roller.weblogger.ui.struts2.editor.Comments">
             <result name="list" type="tiles">.Comments</result>
+            <allowed-methods>delete,execute,query,update</allowed-methods>
         </action>
-        
+
         <action name="categories"
                 class="org.apache.roller.weblogger.ui.struts2.editor.Categories">
             <result name="list" type="tiles">.Categories</result>
+            <allowed-methods>execute,move</allowed-methods>
         </action>
-        
+
         <action name="categoryAdd"
                 class="org.apache.roller.weblogger.ui.struts2.editor.CategoryEdit">
             <param name="actionName">categoryAdd</param>
@@ -427,8 +432,9 @@
             <result name="input" type="tiles">.CategoryEdit</result>
             <result name="success" type="chain">categories</result>
             <result name="error" type="chain">categories</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
-        
+
         <action name="categoryEdit"
                 class="org.apache.roller.weblogger.ui.struts2.editor.CategoryEdit">
             <param name="actionName">categoryEdit</param>
@@ -439,6 +445,7 @@
                 <param name="actionName">categories</param>
                 <param name="weblog">${weblog}</param>
             </result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
 
         <action name="categoryRemove"
@@ -449,11 +456,13 @@
                 <param name="weblog">${weblog}</param>
             </result>
             <result name="success" type="chain">categories</result>
+            <allowed-methods>execute,remove</allowed-methods>
         </action>
-        
+
         <action name="bookmarks"
                 class="org.apache.roller.weblogger.ui.struts2.editor.Bookmarks">
             <result name="list" type="tiles">.Bookmarks</result>
+            <allowed-methods>delete,deleteFolder,execute,folderCreated,move,view</allowed-methods>
         </action>
 
         <action name="bookmarkAdd"
@@ -463,8 +472,9 @@
             <result name="input" type="tiles">.BookmarkEdit</result>
             <result name="success" type="chain">bookmarks</result>
             <result name="error" type="chain">bookmarks</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
-        
+
         <action name="bookmarkEdit"
                 class="org.apache.roller.weblogger.ui.struts2.editor.BookmarkEdit">
             <param name="actionName">bookmarkEdit</param>
@@ -477,14 +487,16 @@
                 <param name="folderId">${folderId}</param>
             </result>
             <result name="error" type="chain">bookmarkEdit</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
-        
+
         <action name="bookmarksImport"
                 class="org.apache.roller.weblogger.ui.struts2.editor.BookmarksImport">
             <result name="input" type="tiles">.BookmarksImport</result>
             <result name="success" type="chain">bookmarks</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
-        
+
         <action name="folderAdd"
                 class="org.apache.roller.weblogger.ui.struts2.editor.FolderEdit">
             <param name="actionName">folderAdd</param>
@@ -497,8 +509,9 @@
                 <param name="folderId">${folderId}</param>
             </result>
             <result name="error" type="chain">bookmarks</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
-        
+
         <action name="folderEdit"
                 class="org.apache.roller.weblogger.ui.struts2.editor.FolderEdit">
             <param name="actionName">folderEdit</param>
@@ -511,11 +524,13 @@
                 <param name="folderId">${folderId}</param>
             </result>
             <result name="error" type="chain">bookmarks</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
-        
+
         <action name="weblogConfig"
                 class="org.apache.roller.weblogger.ui.struts2.editor.WeblogConfig">
             <result name="input" type="tiles">.WeblogConfig</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
         
         <action name="weblogRemove"
@@ -525,54 +540,38 @@
                 <param name="actionName">menu</param>
                 <param name="namespace">/roller-ui</param>
             </result>
+            <allowed-methods>execute,remove</allowed-methods>
         </action>
         
         <action name="themeEdit"
                 class="org.apache.roller.weblogger.ui.struts2.editor.ThemeEdit">
             <result name="input" type="tiles">.ThemeEdit</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
         
         <action name="stylesheetEdit"
                 class="org.apache.roller.weblogger.ui.struts2.editor.StylesheetEdit">
             <result name="input" type="tiles">.StylesheetEdit</result>
+            <allowed-methods>copyStylesheet,delete,execute,revert,save</allowed-methods>
         </action>
         
         <action name="templates"
                 class="org.apache.roller.weblogger.ui.struts2.editor.Templates">
             <result name="list" type="tiles">.Templates</result>
+            <allowed-methods>add,execute</allowed-methods>
         </action>
         
         <action name="templateEdit"
                 class="org.apache.roller.weblogger.ui.struts2.editor.TemplateEdit">
             <result name="list" type="chain">templates</result>
             <result name="input" type="tiles">.TemplateEdit</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
-        
-        <action name="templateRemove"
-                class="org.apache.roller.weblogger.ui.struts2.editor.TemplateRemove">
-            <result name="confirm" type="tiles">.TemplateRemove</result>
-            <result name="cancel" type="redirectAction">
-                <param name="actionName">templates</param>
-                <param name="weblog">${weblog}</param>
-            </result>
-            <result name="success" type="chain">templates</result>
-        </action>
-        
-        <action name="templatesRemove"
-                class="org.apache.roller.weblogger.ui.struts2.editor.TemplatesRemove">
-            <result name="input" type="tiles">.TemplatesRemove</result>
-            <result name="confirm" type="tiles">.TemplatesRemove</result>
-            <result name="success" type="chain">templates</result>
-            <result name="cancel" type="redirectAction">
-                <param name="actionName">templates</param>
-                <param name="weblog">${weblog}</param>
-            </result>
-            <result name="error" type="chain">templates</result>
-        </action>
-        
+
         <action name="members"
                 class="org.apache.roller.weblogger.ui.struts2.editor.Members">
             <result name="list" type="tiles">.Members</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
         
         <action name="invite"
@@ -584,6 +583,7 @@
                 <param name="actionName">members</param>
                 <param name="weblog">${weblog}</param>
             </result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
 
         <action name="memberResign"
@@ -597,16 +597,19 @@
                 <param name="actionName">menu</param>
                 <param name="namespace">/roller-ui</param>
             </result>
+            <allowed-methods>execute,resign</allowed-methods>
         </action>
 
         <action name="pings"
                 class="org.apache.roller.weblogger.ui.struts2.editor.Pings">
             <result name="list" type="tiles">.Pings</result>
+            <allowed-methods>disable,enable,execute,pingNow</allowed-methods>
         </action>
 
         <action name="maintenance"
                 class="org.apache.roller.weblogger.ui.struts2.editor.Maintenance">
             <result name="success" type="tiles">.Maintenance</result>
+            <allowed-methods>execute,flushCache,reset</allowed-methods>
         </action>
 
     </package>
@@ -615,16 +618,13 @@
     
     <package name="weblogger-authoring-overlay" namespace="/roller-ui/authoring/overlay" extends="weblogger-authoring" >
 
-        <global-allowed-methods>
-            execute,save
-        </global-allowed-methods>
-
         <action name="mediaFileAdd"
                 class="org.apache.roller.weblogger.ui.struts2.editor.MediaFileAdd">
             <param name="overlayMode">true</param>
             <result name="input" type="tiles">.MediaFileAddInclude</result>
             <result name="success" type="tiles">.MediaFileAddSuccessInclude</result>
             <result name="error" type="tiles">.MediaFileAddInclude</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
 
 	    <action name="mediaFileImageChooser"
@@ -633,6 +633,7 @@
             <result name="input" type="tiles">.MediaFileImageChooser</result>
             <result name="error" type="tiles">.MediaFileImageChooser</result>
             <result name="success" type="tiles">.MediaFileImageChooser</result>
+            <allowed-methods>execute,save</allowed-methods>
         </action>
 
     </package>
diff --git a/app/src/main/resources/template/roller/checkboxlist.ftl b/app/src/main/resources/template/roller/checkboxlist.ftl
deleted file mode 100644
index 0a9107b..0000000
--- a/app/src/main/resources/template/roller/checkboxlist.ftl
+++ /dev/null
@@ -1,106 +0,0 @@
-<#--
-/*
- * Roller Modifications
- * ====================
- *   Add <br/> to the end
- *
- * $Id: checkboxlist.ftl 1366934 2012-07-29 20:10:06Z jogep $
- *
- * 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}"
-       id="${parameters.name?html}-${itemCount}"<#rt/>
-    <#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}/simple/css.ftl" />
-    <#include "/${parameters.templateDir}/simple/scripting-events.ftl" />
-    <#include "/${parameters.templateDir}/simple/common-attributes.ftl" />
-        />
-<label for="${parameters.name?html}-${itemCount}" class="checkboxLabel">${itemValue?html}</label><br/><#-- Roller + <br/> -->
-</@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>
-        />
\ No newline at end of file
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/CacheInfo.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/CacheInfo.jsp
index 6344232..5e7e2ea 100644
--- a/app/src/main/webapp/WEB-INF/jsps/admin/CacheInfo.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/admin/CacheInfo.jsp
@@ -22,7 +22,8 @@
 
 <s:iterator var="cache" value="stats">
     <s:if test="#cache != null && !#cache.value.isEmpty">
-        <table cellspacing="3" border="1">
+
+        <table class="table table-bordered">
             <tr>
                 <th colspan="2"><s:property value="#cache.key"/></th>
             </tr>
@@ -39,7 +40,7 @@
                     <s:form action="cacheInfo!clear">
 						<s:hidden name="salt" />
                         <s:hidden name="cache" value="%{#cache.key}" />
-                        <s:submit value="%{getText('cacheInfo.clear')}" />
+                        <s:submit value="%{getText('cacheInfo.clear')}" cssClass="btn btn-default" />
                     </s:form>
                 </td>
             </tr>
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp
index 7ec9c39..10a91fc 100644
--- a/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp
@@ -17,96 +17,152 @@
 --%>
 <%@ 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 var="dg" value="globalConfigDef.displayGroups">
-    
-        <tr>
-            <td colspan="3"><h2><s:text name="%{#dg.key}" /></h2></td>
-        </tr>
-    
+
+        <h3><s:text name="%{#dg.key}"/></h3>
+
         <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>
+            <%-- special case for comment plugins --%>
+            <s:if test="#pd.name == 'users.comments.plugins'">
+                <s:checkboxlist label="%{getText(#pd.key)}" name="commentPlugins"
+                                list="pluginsList" listKey="id" value="name" listValue="name"/>
+            </s:if>
 
-                  <%-- "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 case for front page blog --%>
+            <s:elseif test="#pd.name == 'site.frontpage.weblog.handle'">
+                <s:select name="%{#pd.name}" label="%{getText(#pd.key)}" value="%{properties[#pd.name].value}"
+                          list="weblogs" listKey="name" listValueKey="handle"/>
+            </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)}"
+                                fieldValue="true" checked="true" onchange="formChanged()"/>
+                </s:if>
+                <s:if test="properties[#pd.name].value != 'true'">
+                    <s:checkbox name="%{#pd.name}" label="%{getText(#pd.key)}"
+                                fieldValue="false" onchange="formChanged()"/>
+                </s:if>
+
+            </s:elseif>
+
+            <%-- "integer" use input type number --%>
+            <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='<s:property value="%{properties[#pd.name].value}"/>'
+                               id='globalConfig_<s:property value="#pd.nameWithUnderbars" />'
+                               class="form-control integer" onkeyup="formChanged()"/>
+                    </div>
+                </div>
+
+            </s:elseif>
+
+            <%-- "float" use input type number --%>
+            <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="5"
+                               value='<s:property value="properties[#pd.name].value"/>'
+                               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>
-        
+
+        <img src="<s:url value='/roller-ui/images/spacer.png' />" alt="spacer" style="min-height: 1em"/>
+
     </s:iterator>
 
-    </table>
-    
-    <div class="control">
-        <input class="buttonBox" type="submit" value="<s:text name="generic.save"/>"/>
-    </div>
-    
+    <input id="saveButton" class="btn btn-default" 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");
+            var isFloat = $(this).hasClass("float");
+            var isBoolean = $(this).hasClass("boolean");
+
+            if (isInteger || isFloat) {
+
+                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")
+                }
+
+            } else if (isFloat) {
+
+                if (isNaN(this.valueAsNumber)) {
+                    $(this).css("background", "#FBB")
+                    error = true;
+
+                } else {
+                    $(this).css("background", "white")
+                }
+
+            } else if (isBoolean) {
+                // not sure why this is necessary, value does not track checked state?
+                $(this).prop("value", !(!$(this).prop("checked")));
+            }
+
+        });
+
+        saveBookmarkButton.attr("disabled", error);
+    }
+
+</script>
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetEdit.jsp
deleted file mode 100644
index be84eb7..0000000
--- a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetEdit.jsp
+++ /dev/null
@@ -1,59 +0,0 @@
-<%--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  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.  For additional information regarding
-  copyright in this work, please see the NOTICE file in the top level
-  directory of this distribution.
---%>
-<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-
-<%-- Titling, processing actions different between add and edit --%>
-<s:if test="actionName == 'commonPingTargetEdit'">
-    <s:set var="mainAction">commonPingTargetEdit</s:set>
-    <s:set var="subtitleKey">pingTargetEdit.subtitle</s:set>
-</s:if>
-<s:else>
-    <s:set var="mainAction">commonPingTargetAdd</s:set>
-    <s:set var="subtitleKey">pingTargetAdd.subtitle</s:set>
-</s:else>
-
-<p class="subtitle">
-<s:text name="%{#subtitleKey}"/>
-</p>
-
-<s:form>
-	<s:hidden name="salt" />
-    <s:if test="actionName == 'commonPingTargetEdit'">
-        <%-- bean for add does not have a bean id yet --%>
-        <s:hidden name="bean.id" />
-    </s:if>
-
-    <div class="formrow">
-       <label for="name" class="formrow"><s:text name="generic.name" /></label>
-       <s:textfield name="bean.name" size="30" maxlength="30" style="width:50%"/>
-    </div>
-
-    <div class="formrow">
-       <label for="pingUrl" class="formrow"><s:text name="pingTarget.pingUrl" /></label>
-       <s:textfield name="bean.pingUrl" size="100" maxlength="255" style="width:50%"/>
-    </div>
-
-    <p/>
-
-    <div class="formrow">
-       <label for="" class="formrow">&nbsp;</label>
-       <s:submit value="%{getText('generic.save')}" action="%{#mainAction}!save"/>
-       <s:submit value="%{getText('generic.cancel')}" action="commonPingTargets" />
-    </div>
-
-</s:form>
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetRemove.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetRemove.jsp
deleted file mode 100644
index 93fb9b7..0000000
--- a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargetRemove.jsp
+++ /dev/null
@@ -1,42 +0,0 @@
-<%--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  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.  For additional information regarding
-  copyright in this work, please see the NOTICE file in the top level
-  directory of this distribution.
---%>
-<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-
-<h2>
-    <s:text name="pingTarget.confirmRemoveTitle"/>
-</h2>
-
-<p/>
-<s:text name="pingTarget.confirmCommonRemove" />
-<p/>
-
-<table>
-    <tr><td><s:text name="generic.name" />&nbsp;&nbsp;</td><td><b><s:property value="pingTarget.name" /></b></td></tr>
-    <tr><td><s:text name="pingTarget.pingUrl" />&nbsp;&nbsp;</td><td><b><s:property value="pingTarget.pingUrl" /></b></td></tr>
-</table>
-
-<br/>
-
-<div class="control">
-    <s:form>
-		<s:hidden name="salt" />
-        <s:hidden name="pingTargetId" />
-        <s:submit value="%{getText('generic.yes')}" action="commonPingTargets!delete"/>
-        <s:submit value="%{getText('generic.cancel')}" action="commonPingTargets"/>
-    </s:form>
-</div>
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp
index 94c20f6..2fad6cc 100644
--- a/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/admin/PingTargets.jsp
@@ -17,89 +17,287 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<p class="subtitle">
-    <s:text name="commonPingTargets.subtitle" />
-</p>
+<p class="subtitle"><s:text name="commonPingTargets.subtitle"/></p>
 
-<p/><s:text name="commonPingTargets.explanation"/><p/>
+<p><s:text name="commonPingTargets.explanation"/></p>
 
-<table class="rollertable">
 
-<%-- Headings --%>
-<tr class="rollertable">
-    <th class="rollertable" width="20%%"><s:text name="generic.name" /></th>
-    <th class="rollertable" width="55%"><s:text name="pingTarget.pingUrl" /></th>
-    <th class="rollertable" width="15%" colspan="2"><s:text name="pingTarget.autoEnabled" /></th>
-    <th class="rollertable" width="5%"><s:text name="generic.edit" /></th>
-    <th class="rollertable" width="5%"><s:text name="pingTarget.remove" /></th>
-</tr>
+<table class="rollertable table table-striped">
 
-<%-- Listing of current common targets --%>
-<s:iterator var="pingTarget" value="pingTargets" 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="#pingTarget.name" /></td>
-    
-    <td class="rollertable"><s:property value="#pingTarget.pingUrl" /></td>
-    
-    <!-- TODO: Use icons here -->
-    <td class="rollertable" align="center" >
-        <s:if test="#pingTarget.autoEnabled">
-            <span style="color: #00aa00; font-weight: bold;"><s:text name="pingTarget.enabled"/></span>&nbsp;
-        </s:if>
-        <s:else>
-            <span style="color: #aaaaaa; font-weight: bold;"><s:text name="pingTarget.disabled"/></span>&nbsp;
-        </s:else>
-    </td>
-    
-    <!-- TODO: Use icons here -->
-    <td class="rollertable" align="center" >
-        <s:if test="#pingTarget.autoEnabled">
-            <s:url var="disablePing" action="commonPingTargets!disable">
-                <s:param name="pingTargetId" value="#pingTarget.id" />
-            </s:url>
-            <s:a href="%{disablePing}"><s:text name="pingTarget.disable"/></s:a>
-        </s:if>
-        <s:else>
-            <s:url var="enablePing" action="commonPingTargets!enable">
-                <s:param name="pingTargetId" value="#pingTarget.id" />
-            </s:url>
-            <s:a href="%{enablePing}"><s:text name="pingTarget.enable"/></s:a>
-        </s:else>
-    </td>
-    
-    <td class="rollertable" align="center">
-        <s:url var="editPing" action="commonPingTargetEdit">
-            <s:param name="bean.id" value="#pingTarget.id" />
-        </s:url>
-        <s:a href="%{editPing}">
-            <img src='<c:url value="/images/page_white_edit.png"/>' border="0" alt="<s:text name="generic.edit" />" />
-        </s:a>
-    </td>
-    
-    <td class="rollertable" align="center">
-        <s:url var="removePing" action="commonPingTargets!deleteConfirm">
-            <s:param name="pingTargetId" value="#pingTarget.id" />
-        </s:url>
-        <s:a href="%{removePing}">
-            <img src='<c:url value="/images/delete.png"/>' border="0" alt="<s:text name="pingTarget.remove" />" />
-        </s:a>
-    </td>
-    
+    <%-- Headings --%>
+    <tr class="rollertable">
+        <th class="rollertable" width="20%%"><s:text name="generic.name"/></th>
+        <th class="rollertable" width="55%"><s:text name="pingTarget.pingUrl"/></th>
+        <th class="rollertable" width="15%" colspan="2"><s:text name="pingTarget.autoEnabled"/></th>
+        <th class="rollertable" width="5%"><s:text name="generic.edit"/></th>
+        <th class="rollertable" width="5%"><s:text name="pingTarget.remove"/></th>
     </tr>
-</s:iterator>
+
+    <%-- Listing of current common targets --%>
+    <s:iterator var="pingTarget" value="pingTargets" status="rowstatus">
+
+        <tr class="rollertable_odd">
+
+            <td class="rollertable"><s:property value="#pingTarget.name"/></td>
+
+            <td class="rollertable"><s:property value="#pingTarget.pingUrl"/></td>
+
+            <td class="rollertable" align="center">
+                <s:if test="#pingTarget.autoEnabled">
+                    <span style="color: #00aa00; font-weight: bold;"><s:text name="pingTarget.enabled"/></span>&nbsp;
+                </s:if>
+                <s:else>
+                    <span style="color: #aaaaaa; font-weight: bold;"><s:text name="pingTarget.disabled"/></span>&nbsp;
+                </s:else>
+            </td>
+
+            <td class="rollertable" align="center">
+                <s:if test="#pingTarget.autoEnabled">
+                    <s:url var="disablePing" action="commonPingTargets!disable">
+                        <s:param name="pingTargetId" value="#pingTarget.id"/>
+                    </s:url>
+                    <s:a href="%{disablePing}">
+                        <s:text name="pingTarget.disable"/>
+                    </s:a>
+                </s:if>
+                <s:else>
+                    <s:url var="enablePing" action="commonPingTargets!enable">
+                        <s:param name="pingTargetId" value="#pingTarget.id"/>
+                    </s:url>
+                    <s:a href="%{enablePing}">
+                        <s:text name="pingTarget.enable"/></s:a>
+                </s:else>
+            </td>
+
+            <td class="rollertable" align="center">
+                <a href="#" onclick="showAddEditModal('<s:property value="#pingTarget.id"/>',
+                        '<s:property value="#pingTarget.name" />',
+                        '<s:property value="#pingTarget.pingUrl" />'
+                        )">
+                    <span class="glyphicon glyphicon-edit" aria-hidden="true"> </span>
+                </a>
+            </td>
+
+            <td class="rollertable" align="center">
+                <a href="#" onclick="showDeleteModal('<s:property value="#pingTarget.id"/>')">
+                    <span class="glyphicon glyphicon-trash" aria-hidden="true"> </span>
+                </a>
+            </td>
+
+        </tr>
+    </s:iterator>
 
 </table>
 
 <div style="padding: 4px; font-weight: bold;">
     <s:url var="addPing" action="commonPingTargetAdd">
-        <s:param name="weblog" value="actionWeblog.handle" />
+        <s:param name="weblog" value="actionWeblog.handle"/>
     </s:url>
-    <img src='<s:url value="/images/add.png"/>' border="0" alt="icon" /><s:a href="%{addPing}"><s:text name="pingTarget.addTarget" /></s:a>
+    <a href="#" onclick="showAddEditModal()">
+        <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"> </span>
+        <s:text name="pingTarget.addTarget"/>
+    </a>
 </div>
+
+
+<%-- ================================================================================================ --%>
+
+<div id="delete-ping-target-modal" class="modal fade ping-target-modal" tabindex="-1" role="dialog">
+
+    <div class="modal-dialog modal-lg">
+
+        <div class="modal-content">
+
+            <s:form theme="bootstrap" cssClass="form-horizontal">
+                <s:hidden name="salt"/>
+                <s:hidden id="removeId" name="pingTargetId"/>
+
+                <div class="modal-header">
+                    <div class="modal-title">
+                        <h3><s:text name="pingTarget.confirmRemoveTitle"/></h3>
+                    </div>
+                </div>
+
+                <div class="modal-body">
+                    <s:text name="pingTarget.confirmCommonRemove"/>
+                </div>
+
+                <div class="modal-footer">
+                    <s:submit cssClass="btn btn-danger"
+                              value="%{getText('generic.yes')}" action="commonPingTargets!delete"/>
+                    <button type="button" class="btn" data-dismiss="modal">
+                        <s:text name="generic.cancel"/>
+                    </button>
+                </div>
+
+            </s:form>
+
+        </div>
+
+    </div>
+
+</div>
+
+
+<%-- ================================================================================================ --%>
+
+<%-- add/edit link form: a modal --%>
+
+<div id="addedit-pingtarget-modal" class="modal fade addedit-pingtarget-modal" tabindex="-1" role="dialog">
+
+    <div class="modal-dialog modal-lg">
+
+        <div class="modal-content">
+
+            <div class="modal-header">
+
+                <s:if test="actionName == 'commonPingTargetEdit'">
+                    <s:set var="subtitleKey">pingTargetEdit.subtitle</s:set>
+                </s:if>
+                <s:else>
+                    <s:set var="subtitleKey">pingTargetAdd.subtitle</s:set>
+                </s:else>
+
+                <div class="modal-title">
+                    <h3> <s:text name="%{#subtitleKey}"> </s:text> </h3>
+                </div>
+
+            </div> <%-- modal header --%>
+
+            <div class="modal-body">
+
+                <s:form id="pingTargetEditForm" theme="bootstrap" cssClass="form-horizontal">
+                    <s:hidden name="bean.id"/>
+                    <s:hidden name="salt"/>
+                    <s:hidden name="actionName"/>
+
+                    <s:textfield name="bean.name" size="30" maxlength="30" style="width:50%"
+                                 onchange="validate()" onkeyup="validate()"
+                                 label="%{getText('generic.name')}" />
+
+                    <s:textfield name="bean.pingUrl" size="100" maxlength="255" style="width:50%"
+                                 onchange="validate()" onkeyup="validate()"
+                                 label="%{getText('pingTarget.pingUrl')}" />
+                </s:form>
+
+            </div> <%-- modal body --%>
+
+            <div class="modal-footer">
+
+                <p id="feedback-area-edit"></p>
+
+                <button type="button" id="save_ping_target" onclick="savePingTarget()" class="btn btn-success">
+                    <s:text name="generic.save"/>
+                </button>
+
+                <button type="button" class="btn" data-dismiss="modal">
+                    <s:text name="generic.cancel"/>
+                </button>
+
+            </div> <%-- modal footer --%>
+
+        </div> <%-- modal content --%>
+
+    </div> <%-- modal dialog --%>
+
+</div> <%-- modal --%>
+
+
+<%-- page reload mechanism --%>
+<s:form action="commonPingTargets!execute">
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog"/>
+</s:form>
+
+
+<%-- ================================================================================================ --%>
+
+<script>
+
+    function showDeleteModal( removeId ) {
+        $('#removeId').val(removeId);
+        $('#delete-ping-target-modal').modal({show: true});
+    }
+
+    function showAddEditModal(pingTargetId, name, url) {
+        if ( pingTargetId ) {
+            $('#pingTargetEditForm_actionName:first').val("commonPingTargetEdit");
+            $('#pingTargetEditForm_bean_id:first').val(pingTargetId);
+            $('#pingTargetEditForm_bean_name:first').val(name);
+            $('#pingTargetEditForm_bean_pingUrl:first').val(url);
+        } else {
+            $('#pingTargetEditForm_actionName:first').val("commonPingTargetAdd");
+            $('#pingTargetEditForm_bean_name:first').val("");
+            $('#pingTargetEditForm_bean_pingUrl:first').val("");
+        }
+        $('#addedit-pingtarget-modal').modal({show: true});
+    }
+
+    function validate() {
+        var savePingTargetButton = $('#save-button:first');
+        var name = $('#pingTargetEditForm_bean_name:first').val().trim();
+        var url = $('#pingTargetEditForm_bean_pingUrl:first').val().trim();
+        if ( name.length > 0 && url.length > 0 && isValidUrl(url) ) {
+            savePingTargetButton.attr("disabled", false);
+        } else {
+            savePingTargetButton.attr("disabled", true);
+        }
+    }
+
+    function isValidUrl(url) {
+        if (/^(http|https|ftp):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/i.test(url)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    $( document ).ready(function() {
+        var savePingTargetButton = $('#save-button:first');
+        savePingTargetButton.attr("disabled", true);
+    });
+
+    function viewChanged() {
+        var form = $("#commonPingTargets")[0];
+        form.submit();
+    }
+
+    function savePingTarget() {
+
+        var feedbackAreaEdit = $("#feedback-area-edit");
+
+        var actionName = $('#pingTargetEditForm_actionName:first').val();
+
+        // post ping target via AJAX
+        $.ajax({
+            method: 'post',
+            url: actionName + ".rol#save",
+            data: $("#pingTargetEditForm").serialize(),
+            context: document.body
+
+        }).done(function (data) {
+
+            // kludge: scrape response status from HTML returned by Struts
+            var alertEnd = data.indexOf("ALERT_END");
+            var notUnique = data.indexOf("<s:text name='pingTarget.nameNotUnique' />");
+            if (notUnique > 0 && notUnique < alertEnd) {
+                feedbackAreaEdit.css("color", "red");
+                feedbackAreaEdit.html('<s:text name="pingTarget.nameNotUnique" />');
+
+            } else {
+                feedbackAreaEdit.css("color", "green");
+                feedbackAreaEdit.html('<s:text name="generic.success" />');
+                $('#addedit-pingtarget-modal').modal("hide");
+
+                // cause page to be reloaded so that edit appears
+                viewChanged();
+            }
+
+        }).error(function (data) {
+            feedbackAreaEdit.html('<s:text name="generic.error.check.logs" />');
+            feedbackAreaEdit.css("color", "red");
+        });
+    }
+
+</script>
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetConfig.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetConfig.jsp
index c9a6607..936a426 100644
--- a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetConfig.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetConfig.jsp
@@ -19,67 +19,55 @@
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
 
-<p class="subtitle"><s:text name="planetConfig.subtitle" /></a>
-<p><s:text name="planetConfig.prompt" /></a>
+<p class="subtitle"><s:text name="planetConfig.subtitle"/></p>
+<p><s:text name="planetConfig.prompt"/></p>
 
-<s:form action="planetConfig!save">
-	<s:hidden name="salt" />
 
-    <table class="formtableNoDesc">
-    
+<s:form action="planetConfig!save" theme="bootstrap" cssClass="form-horizontal">
+    <s:hidden name="salt"/>
+
     <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 var="pd" value="#dg.propertyDefs">
-            
-            <tr>
-                <td class="label"><s:text name="%{#pd.key}" /></td>
-              
-                  <%-- "string" type means use a simple textbox --%>
-                  <s:if 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:if>
-                  
-                  <%-- "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>
-          
+
+            <%-- "string" type means use a simple textbox --%>
+            <s:if test="#pd.type == 'string'">
+                <s:textfield name="%{#pd.name}" label="%{getText(#pd.key)}" size="35"
+                             value="%{properties[#pd.name].value} "/>
+            </s:if>
+
+            <%-- "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)}" cssClass="boolean"
+                                fieldValue="true" checked="true" onchange="formChanged()"/>
+                </s:if>
+                <s:if test="properties[#pd.name].value != 'true'">
+                    <s:checkbox name="%{#pd.name}" label="%{getText(#pd.key)}" cssClass="boolean"
+                                fieldValue="false" onchange="formChanged()"/>
+                </s:if>
+
+            </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 class="btn btn-default" type="submit" value="<s:text name="generic.save"/>"/>
+
 </s:form>
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSidebar.jsp
new file mode 100644
index 0000000..970ad33
--- /dev/null
+++ b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSidebar.jsp
@@ -0,0 +1,34 @@
+<%--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  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.  For additional information regarding
+  copyright in this work, please see the NOTICE file in the top level
+  directory of this distribution.
+--%>
+<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
+
+
+<%-- ================================================================== --%>
+<%-- add new custom planet group --%>
+
+<h3><s:text name="mainPage.actions"/></h3>
+<hr size="1" noshade="noshade"/>
+
+<s:url var="createNewUrl" action="planetGroupSubs" namespace="/roller-ui/admin">
+    <s:param name="createNew">true</s:param>
+</s:url>
+
+<s:a href="%{createNewUrl}">
+    <span class="glyphicon glyphicon-plus" aria-hidden="true"> </span>
+    Create new Custom Planet Group
+</s:a>
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSubs.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSubs.jsp
new file mode 100644
index 0000000..be7ee80
--- /dev/null
+++ b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSubs.jsp
@@ -0,0 +1,164 @@
+<%--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  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.  For additional information regarding
+  copyright in this work, please see the NOTICE file in the top level
+  directory of this distribution.
+--%>
+<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
+
+        
+<%-- ================================================================== --%>
+<%-- add/edit custom planet group form --%>
+
+
+<%-- title for default planet group --%>
+<s:if test="groupHandle == 'all'" >
+    <p class="subtitle"><s:text name="planetGroupSubs.default.subtitle" /></p>
+    <p><s:text name="planetGroupSubs.default.desc" /></p>
+</s:if>
+
+<%-- title for a custom planet group --%>
+<s:else>
+    <s:if test="createNew">
+        <p class="subtitle">
+            <s:text name="planetGroupSubs.custom.subtitle.new" />
+        </p>
+    </s:if>
+    <s:else>
+        <p class="subtitle">
+            <s:text name="planetGroupSubs.custom.subtitle" >
+                <s:param value="groupHandle" />
+            </s:text>
+        </p>
+    </s:else>
+    <p><s:text name="planetGroupSubs.custom.desc" /></p>
+</s:else>
+
+
+<%-- only show edit form for custom group --%>
+<s:if test="groupHandle != 'all'">
+
+    <div class="panel panel-default">
+        <div class="panel-heading">
+            <p><s:text name="planetGroupSubs.properties"/></p>
+        </div>
+        <div class="panel-body">
+            <s:if test="createNew">
+                <s:text name="planetGroupSubs.creatingNewGroup" />
+            </s:if>
+            <s:else>
+                <s:text name="planetGroupSubs.editingExistingGroup" />
+            </s:else>
+
+            <s:form action="planetGroupSubs!saveGroup" theme="bootstrap" cssClass="form-horizontal" style="margin-top:1em">
+                <s:hidden name="salt"/>
+                <s:hidden name="group.id"/>
+
+                <s:textfield name="group.title" size="40" maxlength="255"
+                             onchange="validate()" onkeyup="validate()"
+                             label="%{getText('planetGroups.title')}"
+                             tooltip="%{getText('planetGroups.tip.title')}"/>
+
+                <s:textfield name="group.handle" size="40" maxlength="255"
+                             onchange="validate()" onkeyup="validate()"
+                             label="%{getText('planetGroups.handle')}"
+                             tooltip="%{getText('planetGroups.tip.handle')}"/>
+
+
+                <div class="form-group ">
+                    <label class="col-sm-3 control-label"></label>
+                    <div class="col-sm-9 controls">
+                        <s:submit value="%{getText('generic.save')}" cssClass="btn btn-default"/>
+                        <s:if test="createNew">
+                            <input type="button" class="btn"
+                                   value='<s:text name="generic.cancel" />'
+                                   onclick="window.location='<s:url action="planetGroups"/>'"/>
+                        </s:if>
+                    </div>
+                </div>
+
+            </s:form>
+
+        </div>
+    </div>
+
+</s:if>
+
+
+<%-- ================================================================== --%>
+<%-- table of planet group's subscription  --%>
+
+<s:if test="!createNew">
+
+    <h3><s:text name="planetGroupSubs.subscriptions"/></h3>
+    <s:text name="planetGroupSubs.subscriptionDesc" />
+
+    <s:if test="%{subscriptions.isEmpty()}">
+        <s:if test="groupHandle == 'all'">
+            <s:text name="planetGroupSubs.noneDefinedDefault" />
+        </s:if>
+        <s:else>
+            <s:text name="planetGroupSubs.noneDefinedCustom" />
+        </s:else>
+    </s:if>
+    <s:else>
+
+        <table class="table">
+            <tr>
+                <th width="30%"> <s:text name="planetGroupSubs.column.title"/> </th>
+                <th width="55%"> <s:text name="planetGroupSubs.column.feedUrl"/> </th>
+                <th width="15%"> <s:text name="generic.delete"/> </th>
+            </tr>
+
+            <s:iterator var="sub" value="subscriptions">
+                <tr>
+                    <td class="rollertable"><s:property value="#sub.title"/></td>
+                    <td><s:set var="feedURL" value="#sub.feedURL"/> ${fn:substring(feedURL, 0, 100)} </td>
+                    <td>
+                        <a href="javascript: void(0);" onclick="confirmDelete('<s:property value="feedURL"/>')">
+                            <span class="glyphicon glyphicon-remove" aria-hidden="true"> </span>
+                            <s:text name="generic.delete"/>
+                        </a>
+                    </td>
+                </tr>
+            </s:iterator>
+        </table>
+
+        <%-- planet subscription delete logic --%>
+
+        <s:form action="planetGroupSubs!deleteSubscription" id="deleteForm">
+            <s:hidden name="salt"/>
+            <s:hidden name="group.handle"/>
+            <input type="hidden" name="subUrl"/>
+        </s:form>
+
+    </s:else>
+
+</s:if>
+
+
+<%-- ================================================================== --%>
+
+<script>
+
+    function confirmDelete(subUrl) {
+        if (window.confirm('<s:text name="planetGroupSubs.delete.confirm" />')) {
+            var form = $("#deleteForm");
+            form.find('input[name="subUrl"]').val(subUrl);
+            form.find('input[name="groupHandle"]').val('<s:property value="groupHandle" />');
+            form.submit();
+        }
+    }
+
+</script>
\ No newline at end of file
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSubsSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSubsSidebar.jsp
new file mode 100644
index 0000000..a46e1bb
--- /dev/null
+++ b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroupSubsSidebar.jsp
@@ -0,0 +1,72 @@
+<%--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  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.  For additional information regarding
+  copyright in this work, please see the NOTICE file in the top level
+  directory of this distribution.
+--%>
+<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
+
+
+<%-- ================================================================== --%>
+<%-- add new planet feed subscription --%>
+
+<s:if test="!createNew">
+
+    <h3><s:text name="mainPage.actions"/></h3>
+    <hr size="1" noshade="noshade"/>
+
+    <s:text name="planetGroupSubs.addFeed"/>
+
+    <s:form action="planetGroupSubs!saveSubscription"
+            theme="bootstrap" cssClass="form-horizontal" style="margin-top:1em">
+        <s:hidden name="salt"/>
+        <s:hidden name="group.handle"/>
+
+        <s:textfield name="subUrl" size="40" maxlength="255" label="%{getText('planetSubscription.feedUrl')}"
+            onchange="validateUrl()" onkeyup="validateUrl()" />
+
+        <p id="feedback-area" style="clear:right; width:100%"></p>
+
+        <s:submit value="%{getText('generic.save')}" cssClass="btn btn-default" />
+
+    </s:form>
+
+    <script>
+
+        function validateUrl() {
+            var feedbackArea = $("#feedback-area");
+            var url = $("#planetGroupSubs_subUrl").val();
+            var saveButton = $('#planetGroupSubs_0');
+
+            if (url && url.trim() !== '') {
+                if (!isValidUrl(url)) {
+                    saveButton.attr("disabled", true);
+                    feedbackArea.html('<s:text name="planetGroupSubs.badFeedURL" />');
+                    feedbackArea.css("color", "red");
+                    return;
+                }
+            }
+
+            feedbackArea.html('');
+            saveButton.attr("disabled", false);
+        }
+
+        $( document ).ready(function() {
+            var saveButton = $('#planetGroupSubs_0');
+            saveButton.attr("disabled", true);
+        });
+    </script>
+
+</s:if>
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroups.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroups.jsp
index f518ac6..6223ee3 100644
--- a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroups.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetGroups.jsp
@@ -17,109 +17,69 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<p class="subtitle"><s:text name="planetGroups.subtitle" /></p>
+<p class="subtitle"><s:text name="planetGroups.subtitle"/></p>
 
-<p>
-    <s:if test="group == null" >
-        <s:text name="planetGroups.prompt.add" />
-    </s:if>
-    <s:else>
-        <s:text name="planetGroups.prompt.edit" />
-    </s:else>
-</p>
 
-<s:form action="planetGroups!save">
-	<s:hidden name="salt" />
-    <s:hidden name="bean.id" />
-    
-    <div class="formrow">
-        <label for="bean.title" class="formrow" /><s:text name="planetGroups.title" /></label>
-        <s:textfield name="bean.title" size="40" maxlength="255" />
-        <img src="<s:url value="/images/help.png"/>" alt="help" title='<s:text name="planetGroups.tip.title" />' />
-    </div>
-    
-    <div class="formrow">
-        <label for="bean.handle" class="formrow" /><s:text name="planetGroups.handle" /></label>
-        <s:textfield name="bean.handle" size="40" maxlength="255" />
-        <img src="<s:url value="/images/help.png"/>" alt="help" title='<s:text name="planetGroups.tip.handle" />' />
-    </div>
-    
-    <p />
-    
-    <div class="formrow">
-        <label class="formrow" />&nbsp;</label>
-        <s:submit value="%{getText('generic.save')}" />
-        &nbsp;
-        <input type="button" 
-               value='<s:text name="generic.cancel" />'
-               onclick="window.location='<s:url action="planetGroups"/>'"/>
-        
-        <s:if test="group != null" >
-            &nbsp;&nbsp;
-            <s:url var="deleteUrl" action="planetGroups!delete">
-                <s:param name="bean.id" value="%{bean.id}" />
-            </s:url>
-            <input type="button" 
-                   value='<s:text name="generic.delete" />'
-                   onclick="window.location='<s:property value="%{deleteUrl}"/>'" />
-        </s:if>
-    </div>
-    
-</s:form>
+<%-- ================================================================== --%>
+<%-- table of custom planet groups (excluding the default group) --%>
 
-<br style="clear:left" />
+<s:if test="%{!groups.isEmpty()}">
 
-<h2><s:text name="planetGroups.existingTitle" /></h2>
-<p><i><s:text name="planetGroups.existingPrompt" /></i></p>
+    <table class="table">
 
-<table class="rollertable">
-<tr class="rHeaderTr">
-    <th class="rollertable" width="30%">
-        <s:text name="planetGroups.column.title" />
-    </th>
-    <th class="rollertable" width="50%">
-        <s:text name="planetGroups.column.handle" />
-    </th>
-    <th class="rollertable" width="10%">
-        <s:text name="generic.edit" />
-    </th>
-    <th class="rollertable" width="10%">
-        <s:text name="planetGroups.column.subscriptions" />
-    </th>
-</tr>
+        <tr>
+            <th width="50%"> <s:text name="planetGroups.column.title"/> </th>
+            <th width="20%"> <s:text name="planetGroups.column.handle"/> </th>
+            <th width="15%"> <s:text name="generic.edit"/> </th>
+            <th width="15%"> <s:text name="generic.delete"/> </th>
+        </tr>
 
-<s:iterator var="group" value="groups" 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="#group.title" />
-    </td>
-    
-    <td class="rollertable">
-        <s:property value="#group.handle" />
-    </td>
-    
-    <td class="rollertable">
-        <s:url var="groupUrl" action="planetGroups">
-            <s:param name="bean.id" value="#group.id" />
-        </s:url>
-        <s:a href="%{groupUrl}"><img src='<s:url value="/images/page_white_edit.png"/>' border="0" alt="icon" 
-                                     title="<s:text name='planetGroups.edit.tip' />" /></s:a>
-    </td>       
-    
-    <td class="rollertable">
-        <s:url var="subUrl" action="planetSubscriptions">
-            <s:param name="groupHandle" value="#group.handle" />
-        </s:url>
-        <s:a href="%{subUrl}"><img src='<s:url value="/images/page_white_edit.png"/>' border="0" alt="icon" 
-                                   title="<s:text name='planetGroups.subscriptions.tip' />" /></s:a>
-    </td>       
-    
-    </tr>
-</s:iterator>
-</table>
+        <s:iterator var="group" value="groups">
+            <tr>
+                <td> <s:property value="#group.title"/> </td>
+                <td> <s:property value="#group.handle"/> </td>
+
+                <td>
+                    <s:url var="groupUrl" action="planetGroupSubs">
+                        <s:param name="group.id" value="#group.id"/>
+                    </s:url>
+                    <s:a href="%{groupUrl}">
+                        <span class="glyphicon glyphicon-edit" aria-hidden="true"></span>
+                        <s:text name='generic.edit'/>
+                    </s:a>
+                </td>
+
+                <td>
+                    <a href="javascript: void(0);" onclick="confirmDelete('<s:property value="#group.handle"/>')">
+                        <span class="glyphicon glyphicon-remove" aria-hidden="true"> </span>
+                        <s:text name="generic.delete"/>
+                    </a>
+                </td>
+
+            </tr>
+        </s:iterator>
+
+    </table>
+
+    <%-- planet group delete logic --%>
+
+    <s:form action="planetGroups!delete" id="deleteForm">
+        <input type="hidden" name="salt" value='<s:property value="salt" />' />
+        <input type="hidden" name="group.handle"/>
+    </s:form>
+
+    <script>
+        function confirmDelete(groupHandle) {
+            if (window.confirm('<s:text name="planetGroups.delete.confirm" />')) {
+                var form = $("#deleteForm");
+                form.find('input[name="group.handle"]').val(groupHandle);
+                form.submit();
+            }
+        }
+    </script>
+
+</s:if>
+<s:else>
+    <s:text name="planetGroups.noneDefined"/>
+</s:else>
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetSubscriptions.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/PlanetSubscriptions.jsp
deleted file mode 100644
index 32b9e41..0000000
--- a/app/src/main/webapp/WEB-INF/jsps/admin/PlanetSubscriptions.jsp
+++ /dev/null
@@ -1,101 +0,0 @@
-<%--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  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.  For additional information regarding
-  copyright in this work, please see the NOTICE file in the top level
-  directory of this distribution.
---%>
-<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-
-<script>
-function confirmSubDelete(subUrl) {
-  if (window.confirm('Are you sure you want to remove this subscription?')) {
-    document.location.href='<s:url action="planetSubscriptions!delete" />?groupHandle=<s:property value="groupHandle"/>&subUrl='+encodeURIComponent(subUrl);
-  }
-}
-</script>
-        
-      
-<s:if test="groupHandle == 'all'" >
-    <p class="subtitle"><s:text name="planetSubscriptions.subtitle.addMain" /></p>
-    <p><s:text name="planetSubscriptions.prompt.addMain" /></p>
-</s:if>
-<s:else>
-    <p class="subtitle">
-        <s:text name="planetSubscriptions.subtitle.add" >
-            <s:param value="groupHandle" />
-        </s:text>
-    </p>
-    <p><s:text name="planetSubscriptions.prompt.add" /></p>
-</s:else>
-
-
-<s:form action="planetSubscriptions!save">
-	<s:hidden name="salt" />
-    <s:hidden name="groupHandle" />
-    
-    <div class="formrow">
-        <label for="feedURL" class="formrow" /><s:text name="planetSubscription.feedUrl" /></label>
-        <s:textfield name="subUrl" size="40" maxlength="255" />
-        &nbsp;<s:submit value="%{getText('generic.save')}" />
-    </div>
-</s:form>
-
-<br style="clear:left" />
-
-<h2>
-    <s:text name="planetSubscriptions.existingTitle" />
-    <s:if test="groupHandle != 'all'" >
-        &nbsp;[group: <s:property value="groupHandle" />]
-    </s:if>
-</h2>
-
-<table class="rollertable">
-    <tr class="rHeaderTr">
-        <th class="rollertable" width="30%">
-            <s:text name="planetSubscriptions.column.title" />
-        </th>
-        <th class="rollertable" width="60%">
-            <s:text name="planetSubscriptions.column.feedUrl" />
-        </th>
-        <th class="rollertable" width="10%">
-            <s:text name="generic.delete" />
-        </th>
-    </tr>
-    <s:iterator var="sub" value="subscriptions" 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="#sub.title" />
-        </td>
-        
-        <td class="rollertable">
-            <s:set var="feedURL" value="#sub.feedURL" />
-            ${fn:substring(feedURL, 0, 100)}
-        </td>
-        
-        <td class="rollertable">
-            <img src='<s:url value="/images/delete.png"/>' />
-            <a href="javascript: void(0);" onclick="confirmSubDelete('<s:property value="feedURL"/>')">
-                <s:text name="generic.delete"/>
-            </a>
-        </td>       
-        
-        </tr>
-    </s:iterator>
-</table>
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/UserAdmin.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/UserAdmin.jsp
index f822594..6310997 100644
--- a/app/src/main/webapp/WEB-INF/jsps/admin/UserAdmin.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/admin/UserAdmin.jsp
@@ -21,35 +21,38 @@
 <%@ include file="/roller-ui/scripts/ajax-user.js" %>
 </script>
 
-<p class="subtitle"><s:text name="userAdmin.subtitle.searchUser" /></p>
-<p><s:text name="userAdmin.prompt.searchUser" /></p>
+<p class="subtitle">
+<b><s:text name="userAdmin.subtitle.searchUser" /></b>
+<s:text name="userAdmin.prompt.searchUser" />
+</p>
 
-<s:form action="modifyUser" method="GET">
+<s:form action="userAdmin!edit" method="POST" theme="bootstrap" cssClass="form-vertical">
    	<s:hidden name="salt" />
- 
-    <span style="margin:4px"><s:text name="inviteMember.userName" /></span>
-    <input name="bean.userName" id="userName" size="30" maxlength="30"
-           onfocus="onUserNameFocus(null)" onkeyup="onUserNameChange(null)" 
-           style="margin:4px" />
-    <input type="submit" value='<s:text name="generic.edit" />'
-           style="margin:4px" />
-    <br />
-    <select id="userList" size="10" onchange="onUserSelected()" 
-            style="width:400px; margin:4px" ></select>
-    
+
+    <s:textfield cssClass="form-control"
+        id="userName"
+        name="bean.userName"
+        label="%{getText('inviteMember.userName')}"
+        onfocus="onUserNameFocus(null)"
+        onkeyup="onUserNameChange(null)" />
+
+    <s:select class="form-control" id="userList" size="10" onchange="onUserSelected()" list="bean.list" />
+
+    <button type="submit" class="btn btn-default" id="user-submit">
+        <s:text name="generic.edit" />
+    </button>
+
 </s:form>
 
-<%-- LDAP uses external user creation --%>
-<s:if test="authMethod != 'LDAP'">
-    <p class="subtitle"><s:text name="userAdmin.subtitle.userCreation" /></p>
+<s:if test="authMethod != 'LDAP'"> <%-- if we're not doing LDAP we can create new users in Roller --%>
+
+    <h3><s:text name="userAdmin.subtitle.userCreation" /></h3>
     <s:text name="userAdmin.prompt.orYouCan" />
     <s:url action="createUser" var="createUser" />
     <a href="<s:property value="createUser" />">
         <s:text name="userAdmin.prompt.createANewUser" />
     </a>
+
 </s:if>
 
-<%-- this forces focus to the userName field --%>
-<script>
-    document.getElementById('userName').focus();
-</script>
+<script> document.getElementById('userName').focus(); </script>
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/UserEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/admin/UserEdit.jsp
index 79b08ef..9478e9c 100644
--- a/app/src/main/webapp/WEB-INF/jsps/admin/UserEdit.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/admin/UserEdit.jsp
@@ -15,16 +15,17 @@
   copyright in this work, please see the NOTICE file in the top level
   directory of this distribution.
 --%>
-<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> 
+<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
+
 
 <%-- Titling, processing actions different between add and edit --%>
-<s:if test="actionName == 'modifyUser'">
-    <s:set var="subtitleKey">userAdmin.subtitle.editUser</s:set>
-    <s:set var="mainAction">modifyUser</s:set>
-</s:if>
-<s:else>
+<s:if test="actionName == 'createUser'">
     <s:set var="subtitleKey">userAdmin.subtitle.createNewUser</s:set>
     <s:set var="mainAction">createUser</s:set>
+</s:if>
+<s:else>
+    <s:set var="subtitleKey">userAdmin.subtitle.editUser</s:set>
+    <s:set var="mainAction">modifyUser</s:set>
 </s:else>
 
 <p class="subtitle">
@@ -38,116 +39,76 @@
         <s:text name="userAdmin.addInstructions"/>
     </s:if>
     <s:if test="authMethod == 'DB_OPENID'">
-        <p class="pagetip">
-            <s:text name="userAdmin.noPasswordForOpenID"/>
-        </p>
+         <s:text name="userAdmin.noPasswordForOpenID"/>
     </s:if>
 </p>
 
-<s:form>
+<s:form theme="bootstrap" cssClass="form-horizontal">
 	<s:hidden name="salt" />
     <s:if test="actionName == 'modifyUser'">
         <%-- bean for add does not have a bean id yet --%>
         <s:hidden name="bean.id" />
     </s:if>
 
-    <table class="formtable">
-        <tr>
-            <td class="label"><label for="userName" /><s:text name="userSettings.username" /></label></td>
-            <td class="field">
-                <s:if test="actionName == 'modifyUser'">
-                    <s:textfield name="bean.userName" size="30" maxlength="30" readonly="true" cssStyle="background: #e5e5e5" />
-                </s:if>
-                <s:else>
-                    <s:textfield name="bean.userName" size="30" maxlength="30" />
-                </s:else>
-            </td>
-            <td class="description">
-                <s:if test="actionName == 'modifyUser'">
-                    <s:text name="userSettings.tip.username" />
-                </s:if>
-                <s:else>
-                    <s:text name="userAdmin.tip.userName" />
-                </s:else>
-            </td>
-        </tr>
-
-        <tr>
-            <td class="label"><label for="screenName" /><s:text name="userSettings.screenname" /></label></td>
-            <td class="field"><s:textfield name="bean.screenName" size="30" maxlength="30" /></td>
-            <td class="description"><s:text name="userAdmin.tip.screenName" /></td>
-        </tr>
-        
-        <tr>
-            <td class="label"><label for="fullName" /><s:text name="userSettings.fullname" /></label></td>
-            <td class="field"><s:textfield name="bean.fullName" size="30" maxlength="30" /></td>
-            <td class="description"><s:text name="userAdmin.tip.fullName" /></td>
-        </tr>
-        
-        <s:if test="authMethod == 'ROLLERDB' || authMethod == 'DB_OPENID'">
-            <tr>
-                <td class="label"><label for="passwordText" /><s:text name="userSettings.password" /></label></td>
-                <td class="field"><s:password name="bean.password" size="20" maxlength="20" /></td>
-                <td class="description"><s:text name="userAdmin.tip.password" /></td>
-            </tr>
-        </s:if>
-
-        <s:if test="authMethod == 'OPENID' || authMethod == 'DB_OPENID'">
-            <tr>
-                <td class="label"><label for="openIdUrl" /><s:text name="userSettings.openIdUrl" /></label></td>
-                <td class="field"><s:textfield name="bean.openIdUrl" size="40" maxlength="255" style="width:75%" id="f_openid_identifier" /></td>
-                <td class="description"><s:text name="userAdmin.tip.openIdUrl" /></td>
-            </tr>
-        </s:if>
-
-        <tr>
-            <td class="label"><label for="emailAddress" /><s:text name="userSettings.email" /></label></td>
-            <td class="field"><s:textfield name="bean.emailAddress" size="40" maxlength="40" /></td>
-            <td class="description"><s:text name="userAdmin.tip.email" /></td>
-        </tr>
-        
-        <tr>
-            <td class="label"><label for="locale" /><s:text name="userSettings.locale" /></label></td>
-            <td class="field">
-                <s:select name="bean.locale" size="1" list="localesList" listValue="displayName" />
-            </td>
-            <td class="description"><s:text name="userAdmin.tip.locale" /></td>
-        </tr>
-        
-        <tr>
-            <td class="label"><label for="timeZone" /><s:text name="userSettings.timeZone" /></label></td>
-            <td class="field">
-                <s:select name="bean.timeZone" size="1" list="timeZonesList" />
-            </td>
-            <td class="description"><s:text name="userAdmin.tip.timeZone" /></td>
-        </tr>
-        
-        <tr>
-            <td class="label"><label for="userEnabled" /><s:text name="userAdmin.enabled" /></label></td>
-            <td class="field">
-                <s:checkbox name="bean.enabled" />
-            </td>
-            <td class="description"><s:text name="userAdmin.tip.enabled" /></td>
-        </tr>
-        
-        <tr>
-            <td class="label"><label for="userAdmin" /><s:text name="userAdmin.userAdmin" /></label></td>
-            <td class="field">
-                <s:checkbox name="bean.administrator" />
-            </td>
-            <td class="description"><s:text name="userAdmin.tip.userAdmin" /></td>
-        </tr>
-        
-    </table>
-    
-    <br />
-    
     <s:if test="actionName == 'modifyUser'">
-        <p class="subtitle"><s:text name="userAdmin.userWeblogs" /></p>
+        <s:textfield name="bean.userName" size="30" maxlength="30"
+                label="%{getText('userSettings.username')}"
+                tooltip="%{getText('userSettings.tip.username')}"
+                readonly="true" cssStyle="background: #e5e5e5" />
+    </s:if>
+    <s:else>
+        <s:textfield name="bean.userName" size="30" maxlength="30"
+                label="%{getText('userSettings.username')}"
+                tooltip="%{getText('userAdmin.tip.username')}" />
+    </s:else>
+
+    <s:textfield name="bean.screenName" size="30" maxlength="30"
+                label="%{getText('userSettings.screenname')}"
+                tooltip="%{getText('userAdmin.tip.screenName')}" />
+
+    <s:textfield name="bean.fullName" size="30" maxlength="30"
+                 label="%{getText('userSettings.fullname')}"
+                 tooltip="%{getText('userAdmin.tip.fullName')}" />
+
+    <s:if test="authMethod == 'ROLLERDB' || authMethod == 'DB_OPENID'">
+        <s:password name="bean.password" size="30" maxlength="30"
+                     label="%{getText('userSettings.password')}"
+                     tooltip="%{getText('userAdmin.tip.password')}" />
+    </s:if>
+
+    <s:if test="authMethod == 'OPENID' || authMethod == 'DB_OPENID'">
+        <s:textfield name="bean.openIdUrl" size="30" maxlength="255" id="f_openid_identifier"
+                     label="%{getText('userSettings.openIdUrl')}"
+                     tooltip="%{getText('userAdmin.tip.openIdUrl')}" />
+    </s:if>
+
+    <s:textfield name="bean.emailAddress" size="30" maxlength="30"
+                 label="%{getText('userSettings.email')}"
+                 tooltip="%{getText('userAdmin.tip.email')}" />
+
+    <s:select name="bean.locale" size="1" list="localesList" listValue="displayName"
+                 label="%{getText('userSettings.locale')}"
+                 tooltip="%{getText('userAdmin.tip.locale')}" />
+
+    <s:select name="bean.timeZone" size="1" list="timeZonesList"
+                 label="%{getText('userSettings.timeZone')}"
+                 tooltip="%{getText('userAdmin.tip.timeZone')}" />
+
+    <s:checkbox name="bean.enabled" size="30" maxlength="30"
+                 label="%{getText('userAdmin.enabled')}"
+                 tooltip="%{getText('userAdmin.tip.userEnabled')}" />
+
+    <s:checkbox name="bean.administrator" size="30" maxlength="30"
+                 label="%{getText('userAdmin.userAdmin')}"
+                 tooltip="%{getText('userAdmin.tip.userAdmin')}" />
+
+
+    <s:if test="actionName == 'modifyUser'">
+        <h2><s:text name="userAdmin.userWeblogs" /></h2>
 
         <s:if test="permissions != null && !permissions.isEmpty() > 0">
             <p><s:text name="userAdmin.userMemberOf" />:</p>
-            <table class="rollertable" style="width: 80%">
+            <table class="table" style="width: 80%">
                 <s:iterator var="perms" value="permissions">
                     <tr>
                         <td width="%30">
@@ -192,8 +153,8 @@
     <br />
 
     <div class="control">
-        <s:submit value="%{getText('generic.save')}" action="%{#mainAction}!save"/>
-        <s:submit value="%{getText('generic.cancel')}" action="modifyUser!cancel" />
+        <s:submit cssClass="btn btn-default" value="%{getText('generic.save')}" action="%{#mainAction}!save"/>
+        <s:submit cssClass="btn" value="%{getText('generic.cancel')}" action="modifyUser!cancel" />
     </div>
-    
+
 </s:form>
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/CreateDatabase.jsp b/app/src/main/webapp/WEB-INF/jsps/core/CreateDatabase.jsp
index 85bf5ed..66db1ca 100644
--- a/app/src/main/webapp/WEB-INF/jsps/core/CreateDatabase.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/core/CreateDatabase.jsp
@@ -55,7 +55,7 @@
 
     <s:form action="install!create">
 		<s:hidden name="salt" />
-        <s:submit value="%{getText('installer.yesCreateTables')}" />
+        <s:submit value="%{getText('installer.yesCreateTables')}" cssClass="btn btn-default" />
     </s:form>
     
 </s:else>
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/CreateWeblog.jsp b/app/src/main/webapp/WEB-INF/jsps/core/CreateWeblog.jsp
index 2d615e5..88ca6f8 100644
--- a/app/src/main/webapp/WEB-INF/jsps/core/CreateWeblog.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/core/CreateWeblog.jsp
@@ -16,109 +16,133 @@
   directory of this distribution.
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-<script src="<s:url value="/roller-ui/scripts/jquery-2.1.1.min.js" />"></script>
-<script src="<s:url value='/webjars/angular/1.2.29/angular.min.js' />"></script>
 
-<script>
-function handlePreview(handle) {
-    previewSpan = document.getElementById("handlePreview");
-    var n1 = previewSpan.childNodes[0];
-    var n2 = document.createTextNode(handle.value);
-    if (handle.value == null) {
-	    previewSpan.appendChild(n2);
-    } else {
-	    previewSpan.replaceChild(n2, n1);
-    }
-}
-</script>
+<p class="subtitle"><s:text name="createWebsite.prompt"/></p>
 
-<p class="subtitle"><s:text name="createWebsite.prompt" /></p>
+<br/>
 
-<br />
+<s:form action="createWeblog!save" theme="bootstrap" cssClass="form-horizontal">
 
-<s:form action="createWeblog!save">
-<s:hidden name="salt" />
+    <s:hidden name="salt"/>
 
-<table class="formtable">
+    <s:textfield label="%{getText('generic.name')}"
+                 tooltip="%{getText('createWebsite.tip.name')}" onkeyup="formChanged()"
+                 name="bean.name" size="30" maxlength="30"/>
 
-<tr>
-    <td class="label"><label for="name"><s:text name="generic.name" /></label></td>
-    <td class="field"><s:textfield name="bean.name" size="30" maxlength="30" /></td>
-    <td class="description"><s:text name="createWebsite.tip.name" /></td>
-</tr>
+    <s:textfield label="%{getText('createWebsite.handle')}"
+                 tooltip="%{getText('createWebsite.tip.handle')}"
+                 name="bean.handle" size="30" maxlength="30"
+                 onkeyup="handlePreview(this)"/>
 
-<tr>
-        <td class="label"><label for="description"><s:text name="generic.tagline" /></td>
-    <td class="field"><s:textfield name="bean.description" size="40" maxlength="255" /></td>
-    <td class="description"><s:text name="createWebsite.tip.description" /></td>
-</tr>
-
-<tr>
-    <td class="label"><label for="handle"><s:text name="createWebsite.handle" /></label></td>
-    <td class="field">
-        <s:textfield name="bean.handle" size="30" maxlength="30" onkeyup="handlePreview(this)" /><br />
-        <span style="text-size:70%">
+    <div class="form-group">
+        <label class="col-sm-3"></label>
+        <div class="col-sm-9 controls">
             <s:text name="createWebsite.weblogUrl" />:&nbsp;
-            <s:property value="absoluteSiteURL" />/<span id="handlePreview" style="color:red"><s:if test="bean.handle != null"><s:property value="bean.handle"/></s:if><s:else>handle</s:else></span>
-        </span>
-    </td>
-    <td class="description"><s:text name="createWebsite.tip.handle" /></td>
-</tr>
+            <s:property value="absoluteSiteURL" />/<span id="handlePreview" style="color:red">
+            <s:if test="bean.handle != null">
+                <s:property value="bean.handle"/>
+            </s:if>
+            <s:else>handle</s:else></span>
+            <br>
+        </div>
+    </div>
 
-<tr>
-    <td class="label"><label for="emailAddress"><s:text name="createWebsite.emailAddress" /></label></td>
-    <td class="field"><s:textfield name="bean.emailAddress" size="40" maxlength="50" /></td>
-    <td class="description"><s:text name="createWebsite.tip.email" /></td>
-</tr>
+    <s:textfield label="%{getText('createWebsite.emailAddress')}"
+                 tooltip="%{getText('createWebsite.tip.email')}" onkeyup="formChanged()"
+                 name="bean.emailAddress" size="40" maxlength="50"/>
 
-<tr>
-    <td class="label"><label for="locale" /><s:text name="createWebsite.locale" /></label></td>
-    <td class="field">
-       <s:select name="bean.locale" size="1" list="localesList" listValue="displayName" />
-    </td>
-    <td class="description"><s:text name="createWebsite.tip.locale" /></td>
-</tr>
+    <s:select label="%{getText('createWebsite.locale')}"
+              tooltip="%{getText('createWebsite.tip.locale')}"
+              name="bean.locale" size="1" list="localesList" listValue="displayName"/>
 
-<tr>
-    <td class="label"><label for="timeZone"><s:text name="createWebsite.timeZone" /></label></td>
-    <td class="field">
-       <s:select name="bean.timeZone" size="1" list="timeZonesList" />
-    </td>
-    <td class="description"><s:text name="createWebsite.tip.timezone" /></td>
-</tr>
+    <s:select label="%{getText('createWebsite.timezone')}"
+              tooltip="%{getText('createWebsite.tip.timezone')}"
+              name="bean.timeZone" size="1" list="timeZonesList"/>
 
-<tr>
-    <td class="label"><label for="theme"><s:text name="createWebsite.theme" /></label></td>
-    <td class="field" ng-app="themeSelectModule" ng-controller="themeController">
-        <select id="themeSelector" name="bean.theme" size="1"
-        ng-model="selectedTheme" ng-options="theme as theme.name for theme in themes track by theme.id"></select>
-        <br />
-        <br />
-        <p>{{ selectedTheme.description }}</p>
-        <br />
-        <img ng-src="<s:property value='siteURL'/>{{ selectedTheme.previewPath }}"/>
-    </td>
-    <td class="description"><s:text name="createWebsite.tip.theme" /></td>
-</tr>
+    <div class="form-group" ng-app="themeSelectModule" ng-controller="themeController">
+        <label class="col-sm-3 control-label" for="createWeblog_bean_timeZone">
+            <s:text name="createWebsite.theme" />
+        </label>
+        <div class="col-sm-9 controls">
+            <s:select name="bean.theme" size="1" list="themes" listKey="id" listValue="name"
+                      onchange="previewImage(this[selectedIndex].value)"/>
+            <p id="themedescription"></p>
+            <p><img id="themeThumbnail" src="" class="img-responsive img-thumbnail" style="max-width: 30em" /></p>
 
-</table>
+        </div>
+    </div>
 
-<br />
+    <s:submit cssClass="btn btn-default"
+              value="%{getText('createWebsite.button.save')}"/>
 
-<s:submit value="%{getText('createWebsite.button.save')}" />
-<input type="button" value="<s:text name="generic.cancel"/>" onclick="window.location='<s:url action="menu"/>'" />
+    <input class="btn" type="button" value="<s:text name="generic.cancel"/>"
+           onclick="window.location='<s:url action="menu"/>'"/>
 
 </s:form>
 
+<%-- ============================================================================== --%>
+
 <script>
+
     document.forms[0].elements[0].focus();
 
-    angular.module('themeSelectModule', [])
-        .controller('themeController', ['$scope', function($scope) {
-            $.ajax({ url: "<s:property value='siteURL' />/roller-ui/authoring/themedata", async:false,
-                success: function(data) { $scope.themes = data; }
-            });
-            $scope.selectedTheme = $scope.themes[0];
-    }]);
+    var saveButton;
+
+    $( document ).ready(function() {
+
+        saveButton = $("#createWeblog_0");
+
+        <s:if test="bean.theme == null">
+        previewImage('<s:property value="themes[0].id"/>');
+        </s:if>
+        <s:else>
+        previewImage('<s:property value="bean.theme"/>');
+        </s:else>
+
+        formChanged()
+    });
+
+    function formChanged() {
+        var valid = false;
+
+        var name   = $("#createWeblog_bean_name:first").val();
+        var handle = $("#createWeblog_bean_handle:first").val();
+        var email  = $("#createWeblog_bean_emailAddress:first").val();
+
+        valid = !!(name && name.trim().length > 0
+            && handle && handle.trim().length > 0
+            && email && email.trim().length > 0 && validateEmail(email));
+
+        if ( valid ) {
+            saveButton.attr("disabled", false);
+        } else {
+            saveButton.attr("disabled", true);
+        }
+    }
+
+    function handlePreview(handle) {
+        previewSpan = document.getElementById("handlePreview");
+        var n1 = previewSpan.childNodes[0];
+        var n2 = document.createTextNode(handle.value);
+        if (handle.value == null) {
+            previewSpan.appendChild(n2);
+        } else {
+            previewSpan.replaceChild(n2, n1);
+        }
+    }
+
+    function previewImage(themeId) {
+        $.ajax({ url: "<s:property value='siteURL' />/roller-ui/authoring/themedata",
+            data: {theme:themeId}, success: function(data) {
+                $('#themedescription').html(data.description);
+                $('#themeThumbnail').attr('src','<s:property value="siteURL" />' + data.previewPath);
+            }
+        });
+        formChanged();
+    }
+
+</script>
+
+
 </script>
 
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/Login-css.jsp b/app/src/main/webapp/WEB-INF/jsps/core/Login-css.jsp
new file mode 100644
index 0000000..a08fc73
--- /dev/null
+++ b/app/src/main/webapp/WEB-INF/jsps/core/Login-css.jsp
@@ -0,0 +1,23 @@
+<%--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  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.  For additional information regarding
+  copyright in this work, please see the NOTICE file in the top level
+  directory of this distribution.
+--%>
+
+.roller-page-title {
+    margin-top: 0px;
+    margin-bottom: 2em;
+    text-align: center;
+}
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/Login.jsp b/app/src/main/webapp/WEB-INF/jsps/core/Login.jsp
index bf9914d..0a3918e 100644
--- a/app/src/main/webapp/WEB-INF/jsps/core/Login.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/core/Login.jsp
@@ -18,150 +18,137 @@
 
 <%-- Body of the login page, invoked from login.jsp --%>
 <%@ page import="org.apache.roller.weblogger.config.WebloggerConfig" %>
-<%@ page import="org.apache.roller.weblogger.config.AuthMethod" %>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
 <%!
-String securityCheckUrl = null;
-boolean cmaEnabled = "CMA".equals(WebloggerConfig.getAuthMethod());
+    String securityCheckUrl = null;
+    boolean cmaEnabled = "CMA".equals( WebloggerConfig.getAuthMethod() );
 %>
 
 <%
-if (cmaEnabled) {
-    securityCheckUrl = "/j_security_check";
-} else {
-    securityCheckUrl = "/roller_j_security_check";
-}
+    if (cmaEnabled) {
+        securityCheckUrl = "/j_security_check";
+    } else {
+        securityCheckUrl = "/roller_j_security_check";
+    }
 %>
 
-<s:if test="authMethod == 'OPENID' || authMethod == 'DB_OPENID'">
-    
-    <p><s:text name="loginPage.openIdPrompt" /></p>
-    
-    <form method="post" id="loginOpenIDForm"       
-          action="/roller/roller_j_openid_security_check"      
-          onsubmit="saveOpenidIdentifier(this)">      
-        <!-- action="<c:url value='roller_j_openid_security_check'/>"  -->
-        <table width="80%">
-            <tr>
-                <td width="20%" align="right"><s:text name="loginPage.openID" /></td>
-                <td width="80%">
-                    <input type="text" name="openid_identifier" id="openid_identifier" class="f_openid_identifier" size="40" maxlength="255" style="width: 35%"/>
-                </td>
-            </tr>    
-            <tr>
-                <td width="20%"></td>
-                <td width="80%">
-                    <input type="submit" name="submit" id="submit" value="<s:text name='loginPage.loginOpenID'/>" />
-                </td>
-            </tr>
-        </table> 
-    </form>
-</s:if>
+    <s:if test="authMethod == 'OPENID' || authMethod == 'DB_OPENID'">
 
-<s:if test="authMethod != 'OPENID'">
 
-    <s:if test="authMethod == 'DB_OPENID'">
-        <p><s:text name="loginPage.openIdHybridPrompt" /></p>
+        <form method="post" id="loginOpenIDForm" class="form-horizontal"
+              action="/roller/roller_j_openid_security_check" onsubmit="saveOpenidIdentifier(this)">
+
+            <div class="form-group">
+                <legend><s:text name="loginPage.openIdPrompt"/></legend>
+            </div>
+
+            <div class="form-group">
+                <label for="openid_identifier"><s:text name="loginPage.openID"/></label>
+                <input class="form-control" type="text" name="openid_identifier" id="openid_identifier"/>
+            </div>
+
+            <button type="submit" name="submit" id="submit" class="btn btn-primary"
+                value="<s:text name='loginPage.loginOpenID'/>"></button>
+
+        </form>
+
     </s:if>
-    
-    <s:else>
-        <p><s:text name="loginPage.prompt" /></p>
-    </s:else>
-    
-    <form method="post" id="loginForm" 
-          action="<c:url value="<%= securityCheckUrl %>"/>"
-          onsubmit="saveUsername(this)">
 
-        <table width="80%">
+    <s:if test="authMethod != 'OPENID'">
 
-            <tr>
-                <td width="20%" align="right"><s:text name="loginPage.userName" /></td>
-                <td width="80%">
-                    <input type="text" name="j_username" id="j_username" size="25" />
-                </td>
-            </tr>
+        <form method="post" id="loginForm" class="form-horizontal"
+              action="<c:url value="<%= securityCheckUrl %>"/>" onsubmit="saveUsername(this)">
 
-            <tr>
-                <td width="20%" align="right"><s:text name="loginPage.password" /></td>
-                <td width="80%">
-                    <input type="password" name="j_password" id="j_password" size="20" />
-                </td>
-            </tr>
+            <div class="form-group">
+                <s:if test="authMethod == 'DB_OPENID'">
+                    <legend><s:text name="loginPage.openIdHybridPrompt"/></legend>
+                </s:if>
+
+                <s:else>
+                    <legend><s:text name="loginPage.prompt"/></legend>
+                </s:else>
+            </div>
+
+            <div class="form-group">
+                <label for="j_username" > <s:text name="loginPage.userName"/> </label>
+                <input type="text" class="form-control" name="j_username" id="j_username" placeholder="Username"/>
+            </div>
+
+            <div class="form-group">
+                <label for="j_password" > <s:text name="loginPage.password"/> </label>
+                <input type="password" class="form-control" name="j_password" id="j_password" placeholder="Password"/>
+            </div>
 
             <c:if test="${rememberMeEnabled}">
-            <tr>
-                <td width="20%"></td>
-                <td width="80%">
-                    <input type="checkbox" name="_spring_security_remember_me" id="_spring_security_remember_me" />
-                    <label for="rememberMe">
-                        <s:text name="loginPage.rememberMe" />
-                    </label>
-                </td>
-            </tr>
+                <div class="form-group">
+                    <input type="checkbox" name="_spring_security_remember_me" id="_spring_security_remember_me"/>
+                    <label for="_spring_security_remember_me" > <s:text name="loginPage.rememberMe"/> </label>
+                </div>
             </c:if>
 
-            <tr>
-                <td width="20%"></td>
-                <td width="80%">
-                    <input type="submit" name="login" id="login" value="<s:text name='loginPage.login' />" />
-                    <input type="reset" name="reset" id="reset" value="<s:text name='loginPage.reset' />"
-                        onclick="document.getElementById('j_username').focus()" />
-                </td>
-            </tr>        
+            <div class="form-group">
+                <button class="btn btn-primary" type="submit" name="login" id="login">
+                    <s:text name='loginPage.login'/>
+                </button>
 
-        </table>    
-    </form>
-</s:if>
+                <button class="btn" type="reset" name="reset" id="reset"
+                        onclick="document.getElementById('j_username').focus()">
+                    <s:text name='loginPage.reset'/>
+                </button>
+            </div>
+
+        </form>
+    </s:if>
 
 <script>
-<s:if test="authMethod == 'OPENID' || authMethod == 'DB_OPENID'">
-function focusToOpenidForm() {
-    return (document.getElementById && document.getElementById("j_username") === null) ||
-        getCookie("favorite_authentication_method") !== "username";
-}
-
-if (document.getElementById) {
-    if (document.getElementById && getCookie("openid_identifier") !== null) {
-        document.getElementById("openid_identifier").value = getCookie("openid_identifier");
+    <s:if test="authMethod == 'OPENID' || authMethod == 'DB_OPENID'">
+    function focusToOpenidForm() {
+        return (document.getElementById && document.getElementById("j_username") === null) ||
+                getCookie("favorite_authentication_method") !== "username";
     }
-    if (focusToOpenidForm()) {
-        document.getElementById("openid_identifier").focus();
-    }
-}
 
-function saveOpenidIdentifier(theForm) {
-    var expires = new Date();
-    expires.setTime(expires.getTime() + 24 * 30 * 60 * 60 * 1000); // sets it for approx 30 days.
-    setCookie("openid_identifier",theForm.openid_identifier.value,expires);
-    setCookie("favorite_authentication_method", "openid");
-}
-</s:if>
-
-<s:if test="authMethod != 'OPENID'">
-function focusToUsernamePasswordForm() {
-    return (document.getElementById && document.getElementById("openid_identifier") === null) ||
-        getCookie("favorite_authentication_method") === "username";
-}
-
-if (document.getElementById) {
-    if (getCookie("username") != null) {
-        if (document.getElementById) {
-            document.getElementById("j_username").value = getCookie("username");
-            if (focusToUsernamePasswordForm()) {
-                document.getElementById("j_password").focus();
-            }
+    if (document.getElementById) {
+        if (document.getElementById && getCookie("openid_identifier") !== null) {
+            document.getElementById("openid_identifier").value = getCookie("openid_identifier");
         }
-    } else if (focusToUsernamePasswordForm()) {
-        document.getElementById("j_username").focus();
+        if (focusToOpenidForm()) {
+            document.getElementById("openid_identifier").focus();
+        }
     }
-}
 
-function saveUsername(theForm) {
-    var expires = new Date();
-    expires.setTime(expires.getTime() + 24 * 30 * 60 * 60 * 1000); // sets it for approx 30 days.
-    setCookie("username",theForm.j_username.value,expires);
-    setCookie("favorite_authentication_method", "username");
-}
-</s:if>
+    function saveOpenidIdentifier(theForm) {
+        var expires = new Date();
+        expires.setTime(expires.getTime() + 24 * 30 * 60 * 60 * 1000); // sets it for approx 30 days.
+        setCookie("openid_identifier", theForm.openid_identifier.value, expires);
+        setCookie("favorite_authentication_method", "openid");
+    }
+    </s:if>
+
+    <s:if test="authMethod != 'OPENID'">
+    function focusToUsernamePasswordForm() {
+        return (document.getElementById && document.getElementById("openid_identifier") === null) ||
+                getCookie("favorite_authentication_method") === "username";
+    }
+
+    if (document.getElementById) {
+        if (getCookie("username") != null) {
+            if (document.getElementById) {
+                document.getElementById("j_username").value = getCookie("username");
+                if (focusToUsernamePasswordForm()) {
+                    document.getElementById("j_password").focus();
+                }
+            }
+        } else if (focusToUsernamePasswordForm()) {
+            document.getElementById("j_username").focus();
+        }
+    }
+
+    function saveUsername(theForm) {
+        var expires = new Date();
+        expires.setTime(expires.getTime() + 24 * 30 * 60 * 60 * 1000); // sets it for approx 30 days.
+        setCookie("username", theForm.j_username.value, expires);
+        setCookie("favorite_authentication_method", "username");
+    }
+    </s:if>
 </script>
\ No newline at end of file
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp b/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp
index eb565f8..f042398 100644
--- a/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/core/MainMenu.jsp
@@ -59,123 +59,113 @@
     
     <s:iterator var="perms" value="existingPermissions">
 
-        <div class="yourWeblogBox">  
+        <div class="well 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">
+            <h3 class="mm_weblog_name">
+                <span class="glyphicon glyphicon-folder-open" aria-hidden="true"></span>
+                &nbsp;<s:property value="#perms.weblog.name" />
+            </h3>
 
-                   <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>
+            <p> <a href='<s:property value="#perms.weblog.absoluteURL" />'>
+            <s:property value="#perms.weblog.absoluteURL" /></a></p>
 
-                       <tr>
-                           <td class="mm_subtable_label"><s:text name='yourWebsites.userCount' /></td>   
-                           <td><s:property value="#perms.weblog.userCount" /></td>
-                       </tr>
+            <p><s:property value="#perms.weblog.about" escapeHtml="false" /></p>
 
-                       <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>
+            <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" 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" 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" 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" 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>
+                        <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" 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" 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>
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp
index 4aa6ef9..29cbb23 100644
--- a/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/core/MainMenuSidebar.jsp
@@ -22,31 +22,42 @@
         <div class="menu-tl">
             
             <div class="sidebarInner">
-                <h3><s:text name="yourWebsites.actions" /></h3>
                 
+                <%-- 
+                <h4><s:text name="yourWebsites.actions" /></h4> 
                 <hr size="1" noshade="noshade" />
-                
-                <h3><a href="<s:url action="profile"/>"><s:text name="yourWebsites.editProfile" /></a></h3>
+                --%>
+
+                <%-- Edit profile --%>
+
+                <h4><span class="glyphicon glyphicon-user" aria-hidden="true"></span>
+                <a href="<s:url action="profile"/>"><s:text name="yourWebsites.editProfile" /></a></h4>
                 <p><s:text name="yourWebsites.editProfile.desc" /></p>
 
+                <%-- Edit profile --%>
+                
                 <s:if test="getBooleanProp('webservices.enableAtomPub') && getProp('webservices.atomPubAuth') == 'oauth'">
-                    <h3><a href="<s:url action="oauthKeys" />"><s:text name="yourWebsites.oauthKeys" /></a></h3>
+                    <h4><span class="glyphicon glyphicon-lock" aria-hidden="true"></span>
+                    <a href="<s:url action="oauthKeys" />"><s:text name="yourWebsites.oauthKeys" /></a></h4>
                     <p><s:text name="yourWebsites.oauthKeys.desc" /></p>
                 </s:if>
 
+                <%-- Create weblog --%>
+                
                 <s:if test="getBooleanProp('site.allowUserWeblogCreation') && (getBooleanProp('groupblogging.enabled') || (existingPermissions.isEmpty && pendingPermissions.isEmpty))">
-                    <h3><a href="<s:url action="createWeblog" />"><s:text name="yourWebsites.createWeblog" /></a></h3>
+                    <h4><span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
+                    <a href="<s:url action="createWeblog" />"><s:text name="yourWebsites.createWeblog" /></a></h4>
                     <p><s:text name="yourWebsites.createWeblog.desc" /></p>
                 </s:if>
 
-                <s:if test="userIsAdmin">               
-                    <h3><a href="<s:url action="globalConfig" namespace="/roller-ui/admin" />"><s:text name="yourWebsites.globalAdmin" /></a></h3>          
+                <s:if test="userIsAdmin">
+
+                    <%-- Roller settings --%>
+
+                    <h4><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>
+                    <a href="<s:url action="globalConfig" namespace="/roller-ui/admin" />"><s:text name="yourWebsites.globalAdmin" /></a></h4>          
                     <p><s:text name="yourWebsites.globalAdmin.desc" /></p>
-                    
-                    <s:if test="getBooleanProp('planet.aggregator.enabled')">               
-                        <h3><a href="<s:url action="planetConfig" namespace="/roller-ui/admin" />"><s:text name="yourWebsites.planetAdmin" /></a></h3>
-                        <p><s:text name="yourWebsites.planetAdmin.desc" /></p>
-                    </s:if>
+
                 </s:if>
                 
                 <br />
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/Profile.jsp b/app/src/main/webapp/WEB-INF/jsps/core/Profile.jsp
index c0c3e13..2f91d01 100644
--- a/app/src/main/webapp/WEB-INF/jsps/core/Profile.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/core/Profile.jsp
@@ -17,7 +17,7 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<p class="subtitle"><s:text name="userAdmin.title.editUser" /></p>
+<p class="subtitle"><s:text name="userAdmin.title.editUser"/></p>
 
 <s:if test="authMethod == 'DB_OPENID'">
     <p class="pagetip">
@@ -25,83 +25,108 @@
     </p>
 </s:if>
 
-<s:form action="profile!save">
-	<s:hidden name="salt" />
-    
-    <table class="formtable">
-        
-        <tr>
-            <td class="label"><label for="userName" /><s:text name="userSettings.username" /></label></td>
-            <td class="field"><s:textfield name="bean.userName" size="30" maxlength="30" readonly="true" cssStyle="background: #e5e5e5" /></td>
-            <td class="description"><s:text name="userSettings.tip.username" /></td>
-        </tr>
-        
-        <tr>
-            <td class="label"><label for="screenName" /><s:text name="userSettings.screenname" /></label></td>
-            <td class="field"><s:textfield name="bean.screenName" size="30" maxlength="30" /></td>
-            <td class="description"><s:text name="userRegister.tip.screenName" /></td>
-        </tr>
-        
-        <tr>
-            <td class="label"><label for="fullName" /><s:text name="userSettings.fullname" /></label></td>
-            <td class="field"><s:textfield name="bean.fullName" size="30" maxlength="30" /></td>
-            <td class="description"><s:text name="userRegister.tip.fullName" /></td>
-        </tr>
-        
-        <tr>
-            <td class="label"><label for="emailAddress" /><s:text name="userSettings.email" /></label></td>
-            <td class="field"><s:textfield name="bean.emailAddress" size="40" maxlength="40" /></td>
-            <td class="description"><s:text name="userRegister.tip.email" /></td>
-        </tr>
-        
-        <s:if test="authMethod == 'ROLLERDB' || authMethod == 'DB_OPENID'">
-            <tr>
-                <td class="label"><label for="passwordText" /><s:text name="userSettings.password" /></label></td>
-                <td class="field">
-                    <s:password name="bean.passwordText" size="20" maxlength="20" />
-                </td>
-                <td class="description"><s:text name="userRegister.tip.password" /></td>
-            </tr>
 
-            <tr>
-                <td class="label"><label for="passwordConfirm" /><s:text name="userSettings.passwordConfirm" /></label></td>
-                <td class="field"><s:password name="bean.passwordConfirm" size="20" maxlength="20" /></td>
-                <td class="description"><s:text name="userRegister.tip.passwordConfirm" /></td>
-            </tr>
-        </s:if>
-        <s:else>
-            <s:hidden name="bean.password" />
-        </s:else>
-        
-        <s:if test="authMethod == 'OPENID' || authMethod == 'DB_OPENID'">
-            <tr>
-                <td class="label"><label for="openIdUrl" /><s:text name="userSettings.openIdUrl" /></label></td>
-                <td class="field"><s:textfield name="bean.openIdUrl" size="40" maxlength="255" style="width:75%" id="f_openid_identifier" /></td>
-                <td class="description"><s:text name="userRegister.tip.openIdUrl" /></td>
-            </tr>     
-        </s:if>
-        
-        <tr>
-            <td class="label"><label for="locale" /><s:text name="userSettings.locale" /></label></td>
-            <td class="field">
-                <s:select name="bean.locale" size="1" list="localesList" listValue="displayName" />
-            </td>
-            <td class="description"><s:text name="userRegister.tip.locale" /></td>
-        </tr>
-        
-        <tr>
-            <td class="label"><label for="timeZone" /><s:text name="userSettings.timeZone" /></label></td>
-            <td class="field">
-                <s:select name="bean.timeZone" size="1" list="timeZonesList" />
-            </td>
-            <td class="description"><s:text name="userRegister.tip.timeZone" /></td>
-        </tr>
-        
-    </table>
-    
-    <br />
-    
-    <s:submit value="%{getText('generic.save')}" />
-    <input type="button" value="<s:text name="generic.cancel"/>" onclick="window.location='<s:url action="menu"/>'" />
+<s:form action="profile!save" theme="bootstrap" cssClass="form-horizontal">
+    <s:hidden name="salt"/>
+
+    <s:textfield label="%{getText('userSettings.username')}"
+                 tooltip="%{getText('userRegister.tip.userName')}"
+                 onchange="formChanged()" onkeyup="formChanged()"
+                 name="bean.userName" size="30" maxlength="30" readonly="true"/>
+
+    <s:textfield label="%{getText('userSettings.screenname')}"
+                 tooltip="%{getText('userRegister.tip.screenName')}"
+                 onchange="formChanged()" onkeyup="formChanged()"
+                 name="bean.screenName" size="30" maxlength="30"/>
+
+    <s:textfield label="%{getText('userSettings.fullname')}"
+                 tooltip="%{getText('')}"
+                 onchange="formChanged()" onkeyup="formChanged()"
+                 name="bean.fullName" size="30" maxlength="30"/>
+
+    <s:textfield label="%{getText('userSettings.email')}"
+                 tooltip="%{getText('userRegister.tip.email')}"
+                 onchange="formChanged()" onkeyup="formChanged()"
+                 name="bean.emailAddress" size="40" maxlength="40"/>
+
+    <s:if test="authMethod == 'ROLLERDB' || authMethod == 'DB_OPENID'">
+        <s:password label="%{getText('userSettings.password')}"
+                    tooltip="%{getText('userSettings.tip.password')}"
+                    onchange="formChanged()" onkeyup="formChanged()"
+                    name="bean.passwordText" size="20" maxlength="20"/>
+
+        <s:password label="%{getText('userSettings.passwordConfirm')}"
+                    tooltip="%{getText('userRegister.tip.passwordConfirm')}"
+                    onchange="formChanged()" onkeyup="formChanged()"
+                    name="bean.passwordConfirm" size="20" maxlength="20"/>
+    </s:if>
+    <s:else>
+        <s:hidden name="bean.password"/>
+    </s:else>
+
+    <s:if test="authMethod == 'OPENID' || authMethod == 'DB_OPENID'">
+        <s:textfield label="%{getText('userSettings.openIdUrl')}"
+                     tooltip="%{getText('userRegister.tip.openIdUrl')}"
+                     name="bean.openIdUrl" size="40" maxlength="255"
+                     style="width:75%" id="f_openid_identifier"/>
+    </s:if>
+
+    <s:select label="%{getText('userSettings.locale')}"
+              tooltip="%{getText('userRegister.tip.locale')}"
+              name="bean.locale" size="1" list="localesList" listValue="displayName"/>
+
+    <s:select label="%{getText('userSettings.timeZone')}"
+              tooltip="%{getText('userRegister.tip.timeZone')}"
+              name="bean.timeZone" size="1" list="timeZonesList"/>
+
+    <s:submit cssClass="btn btn-default" value="%{getText('generic.save')}"/>
+
+    <input class="btn" type="button" value="<s:text name="generic.cancel"/>"
+           onclick="window.location='<s:url action="menu"/>'"/>
 
 </s:form>
+
+<%-- -------------------------------------------------------- --%>
+
+<script type="text/javascript">
+
+    var saveButton;
+
+    $(document).ready(function () {
+        saveButton = $("#profile_0");
+        formChanged();
+    });
+
+    function formChanged() {
+        var valid = false;
+
+        var screenName = $("#profile_bean_screenName:first").val();
+        var fullName = $("#profile_bean_fullName:first").val();
+        var email = $("#profile_bean_emailAddress:first").val();
+        var password = $("#profile_bean_passwordText:first").val();
+        var passwordConfirm = $("#profile_bean_passwordConfirm:first").val();
+
+        if (screenName && screenName.trim().length > 0
+            && fullName && fullName.trim().length > 0
+            && email && email.trim().length > 0 && validateEmail(email)) {
+            valid = true;
+
+        } else {
+            valid = false;
+        }
+
+        if ((password && password.trim().length) || (passwordConfirm && passwordConfirm.trim().length > 0)) {
+            if (password !== passwordConfirm) {
+                valid = false;
+            }
+        }
+
+        if (valid) {
+            saveButton.attr("disabled", false);
+        } else {
+            saveButton.attr("disabled", true);
+        }
+
+    }
+
+</script>
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/Register.jsp b/app/src/main/webapp/WEB-INF/jsps/core/Register.jsp
index 96a8d05..6f8fcef 100644
--- a/app/src/main/webapp/WEB-INF/jsps/core/Register.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/core/Register.jsp
@@ -19,183 +19,175 @@
 
 <p><s:text name="userRegister.prompt" /></p>
 
-<s:form action="register!save" >
+<s:form action="register!save"  theme="bootstrap" cssClass="form-horizontal">
 	<s:hidden name="salt" />
     <s:hidden name="bean.id" />
-    <s:hidden name="bean.enabled" />
 
-<table class="formtable">
-    <tr>
-        <td colspan="3">
-            <h2><s:text name="userRegister.heading.identification" /></h2>
-            <p><s:text name="userRegister.tip.identification" /></p>
-        </td>
-    </tr>
-        
+    <h2><s:text name="userRegister.heading.identification" /></h2>
+    <p><s:text name="userRegister.tip.identification" /></p>
+
     <s:if test="authMethod == 'LDAP'">
-        <tr>
-            <td class="label"><label for="userName" /><s:text name="userSettings.username" /></label></td>
-            <td class="field"><strong><s:property value="bean.userName" /></strong></td>
-            <td class="description"><s:text name="userRegister.tip.userName" /></td>
-        </tr>
+
+        <div class="form-group">
+
+            <label class="col-sm-3 control-label">
+                <s:text name="userSettings.username" />
+            </label>
+
+            <div class="col-sm-9 controls">
+                <p class="form-control-static">
+                    <s:property value="bean.userName"/>
+                </p>
+            </div>
+
+        </div>
+
+        <%-- <s:text name="userRegister.tip.userName" /> --%>
+
     </s:if>
     <s:else>
-        <tr>
-            <td class="label"><label for="userName" /><s:text name="userSettings.username" /></label></td>
-            <td class="field"><s:textfield name="bean.userName" size="30" maxlength="30" onkeyup="onChange()" /></td>
-            <td class="description"><s:text name="userRegister.tip.userName" /></td>
-        </tr>
+        <s:textfield label="%{getText('userSettings.username')}"
+                     tooltip="%{getText('userRegister.tip.userName')}"
+                     onkeyup="onChange()"
+                     name="bean.userName" size="30" maxlength="30" />
     </s:else>
-     
-    <tr>
-        <td class="label"><label for="screenName" /><s:text name="userSettings.screenname" /></label></td>
-        <td class="field"><s:textfield name="bean.screenName" size="30" maxlength="30" onkeyup="onChange()" /></td>
-        <td class="description"><s:text name="userRegister.tip.screenName" /></td>
-    </tr>
 
-    <tr>
-        <td class="label"><label for="fullName" /><s:text name="userSettings.fullname" /></label></td>
-        <td class="field"><s:textfield name="bean.fullName" size="30" maxlength="30" onkeyup="onChange()" /></td>
-        <td class="description"><s:text name="userRegister.tip.fullName" /></td>
-    </tr>
+    <s:textfield label="%{getText('userSettings.screenname')}"
+                 tooltip="%{getText('userRegister.tip.screenName')}"
+                 onkeyup="onChange()"
+                 name="bean.screenName" size="30" maxlength="30" />
 
-    <tr>
-        <td class="label"><label for="emailAddress" /><s:text name="userSettings.email" /></label></td>
-        <td class="field"><s:textfield name="bean.emailAddress" size="40" maxlength="40" onkeyup="onChange()" /></td>
-        <td class="description"><s:text name="userRegister.tip.email" /></td>
-    </tr>
+    <s:textfield label="%{getText('userSettings.fullname')}"
+                 tooltip="%{getText('userRegister.tip.fullName')}"
+                 onkeyup="onChange()"
+                 name="bean.fullName" size="30" maxlength="30" />
+
+    <s:textfield label="%{getText('userSettings.email')}"
+                 tooltip="%{getText('userRegister.tip.email')}"
+                 onkeyup="onChange()"
+                 name="bean.emailAddress" size="40" maxlength="40" />
 
     <s:if test="authMethod != 'LDAP'">
-        <tr>
-            <td colspan="3">
-                <h2><s:text name="userRegister.heading.authentication" /></h2>
 
-                <s:if test="authMethod == 'ROLLERDB'">
-                <p><s:text name="userRegister.tip.openid.disabled" /></p>                    
-                </s:if>
+        <h2><s:text name="userRegister.heading.authentication" /></h2>
 
-                <s:if test="authMethod == 'DB_OPENID'">
-                <p><s:text name="userRegister.tip.openid.hybrid" /></p>                    
-                </s:if>
+        <s:if test="authMethod == 'ROLLERDB'">
+            <p><s:text name="userRegister.tip.openid.disabled" /></p>
+        </s:if>
 
-                <s:if test="authMethod == 'OPENID'">
-                <p><s:text name="userRegister.tip.openid.only" /></p>                    
-                </s:if>
-            </td>
-        </tr>
-        
+        <s:if test="authMethod == 'DB_OPENID'">
+            <p><s:text name="userRegister.tip.openid.hybrid" /></p>
+        </s:if>
+
+        <s:if test="authMethod == 'OPENID'">
+            <p><s:text name="userRegister.tip.openid.only" /></p>
+        </s:if>
+
         <s:if test="authMethod == 'ROLLERDB' || authMethod == 'DB_OPENID'">
-        <tr>
-            <td class="label"><label for="passwordText" /><s:text name="userSettings.password" /></label></td>
-            <td class="field">
-               <s:password name="bean.passwordText" size="20" maxlength="20" onkeyup="onChange()" />
-               <s:hidden name="bean.password" />
-           </td>
-            <td class="description"><s:text name="userRegister.tip.password" /></td>
-        </tr>
 
-        <tr>
-            <td class="label"><label for="passwordConfirm" /><s:text name="userSettings.passwordConfirm" /></label></td>
-            <td class="field"><s:password name="bean.passwordConfirm" size="20" maxlength="20" onkeyup="onChange()" /></td>
-            <td class="description"><s:text name="userRegister.tip.passwordConfirm" /></td>
-        </tr>
+            <s:password label="%{getText('userSettings.password')}"
+                         tooltip="%{getText('userRegister.tip.password')}"
+                         onkeyup="onChange()"
+                         name="bean.passwordText" size="20" maxlength="20" />
+
+            <s:password label="%{getText('userSettings.passwordConfirm')}"
+                         tooltip="%{getText('userRegister.tip.passwordConfirm')}"
+                         onkeyup="onChange()"
+                         name="bean.passwordConfirm" size="20" maxlength="20" />
+
         </s:if>
         <s:else>
             <s:hidden name="bean.password" />
             <s:hidden name="bean.passwordText" />
             <s:hidden name="bean.passwordConfirm" />
         </s:else>
-    
 
         <s:if test="authMethod == 'OPENID' || authMethod == 'DB_OPENID'">
-            <tr>
-                <td class="label"><label for="openIdUrl" /><s:text name="userSettings.openIdUrl" /></label></td>
-                <td class="field"><s:textfield name="bean.openIdUrl" size="40" maxlength="255" style="width:75%" id="f_openid_identifier" onkeyup="onChange()"/></td>
-                <td class="description"><s:text name="userRegister.tip.openIdUrl" /></td>
-            </tr>  
-        </s:if> 
+
+            <s:textfield label="%{getText('userSettings.openIdUrl')}"
+                         tooltip="%{getText('userRegister.tip.openIdUrl')}"
+                         onkeyup="onChange()"
+                         name="bean.openIdUrl" size="40" maxlength="255" />
+        </s:if>
 
     </s:if>
 
-    <tr>
-        <td colspan="3">    
-            <h2><s:text name="userRegister.heading.locale" /></h2>
-            <p><s:text name="userRegister.tip.localeAndTimeZone" /></p>
-        </td>
-    </tr>
+    <h2><s:text name="userRegister.heading.locale" /></h2>
+    <p><s:text name="userRegister.tip.localeAndTimeZone" /></p>
 
-    <tr>
-        <td class="label"><label for="locale" /><s:text name="userSettings.locale" /></label></td>
-        <td class="field">
-           <s:select name="bean.locale" size="1" list="localesList" listValue="displayName" />
-        </td>
-        <td class="description"><s:text name="userRegister.tip.locale" /></td>
-    </tr>
+    <s:select label="%{getText('userSettings.locale')}"
+            tooltip="%{getText('userRegister.tip.locale')}"
+            onkeyup="onChange()"
+            list="localesList" listValue="displayName"
+            name="bean.locale" />
 
-    <tr>
-        <td class="label"><label for="timeZone" /><s:text name="userSettings.timeZone" /></label></td>
-        <td class="field">
-           <s:select name="bean.timeZone" size="1" list="timeZonesList" />
-        </td>
-        <td class="description"><s:text name="userRegister.tip.timeZone" /></td>
-    </tr>
+    <s:select label="%{getText('userSettings.timeZone')}"
+            tooltip="%{getText('userRegister.tip.timeZone')}"
+            onkeyup="onChange()"
+            list="timeZonesList"
+            name="bean.timeZone" />
 
-</table>
+    <h2><s:text name="userRegister.heading.ready" /></h2>
 
-<br />
+    <p id="readytip"><s:text name="userRegister.tip.ready" /></p>
 
-<h2><s:text name="userRegister.heading.ready" /></h2>
-
-<p id="readytip"><s:text name="userRegister.tip.ready" /></p>
-
-<s:submit id="submit" key="userRegister.button.save" />
-<input type="button" value="<s:text name="generic.cancel"/>"
-    onclick="window.location='<s:url value="/"/>'" />
+    <s:submit id="submit" key="userRegister.button.save" cssClass="btn btn-default" />
+    <input type="button" class="btn btn-cancel"
+           value="<s:text name="generic.cancel"/>" onclick="window.location='<s:url value="/"/>'" />
 
 </s:form>
 
-<script>
-function onChange() {
-    var disabled = true;
-    var authMethod    = "<s:property value='authMethod' />";
-    var emailAddress    = document.register['bean.emailAddress'].value;
-    var userName = passwordText = passwordConfirm = openIdUrl = "";
+<%-- ============================================================================== --%>
 
-    if (authMethod == 'LDAP') {
-        userName = '<s:property value="bean.userName" />';
-    } else {
-        userName = document.register['bean.userName'].value;
-    }
+<script type="text/javascript">
 
-    if (authMethod == "ROLLERDB" || authMethod == "DB_OPENID") {
-        passwordText    = document.register['bean.passwordText'].value;
-        passwordConfirm = document.register['bean.passwordConfirm'].value;
-    }
-    if (authMethod == "OPENID" || authMethod == "DB_OPENID") {
-        openIdUrl = document.register['bean.openIdUrl'].value;
-    }
+    function onChange() {
+        var disabled = true;
+        var authMethod    = "<s:property value='authMethod' />";
+        var emailAddress    = document.register['bean.emailAddress'].value;
+        var userName = passwordText = passwordConfirm = openIdUrl = "";
 
-    if (authMethod == "LDAP") {
-        if (emailAddress) disabled = false;
-    } else if (authMethod == "ROLLERDB") {
-        if (emailAddress && userName && passwordText && passwordConfirm) disabled = false;
-    } else if (authMethod == "OPENID") {
-        if (emailAddress && openIdUrl) disabled = false;
-    } else if (authMethod == "DB_OPENID") {
-        if (emailAddress && ((passwordText && passwordConfirm) || (openIdUrl)) ) disabled = false;
-    }
-
-    if (authMethod != 'LDAP') {
-        if ((passwordText || passwordConfirm) && !(passwordText == passwordConfirm)) {
-            document.getElementById('readytip').innerHTML = '<s:text name="userRegister.error.mismatchedPasswords" />';
-            disabled = true;
-        } else if (disabled) {
-            document.getElementById('readytip').innerHTML = '<s:text name="userRegister.tip.ready" />'
-        } else {
-            document.getElementById('readytip').innerHTML = '<s:text name="userRegister.success.ready" />'
+        if (!validateEmail(emailAddress)) {
+            document.getElementById('submit').disabled = true;
+            return;
         }
+
+        if (authMethod === 'LDAP') {
+            userName = '<s:property value="bean.userName" />';
+        } else {
+            userName = document.register['bean.userName'].value;
+        }
+
+        if (authMethod === "ROLLERDB" || authMethod === "DB_OPENID") {
+            passwordText    = document.register['bean.passwordText'].value;
+            passwordConfirm = document.register['bean.passwordConfirm'].value;
+        }
+        if (authMethod === "OPENID" || authMethod === "DB_OPENID") {
+            openIdUrl = document.register['bean.openIdUrl'].value;
+        }
+
+        if (authMethod === "LDAP") {
+            if (emailAddress) disabled = false;
+        } else if (authMethod === "ROLLERDB") {
+            if (emailAddress && userName && passwordText && passwordConfirm) disabled = false;
+        } else if (authMethod === "OPENID") {
+            if (emailAddress && openIdUrl) disabled = false;
+        } else if (authMethod === "DB_OPENID") {
+            if (emailAddress && ((passwordText && passwordConfirm) || (openIdUrl)) ) disabled = false;
+        }
+
+        if (authMethod !== 'LDAP') {
+            if ((passwordText || passwordConfirm) && !(passwordText === passwordConfirm)) {
+                document.getElementById('readytip').innerHTML = '<s:text name="userRegister.error.mismatchedPasswords" />';
+                disabled = true;
+            } else if (disabled) {
+                document.getElementById('readytip').innerHTML = '<s:text name="userRegister.tip.ready" />'
+            } else {
+                document.getElementById('readytip').innerHTML = '<s:text name="userRegister.success.ready" />'
+            }
+        }
+        document.getElementById('submit').disabled = disabled;
     }
-    document.getElementById('submit').disabled = disabled;
-}
-document.getElementById('submit').disabled = true;
+    document.getElementById('submit').disabled = true;
+
 </script>
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/Setup.jsp b/app/src/main/webapp/WEB-INF/jsps/core/Setup.jsp
index 104fa72..f43aaba 100644
--- a/app/src/main/webapp/WEB-INF/jsps/core/Setup.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/core/Setup.jsp
@@ -17,95 +17,100 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<s:text name="index.prompt" /><br /><br />
-<div style="width:75%">
-    <ul>
-        <%--
-              Index page on Roller startup; tell the user how to complete their Roller install,
-              with helpful notes and links to the appropriate places in the Roller UI.
-        --%>
+<p style="margin-bottom:2em"><s:text name="index.prompt"/> </p>
 
-        <%-- STEP 1: Create a user if you don't already have one --%>
-        <li><b><s:text name="index.createUser" />
-                <s:if test="userCount > 0"> -
-                    <s:text name="index.createUserDone">
-                        <s:param value="userCount" />
-                    </s:text>
-                </s:if>
-            </b><br /><br />
-            <s:text name="index.createUserHelp" /><br /><br />
-            <s:if test="userCount == 0">
-                <s:text name="index.createUserBy" />
-                <a id="a_createUser" href='<s:url action="register"/>'>
-                    <s:text name="index.createUserPage" /></a>.
-                <br /><br />
+<%--
+      Index page on Roller startup; tell the user how to complete their Roller install,
+      with helpful notes and links to the appropriate places in the Roller UI.
+--%>
+
+
+<%-- STEP 1: Create a user if you don't already have one --%>
+
+<div class="panel panel-default">
+    <div class="panel-heading">
+        <h3 class="panel-title">
+            <s:text name="index.createUser"/>
+            <s:if test="userCount > 0"> -
+                <s:text name="index.createUserDone">
+                    <s:param value="userCount"/>
+                </s:text>
             </s:if>
-            <br />
-        </li>
+        </h3>
+    </div>
 
-        <%-- STEP 2: Create a weblog if you don't already have one --%>
-        <li><b><s:text name="index.createWeblog" />
-                <s:if test="blogCount > 0"> -
-                    <s:text name="index.createWeblogDone">
-                        <s:param value="blogCount" />
-                    </s:text>
-                </s:if>
-            </b><br /><br />
-            <s:text name="index.createWeblogHelp" /><br /><br />
-            <s:if test="userCount > 0 && blogCount == 0">
-                <s:text name="index.createWeblogBy" />
-                <a id="a_createBlog" href='<s:url action="createWeblog"/>'>
-                    <s:text name="index.createWeblogPage" /></a>.
-            <br /><br />
+    <div class="panel-body">
+
+        <p><s:text name="index.createUserHelp"/></p>
+        <p><s:if test="userCount == 0">
+            <s:text name="index.createUserBy"/>
+            <a id="a_createUser" href='<s:url action="register"/>'>
+                <s:text name="index.createUserPage"/></a>.
+        </s:if></p>
+
+    </div>
+</div>
+
+<%-- STEP 2: Create a weblog if you don't already have one --%>
+
+<div class="panel panel-default">
+    <div class="panel-heading">
+        <h3 class="panel-title">
+            <s:text name="index.createWeblog"/>
+            <s:if test="blogCount > 0"> -
+                <s:text name="index.createWeblogDone">
+                    <s:param value="blogCount"/>
+                </s:text>
             </s:if>
-            <br />
-        </li>
+        </h3>
+    </div>
 
-        <%-- STEP 3: Designate a weblog to be the frontpage weblog --%>
-        <li><b><s:text name="index.setFrontpage" /></b><br />
-            <br />
-            <s:text name="index.setFrontpageHelp" /><br />
-            <br />
+    <div class="panel-body">
 
-          <s:if test="blogCount > 0">
-            <s:form action="setup!save">
-				<s:hidden name="salt" />
+        <s:text name="index.createWeblogHelp"/><br/><br/>
+        <s:if test="userCount > 0 && blogCount == 0">
+            <s:text name="index.createWeblogBy"/>
+            <a id="a_createBlog" href='<s:url action="createWeblog"/>'>
+                <s:text name="index.createWeblogPage"/></a>.
+        </s:if>
 
-                <table style="margin-left:2em;width:70%">
-                    <tr>
-                        <td class="label">
-                            <s:text name="frontpageConfig.frontpageBlogName" />
-                        </td>
-                        <td class="field">
-                            <s:select list="weblogs"
-                                      listKey="handle"
-                                      listValue="name"
-                                      name="frontpageBlog"
-                                      value="frontpageBlog" />
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class="label">
-                            <s:text name="frontpageConfig.frontpageAggregated" />
-                            <br /><br />
-                        </td>
-                        <td class="field">
-                            <s:checkbox name="aggregated" value="aggregated" />
-                        </td>
-                    </tr>
-                    <tr>
-                        <td colspan="2" class="label">
-                            <div class="control">
-                                <s:submit value="%{getText('generic.save')}" />
-                            </div>
-                        </td>
-                    </tr>
-                </table>
+    </div>
+</div>
+
+
+<%-- STEP 3: Designate a weblog to be the frontpage weblog --%>
+
+<div class="panel panel-default">
+    <div class="panel-heading">
+        <h3 class="panel-title">
+            <s:text name="index.setFrontpage"/>
+        </h3>
+    </div>
+
+    <div class="panel-body">
+
+        <p><s:text name="index.setFrontpageHelp"/></p>
+
+        <s:if test="blogCount > 0">
+
+            <s:form action="setup!save" theme="bootstrap" cssClass="form-horizontal">
+                <s:hidden name="salt"/>
+
+                <s:select list="weblogs"
+                          listKey="handle"
+                          listValue="name"
+                          label="%{getText('frontpageConfig.frontpageBlogName')}"
+                          name="frontpageBlog"
+                          value="frontpageBlog"/>
+
+                <s:checkbox name="aggregated" value="aggregated"
+                            label="%{getText('frontpageConfig.frontpageAggregated')}"/>
+
+                <s:submit value="%{getText('generic.save')}" cssClass="btn btn-default"/>
 
             </s:form>
-          </s:if>
 
-        </li>
-
-    </ul>
+        </s:if>
+    </div>
 </div>
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/core/UpgradeDatabase.jsp b/app/src/main/webapp/WEB-INF/jsps/core/UpgradeDatabase.jsp
index 63d52d2..5c8e162 100644
--- a/app/src/main/webapp/WEB-INF/jsps/core/UpgradeDatabase.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/core/UpgradeDatabase.jsp
@@ -19,47 +19,44 @@
 
 
 <s:if test="error">
-    
-    <h2><s:text name="installer.errorUpgradingTables" /></h2> 
-    <p><s:text name="installer.errorUpgradingTablesExplanation" /></p> 
-<pre>
-<s:iterator value="messages"><s:property/><br /></s:iterator>
-</pre>
-    
+
+    <h2><s:text name="installer.errorUpgradingTables"/></h2>
+    <p><s:text name="installer.errorUpgradingTablesExplanation"/></p>
+    <pre>
+        <s:iterator value="messages"><s:property/><br/></s:iterator>
+    </pre>
+
 </s:if>
 <s:elseif test="upgradeRequired">
 
-    <h2><s:text name="installer.databaseUpgradeNeeded" /></h2>
-    
+    <h2><s:text name="installer.databaseUpgradeNeeded"/></h2>
+
     <p>
         <s:text name="installer.databaseUpgradeNeededExplanation">
-            <s:param value="databaseProductName" />
+            <s:param value="databaseProductName"/>
         </s:text>
     </p>
-    <p><s:text name="installer.upgradeTables" /></p>
+    <p><s:text name="installer.upgradeTables"/></p>
 
-    <s:form action="install!upgrade">
-		<s:hidden name="salt" />
-        <s:submit value="%{getText('installer.yesUpgradeTables')}" />
+    <s:form action="install!upgrade" class="form-horizontal">
+        <s:hidden name="salt"/>
+        <s:submit value="%{getText('installer.yesUpgradeTables')}" cssClass="btn btn-primary" />
     </s:form>
 
 </s:elseif>
 <s:else>
-    
-    <h2><s:text name="installer.tablesUpgraded" /></h2>
-    
-    <p><s:text name="installer.tablesUpgradedExplanation" /></p>
+
+    <h2><s:text name="installer.tablesUpgraded"/></h2>
+
+    <p><s:text name="installer.tablesUpgradedExplanation"/></p>
     <p>
         <s:text name="installer.tryBootstrapping">
             <s:param><s:url action="install!bootstrap"/></s:param>
         </s:text>
     </p>
-    
-<pre>
-<s:iterator value="messages"><s:property/><br /></s:iterator>
-</pre>
-    
-</s:else>
 
-<br />
-<br />
+    <pre>
+        <s:iterator value="messages"><s:property/><br/></s:iterator>
+    </pre>
+
+</s:else>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/BookmarkEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/BookmarkEdit.jsp
deleted file mode 100644
index cdb01b9..0000000
--- a/app/src/main/webapp/WEB-INF/jsps/editor/BookmarkEdit.jsp
+++ /dev/null
@@ -1,91 +0,0 @@
-<%--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  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.  For additional information regarding
-  copyright in this work, please see the NOTICE file in the top level
-  directory of this distribution.
---%>
-<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-
-<%-- Titling, processing actions different between add and edit --%>
-<s:if test="actionName == 'bookmarkEdit'">
-    <s:set var="subtitleKey">bookmarkForm.edit.subtitle</s:set>
-    <s:set var="mainAction">bookmarkEdit</s:set>
-</s:if>
-<s:else>
-    <s:set var="subtitleKey">bookmarkForm.add.subtitle</s:set>
-    <s:set var="mainAction">bookmarkAdd</s:set>
-</s:else>
-
-<p class="subtitle">
-    <s:text name="%{#subtitleKey}" >
-        <s:param value="bookmark.folder.name"/>
-    </s:text>
-</p>
-
-<p class="pagetip">
-    <s:text name="bookmarkForm.requiredFields">
-        <s:param><s:text name="generic.name"/></s:param>
-        <s:param><s:text name="bookmarkForm.url"/></s:param>
-    </s:text>
-</p>
-
-<s:form>
-	<s:hidden name="salt" />
-    <s:hidden name="weblog" />
-    <%--
-        Edit action uses folderId for redirection back to proper bookmarks folder on cancel
-        (as configured in struts.xml); add action also, plus to know which folder to put new
-        bookmark in.
-    --%>
-    <s:hidden name="folderId" />
-    <s:if test="actionName == 'bookmarkEdit'">
-        <%-- bean for bookmark add does not have a bean id yet --%>
-        <s:hidden name="bean.id" />
-    </s:if>
-
-    <table>
-        
-        <tr>
-            <td><s:text name="generic.name" /></td>
-            <td><s:textfield name="bean.name" maxlength="255" size="70" style="width:50%"/></td>
-        </tr>
-        
-        <tr>
-            <td><s:text name="bookmarkForm.url" /></td>
-            <td><s:textfield name="bean.url" maxlength="255" size="70" style="width:50%"/></td>
-        </tr>
-        
-        <tr>
-            <td><s:text name="bookmarkForm.rssUrl" /></td>
-            <td><s:textfield name="bean.feedUrl" maxlength="255" size="70" style="width:50%"/></td>
-        </tr>
-        
-        <tr>
-            <td><s:text name="generic.description" /></td>
-            <td><s:textfield name="bean.description" maxlength="255" size="70" style="width:50%"/></td>
-        </tr>
-
-        <tr>
-            <td><s:text name="bookmarkForm.image" /></td>
-            <td><s:textfield name="bean.image" maxlength="255" size="70" style="width:50%"/></td>
-        </tr>
-        
-    </table>
-    
-    <p>
-        <s:submit value="%{getText('generic.save')}" action="%{#mainAction}!save"/>
-        <s:submit value="%{getText('generic.cancel')}" action="bookmarkEdit!cancel" />
-    </p>
-    
-</s:form>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp
index c275381..d004596 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Bookmarks.jsp
@@ -17,161 +17,819 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<%-- JavaScript for bookmarks table --%>
-<script>
-function onDelete()
-{
-    if ( confirm("<s:text name='bookmarksForm.delete.confirm' />") ) 
-    {
-        document.bookmarks.submit();
-    }
-}
 
-function onDeleteFolder()
-{
-    if ( confirm("<s:text name='bookmarksForm.deleteFolder.confirm' />") )
-    {
-        document.bookmarks.action='<s:url action="bookmarks!deleteFolder" />';
-        document.bookmarks.submit();
-    }
-}
+<%--
+Blogroll link management
 
-function onMove()
-{
-    if ( confirm("<s:text name='bookmarksForm.move.confirm' />") ) 
-    {
-        document.bookmarks.action='<s:url action="bookmarks!move" />';
-        document.bookmarks.submit();
-    }
-}
-</script>
+We used to call them Bookmarks and Folders, now we call them Blogroll links and Blogrolls.
+--%>
+
+<%-- ================================================================================================ --%>
+
+<%-- Main blogroll/folder management interface, a checkbox-table with some buttons  --%>
+
+<p class="subtitle"><s:text name="bookmarksForm.subtitle"> <s:param value="weblog"/> </s:text></p>
 
 <s:if test="folder.name == 'default'">
-    <p class="subtitle">
-        <s:text name="bookmarksForm.subtitle" >
-            <s:param value="weblog" />
-        </s:text>
-    </p>  
-    <p class="pagetip">
-        <s:text name="bookmarksForm.rootPrompt" />
-    </p>
+    <p class="pagetip"><s:text name="bookmarksForm.rootPrompt"/></p>
 </s:if>
 <s:else>
-    <p class="subtitle">
-    <s:text name="bookmarksForm.path" />: <s:text name="%{folder.name}" />
-    <s:url var="editUrl" action="folderEdit">
-        <s:param name="weblog" value="%{actionWeblog.handle}" />
-        <s:param name="bean.id" value="%{folder.id}" />
-        <s:param name="folderId" value="%{folder.id}" />
-    </s:url>
-    <s:a href="%{editUrl}"><img src='<s:url value="/images/page_white_edit.png"/>' border="0" alt="icon" /
-        title="<s:text name='bookmarksForm.folder.edit.tip' />" /></s:a>
+    <p class="pagetip"><s:text name="bookmarksForm.otherPrompt"/></p>
 </s:else>
 
-<%-- Form is a table of folders followed by bookmarks, each with checkbox --%>
-<s:form action="bookmarks!delete">
-	<s:hidden name="salt" />
-    <s:hidden name="weblog" />
-    <s:hidden name="folderId" /> 
-    
-    <s:if test="!allFolders.isEmpty">
-        <%-- View button --%>
-        <s:submit type="button" action="bookmarks!view" key="bookmarksForm.viewFolder" />
 
-        <%-- Folder to View combo-box --%>
-        <s:select name="viewFolderId" list="allFolders" listKey="id" listValue="name" />
+<%-- table of blogroll links with selection checkboxes, wrapped in a form --%>
 
-        <br /><br />
+<s:form action="bookmarks!delete" theme="bootstrap" cssClass="form-horizontal">
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog"/>
+    <s:hidden name="folderId"/>
+
+    <%-- for default blogroll, show page "tip" and read-only folder name --%>
+
+    <s:if test="folder.name == 'default'">
+
+        <div class="form-group ">
+            <label class="col-sm-3 control-label" for="bookmarks_folder_name">
+                <s:text name="bookmarksForm.blogrollName"/>
+            </label>
+            <div class="col-sm-9 controls">
+                <div class="form-control"><s:text name="%{folder.name}"/></div>
+            </div>
+        </div>
+
     </s:if>
-    <table class="rollertable">
+
+    <s:if test="folder.name != 'default'">
+
+        <%-- Blogroll / Folder Name --%>
+
+        <%-- for other blogrolls, show textarea so user can rename it --%>
+        <%-- don't use Struts tags here so button can be on same line as text input --%>
+
+        <div class="form-group ">
+            <label class="col-sm-3 control-label" for="bookmarks_folder_name">
+                <s:text name="bookmarksForm.blogrollName"/>
+            </label>
+            <div class="col-sm-9 controls">
+                <input style="width:55%; float:left" type="text" name="folder.name"
+                       value="<s:text name='%{folder.name}'/>" id="bookmarks_folder_name" class="form-control"
+                       onchange="nameChanged()"
+                       onkeyup="nameChanged()"/>
+                <button type="button" id="rename_button"
+                        class="btn btn-success" style="float:left; margin-left:1em;"
+                        onclick="renameFolder(); return false;"
+                        onsubmit="return false;">
+                    <s:text name="generic.rename"/>
+                </button>
+                <button type="button" id="rename_cancel"
+                        class="btn btn-default" style="float:left; margin-left:1em;"
+                        onclick="cancelRenameFolder(); return false;"
+                        onsubmit="return false;">
+                    <s:text name="generic.cancel"/>
+                </button>
+            </div>
+        </div>
+
+    </s:if>
+
+    <%-- allow user to select the bookmark folder to view --%>
+
+    <s:select name="viewFolderId" list="allFolders" listKey="id" listValue="name" emptyOption="true"
+              label="%{getText('bookmarksForm.switchTo')}" onchange="viewChanged()" onmouseup="viewChanged()"/>
+
+    <table class="rollertable table table-striped">
 
         <tr class="rHeaderTr">
-            <th class="rollertable" width="5%"><input name="control" type="checkbox" onclick="toggleFunctionAll(this.checked);"
-                title="<s:text name="bookmarksForm.selectAllLabel"/>"/></th>
-            <th class="rollertable" width="25%"><s:text name="generic.name" /></th>
-            <th class="rollertable" width="25%"><s:text name="bookmarksForm.url" /></th>
-            <th class="rollertable" width="35%"><s:text name="bookmarksForm.feedurl" /></th>
-            <th class="rollertable" width="5%"><s:text name="generic.edit" /></th>
-            <th class="rollertable" width="5%"><s:text name="bookmarksForm.visitLink" /></th>
+            <th width="5%">
+                <input name="control" type="checkbox"
+                       onclick="toggleFunctionAll(this.checked); selectionChanged()"
+                       title="<s:text name="bookmarksForm.selectAllLabel"/>"/>
+            </th>
+            <th class="rollertable" width="25%"><s:text name="generic.name"/></th>
+            <th class="rollertable" width="70%"><s:text name="bookmarksForm.url"/></th>
+            <th class="rollertable" width="5%"><s:text name="generic.edit"/></th>
         </tr>
-        
-        <s:if test="folder.bookmarks.size > 0">
-        
-        <%-- Bookmarks --%>
-        <s:iterator var="bookmark" value="folder.bookmarks" 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 center" style="vertical-align:middle">
-                    <input type="checkbox" name="selectedBookmarks"
-                    title="<s:text name="bookmarksForm.selectOneLabel"><s:param value="#bookmark.name"/></s:text>"
-                    value="<s:property value="#bookmark.id"/>" />
-                </td>
-                
-                <td class="rollertable">
-                    <str:truncateNicely lower="25" upper="30" ><s:property value="#bookmark.name" /></str:truncateNicely>
-                </td>
-                
-                <td class="rollertable">
-                    <str:truncateNicely lower="40" upper="50" ><s:property value="#bookmark.url" /></str:truncateNicely>
-                </td>
-                
-                <td class="rollertable">
-                    <str:truncateNicely lower="60" upper="70" ><s:property value="#bookmark.feedUrl" /></str:truncateNicely>
-                </td>
 
-                <td class="rollertable" align="center">
-                    <s:url var="editUrl" action="bookmarkEdit">
-                        <s:param name="weblog" value="%{actionWeblog.handle}" />
-                        <s:param name="bean.id" value="#bookmark.id" />
-                        <s:param name="folderId" value="%{folderId}" suppressEmptyParameters="true"/>
-                    </s:url>
-                    <s:a href="%{editUrl}"><img src='<s:url value="/images/page_white_edit.png"/>' border="0" alt="icon" 
-                             title="<s:text name='bookmarksForm.edit.tip' />" /></s:a>
-                </td>
-                
-                <td class="rollertable" align="center">
-                    <s:if test="#bookmark.url != null" >
-                        <a href="<s:property value="#bookmark.url" />">
-                            <img src='<s:url value="/images/world_go.png"/>' border="0" alt="icon" title="<s:text name='bookmarksForm.visitLink.tip' />" />
+        <s:if test="folder.bookmarks.size > 0">
+
+            <%-- Bookmarks --%>
+            <s:iterator var="bookmark" value="folder.bookmarks" status="rowstatus">
+                <tr class="rollertable_odd">
+
+                    <td class="rollertable center" style="vertical-align:middle">
+                        <input type="checkbox" name="selectedBookmarks" onchange="selectionChanged()"
+                               title="<s:text name="bookmarksForm.selectOneLabel"><s:param value="#bookmark.name"/></s:text>"
+                               value="<s:property value="#bookmark.id"/>"/>
+                    </td>
+
+                    <td>
+                        <str:truncateNicely lower="40" upper="50">
+                            <s:property value="#bookmark.name"/>
+                        </str:truncateNicely>
+                    </td>
+
+                    <td>
+                        <s:if test="#bookmark.url != null">
+                            <a href='<s:property value="#bookmark.url" />' target='_blank'>
+                                <str:truncateNicely lower="70" upper="90">
+                                    <s:property value="#bookmark.url"/>
+                                </str:truncateNicely>
+                                <span class="glyphicon glyphicon-play-circle"></span>
+                            </a>
+                        </s:if>
+
+                    </td>
+
+                    <td align="center">
+
+                        <a href="#" onclick="editBookmark(
+                                '<s:property value="#bookmark.id"/>',
+                                '<s:property value="#bookmark.name"/>',
+                                '<s:property value="#bookmark.url"/>',
+                                '<s:property value="#bookmark.feedUrl"/>',
+                                '<s:property value="#bookmark.description"/>',
+                                '<s:property value="#bookmark.image"/>' )">
+                            <span class="glyphicon glyphicon-edit"></span>
                         </a>
-                    </s:if>
-                </td>
-                
-            </tr>
-        </s:iterator>
-        
+
+                    </td>
+
+                </tr>
+
+            </s:iterator>
+
         </s:if>
+
         <s:else>
             <tr>
-                <td style="vertical-align:middle" colspan="7"><s:text name="bookmarksForm.noresults" /></td>
+                <td style="vertical-align:middle; padding-top: 1em;" colspan="7">
+                    <s:text name="bookmarksForm.noresults"/>
+                </td>
             </tr>
         </s:else>
+
     </table>
-    
-    <div class="control clearfix">
-        <s:if test="folder.bookmarks.size > 0">
-                <%-- Delete-selected button --%>
-                <input type="button" value="<s:text name="bookmarksForm.delete"/>" onclick="onDelete();return false;" />
-        </s:if>
 
-        <s:if test="!allFolders.isEmpty && folder.bookmarks.size > 0">
-            <%-- Move-selected button --%>
-            <s:submit value="%{getText('bookmarksForm.move')}" action="bookmarks!move" onclick="onMove();return false;" />
+    <%-- Add new blogroll link --%>
+    <button type="button" class="btn btn-success" onclick="addBookmark();return false;"
+            style="float:left; margin-right: 2em">
+        <s:text name="bookmarksForm.addBookmark"/>
+    </button>
 
-            <%-- Move-to combo-box --%>
-            <s:select name="targetFolderId" list="allFolders" listKey="id" listValue="name" />
-        </s:if>
+    <s:if test="!allFolders.isEmpty && folder.bookmarks.size > 0">
+        <%-- Move-selected button --%>
+        <s:submit id="move_selected" value="%{getText('bookmarksForm.move')}" theme="simple"
+                  cssClass="btn btn-warning" cssStyle="float:left; margin-right: 0.5em"
+                  action="bookmarks!move" onclick="onMoveToFolder();return false;"/>
+        <%-- Move-to combo-box --%>
+        <s:select name="targetFolderId" theme="simple"
+                  cssClass="form-control" cssStyle="float:left; width:30%; margin-right: 2em"
+                  list="allFolders" listKey="id" listValue="name"/>
+    </s:if>
 
-        <s:if test="folder.name != 'default'">
-            <span style="float:right">
-                <s:submit value="%{getText('bookmarksForm.deleteFolder')}" action="bookmarks!deleteFolder" onclick="onDeleteFolder();return false;"/>
-            </span>
-        </s:if>
-    </div>
+    <s:if test="folder.bookmarks.size > 0">
+        <%-- Delete-selected button --%>
+        <input id="delete_selected" value="<s:text name="bookmarksForm.delete"/>" type="button"
+               class="btn btn-danger" style="float:left;"
+               onclick="confirmDeleteSelected();return false;"/>
+    </s:if>
+
+    <s:if test="folder.name != 'default'">
+        <%-- Delete the whole blogroll --%>
+        <s:submit value="%{getText('bookmarksForm.deleteFolder')}" theme="simple"
+                  cssClass="btn btn-danger" cssStyle="float:right; clear:left; margin-top:2em"
+                  action="bookmarks!deleteFolder"
+                  onclick="confirmDeleteFolder();return false;"/>
+
+    </s:if>
 
 </s:form>
+
+
+<%-- -------------------------------------------------------- --%>
+
+<%-- JavaScript for Main blogroll/folder management interface --%>
+
+<script>
+
+    var originalName;
+    var renameButton;
+    var renameCancel;
+    var deleteSelectedButton;
+    var moveSelectedButton;
+    var viewSelector;
+    var moveToSelector;
+
+    $(document).ready(function () {
+
+        originalName = $("#bookmarks_folder_name:first").val();
+
+        if (!originalName) {
+            originalName = 'default';
+        }
+
+        renameButton = $("#rename_button:first");
+        renameCancel = $("#rename_cancel:first");
+        deleteSelectedButton = $("#delete_selected:first");
+        moveSelectedButton = $("#move_selected:first");
+        viewSelector = $("#bookmarks_viewFolderId:first");
+        moveToSelector = $("#bookmarks_targetFolderId:first");
+
+        nameChanged();
+        selectionChanged();
+
+        // add the "New Blogroll" option to blogroll selectors
+        viewSelector.append(new Option('<s:text name="bookmarksForm.newBlogroll"/>', "new_blogroll"));
+    });
+
+
+    function selectionChanged() {
+        var checked = false;
+        var selected = $("[name=selectedBookmarks]");
+        for (var i in selected) {
+            if (selected[i].checked) {
+                checked = true;
+                break;
+            }
+        }
+        if (checked) {
+            deleteSelectedButton.attr("disabled", false);
+            deleteSelectedButton.addClass("btn-danger");
+
+            moveSelectedButton.attr("disabled", false);
+            moveSelectedButton.addClass("btn-warning");
+
+            moveToSelector.attr("disabled", false);
+
+        } else {
+            deleteSelectedButton.attr("disabled", true);
+            deleteSelectedButton.removeClass("btn-danger");
+
+            moveSelectedButton.attr("disabled", true);
+            moveSelectedButton.removeClass("btn-warning");
+
+            moveToSelector.attr("disabled", true);
+        }
+    }
+
+    function nameChanged() {
+        var newName = $("#bookmarks_folder_name:first").val();
+        if (newName && newName !== originalName && newName.trim().length > 0) {
+            renameButton.attr("disabled", false);
+            renameButton.addClass("btn-success");
+
+            renameCancel.attr("disabled", false);
+
+        } else {
+            renameButton.attr("disabled", true);
+            renameButton.removeClass("btn-success");
+
+            renameCancel.attr("disabled", true);
+        }
+    }
+
+    function renameFolder() {
+
+        var newName = $("#bookmarks_folder_name:first").val();
+        $("#folderEditForm_bean_name").val(newName);
+
+        var folderId = $("#bookmarks_folderId").val();
+        $("#folderEditForm_bean_id").val(folderId);
+
+        // post blogroll via AJAX
+        var folderEditForm = $("#folderEditForm")[0];
+        $.ajax({
+            method: 'post',
+            url: folderEditForm.attributes["action"].value,
+            data: $("#folderEditForm").serialize(),
+            context: document.body
+
+        }).done(function (data, status, response) {
+
+            // kludge: scrape response status from HTML returned by Struts
+            var alertEnd = data.indexOf("ALERT_END");
+            var notUnique = data.indexOf('<s:text name="bookmarkForm.error.duplicateName" />');
+            if (notUnique > 0 && notUnique < alertEnd) {
+                alert('<s:text name="bookmarkForm.error.duplicateName" />');
+
+            } else {
+                originalName = newName;
+                nameChanged();
+            }
+
+        }).error(function (data) {
+            alert('<s:text name="generic.error.check.logs" />');
+        });
+    }
+
+    function cancelRenameFolder(event) {
+        $("#bookmarks_folder_name:first").val(originalName);
+        nameChanged();
+    }
+
+    function confirmDeleteSelected() {
+        $('#delete-links-modal').modal({show: true});
+    }
+
+    function deleteSelected() {
+        document.bookmarks[0].submit();
+    }
+
+    function confirmDeleteFolder() {
+        $('#boomarks_delete_folder_folderId').val($('#bookmarks_folderId:first').val());
+        $('#deleteBlogrollName').html('<s:property value="%{folder.name}"/>');
+        $('#delete-blogroll-modal').modal({show: true});
+    }
+
+    function onMoveToFolder() {
+        var bookmarksForm = $("#bookmarks")[0];
+        bookmarksForm.action = "bookmarks!move.rol";
+        bookmarksForm.submit();
+    }
+
+    function viewChanged() {
+
+        var bookmarksForm = $("#bookmarks")[0];
+        var folderEditForm = $("#folderEditForm")[0];
+
+        if ("new_blogroll" === bookmarksForm.viewFolderId.value) {
+            newBlogroll();
+
+        } else {
+            // user changed the blogroll/folder, post to "view" action to get new page
+            bookmarksForm.action = "bookmarks!view.rol";
+            bookmarksForm.submit();
+        }
+    }
+
+    function newBlogroll() {
+
+        // user selected New Blogroll option, show the add/edit blogroll modal
+        $('#blogroll-edit-title').html('<s:text name="bookmarksForm.addBlogroll.title" />');
+
+        folderEditForm.action = "folderAdd!save.rol";
+        folderEditForm.actionName.value = "folderAdd";
+
+        // disable save button until valid name is entered
+
+        $('#addedit-bookmarkfolder-modal').modal({show: true});
+
+        onBlogrollFormChanged();
+    }
+
+</script>
+
+
+<%-- ================================================================================================ --%>
+
+<%-- add/edit blogroll / folder form --%>
+
+<div id="addedit-bookmarkfolder-modal" class="modal fade addedit-bookmarkfolder-modal" tabindex="-1" role="dialog">
+
+    <div class="modal-dialog modal-lg">
+
+        <div class="modal-content">
+
+            <div class="modal-header">
+                <h3 id="blogroll-edit-title"></h3>
+            </div>
+
+            <div class="modal-body">
+                <s:form action="folderEdit" id="folderEditForm" theme="bootstrap" cssClass="form-horizontal">
+                    <s:hidden name="salt"/>
+                    <s:hidden name="actionName"/>
+                    <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:folderEdit!save" value="save"/>
+
+                    <s:textfield name="bean.name" label="%{getText('generic.name')}" maxlength="255"
+                                 onchange="onBlogrollFormChanged()"
+                                 onkeyup="onBlogrollFormChanged()"
+                    />
+                </s:form>
+            </div> <!-- modal-body-->
+
+            <div class="modal-footer">
+                <p id="feedback-area-blogroll-edit"></p>
+                <button id="save_blogroll" onclick="submitEditedBlogroll()" 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> <!-- modal-content-->
+
+    </div> <!-- modal-dialog -->
+
+</div>
+
+<script>
+
+    <%-- JavaScript for add/edit blogroll modal --%>
+
+    function onBlogrollFormChanged() {
+
+        var saveBlogrollButton = $('#save_blogroll:first');
+
+        var name = $('#folderEditForm_bean_name:first').val().trim();
+
+        if (name.length > 0) {
+            saveBlogrollButton.attr("disabled", false);
+            console.log("Button enabled!");
+
+        } else {
+            saveBlogrollButton.attr("disabled", true);
+            console.log("Button disabled!");
+        }
+
+    }
+
+
+    function submitEditedBlogroll() {
+
+        var folderEditForm = $('#folderEditForm')[0];
+
+        var feedbackAreaBlogrollEdit = $("#feedback-area-blogroll-edit");
+
+        // if name is empty reject and show error message
+        if ($("#folderEditForm_bean_name").val().trim() === "") {
+            feedbackAreaBlogrollEdit.html('<s:text name="bookmarksForm.blogroll.requiredFields" />');
+            feedbackAreaBlogrollEdit.css("color", "red");
+            return;
+        }
+
+        // post blogroll via AJAX
+        $.ajax({
+            method: 'post',
+            url: folderEditForm.attributes["action"].value,
+            data: $("#folderEditForm").serialize(),
+            context: document.body
+
+        }).done(function (data, status, response) {
+
+            // kludge: scrape response status from HTML returned by Struts
+            var alertEnd = data.indexOf("ALERT_END");
+            var notUnique = data.indexOf('<s:text name="bookmarkForm.error.duplicateName" />');
+            if (notUnique > 0 && notUnique < alertEnd) {
+                feedbackAreaBlogrollEdit.css("color", "red");
+                feedbackAreaBlogrollEdit.html('<s:text name="bookmarkForm.error.duplicateName" />');
+
+            } else {
+                feedbackAreaBlogrollEdit.css("color", "green");
+                feedbackAreaBlogrollEdit.html('<s:text name="generic.success" />');
+                $('#blogroll-edit-modal').modal("hide");
+
+                // kludge get folderId from response header send back by Struts action
+                var newFolderId = response.getResponseHeader('folderId');
+                viewSelector.append(new Option('', newFolderId));
+                $("#bookmarks_viewFolderId").val(newFolderId);
+
+                var bookmarksForm = $("#bookmarks")[0];
+                bookmarksForm.action = "bookmarks!view.rol";
+                bookmarksForm.submit();
+            }
+
+        }).error(function (data) {
+            feedbackAreaBlogrollEdit.html('<s:text name="generic.error.check.logs" />');
+            feedbackAreaBlogrollEdit.css("color", "red");
+        });
+    }
+
+</script>
+
+
+<%-- ========================================================================================== --%>
+
+<%-- delete blogroll confirmation modal --%>
+
+<div id="delete-links-modal" class="modal fade delete-links-modal" tabindex="-1" role="dialog">
+
+    <div class="modal-dialog modal-lg">
+
+        <div class="modal-content">
+
+            <div class="modal-header">
+                <h3>
+                    <s:text name="bookmarksForm.delete.confirm"/>
+                </h3>
+            </div>
+
+            <s:form theme="bootstrap" cssClass="form-horizontal">
+                <div class="modal-body">
+                    <s:text name="bookmarksForm.delete.areYouSure" />
+                </div>
+
+                <div class="modal-footer">
+                    <button type="button" class="btn" value="%{getText('generic.yes')}" onclick="deleteSelected()">
+                        <s:text name="generic.yes"/>
+                    </button>
+                    &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>
+
+
+<%-- ========================================================================================== --%>
+
+<%-- delete blogroll confirmation modal --%>
+
+<div id="delete-blogroll-modal" class="modal fade delete-blogroll-modal" tabindex="-1" role="dialog">
+
+    <div class="modal-dialog modal-lg">
+
+        <div class="modal-content">
+
+            <div class="modal-header">
+                <h3>
+                    <s:text name="blogrollDeleteOK.removeBlogroll"/>:
+                    <span id="blogroll-name"></span>
+                </h3>
+            </div>
+
+            <s:form id="boomarks_delete_folder" action="bookmarks!deleteFolder" theme="bootstrap"
+                    cssClass="form-horizontal">
+                <s:hidden name="salt"/>
+                <s:hidden name="weblog"/>
+                <s:hidden name="folderId"/>
+
+                <div class="modal-body">
+                    <s:text name="blogrollDeleteOK.areYouSure" />
+                    <span id="deleteBlogrollName"></span>?
+                </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>
+
+
+<%-- ================================================================================================ --%>
+
+<%-- add/edit link form: a modal --%>
+
+<div id="addedit-bookmark-modal" class="modal fade addedit-bookmark-modal" tabindex="-1" role="dialog">
+
+    <div class="modal-dialog modal-lg">
+
+        <div class="modal-content">
+
+            <div class="modal-header">
+
+                <%-- Titling, processing actions different between add and edit --%>
+                <s:if test="actionName == 'bookmarkEdit'">
+                    <s:set var="subtitleKey">bookmarkForm.edit.subtitle</s:set>
+                    <s:set var="mainAction">bookmarkEdit</s:set>
+                </s:if>
+                <s:else>
+                    <s:set var="subtitleKey">bookmarkForm.add.subtitle</s:set>
+                    <s:set var="mainAction">bookmarkAdd</s:set>
+                </s:else>
+
+                <h3>
+                    <s:text name="%{#subtitleKey}"> </s:text> <span id="subtitle_folder_name"></span>
+                </h3>
+
+                <div id="bookmark_required_fields" role="alert" class="alert">
+                    <s:text name="bookmarkForm.requiredFields"/>
+                </div>
+
+            </div>
+            <%-- modal header --%>
+
+            <div class="modal-body">
+
+                <s:form action="bookmarkEdit" theme="bootstrap" cssClass="form-horizontal">
+                    <s:hidden name="salt"/>
+                    <s:hidden name="weblog"/>
+                    <%--
+                        Edit action uses folderId for redirection back to proper bookmarks folder on cancel
+                        (as configured in struts.xml); add action also, plus to know which folder to put new
+                        bookmark in.
+                    --%>
+                    <s:hidden name="folderId"/>
+                    <s:hidden name="bean.id"/>
+
+                    <s:textfield name="bean.name" maxlength="255"
+                                 onchange="onBookmarkFormChanged()"
+                                 onkeyup="onBookmarkFormChanged()"
+                                 label="%{getText('generic.name')}"/>
+
+                    <s:textfield name="bean.url" maxlength="255"
+                                 onchange="onBookmarkFormChanged()"
+                                 onkeyup="onBookmarkFormChanged()"
+                                 label="%{getText('bookmarkForm.url')}"/>
+
+                    <s:textfield name="bean.feedUrl" maxlength="255"
+                                 onchange="onBookmarkFormChanged()"
+                                 onkeyup="onBookmarkFormChanged()"
+                                 label="%{getText('bookmarkForm.rssUrl')}"/>
+
+                    <s:textfield name="bean.description" maxlength="255"
+                                 onchange="onBookmarkFormChanged()"
+                                 onkeyup="onBookmarkFormChanged()"
+                                 label="%{getText('generic.description')}"/>
+
+                    <s:textfield name="bean.image" maxlength="255"
+                                 onchange="onBookmarkFormChanged()"
+                                 onkeyup="onBookmarkFormChanged()"
+                                 label="%{getText('bookmarkForm.image')}"/>
+                </s:form>
+
+            </div>
+
+            <div class="modal-body">
+                <div class="modal-footer">
+                    <p id="feedback-area-edit"></p>
+                    <button type="button" id="save_bookmark" onclick="saveBookmark()" 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>
+        <%-- modal content --%>
+
+    </div>
+    <%-- modal dialog --%>
+
+</div> <%-- modal --%>
+
+
+<%-- ---------------------------------------------------- --%>
+
+<%-- JavaScript for add/edit link modal --%>
+
+<script>
+
+    function addBookmark() {
+
+        var saveBookmarkButton = $('#save_bookmark:first');
+        saveBookmarkButton.attr("disabled", true);
+
+        var elem = $('#bookmark_required_fields:first');
+        elem.html('<s:text name="bookmarkForm.requiredFields" />');
+        elem.removeClass("alert-success");
+        elem.removeClass("alert-danger");
+        elem.addClass("alert-info");
+
+        $('#bookmarkEdit_bean_name:first').val('');
+        $('#bookmarkEdit_bean_url:first').val('');
+        $('#bookmarkEdit_bean_image:first').val('');
+        $('#bookmarkEdit_bean_feedUrl:first').val('');
+
+        $('#subtitle_folder_name:first').html(originalName);
+
+        $('#addedit-bookmark-modal').modal({show: true});
+    }
+
+
+    function editBookmark(id, name, url, feedUrl, description, image) {
+
+        var saveBookmarkButton = $('#save_bookmark:first');
+        saveBookmarkButton.attr("disabled", true);
+
+        var elem = $('#bookmark_required_fields:first');
+        elem.html('<s:text name="bookmarkForm.requiredFields" />');
+        elem.removeClass("alert-success");
+        elem.removeClass("alert-danger");
+        elem.addClass("alert-info");
+
+        $('#bookmarkEdit_bean_id:first').val(id);
+        $('#bookmark_folderId').val(id);
+        $('#bookmarkEdit_bean_name:first').val(name);
+        $('#bookmarkEdit_bean_url:first').val(url);
+        $('#bookmarkEdit_bean_feedUrl:first').val(feedUrl);
+        $('#bookmarkEdit_bean_description:first').val(description);
+        $('#bookmarkEdit_bean_image:first').val(image);
+
+        $('#subtitle_folder_name:first').html(originalName);
+
+        $('#addedit-bookmark-modal').modal({show: true});
+    }
+
+
+    function onBookmarkFormChanged() {
+
+        var saveBookmarkButton = $('#save_bookmark:first');
+
+        var name = $('#bookmarkEdit_bean_name:first').val().trim();
+        var url = $('#bookmarkEdit_bean_url:first').val().trim();
+        var image = $('#bookmarkEdit_bean_image:first').val().trim();
+        var feedUrl = $('#bookmarkEdit_bean_feedUrl:first').val().trim();
+
+        var badUrls = [];
+
+        if (url.length > 0) {
+            if (!isValidUrl(url)) {
+                badUrls.push("Bookmark URL")
+            }
+        }
+
+        if (image.length > 0) {
+            if (!isValidUrl(image)) {
+                badUrls.push("Image URL")
+            }
+        }
+
+        if (feedUrl.length > 0) {
+            if (!isValidUrl(feedUrl)) {
+                badUrls.push("Newsfeed URL")
+            }
+        }
+
+        var elem = $('#bookmark_required_fields:first');
+        var message = '';
+
+        if (name.length > 0 && url.length > 0 && badUrls.length === 0) {
+            saveBookmarkButton.attr("disabled", false);
+
+            message = '<s:text name="generic.looksGood" />';
+            elem.removeClass("alert-info");
+            elem.removeClass("alert-danger");
+            elem.addClass("alert-success");
+            elem.html(message);
+
+        } else {
+            saveBookmarkButton.attr("disabled", true);
+
+            if (name.length === 0 || url.length === 0) {
+                message = '<s:text name="bookmarkForm.required" />';
+            }
+            if (badUrls.length > 0) {
+                message = '<s:text name="bookmarkForm.badUrls" />';
+                var sep = " ";
+                for (i in badUrls) {
+                    message = message + sep + badUrls[i];
+                    sep = ", ";
+                }
+            }
+            elem.removeClass("alert-info");
+            elem.removeClass("alert-success");
+            elem.addClass("alert-danger");
+            elem.html(message);
+        }
+    }
+
+
+    function saveBookmark() {
+
+        var feedbackAreaEdit = $("#feedback-area-edit");
+
+        // post bookmark via AJAX
+        $.ajax({
+            method: 'post',
+            url: "bookmarkEdit!save.rol",
+            data: $("#bookmarkEdit").serialize(),
+            context: document.body
+
+        }).done(function (data) {
+
+            // kludge: scrape response status from HTML returned by Struts
+            var alertEnd = data.indexOf("ALERT_END");
+            var notUnique = data.indexOf('<s:text name="bookmarkForm.error.duplicateName" />');
+            if (notUnique > 0 && notUnique < alertEnd) {
+                feedbackAreaEdit.css("color", "red");
+                feedbackAreaEdit.html('<s:text name="bookmarkForm.error.duplicateName" />');
+
+            } else {
+                feedbackAreaEdit.css("color", "green");
+                feedbackAreaEdit.html('<s:text name="generic.success" />');
+                $('#addedit-bookmark-modal').modal("hide");
+
+                // cause page to be reloaded so that edit appears
+                // and make sure we end up on the right folder
+                bookmarksForm = $("#bookmarks")[0];
+                bookmarksForm.viewFolderId.value = bookmarksForm.folderId.value;
+                viewChanged();
+            }
+
+        }).error(function (data) {
+            feedbackAreaEdit.html('<s:text name="generic.error.check.logs" />');
+            feedbackAreaEdit.css("color", "red");
+        });
+    }
+
+</script>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/BookmarksSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/BookmarksSidebar.jsp
index 7d3986d..9c16eed 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/BookmarksSidebar.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/BookmarksSidebar.jsp
@@ -17,48 +17,27 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<div class="sidebarFade">
-    <div class="menu-tr">
-        <div class="menu-tl">
-            
-            <div class="sidebarInner">
-                
-                <h3><s:text name="mainPage.actions" /></h3>
-                <hr size="1" noshade="noshade" />
-                
-                <p>
-                    <%-- Add Bookmark link --%>
-                    <img src='<s:url value="/images/link_add.png"/>' border="0"alt="icon" />
-                    <s:url var="addBookmark" action="bookmarkAdd">
-                        <s:param name="weblog" value="%{actionWeblog.handle}" />
-                        <s:param name="folderId" value="%{folder.id}" />
-                    </s:url>
-                    <s:a href="%{addBookmark}"><s:text name="bookmarksForm.addBookmark" /></s:a>
-                </p>
-                
-                <p>
-                    <%-- Add Folder link --%>
-                    <img src='<s:url value="/images/folder_add.png"/>' border="0"alt="icon" />
-                    <s:url var="addFolder" action="folderAdd">
-                        <s:param name="weblog" value="%{actionWeblog.handle}" />
-                        <s:param name="folderId" value="%{folder.id}" />
-                    </s:url>
-                    <s:a href="%{addFolder}"><s:text name="bookmarksForm.addFolder" /></s:a>
-                </p>
-                
-                <%-- Import bookmarks --%>
-                <p>
-                    <img src='<s:url value="/images/link_add.png"/>' border="0"alt="icon" />
-                    <s:url var="importBookmarks" action="bookmarksImport">
-                        <s:param name="weblog" value="%{actionWeblog.handle}" />
-                    </s:url>
-                    <s:a href="%{importBookmarks}"><s:text name="bookmarksForm.importBookmarks" /></s:a>
-                </p>
+<h3><s:text name="mainPage.actions"/></h3>
+<hr size="1" noshade="noshade"/>
 
-                <br />
-                <br />
-            </div>
-            
-        </div>
-    </div>
-</div>	
+<p>
+    <%-- Add Blogroll --%>
+
+    <a href="#" onclick="newBlogroll()">
+        <span class="glyphicon glyphicon-plus"></span>
+        <s:text name="bookmarksForm.addFolder"/>
+    </a>
+</p>
+
+<%-- Import bookmarks
+<p>
+    <s:url var="importBookmarks" action="bookmarksImport">
+        <s:param name="weblog" value="%{actionWeblog.handle}"/>
+    </s:url>
+    <s:a href="%{importBookmarks}">
+        <span class="glyphicon glyphicon-plus"></span>
+        <s:text name="bookmarksForm.importBookmarks"/>
+    </s:a>
+</p>
+--%>
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp
index ed9c43f..4d9ca17 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Categories.jsp
@@ -17,89 +17,283 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<%-- JavaScript for categories table --%> 
-<script>
-function onMove()
-{
-    if ( confirm("<s:text name='categoriesForm.move.confirm' />") ) 
-    {
-        document.categories.method.value = "moveSelected";
-        document.categories.submit();
-    }
-}
-</script>
-
 <p class="subtitle">
-    <s:text name="categoriesForm.subtitle" >
-        <s:param value="weblog" />
+    <s:text name="categoriesForm.subtitle">
+        <s:param value="weblog"/>
     </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 class="rollertable table table-striped" width="100%">
+
         <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:if test="AllCategories != null && !AllCategories.isEmpty">
+
+            <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 var="categoryId"    value="#category.id" />
+                        <s:set var="categoryName"  value="#category.name" />
+                        <s:set var="categoryDesc"  value="#category.description" />
+                        <s:set var="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 var="categoryId"    value="#category.id" />
+                            <s:set var="categoryName"  value="#category.name" />
+                            <s:set var="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="categoryEdit" 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"
+                                 onchange="validateCategory()" onkeyup="validateCategory()" />
+
+                    <s:textfield name="bean.description" label="%{getText('generic.description')}"/>
+
+                    <s:textfield name="bean.image" label="%{getText('categoryForm.image')}"
+                                 onchange="validateCategory()" onkeyup="validateCategory()" />
+                </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 validateCategory() {
+
+        var saveCategoryButton = $('#categoryEditForm:first');
+
+        var categoryName = $("#categoryEditForm_bean_name").val();
+        var imageURL = $("#categoryEditForm_bean_image").val();
+
+        if (!categoryName || categoryName.trim() === '') {
+            saveCategoryButton.attr("disabled", true);
+            feedbackAreaEdit.html('<s:text name="categoryForm.requiredFields" />');
+            feedbackAreaEdit.css("color", "red");
+            return;
+        }
+
+        if (imageURL && imageURL.trim() !== '') {
+            if (!isValidUrl(imageURL)) {
+                saveCategoryButton.attr("disabled", true);
+                feedbackAreaEdit.html('<s:text name="categoryForm.badURL" />');
+                feedbackAreaEdit.css("color", "red");
+                return;
+            }
+        }
+
+        feedbackAreaEdit.html('');
+        saveCategoryButton.attr("disabled", false);
+    }
+
+    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");
+            var notUnique = data.indexOf('<s:text name="categoryForm.error.duplicateName" />');
+            if (notUnique > 0 && notUnique < 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 btn-danger" value="%{getText('generic.yes')}"/>&nbsp;
+                    <button type="button" class="btn btn-default" 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>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/CategoriesSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/CategoriesSidebar.jsp
index 261e89c..ca4b34a 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/CategoriesSidebar.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/CategoriesSidebar.jsp
@@ -17,26 +17,39 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<div class="sidebarFade">
-    <div class="menu-tr">
-        <div class="menu-tl">
-            
-            <div class="sidebarInner">
-                <h3><s:text name="mainPage.actions" /></h3>
-                <hr size="1" noshade="noshade" />
-                
-                <p>
-                    <%-- Add Category link --%>
-                    <img src='<s:url value="/images/folder_add.png"/>' border="0"alt="icon" />
-                    <s:url var="addCategory" action="categoryAdd">
-                        <s:param name="weblog" value="%{actionWeblog.handle}" />
-                    </s:url>
-                    <s:a href="%{addCategory}"><s:text name="categoriesForm.addCategory" /></s:a>
-                </p>
-                
-                <br />
-            </div>
-            
-        </div>
-    </div>
-</div>
+<h3><s:text name="mainPage.actions"/></h3>
+<hr size="1" noshade="noshade"/>
+
+<p>
+    <s:set var="categoryId" value="#bean.id"/>
+    <s:set var="categoryName" value="#post.name"/>
+    <s:set var="categoryDesc" value="#post.description"/>
+    <s:set var="categoryImage" value="#post.image"/>
+
+    <a href="#" onclick="showCategoryAddModal()">
+        <span class="glyphicon glyphicon-plus"></span>
+        <s:text name="categoriesForm.addCategory"/>
+    </a>
+</p>
+
+<script>
+
+    var feedbackArea = $("#feedback-area");
+
+    function showCategoryAddModal() {
+
+        feedbackAreaEdit.html("");
+        $('#category-edit-title').html('<s:text name="categoryForm.add.title" />');
+
+        $('#categoryEditForm_bean_id').val("");
+        $('#categoryEditForm_bean_name').val("");
+        $('#categoryEditForm_bean_description').val("");
+        $('#categoryEditForm_bean_image').val("");
+
+        validateCategory();
+
+        $('#category-edit-modal').modal({show: true});
+    }
+
+</script>
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/CategoryEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/CategoryEdit.jsp
deleted file mode 100644
index c57c59a..0000000
--- a/app/src/main/webapp/WEB-INF/jsps/editor/CategoryEdit.jsp
+++ /dev/null
@@ -1,72 +0,0 @@
-<%--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  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.  For additional information regarding
-  copyright in this work, please see the NOTICE file in the top level
-  directory of this distribution.
---%>
-<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-
-<%-- Titling, processing actions different between add and edit --%>
-<s:if test="actionName == 'categoryEdit'">
-    <s:set var="subtitleKey">categoryForm.edit.subtitle</s:set>
-    <s:set var="mainAction">categoryEdit</s:set>
-</s:if>
-<s:else>
-    <s:set var="subtitleKey">categoryForm.add.subtitle</s:set>
-    <s:set var="mainAction">categoryAdd</s:set>
-</s:else>
-
-<p class="subtitle">
-    <s:text name="%{#subtitleKey}" />
-</p>
-
-<p class="pagetip">
-    <s:text name="categoryForm.requiredFields">
-        <s:param><s:text name="generic.name"/></s:param>
-    </s:text>
-</p>
-
-<s:form action="categoryEdit!save">
-    <s:hidden name="salt" />
-    <s:hidden name="weblog" />
-    <s:if test="actionName == 'categoryEdit'">
-        <%-- bean for add does not have a bean id yet --%>
-        <s:hidden name="bean.id" />
-    </s:if>
-
-    <table>
-        
-        <tr>
-            <td><s:text name="generic.name" /></td>
-            <td><s:textfield name="bean.name" size="70" maxlength="255" style="width:50%"/></td>
-        </tr>
-        
-        <tr>
-            <td><s:text name="generic.description" /></td>
-            <td><s:textfield name="bean.description" size="120" style="width:50%"/></td>
-        </tr>
-
-        <tr>
-            <td><s:text name="categoryForm.image" /></td>
-            <td><s:textfield name="bean.image" size="120" style="width:50%"/></td>
-        </tr>
-
-    </table>
-    
-    <p>
-        <s:submit value="%{getText('generic.save')}" action="%{#mainAction}!save"/>
-        <s:submit value="%{getText('generic.cancel')}" action="categoryEdit!cancel" />
-    </p>
-    
-</s:form>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/CategoryRemove.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/CategoryRemove.jsp
deleted file mode 100644
index 43da075..0000000
--- a/app/src/main/webapp/WEB-INF/jsps/editor/CategoryRemove.jsp
+++ /dev/null
@@ -1,51 +0,0 @@
-<%--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  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.  For additional information regarding
-  copyright in this work, please see the NOTICE file in the top level
-  directory of this distribution.
---%>
-<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-
-<h3>
-    <s:text name="categoryDeleteOK.removeCategory" />
-    [<s:property value="category.name" />]
-</h3>
-
-<s:form action="categoryRemove!remove">
-	<s:hidden name="salt" />
-    <s:hidden name="weblog" />
-    <s:hidden name="removeId" />
-
-    <s:if test="category.inUse" >
-        <br />
-        <span class="warning">
-            <s:text name="categoryDeleteOK.warningCatInUse" />
-        </span>
-        <p><s:text name="categoryDeleteOK.youMustMoveEntries" /><p>
-            <s:text name="categoryDeleteOK.moveToWhere" />
-            <s:select name="targetCategoryId" list="allCategories" listKey="id" listValue="name" />
-        </p>
-    </s:if>
-    <s:else>
-        <p><s:text name="categoryDeleteOK.noEntriesInCat" /></p>
-    </s:else>
-    
-    <p>
-        <strong><s:text name="categoryDeleteOK.areYouSure" /></strong>
-    </p>
-    
-    <s:submit value="%{getText('generic.yes')}" />&nbsp;
-    <s:submit value="%{getText('generic.no')}" action="categoryRemove!cancel" />
-    
-</s:form>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp
index 929d72e..7a329b9 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Comments.jsp
@@ -17,8 +17,8 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
-<script src="<s:url value="/roller-ui/scripts/jquery-2.1.1.min.js" />"></script>
 
+<%-- are we on a blog's comment management page or the global admin's comment management page? --%>
 <s:if test="actionName == 'comments'">
     <s:set var="mainAction">comments</s:set>
 </s:if>
@@ -26,36 +26,6 @@
     <s:set var="mainAction">globalCommentManagement</s:set>
 </s:else>
 
-<script>
-<s:if test="pager.items != null">
-    $(document).ready(function(){
-        $('#checkallapproved').click(function() {
-            toggleFunction(true,"bean.approvedComments");
-        });
-        $('#clearallapproved').click(function() {
-            toggleFunction(false,"bean.approvedComments");
-        });
-        $('#checkallspam').click(function() {
-            toggleFunction(true,"bean.spamComments");
-        });
-        $('#clearallspam').click(function() {
-            toggleFunction(false,"bean.spamComments");
-        });
-        $('#checkalldelete').click(function() {
-            toggleFunction(true,"bean.deleteComments");
-        });
-        $('#clearalldelete').click(function() {
-            toggleFunction(false,"bean.deleteComments");
-        });
-    });
-</s:if>
-    function bulkDelete() {
-        if (window.confirm('<s:text name="commentManagement.confirmBulkDelete"><s:param value="bulkDeleteCount" /></s:text>')) {
-            document.commentQueryForm.method.value = "bulkDelete";
-            document.commentQueryForm.submit();
-        }
-    }
-</script>
 
 <p class="subtitle">
     <s:if test="actionName == 'comments'">
@@ -71,306 +41,372 @@
         </s:else>
     </s:if>
     <s:else>
-        <s:text name="commentManagement.subtitle" />
+        <s:text name="commentManagement.subtitle"/>
     </s:else>
 </p>
 
 <s:if test="pager.items.isEmpty">
-    <s:text name="commentManagement.noCommentsFound" />
+    <s:text name="commentManagement.noCommentsFound"/>
 </s:if>
 <s:else>
     <p class="pagetip">
         <s:if test="actionName == 'comments'">
-            <s:text name="commentManagement.tip" />
+            <s:text name="commentManagement.tip"/>
         </s:if>
         <s:else>
-            <s:text name="commentManagement.globalTip" />
+            <s:text name="commentManagement.globalTip"/>
         </s:else>
     </p>
 
-<%-- ============================================================= --%>
-<%-- Comment table / form with checkboxes --%>
-<%-- ============================================================= --%>
+    <%-- ============================================================= --%>
+    <%-- Comment table / form with checkboxes --%>
 
-<s:form action="%{#mainAction}!update">
-    <s:hidden name="salt" />
-    <s:hidden name="bean.ids" />
-    <s:hidden name="bean.startDateString" />
-    <s:hidden name="bean.endDateString" />
-    <s:if test="actionName == 'comments'">
-        <s:hidden name="bean.entryId" />
-        <s:hidden name="bean.searchString" />
-        <s:hidden name="bean.approvedString" />
-        <s:hidden name="weblog" />
-    </s:if>
-    <s:else>
-        <s:hidden name="bean.offset" />
-        <s:hidden name="bean.count" />
-        <s:hidden name="bean.pendingString" />
-    </s:else>
+    <s:form action="%{#mainAction}!update">
+        <s:hidden name="salt"/>
+        <s:hidden name="bean.ids"/>
+        <s:hidden name="bean.startDateString"/>
+        <s:hidden name="bean.endDateString"/>
+        <s:if test="actionName == 'comments'">
+            <s:hidden name="bean.entryId"/>
+            <s:hidden name="bean.searchString"/>
+            <s:hidden name="bean.approvedString"/>
+            <s:hidden name="weblog"/>
+        </s:if>
+        <s:else>
+            <s:hidden name="bean.offset"/>
+            <s:hidden name="bean.count"/>
+            <s:hidden name="bean.pendingString"/>
+        </s:else>
 
 
-<%-- ============================================================= --%>
-<%-- Number of comments and date message --%>
-<%-- ============================================================= --%>
+        <%-- ============================================================= --%>
+        <%-- Number of comments and date message --%>
 
         <div class="tablenav">
 
             <div style="float:left;">
                 <s:text name="commentManagement.nowShowing">
-                    <s:param value="pager.items.size()" />
+                    <s:param value="pager.items.size()"/>
                 </s:text>
             </div>
             <div style="float:right;">
                 <s:if test="firstComment.postTime != null">
                     <s:text name="commentManagement.date.toStringFormat">
-                        <s:param value="firstComment.postTime" />
+                        <s:param value="firstComment.postTime"/>
                     </s:text>
                 </s:if>
                 ---
                 <s:if test="lastComment.postTime != null">
                     <s:text name="commentManagement.date.toStringFormat">
-                        <s:param value="lastComment.postTime" />
+                        <s:param value="lastComment.postTime"/>
                     </s:text>
                 </s:if>
             </div>
-            <br />
+            <br/>
 
 
-    <%-- ============================================================= --%>
-    <%-- Next / previous links --%>
-    <%-- ============================================================= --%>
+                <%-- ============================================================= --%>
+                <%-- Next / previous links --%>
 
-            <s:if test="pager.prevLink != null && pager.nextLink != null">
-                <br /><center>
-                    &laquo;
-                    <a href='<s:property value="pager.prevLink" />'>
-                    <s:text name="commentManagement.prev" /></a>
-                    | <a href='<s:property value="pager.nextLink" />'>
-                    <s:text name="commentManagement.next" /></a>
-                    &raquo;
-                </center><br />
-            </s:if>
-            <s:elseif test="pager.prevLink != null">
-                <br /><center>
-                    &laquo;
-                    <a href='<s:property value="pager.prevLink" />'>
-                    <s:text name="commentManagement.prev" /></a>
-                    | <s:text name="commentManagement.next" />
-                    &raquo;
-                </center><br />
-            </s:elseif>
-            <s:elseif test="pager.nextLink != null">
-                <br /><center>
-                    &laquo;
-                    <s:text name="commentManagement.prev" />
-                    | <a class="" href='<s:property value="pager.nextLink" />'>
-                    <s:text name="commentManagement.next" /></a>
-                    &raquo;
-                </center><br />
-            </s:elseif>
-            <s:else><br /></s:else>
+            <nav>
+                <ul class="pager">
+                    <s:if test="pager.prevLink != null">
+                        <li class="previous">
+                            <a href='<s:property value="pager.prevLink" />'>
+                                <span aria-hidden="true">&larr;</span>Newer</a>
+                        </li>
+                    </s:if>
+                    <s:if test="pager.nextLink != null">
+                        <li class="next">
+                            <a href='<s:property value="pager.nextLink"/>'>Older
+                                <span aria-hidden="true">&rarr;</span></a>
+                        </li>
+                    </s:if>
+                </ul>
+            </nav>
 
         </div> <%-- class="tablenav" --%>
 
 
-<%-- ============================================================= --%>
-<%-- Bulk comment delete link --%>
-<%-- ============================================================= --%>
+        <%-- ============================================================= --%>
+        <%-- Bulk comment delete link --%>
+        <%-- ============================================================= --%>
 
         <s:if test="bulkDeleteCount > 0">
             <p>
                 <s:text name="commentManagement.bulkDeletePrompt1">
-                    <s:param value="bulkDeleteCount" />
+                    <s:param value="bulkDeleteCount"/>
                 </s:text>
                 <a href="#" onclick="bulkDelete()">
-                    <s:text name="commentManagement.bulkDeletePrompt2" />
+                    <s:text name="commentManagement.bulkDeletePrompt2"/>
                 </a>
             </p>
         </s:if>
 
+        <table class="rollertable table table-striped" width="100%">
 
-        <table class="rollertable" width="100%">
-
-            <%-- ======================================================== --%>
-            <%-- Comment table header --%>
+                <%-- ======================================================== --%>
+                <%-- Comment table header --%>
 
             <tr>
                 <s:if test="actionName == 'comments'">
                     <th class="rollertable" width="5%">
-                        <s:text name="commentManagement.columnApproved" />
+                        <s:text name="commentManagement.columnApproved"/>
                     </th>
                 </s:if>
                 <th class="rollertable" width="5%">
-                    <s:text name="commentManagement.columnSpam" />
+                    <s:text name="commentManagement.columnSpam"/>
                 </th>
-                <th class="rollertable" width="5%" >
-                    <s:text name="generic.delete" />
+                <th class="rollertable" width="5%">
+                    <s:text name="generic.delete"/>
                 </th>
                 <th class="rollertable">
-                    <s:text name="commentManagement.columnComment" />
+                    <s:text name="commentManagement.columnComment"/>
                 </th>
             </tr>
 
-            <%-- ======================================================== --%>
-            <%-- Select ALL and NONE buttons --%>
+                <%-- ======================================================== --%>
+                <%-- Select ALL and NONE buttons --%>
 
             <tr class="actionrow">
                 <s:if test="actionName == 'comments'">
                     <td align="center">
-                        <s:text name="commentManagement.select" /><br/>
+                        <s:text name="commentManagement.select"/><br/>
 
-                        <span id="checkallapproved"><a href="#"><s:text name="generic.all" /></a></span><br />
-                        <span id="clearallapproved"><a href="#"><s:text name="generic.none" /></a></span>
+                        <span id="checkallapproved"><a href="#"><s:text name="generic.all"/></a></span><br/>
+                        <span id="clearallapproved"><a href="#"><s:text name="generic.none"/></a></span>
                     </td>
                 </s:if>
                 <td align="center">
-                    <s:text name="commentManagement.select" /><br/>
+                    <s:text name="commentManagement.select"/><br/>
 
-                    <span id="checkallspam"><a href="#"><s:text name="generic.all" /></a></span><br />
-                    <span id="clearallspam"><a href="#"><s:text name="generic.none" /></a></span>
+                    <span id="checkallspam"><a href="#"><s:text name="generic.all"/></a></span><br/>
+                    <span id="clearallspam"><a href="#"><s:text name="generic.none"/></a></span>
                 </td>
                 <td align="center">
-                    <s:text name="commentManagement.select" /><br/>
+                    <s:text name="commentManagement.select"/><br/>
 
-                    <span id="checkalldelete"><a href="#"><s:text name="generic.all" /></a></span><br />
-                    <span id="clearalldelete"><a href="#"><s:text name="generic.none" /></a></span>
+                    <span id="checkalldelete"><a href="#"><s:text name="generic.all"/></a></span><br/>
+                    <span id="clearalldelete"><a href="#"><s:text name="generic.none"/></a></span>
                 </td>
                 <td align="right">
-                    <br />
+                    <br/>
                     <span class="pendingCommentBox">&nbsp;&nbsp;&nbsp;&nbsp;</span>
-                    <s:text name="commentManagement.pending" />&nbsp;&nbsp;
+                    <s:text name="commentManagement.pending"/>&nbsp;&nbsp;
                     <span class="spamCommentBox">&nbsp;&nbsp;&nbsp;&nbsp;</span>
-                    <s:text name="commentManagement.spam" />&nbsp;&nbsp;
+                    <s:text name="commentManagement.spam"/>&nbsp;&nbsp;
                 </td>
             </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 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" cssClass="comment-select"
+                                            list="#comment" listKey="id" listValue="emptyString" />
                         </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" cssClass="comment-select"
+                                        list="#comment" listKey="id" listValue="emptyString"  />
                     </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" cssClass="comment-select"
+                                        list="#comment" listKey="id" listValue="emptyString"  />
                     </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>
-                                        </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="viewdetails bot">
+
                                         <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.entryTitled"/>&nbsp;:&nbsp;
+                                            <a href='<s:property value="#comment.weblogEntry.permalink" />'>
+                                                <s:property value="#comment.weblogEntry.title"/></a>
                                         </div>
-                                    </s:if>
-                                    <div class="details">
-                                        <s:text name="commentManagement.postTime" />&nbsp;:&nbsp;
-                                        <s:date name="#comment.postTime"/>
+
+                                        <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>
+
+                                        <div class="details">
+                                            <s:text name="commentManagement.postTime"/>&nbsp;:&nbsp;
+                                            <s:date name="#comment.postTime"/>
+                                        </div>
+
                                     </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" 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;
                                               </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>
         </table>
-        <br />
+
+        <%-- ============================================================= --%>
+        <%-- Next / previous links --%>
+
+        <nav>
+            <ul class="pager">
+                <s:if test="pager.prevLink != null">
+                    <li class="previous">
+                        <a href='<s:property value="pager.prevLink" />'>
+                            <span aria-hidden="true">&larr;</span>Newer</a>
+                    </li>
+                </s:if>
+                <s:if test="pager.nextLink != null">
+                    <li class="next">
+                        <a href='<s:property value="pager.nextLink"/>'>Older
+                            <span aria-hidden="true">&rarr;</span></a>
+                    </li>
+                </s:if>
+            </ul>
+        </nav>
+
+        <%-- ========================================================= --%>
+        <%-- Save changes and cancel buttons --%>
+
+        <hr size="1" noshade="noshade"/>
+        <s:submit cssClass="btn btn-primary" value="%{getText('commentManagement.update')}"/>
+
+    </s:form>
+
+</s:else>
 
 
-    <script>
-    <!--
+<script>
+
+    <%-- setup check all/none checkbox controls --%>
+    <s:if test="pager.items != null">
+    $(document).ready(function () {
+        $('#checkallapproved').click(function () {
+            toggleFunction(true, "bean.approvedComments");
+        });
+        $('#clearallapproved').click(function () {
+            toggleFunction(false, "bean.approvedComments");
+        });
+        $('#checkallspam').click(function () {
+            toggleFunction(true, "bean.spamComments");
+        });
+        $('#clearallspam').click(function () {
+            toggleFunction(false, "bean.spamComments");
+        });
+        $('#checkalldelete').click(function () {
+            toggleFunction(true, "bean.deleteComments");
+        });
+        $('#clearalldelete').click(function () {
+            toggleFunction(false, "bean.deleteComments");
+        });
+    });
+    </s:if>
+
+    <%-- TODO: hook this up; it is currently not working in Roller trunk either --%>
+
+    function bulkDelete() {
+        if (window.confirm('<s:text name="commentManagement.confirmBulkDelete"><s:param value="bulkDeleteCount" /></s:text>')) {
+            document.commentQueryForm.method.value = "bulkDelete";
+            document.commentQueryForm.submit();
+        }
+    }
+
     var comments = {};
 
     function editComment(id) {
@@ -393,7 +429,7 @@
         var salt = $("#comments_salt").val();
         $.ajax({
             type: "POST",
-            url: '<%= request.getContextPath()%>/roller-ui/authoring/commentdata?id=' + id +'&salt='+salt,
+            url: '<%= request.getContextPath()%>/roller-ui/authoring/commentdata?id=' + id + '&salt=' + salt,
             data: content,
             dataType: "text",
             processData: "false",
@@ -426,7 +462,7 @@
         $.ajax({
             type: "GET",
             url: '<%= request.getContextPath()%>/roller-ui/authoring/commentdata?id=' + id,
-            success: function(data) {
+            success: function (data) {
                 var cdata = eval("(" + data + ")");
                 $("#comment-" + cdata.id).html(cdata.content);
                 $("#link-" + id).detach();
@@ -434,16 +470,5 @@
             }
         });
     }
-    -->
+
 </script>
-
-
-<%-- ========================================================= --%>
-<%-- Save changes and cancel buttons --%>
-<%-- ========================================================= --%>
-
-        <s:submit value="%{getText('commentManagement.update')}" />
-
-    </s:form>
-
-</s:else>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/CommentsSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/CommentsSidebar.jsp
index fe145d7..54ccfd9 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/CommentsSidebar.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/CommentsSidebar.jsp
@@ -17,10 +17,6 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/jquery-ui-1.11.0/jquery-ui.min.css"/>' />
-<script src="<s:url value="/roller-ui/scripts/jquery-2.1.1.min.js" />"></script>
-<script src='<s:url value="/roller-ui/jquery-ui-1.11.0/jquery-ui.min.js"/>'></script>
-
 <s:if test="actionName == 'comments'">
     <s:set var="mainAction">comments</s:set>
 </s:if>
@@ -28,85 +24,92 @@
     <s:set var="mainAction">globalCommentManagement</s:set>
 </s:else>
 
-<div class="sidebarFade">
-    <div class="menu-tr">
-        <div class="menu-tl">
+<h3><s:text name="commentManagement.sidebarTitle"/></h3>
+<hr size="1" noshade="noshade"/>
 
-<div class="sidebarInner">
+<p><s:text name="commentManagement.sidebarDescription"/></p>
 
-<h3><s:text name="commentManagement.sidebarTitle" /></h3>
-<hr size="1" noshade="noshade" />
+<s:form action="%{#mainAction}!query" id="commentsQuery" theme="bootstrap" cssClass="form-vertical">
 
-<p><s:text name="commentManagement.sidebarDescription" /></p>
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog"/>
+
+    <%-- ========================================================= --%>
+    <%-- filter by search string --%>
+
+    <s:textfield name="bean.searchString" label="%{getText('commentManagement.searchString')}" size="15"/>
+
+    <script>
+        $(function () {
+            $("#entries_bean_startDateString").datepicker();
+        });
+    </script>
+
+    <%-- ========================================================= --%>
+    <%-- filter by date --%>
+
+    <script>
+        // jQuery UI Date Picker
+        $(function () {
+            $("#commentsQuery_bean_startDateString").datepicker();
+        });
+    </script>
     
- <s:form action="%{#mainAction}!query" id="commentsQuery">
-	<s:hidden name="salt" />
-    <s:hidden name="weblog" />
-    
-    <div class="sideformrow">
-        <label for="searchString" class="sideformrow"><s:text name="commentManagement.searchString" />:</label>   
-        <s:textfield name="bean.searchString" size="15" />
-    </div>
-    <br />
-    <br />
-    
-    <div class="sideformrow">
-        <label for="startDateString" class="sideformrow"><s:text name="commentManagement.startDate" />:</label>
-            <script>
-            $(function() {
-                $( "#commentsQuery_bean_startDateString" ).datepicker({
-                    showOn: "button",
-                    buttonImage: "../../images/calendar.png",
-                    buttonImageOnly: true,
-                    changeMonth: true,
-                    changeYear: true
-                });
-            });
-            </script>
-            <s:textfield name="bean.startDateString" size="12" readonly="true"/>
-    </div>
-        
-    <div class="sideformrow">
-        <label for="endDateString" class="sideformrow"><s:text name="commentManagement.endDate" />:</label>
-            <script>
-            $(function() {
-                $( "#commentsQuery_bean_endDateString" ).datepicker({
-                    showOn: "button",
-                    buttonImage: "../../images/calendar.png",
-                    buttonImageOnly: true,
-                    changeMonth: true,
-                    changeYear: true
-                });
-            });
-            </script>
-            <s:textfield name="bean.endDateString" size="12" readonly="true"/>
-    </div>
-    <br />
-    <br />
-  
-    <div class="sideformrow">
-        <label for="approvedString" class="sideformrow">
-            <s:text name="commentManagement.pendingStatus" />
-            <br />
-            <br />
-            <br />
-            <br />            
-            <br />
-        </label> 
-        <div>
-            <s:radio theme="roller" name="bean.approvedString" list="commentStatusOptions" listKey="key" listValue="value" />
+    <div class="control-group">
+        <label for="bean.startDateString" class="control-label">
+            <s:text name="commentManagement.startDate"/>
+        </label>
+        <div class="controls">
+            <div class="input-group">
+
+                <s:textfield name="bean.startDateString" readonly="true"
+                             theme="simple" cssClass="date-picker form-control"/>
+                <label for="bean.startDateString" class="input-group-addon btn">
+                    <span class="glyphicon glyphicon-calendar"></span>
+                </label>
+
+            </div>
         </div>
-    </div> 
-    <br />
+    </div>
 
-    <s:submit value="%{getText('commentManagement.query')}" />
-            
+    <script>
+        // jQuery UI Date Picker
+        $(function () {
+            $("#commentsQuery_bean_endDateString").datepicker();
+        });
+    </script>
+
+    <div class="control-group">
+        <label for="bean.endDateString" class="control-label">
+            <s:text name="commentManagement.endDate"/>
+        </label>
+        <div class="controls">
+            <div class="input-group">
+
+                <s:textfield name="bean.endDateString" readonly="true"
+                             theme="simple" cssClass="date-picker form-control"/>
+                <label for="bean.endDateString" class="input-group-addon btn">
+                    <span class="glyphicon glyphicon-calendar"></span>
+                </label>
+
+            </div>
+        </div>
+    </div>
+
+    <br/>
+
+    <%-- ========================================================= --%>
+    <%-- filter by status--%>
+
+    <s:radio name="bean.approvedString" 
+             label="%{getText('commentManagement.pendingStatus')}" 
+             list="commentStatusOptions" listKey="key" listValue="value"/>
+
+    
+    <%-- ========================================================= --%>
+    <%-- filter button --%>
+
+    <s:submit cssClass="btn btn-default" value="%{getText('commentManagement.query')}"/>
+
 </s:form>
 
-<br />
-<br />
-</div> <!-- sidebarInner -->
-
-        </div>
-    </div>
-</div>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/Entries.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/Entries.jsp
index eac0689..6374a79 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Entries.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Entries.jsp
@@ -28,76 +28,30 @@
 
 
 <%-- ============================================================= --%>
-<%-- Number of entries and date message --%>
-<%-- ============================================================= --%>
+<%-- Next / previous links --%>
 
-<div class="tablenav">
-    
-    <div style="float:left;">
-        <s:text name="weblogEntryQuery.nowShowing">
-            <s:param value="pager.items.size()" />
-        </s:text>
-    </div>
-    <s:if test="pager.items.size() > 0">
-        <div style="float:right;">
-            <s:if test="firstEntry.pubTime != null">
-                <s:text name="weblogEntryQuery.date.toStringFormat">
-                    <s:param value="firstEntry.pubTime" />
-                </s:text>
-            </s:if>
-            ---
-            <s:if test="lastEntry.pubTime != null">
-                <s:text name="weblogEntryQuery.date.toStringFormat">
-                    <s:param value="lastEntry.pubTime" />
-                </s:text>
-            </s:if>
-        </div>
-    </s:if>
-    <br />
-    
-    
-    <%-- ============================================================= --%>
-    <%-- Next / previous links --%>
-    <%-- ============================================================= --%>
-    
-    <s:if test="pager.prevLink != null && pager.nextLink != null">
-        <br /><center>
-            &laquo;
-            <a href='<s:property value="pager.prevLink" />'>
-            <s:text name="weblogEntryQuery.prev" /></a>
-            | <a href='<s:property value="pager.nextLink" />'>
-            <s:text name="weblogEntryQuery.next" /></a>
-            &raquo;
-        </center><br />
-    </s:if>
-    <s:elseif test="pager.prevLink != null">
-        <br /><center>
-            &laquo;
-            <a href='<s:property value="pager.prevLink" />'>
-            <s:text name="weblogEntryQuery.prev" /></a>
-            | <s:text name="weblogEntryQuery.next" />
-            &raquo;
-        </center><br />
-    </s:elseif>
-    <s:elseif test="pager.nextLink != null">
-        <br /><center>
-            &laquo;
-            <s:text name="weblogEntryQuery.prev" />
-            | <a class="" href='<s:property value="pager.nextLink" />'>
-            <s:text name="weblogEntryQuery.next" /></a>
-            &raquo;
-        </center><br />
-    </s:elseif>
-    <s:else><br /></s:else>
-    
-</div> <%-- class="tablenav" --%>
+<nav>
+    <ul class="pager">
+        <s:if test="pager.prevLink != null">
+            <li class="previous">
+                <a href='<s:property value="pager.prevLink" />'> 
+                    <span aria-hidden="true">&larr;</span>Newer</a>
+            </li>
+        </s:if>
+        <s:if test="pager.nextLink != null">
+            <li class="next">
+                <a href='<s:property value="pager.nextLink"/>'>Older
+                    <span aria-hidden="true">&rarr;</span></a>
+            </li>
+        </s:if>
+    </ul>
+</nav>
 
 
 <%-- ============================================================= --%>
 <%-- Entry table--%>
-<%-- ============================================================= --%>
 
-<p>
+<p style="text-align: center">
     <span class="draftEntryBox">&nbsp;&nbsp;&nbsp;&nbsp;</span> 
     <s:text name="weblogEntryQuery.draft" />&nbsp;&nbsp;
     <span class="pendingEntryBox">&nbsp;&nbsp;&nbsp;&nbsp;</span>
@@ -106,9 +60,11 @@
     <s:text name="weblogEntryQuery.scheduled" />&nbsp;&nbsp;
 </p>
 
-<table class="rollertable" width="100%">
+<table class="rollertable table table-striped" width="100%">
 
 <tr>
+    <th class="rollertable" width="5%"> </th>
+    <th class="rollertable" width="5%"> </th>
     <th class="rollertable" width="5%">
         <s:text name="weblogEntryQuery.pubTime" />
     </th>
@@ -121,12 +77,6 @@
     <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 var="post" value="pager.items">
@@ -143,6 +93,22 @@
     <s:else>
         <tr>
     </s:else>
+
+    <td>
+        <s:url var="editUrl" action="entryEdit">
+            <s:param name="weblog" value="%{actionWeblog.handle}" />
+            <s:param name="bean.id" value="#post.id" />
+        </s:url>
+        <s:a href="%{editUrl}"><span class="glyphicon glyphicon-edit"></s:a>
+    </td>
+
+    <td>
+        <s:set var="postId" value="#post.id" />
+        <s:set var="postTitle" value="#post.title" />
+        <a href="#" 
+            onclick="showDeleteModal('<s:property value="postId" />', '<s:property value="postTitle"/>' )"> 
+            <span class="glyphicon glyphicon-trash"></span></a>
+    </td>
     
     <td>
         <s:if test="#post.pubTime != null">
@@ -161,41 +127,113 @@
     </td>
     
     <td>
-        <str:truncateNicely upper="80"><s:property value="#post.displayTitle" /></str:truncateNicely>
+        <s:if test="#post.status.name() == 'PUBLISHED'">
+            <a href='<s:property value="#post.permalink" />'>
+                <str:truncateNicely upper="80"><s:property value="#post.displayTitle" /></str:truncateNicely>
+            </a>
+        </s:if>
+        <s:else>
+            <str:truncateNicely upper="80"><s:property value="#post.displayTitle" /></str:truncateNicely>
+        </s:else>
     </td>
     
     <td>
         <s:property value="#post.category.name" />
     </td>
-    
-    <td>
-        <s:if test="#post.status.name() == 'PUBLISHED'">
-            <a href='<s:property value="#post.permalink" />'><s:text name="weblogEntryQuery.view" /></a>
-        </s:if>
-    </td>
-
-    <td>
-        <s:url var="editUrl" action="entryEdit">
-            <s:param name="weblog" value="%{actionWeblog.handle}" />
-            <s:param name="bean.id" value="#post.id" />
-        </s:url>
-        <s:a href="%{editUrl}"><s:text name="generic.edit" /></s:a>
-    </td>
-
-    <td>
-        <s:url var="deleteUrl" action="entryRemoveViaList">
-            <s:param name="weblog" value="%{actionWeblog.handle}" />
-            <s:param name="removeId" value="#post.id" />
-        </s:url>
-        <s:a href="%{deleteUrl}"><s:text name="generic.delete" /></s:a>
-    </td>
 
     </tr>
 </s:iterator>
 
 </table>
 
+
+<%-- ============================================================= --%>
+<%-- Next / previous links --%>
+
+<nav>
+    <ul class="pager">
+        <s:if test="pager.prevLink != null">
+            <li class="previous">
+                <a href='<s:property value="pager.prevLink" />'>
+                    <span aria-hidden="true">&larr;</span> Older</a>
+            </li>
+        </s:if>
+        <s:if test="pager.nextLink != null">
+            <li class="next">
+                <a href='<s:property value="pager.nextLink"/>'>Newer
+                    <span aria-hidden="true">&rarr;</span></a>
+            </li>
+        </s:if>
+    </ul>
+</nav>
+
 <s:if test="pager.items.isEmpty">
     <s:text name="weblogEntryQuery.noneFound" />
-    <br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
 </s:if>
+
+
+<div id="delete-entry-modal" class="modal fade delete-entry-modal" tabindex="-1" role="dialog">
+
+    <div class="modal-dialog modal-lg">
+
+        <div class="modal-content">
+
+            <s:set var="deleteAction">entryRemoveViaList!remove</s:set>
+            
+            <s:form action="%{#deleteAction}" theme="bootstrap" cssClass="form-horizontal">
+                <s:hidden name="salt"/>
+                <s:hidden name="weblog"/>
+                <s:hidden name="removeId" id="removeId"/>
+            
+                <div class="modal-header">
+                    <div class="modal-title">
+                        <h3><s:text name="weblogEntryRemove.removeWeblogEntry"/></h3>
+                        <p><s:text name="weblogEntryRemove.areYouSure"/></p>
+                    </div>
+                </div>
+                
+                <div class="modal-body">
+
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">
+                            <s:text name="weblogEntryRemove.entryTitle"/>
+                        </label>
+                        <div class="col-sm-9 controls">
+                            <p class="form-control-static" style="padding-top:0px" id="postTitleLabel"></p>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">
+                            <s:text name="weblogEntryRemove.entryId"/>
+                        </label>
+                        <div class="col-sm-9 controls">
+                            <p class="form-control-static" style="padding-top:0px" id="postIdLabel"></p>
+                        </div>
+                    </div>
+
+                </div>
+                
+                <div class="modal-footer">
+                    <s:submit cssClass="btn" value="%{getText('generic.yes')}"/>
+                    <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 showDeleteModal( postId, postTitle ) {
+        $('#postIdLabel').html(postId);
+        $('#postTitleLabel').html(postTitle);
+        $('#removeId').val(postId);
+        $('#delete-entry-modal').modal({show: true});
+    }
+</script>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/EntriesSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/EntriesSidebar.jsp
index c1903db..217ebe7 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/EntriesSidebar.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/EntriesSidebar.jsp
@@ -17,140 +17,101 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/jquery-ui-1.11.0/jquery-ui.min.css"/>' />
-<script src="<s:url value="/roller-ui/scripts/jquery-2.1.1.min.js" />"></script>
-<script src='<s:url value="/roller-ui/jquery-ui-1.11.0/jquery-ui.min.js"/>'></script>
+<h3><s:text name="weblogEntryQuery.sidebarTitle"/></h3>
+<hr size="1" noshade="noshade"/>
 
-<div class="sidebarFade">
-    <div class="menu-tr">
-        <div class="menu-tl">
+<p><s:text name="weblogEntryQuery.sidebarDescription"/></p>
 
-            <div class="sidebarInner">
+<s:form action="entries" theme="bootstrap" cssClass="form-vertical">
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog"/>
 
-                <h3><s:text name="weblogEntryQuery.sidebarTitle" /></h3>
-                <hr size="1" noshade="noshade" />
+    <%-- ========================================================= --%>
+    <%-- filter by category --%>
 
-                <p><s:text name="weblogEntryQuery.sidebarDescription" /></p>
+    <s:select name="bean.categoryName"
+              label="%{getText('weblogEntryQuery.label.category')}"
+              list="categories" listKey="name" listValue="name" size="1"/>
 
-                <s:form action="entries">
-					<s:hidden name="salt" />
-                    <s:hidden name="weblog" />
+    <%-- ========================================================= --%>
+    <%-- filter by tag --%>
 
-                    <%-- ========================================================= --%>
-                    <%-- filter by category --%>
+    <s:textfield name="bean.tagsAsString" size="14"
+                 label="%{getText('weblogEntryQuery.label.tags')}"/>
 
-                    <div class="sideformrow">
-                        <label for="categoryId" class="sideformrow">
-                        <s:text name="weblogEntryQuery.label.category" /></label>
-                        <s:select name="bean.categoryName" list="categories" listKey="name" listValue="name" size="1" />
-                    </div>
-                    <br />
-                    <br />
+    <%-- ========================================================= --%>
+    <%-- filter by text --%>
 
-                    <%-- ========================================================= --%>
-                    <%-- filter by tag --%>
+    <s:textfield name="bean.text" size="14"
+                 label="%{getText('weblogEntryQuery.label.text')}"/>
 
-                    <div class="sideformrow">
-                        <label for="tags" class="sideformrow">
-                        <s:text name="weblogEntryQuery.label.tags" /></label>
-                        <s:textfield name="bean.tagsAsString" size="14" />
-                    </div>
-                    <br />
-                    <br />
+    <%-- ========================================================= --%>
+    <%-- filter by date --%>
 
-                    <%-- ========================================================= --%>
-                    <%-- filter by text --%>
+    <div class="control-group">
+        <label for="bean.startDateString" class="control-label">
+            <s:text name="weblogEntryQuery.label.startDate"/>
+        </label>
+        <div class="controls">
+            <div class="input-group">
 
-                    <div class="sideformrow">
-                        <label for="text" class="sideformrow">
-                        <s:text name="weblogEntryQuery.label.text" /></label>
-                        <s:textfield name="bean.text" size="14" />
-                    </div>
-                    <br />
-                    <br />
+                <s:textfield name="bean.startDateString" readonly="true"
+                             theme="simple" cssClass="date-picker form-control"/>
+                <label for="bean.startDateString" class="input-group-addon btn">
+                    <span class="glyphicon glyphicon-calendar"></span>
+                </label>
 
-                    <%-- ========================================================= --%>
-                    <%-- filter by date --%>
-
-                    <div class="sideformrow">
-                        <label for="startDateString" class="sideformrow"><s:text name="weblogEntryQuery.label.startDate" />:</label>
-                        <script>
-                        $(function() {
-                            $( "#entries_bean_startDateString" ).datepicker({
-                                showOn: "button",
-                                buttonImage: "../../images/calendar.png",
-                                buttonImageOnly: true,
-                                changeMonth: true,
-                                changeYear: true
-                            });
-                        });
-                        </script>
-                        <s:textfield name="bean.startDateString" size="12" readonly="true"/>
-                    </div>
-
-                    <div class="sideformrow">
-                        <label for="endDateString" class="sideformrow"><s:text name="weblogEntryQuery.label.endDate" />:</label>
-                        <script>
-                        $(function() {
-                            $( "#entries_bean_endDateString" ).datepicker({
-                                showOn: "button",
-                                buttonImage: "../../images/calendar.png",
-                                buttonImageOnly: true,
-                                changeMonth: true,
-                                changeYear: true
-                            });
-                        });
-                        </script>
-                        <s:textfield name="bean.endDateString" size="12" readonly="true"/>
-                    </div>
-                    <br />
-                    <br />
-
-                    <%-- ========================================================= --%>
-                    <%-- filter by status --%>
-
-                    <div class="sideformrow">
-                        <label for="status" class="sideformrow">
-                            <s:text name="weblogEntryQuery.label.status" />:
-                            <br />
-                            <br />
-                            <br />
-                            <br />
-                            <br />
-                            <br />
-                        </label>
-                        <div>
-                            <s:radio theme="roller" name="bean.status" list="statusOptions" listKey="key" listValue="value" />
-                        </div>
-                    </div>
-
-                    <%-- ========================================================= --%>
-                    <%-- sort by --%>
-
-                    <div class="sideformrow">
-                        <label for="status" class="sideformrow">
-                            <s:text name="weblogEntryQuery.label.sortby" />:
-                            <br />
-                            <br />
-                        </label>
-                        <div>
-                            <s:radio theme="roller" name="bean.sortBy" list="sortByOptions" listKey="key" listValue="value" />
-                        </div>
-                    </div>
-
-                    <%-- ========================================================= --%>
-                    <%-- search button --%>
-
-                    <br />
-
-                    <s:submit value="%{getText('weblogEntryQuery.button.query')}" />
-
-                </s:form>
-
-                <br />
-                <br />
-            </div> <!-- sidebarInner -->
-
+            </div>
         </div>
     </div>
-</div>
+
+    <div class="control-group">
+        <label for="bean.endDateString" class="control-label">
+            <s:text name="weblogEntryQuery.label.endDate"/>
+        </label>
+        <div class="controls">
+            <div class="input-group">
+
+                <s:textfield name="bean.endDateString" readonly="true"
+                             theme="simple" cssClass="date-picker form-control"/>
+                <label for="bean.endDateString" class="input-group-addon btn">
+                    <span class="glyphicon glyphicon-calendar"></span>
+                </label>
+
+            </div>
+        </div>
+    </div>
+
+    <br/>
+
+    <%-- ========================================================= --%>
+    <%-- filter by status --%>
+
+    <s:radio name="bean.status"
+             label="%{getText('weblogEntryQuery.label.status')}"
+             list="statusOptions" listKey="key" listValue="value"/>
+
+    <%-- ========================================================= --%>
+    <%-- sort by --%>
+
+    <s:radio name="bean.sortBy"
+             label="%{getText('weblogEntryQuery.label.sortby')}"
+             list="sortByOptions" listKey="key" listValue="value"/>
+
+    
+    <%-- ========================================================= --%>
+    <%-- filter button --%>
+
+    <s:submit cssClass="btn" value="%{getText('weblogEntryQuery.button.query')}"/>
+
+</s:form>
+
+<script>
+
+    $(document).ready(function () {
+        $("#entries_bean_startDateString").datepicker();
+        $("#entries_bean_endDateString").datepicker();
+    });
+
+</script>
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp
index 7d00385..dfa799e 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/EntryEdit.jsp
@@ -17,16 +17,20 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/jquery-ui-1.11.0/jquery-ui.min.css"/>' />
-
-<script src="<s:url value="/roller-ui/scripts/jquery-2.1.1.min.js" />"></script>
-<script src='<s:url value="/roller-ui/jquery-ui-1.11.0/jquery-ui.min.js"/>'></script>
+<%-- Prevent annoying scrolling. taken from http://stackoverflow.com/a/10548809/3591946 --%>
+<script type="text/javascript">
+    $().ready(function () {
+        $("a[href='#'][data-toggle='collapse']").click(function (e) {
+            e.preventDefault();
+        });
+    });
+</script>
 
 <style>
-#tagAutoCompleteWrapper {
-    width:40em; /* set width here or else widget will expand to fit its container */
-    padding-bottom:2em;
-}
+    #tagAutoCompleteWrapper {
+        width: 40em; /* set width here or else widget will expand to fit its container */
+        padding-bottom: 2em;
+    }
 </style>
 
 <%-- Titling, processing actions different between entry add and edit --%>
@@ -40,325 +44,402 @@
 </s:else>
 
 <p class="subtitle">
-    <s:text name="%{#subtitleKey}" >
-        <s:param value="actionWeblog.handle" />
+    <s:text name="%{#subtitleKey}">
+        <s:param value="actionWeblog.handle"/>
     </s:text>
 </p>
 
-<s:form id="entry">
-	<s:hidden name="salt" />
-    <s:hidden name="weblog" />
-    <s:hidden name="bean.status" />
+<s:form id="entry" theme="bootstrap" cssClass="form-horizontal">
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog"/>
+    <s:hidden name="bean.status"/>
     <s:if test="actionName == 'entryEdit'">
-        <s:hidden name="bean.id" />
+        <s:hidden name="bean.id"/>
     </s:if>
 
     <%-- ================================================================== --%>
     <%-- Title, category, dates and other metadata --%>
 
-    <table class="entryEditTable" cellpadding="0" cellspacing="0" style="width:100%">
+    <%-- title --%>
+    <s:textfield label="%{getText('weblogEdit.title')}" name="bean.title" maxlength="255" tabindex="1"/>
 
-        <tr>
-            <td class="entryEditFormLabel">
-                <label for="title"><s:text name="weblogEdit.title" /></label>
-            </td>
-            <td>
-                <s:textfield name="bean.title" size="70" maxlength="255" tabindex="1" style="width:60%"/>
-            </td>
-        </tr>
+    <%-- permalink --%>
+    <s:if test="actionName == 'entryEdit'">
+        <div class="form-group">
 
-        <tr>
-            <td class="entryEditFormLabel">
-                <label for="status"><s:text name="weblogEdit.status" /></label>
-            </td>
-            <td>
+            <label class="control-label col-md-3" for="entry_bean_permalink">
+                <s:text name="weblogEdit.permaLink"/>
+            </label>
+
+            <div class="controls col-md-9">
+                <p class="form-control-static">
+                    <s:if test="bean.published">
+                        <a id="entry_bean_permalink" href='<s:property value="entry.permalink" />'>
+                            <s:property value="entry.permalink"/>
+                        </a>
+                        <img src='<s:url value="/images/launch-link.png"/>'/>
+                    </s:if>
+                    <s:else>
+                        <s:property value="entry.permalink"/>
+                    </s:else>
+                </p>
+            </div>
+
+        </div>
+    </s:if>
+
+    <%-- tags --%>
+    <s:textfield label="%{getText('weblogEdit.tags')}" id="tagAutoComplete" name="bean.tagsAsString"
+                 maxlength="255" tabindex="2"/>
+
+    <%-- category --%>
+    <s:select label="%{getText('weblogEdit.category')}" name="bean.categoryId"
+              list="categories" listKey="id" listValue="name" tabindex="3"/>
+
+    <s:if test="actionWeblog.enableMultiLang">
+        <%-- language / locale --%>
+        <s:select label="%{getText('weblogEdit.locale')}" name="bean.locale"
+                  list="localesList" listValue="displayName" tabindex="4"/>
+    </s:if>
+    <s:else>
+        <s:hidden name="bean.locale"/>
+    </s:else>
+
+    <%-- status --%>
+    <div class="form-group">
+        <label class="control-label col-md-3" for="weblogEdit.status"><s:text name="weblogEdit.status"/></label>
+
+        <div class="controls col-md-9">
+
+            <p class="form-control-static">
                 <s:if test="bean.published">
-                    <span style="color:green; font-weight:bold">
-                        <s:text name="weblogEdit.published" />
-                        (<s:text name="weblogEdit.updateTime" />
-                        <s:date name="entry.updateTime" />)
+                    <span class="label label-success">
+                        <s:text name="weblogEdit.published"/>
+                        (<s:text name="weblogEdit.updateTime"/>
+                        <s:date name="entry.updateTime"/>)
                     </span>
                 </s:if>
                 <s:elseif test="bean.draft">
-                    <span style="color:orange; font-weight:bold">
-                        <s:text name="weblogEdit.draft" />
-                        (<s:text name="weblogEdit.updateTime" />
-                        <s:date name="entry.updateTime" />)
+                    <span class="label label-info">
+                        <s:text name="weblogEdit.draft"/>
+                        (<s:text name="weblogEdit.updateTime"/>
+                        <s:date name="entry.updateTime"/>)
                     </span>
                 </s:elseif>
                 <s:elseif test="bean.pending">
-                    <span style="color:orange; font-weight:bold">
-                        <s:text name="weblogEdit.pending" />
-                        (<s:text name="weblogEdit.updateTime" />
-                        <s:date name="entry.updateTime" />)
+                    <span class="label label-warning">
+                        <s:text name="weblogEdit.pending"/>
+                        (<s:text name="weblogEdit.updateTime"/>
+                        <s:date name="entry.updateTime"/>)
                     </span>
                 </s:elseif>
                 <s:elseif test="bean.scheduled">
-                    <span style="color:orange; font-weight:bold">
-                        <s:text name="weblogEdit.scheduled" />
-                        (<s:text name="weblogEdit.updateTime" />
-                        <s:date name="entry.updateTime" />)
+                    <span class="label label-info">
+                        <s:text name="weblogEdit.scheduled"/>
+                        (<s:text name="weblogEdit.updateTime"/>
+                        <s:date name="entry.updateTime"/>)
                     </span>
                 </s:elseif>
                 <s:else>
-                    <span style="color:red; font-weight:bold"><s:text name="weblogEdit.unsaved" /></span>
+                    <span class="label label-danger"><s:text name="weblogEdit.unsaved"/></span>
                 </s:else>
-            </td>
-        </tr>
+            </p>
+
+        </div>
+
+    </div>
 
 
-        <s:if test="actionName == 'entryEdit'">
-            <tr>
-                <td class="entryEditFormLabel">
-                    <label for="permalink"><s:text name="weblogEdit.permaLink" /></label>
-                </td>
-                <td>
-                    <s:if test="bean.published">
-                        <a id="entry_bean_permalink" href='<s:property value="entry.permalink" />'><s:property value="entry.permalink" /></a>
-                        <img src='<s:url value="/images/launch-link.png"/>' />
+    <div class="panel-group" id="accordion">
+
+            <%-- Weblog editor --%>
+
+        <s:include value="%{editor.jspPage}"/>
+
+            <%-- Plugins --%>
+
+        <s:if test="!entryPlugins.isEmpty">
+
+            <div class="panel panel-default" id="panel-plugins">
+                <div class="panel-heading">
+
+                    <h4 class="panel-title">
+                        <a class="collapsed" data-toggle="collapse" data-target="#collapsePlugins" href="#">
+                            <s:text name="weblogEdit.pluginsToApply"/> </a>
+                    </h4>
+
+                </div>
+                <div id="collapsePlugins" class="panel-collapse collapse">
+                    <div class="panel-body">
+
+                        <s:checkboxlist name="bean.plugins" list="entryPlugins" listKey="name" listValue="name"/>
+
+                    </div>
+                </div>
+            </div>
+
+        </s:if>
+
+            <%-- Advanced settings --%>
+
+        <div class="panel panel-default" id="panel-settings">
+            <div class="panel-heading">
+
+                <h4 class="panel-title">
+                    <a class="collapsed" data-toggle="collapse" data-parent="#collapseAdvanced"
+                       href="#collapseAdvanced">
+                        <s:text name="weblogEdit.miscSettings"/> </a>
+                </h4>
+
+            </div>
+            <div id="collapseAdvanced" class="panel-collapse collapse">
+                <div class="panel-body">
+
+                    <div class="form-group">
+
+                        <label class="control-label col-md-3"><s:text name="weblogEdit.pubTime"/></label>
+
+                        <div class="controls col-md-9">
+
+                            <s:select theme="simple" name="bean.hours" list="hoursList"/> :
+                            <s:select theme="simple" name="bean.minutes" list="minutesList"/> :
+                            <s:select theme="simple" name="bean.seconds" list="secondsList"/> <br/>
+
+                            <img src="<s:url value='/roller-ui/images/spacer.png' />"
+                                 alt="spacer" style="min-height: 0.3em"/>
+
+                            <div class="input-group">
+                                <s:textfield name="bean.dateString" readonly="true" cssStyle="width:15em"
+                                             theme="simple" cssClass="date-picker form-control"/>
+                                <label for="bean.dateString" class="input-group-addon btn" style="width:3em">
+                                    <span class="glyphicon glyphicon-calendar"></span>
+                                </label>
+                            </div>
+
+                            <s:property value="actionWeblog.timeZone"/>
+
+                        </div>
+
+                    </div>
+
+                    <s:select label="%{getText('weblogEdit.commentDays')}" name="bean.commentDays"
+                              list="commentDaysList" listKey="key" listValue="value"/>
+
+                    <s:checkbox label="%{getText('weblogEdit.rightToLeft')}" name="bean.rightToLeft"/>
+
+                        <%-- global admin can pin items to front page weblog --%>
+                    <s:if test="authenticatedUser.hasGlobalPermission('admin')">
+                        <s:checkbox label="%{getText('weblogEdit.pinnedToMain')}" name="bean.pinnedToMain"
+                                    tooltop="%{getText('weblogEdit.pinnedToMain.tooltip')}"/>
                     </s:if>
-                    <s:else>
-                        <s:property value="entry.permalink" />
-                    </s:else>
-                </td>
-            </tr>
-        </s:if>
 
-        <tr>
-            <td class="entryEditFormLabel">
-                <label for="categoryId"><s:text name="weblogEdit.category" /></label>
-            </td>
-            <td>
-                <s:select name="bean.categoryId" list="categories" listKey="id" listValue="name" size="1" />
-            </td>
-        </tr>
+                    <s:textfield label="%{getText('weblogEdit.searchDescription')}" name="bean.searchDescription"
+                                 maxlength="255" tooltip="%{getText('weblogEdit.searchDescription.tooltip')}"/>
 
-        <tr>
-            <td class="entryEditFormLabel">
-                <label for="title"><s:text name="weblogEdit.tags" /></label>
-            </td>
-            <td>
-                <s:textfield id="tagAutoComplete" cssClass="entryEditTags" name="bean.tagsAsString" size="70" maxlength="255" tabindex="3" style="width:30%"/>
-            </td>
-        </tr>
+                    <s:textfield label="%{getText('weblogEdit.enclosureURL')}" name="bean.enclosureURL"
+                                 maxlength="255" tooltip="%{getText('weblogEdit.enclosureURL.tooltip')}"/>
 
-        <s:if test="actionWeblog.enableMultiLang">
-                <tr>
-                    <td class="entryEditFormLabel">
-                        <label for="locale"><s:text name="weblogEdit.locale" /></label>
-                    </td>
-                    <td>
-                        <s:select name="bean.locale" size="1" list="localesList" listValue="displayName" />
-                    </td>
-                </tr>
-            </table>
-        </s:if>
-        <s:else>
-            </table>
-            <s:hidden name="bean.locale"/>
-        </s:else>
+                    <s:if test="actionName == 'entryEdit'">
+                        <s:if test="!bean.enclosureURL.isEmpty()">
+                            <s:text name="weblogEdit.enclosureType"/>:
+                            <s:property value='entry.findEntryAttribute("att_mediacast_type")'/>
+                            <s:text name="weblogEdit.enclosureLength"/>:
+                            <s:property value='entry.findEntryAttribute("att_mediacast_length")'/>
+                        </s:if>
+                    </s:if>
+
+                </div>
+
+            </div>
+
+        </div>
+
+    </div>
 
 
     <%-- ================================================================== --%>
-    <%-- Weblog editor --%>
+    <%-- The button box --%>
 
-    <s:include value="%{editor.jspPage}" />
+    <%-- save draft --%>
+    <s:submit cssClass="btn btn-warning"
+              value="%{getText('weblogEdit.save')}"
+              action="%{#mainAction}!saveDraft"/>
 
-    <br />
+    <s:if test="actionName == 'entryEdit'">
 
-    <%-- ================================================================== --%>
-    <%-- plugin chooser --%>
+        <%-- preview mode --%>
+        <input class="btn btn-default" type="button" name="fullPreview"
+               value="<s:text name='weblogEdit.fullPreviewMode' />"
+               onclick="fullPreviewMode()"/>
+    </s:if>
+    <s:if test="userAnAuthor">
 
-    <s:if test="!entryPlugins.isEmpty">
-        <div id="pluginControlToggle" class="controlToggle">
-            <span id="ipluginControl">+</span>
-            <a class="controlToggle" onclick="javascript:toggleControl('pluginControlToggle','pluginControl')">
-            <s:text name="weblogEdit.pluginsToApply" /></a>
-        </div>
-        <div id="pluginControl" class="miscControl" style="display:none">
-            <s:checkboxlist theme="roller" name="bean.plugins" list="entryPlugins" listKey="name" listValue="name" />
-        </div>
+        <%-- publish --%>
+        <s:submit cssClass="btn btn-success"
+                  value="%{getText('weblogEdit.post')}"
+                  action="%{#mainAction}!publish"/>
+    </s:if>
+    <s:else>
+
+        <%-- submit for review --%>
+        <s:submit cssClass="btn btn-info"
+                  value="%{getText('weblogEdit.submitForReview')}"
+                  action="%{#mainAction}!publish"/>
+    </s:else>
+
+    <s:if test="actionName == 'entryEdit'">
+
+        <%-- delete --%>
+        <span style="float:right">
+            <input class="btn btn-danger" type="button"
+                   value="<s:text name='weblogEdit.deleteEntry'/>"
+                   onclick="showDeleteModal('<s:property value="entry.id" />', '<s:property value="entry.title"/>' )">
+        </span>
     </s:if>
 
 
-    <%-- ================================================================== --%>
-    <%-- advanced settings  --%>
-
-    <div id="miscControlToggle" class="controlToggle">
-        <span id="imiscControl">+</span>
-        <a class="controlToggle" onclick="javascript:toggleControl('miscControlToggle','miscControl')">
-        <s:text name="weblogEdit.miscSettings" /></a>
-    </div>
-    <div id="miscControl" class="miscControl" style="display:none">
-
-        <label for="link"><s:text name="weblogEdit.pubTime" /></label>
-        <div>
-            <s:select name="bean.hours" list="hoursList" />
-            :
-            <s:select name="bean.minutes" list="minutesList" />
-            :
-            <s:select name="bean.seconds" list="secondsList" />
-            &nbsp;&nbsp;
-            <script>
-            $(function() {
-                $( "#entry_bean_dateString" ).datepicker({
-                    showOn: "button",
-                    buttonImage: "../../images/calendar.png",
-                    buttonImageOnly: true,
-                    changeMonth: true,
-                    changeYear: true
-                });
-            });
-            </script>
-            <s:textfield name="bean.dateString" size="12" readonly="true"/>
-            <s:property value="actionWeblog.timeZone" />
-        </div>
-        <br />
-
-        <s:checkbox name="bean.allowComments" />
-        <s:text name="weblogEdit.allowComments" />
-        <s:text name="weblogEdit.commentDays" />
-        <s:select name="bean.commentDays" list="commentDaysList" size="1" listKey="key" listValue="value" />
-        <br />
-
-        <s:checkbox name="bean.rightToLeft" />
-        <s:text name="weblogEdit.rightToLeft" />
-        <br />
-
-        <s:if test="authenticatedUser.hasGlobalPermission('admin')">
-            <s:checkbox name="bean.pinnedToMain" />
-            <s:text name="weblogEdit.pinnedToMain" /><tags:help key="weblogEdit.pinnedToMain.tooltip"/>
-            <br />
-        </s:if>
-        <br />
-
-		<table>
-			<tr>
-				<td><s:text name="weblogEdit.searchDescription" />:<tags:help key="weblogEdit.searchDescription.tooltip"/></td>
-				<td><s:textfield name="bean.searchDescription" size="60" maxlength="255" style="width:100%"/> </td>
-			</tr>
-            <tr>
-				<td><s:text name="weblogEdit.enclosureURL" />:<tags:help key="weblogEdit.enclosureURL.tooltip"/></td>
-				<td><s:textfield name="bean.enclosureURL" size="40" maxlength="255" style="width:100%"/></td>
-			</tr>
-            <s:if test="actionName == 'entryEdit'">
-                <tr>
-                    <td></td>
-                    <td><s:if test="bean.enclosureURL != null">
-                        <s:text name="weblogEdit.enclosureType" />: <s:property value='entry.findEntryAttribute("att_mediacast_type")' />
-                        <s:text name="weblogEdit.enclosureLength" />: <s:property value='entry.findEntryAttribute("att_mediacast_length")' />
-                    </s:if></td>
-                </tr>
-            </s:if>
-		</table>
-    </div>
-
-
-    <%-- ================================================================== --%>
-    <%-- the button box --%>
-
-    <br>
-    <div class="control">
-        <span style="padding-left:7px">
-            <s:submit value="%{getText('weblogEdit.save')}" action="%{#mainAction}!saveDraft" />
-            <s:if test="actionName == 'entryEdit'">
-                <input type="button" name="fullPreview"
-                                    value="<s:text name='weblogEdit.fullPreviewMode' />"
-                                    onclick="fullPreviewMode()" />
-            </s:if>
-            <s:if test="userAnAuthor">
-                <s:submit value="%{getText('weblogEdit.post')}" action="%{#mainAction}!publish"/>
-            </s:if>
-            <s:else>
-                <s:submit value="%{getText('weblogEdit.submitForReview')}" action="%{#mainAction}!publish"/>
-            </s:else>
-        </span>
-
-        <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:url>
-                <input type="button" value="<s:text name='weblogEdit.deleteEntry'/>" 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>
 
-<script>
-function fullPreviewMode() {
-    window.open('<s:property value="previewURL" />');
-}
 
-//Get cookie to determine state of control
-if (getCookie('control_miscControl') != null) {
-    if(getCookie('control_miscControl') == 'true'){
-        toggle('miscControl');
-        togglePlusMinus('imiscControl');
-    }
-}
-if (getCookie('control_pluginControl') != null) {
-    if(getCookie('control_pluginControl') == 'true'){
-        toggle('pluginControl');
-        togglePlusMinus('ipluginControl');
-    }
-}
-$(function() {
-function split( val ) {
-    return val.split( / \s*/ );
-}
-function extractLast( term ) {
-    return split( term ).pop();
-}
-$( "#tagAutoComplete" )
-    // don't navigate away from the field on tab when selecting an item
-    .bind( "keydown", function( event ) {
-        if ( event.keyCode === $.ui.keyCode.TAB && $( this ).autocomplete( "instance" ).menu.active ) {
-            event.preventDefault();
-        }
-    })
-    .autocomplete({
-        delay: 500,
-        source: function(request, response) {
-            $.getJSON("<s:property value='jsonAutocompleteUrl' />", { format: 'json', prefix: extractLast( request.term ) },
-            function(data) {
-                response($.map(data.tagcounts, function (dataValue) {
-                    return {
-                        value: dataValue.tag
-                    };
-                }))
-            })
-        },
-        focus: function() {
-            // prevent value inserted on focus
-            return false;
-        },
-        select: function( event, ui ) {
-            var terms = split( this.value );
-            // remove the current input
-            terms.pop();
-            // add the selected item
-            terms.push( ui.item.value );
-            // add placeholder to get the space at the end
-            terms.push( "" );
-            this.value = terms.join( " " );
-            return false;
-        }
+<%-- ========================================================================================== --%>
+
+<%-- delete blogroll confirmation modal --%>
+
+<div id="delete-entry-modal" class="modal fade delete-entry-modal" tabindex="-1" role="dialog">
+
+    <div class="modal-dialog modal-lg">
+
+        <div class="modal-content">
+
+            <s:set var="deleteAction">entryRemoveViaList!remove</s:set>
+
+            <s:form action="%{#deleteAction}" theme="bootstrap" cssClass="form-horizontal">
+                <s:hidden name="salt"/>
+                <s:hidden name="weblog"/>
+                <s:hidden name="removeId" id="removeId"/>
+
+                <div class="modal-header">
+                    <div class="modal-title">
+                        <h3><s:text name="weblogEntryRemove.removeWeblogEntry"/></h3>
+                        <p><s:text name="weblogEntryRemove.areYouSure"/></p>
+                    </div>
+                </div>
+
+                <div class="modal-body">
+
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">
+                            <s:text name="weblogEntryRemove.entryTitle"/>
+                        </label>
+                        <div class="col-sm-9 controls">
+                            <p class="form-control-static" style="padding-top:0px" id="postTitleLabel"></p>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">
+                            <s:text name="weblogEntryRemove.entryId"/>
+                        </label>
+                        <div class="col-sm-9 controls">
+                            <p class="form-control-static" style="padding-top:0px" id="postIdLabel"></p>
+                        </div>
+                    </div>
+
+                </div>
+
+                <div class="modal-footer">
+                    <s:submit cssClass="btn" value="%{getText('generic.yes')}"/>
+                    <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>
+
+    $(document).ready(function () {
+        $("#entry_bean_dateString").datepicker();
     });
-});
+
+    function fullPreviewMode() {
+        window.open('<s:property value="previewURL" />');
+    }
+
+    $(function () {
+        function split(val) {
+            return val.split(/ \s*/);
+        }
+
+        function extractLast(term) {
+            return split(term).pop();
+        }
+
+        $("#tagAutoComplete")
+        // don't navigate away from the field on tab when selecting an item
+            .bind("keydown", function (event) {
+                if (event.keyCode === $.ui.keyCode.TAB && $(this).autocomplete("instance").menu.active) {
+                    event.preventDefault();
+                }
+            })
+            .autocomplete({
+                delay: 500,
+                source: function (request, response) {
+                    $.getJSON("<s:property value='jsonAutocompleteUrl' />", {
+                            format: 'json',
+                            prefix: extractLast(request.term)
+                        },
+                        function (data) {
+                            response($.map(data.tagcounts, function (dataValue) {
+                                return {
+                                    value: dataValue.tag
+                                };
+                            }))
+                        })
+                },
+                focus: function () {
+                    // prevent value inserted on focus
+                    return false;
+                },
+                select: function (event, ui) {
+                    var terms = split(this.value);
+                    // remove the current input
+                    terms.pop();
+                    // add the selected item
+                    terms.push(ui.item.value);
+                    // add placeholder to get the space at the end
+                    terms.push("");
+                    this.value = terms.join(" ");
+                    return false;
+                }
+            });
+    });
+
+    function showDeleteModal(postId, postTitle) {
+        $('#postIdLabel').html(postId);
+        $('#postTitleLabel').html(postTitle);
+        $('#removeId').val(postId);
+        $('#delete-entry-modal').modal({show: true});
+    }
+
 </script>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/EntryEditor.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/EntryEditor.jsp
index 5050b29..51079e6 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/EntryEditor.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/EntryEditor.jsp
@@ -18,185 +18,163 @@
 <%-- This page is designed to be included in EntryEdit.jsp --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
+
 <%-- ********************************************************************* --%>
-<%-- Text editors --%>
 
-<p class="toplabel">
+<%-- content --%>
+<s:textarea id="edit_content" name="bean.text"
+            tabindex="5" rows="18" cssClass="col-sm-12" theme="simple"/>
 
-</p>
+<a href="#" onClick="onClickMediaFileInsert();"><s:text name="weblogEdit.insertMediaFile"/></a><br/>
+<img src="<s:url value='/roller-ui/images/spacer.png' />" alt="spacer" style="min-height: 2em"/>
 
-<div id="accordion">
-    <h3>
-        <s:text name="weblogEdit.content" />
-        <span style="font-weight:normal;float:right;">
-            <a href="#" onClick="onClickAddImage();"><s:text name="weblogEdit.insertMediaFile" /></a>
-        </span>
-    </h3>
-    <div>
-        <s:textarea id="edit_content" name="bean.text" cols="75" rows="25" cssStyle="width: 100%" tabindex="5"/>
+<%-- summary --%>
+
+<div class="panel panel-default" id="panel-summary">
+    <div class="panel-heading">
+
+        <h4 class="panel-title">
+            <a href="#" class="collapsed"
+               data-toggle="collapse" data-target="#collapseSummaryEditor">
+                <s:text name="weblogEdit.summary"/>
+            </a>
+        </h4>
+
     </div>
-    <h3><s:text name="weblogEdit.summary"/><tags:help key="weblogEdit.summary.tooltip"/></h3>
-    <div>
-        <s:textarea id="edit_summary" name="bean.summary" cols="75" rows="10" cssStyle="width: 100%" tabindex="6"/>
+    <div id="collapseSummaryEditor" class="panel-collapse collapse">
+        <div class="panel-body">
+
+            <s:textarea id="edit_summary" name="bean.summary"
+                        tabindex="6" rows="10" cssClass="col-sm-12" theme="simple"/>
+
+        </div>
     </div>
 </div>
 
-
 <%-- ********************************************************************* --%>
-<%-- Lightbox for popping up image chooser --%>
 
-<div id="mediafile_edit_lightbox" title="<s:text name='weblogEdit.insertMediaFile'/>" style="display:none">
-    <iframe id="mediaFileEditor"
-            style="visibility:inherit"
-            height="100%"
-            width="100%"
-            frameborder="no"
-            scrolling="auto">
-    </iframe>
+
+<%-- Media File Insert for plain textarea editor --%>
+
+<div id="mediafile_edit_lightbox" class="modal fade" role="dialog">
+
+    <div class="modal-dialog modal-lg">
+
+        <div class="modal-content">
+
+            <div class="modal-header">
+                <h4 class="modal-title"><s:text name='weblogEdit.insertMediaFile'/></h4>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+
+            <div class="modal-body">
+                <iframe id="mediaFileEditor"
+                        style="visibility:inherit"
+                        height="600" <%-- pixels, sigh, this is suboptimal--%>
+                        width="100%"
+                        frameborder="no"
+                        scrolling="auto">
+                </iframe>
+            </div>
+
+            <div class="modal-footer">
+                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+            </div>
+
+        </div>
+    </div>
+
 </div>
 
-<%-- ********************************************************************* --%>
-<%-- Editor event handling, on close, on add image, etc. --%>
-
 <script>
-    function onClickAddImage(){
+
+    <s:if test="editor.id == 'editor-text.jsp'">
+
+    <%-- Plain text editor functions --%>
+
+    function insertMediaFile(anchorTag) {
+        insertAtCursor(document.getElementById('edit_content'), anchorTag);
+    }
+
+    function insertAtCursor(textAreaElement, valueForInsertion) {
+        if (document.selection) {
+            textAreaElement.focus();
+            var range = document.selection.createRange();
+            range.text = valueForInsertion;
+        } else if (textAreaElement.selectionStart || textAreaElement.selectionStart === '0') {
+            var preText;
+            var postText;
+            if (textAreaElement.selectionStart === 0) {
+                preText = '';
+                postText = '';
+            } else {
+                preText = textAreaElement.value.substring(
+                    0, textAreaElement.selectionStart);
+                postText = textAreaElement.value.substring(
+                    textAreaElement.selectionEnd, textAreaElement.value.length);
+            }
+            textAreaElement.value = preText + valueForInsertion + postText;
+            textAreaElement.selectionStart = preText.length + valueForInsertion.length;
+            textAreaElement.selectionEnd = textAreaElement.selectionStart;
+            textAreaElement.focus();
+        } else {
+            textAreaElement.value += valueForInsertion;
+            textAreaElement.focus();
+        }
+    }
+
+    </s:if>
+    <s:else>
+
+    <%-- Rich text editor functions --%>
+
+    $(document).ready(function () {
+        $('#edit_content').summernote({
+                toolbar: [
+                    // [groupName, [list of button]]
+                    ['style', ['bold', 'italic', 'underline', 'clear']],
+                    ['font', ['strikethrough', 'superscript', 'subscript']],
+                    ['fontsize', ['fontsize']],
+                    ['color', ['color']],
+                    ['para', ['ul', 'ol', 'paragraph']],
+                    ['height', ['height']],
+                    ['misc', ['codeview']]
+                ],
+                height: 400
+            }
+        );
+    });
+
+    function insertMediaFile(toInsert) {
+        $('#edit_content').summernote("pasteHTML", toInsert);
+    }
+
+    </s:else>
+
+    <%-- Common functions --%>
+
+    function onClickMediaFileInsert() {
         <s:url var="mediaFileImageChooser" action="mediaFileImageChooser" namespace="overlay">
-            <s:param name="weblog" value="%{actionWeblog.handle}" />
+        <s:param name="weblog" value="%{actionWeblog.handle}" />
         </s:url>
-        $( "#mediaFileEditor" ).attr('src','<s:property value="%{mediaFileImageChooser}" />');
-        $(function() {
-            $("#mediafile_edit_lightbox").dialog({
-                modal  : true,
-                width  : 600,
-                height : 600
-            });
-        });
+        $("#mediaFileEditor").attr('src', '<s:property value="%{mediaFileImageChooser}" />');
+        $('#mediafile_edit_lightbox').modal({show: true});
     }
 
     function onClose() {
-        $("#mediaFileEditor").attr('src','about:blank');
+        $("#mediaFileEditor").attr('src', 'about:blank');
     }
 
     function onSelectMediaFile(name, url, isImage) {
-        $("#mediafile_edit_lightbox").dialog("close");
-        $("#mediaFileEditor").attr('src','about:blank');
-        if (isImage == "true") {
-            insertMediaFile('<a href="' + url + '"><img src="' + url + '?t=true" alt="' + name+ '"></img></a>');
+        $("#mediafile_edit_lightbox").modal("hide");
+        $("#mediaFileEditor").attr('src', 'about:blank');
+        if (isImage === "true") {
+            insertMediaFile('<a href="' + url + '"><img src="' + url + '?t=true" alt="' + name + '" /></a>');
         } else {
             insertMediaFile('<a href="' + url + '">' + name + '</a>');
         }
     }
+
 </script>
-
-<s:if test="editor.id == 'editor-text.jsp'">
-    <%-- Plain text editor (raw HTML entry) --%>
-
-    <script>
-        $(function() {
-            $( "#accordion" ).accordion({
-            });
-        });
-        function insertMediaFile(anchorTag) {
-            insertAtCursor(document.getElementById('edit_content'), anchorTag);
-        }
-        function insertAtCursor(textAreaElement, valueForInsertion) {
-            if (document.selection) {
-                textAreaElement.focus();
-                var range = document.selection.createRange();
-                range.text = valueForInsertion;
-            }
-            else if (textAreaElement.selectionStart || textAreaElement.selectionStart == '0') {
-                var preText;
-                var postText;
-                if (textAreaElement.selectionStart == 0) {
-                    preText = '';
-                    postText = '';
-                }
-                else {
-                    preText = textAreaElement.value.substring(0, textAreaElement.selectionStart);
-                    postText = textAreaElement.value.substring(textAreaElement.selectionEnd, textAreaElement.value.length);
-                }
-                textAreaElement.value =  preText + valueForInsertion + postText;
-                textAreaElement.selectionStart = preText.length + valueForInsertion.length;
-                textAreaElement.selectionEnd = textAreaElement.selectionStart;
-                textAreaElement.focus();
-            } else {
-                textAreaElement.value += valueForInsertion;
-                textAreaElement.focus();
-            }
-        }
-    </script>
-</s:if>
-<s:else>
-    <%-- Rich text editor (Xinha, see: http://trac.xinha.org/wiki/NewbieGuide) --%>
-
-    <s:url var="xinhaHome" value="/roller-ui/authoring/editors/xinha-0.96.1"></s:url>
-    <script>
-        // (preferably absolute) URL (including trailing slash) where Xinha is installed
-        _editor_url  = '<s:property value="xinhaHome" />';
-        _editor_lang = "en";        // And the language we need to use in the editor.
-        _editor_skin = "blue-look"; // If you want use a skin, add the name (of the folder) here
-    </script>
-    <script src="<s:property value="xinhaHome" />/XinhaCore.js"></script>
-
-    <script>
-        $(function() {
-            $( "#accordion" ).accordion({
-                activate: function( event, ui ) {
-                   <%-- Xinha summary editor needs a one-time init as it is
-                        not visible upon window opening (http://tinyurl.com/mn97j5l) --%>
-                   if (!summary_editor_initialized) {
-                       xinha_editors.edit_summary.sizeEditor();
-                       summary_editor_initialized = true;
-                   }
-                }
-            });
-        });
-
-        function insertMediaFile(anchorTag) {
-            xinha_editors.edit_content.insertHTML(anchorTag);
-        }
-
-        summary_editor_initialized = false;
-        xinha_editors = null;
-        xinha_init    = null;
-        xinha_config  = null;
-        xinha_plugins = null;
-
-        xinha_init = xinha_init ? xinha_init : function() {
-
-            xinha_editors = xinha_editors ? xinha_editors : [
-                'edit_content', 'edit_summary'
-            ];
-
-            xinha_plugins = xinha_plugins ? xinha_plugins :[];
-            if(!Xinha.loadPlugins(xinha_plugins, xinha_init)) return;
-
-            xinha_config = xinha_config ? xinha_config() : new Xinha.Config();
-            xinha_config.pageStyleSheets = [ _editor_url + "examples/full_example.css" ];
-            xinha_config.toolbar =
-                [
-                ["popupeditor"],
-                ["separator","formatblock","fontname","fontsize","bold","italic","underline","strikethrough"],
-                ["separator","forecolor","hilitecolor","textindicator"],
-                ["separator","subscript","superscript"],
-                ["linebreak","separator","justifyleft","justifycenter","justifyright","justifyfull"],
-                ["separator","insertorderedlist","insertunorderedlist","outdent","indent"],
-                ["separator","inserthorizontalrule","createlink","insertimage","inserttable"],
-                ["linebreak","separator","undo","redo","selectall","print"], (Xinha.is_gecko ? [] : ["cut","copy","paste","overwrite","saveas"]),
-                ["separator","killword","clearfonts","removeformat","toggleborders","splitblock","lefttoright", "righttoleft"],
-                ["separator","htmlmode","showhelp","about"]
-            ];
-
-            // turn off Xinha's URL stripping default. Blog entries need absolute URLs,
-            // otherwise links will be broken in RSS/Atom feeds.
-            xinha_config.stripBaseHref = false;
-
-            xinha_editors   = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);
-
-            Xinha.startEditors(xinha_editors);
-        }
-
-        Xinha._addEvent(window,'load', xinha_init);
-    </script>
-</s:else>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/EntryRemove.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/EntryRemove.jsp
deleted file mode 100644
index 8f5dc3c..0000000
--- a/app/src/main/webapp/WEB-INF/jsps/editor/EntryRemove.jsp
+++ /dev/null
@@ -1,61 +0,0 @@
-<%--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  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.  For additional information regarding
-  copyright in this work, please see the NOTICE file in the top level
-  directory of this distribution.
---%>
-<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-
-<h2>
-    <s:text name="weblogEntryRemove.removeWeblogEntry" /> [<s:property value="removeEntry.title"/>]
-</h2>
-
-<p><s:text name="weblogEntryRemove.areYouSure" /></p>
-<p>
-    <s:text name="weblogEntryRemove.entryTitle" /> = [<s:property value="removeEntry.title"/>]<br />
-    <s:text name="weblogEntryRemove.entryId" /> = [<s:property value="removeEntry.id"/>]
-</p>
-
-<%-- Differences between deletions from EntryEdit and Entries views --%>
-<s:if test="actionName == 'entryRemove'">
-    <s:set var="deleteAction">entryRemove!remove</s:set>
-    <s:set var="cancelAction">entryEdit</s:set>
-</s:if>
-<s:else>
-    <s:set var="deleteAction">entryRemoveViaList!remove</s:set>
-    <s:set var="cancelAction">entries</s:set>
-</s:else>
-
-<table>
-<tr>
-    <td>
-        <s:form action="%{#deleteAction}">
-            <s:hidden name="salt" />
-            <s:hidden name="weblog" />
-            <s:hidden name="removeId" />
-            <s:submit value="%{getText('generic.yes')}" />
-        </s:form>
-    </td>
-    <td>
-        <s:form action="%{#cancelAction}">
-            <s:hidden name="salt" />
-            <s:hidden name="weblog" />
-            <s:if test="actionName == 'entryRemove'" >
-                <s:hidden name="bean.id" value="%{removeEntry.id}"/>
-            </s:if>
-            <s:submit value="%{getText('generic.no')}"/>
-        </s:form>
-    </td>
-</tr>
-</table>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/EntrySidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/EntrySidebar.jsp
index 2bb3b35..9b96719 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/EntrySidebar.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/EntrySidebar.jsp
@@ -22,6 +22,8 @@
         <div class="menu-tl">
             
             <div class="sidebarInner">
+
+                <%-- comments on this entry --%>
                 
                 <h3><s:text name="weblogEdit.comments" /></h3>
 
@@ -38,7 +40,9 @@
                 <s:else>
                     <span><s:text name="generic.none" /></span>
                 </s:else>
-                
+
+                <%-- pending entries --%>
+                    
                 <hr size="1" noshade="noshade" />  
                 <h3><s:text name="weblogEdit.pendingEntries" /></h3>
                 
@@ -52,12 +56,13 @@
                             <s:param name="weblog" value="%{actionWeblog.handle}" />
                             <s:param name="bean.id" value="#post.id" />
                         </s:url>
-                        <img src='<s:url value="/images/table_error.png"/>' 
-                             align="absmiddle" border="0" alt="icon" title="Edit" />
-                             <s:a href="%{editUrl}"><str:truncateNicely lower="50"><s:property value="#post.title" /></str:truncateNicely></s:a>
+                        <span class="glyphicon glyphicon-lock" aria-hidden="true"> </span> 
+                        <s:a href="%{editUrl}"><str:truncateNicely lower="60">
+                             <s:property value="#post.title" /></str:truncateNicely></s:a>
                     </span><br />
                 </s:iterator>
-                
+
+                <%-- draft entries --%>
                 
                 <hr size="1" noshade="noshade" />            
                 <h3><s:text name="weblogEdit.draftEntries" /></h3>
@@ -72,15 +77,17 @@
                             <s:param name="weblog" value="%{actionWeblog.handle}" />
                             <s:param name="bean.id" value="#post.id" />
                         </s:url>
-                        <img src='<s:url value="/images/table_edit.png"/>' 
-                             align="absmiddle" border="0" alt="icon" title="Edit" />
-                             <s:a href="%{editUrl}"><str:truncateNicely lower="50"><s:property value="#post.title" /></str:truncateNicely></s:a>
+                        <span class="glyphicon glyphicon-edit" aria-hidden="true"> </span> 
+                        <s:a href="%{editUrl}"><str:truncateNicely lower="60">
+                             <s:property value="#post.title" /></str:truncateNicely></s:a>
                     </span><br />
                 </s:iterator>
                 
                 
                 <s:if test="userAnAuthor">
-                    
+
+                    <%-- published entries --%>
+
                     <hr size="1" noshade="noshade" />
                     <h3><s:text name="weblogEdit.publishedEntries" /></h3>
                     
@@ -94,13 +101,15 @@
                                 <s:param name="weblog" value="%{actionWeblog.handle}" />
                                 <s:param name="bean.id" value="#post.id" />
                             </s:url>
-                            <img src='<s:url value="/images/table_edit.png"/>' 
-                                 align="absmiddle" border="0" alt="icon" title="Edit" />
-                            <s:a href="%{editUrl}"><str:truncateNicely lower="50"><s:property value="#post.title" /></str:truncateNicely></s:a>
+                            <span class="glyphicon glyphicon-book" aria-hidden="true"> </span> 
+                            <s:a href="%{editUrl}"><str:truncateNicely lower="60">
+                                <s:property value="#post.title" /></str:truncateNicely></s:a>
                         </span><br />
                     </s:iterator>
-                    
-                    
+
+
+                    <%-- scheduled entries --%>
+
                     <hr size="1" noshade="noshade" />            
                     <h3><s:text name="weblogEdit.scheduledEntries" /></h3>
                     
@@ -114,9 +123,9 @@
                                 <s:param name="weblog" value="%{actionWeblog.handle}" />
                                 <s:param name="bean.id" value="#post.id" />
                             </s:url>
-                            <img src='<s:url value="/images/table_edit.png"/>' 
-                                 align="absmiddle" border="0" alt="icon" title="Edit" />
-                            <s:a href="%{editUrl}"><str:truncateNicely lower="50"><s:property value="#post.title" /></str:truncateNicely></s:a>
+                            <span class="glyphicon glyphicon-time" aria-hidden="true"> </span>
+                            <s:a href="%{editUrl}"><str:truncateNicely lower="60">
+                                <s:property value="#post.title" /></str:truncateNicely></s:a>
                         </span><br />
                     </s:iterator>
                     
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/FolderEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/FolderEdit.jsp
deleted file mode 100644
index f7eda18..0000000
--- a/app/src/main/webapp/WEB-INF/jsps/editor/FolderEdit.jsp
+++ /dev/null
@@ -1,59 +0,0 @@
-<%--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  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.  For additional information regarding
-  copyright in this work, please see the NOTICE file in the top level
-  directory of this distribution.
---%>
-<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-
-<%-- Titling, processing actions different between add and edit --%>
-<s:if test="actionName == 'folderEdit'">
-    <s:set var="subtitleKey">folderForm.edit.subtitle</s:set>
-    <s:set var="mainAction">folderEdit</s:set>
-</s:if>
-<s:else>
-    <s:set var="subtitleKey">folderForm.add.subtitle</s:set>
-    <s:set var="mainAction">folderAdd</s:set>
-</s:else>
-
-
-<p class="subtitle">
-    <s:text name="%{#subtitleKey}" >
-        <s:param value="folder.name" />
-    </s:text>
-</p>
-
-<s:form>
-	<s:hidden name="salt" />
-    <s:hidden name="weblog" />
-    <%-- folderId needed on cancel to determine folder to return to (see struts.xml) --%>
-    <s:hidden name="folderId" value="%{folderId}" />
-    <s:if test="actionName == 'folderEdit'">
-        <%-- bean for folder add does not have a bean id yet --%>
-        <s:hidden name="bean.id" />
-    </s:if>
-
-    <table>
-        <tr>
-            <td><s:text name="generic.name" /></td>
-            <td><s:textfield name="bean.name" size="70" maxlength="255" /></td>
-        </tr>
-    </table>
-    
-    <p>
-        <s:submit value="%{getText('generic.save')}" action="%{#mainAction}!save"/>
-        <s:submit value="%{getText('generic.cancel')}" action="folderEdit!cancel" />
-    </p>
-    
-</s:form>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/Maintenance.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/Maintenance.jsp
index 6904451..dd492a5 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Maintenance.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Maintenance.jsp
@@ -19,21 +19,19 @@
 
 <p class="subtitle"><s:text name="maintenance.subtitle" /></p>
     
-<s:form action="maintenance">
+<s:form action="maintenance" cssClass="form-vertical">
 	<s:hidden name="salt" />
     <s:hidden name="weblog" value="%{actionWeblog.handle}" />
 
-    <s:text name="maintenance.prompt.flush" /><br /><br />
-    <s:submit value="%{getText('maintenance.button.flush')}" action="maintenance!flushCache" />
+    <p><s:text name="maintenance.prompt.flush" /></p>
+    <s:submit value="%{getText('maintenance.button.flush')}" action="maintenance!flushCache" cssClass="btn" />
 
     <s:if test="getBooleanProp('search.enabled')">
-        <br /><br />
-        <s:text name="maintenance.prompt.index" /><br /><br />
-        <s:submit value="%{getText('maintenance.button.index')}" action="maintenance!index" />	
+        <p><s:text name="maintenance.prompt.index" /></p>
+        <s:submit value="%{getText('maintenance.button.index')}" action="maintenance!index" cssClass="btn" />
     </s:if>
 
-    <br /><br />
-    <s:text name="maintenance.prompt.reset" /><br /><br />
-    <s:submit value="%{getText('maintenance.button.reset')}" action="maintenance!reset" />
+    <p><s:text name="maintenance.prompt.reset" /></p>
+    <s:submit value="%{getText('maintenance.button.reset')}" action="maintenance!reset" cssClass="btn" />
 
 </s:form>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileAdd.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileAdd.jsp
index 08d7e4a..3cf419f 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileAdd.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileAdd.jsp
@@ -16,170 +16,106 @@
   directory of this distribution.
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-<script src="<s:url value="/roller-ui/scripts/jquery-2.1.1.min.js" />"></script>
 
 
+<p class="subtitle"> <s:text name="mediaFileAdd.title"/> </p>
+<p class="pagetip"> <s:text name="mediaFileAdd.pageTip"/> </p>
+
+<s:form id="entry" action="mediaFileAdd!save"
+        method="POST" enctype="multipart/form-data" theme="bootstrap" cssClass="form-horizontal">
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog"/>
+    <s:hidden name="directoryName"/>
+
+    <s:textfield name="bean.name" maxlength="255" label="%{getText('generic.name')}"/>
+
+    <s:textarea name="bean.description"  rows="3" label="%{getText('generic.description')}"/>
+
+    <s:textarea name="bean.copyrightText" rows="3" label="%{getText('mediaFileAdd.copyright')}"/>
+
+    <s:textfield name="bean.tagsAsString" maxlength="255" label="%{getText('mediaFileAdd.tags')}"/>
+
+    <s:select name="bean.directoryId" list="allDirectories"
+              listKey="id" listValue="name" label="%{getText('mediaFileAdd.directory')}"/>
+
+    <s:checkbox name="bean.sharedForGallery"
+                label="%{getText('mediaFileAdd.includeGallery')}"
+                tooltip="%{getText('mediaFileEdit.includeGalleryHelp')}"/>
+
+    <div class="panel panel-default">
+        <div class="panel-heading">
+            <h4 class="panel-title">
+                <s:text name="mediaFileAdd.fileLocation"/>
+            </h4>
+        </div>
+        <div class="panel-body">
+            <s:file id="fileControl0" name="uploadedFiles" size="30" />
+            <s:file id="fileControl1" name="uploadedFiles" size="30" />
+            <s:file id="fileControl2" name="uploadedFiles" size="30" />
+            <s:file id="fileControl3" name="uploadedFiles" size="30" />
+            <s:file id="fileControl4" name="uploadedFiles" size="30" />
+        </div>
+    </div>
+
+    <s:submit id="uploadButton" cssClass="btn btn-default"
+              value="%{getText('mediaFileAdd.upload')}" action="mediaFileAdd!save"/>
+    <s:submit cssClass="btn" value="%{getText('generic.cancel')}" action="mediaFileAdd!cancel"/>
+
+</s:form>
+
+
+<%-- ================================================================== --%>
+
 <script>
-    $(document).ready(function() {
-        $("input[type='file']").change(function() {
+
+    $(document).ready(function () {
+
+        $("input[type='file']").change(function () {
+
             var name = '';
             var count = 0;
             var fileControls = $("input[type='file']");
-            for (var i=0; i<fileControls.size(); i++) {
+
+            for (var i = 0; i < fileControls.length; i++) {
                 if (jQuery.trim(fileControls.get(i).value).length > 0) {
                     count++;
                     name = fileControls.get(i).value;
                 }
             }
-            if (count == 1) {
-                $("#entry_bean_name").get(0).disabled = false;
-                $("#entry_bean_name").get(0).value = name;
+
+            var entryBean = $("#entry_bean_name");
+            if (count === 1) {
+                entryBean.get(0).disabled = false;
+                entryBean.get(0).value = getFileName(name);
+
             } else if (count > 1) {
-                $("#entry_bean_name").css("font-style","italic");
-                $("#entry_bean_name").css("color","grey");
-                $("#entry_bean_name").get(0).value = "<s:text name="mediaFileAdd.multipleNames"  />";
-                $("#entry_bean_name").get(0).disabled = true;
+                entryBean.css("font-style", "italic");
+                entryBean.css("color", "grey");
+                entryBean.get(0).value = "<s:text name="mediaFileAdd.multipleNames"  />";
+                entryBean.get(0).disabled = true;
+            }
+
+            if (count > 0) {
+                $("#uploadButton:first").attr("disabled", false)
             }
         });
+
+        $("#uploadButton:first").attr("disabled", true)
     });
 
     function getFileName(fullName) {
-       var backslashIndex = fullName.lastIndexOf('/');
-       var fwdslashIndex = fullName.lastIndexOf('\\');
-       var fileName;
-       if (backslashIndex >= 0) {
-           fileName = fullName.substring(backslashIndex + 1);
-       } else if (fwdslashIndex >= 0) {
-           fileName = fullName.substring(fwdslashIndex + 1);
-       }
-       else {
-           fileName = fullName;
-       }
-       return fileName;
+        var backslashIndex = fullName.lastIndexOf('/');
+        var fwdslashIndex = fullName.lastIndexOf('\\');
+        var fileName;
+        if (backslashIndex >= 0) {
+            fileName = fullName.substring(backslashIndex + 1);
+        } else if (fwdslashIndex >= 0) {
+            fileName = fullName.substring(fwdslashIndex + 1);
+        }
+        else {
+            fileName = fullName;
+        }
+        return fileName;
     }
 
-</script>
-
-<p class="subtitle">
-    <s:text name="mediaFileAdd.title"  />
-</p>
-<p class="pagetip">
-    <s:text name="mediaFileAdd.pageTip"  />
-</p>
-
-<s:form id="entry" action="mediaFileAdd!save" method="POST" enctype="multipart/form-data">
-	<s:hidden name="salt" />
-    <s:hidden name="weblog" />
-    <s:hidden name="directoryName" />
-
-    <%-- ================================================================== --%>
-    <%-- Title, category, dates and other metadata --%>
-
-    <table class="entryEditTable" cellpadding="0" cellspacing="0" width="100%">
-
-        <tr>
-            <td class="entryEditFormLabel">
-                <label for="status"><s:text name="generic.name" /></label>
-            </td>
-            <td>
-                <s:textfield name="bean.name" size="50" maxlength="255" style="width:30%"/>
-            </td>
-       </tr>
-
-       <tr>
-            <td class="entryEditFormLabel">
-                <label for="status"><s:text name="generic.description" /></label>
-            </td>
-            <td>
-                <s:textarea name="bean.description" cols="50" rows="5" style="width:30%"/>
-            </td>
-       </tr>
-
-       <tr>
-            <td class="entryEditFormLabel">
-                <label for="status"><s:text name="mediaFileAdd.copyright" /></label>
-            </td>
-            <td>
-                <s:textarea name="bean.copyrightText" cols="50" rows="3" style="width:30%"/>
-            </td>
-       </tr>
-
-       <tr>
-            <td class="entryEditFormLabel">
-                <label for="status"><s:text name="mediaFileAdd.tags" /></label>
-            </td>
-            <td>
-                <s:textfield name="bean.tagsAsString" size="50" maxlength="255" style="width:30%"/>
-            </td>
-       </tr>
-
-       <tr>
-            <td class="entryEditFormLabel">
-                <label for="status"><s:text name="mediaFileAdd.directory" /></label>
-            </td>
-            <td>
-                <s:select name="bean.directoryId" list="allDirectories" listKey="id" listValue="name" />
-            </td>
-       </tr>
-
-       <tr>
-            <td class="entryEditFormLabel">
-                <label for="status"><s:text name="mediaFileAdd.includeGallery" /></label>
-            </td>
-            <td>
-                <s:checkbox name="bean.sharedForGallery" />
-                <s:text name="mediaFileEdit.includeGalleryHelp" />
-            </td>
-       </tr>
-
-       <tr>
-           <td>
-                <br />
-                <br />
-                <br />
-           </td>
-           <td>
-           </td>
-       </tr>
-
-        <tr>
-            <td class="entryEditFormLabel">
-                <label for="title"><s:text name="mediaFileAdd.fileLocation" /></label>
-            </td>
-            <td>
-                <div id="fileControl0div" class="miscControl">
-                    <s:file id="fileControl0" name="uploadedFiles" size="30" />
-                    <br />
-                </div>
-
-                <div id="fileControl1div" class="miscControl">
-                    <s:file id="fileControl1" name="uploadedFiles" size="30" />
-                    <br />
-                </div>
-
-                <div id="fileControl2div" class="miscControl">
-                    <s:file id="fileControl2" name="uploadedFiles" size="30" />
-                    <br />
-                </div>
-
-                <div id="fileControl3div" class="miscControl">
-                    <s:file id="fileControl3" name="uploadedFiles" size="30" />
-                    <br />
-                </div>
-
-                <div id="fileControl4div" class="miscControl">
-                    <s:file id="fileControl4" name="uploadedFiles" size="30" />
-                    <br />
-                </div>
-            </td>
-        </tr>
-
-    </table>
-
-    <br />
-    <div class="control">
-       <s:submit value="%{getText('mediaFileAdd.upload')}" action="mediaFileAdd!save" />
-       <s:submit value="%{getText('generic.cancel')}" action="mediaFileAdd!cancel" />
-    </div>
-
-</s:form>
+</script>
\ No newline at end of file
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileAddSuccess.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileAddSuccess.jsp
index 1214149..c3cbae0 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileAddSuccess.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileAddSuccess.jsp
@@ -16,169 +16,198 @@
   directory of this distribution.
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-<script src="<s:url value="/roller-ui/scripts/jquery-2.1.1.min.js" />"></script>
 
-<style>
-    table.mediaFileTable {
-        margin-left: 2em;
-        width: 90%;
-    }
-    img.mediaFileImage {
-        margin-right: 1em;
-    }
-    span.label {
-        font-weight: bold;
-    }
-</style>
+
+<p class="subtitle"><s:text name="mediaFileSuccess.subtitle"/></p>
+<p class="pagetip"><s:text name="mediaFileSuccess.pageTip"/></p>
+
+<s:form id="entry" theme="bootstrap" cssClass="form-horizontal">
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog"/>
+    <s:hidden name="bean.enclosureURL" id="enclosureURL"/>
+
+    <s:if test="newImages.size() > 0">
+        <h4><s:text name="mediaFileSuccess.selectImagesTitle"/></h4>
+        <p><s:text name="mediaFileSuccess.selectImages"/></p>
+
+        <%-- select images via checkboxes --%>
+
+        <s:iterator value="newImages" var="newImage">
+
+            <div class="panel panel-default">
+                <div class="panel-body">
+
+                    <div class="row">
+
+                        <div class="col-md-1">
+                            <input type="checkbox" name="selectedImages" value="<s:property value="#newImage.id"/>"/>
+                        </div>
+
+                        <div class="col-md-2">
+                            <img align="center" class="mediaFileImage"
+                                 src='<s:property value="%{#newImage.thumbnailURL}" />' alt="thumbnail"/>
+                        </div>
+
+                        <div class="col-md-9">
+                            <p>
+                                <b><s:text name="mediaFileSuccess.name"/></b>
+                                <s:property value="%{#newImage.name}"/>
+                            </p>
+
+                            <p>
+                                <b><s:text name="mediaFileSuccess.type"/></b>
+                                <s:property value="%{#newImage.contentType}"/>
+                            </p>
+
+                            <p>
+                                <b><s:text name="mediaFileSuccess.size"/></b>
+                                <s:property value="%{#newImage.length}"/> <s:text name="mediaFileSuccess.bytes"/>,
+                                <s:property value="%{#newImage.width}"/> x
+                                <s:property value="%{#newImage.height}"/> <s:text name="mediaFileSuccess.pixels"/>
+                            </p>
+
+                            <p>
+                                <b><s:text name="mediaFileSuccess.link"/></b>
+                                <s:property value="%{#newImage.permalink}"/>
+                            </p>
+                        </div>
+
+                    </div>
+
+                </div>
+            </div>
+
+        </s:iterator>
+
+    </s:if>
+
+    <s:if test="newFiles.size() > 0">
+
+        <%-- select enclosure file via radio boxes --%>
+
+        <h4><s:text name="mediaFileSuccess.selectEnclosureTitle"/></h4>
+        <p><s:text name="mediaFileSuccess.selectEnclosure"/></p>
+
+        <s:iterator value="newFiles" var="newFile">
+            <div class="panel panel-default">
+                <div class="panel-body">
+
+                    <div class="row">
+
+                        <div class="col-md-1">
+                            <input type="radio" name="enclosure"
+                                   onchange="setEnclosure('<s:property value="%{#newFile.permalink}"/>')"/>
+                        </div>
+
+                        <div class="col-md-11">
+                            <p>
+                                <b><s:text name="mediaFileSuccess.name"/></b>
+                                <s:property value="%{#newFile.name}"/>
+                            </p>
+
+                            <p>
+                                <b><s:text name="mediaFileSuccess.type"/></b>
+                                <s:property value="%{#newFile.contentType}"/>,&nbsp;
+
+                                <b><s:text name="mediaFileSuccess.size"/></b>
+                                <s:property value="%{#newFile.length}"/> <s:text name="mediaFileSuccess.bytes"/>,
+                                <s:property value="%{#newFile.width}"/> x
+                                <s:property value="%{#newFile.height}"/> <s:text name="mediaFileSuccess.pixels"/>
+                            </p>
+
+                            <p>
+                                <b><s:text name="mediaFileSuccess.link"/></b>
+                                <s:property value="%{#newFile.permalink}"/>
+                            </p>
+                        </div>
+
+                    </div>
+
+                </div>
+            </div>
+        </s:iterator>
+
+        <div class="panel panel-default">
+            <div class="panel-body">
+                <div class="row">
+
+                    <div class="col-md-1">
+                        <input type="radio" name="enclosure" onchange="setEnclosure('')" />
+                    </div>
+
+                    <div class="col-md-10">
+                        <s:text name="mediaFileSuccess.noEnclosure" />
+                    </div>
+
+                </div>
+            </div>
+        </div>
+
+    </s:if>
+
+    <%-- buttons for create new weblog, cancel and upload more --%>
+
+    <div>
+        <s:url var="mediaFileAddURL" action="mediaFileAdd">
+            <s:param name="weblog" value="%{actionWeblog.handle}"/>
+            <s:param name="directoryName" value="%{directoryName}"/>
+        </s:url>
+
+        <s:url var="mediaFileViewURL" action="mediaFileView">
+            <s:param name="weblog" value="%{actionWeblog.handle}"/>
+            <s:param name="directoryId" value="%{bean.directoryId}"/>
+        </s:url>
+
+        <s:submit cssClass="btn btn-success" id="submit" value="%{getText('mediaFileSuccess.createPost')}"
+                  action="entryAddWithMediaFile"/>
+
+        <button class="btn btn-default" onclick='window.load("<s:property value='%{mediaFileAddURL}'/>")'>
+            <s:text name="mediaFileSuccess.uploadMore"/>
+        </button>
+
+        <button class="btn" onclick='window.load("<s:property value='%{mediaFileViewURL}'/>")'>
+            <s:text name="generic.cancel"/>
+        </button>
+    </div>
+
+</s:form>
+
+
+<%-- ================================================================================= --%>
 
 <script>
-    $(document).ready(function() {
+
+    var submitButton = $("#submit");
+
+    $(document).ready(function () {
         $("#submit").attr("disabled", true);
 
-        $("input[type='checkbox']").change(function() {
-            if ($("#enclosureURL").get(0).getAttribute("value") != '') {
+        $("input[type='checkbox']").change(function () {
+            if ($("#enclosureURL").get(0).getAttribute("value") !== '') {
                 $("#submit").attr("disabled", false);
                 return;
             }
-            $("#submit").attr("disabled", isImageChecked() ? false : true);
+            submitButton.attr("disabled", !isImageChecked());
         });
     });
+
     function isImageChecked() {
         var boxes = $("input[type='checkbox']");
-        for (var i=0; i<boxes.length; i++) {
+        for (var i = 0; i < boxes.length; i++) {
             if (boxes.get(i).checked) {
                 return true;
             }
         }
         return false;
     }
+
     function setEnclosure(url) {
         $("#enclosureURL").get(0).value = url;
         if (isImageChecked()) {
             $("#submit").attr("disabled", false);
             return;
         }
-        $("#submit").attr("disabled", url == '' ? true : false);
+        submitButton.attr("disabled", url === '');
     }
+
 </script>
-
-
-<p class="subtitle">
-    <s:text name="mediaFileSuccess.subtitle" />
-</p>
-<p class="pagetip">
-    <s:text name="mediaFileSuccess.pageTip" />
-</p>
-
-<s:form id="entry">
-	<s:hidden name="salt" />
-    <s:hidden name="weblog" />
-    <s:hidden name="bean.enclosureURL" id="enclosureURL" />
-
-    <s:if test="newImages.size() > 0">
-        <p><s:text name="mediaFileSuccess.selectImages" /></p>
-
-        <%-- checkboxed list of images uploaded --%>
-        <table class="mediaFileTable">
-            <s:iterator value="newImages" var="newImage">
-            <tr>
-                <td width="5%">
-                    <%-- checkbox for file --%>
-                    <input type="checkbox"
-                           name="selectedImages"
-                           value="<s:property value="#newImage.id"/>"/>
-                </td>
-
-                <td width="15%">
-                    <img align="center" class="mediaFileImage"
-                         src='<s:property value="%{#newImage.thumbnailURL}" />' alt="thumbnail" />
-                </td>
-
-                <td width="80%">
-                    <%-- description of file --%>
-                    <span class="label"><s:text name="mediaFileSuccess.name" /></span>
-                    <s:property value="%{#newImage.name}" /><br />
-
-                    <span class="label"><s:text name="mediaFileSuccess.type" /></span>
-                    <s:property value="%{#newImage.contentType}" /><br />
-
-                    <span class="label"><s:text name="mediaFileSuccess.link" /></span>
-                    <s:property value="%{#newImage.permalink}" /><br />
-
-                    <span class="label"><s:text name="mediaFileSuccess.size" /></span>
-                    <s:property value="%{#newImage.length}" /> <s:text name="mediaFileSuccess.bytes" />,
-                    <s:property value="%{#newImage.width}" /> x
-                    <s:property value="%{#newImage.height}" /> <s:text name="mediaFileSuccess.pixels" />
-
-                </td>
-            </tr>
-            </s:iterator>
-        </table>
-
-    </s:if>
-
-    <s:if test="newFiles.size() > 0">
-        <p><s:text name="mediaFileSuccess.selectEnclosure" /></p>
-
-        <%-- checkboxed list of other files uploaded --%>
-        <table class="mediaFileTable">
-            <s:iterator value="newFiles" var="newFile">
-            <tr>
-                <td width="20%">
-                    <%-- radio button for file --%>
-                    <input type="radio" name="enclosure"
-                       onchange="setEnclosure('<s:property value="%{#newFile.permalink}" />')" />
-                </td>
-                <td width="80%">
-                    <%-- description of file --%>
-                    <s:property value="%{#newFile.name}" />
-                </td>
-            </tr>
-            </s:iterator>
-            <tr>
-                <td>
-                    <input type="radio" name="enclosure" onchange="setEnclosure('')" />
-                </td>
-                <td>
-                    <s:text name="mediaFileSuccess.noEnclosure" />
-                </td>
-            </tr>
-        </table>
-
-    </s:if>
-
-
-    <div style="margin-top:20px"">
-
-        <p><s:text name="mediaFileSuccess.createPostPrompt" /></p>
-        <s:submit id="submit" value="%{getText('mediaFileSuccess.createPost')}" action="entryAddWithMediaFile"/>
-        <br/>
-        <br/>
-        <br/>
-
-        <s:text name="mediaFileSuccess.noThanks" />
-        <ul>
-            <li>
-                <s:url var="mediaFileAddURL" action="mediaFileAdd">
-                    <s:param name="weblog" value="%{actionWeblog.handle}" />
-                    <s:param name="directoryName" value="%{directoryName}" />
-                </s:url>
-                <s:a href="%{mediaFileAddURL}">
-                    <s:text name="mediaFileSuccess.addAnother" />
-                </s:a>
-            </li>
-
-            <li>
-                <s:url var="mediaFileViewURL" action="mediaFileView">
-                    <s:param name="weblog" value="%{actionWeblog.handle}" />
-                    <s:param name="directoryId" value="%{bean.directoryId}" />
-                </s:url>
-                <s:a href="%{mediaFileViewURL}">
-                    <s:text name="mediaFileSuccess.mediaFileView" />
-                </s:a>
-            </li>
-        </ul>
-
-    </div>
-
-</s:form>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileEdit.jsp
index 670eaa6..9c775aa 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileEdit.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileEdit.jsp
@@ -1,183 +1,122 @@
-<%--

-  Licensed to the Apache Software Foundation (ASF) under one or more

-   contributor license agreements.  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.  For additional information regarding

-  copyright in this work, please see the NOTICE file in the top level

-  directory of this distribution.

---%>

-<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>

-<%@ page import="org.apache.roller.weblogger.config.WebloggerConfig" %>

-

-<script src="<s:url value="/roller-ui/scripts/jquery-2.1.1.min.js" />"></script>

-

-<s:if test="bean.isImage">

-    <div class="mediaFileThumbnail">

-        <a href='<s:property value="bean.permalink" />' target="_blank">

-            <img align="right" alt="thumbnail" src='<s:property value="bean.thumbnailURL" />'

-                 title='<s:text name="mediaFileEdit.clickToView" />' />

-        </a>

-    </div>

-</s:if>

-

-<p class="subtitle">

-    <s:text name="mediaFileEdit.subtitle">

-        <s:param value="bean.name" />

-    </s:text>

-</p>

-

-<p class="pagetip">

-    <s:text name="mediaFileEdit.pagetip"  />

-</p>

-

-<s:form id="entry" action="mediaFileEdit!save" method="POST" enctype="multipart/form-data">

-	<s:hidden name="salt" />

-    <s:hidden name="weblog" />

-    <s:hidden name="mediaFileId" id="mediaFileId" />

-    <s:hidden name="bean.permalink" />

-

-    <%-- ================================================================== --%>

-    <%-- Title, category, dates and other metadata --%>

-

-    <table class="entryEditTable" cellpadding="0" cellspacing="0" width="100%">

-

-        <tr>

-            <td class="entryEditFormLabel">

-                <label for="status"><s:text name="generic.name" /></label>

-            </td>

-            <td>

-                <s:textfield name="bean.name" size="35" maxlength="100" tabindex="1" />

-            </td>

-       </tr>

-

-       <tr>

-            <td class="entryEditFormLabel">

-                <label for="fileInfo"><s:text name="mediaFileEdit.fileInfo" /></label>

-            </td>

-            <td>

-                <s:text name="mediaFileEdit.fileTypeSize">

-                    <s:param value="bean.contentType" />

-                    <s:param value="bean.length" />

-                </s:text>

-                <s:if test="bean.isImage">

-                    <s:text name="mediaFileEdit.fileDimensions">

-                        <s:param value="bean.width" />

-                        <s:param value="bean.height" />

-                    </s:text>

-                </s:if>

-            </td>

-       </tr>

-

-        <tr>

-            <td class="entryEditFormLabel">

-                <label for="status"><s:text name="mediaFileEdit.permalink"/></label>

-            </td>

-            <td>

-                <s:url var="linkIconURL" value="/images/link.png"></s:url>

-

-                <a href='<s:property value="bean.permalink" />' target="_blank"

-                   title='<s:text name="mediaFileEdit.linkTitle" />'>

-                    <img border="0" src='<s:property value="%{linkIconURL}" />' style="padding:2px 2px;" alt="link"/>

-                </a>

-

-                <input type="text" id="clip_text" size="50" style="width:90%"

-                       value='<s:property value="bean.permalink" />' readonly/>

-

-            </td>

-        </tr>

-

-       <tr>

-            <td class="entryEditFormLabel">

-                <label for="status"><s:text name="generic.description" /></label>

-            </td>

-            <td>

-                <s:textarea name="bean.description" cols="50" rows="2" tabindex="2" style="width:70%" />

-            </td>

-       </tr>

-

-       <tr>

-            <td class="entryEditFormLabel">

-                <label for="tags"><s:text name="mediaFileEdit.tags" /></label>

-            </td>

-            <td>

-                <s:textfield name="bean.tagsAsString" size="30" maxlength="100" tabindex="3" style="width:70%"/>

-            </td>

-       </tr>

-

-       <tr>

-            <td class="entryEditFormLabel">

-                <label for="copyright"><s:text name="mediaFileEdit.copyright" /></label>

-            </td>

-            <td>

-                <s:textfield name="bean.copyrightText" size="30" maxlength="100" tabindex="4" style="width:70%"/>

-            </td>

-       </tr>

-

-       <tr>

-            <td class="entryEditFormLabel">

-                <label for="directoryId"><s:text name="mediaFileEdit.directory" /></label>

-            </td>

-            <td>

-                <s:select name="bean.directoryId" list="allDirectories"

-                    listKey="id" listValue="name" tabindex="5" />

-            </td>

-       </tr>

-

-       <tr>

-            <td class="entryEditFormLabel">

-                <label for="status"><s:text name="mediaFileEdit.includeGallery" /></label>

-            </td>

-            <td>

-                <s:checkbox name="bean.sharedForGallery" tabindex="6" />

-                <s:text name="mediaFileEdit.includeGalleryHelp" />

-            </td>

-       </tr>

-

-        <tr>

-            <td class="entryEditFormLabel">

-                <label for="title"><s:text name="mediaFileEdit.updateFileContents" /></label>

-            </td>

-            <td>

-                <div id="fileControldiv" class="miscControl">

-                    <s:file id="fileControl" name="uploadedFile" size="30" />

-                    <br />

-                </div>

-            </td>

-        </tr>

-

-        <!-- original path from base URL of ctx/resources/ -->

-        <s:if test="getBooleanProp('mediafile.originalPathEdit.enabled')">

-        <tr>

-            <td class="originalPathLabel">

-                <label for="originalPath"><s:text name="mediaFileEdit.originalPath" /></label>

-            </td>

-            <td>

-                <div id="originalPathdiv" class="miscControl">

-                    <s:textfield name="bean.originalPath" id="originalPath" size="30" maxlength="100" tabindex="3" />

-                    <br />

-                </div>

-            </td>

-        </tr>

-        </s:if>

-

-    </table>

-

-    <div class="control">

-       <input type="submit" tabindex="7"

-              value="<s:text name="generic.save" />" name="submit" />

-       <input type="button" tabindex="8"

-              value="<s:text name="generic.cancel" />" onClick="javascript:window.parent.onEditCancelled();" />

-    </div>

-

-</s:form>

-

-

+<%--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  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.  For additional information regarding
+  copyright in this work, please see the NOTICE file in the top level
+  directory of this distribution.
+--%>
+<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
+
+<p class="pagetip">
+    <s:text name="mediaFileEdit.pagetip"/>
+</p>
+
+<s:form id="entry" action="mediaFileEdit!save" method="POST" enctype="multipart/form-data"
+        theme="bootstrap" class="form-horizontal">
+
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog"/>
+    <s:hidden name="mediaFileId" id="mediaFileId"/>
+    <s:hidden name="bean.permalink"/>
+
+    <s:if test="bean.isImage">
+        <div class="form-group">
+            <label class="control-label col-sm-3">Thumbnail</label>
+            <div class="controls col-sm-9">
+                <a href='<s:property value="bean.permalink" />' target="_blank">
+                    <img alt="thumbnail" src='<s:property value="bean.thumbnailURL" />'
+                         title='<s:text name="mediaFileEdit.clickToView" />'/>
+                </a>
+            </div>
+        </div>
+    </s:if>
+
+    <%-- ================================================================== --%>
+    <%-- Title, category, dates and other metadata --%>
+
+    <s:textfield name="bean.name" size="35" maxlength="100" tabindex="1"
+                 label="%{getText('generic.name')}"/>
+
+    <div class="form-group">
+        <label class="control-label col-sm-3"><s:text name="mediaFileEdit.fileInfo"/></label>
+
+        <div class="controls col-sm-9">
+
+            <s:text name="mediaFileEdit.fileTypeSize">
+                <s:param value="bean.contentType"/>
+                <s:param value="bean.length"/>
+            </s:text>
+
+            <s:if test="bean.isImage">
+                <s:text name="mediaFileEdit.fileDimensions">
+                    <s:param value="bean.width"/>
+                    <s:param value="bean.height"/>
+                </s:text>
+            </s:if>
+
+        </div>
+    </div>
+
+    <div class="form-group">
+        <label class="control-label col-sm-3">URL</label>
+
+        <div class="controls col-sm-9">
+
+            <input type="text" id="clip_text" size="80"
+                   value='<s:property value="bean.permalink" />' readonly />
+
+            <s:url var="linkIconURL" value="/roller-ui/images/clippy.svg"/>
+            <button class="clipbutton" data-clipboard-target="#clip_text" type="button">
+                <img src='<s:property value="%{linkIconURL}" />' alt="Copy to clipboard" style="width:0.9em; height:0.9em">
+            </button>
+
+        </div>
+    </div>
+
+    <s:textarea name="bean.description" cols="50" rows="2" tabindex="2"
+                label="%{getText('generic.description')}"/>
+
+    <s:textfield name="bean.tagsAsString" size="30" maxlength="100" tabindex="3"
+                 label="%{getText('mediaFileEdit.tags')}"/>
+
+    <s:textfield name="bean.copyrightText" size="30" maxlength="100" tabindex="4"
+                 label="%{getText('mediaFileEdit.copyright')}"/>
+
+    <s:select name="bean.directoryId" list="allDirectories" listKey="id" listValue="name"
+              tabindex="5" label="%{getText('mediaFileEdit.directory')}"/>
+
+    <s:checkbox name="bean.sharedForGallery" tabindex="6"
+                label="%{getText('mediaFileEdit.includeGalleryHelp')}"/>
+
+    <!-- original path from base URL of ctx/resources/ -->
+    <s:if test="getBooleanProp('mediafile.originalPathEdit.enabled')">
+        <div id="originalPathdiv" class="miscControl">
+            <s:textfield name="bean.originalPath" id="originalPath" size="30"
+                         maxlength="100" tabindex="3"/>
+        </div>
+    </s:if>
+
+
+    <input type="submit" tabindex="7" class="btn btn-success"
+           value="<s:text name="generic.save" />" name="submit"/>
+    <input type="button" tabindex="8" class="btn"
+           value="<s:text name="generic.cancel" />" onClick="window.parent.onEditCancelled();"/>
+
+</s:form>
+
+
+<script>
+    $(document).ready(function () {
+        new ClipboardJS('.clipbutton');
+    });
+</script>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileImageChooser.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileImageChooser.jsp
index af0bbd6..dddd4d0 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileImageChooser.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileImageChooser.jsp
@@ -17,25 +17,8 @@
 --%>

 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>

 

-<script src="<s:url value="/roller-ui/scripts/jquery-2.1.1.min.js" />"></script>

-

 <style>

-    .mediaObject {

-         width:120px;

-         height:120px;

-    }

-    .mediaObjectInfo {

-        clear:left;

-        width:130px;

-        margin-left:5px;

-        font-size:11px;

-    }

-    .highlight {

-        border: 1px solid #aaa;

-    }

-    #myMenu {

-        margin-left: 0;

-    }

+

 </style>

 

 <script>

@@ -49,144 +32,102 @@
 

 <%-- Subtitle and folder path --%>

 

-<s:if test='currentDirectory.name.equals("default")'>

-

-    <p class="subtitle">

-        <s:text name="mediaFileImageChooser.subtitle" >

-            <s:param value="weblog" />

-        </s:text>

-    </p>

-    </p>

-    <p class="pagetip">

-        <s:text name="mediaFileImageChooser.rootPageTip" />

-    </p>

-

-</s:if>

-

-<s:else>

-

-    <p class="subtitle">

-        <s:text name="mediaFileView.folderName"/> /

-        <s:iterator var="directory" value="currentDirectoryHierarchy">

-            <s:url var="getDirectoryByPathUrl" action="mediaFileImageChooser">

-                <s:param name="directoryName" value="#directory.key" />

-                <s:param name="weblog" value="%{actionWeblog.handle}" />

-            </s:url>

-            <s:a href="%{getDirectoryByPathUrl}"><s:property value="#directory.value" /></s:a> /

-        </s:iterator>

-    </p>

-    <p class="pagetip">

-        <s:text name="mediaFileImageChooser.dirPageTip" />

-    </p>

-

-</s:else>

-

-

-<%-- || (pager && pager.items.size() > 0) --%>

 <s:if test="childFiles || allDirectories">

 

-<s:form id="mediaFileChooserForm" name="mediaFileChooserForm" action="mediaFileView">

-	<s:hidden name="salt" />

-    <s:hidden name="weblog" />

-    <s:hidden name="directoryId" />

-    <input type="hidden" name="mediaFileId" value="" />

+    <s:form id="mediaFileChooserForm" name="mediaFileChooserForm" action="mediaFileImageChooser"

+            theme="bootstrap" cssClass="form-vertical">

+        <s:hidden name="salt"/>

+        <s:hidden name="weblog"/>

+        <input type="hidden" name="mediaFileId" value=""/>

 

+        <p class="pagetip"><s:text name="mediaFileImageChooser.pageTip"/></p>

 

-    <%-- ***************************************************************** --%>

+        <%-- ***************************************************************** --%>

+        <%-- Maybe show media directory selector --%>

 

-    <%-- Media file folder contents --%>

+        <s:if test="!allDirectories.isEmpty">

+            <s:select name="directoryId" emptyOption="true" label="%{getText('mediaFileView.viewFolder')}"

+                      list="allDirectories" listKey="id" listValue="name" onchange="onView()"/>

+        </s:if>

 

-    <script>

-        function highlight(el, flag) {

-            if (flag) {

-                $(el).addClass("highlight");

-            } else {

-                $(el).removeClass("highlight");

-            }

-        }

-    </script>

+        <%-- ***************************************************************** --%>

+        <%-- Media files grid --%>

 

-    <div  width="720px" height="500px">

-        <ul id = "myMenu">

+        <div id="imageGrid" class="panel panel-default">

+            <div class="panel-body">

 

-            <s:if test="childFiles.size() == 0">

-                <p style="text-align: center"><s:text name="mediaFileView.noFiles"/></p>

-            </s:if>

+                <ul>

 

-            <%-- --------------------------------------------------------- --%>

+                    <s:if test="childFiles.size() == 0">

+                        <p style="text-align: center"><s:text name="mediaFileView.noFiles"/></p>

+                    </s:if>

 

-            <%-- List media directories first --%>

+                    <s:if test="childFiles.size() > 0">

 

-            <s:iterator var="directory" value="allDirectories">

-                <li class="align-images"

-                        onmouseover="highlight(this, true)" onmouseout="highlight(this, false)">

-                    <div class="mediaObject">

-                        <img  border="0" src='<s:url value="/images/folder.png"/>'

-                              class="dir-image" alt="mediaFolder.png"

-                              onclick="onSelectDirectory('<s:property value="#directory.id"/>')"/>

-                    </div>

-                    <div class="mediaObjectInfo">

-                        <label><s:property value="#directory.name" /></label>

-                    </div>

-                </li>

-            </s:iterator>

+                        <s:iterator var="mediaFile" value="childFiles">

 

-            <%-- --------------------------------------------------------- --%>

+                            <s:url var="mediaFileURL" includeContext="false" value="%{#mediaFile.permalink}"/>

+                            <s:url var="mediaFileThumbnailURL" value="%{#mediaFile.thumbnailURL}"/>

 

-            <%-- List media files next --%>

-            <s:if test="childFiles.size() > 0">

+                            <li class="align-images"

+                                onmouseover="highlight(this, true)" onmouseout="highlight(this, false)">

 

-                <s:iterator var="mediaFile" value="childFiles">

+                                <div class="mediaObject"

+                                     onclick="onSelectMediaFile('<s:property value="#mediaFile.name"/>',

+                                             '<s:property value="%{mediaFileURL}"/>',

+                                             '<s:property value="#mediaFile.isImageFile()"/>')">

 

-                    <li class="align-images"

-                        onmouseover="highlight(this, true)" onmouseout="highlight(this, false)">

+                                    <s:if test="#mediaFile.imageFile">

+                                        <img border="0" src='<s:property value="%{mediaFileThumbnailURL}" />'

+                                             width='<s:property value="#mediaFile.thumbnailWidth"/>'

+                                             height='<s:property value="#mediaFile.thumbnailHeight"/>'

+                                             alt='<s:property value="#mediaFile.name" />'/>

+                                    </s:if>

 

-                        <s:url var="mediaFileURL" includeContext="false"

-                            value="%{#mediaFile.permalink}"></s:url>

+                                    <s:else>

+                                        <span class="glyphicon glyphicon-file"></span>

+                                    </s:else>

 

-                        <s:url var="mediaFileThumbnailURL"

-                            value="%{#mediaFile.thumbnailURL}"></s:url>

+                                </div>

 

-                        <div class="mediaObject"

-                             onclick="onSelectMediaFile('<s:property value="#mediaFile.name"/>',

-                             '<s:property value="%{mediaFileURL}" />','<s:property value="#mediaFile.isImageFile()"/>')" >

+                                <div class="mediaObjectInfo">

+                                    <str:truncateNicely upper="60">

+                                        <s:property value="#mediaFile.name"/>

+                                    </str:truncateNicely>

+                                </div>

 

-                            <s:if test="#mediaFile.imageFile">

+                            </li>

 

-                                <img border="0" src='<s:property value="%{mediaFileThumbnailURL}" />'

-                                     width='<s:property value="#mediaFile.thumbnailWidth"/>'

-                                     height='<s:property value="#mediaFile.thumbnailHeight"/>' />

-                            </s:if>

+                        </s:iterator>

+                    </s:if>

 

-                        </div>

+                </ul>

+            </div>

+        </div>

 

-                        <div class="mediaObjectInfo">

-                            <label>

-                                <str:truncateNicely upper="50">

-                                    <s:property value="#mediaFile.name" />

-                                </str:truncateNicely>

-                            </label>

-                        </div>

+        <div style="clear:left;"></div>

 

-                    </li>

-

-                </s:iterator>

-            </s:if>

-

-        </ul>

-    </div>

-

-    <div style="clear:left;"></div>

-

-

-</s:form>

+    </s:form>

 

 </s:if>

 

 

-

 <script>

+

     function onSelectMediaFile(name, url, isImage) {

         window.parent.onSelectMediaFile(name, url, isImage);

     }

+

+    function highlight(el, flag) {

+        if (flag) {

+            $(el).addClass("highlight");

+        } else {

+            $(el).removeClass("highlight");

+        }

+    }

+

+    function onView() {

+        document.mediaFileChooserForm.submit();

+    }

+

 </script>

diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileSidebar.jsp
index f80a084..eb43df0 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileSidebar.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileSidebar.jsp
@@ -22,111 +22,74 @@
         <div class="menu-tl">
             <div class="sidebarInner">
 
-                <br />
-                <b><s:text name="mediaFileSidebar.actions" /></b>
-                <br />
-                <br />
+                <h3><s:text name="mediaFileSidebar.actions"/></h3>
 
-                <img src='<s:url value="/images/image_add.png"/>' border="0"alt="icon" />
-                <s:url var="mediaFileAddURL" action="mediaFileAdd">
-                    <s:param name="weblog" value="%{actionWeblog.handle}" />
-                    <s:param name="directoryName" value="%{directoryName}" />
-                </s:url>
-                <a href='<s:property escapeHtml="false" value="%{mediaFileAddURL}" />'
-                    <s:if test="actionName.equals('mediaFileAdd')">style='font-weight:bold;'</s:if> >
-                    <s:text name="mediaFileSidebar.add" />
-                </a>
-
-              <s:if test="!pager">
-
-                <%-- Only show Create New Directory control when NOT showing search results --%>
-                <br /><br />
-                <div>
-                    <img src='<s:url value="/images/folder_add.png"/>' border="0"alt="icon" />
-                    <s:text name="mediaFileView.addDirectory" /><br />
-                    <div style="padding-left:2em; padding-top:1em">
-                        <s:text name="mediaFileView.directoryName" />
-                        <input type="text" id="newDirectoryName" name="newDirectoryName" size="10" maxlength="25" />
-                        <input type="button" id="newDirectoryButton"
-                            value='<s:text name="mediaFileView.create" />' onclick="onCreateDirectory()" />
-                    </div>
+                <div style="clear:right">
+                    <span class="glyphicon glyphicon-picture"></span>
+                    <s:url var="mediaFileAddURL" action="mediaFileAdd">
+                        <s:param name="weblog" value="%{actionWeblog.handle}"/>
+                        <s:param name="directoryName" value="%{directoryName}"/>
+                    </s:url>
+                    <a href='<s:property escapeHtml="false" value="%{mediaFileAddURL}" />'
+                            <s:if test="actionName.equals('mediaFileAdd')"> style='font-weight:bold;'</s:if> >
+                        <s:text name="mediaFileSidebar.add"/>
+                    </a>
                 </div>
-              </s:if>
 
-                <br />
-                <hr size="1" noshade="noshade" />
-                <br />
+                <s:if test="!pager">
+                    <%-- Only show Create New Directory control when NOT showing search results --%>
 
-                <b><s:text name="mediaFileView.search" /></b>
-                <br />
-                <br />
+                    <div style="clear:right; margin-top: 1em">
+
+                        <span class="glyphicon glyphicon-folder-open"></span>
+                        <s:text name="mediaFileView.addDirectory"/> <br />
+
+                        <label for="newDirectoryName">
+                            <s:text name="mediaFileView.directoryName"/>
+                        </label>
+                        <input type="text" id="newDirectoryName" name="newDirectoryName" size="8" maxlength="25"/>
+
+                        <input type="button" id="newDirectoryButton" class="btn btn-primary" style="clear:left"
+                               value='<s:text name="mediaFileView.create" />' onclick="onCreateDirectory()"/>
+
+                    </div>
+                </s:if>
+
+                <hr size="1" noshade="noshade"/>
+
+                <h3><s:text name="mediaFileView.search"/></h3>
 
                 <s:form id="mediaFileSearchForm" name="mediaFileSearchForm"
-                        action="mediaFileView!search">
-					<s:hidden name="salt" />
-                    <s:hidden name="weblog" />
+                        action="mediaFileView!search" theme="bootstrap" cssClass="form-vertical">
+                    <s:hidden name="salt"/>
+                    <s:hidden name="weblog"/>
+                    <input type="hidden" name="mediaFileId" value=""/>
 
-                    <input type="hidden" name="mediaFileId" value="" />
-                    <table class="mediaFileSearchTable" cellpadding="0" cellspacing="3" width="100%">
+                    <s:textfield id="beanName" name="bean.name" size="20" maxlength="255"
+                                 label="%{getText('generic.name')}"/>
 
-                        <tr>
-                            <td>
-                                <label for="name"><s:text name="generic.name" /></label>
-                            </td>
-                            <td>
-                                <s:textfield id="beanName" name="bean.name" size="20" maxlength="255" />
-                            </td>
-                        </tr>
+                    <s:select id="beanType" name="bean.type"
+                              list="fileTypes" listKey="key" listValue="value"
+                              label="%{getText('mediaFileView.type')}"/>
 
-                        <tr>
-                            <td>
-                                <label for="type"><s:text name="mediaFileView.type" /></label>
-                            </td>
-                            <td>
-                                <s:select id="beanType" name="bean.type"
-                                    list="fileTypes" listKey="key" listValue="value" />
-                            </td>
-                        </tr>
+                    <s:select name="bean.sizeFilterType" id="sizeFilterTypeCombo"
+                              list="sizeFilterTypes" listKey="key" listValue="value"
+                              label="%{getText('mediaFileView.size')}"/>
 
-                        <tr>
-                            <td>
-                                <label for="size"><s:text name="mediaFileView.size" /></label>
-                            </td>
-                            <td width="80%">
-                                <s:select name="bean.sizeFilterType" id="sizeFilterTypeCombo"
-                                    list="sizeFilterTypes" listKey="key" listValue="value" />
-                                <s:textfield id="beanSize" name="bean.size"
-                                    size="3" maxlength="10" />
-                                <s:select name="bean.sizeUnit"
-                                    list="sizeUnits" listKey="key" listValue="value" />
-                            </td>
-                        </tr>
+                    <s:textfield id="beanSize" name="bean.size" size="3" maxlength="10"/>
 
-                        <tr>
-                            <td width="10%">
-                                <label for="tags"><s:text name="mediaFileView.tags" /></label>
-                            </td>
-                            <td>
-                                <s:textfield id="beanTags" name="bean.tags"
-                                    size="20" maxlength="50" />
-                            </td>
-                        </tr>
+                    <s:select name="bean.sizeUnit" list="sizeUnits" listKey="key" listValue="value"/>
 
-                        <tr>
-                            <td>
-                                <s:submit id="searchButton" value="%{getText('mediaFileView.search')}" cssStyle="margin:5px 0px;"/>
-                            </td>
-                            <td>
-                                <s:if test="pager">
-                                    <input id="resetButton" style="margin:5px 0px;" type="button"
-                                           name="reset" value='<s:text name="mediaFileView.reset" />' />
-                                </s:if>
-                                &nbsp;
-                            </td>
-                            <td>&nbsp;</td>
-                            <td>&nbsp;</td>
-                        </tr>
-                    </table>
+                    <s:textfield id="beanTags" name="bean.tags" size="20" maxlength="50"
+                                 label="%{getText('mediaFileView.tags')}"/>
+
+                    <s:submit id="searchButton" cssClass="btn btn-primary"
+                              value="%{getText('mediaFileView.search')}" cssStyle="margin:5px 0;"/>
+
+                    <s:if test="pager">
+                        <input id="resetButton" style="margin:5px 0;" type="button" class="btn"
+                               name="reset" value='<s:text name="mediaFileView.reset" />'/>
+                    </s:if>
 
                 </s:form>
 
@@ -136,51 +99,53 @@
 </div>
 
 
-
 <script>
 
-function onCreateDirectory() {
-    document.mediaFileViewForm.newDirectoryName.value = $("#newDirectoryName").get(0).value;
-    document.mediaFileViewForm.action='<s:url action="mediaFileView!createNewDirectory" />';
-    document.mediaFileViewForm.submit();
-}
+    function onCreateDirectory() {
+        document.mediaFileViewForm.newDirectoryName.value = $("#newDirectoryName").get(0).value;
+        document.mediaFileViewForm.action = '<s:url action="mediaFileView!createNewDirectory" />';
+        document.mediaFileViewForm.submit();
+    }
 
-$("#newDirectoryButton").ready(function () {
-    $("#newDirectoryName").bind("keyup", maintainDirectoryButtonState);
-    $("#newDirectoryButton").attr("disabled", true);
-});
-
-function maintainDirectoryButtonState(e) {
-    if ( jQuery.trim($("#newDirectoryName").get(0).value).length == 0) {
+    $("#newDirectoryButton").ready(function () {
+        $("#newDirectoryName").bind("keyup", maintainDirectoryButtonState);
         $("#newDirectoryButton").attr("disabled", true);
-    } else {
-        $("#newDirectoryButton").attr("disabled", false);
-    }
-}
-
-$("#searchButton").ready(function () {
-
-    maintainSearchButtonState();
-    $("input").bind("keyup", maintainSearchButtonState);
-    $("select").bind("change", maintainSearchButtonState);
-
-    $("#resetButton").bind("click", function() {
-        <s:url var="mediaFileViewURL" action="mediaFileView">
-            <s:param name="weblog" value="%{actionWeblog.handle}" />
-        </s:url>
-        window.location = '<s:property value="%{mediaFileViewURL}" />';
     });
-});
 
-function maintainSearchButtonState(e) {
-    if ( jQuery.trim($("#beanName").get(0).value).length == 0
-     &&  jQuery.trim($("#beanTags").get(0).value).length == 0
-     && (jQuery.trim($("#beanSize").get(0).value).length == 0 || $("#beanSize").get(0).value == 0)
-     && ($("#beanType").get(0).value.length == 0 || $("#beanType").get(0).value == "mediaFileView.any")) {
-        $("#searchButton").attr("disabled", true);
-    } else {
-        $("#searchButton").attr("disabled", false);
+    function maintainDirectoryButtonState(e) {
+        if (jQuery.trim($("#newDirectoryName").get(0).value).length === 0) {
+            $("#newDirectoryButton").attr("disabled", true);
+        } else {
+            $("#newDirectoryButton").attr("disabled", false);
+        }
     }
-}
+
+    $("#searchButton").ready(function () {
+
+        maintainSearchButtonState();
+        $("input").bind("keyup", maintainSearchButtonState);
+        $("select").bind("change", maintainSearchButtonState);
+
+        $("#resetButton").bind("click", function () {
+            <s:url var="mediaFileViewURL" action="mediaFileView">
+            <s:param name="weblog" value="%{actionWeblog.handle}" />
+            </s:url>
+            window.location = '<s:property value="%{mediaFileViewURL}" />';
+        });
+    });
+
+    function maintainSearchButtonState(e) {
+        var beanSize = $("#beanSize").get(0).value;
+        var beanType = $("#beanType").get(0).value;
+
+        if (jQuery.trim($("#beanName").get(0).value).length === 0
+            && jQuery.trim($("#beanTags").get(0).value).length === 0
+            && (jQuery.trim(beanSize).length === 0 || beanSize === 0)
+            && (beanType.length === 0 || beanType === "mediaFileView.any")) {
+            $("#searchButton").attr("disabled", true);
+        } else {
+            $("#searchButton").attr("disabled", false);
+        }
+    }
 
 </script>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileView.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileView.jsp
index 163a869..fc255e6 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileView.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileView.jsp
@@ -16,118 +16,12 @@
   directory of this distribution.
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/jquery-ui-1.11.0/jquery-ui.min.css"/>' />
-
-<script src="<s:url value="/roller-ui/scripts/jquery-2.1.1.min.js" />"></script>
-<script src='<s:url value="/roller-ui/jquery-ui-1.11.0/jquery-ui.min.js"/>'></script>
-
-
-<style>
-    .mediaObject {
-         width:120px;
-         height:120px;
-    }
-    .mediaObjectInfo {
-        clear:left;
-        width:130px;
-        margin-left:5px;
-        margin-top:3px;
-        font-size:11px;
-    }
-    .highlight {
-        border: 1px solid #aaa;
-    }
-    #myMenu {
-        margin-left: 0;
-    }
-    span.button {
-        height:15px;
-        width:15px;
-        float:right;
-    }
-</style>
-
-
-<script>
-    toggleState = 'Off'
-
-    function onSelectDirectory(id) {
-        window.location = "<s:url action="mediaFileView" />?directoryId=" + id + "&weblog=" + '<s:property value="actionWeblog.handle" />';
-    }
-
-    function onToggle() {
-        if (toggleState == 'Off') {
-            toggleState = 'On';
-            toggleFunction(true, 'selectedMediaFiles');
-            $("#deleteButton").attr('disabled',false)
-            $("#moveButton").attr('disabled',false)
-            $("#moveTargetMenu").attr('disabled',false)
-        } else {
-            toggleState = 'Off';
-            toggleFunction(false, 'selectedMediaFiles');
-            $("#deleteButton").attr('disabled',true)
-            $("#moveButton").attr('disabled',true)
-            $("#moveTargetMenu").attr('disabled',true)
-        }
-    }
-
-    function onDeleteSelected() {
-        if ( confirm("<s:text name='mediaFile.delete.confirm' />") ) {
-            document.mediaFileViewForm.action='<s:url action="mediaFileView!deleteSelected" />';
-            document.mediaFileViewForm.submit();
-        }
-    }
-
-    function onDeleteFolder() {
-        if (confirm("<s:text name='mediaFile.deleteFolder.confirm' />")) {
-            document.bookmarks.action='<s:url action="mediaFileView!deleteFolder" />';
-            document.bookmarks.submit();
-        }
-    }
-
-    function onMoveSelected() {
-        if ( confirm("<s:text name='mediaFile.move.confirm' />") ) {
-            document.mediaFileViewForm.action='<s:url action="mediaFileView!moveSelected" />';
-            document.mediaFileViewForm.submit();
-        }
-    }
-    
-    function onView() {
-        document.mediaFileViewForm.action = "<s:url action='mediaFileView!view' />";
-        document.mediaFileViewForm.submit();
-    }
-
-    <%-- code to toggle buttons on/off as media file/directory selections change --%>
-
-    $(document).ready(function() {
-        $("#deleteButton").attr('disabled',true)
-        $("#moveButton").attr('disabled',true)
-        $("#moveTargetMenu").attr('disabled',true)
-
-        $("input[type=checkbox]").change(function() {
-            var count = 0;
-            $("input[type=checkbox]").each(function(index, element) {
-                if (element.checked) count++;
-            });
-            if (count == 0) {
-                $("#deleteButton").attr('disabled',true)
-                $("#moveButton").attr('disabled',true)
-                $("#moveTargetMenu").attr('disabled',true)
-            } else {
-                $("#deleteButton").attr('disabled',false)
-                $("#moveButton").attr('disabled',false)
-                $("#moveTargetMenu").attr('disabled',false)
-            }
-        });
-    });
-</script>
-
 
 <s:form id="createPostForm" action='entryAddWithMediaFile'>
-	<s:hidden name="salt" />
-    <input type="hidden" name="weblog" value='<s:property value="actionWeblog.handle" />' />
-    <input type="hidden" name="selectedImage" id="selectedImage" />
-    <input type="hidden" name="type" id="type" />
+    <s:hidden name="salt"/>
+    <input type="hidden" name="weblog" value='<s:property value="actionWeblog.handle" />'/>
+    <input type="hidden" name="selectedImage" id="selectedImage"/>
+    <input type="hidden" name="type" id="type"/>
 </s:form>
 
 
@@ -138,13 +32,12 @@
 <s:if test='currentDirectory.name.equals("default")'>
 
     <p class="subtitle">
-        <s:text name="mediaFileView.subtitle" >
-            <s:param value="weblog" />
+        <s:text name="mediaFileView.subtitle">
+            <s:param value="weblog"/>
         </s:text>
     </p>
-    </p>
     <p class="pagetip">
-        <s:text name="mediaFileView.rootPageTip" />
+        <s:text name="mediaFileView.rootPageTip"/>
     </p>
 
 </s:if>
@@ -152,67 +45,64 @@
 <s:elseif test='pager'>
 
     <p class="subtitle">
-        <s:text name="mediaFileView.searchTitle" />
+        <s:text name="mediaFileView.searchTitle"/>
     </p>
     <p class="pagetip">
 
-        <%-- display summary of the search results and terms --%>
+            <%-- display summary of the search results and terms --%>
 
         <s:if test="pager.items.size() > 0">
-            <s:text name="mediaFileView.matchingResults">
-                <s:param value="pager.items.size()" />
-            </s:text>
+        <s:text name="mediaFileView.matchingResults">
+            <s:param value="pager.items.size()"/>
+        </s:text>
         </s:if>
         <s:else>
-            <s:text name="mediaFileView.noResults" />
+            <s:text name="mediaFileView.noResults"/>
         </s:else>
-        <s:text name="mediaFileView.searchInfo" />
+            <s:text name="mediaFileView.searchInfo"/>
 
-        <ul>
-            <s:if test="!bean.name.isEmpty()">
-                <li>
-                    <s:text name="mediaFileView.filesNamed">
-                        <s:param value="bean.name" />
-                    </s:text>
-                </li>
-            </s:if>
-            <s:if test="bean.size > 0">
-                <li>
-                    <s:text name="mediaFileView.filesOfSize">
-                        <s:param value='bean.sizeFilterTypeLabel' />
-                        <s:param value='bean.size' />
-                        <s:param value='bean.sizeUnitLabel' />
-                    </s:text>
-                </li>
-            </s:if>
-            <s:if test="!bean.type.isEmpty()">
-                <li>
-                    <s:text name="mediaFileView.filesOfType">
-                        <s:param value='bean.typeLabel' />
-                    </s:text>
-                </li>
-            </s:if>
-            <s:if test="!bean.tags.isEmpty()">
-                <li>
-                    <s:text name="mediaFileView.filesTagged">
-                        <s:param value="bean.tags" />
-                    </s:text>
-                </li>
-            </s:if>
-        </ul>
-
-    </p>
-    <br />
+    <ul>
+        <s:if test="!bean.name.isEmpty()">
+            <li>
+                <s:text name="mediaFileView.filesNamed">
+                    <s:param value="bean.name"/>
+                </s:text>
+            </li>
+        </s:if>
+        <s:if test="bean.size > 0">
+            <li>
+                <s:text name="mediaFileView.filesOfSize">
+                    <s:param value='bean.sizeFilterTypeLabel'/>
+                    <s:param value='bean.size'/>
+                    <s:param value='bean.sizeUnitLabel'/>
+                </s:text>
+            </li>
+        </s:if>
+        <s:if test="!bean.type.isEmpty()">
+            <li>
+                <s:text name="mediaFileView.filesOfType">
+                    <s:param value='bean.typeLabel'/>
+                </s:text>
+            </li>
+        </s:if>
+        <s:if test="!bean.tags.isEmpty()">
+            <li>
+                <s:text name="mediaFileView.filesTagged">
+                    <s:param value="bean.tags"/>
+                </s:text>
+            </li>
+        </s:if>
+    </ul>
 
 </s:elseif>
 
 <s:else>
 
     <p class="subtitle">
-        <s:text name="mediaFileView.folderName"/>: <s:property value="%{currentDirectory.name}" />
+        <s:text name="mediaFileView.folderName"/>: <s:property value="%{currentDirectory.name}"/>
     </p>
     <p class="pagetip">
-        <s:text name="mediaFileView.dirPageTip" />
+        <s:text name="mediaFileView.dirPageTip"/>
     </p>
 
 </s:else>
@@ -220,219 +110,248 @@
 
 <s:if test="childFiles || (pager && pager.items.size() > 0)">
 
-  <s:form id="mediaFileViewForm" name="mediaFileViewForm" action="mediaFileView">
-	<s:hidden name="salt" />
-    <s:hidden name="weblog" />
-    <s:hidden name="directoryId" />
-    <s:hidden name="newDirectoryName" />
-    <input type="hidden" name="mediaFileId" value="" />
+    <s:form id="mediaFileViewForm" name="mediaFileViewForm" action="mediaFileView" theme="bootstrap">
+        <s:hidden name="salt"/>
+        <s:hidden name="weblog"/>
+        <s:hidden name="directoryId"/>
+        <s:hidden name="newDirectoryName"/>
+        <input type="hidden" name="mediaFileId" value=""/>
 
-    <div class="control">
-        <span style="padding-left:7px">
-            <s:text name="mediaFileView.sortBy" />:
-            <s:select id="sortByMenu" name="sortBy" list="sortOptions" listKey="key"
-                  listValue="value"
-                  onchange="document.mediaFileViewForm.submit();" />
-        </span>
+        <div class="image-controls">
 
-        <span style="float:right">
             <s:if test="!allDirectories.isEmpty">
                 <%-- Folder to View combo-box --%>
-                <s:text name="mediaFileView.viewFolder" />:
-                <s:select name="viewDirectoryId" list="allDirectories" listKey="id" listValue="name" onchange="onView()" />
+                <span><s:text name="mediaFileView.viewFolder"/>:</span>
+                <s:select id="viewDirectoryMenu" name="viewDirectoryId"
+                          list="allDirectories" listKey="id" listValue="name" onchange="onView()"/>
             </s:if>
-        </span>
-    </div>
 
-    <%-- ***************************************************************** --%>
+            <span><s:text name="mediaFileView.sortBy"/>:</span>
+            <s:select id="sortByMenu" name="sortBy" list="sortOptions" listKey="key" listValue="value"
+                      onchange="document.mediaFileViewForm.submit();"/>
 
-    <%-- Media file folder contents --%>
+        </div>
 
-    <script>
-        function highlight(el, flag) {
-            if (flag) {
-                $(el).addClass("highlight");
-            } else {
-                $(el).removeClass("highlight");
+
+        <%-- ***************************************************************** --%>
+
+        <%-- Media file folder contents --%>
+
+        <script>
+            function highlight(el, flag) {
+                if (flag) {
+                    $(el).addClass("highlight");
+                } else {
+                    $(el).removeClass("highlight");
+                }
             }
-        }
-    </script>
+        </script>
 
-    <div  width="720px" height="500px">
-        <ul id = "myMenu">
+        <div id="imageGrid" class="panel panel-default">
+            <div class="panel-body">
 
-            <s:if test="!pager">
+                <ul>
 
-                <%-- ----------------------------------------------------- --%>
+                    <s:if test="!pager">
 
-                <%-- NOT SEARCH RESULTS --%>
+                        <%-- ----------------------------------------------------- --%>
 
-                <s:if test="childFiles.size() ==0">
-                    <p style="text-align: center"><s:text name="mediaFileView.noFiles"/></p>
-                </s:if>
+                        <%-- NOT SEARCH RESULTS --%>
 
-                <%-- List media files --%>
+                        <s:if test="childFiles.size() ==0">
+                            <s:text name="mediaFileView.noFiles"/>
+                        </s:if>
 
-                <s:iterator var="mediaFile" value="childFiles">
+                        <%-- List media files --%>
 
-                    <li class="align-images"
-                            onmouseover="highlight(this, true)" onmouseout="highlight(this, false)">
+                        <s:iterator var="mediaFile" value="childFiles">
 
-                        <div class="mediaObject"
-                             onclick="onClickEdit('<s:property value="#mediaFile.id"/>')" >
+                            <li class="align-images"
+                                onmouseover="highlight(this, true)" onmouseout="highlight(this, false)">
 
-                            <s:if test="#mediaFile.imageFile">
-                                <img border="0" src='<s:property value="%{#mediaFile.thumbnailURL}" />'
-                                     width='<s:property value="#mediaFile.thumbnailWidth"/>'
-                                     height='<s:property value="#mediaFile.thumbnailHeight"/>'
-                                     title='<s:property value="#mediaFile.name" />' />
-                            </s:if>
+                                <div class="mediaObject" onclick="onClickEdit(
+                                        '<s:property value="#mediaFile.id"/>',
+                                        '<s:property value="#mediaFile.name"/>' )">
 
-                            <s:else>
-                                <s:url var="mediaFileURL" value="/images/page.png"></s:url>
-                                <img border="0" src='<s:property value="%{mediaFileURL}" />'
-                                     style="padding:40px 50px;" alt="logo" />
-                            </s:else>
+                                    <s:if test="#mediaFile.imageFile">
+                                        <img border="0" src='<s:property value="%{#mediaFile.thumbnailURL}" />'
+                                             width='<s:property value="#mediaFile.thumbnailWidth" />'
+                                             height='<s:property value="#mediaFile.thumbnailHeight" />'
+                                             title='<s:property value="#mediaFile.name" />'
+                                             alt='<s:property value="#mediaFile.name" />'
+                                            <%-- onclick="onClickEdit('<s:property value="#mediaFile.id"/>')" --%> />
+                                    </s:if>
 
-                        </div>
+                                    <s:else>
+                                        <s:url var="mediaFileURL" value="/images/page.png"/>
+                                        <img border="0" src='<s:property value="%{mediaFileURL}" />'
+                                             style="padding:40px 50px;"
+                                             alt='<s:property value="#mediaFile.name"/>'
+                                            <%-- onclick="onClickEdit('<s:property value="#mediaFile.id"/>')" --%> />
+                                    </s:else>
 
-                        <div class="mediaObjectInfo"
-                             onmouseover='setupMenuButton("<s:property value='#mediaFile.id' />")'>
+                                </div>
 
-                            <input type="checkbox"
-                                   name="selectedMediaFiles"
-                                   value="<s:property value="#mediaFile.id"/>" />
-                            <input type="hidden" id="mediafileidentity"
-                                   value="<s:property value='#mediaFile.id'/>" />
+                                <div class="mediaObjectInfo">
 
-                            <str:truncateNicely lower="47" upper="47">
-                                <s:property value="#mediaFile.name" />
-                            </str:truncateNicely>
+                                    <input type="checkbox"
+                                           name="selectedMediaFiles"
+                                           value="<s:property value="#mediaFile.id"/>"/>
+                                    <input type="hidden" id="mediafileidentity"
+                                           value="<s:property value='#mediaFile.id'/>"/>
 
-                       </div>
+                                    <str:truncateNicely lower="47" upper="47">
+                                        <s:property value="#mediaFile.name"/>
+                                    </str:truncateNicely>
 
-                    </li>
+                                </div>
 
-                </s:iterator>
+                            </li>
 
-            </s:if>
+                        </s:iterator>
 
-            <s:else>
+                    </s:if>
 
-                <%-- ----------------------------------------------------- --%>
+                    <s:else>
 
-                <%-- SEARCH RESULTS --%>
+                        <%-- ----------------------------------------------------- --%>
 
-                <s:iterator var="mediaFile" value="pager.items">
+                        <%-- SEARCH RESULTS --%>
 
-                    <li class="align-images"
-                            onmouseover="highlight(this, true)" onmouseout="highlight(this, false)">
+                        <s:iterator var="mediaFile" value="pager.items">
 
-                        <div class="mediaObject"
-                             onclick="onClickEdit('<s:property value="#mediaFile.id"/>')" >
+                            <li class="align-images"
+                                onmouseover="highlight(this, true)" onmouseout="highlight(this, false)">
 
-                            <s:if test="#mediaFile.imageFile">
-                                <img border="0" src='<s:property value="%{#mediaFile.thumbnailURL}" />'
-                                     width='<s:property value="#mediaFile.thumbnailWidth"/>'
-                                     height='<s:property value="#mediaFile.thumbnailHeight"/>'
-                                     title='<s:property value="#mediaFile.name" />' />
-                            </s:if>
+                                <div class="mediaObject" onclick="onClickEdit(
+                                        '<s:property value="#mediaFile.id"/>',
+                                        '<s:property value="#mediaFile.name"/>' )">
 
-                            <s:else>
-                                <s:url var="mediaFileURL" value="/images/page.png"></s:url>
-                                <img border="0" src='<s:property value="%{mediaFileURL}" />'
-                                     style="padding:40px 50px;" />
-                            </s:else>
+                                    <s:if test="#mediaFile.imageFile">
+                                        <img border="0" src='<s:property value="%{#mediaFile.thumbnailURL}" />'
+                                             width='<s:property value="#mediaFile.thumbnailWidth"/>'
+                                             height='<s:property value="#mediaFile.thumbnailHeight"/>'
+                                             title='<s:property value="#mediaFile.name" />'
+                                             alt='<s:property value="#mediaFile.name"/>'/>
+                                    </s:if>
 
-                        </div>
+                                    <s:else>
+                                        <s:url var="mediaFileURL" value="/images/page.png"/>
+                                        <img border="0" src='<s:property value="%{mediaFileURL}" />'
+                                             style="padding:40px 50px;" alt='<s:property value="#mediaFile.name"/>'/>
+                                    </s:else>
 
-                        <div class="mediaObjectInfo"
-                             onmouseover='setupMenuButton("<s:property value='#mediaFile.id' />")'>
+                                </div>
 
-                                <input type="checkbox"
-                                       name="selectedMediaFiles"
-                                       value="<s:property value="#mediaFile.id"/>"/>
-                                <input type="hidden" id="mediafileidentity"
-                                       value="<s:property value='#mediaFile.id'/>">
+                                <div class="mediaObjectInfo">
 
-                                <str:truncateNicely lower="40" upper="50">
-                                    <s:property value="#mediaFile.name" />
-                                </str:truncateNicely>
+                                    <input type="checkbox"
+                                           name="selectedMediaFiles"
+                                           value="<s:property value="#mediaFile.id"/>"/>
+                                    <input type="hidden" id="mediafileidentity"
+                                           value="<s:property value='#mediaFile.id'/>">
 
-                                <span class="button" id="addbutton-<s:property value='#mediaFile.id' />">
+                                    <str:truncateNicely lower="40" upper="50">
+                                        <s:property value="#mediaFile.name"/>
+                                    </str:truncateNicely>
+
+                                    <span class="button" id="addbutton-<s:property value='#mediaFile.id' />">
                                     <img id="addbutton-img<s:property value='#mediaFile.id' />"
-                                         src="<s:url value="/images/add.png"/>" />
+                                         src="<s:url value="/images/add.png"/>"/>
                                 </span>
 
-                        </div>
+                                </div>
 
-                    </li>
+                            </li>
 
-                </s:iterator>
+                        </s:iterator>
 
-            </s:else>
+                    </s:else>
 
-        </ul>
-    </div>
+                </ul>
 
-    <div style="clear:left;"></div>
-
-    <s:if test="(!pager && childFiles.size() > 0) || (pager && pager.items.size() > 0) || (currentDirectory.name != 'default' && !pager)">
-        <div class="control clearfix" style="margin-top: 15px">
-
-            <s:if test="(!pager && childFiles.size() > 0) || (pager && pager.items.size() > 0)">
-                <span style="padding-left:7px;margin-top: 20px">
-                    <input id="toggleButton" type="button"
-                       value='<s:text name="generic.toggle" />' onclick="onToggle()" />
-
-                    <input id="deleteButton" type="button"
-                       value='<s:text name="mediaFileView.deleteSelected" />' onclick="onDeleteSelected()" />
-
-                    <input id="moveButton" type="button"
-                       value='<s:text name="mediaFileView.moveSelected" />' onclick="onMoveSelected()" />
-
-                    <s:select id="moveTargetMenu" name="selectedDirectory" list="allDirectories" listKey="id" listValue="name" />
-                </span>
-            </s:if>
-
-            <s:if test="currentDirectory.name != 'default' && !pager">
-                <span style="float:right;">
-                    <s:submit value="%{getText('mediaFileView.deleteFolder')}" action="mediaFileView!deleteFolder" onclick="onDeleteFolder();return false;"/>
-                </span>
-            </s:if>
+            </div>
         </div>
-    </s:if>
 
-</s:form>
+        <div style="clear:left;"></div>
+
+        <s:if test="(!pager && childFiles.size() > 0) || (pager && pager.items.size() > 0) || (currentDirectory.name != 'default' && !pager)">
+
+            <div class="image-controls">
+
+                <s:if test="(!pager && childFiles.size() > 0) || (pager && pager.items.size() > 0)">
+                    <input id="toggleButton" type="button" class="btn" style="display: inline"
+                           value='<s:text name="generic.toggle" />' onclick="onToggle()"/>
+
+                    <input id="deleteButton" type="button" class="btn btn-danger" style="display: inline"
+                           value='<s:text name="mediaFileView.deleteSelected" />' onclick="onDeleteSelected()"/>
+
+                    <input id="moveButton" type="button" class="btn btn-primary" style="display: inline"
+                           value='<s:text name="mediaFileView.moveSelected" />' onclick="onMoveSelected()"/>
+
+                </s:if>
+
+                <s:select id="moveTargetMenu" name="selectedDirectory" cssStyle="display: inline; width: 15em"
+                          list="allDirectories" listKey="id" listValue="name"/>
+
+                <s:if test="currentDirectory.name != 'default' && !pager">
+                    <s:submit value="%{getText('mediaFileView.deleteFolder')}" cssClass="btn"
+                              action="mediaFileView!deleteFolder" onclick="onDeleteFolder();return false;"/>
+                </s:if>
+
+            </div>
+
+        </s:if>
+
+    </s:form>
 
 </s:if>
 
 
-<%-- ***************************************************************** --%>
+<%-- ================================================================================================ --%>
 
-<div id="mediafile_edit_lightbox" title="<s:text name='mediaFileEdit.popupTitle'/>" style="display:none">
-    <iframe id="mediaFileEditor"
-            style="visibility:inherit"
-            height="100%"
-            width="100%"
-            frameborder="no"
-            scrolling="auto">
-    </iframe>
+<%-- view image modal --%>
+
+<div id="mediafile_edit_lightbox" class="modal fade" tabindex="-1" role="dialog">
+
+    <div class="modal-dialog modal-lg">
+
+        <div class="modal-content">
+
+            <div class="modal-header">
+                <h3 class="subtitle">
+                    <s:text name="mediaFileEdit.subtitle"/><b><span id="edit-subtitle"></span></b>
+                </h3>
+            </div>
+
+            <div class="modal-body">
+                <iframe id="mediaFileEditor"
+                        style="visibility:inherit"
+                        height="700" <%-- pixels, sigh, this is suboptimal--%>
+                        width="100%"
+                        frameborder="no"
+                        scrolling="auto">
+                </iframe>
+            </div>
+
+            <div class="modal-footer"></div>
+
+        </div>
+    </div>
+
 </div>
 
+
 <script>
-    function onClickEdit(mediaFileId) {
+    toggleState = 'Off'
+
+    function onClickEdit(mediaFileId, mediaFileName) {
         <s:url var="mediaFileEditURL" action="mediaFileEdit">
-            <s:param name="weblog" value="%{actionWeblog.handle}" />
+        <s:param name="weblog" value="%{actionWeblog.handle}" />
         </s:url>
-        $("#mediaFileEditor").attr('src', '<s:property value="%{mediaFileEditURL}" />' + '&mediaFileId=' + mediaFileId);
-        $(function() {
-            $("#mediafile_edit_lightbox").dialog({
-                modal  : true,
-                width  : 600,
-                height : 630
-            });
-        });
+        $('#edit-subtitle').html(mediaFileName)
+        $('#mediaFileEditor').attr('src', '<s:property value="%{mediaFileEditURL}" />' + '&mediaFileId=' + mediaFileId);
+        $('#mediafile_edit_lightbox').modal({show: true});
     }
 
     function onEditSuccess() {
@@ -441,11 +360,79 @@
     }
 
     function onEditCancelled() {
-        $("#mediafile_edit_lightbox").dialog("close");
-        $("#mediaFileEditor").attr('src','about:blank');
+        $('#mediafile_edit_lightbox').modal('hide');
+        $("#mediaFileEditor").attr('src', 'about:blank');
     }
-</script>
 
-<br/>
-<br/>
-<br/>
\ No newline at end of file
+    function onSelectDirectory(id) {
+        window.location = "<s:url action="mediaFileView" />?directoryId="
+            + id + "&weblog=" + '<s:property value="actionWeblog.handle" />';
+    }
+
+    function onToggle() {
+        if (toggleState === 'Off') {
+            toggleState = 'On';
+            toggleFunction(true, 'selectedMediaFiles');
+            $("#deleteButton").attr('disabled', false);
+            $("#moveButton").attr('disabled', false);
+            $("#moveTargetMenu").attr('disabled', false);
+        } else {
+            toggleState = 'Off';
+            toggleFunction(false, 'selectedMediaFiles');
+            $("#deleteButton").attr('disabled', true);
+            $("#moveButton").attr('disabled', true);
+            $("#moveTargetMenu").attr('disabled', true)
+        }
+    }
+
+    function onDeleteSelected() {
+        if (confirm("<s:text name='mediaFile.delete.confirm' />")) {
+            document.mediaFileViewForm.action = '<s:url action="mediaFileView!deleteSelected" />';
+            document.mediaFileViewForm.submit();
+        }
+    }
+
+    function onDeleteFolder() {
+        if (confirm("<s:text name='mediaFile.deleteFolder.confirm' />")) {
+            document.bookmarks.action = '<s:url action="mediaFileView!deleteFolder" />';
+            document.bookmarks.submit();
+        }
+    }
+
+    function onMoveSelected() {
+        if (confirm("<s:text name='mediaFile.move.confirm' />")) {
+            document.mediaFileViewForm.action = '<s:url action="mediaFileView!moveSelected" />';
+            document.mediaFileViewForm.submit();
+        }
+    }
+
+    function onView() {
+        document.mediaFileViewForm.action = "<s:url action='mediaFileView!view' />";
+        document.mediaFileViewForm.submit();
+    }
+
+    <%-- code to toggle buttons on/off as media file/directory selections change --%>
+
+    $(document).ready(function () {
+        $("#deleteButton").attr('disabled', true);
+        $("#moveButton").attr('disabled', true);
+        $("#moveTargetMenu").attr('disabled', true);
+
+        $("input[type=checkbox]").change(function () {
+            var count = 0;
+            $("input[type=checkbox]").each(function (index, element) {
+                if (element.checked) count++;
+            });
+            if (count === 0) {
+                $("#deleteButton").attr('disabled', true);
+                $("#moveButton").attr('disabled', true);
+                $("#moveTargetMenu").attr('disabled', true)
+            } else {
+                $("#deleteButton").attr('disabled', false);
+                $("#moveButton").attr('disabled', false);
+                $("#moveTargetMenu").attr('disabled', false)
+            }
+        });
+    });
+
+</script>
\ No newline at end of file
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileViewLight.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileViewLight.jsp
index 7c5b42b..565adb5 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileViewLight.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/MediaFileViewLight.jsp
@@ -1,3 +1,20 @@
+<%--

+  Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  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.  For additional information regarding

+  copyright in this work, please see the NOTICE file in the top level

+  directory of this distribution.

+--%>

 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>

 {

 "Result":

diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/MemberResign.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/MemberResign.jsp
index 1e20b23..fca415e 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/MemberResign.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/MemberResign.jsp
@@ -18,20 +18,14 @@
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
 <p>
-   <s:text name="yourWebsites.confirmResignation">
-       <s:param value="weblog" />
-   </s:text>
+    <s:text name="yourWebsites.confirmResignation">
+        <s:param value="weblog"/>
+    </s:text>
 </p>
 
-<table>
-<tr>
-<td>
-    <s:form action="memberResign!resign">
-		<s:hidden name="salt" />
-        <s:hidden name="weblog" />
-        <s:submit value="%{getText('generic.yes')}" />&nbsp;
-        <s:submit value="%{getText('generic.no')}" action="menu"/>
-    </s:form>
-</td>
-</tr>
-</table>
+<s:form action="memberResign!resign"  cssClass="form-horizontal">
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog"/>
+    <s:submit value="%{getText('generic.yes')}" cssClass="form-horizontal"/>&nbsp;
+    <s:submit value="%{getText('generic.no')}" action="menu" cssClass="form-horizontal"/>
+</s:form>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/Members.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/Members.jsp
index c444634..fff1064 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Members.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Members.jsp
@@ -23,7 +23,7 @@
     radios = document.getElementsByTagName("input");
     var removing = false;
     for (var i=0; i<radios.length; i++) {
-        if (radios[i].value == -1 && radios[i].checked) {
+        if (radios[i].value === -1 && radios[i].checked) {
             removing = true;
         }
     }
@@ -41,7 +41,7 @@
 
 <p><s:text name="memberPermissions.description" /></p>
 
-<s:form action="members!save">
+<s:form action="members!save" cssClass="form-horizontal">
 	<s:hidden name="salt" />
     <s:hidden name="weblog" value="%{actionWeblog.handle}" />
     
@@ -50,7 +50,7 @@
             <s:text name="commentManagement.pending" />&nbsp;
     </div>
     
-    <table class="rollertable">
+    <table class="rollertable table table-striped">
         <tr class="rHeaderTr">
            <th class="rollertable" width="20%">
                <s:text name="memberPermissions.userName" />
@@ -80,7 +80,7 @@
             </s:else>
             
                 <td class="rollertable">
-                    <img src='<s:url value="/images/user.png"/>' border="0" alt="icon" />
+                    <span class="glyphicon glyphicon-user"></span>
 	                <s:property value="#perm.user.userName" />
                 </td>               
                 <td class="rollertable">
@@ -108,7 +108,7 @@
     <br />
      
     <div class="control">
-       <s:submit value="%{getText('generic.save')}" />
+       <s:submit value="%{getText('generic.save')}" cssClass="btn" />
     </div>
     
 </s:form>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/MembersInvite.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/MembersInvite.jsp
index 2ff4aac..0f3aabe 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/MembersInvite.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/MembersInvite.jsp
@@ -17,32 +17,26 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<script>
-// <!--
-<%@ include file="/roller-ui/scripts/ajax-user.js" %>
-// -->
-</script> 
-
 <p class="subtitle"><s:text name="inviteMember.subtitle" /></p>
 <p><s:text name="inviteMember.prompt" /></p>
 
-<s:form action="invite!save">
+<s:form action="invite!save" cssClass="form-horizontal">
 	<s:hidden name="salt" />
     <s:hidden name="weblog" value="%{actionWeblog.handle}" />
     
     <div class="formrow">
-       <label for="userName" class="formrow" />
+       <label for="userName" class="formrow">
            <s:text name="inviteMember.userName" /></label>
        <div>
            <input name="userName" id="userName" size="30" maxlength="30" 
-               onfocus="onUserNameFocus(true)" onkeyup="onUserNameChange(true)" /><br />
+               onfocus="onMemberNameFocus(true)" onkeyup="onMemberNameChange(true)" /><br />
        </div>
-    </div>    
-    
+    </div>
+
     <div class="formrow">
        <label class="formrow" />&nbsp;</label>
        <div>
-           <select id="userList" size="10" onchange="onUserSelected()" style="width:400px"></select>
+           <select id="userList" size="10" onchange="onMemberSelected()" style="width:400px"></select>
        </div>
     </div>    
     
@@ -58,14 +52,56 @@
     </div>  
          
     <br />      
-    <s:submit value="%{getText('inviteMember.button.save')}" />
-    <s:submit value="%{getText('generic.cancel')}" action="invite!cancel" />
+    <s:submit id="inviteButton" value="%{getText('inviteMember.button.save')}"  cssClass="btn btn-default"/>
+    <s:submit value="%{getText('generic.cancel')}" action="invite!cancel" cssClass="btn"/>
 
 </s:form>
 
-<%-- this forces focus to the userName field --%>
 <script>
-<!--
-document.getElementById('userName').focus();
-// -->
+
+    <%@ include file="/roller-ui/scripts/ajax-user.js" %>
+
+    $(document).ready(function () {
+        $('#userName').focus();
+        $('#inviteButton').attr("disabled", true);
+    });
+
+    function onMemberNameChange(enabled) {
+        u = userURL;
+        if (enabled != null) {
+            u = u + "&enabled=" + enabled;
+        }
+
+        userName = $('#userName').val();
+        if (userName.length > 0) {
+            u = u + "&startsWith=" + userName;
+        }
+
+        sendUserRequest(u);
+    }
+
+    function onMemberSelected() {
+        userName = $('#userList').children("option:selected").val();
+        if (userName !== '') {
+            $('#inviteButton').attr("disabled", false);
+        }
+    }
+
+    function onMemberNameFocus(enabled) {
+        if (!init) {
+            init = true;
+            u = userURL;
+
+            if (enabled != null) {
+                u = u + "&enabled=" + enabled;
+            }
+
+            sendUserRequest(u);
+
+        } else {
+            $('#inviteButton').attr("disabled", false);
+        }
+    }
+
+
 </script>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/MembersSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/MembersSidebar.jsp
index 4e36873..7313eea 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/MembersSidebar.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/MembersSidebar.jsp
@@ -17,50 +17,19 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<div class="sidebarFade">
-    <div class="menu-tr">
-        <div class="menu-tl">
-            
-        <div class="sidebarInner">
+<h3><s:text name="mainPage.actions" /></h3>
+<hr size="1" noshade="noshade" />
 
-            <h3><s:text name="mainPage.actions" /></h3>            
-            <hr size="1" noshade="noshade" />
-            
-            <img src='<s:url value="/images/email_edit.png"/>' alt="mail-icon" align="bottom" />
-            <s:url action="invite" var="inviteUrl">
-               <s:param name="weblog" value="%{actionWeblog.handle}" />
-            </s:url>
-            <a href='<s:property value="#inviteUrl" />'>
-                <s:text name="memberPermissions.inviteMember" />
-            </a>
-            <br />
-            <s:text name="memberPermissions.whyInvite" />       
-            <br />
-            <br />
-        </div>                					
-        </div>
-    </div>
-</div>	
+<span class="glyphicon glyphicon-plus"></span>
+<s:url action="invite" var="inviteUrl">
+   <s:param name="weblog" value="%{actionWeblog.handle}" />
+</s:url>
+<a href='<s:property value="#inviteUrl" />'>
+    <s:text name="memberPermissions.inviteMember" />
+</a>
+<s:text name="memberPermissions.whyInvite" />
 
-<br />
-<br />
+<h3> <s:text name="memberPermissions.permissionsHelpTitle" /> </h3>
+<hr size="1" noshade="noshade" />
 
-<div class="sidebarFade">
-    <div class="menu-tr">
-        <div class="menu-tl">
-            <div class="sidebarBody">
-            <div class="sidebarInner">
-            
-            <h3>
-                <s:text name="memberPermissions.permissionsHelpTitle" />
-            </h3>
-            <hr size="1" noshade="noshade" />
-            
-            <s:text name="memberPermissions.permissionHelp" />	
-		    <br />
-		    <br />
-        </div>		    
-            </div>
-        </div>
-    </div>
-</div>	
+<s:text name="memberPermissions.permissionHelp" />
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/Pings.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/Pings.jsp
index 0dd6994..fa90d6a 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Pings.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Pings.jsp
@@ -22,19 +22,14 @@
        <s:param value="actionWeblog.handle" />
    </s:text>
 </p>  
-<p class="pagetip">
-    <s:text name="pings.explanation"/>
-<p/>
+<p class="pagetip"> <s:text name="pings.explanation"/> </p>
 
-<p/>
-<h2><s:text name="pings.commonPingTargets"/></h2>
-<p/>
+<p> <h2><s:text name="pings.commonPingTargets"/></h2> </p>
 
-<p/>
-<s:text name="pings.commonPingTargetsExplanation"/>
-<p/>
+<p> <s:text name="pings.commonPingTargetsExplanation"/> </p>
 
-<table class="rollertable">
+
+<table class="rollertable table table-striped">
 <%-- Headings --%>
 <tr class="rollertable">
     <th class="rollertable" width="20%"><s:text name="generic.name" /></th>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/StylesheetEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/StylesheetEdit.jsp
index cd771f6..c3b90cf 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/StylesheetEdit.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/StylesheetEdit.jsp
@@ -16,99 +16,111 @@
   directory of this distribution.
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/jquery-ui-1.11.0/jquery-ui.min.css"/>' />
 
 <p class="subtitle"><s:text name="stylesheetEdit.subtitle" /></p>
 
-<s:if test="template == null">
-    <div class="notification">
-        <s:if test="sharedStylesheetDeleted">
-            <%-- clicking the stylesheet tab will recreate your custom override stylesheet ... --%>
-            <s:text name="stylesheetEdit.canRecreateStylesheetOverride" />
-        </s:if>
-        <s:else>
-            <%-- shared theme does not offer a stylesheet ... --%>
-            <s:text name="stylesheetEdit.noOverridableStylesheetAvailable" />
-        </s:else>
-    </div>
-</s:if>
-<s:else>
-    <p class="pagetip">
-        <s:text name="stylesheetEdit.tip" />
-        <s:if test="!customTheme">
-            <s:text name="stylesheetEdit.revertTip" />
-            <s:if test="sharedThemeCustomStylesheet">
-                <br /><br /><s:text name="stylesheetEdit.revertTip1" />
-            </s:if>
-        </s:if>
-    </p>
 
-    <s:form action="stylesheetEdit!save">
+<s:if test="template != null">
+
+    <s:text name="stylesheetEdit.youCanCustomize" />
+
+    <s:form action="stylesheetEdit!save" theme="bootstrap" cssClass="form-vertical">
         <s:hidden name="salt" />
         <s:hidden name="weblog" />
 
-        <%-- ================================================================== --%>
         <%-- Tabs for each of the two content areas: Standard and Mobile --%>
+        <ul id="template-code-tabs" class="nav nav-tabs" role="tablist" style="margin-bottom: 1em">
 
-        <div id="template-code-tabs">
-        <ul>
-            <li class="selected"><a href="#tabStandard"><em>Standard</em></a></li>
+            <li role="presentation" class="active">
+                <a href="#tabStandard" aria-controls="home" role="tab" data-toggle="tab">
+                    <em><s:text name="stylesheetEdit.standard"/></em>
+                </a>
+            </li>
+
             <s:if test="contentsMobile != null">
-                <li><a href="#tabMobile"><em>Mobile</em></a></li>
+                <li role="presentation">
+                    <a href="#tabMobile" aria-controls="home" role="tab" data-toggle="tab">
+                        <em><s:text name="stylesheetEdit.mobile"/></em>
+                    </a>
+                </li>
             </s:if>
+
         </ul>
-        <div>
-            <div id="tabStandard">
+
+        <%-- Tab content for each of the two content areas: Standard and Mobile --%>
+        <div class="tab-content">
+
+            <div role="tabpanel" class="tab-pane active" id="tabStandard">
                 <s:textarea name="contentsStandard" cols="80" rows="30" cssStyle="width:100%" />
             </div>
+
             <s:if test="contentsMobile != null">
-                <div id="tabMobile">
+                <div role="tabpanel" class="tab-pane" id="tabMobile">
                     <s:textarea name="contentsMobile" cols="80" rows="30" cssStyle="width:100%" />
                 </div>
             </s:if>
-        </div>
+
         </div>
 
-        <%-- ================================================================== --%>
         <%-- Save, Close and Resize text area buttons--%>
+        <s:submit value="%{getText('generic.save')}" cssClass="btn btn-success" />
 
-        <table style="width:100%">
-            <tr>
-                <td>
-                    <s:submit value="%{getText('generic.save')}" />&nbsp;&nbsp;
-                    <s:if test="!customTheme">
-                        <s:submit value="%{getText('stylesheetEdit.revert')}" onclick="revertStylesheet();return false;" />
-                    </s:if>
-                    <%-- Only delete if we have no custom templates ie website.customStylesheetPath=null --%>
-                    <s:if test="sharedThemeCustomStylesheet">
-                        <s:submit value="%{getText('stylesheetEdit.delete')}" onclick="deleteStylesheet();return false;" />
-                    </s:if>
-                </td>
-            </tr>
-        </table>
+        <s:if test="!customTheme">
+            <s:submit value="%{getText('stylesheetEdit.revert')}" cssClass="btn"
+                onclick="revertStylesheet();return false;"
+                      tooltip="%{getText('stylesheetEdit.revertTip')}" />
+        </s:if>
+
+        <%-- Only delete if we have no custom templates ie website.customStylesheetPath=null --%>
+        <s:if test="sharedThemeStylesheet">
+            <s:submit value="%{getText('stylesheetEdit.delete')}"  cssClass="btn btn-danger"
+                onclick="deleteStylesheet();return false;"
+                      tooltip="%{getText('stylesheetEdit.deleteTip')}" />
+        </s:if>
 
     </s:form>
 
-    <script src="<s:url value='/roller-ui/scripts/jquery-2.1.1.min.js'></s:url>"></script>
-    <script src="<s:url value='/roller-ui/jquery-ui-1.11.0/jquery-ui.min.js'></s:url>"></script>
+</s:if>
+<s:elseif test="sharedTheme">
 
-    <script>
-        function revertStylesheet() {
-            if (window.confirm('<s:text name="stylesheetEdit.confirmRevert"/>')) {
-                document.stylesheetEdit.action = "<s:url action='stylesheetEdit!revert' />";
+    <s:if test="sharedThemeStylesheet">
+
+        <s:text name="stylesheetEdit.sharedThemeWithStylesheet" />
+
+        <s:form action="stylesheetEdit!copyStylesheet" theme="bootstrap" cssClass="form-vertical">
+            <s:hidden name="salt" />
+            <s:hidden name="weblog" />
+            <s:submit value="%{getText('stylesheetEdit.copyStylesheet')}" cssClass="btn btn-success"
+                tooltip="%{getText('stylesheetEdit.createStylesheetTip')}" />
+        </s:form>
+
+    </s:if>
+    <s:else>
+        <p><s:text name="stylesheetEdit.sharedThemeNoStylesheetSupport" /></p>
+    </s:else>
+
+</s:elseif>
+<s:else>
+    <s:text name="stylesheetEdit.customThemeNoStylesheet" />
+</s:else>
+
+
+<script type="text/javascript">
+
+    function revertStylesheet() {
+        if (window.confirm('<s:text name="stylesheetEdit.confirmRevert"/>')) {
+            document.stylesheetEdit.action = "<s:url action='stylesheetEdit!revert' />";
+            document.stylesheetEdit.submit();
+        }
+    };
+    <s:if test="%{sharedThemeStylesheet}">
+        function deleteStylesheet() {
+            if (window.confirm('<s:text name="stylesheetEdit.confirmDelete"/>')) {
+                document.stylesheetEdit.action = "<s:url action='stylesheetEdit!delete' />";
                 document.stylesheetEdit.submit();
             }
         };
-        <s:if test="%{sharedThemeCustomStylesheet}">
-            function deleteStylesheet() {
-                if (window.confirm('<s:text name="stylesheetEdit.confirmDelete"/>')) {
-                    document.stylesheetEdit.action = "<s:url action='stylesheetEdit!delete' />";
-                    document.stylesheetEdit.submit();
-                }
-            };
-        </s:if>
-        $(function() {
-            $( "#template-code-tabs" ).tabs();
-        });
-    </script>
-</s:else>
+    </s:if>
+
+</script>
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/TemplateEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/TemplateEdit.jsp
index a07495a..4b738d3 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/TemplateEdit.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/TemplateEdit.jsp
@@ -16,259 +16,212 @@
   directory of this distribution.
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/jquery-ui-1.11.0/jquery-ui.min.css"/>' />
 
 <p class="subtitle">
-   <s:text name="pageForm.subtitle" >
-       <s:param value="bean.name" />
-       <s:param value="actionWeblog.handle" />
-   </s:text>
+    <s:text name="pageForm.subtitle">
+        <s:param value="bean.name"/>
+        <s:param value="actionWeblog.handle"/>
+    </s:text>
 </p>
 
 <s:if test="template.required">
-    <p class="pagetip"><s:text name="pageForm.tip.required" /></p>
+    <p class="pagetip"><s:text name="pageForm.tip.required"/></p>
 </s:if>
 <s:else>
-    <p class="pagetip"><s:text name="pageForm.tip" /></p>
+    <p class="pagetip"><s:text name="pageForm.tip"/></p>
 </s:else>
-                
-<s:form action="templateEdit!save" id="template">
-	<s:hidden name="salt" />
-    <s:hidden name="weblog" />
+
+<s:form action="templateEdit!save" id="template" theme="bootstrap" cssClass="form-vertical">
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog"/>
     <s:hidden name="bean.id"/>
-    <s:hidden name ="bean.type"/>
-    
+    <s:hidden name="bean.type"/>
+
     <%-- ================================================================== --%>
     <%-- Name, link and description: disabled when page is a required page --%>
-    
-    <table cellspacing="5">
-        <tr>
-            <td class="label"><s:text name="generic.name" />&nbsp;</td>
-            <td class="field">
-                <s:if test="template.required || bean.mobile">
-                    <s:textfield name="bean.name" size="50" readonly="true" cssStyle="background: #e5e5e5" />
-                </s:if>
-                <s:else>
-                    <s:textfield name="bean.name" size="50"/>
-                </s:else>
-            </td>
-            <td class="description"></td>
-        </tr>
-        
-        <tr>
-            <td class="label"><s:text name="pageForm.action" />&nbsp;</td>
-            <td class="field">
-                 <s:textfield name="bean.action" size="50" readonly="true" cssStyle="background: #e5e5e5" />
-            </td>
-            <td class="description"></td>
-        </tr>
-        
-       <s:if test="!template.required && template.custom">
-            <tr>
-                <td class="label" valign="top"><s:text name="pageForm.link" />&nbsp;</td>
-                <td class="field">
-                    <s:textfield name="bean.link" size="50" onkeyup="updatePageURLDisplay()" />
-                    <br />
-                    <s:property value="actionWeblog.absoluteURL" />page/<span id="linkPreview" style="color:red"><s:property value="bean.link" /></span>
-                    <s:if test="template.link != null">
-                        [<a id="launchLink" onClick="launchPage()"><s:text name="pageForm.launch" /></a>]
-                    </s:if>
-                </td>
-                <td class="description"></td>
-            </tr>
-        </s:if>
-        <tr>
-            <td class="label" valign="top" style="padding-top: 4px">
-                <s:text name="generic.description" />&nbsp;</td>
-            <td class="field">
-                <s:if test="template.required">
-                    <s:textarea name="bean.description" cols="50" rows="2" 
-                        readonly="true" cssStyle="background: #e5e5e5" />
-                </s:if>
-                <s:else>
-                    <s:textarea name="bean.description" cols="50" rows="2" />
-                </s:else>
-            </td>
-            <td class="description"></td>
-        </tr>
-        
-    </table>
+
+    <s:if test="template.required || bean.mobile">
+        <%-- Cannot edit name of a reqired template --%>
+        <s:textfield name="bean.name"
+                     label="%{getText('generic.name')}" size="50" readonly="true" cssStyle="background: #e5e5e5"/>
+    </s:if>
+    <s:else>
+        <s:textfield name="bean.name"
+                     label="%{getText('generic.name')}" size="50"/>
+    </s:else>
+
+    <s:textfield name="bean.action" label="%{getText('pageForm.action')}" size="50"
+                 readonly="true" cssStyle="background: #e5e5e5"/>
+
+    <s:if test="!template.required && template.custom">
+
+        <%-- allow setting the path for a custom template --%>
+        <s:textfield name="bean.link"
+                     label="%{getText('pageForm.link')}" size="50" onkeyup="updatePageURLDisplay()"/>
+
+        <%-- show preview of the full URL that will result from that path --%>
+
+        <div id="no_link" class="alert-danger" style="display: none; margin-top:3em; margin-bottom:2em; padding: 1em">
+            <s:text name="pageForm.noUrl"/>
+        </div>
+
+        <div id="good_link" class="alert-success"
+             style="display: none; margin-top:3em; margin-bottom:2em; padding: 1em">
+            <s:text name="pageForm.resultingUrlWillBe"/>
+            <s:property value="actionWeblog.absoluteURL"/>page/
+            <span id="linkPreview" style="color:red"><s:property value="bean.link"/></span>
+            <s:if test="template.link != null">
+                [<a id="launchLink" onClick="launchPage()"><s:text name="pageForm.launch"/></a>]
+            </s:if>
+        </div>
+
+    </s:if>
+
+    <s:if test="template.required">
+        <%-- Required templates have a description--%>
+        <s:textarea name="bean.description" label="%{getText('generic.description')}"
+                    cols="50" rows="2" readonly="true" cssStyle="background: #e5e5e5"/>
+    </s:if>
+    <s:else>
+        <s:textarea name="bean.description" label="%{getText('generic.description')}" cols="50" rows="2"/>
+    </s:else>
 
     <%-- ================================================================== --%>
-    <%-- Tabs for each of the two content areas: Standard and Mobile --%>
 
-    <div id="template-code-tabs">
-    <ul>
-        <li class="selected"><a href="#tabStandard"><em>Standard</em></a></li>
+    <%-- Tabs for each of the two content areas: Standard and Mobile --%>
+    <ul id="template-code-tabs" class="nav nav-tabs" role="tablist" style="margin-bottom: 1em">
+
+        <li role="presentation" class="active">
+            <a href="#tabStandard" aria-controls="home" role="tab" data-toggle="tab">
+                <em><s:text name="stylesheetEdit.standard"/></em>
+            </a>
+        </li>
+
         <s:if test="bean.contentsMobile != null">
-            <li><a href="#tabMobile"><em>Mobile</em></a></li>
+            <li role="presentation">
+                <a href="#tabMobile" aria-controls="home" role="tab" data-toggle="tab">
+                    <em><s:text name="stylesheetEdit.mobile"/></em>
+                </a>
+            </li>
         </s:if>
+
     </ul>
-    <div>
-        <div id="tabStandard">
-            <s:textarea name="bean.contentsStandard" cols="80" rows="30" cssStyle="width:100%" />
+
+    <%-- Tab content for each of the two content areas: Standard and Mobile --%>
+    <div class="tab-content">
+
+        <div role="tabpanel" class="tab-pane active" id="tabStandard">
+            <s:textarea name="bean.contentsStandard" cols="80" rows="30" cssStyle="width:100%"/>
         </div>
+
         <s:if test="bean.contentsMobile != null">
-            <div id="tabMobile">
-                <s:textarea name="bean.contentsMobile" cols="80" rows="30" cssStyle="width:100%" />
+            <div role="tabpanel" class="tab-pane" id="tabMobile">
+                <s:textarea name="bean.contentsMobile" cols="80" rows="30" cssStyle="width:100%"/>
             </div>
         </s:if>
-    </div>
+
     </div>
 
     <%-- ================================================================== --%>
     <%-- Save, Close and Resize text area buttons--%>
 
-    <table style="width:100%">
-        <tr>
-            <td>
-                <s:submit value="%{getText('generic.save')}" />
-                <input type="button" value='<s:text name="generic.done"/>'
-                    onclick="window.location='<s:url action="templates"><s:param name="weblog" value="%{weblog}"/></s:url>'" />
-            </td>
-        </tr>
-    </table>
+    <s:submit value="%{getText('generic.save')}" cssClass="btn btn-default"/>
+    <input type="button" value='<s:text name="generic.done"/>' class="button btn"
+           onclick="window.location='<s:url action="templates"><s:param name="weblog" value="%{weblog}"/></s:url>'"/>
 
-  
     <%-- ================================================================== --%>
     <%-- Advanced settings inside a control toggle --%>
-    
+
     <s:if test="template.custom">
-        <br />
-        <div id="advancedControlToggle" class="controlToggle">
-            <span id="iadvancedControl">+</span>
-            <a class="controlToggle" onclick="javascript:toggleControl('advancedControlToggle','advancedControl')">
-            <s:text name="pageForm.advancedSettings" /></a>
+
+        <div class="panel-group" id="accordion" style="margin-top:2em">
+
+        <div class="panel panel-default" id="panel-plugins">
+
+            <div class="panel-heading">
+
+                <h4 class="panel-title">
+                    <a class="collapsed" data-toggle="collapse" data-target="#collapseAdvanced" href="#">
+                        <s:text name="pageForm.advancedSettings"/>
+                    </a>
+                </h4>
+
+            </div>
+
+            <div id="collapseAdvanced" class="panel-collapse collapse">
+                <div class="panel-body">
+
+                    <s:select name="bean.templateLanguage" list="templateLanguages" size="1"
+                              label="%{getText('pageForm.templateLanguage')}"/>
+
+                    <s:checkbox name="bean.hidden"
+                                label="%{getText('pageForm.hidden')}" tooltip="%{getText('pageForm.hidden.tip')}"/>
+
+                    <s:checkbox name="bean.navbar"
+                                label="%{getText('pageForm.navbar')}" tooltip="%{getText('pageForm.navbar.tip')}"/>
+
+                    <s:checkbox name="bean.autoContentType"
+                                label="%{getText('pageForm.useAutoContentType')}"/>
+
+                    <div id="manual-content-type-control-group" style="display:none">
+                        <s:textfield name="bean.manualContentType"
+                                     label="%{getText('pageForm.useManualContentType')}"/>
+                    </div>
+
+                </div>
+            </div>
         </div>
-        
-        <div id="advancedControl" class="advancedControl" style="display:none">
-            
-            <table cellspacing="6">
-                <tr>
-                    <td class="label" valign="top"><s:text name="pageForm.outputContentType" />&nbsp;</td>
-                    <td class="field">
-                        <script><!--
-                        function showContentTypeField() {
-                            if (document.getElementById('template_bean_autoContentType1').checked) {
-                                document.getElementById('template_bean_manualContentType').readOnly = true;
-                                document.getElementById('template_bean_manualContentType').style.background = '#e5e5e5';
-                            } else {
-                                document.getElementById('template_bean_manualContentType').readOnly = false;
-                                document.getElementById('template_bean_manualContentType').style.background = '#ffffff';
-                            }
-                        }
-                        // --></script>
-                        <s:if test="bean.autoContentType">
-                            <input type="radio" name="bean.autoContentType" 
-                                   value="true" checked="true" 
-                                   onchange="showContentTypeField()" 
-                                   id="template_bean_autoContentType1"/> 
-                            <s:text name="pageForm.useAutoContentType" /><br />
-                            
-                            <input type="radio" name="bean.autoContentType" 
-                                   value="false" 
-                                   onchange="showContentTypeField()" 
-                                   id="template_bean_autoContentType2"/>
-                            <s:text name="pageForm.useManualContentType" />
-                            <s:textfield name="bean.manualContentType" />
-                        </s:if>
-                        <s:else>
-                            <input type="radio" name="bean.autoContentType" 
-                                   value="true" 
-                                   onchange="showContentTypeField()" 
-                                   id="template_bean_autoContentType1"/> 
-                            <s:text name="pageForm.useAutoContentType" /><br />
-                            
-                            <input type="radio" name="bean.autoContentType" 
-                                   value="false" 
-                                   checked="true" 
-                                   onchange="showContentTypeField()" 
-                                   id="template_bean_autoContentType2"/>
-                            <s:text name="pageForm.useManualContentType" />
-                            <s:textfield name="bean.manualContentType" />
-                        </s:else>
-                        
-                        <br />
-                        <br />
-                        
-                        <script><!--
-                            showContentTypeField();
-                        // --></script> 
-                        
-                    </td>
-                    <td class="description"></td>
-                </tr>
-                
-                <tr>
-                    <td class="label"><s:text name="pageForm.navbar" />&nbsp;</td>
-                    <td class="field"><s:checkbox name="bean.navbar" /> 
-                        <s:text name="pageForm.navbar.tip" />
-                    </td>
-                    <td class="description"></td>
-                </tr>
-                
-                <tr>
-                    <td class="label"><s:text name="pageForm.hidden" />&nbsp;</td>
-                    <td class="field"><s:checkbox name="bean.hidden" />
-                        <s:text name="pageForm.hidden.tip" />
-                    </td>
-                    <td class="description"></td>                            
-                </tr>
-                
-                <tr>
-                    <td class="label"><s:text name="pageForm.templateLanguage" />&nbsp;</td>
-                    <td class="field">
-                        <s:select name="bean.templateLanguage" list="templateLanguages" size="1" />
-                    </td>
-                    <td class="description"></td>
-                </tr>
-                
-            </table>
-            
-        </div>
+
     </s:if>
-    
+
 </s:form>
 
 
-<script>
-var weblogURL = '<s:property value="actionWeblog.absoluteURL" />';
-var originalLink = '<s:property value="bean.link" />';
-var type = '<s:property value="bean.type" /> ' ;
+<script type="text/javascript">
 
-// Update page URL when user changes link
-function updatePageURLDisplay() {
-    var previewSpan = document.getElementById('linkPreview');
-    var n1 = previewSpan.firstChild;
-    var n2 = document.createTextNode(document.getElementById('template_bean_link').value);
-    if (n1 == null) {
-        previewSpan.appendChild(n2);
-    } else {
-        previewSpan.replaceChild(n2, n1);
-    }           
-}
-// Don't launch page if user has changed link, it'll be a 404
-function launchPage() {
-    if (originalLink != document.getElementById('template_bean_link').value) {
-        window.alert("Link changed, not launching page");
-    } else {
-        window.open(weblogURL + 'page/' + originalLink+'?type='+type, '_blank');
+    var weblogURL = '<s:property value="actionWeblog.absoluteURL" />';
+    var originalLink = '<s:property value="bean.link" />';
+    var type = '<s:property value="bean.type" />';
+
+    $(document).ready(function () {
+
+        $("#template-code-tabs").tabs();
+
+        showContentTypeField();
+        $("#template_bean_autoContentType").click(function(e) {
+            showContentTypeField();
+        });
+    });
+
+    // Update page URL when user changes link
+    function updatePageURLDisplay() {
+        var link = $("#template_bean_link").val();
+        if (link !== "") {
+            $("#no_link").hide();
+            $("#good_link").show();
+            $("#linkPreview").html(link);
+        } else {
+            $("#good_link").hide();
+            $("#no_link").show();
+        }
     }
-}
-//Get cookie to determine state of control
-if (getCookie('control_advancedControl') != null) {
-    if(getCookie('control_advancedControl') == 'true'){
-        toggle('advancedControl');
-        togglePlusMinus('iadvancedControl');
+
+    // Don't launch page if user has changed link, it'll be a 404
+    function launchPage() {
+        if (originalLink != document.getElementById('template_bean_link').value) {
+            window.alert("Link changed, not launching page");
+        } else {
+            window.open(weblogURL + 'page/' + originalLink + '?type=' + type, '_blank');
+        }
     }
-}
+
+    function showContentTypeField() {
+        var checked = $("#template_bean_autoContentType").prop("checked");
+        if ( checked ) {
+            $("#manual-content-type-control-group").hide();
+        } else {
+            $("#manual-content-type-control-group").show();
+        }
+    }
+
 </script>
-
- <script src="<s:url value='/roller-ui/scripts/jquery-2.1.1.min.js'></s:url>"></script>
- <script src="<s:url value='/roller-ui/jquery-ui-1.11.0/jquery-ui.min.js'></s:url>"></script>
-
- <script>
-     $(function() {
-         $( "#template-code-tabs" ).tabs();
-     });
- </script>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/Templates.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/Templates.jsp
index 4d699fd..fefbab6 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/Templates.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/Templates.jsp
@@ -18,100 +18,94 @@
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
 <p class="subtitle">
-   <s:text name="pagesForm.subtitle" >
-       <s:param value="actionWeblog.handle" />
-   </s:text>
-</p>  
+    <s:text name="pagesForm.subtitle">
+        <s:param value="actionWeblog.handle"/>
+    </s:text>
+</p>
 <p class="pagetip">
-   <s:text name="pagesForm.tip" />
+    <s:text name="pagesForm.tip"/>
 </p>
 
 <s:if test="actionWeblog.editorTheme != 'custom'">
     <p><s:text name="pagesForm.themesReminder"><s:param value="actionWeblog.editorTheme"/></s:text></p>
 </s:if>
 
-<s:form action="templatesRemove">
-<s:hidden name="salt" />
-<s:hidden name="weblog" value="%{actionWeblog.handle}" />
+<s:form action="templateRemove!remove" theme="bootstrap" cssClass="form-horizontal">
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog" value="%{actionWeblog.handle}"/>
+    <s:hidden name="removeId" id="removeId"/>
 
-<%-- table of pages --%>
-<table class="rollertable">
+    <table class="table table-striped"> <%-- of weblog templates --%>
 
-<s:if test="!templates.isEmpty">
+        <s:if test="!templates.isEmpty">
 
-    <tr>
-        <th width="30%"><s:text name="generic.name" /></th>
-        <th width="10"><s:text name="pagesForm.action" /></th>
-        <th width="55%"><s:text name="generic.description" /></th>
-        <th width="10"><s:text name="pagesForm.remove" /></th>
-        <th width="5"><input type="checkbox" onclick="toggleFunction(this.checked,'idSelections');"/></th>
-    </tr>
-    <s:iterator var="p" value="templates" status="rowstatus">
-        <s:if test="#rowstatus.odd == true">
-            <tr class="rollertable_odd">
+            <tr>
+                <th width="30%"><s:text name="generic.name"/></th>
+                <th width="10"><s:text name="pagesForm.action"/></th>
+                <th width="55%"><s:text name="generic.description"/></th>
+                <th width="10"><s:text name="pagesForm.remove"/></th>
+            </tr>
+
+            <s:iterator var="p" value="templates" status="rowstatus">
+                <tr>
+
+                    <td style="vertical-align:middle">
+                        <s:if test="! #p.hidden">
+                            <img src='<s:url value="/images/page_white.png"/>' border="0" alt="icon"/>
+                        </s:if>
+                        <s:else>
+                            <img src='<s:url value="/images/page_white_gear.png"/>' border="0" alt="icon"/>
+                        </s:else>
+                        <s:url var="edit" action="templateEdit">
+                            <s:param name="weblog" value="actionWeblog.handle"/>
+                            <s:param name="bean.id" value="#p.id"/>
+                        </s:url>
+                        <s:a href="%{edit}"><s:property value="#p.name"/></s:a>
+                    </td>
+
+                    <td style="vertical-align:middle"><s:property value="#p.action.readableName"/></td>
+
+                    <td style="vertical-align:middle"><s:property value="#p.description"/></td>
+
+                    <td class="center" style="vertical-align:middle">
+                        <s:if test="!#p.required || !customTheme">
+                            <s:url var="removeUrl" action="templateRemove">
+                                <s:param name="weblog" value="actionWeblog.handle"/>
+                                <s:param name="removeId" value="#p.id"/>
+                            </s:url>
+                            <a href="#" onclick=
+                                    "confirmTemplateDelete('<s:property value="#p.id"/>', '<s:property value="#p.name"/>' )">
+                                <span class="glyphicon glyphicon-trash"></span>
+                            </a>
+
+                        </s:if>
+                        <s:else>
+                            <span class="glyphicon glyphicon-lock"></span>
+                        </s:else>
+                    </td>
+
+                </tr>
+            </s:iterator>
+
         </s:if>
         <s:else>
-            <tr class="rollertable_even">
+            <tr class="rollertable_odd">
+                <td style="vertical-align:middle" colspan="5">
+                    <s:text name="pageForm.notemplates"/>
+                </td>
+            </tr>
         </s:else>
-
-            <td style="vertical-align:middle">
-                <s:if test="! #p.hidden">
-                    <img src='<s:url value="/images/page_white.png"/>' border="0" alt="icon" />
-                </s:if>
-                <s:else>
-                    <img src='<s:url value="/images/page_white_gear.png"/>' border="0" alt="icon" />
-                </s:else>
-                <s:url var="edit" action="templateEdit">
-                    <s:param name="weblog" value="actionWeblog.handle" />
-                    <s:param name="bean.id" value="#p.id" />
-                </s:url>
-                <s:a href="%{edit}"><s:property value="#p.name" /></s:a>
-            </td>
-            
-            <td style="vertical-align:middle"><s:property value="#p.action.readableName" /></td>
-
-            <td style="vertical-align:middle"><s:property value="#p.description" /></td>
-
-            <td class="center" style="vertical-align:middle">
-                 <s:if test="!#p.required || !customTheme" >
-                     <s:url var="removeUrl" action="templateRemove">
-                         <s:param name="weblog" value="actionWeblog.handle"/>
-                         <s:param name="removeId" value="#p.id"/>
-                     </s:url>
-                     <s:a href="%{removeUrl}"><img src='<s:url value="/images/delete.png"/>' /></s:a>
-                 </s:if>
-                 <s:else>
-                    <img src='<s:url value="/images/lock.png"/>' border="0" alt="icon" 
-                        title='<s:text name="pagesForm.required"/>' />
-                 </s:else>
-            </td>
-            <td class="center" style="vertical-align:middle">
-                <s:if test="!#p.required || !customTheme" >
-                    <input type="checkbox" name="idSelections" value="<s:property value="#p.id" />" />
-                </s:if>
-                 <s:else>
-                    <input type="checkbox" name="idSelections" value="<s:property value="#p.id" />" disabled="disabled"/>
-                 </s:else>
-            </td>
-        </tr>
-    </s:iterator>
-    
-</s:if>
-<s:else>
-    <tr class="rollertable_odd">
-        <td style="vertical-align:middle" colspan="5" >
-            <s:text name="pageForm.notemplates"/>
-        </td>
-    </tr>
-</s:else>
-</table>
-
-<br/>
-
-<s:if test="!templates.isEmpty">
-	<div class="control">
-		<s:submit value="%{getText('pagesForm.deleteselected')}" />
-	</div>
-</s:if>
+    </table>
 
 </s:form>
+
+
+<script>
+    function confirmTemplateDelete(templateId, templateName) {
+        $('#removeId').val(templateId);
+        if (window.confirm('<s:text name="pageRemove.confirm"/>: \'' + templateName + '\'?')) {
+            document.templateRemove.action = "<s:url action='templateRemove!remove' />";
+            document.templateRemove.submit();
+        }
+    }
+</script>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/TemplatesRemove.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/TemplatesRemove.jsp
deleted file mode 100644
index febeb95..0000000
--- a/app/src/main/webapp/WEB-INF/jsps/editor/TemplatesRemove.jsp
+++ /dev/null
@@ -1,54 +0,0 @@
-<%--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  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.  For additional information regarding
-  copyright in this work, please see the NOTICE file in the top level
-  directory of this distribution.
---%>
-<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-
-<p class="subtitle">
-	<s:text name="pageRemoves.subtitle" />
-</p>
-
-<p>
-	<s:text name="pageRemoves.youSure" />
-	<br/>
-	<br/>
-	<span class="warning">
-		<s:text name="pageRemoves.youSureWarning" />
-	</span>
-</p>
-
-<s:form action="templatesRemove">
-	<s:hidden name="salt" />
-	<s:hidden name="ids" />
-	<s:hidden name="weblog" value="%{actionWeblog.handle}" />
-	
-	<s:iterator var="p" value="templates" status="rowstatus">
-		<p>
-			<s:text name="pageRemove.pageId" /> = [<s:property value="#p.id" />]
-			<s:text name="pageRemove.pageName" /> = [<s:property value="#p.name" />]
-		</p>
-	</s:iterator>
-
-	<table>
-		<tr>
-			<td>
-				<s:submit value="%{getText('generic.yes')}" action="templatesRemove!remove" />&nbsp;
-				<s:submit value="%{getText('generic.no')}" action="templatesRemove!cancel" />
-			</td>
-		</tr>
-	</table>
-
-</s:form>
\ No newline at end of file
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/TemplatesSidebar.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/TemplatesSidebar.jsp
index 0b8b6df..38e3df0 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/TemplatesSidebar.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/TemplatesSidebar.jsp
@@ -17,43 +17,22 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<div class="sidebarFade">
-    <div class="menu-tr">
-        <div class="menu-tl">
-            
-            <div class="sidebarInner">
-                <h3><s:text name="pagesForm.addNewPage" /></h3>
-                <hr size="1" noshade="noshade" />
-                
-                <s:form action="templates!add">
-					<s:hidden name="salt" />
-					<s:hidden name="weblog" />
-                    
-                    <table cellpadding="0" cellspacing="6">
-                        <tr>
-                            <td><s:text name="generic.name"/></td>
-                            <td><s:textfield name="newTmplName" /></td>
-                        </tr>
-                        
-                        <s:if test="!availableActions.isEmpty" >
-                            <tr>
-                                <td><s:text name="pagesForm.action"/></td>
-                                <td>
-                                    <s:select name="newTmplAction" size="1" list="availableActions" />
-                                </td>
-                            </tr>
-                        </s:if>
-                        
-                        <tr>
-                            <td></td>
-                            <td><s:submit value="%{getText('pagesForm.add')}" /></td>
-                        </tr>
-                    </table>
-                    
-                </s:form>
-                <br />
-                
-            </div>
-        </div>
-    </div>
-</div>	
+<h3><s:text name="pagesForm.addNewPage"/></h3>
+<hr size="1" noshade="noshade"/>
+
+<s:form action="templates!add" theme="bootstrap" cssClass="form-horizontal">
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog"/>
+
+    <s:text name="generic.name"/>
+    <s:textfield name="newTmplName"/>
+
+    <s:if test="!availableActions.isEmpty">
+        <s:text name="pagesForm.action"/>
+        <s:select name="newTmplAction" list="availableActions"/>
+    </s:if>
+
+    <s:submit class="btn" value="%{getText('pagesForm.add')}"/>
+
+</s:form>
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/ThemeEdit.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/ThemeEdit.jsp
index 4fde4f7..dac1ec8 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/ThemeEdit.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/ThemeEdit.jsp
@@ -16,146 +16,303 @@
   directory of this distribution.
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-<script src="<s:url value='/roller-ui/scripts/jquery-2.1.1.min.js' />"></script>
-<script src="<s:url value='/webjars/angular/1.2.29/angular.min.js' />"></script>
-
-<script>
-function fullPreview(selector) {
-    selected = selector.selectedIndex;
-    window.open('<s:url value="/roller-ui/authoring/preview/%{actionWeblog.handle}"/>?theme=' + selector.options[selected].value);
-}
-function updateThemeChooser(selected) {
-    if (selected[0].value == 'shared') {
-        $('#sharedChooser').addClass("selectedChooser");
-        $('#customChooser').removeClass("selectedChooser");
-        $('#sharedOptioner').show();
-        $('#customOptioner').hide();
-    } else {
-        $('#customChooser').addClass("selectedChooser");
-        $('#sharedChooser').removeClass("selectedChooser");
-        $('#customOptioner').show();
-        $('#sharedOptioner').hide();
-    }
-}
-</script>
 
 <p class="subtitle">
-   <s:text name="themeEditor.subtitle" >
-       <s:param value="actionWeblog.handle" />
-   </s:text>
+    <s:text name="themeEditor.subtitle">
+        <s:param value="actionWeblog.handle"/>
+    </s:text>
 </p>
 
-<s:form action="themeEdit!save">
-	<s:hidden name="salt" />
-    <s:hidden name="weblog" />
+<s:form action="themeEdit!save" theme="bootstrap" cssClass="form-vertical">
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog"/>
 
-    <table width="100%" cellpadding="0" cellspacing="0">
-        <tr>
-            <td width="50%" valign="top">
-                <div id="sharedChooser" class="chooser">
-                    <h2><input id="sharedRadio" type="radio" name="themeType" value="shared"
-                               <s:if test="!customTheme">checked</s:if>
-                               onclick="updateThemeChooser($(this))" />&nbsp;
-                    <s:text name="themeEditor.sharedTheme" /></h2>
-                    <s:text name="themeEditor.sharedThemeDescription" />
-                </div>
-            </td>
-            <td width="50%" valign="top">
-                <div id="customChooser" class="chooser">
-                    <h2><input id="customRadio" type="radio" name="themeType" value="custom"
-                               <s:if test="customTheme">checked</s:if>
-                               onclick="updateThemeChooser($(this))" />&nbsp;
-                    <s:text name="themeEditor.customTheme" /></h2>
-                    <s:text name="themeEditor.customThemeDescription" />
-                </div>
-            </td>
-        </tr>
-    </table>
+    <%-- Two choices side-by-side: choose Shared or Custom Theme --%>
 
-    <div id="sharedOptioner" class="optioner" style="display:none;">
-        <p>
-            <s:if test="!customTheme">
-                <s:text name="themeEditor.yourCurrentTheme" />:
-                <b><s:property value="actionWeblog.theme.name"/></b>
-                <%-- The type of stylesheet we are using --%>
-                <s:if test="%{sharedThemeCustomStylesheet}">
-                    <s:text name="themeEditor.yourCustomStylesheet" />
-                </s:if>
-                <s:else>
-                    <s:text name="themeEditor.yourThemeStyleSheet" />
-                </s:else>
-            </s:if>
-            <s:else>
-                <s:text name="themeEditor.selectTheme" />:
-            </s:else>
-        </p>
+    <div class="row row-display-flex">
+
+        <div class="col-xs-6">
+            <div class="panel panel-default">
+                <div class="panel-body" id="sharedChooser">
+                    <h3>
+                        <input id="sharedRadio" type="radio" name="themeType" value="shared"
+                            <s:if test="!customTheme">checked</s:if> onclick="proposeThemeTypeChange($(this))"/>&nbsp;
+                        <s:text name="themeEditor.sharedTheme"/>
+                    </h3>
+                    <s:text name="themeEditor.sharedThemeDescription"/>
+                </div>
+            </div>
+        </div>
+
+        <div class="col-xs-6">
+            <div class="panel panel-default">
+                <div class="panel-body" id="customChooser">
+                    <h3>
+                        <input id="customRadio" type="radio" name="themeType" value="custom"
+                            <s:if test="customTheme">checked</s:if> onclick="proposeThemeTypeChange($(this))"/>&nbsp;
+                        <s:text name="themeEditor.customTheme"/>
+                    </h3>
+                    <s:text name="themeEditor.customThemeDescription"/>
+                </div>
+            </div>
+        </div>
+
     </div>
 
-    <div id="customOptioner" class="optioner" style="display:none;">
-        <%-- if already custom, an update must mean an import. --%>
-        <s:if test="customTheme">
+    <%-- ================================================= --%>
+
+    <div id="sharedNoChange" style="display:none;">
+
+        <%-- you have shared theme X --%>
+        <p class="lead">
+            <s:text name="themeEditor.yourCurrentTheme"/>
+            <b><s:property value="actionWeblog.theme.name"/></b>
+            <s:if test="%{sharedThemeCustomStylesheet}">
+                <s:text name="themeEditor.yourCustomStylesheet"/>
+            </s:if>
+            <s:else>
+                <s:text name="themeEditor.yourThemeStyleSheet"/>
+            </s:else>
+        </p>
+
+    </div>
+
+    <%-- ================================================= --%>
+
+    <div id="themeChooser" style="display:none;">
+
+        <%-- theme selector with preview image --%>
+        <p class="lead"><s:text name="themeEditor.selectTheme"/></p>
+        <p>
+            <s:select id="themeSelector" name="selectedThemeId" list="themes" style="width:20em"
+                listKey="id" listValue="name" size="1"
+                onchange="proposeSharedThemeChange(this[selectedIndex].value)"/>
+        </p>
+        <p><s:text name="themeEditor.thisTheme"/> <p id="themeDescription"></p>
+        <p><img id="themeThumbnail" src="" class="img-responsive img-thumbnail" style="max-width: 30em" /></p>
+
+    </div>
+
+    <%-- ================================================= --%>
+
+    <div id="sharedChangeToShared" style="display:none;">
+
+        <div class="alert-warning" style="margin-top:3em; margin-bottom:2em; padding: 1em">
+            <s:text name="themeEditor.proposedSharedThemeChange"/>
+        </div>
+
+        <%-- Preview and Update buttons --%>
+        <p> <s:text name="themeEditor.previewDescription"/> </p>
+        <input type="button" name="themePreview" class="btn"
+            value="<s:text name='themeEditor.preview' />"
+            onclick="fullPreview($('#themeSelector').get(0))"/>
+
+        <s:submit cssClass="btn btn-default" value="%{getText('themeEditor.save')}"/>
+
+        <input type="button" class="btn" onclick="cancelChanges()" value="<s:text name='generic.cancel'/>" />
+
+    </div>
+
+    <%-- ================================================= --%>
+
+    <div id="sharedChangeToCustom" style="display:none;">
+
+        <div class="alert-warning" style="margin-top:3em; margin-bottom:2em; padding: 1em">
+            <s:text name="themeEditor.proposedSharedChangeToCustom"/>
+        </div>
+
+        <s:if test="firstCustomization">
             <p>
-                <span class="warning"><s:text name="themeEditor.importWarning" /></span>
-                <s:hidden name="importTheme" value="true" />
+                <s:text name="themeEditor.importRequired"/>
+                <s:hidden name="importTheme" value="true"/>
             </p>
         </s:if>
-        <%-- shared, may be required to do an import if no custom templates present --%>
         <s:else>
-            <s:if test="firstCustomization">
-                <p>
-                    <s:text name="themeEditor.importRequired" />
-                    <s:hidden name="importTheme" value="true" />
-                </p>
-            </s:if>
-            <s:else>
-                <%-- User has option not just to switch from shared to custom but also override present custom templates --%>
-                <s:checkbox name="importTheme"/> <s:text name="themeEditor.importAndOverwriteTemplates" />
-                    <tags:help key="themeEditor.importAndOverwriteTemplates.tooltip"/>
-            </s:else>
+            <p><s:text name="themeEditor.existingTemplatesWarning"/></p>
+            <s:checkbox name="importTheme" label="%{getText('themeEditor.importAndOverwriteTemplates')}"/>
         </s:else>
+
+        <%-- Update button --%>
+        <s:submit cssClass="btn btn-default" value="%{getText('themeEditor.save')}"/>
+
+        <input type="button" class="btn" onclick="cancelChanges()" value="<s:text name='generic.cancel'/>" />
+
     </div>
 
-    <div id="themeOptioner" class="optioner" ng-app="themeSelectModule" ng-controller="themeController">
-        <p>
-            <select id="themeSelector" name="selectedThemeId" size="1"
-            ng-model="selectedTheme" ng-options="theme as theme.name for theme in themes track by theme.id"></select>
-        </p>
+    <%-- ================================================= --%>
 
-        <p>{{ selectedTheme.description }}</p>
-        <p>
-            <img ng-src="<s:property value='siteURL'/>{{ selectedTheme.previewPath }}"/>
-        </p>
-        <p>
-            <s:text name="themeEditor.previewDescription" />
-        </p>
+    <div id="customNoChange" style="display:none;">
+        <p class="lead"><s:text name="themeEditor.youAreUsingACustomTheme"/></p>
     </div>
 
-    <div class="control">
-        <span style="padding-left:7px">
-            <input type="button" name="themePreview"
-                            value="<s:text name='themeEditor.preview' />"
-                            onclick="fullPreview($('#themeSelector').get(0))" />
+    <%-- ================================================= --%>
 
-            <s:submit value="%{getText('themeEditor.save')}" />
-        </span>
+    <div id="customChangeToShared" style="display:none;">
+
+        <div class="alert-warning" style="margin-top:3em; margin-bottom:2em; padding: 1em">
+            <s:text name="themeEditor.proposedChangeToShared"/>
+        </div>
+
+        <%-- Preview and Update buttons --%>
+        <p> <s:text name="themeEditor.previewDescription"/> </p>
+        <input type="button" name="themePreview" class="btn"
+            value="<s:text name='themeEditor.preview' />"
+            onclick="fullPreview($('#themeSelector').get(0))"/>
+
+        <s:submit cssClass="btn btn-default" value="%{getText('themeEditor.save')}"/>
+
+        <input type="button" class="btn" onclick="cancelChanges()" value="<s:text name='generic.cancel'/>" />
+
     </div>
 
 </s:form>
 
-<%-- initializes the chooser/optioner/themeImport display at page load time --%>
-<script>
-    angular.module('themeSelectModule', [])
-        .controller('themeController', ['$scope', function($scope) {
-            $.ajax({ url: "<s:url value='themedata'/>", async:false,
-                success: function(data) { $scope.themes = data; }
-            });
-            <s:if test="customTheme">
-                updateThemeChooser($('#customRadio'));
-                $scope.selectedTheme = $scope.themes[0];
-            </s:if>
-            <s:else>
-                updateThemeChooser($('#sharedRadio'));
-                $scope.selectedTheme = $.grep($scope.themes, function(e){ return e.id == "<s:property value='themeId'/>"; })[0];
-            </s:else>
-    }]);
+<script type="text/javascript">
+
+    var proposedChangeType = ""
+    var proposedThemeId = ""
+    var originalThemeId = "<s:property value="themeId"/>"
+    var originalType = ""
+
+    $.when( $.ready ).then(function() {
+
+        <s:if test="customTheme">
+        originalType = "custom"
+        updateView($('#customRadio'));
+        previewImage('<s:property value="themes[0].id"/>');
+        </s:if>
+
+        <s:else>
+        originalType = "shared"
+        updateView($('#sharedRadio'));
+        previewImage('<s:property value="themeId"/>');
+        </s:else>
+    });
+
+    function proposeThemeTypeChange(selected) {
+
+        if (selected[0].value === 'shared') {
+            proposedChangeType = "shared"
+
+            themeSelector = $('#themeSelector')[0]
+            index = themeSelector.selectedIndex;
+            previewImage(themeSelector.options[index].value)
+
+        } else {
+            proposedThemeId = originalThemeId
+            proposedChangeType = "custom"
+        }
+        updateView(selected)
+    }
+
+    function proposeSharedThemeChange(themeId) {
+        proposedThemeId = themeId;
+        previewImage(themeId)
+        updateView($('#sharedRadio'))
+    }
+
+    function cancelChanges() {
+
+        proposedThemeId = originalThemeId;
+        proposedChangeType = originalType;
+
+        hideAll();
+
+        if ( originalType === "custom" ) {
+            $("#sharedRadio").prop("checked", false);
+            $("#customRadio").prop("checked", true);
+            updateView($("#customRadio"));
+
+        } else {
+            $("#sharedRadio").prop("checked", true);
+            $("#customRadio").prop("checked", false);
+            updateView($("#sharedRadio"));
+            $("#themeSelector").val(originalThemeId).change();
+            previewImage(originalThemeId)
+        }
+
+    }
+
+    function hideAll() {
+        $('#themeChooser').hide();
+        $('#customNoChange').hide();
+        $('#customChangeToShared').hide();
+        $('#sharedChangeToShared').hide();
+        $('#sharedNoChange').hide();
+        $('#sharedChangeToCustom').hide();
+    }
+
+    function previewImage(themeId) {
+        $.ajax({
+            url: "<s:url value='themedata'/>",
+            data: {theme: themeId}, success: function (data) {
+                $('#themeDescription').html(data.description);
+                thumbnail = $('#themeThumbnail');
+                thumbnail.attr('src', '<s:property value="siteURL" />' + data.previewPath);
+            }
+        });
+    }
+
+    function fullPreview(selector) {
+        selected = selector.selectedIndex;
+        window.open('<s:url value="/roller-ui/authoring/preview/%{actionWeblog.handle}"/>?theme='
+            + selector.options[selected].value);
+    }
+
+    function updateView(selected) {
+
+        changed =
+               (proposedThemeId    !== "" && proposedThemeId    !== originalThemeId)
+            || (proposedChangeType !== "" && proposedChangeType !== originalType )
+
+        if (selected[0].value === 'shared') {
+
+            $('#sharedChooser').css("background", "#bfb")
+            $('#customChooser').css("background", "white")
+
+            $('#themeChooser').show();
+
+            $('#customNoChange').hide();
+            $('#customChangeToShared').hide();
+
+            if ( !changed ) {
+                $('#sharedNoChange').show();
+                $('#sharedChangeToShared').hide();
+                $('#sharedChangeToCustom').hide();
+
+            } else {
+
+                if ( originalType === "shared" ) {
+                    $('#sharedChangeToShared').show();
+                    $('#sharedChangeToCustom').hide();
+                }  else {
+                    $('#customChangeToShared').show();
+                    $('#sharedChangeToShared').hide();
+                    $('#sharedChangeToCustom').hide();
+                }
+            }
+
+        } else {
+
+            $('#sharedChooser').css("background", "white")
+            $('#customChooser').css("background", "#bfb")
+
+            $('#themeChooser').hide();
+
+            $('#sharedNoChange').hide();
+            $('#sharedChangeToShared').hide();
+            $('#sharedChangeToCustom').hide();
+
+            $('#customChangeToShared').hide();
+
+            if ( !changed ) {
+                $('#customNoChange').show();
+            } else {
+                $('#sharedChangeToCustom').show();
+                $('#customNoChange').hide();
+            }
+
+        }
+    }
+
 </script>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/WeblogConfig.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/WeblogConfig.jsp
index ff0187d..14a2a9a 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/WeblogConfig.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/WeblogConfig.jsp
@@ -18,263 +18,145 @@
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
 <p class="subtitle">
-   <s:text name="websiteSettings.subtitle" >
-       <s:param value="actionWeblog.handle" />
-   </s:text>
-</p>  
-   
-<s:form action="weblogConfig!save">
-	<s:hidden name="salt" />
-    <s:hidden name="weblog" value="%{actionWeblog.handle}" />
+    <s:text name="websiteSettings.subtitle">
+        <s:param value="actionWeblog.handle"/>
+    </s:text>
+</p>
 
-<table class="formtableNoDesc">
+<s:form action="weblogConfig!save" theme="bootstrap" cssClass="form-horizontal">
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog" value="%{actionWeblog.handle}"/>
 
     <%-- ***** General settings ***** --%>
-    
-    <tr>
-        <td colspan="3"><h2><s:text name="websiteSettings.generalSettings" /></h2></td>
-    </tr>
-    
-    <tr>
-        <td class="label"><s:text name="websiteSettings.websiteTitle" />
-        <td class="field"><s:textfield name="bean.name" size="40"/></td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
 
-    <tr>
-        <td class="label"><s:text name="generic.tagline" /></td>
-        <td class="field"><s:textfield name="bean.tagline" size="40" maxlength="255"/></td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
-    
-    <tr>
-        <td class="label"><s:text name="websiteSettings.icon" /></td>
-        <td class="field"><s:textfield name="bean.icon" size="40"/></td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
-    
-    <tr>
-        <td class="label"><s:text name="websiteSettings.about" /></td>
-        <td class="field"><s:textarea name="bean.about" rows="3" cols="40"/></td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
-    
-    <tr>
-        <td class="label"><s:text name="websiteSettings.emailAddress" />
-        <td class="field"><s:textfield name="bean.emailAddress" size="40"/></td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
-    
-    <tr>
-        <td class="label"><s:text name="websiteSettings.editor" /></td>
-        <td class="field">
-            <s:select name="bean.editorPage" size="1" list="editorsList" listKey="id" listValue="getText(name)" />
-       </td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
-    
-    <tr>
-        <td class="label"><s:text name="websiteSettings.active" /></td>
-        <td class="field"><s:checkbox name="bean.active" /></td>
-        <td class="description"></td>
-    </tr>
-    
-    <tr>
-        <td class="label"><s:text name="websiteSettings.entryDisplayCount" /></td>
-        <td class="field"><s:textfield name="bean.entryDisplayCount" size="4"/></td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
+    <h3><s:text name="websiteSettings.generalSettings"/></h3>
 
-    
+    <s:textfield label="%{getText('websiteSettings.websiteTitle')}"
+                 name="bean.name" size="30" maxlength="40"/>
+
+    <s:textfield label="%{getText('generic.tagline')}"
+                 name="bean.tagline" size="30" maxlength="255"/>
+
+    <s:textfield label="%{getText('websiteSettings.icon')}"
+                 name="bean.icon" size="30" maxlength="40"/>
+
+    <s:textarea label="%{getText('websiteSettings.about')}"
+                name="bean.about" rows="3" cols="40 "/>
+
+    <s:textfield label="%{getText('websiteSettings.emailAddress')}"
+                 name="bean.emailAddress" size="30" maxlength="40"/>
+
+    <s:select name="bean.editorPage" label="%{getText('websiteSettings.editor')}"
+              list="editorsList" listKey="id" listValue="getText(name)"/>
+
+    <s:textfield type="number" label="%{getText('websiteSettings.entryDisplayCount')}"
+                 name="bean.entryDisplayCount" size="4"/>
+
+    <s:checkbox label="%{getText('websiteSettings.active')}"
+                name="bean.active" size="30" maxlength="40"/>
+
     <%-- ***** Language/i18n settings ***** --%>
-    
-    
-    <tr>
-        <td colspan="3"><h2><s:text name="websiteSettings.languageSettings" /></h2></td>
-    </tr>
-    
-    <tr>
-        <td class="label"><s:text name="websiteSettings.enableMultiLang" /></td>
-        <td class="field"><s:checkbox name="bean.enableMultiLang" /></td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
-    
-    <tr>
-        <td class="label"><s:text name="websiteSettings.showAllLangs" /></td>
-        <td class="field"><s:checkbox name="bean.showAllLangs" /></td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
-    
-    <tr>
-        <td class="label"><s:text name="createWebsite.locale" />
-        <td class="field">
-            <s:select name="bean.locale" size="1" list="localesList" listValue="displayName" />
-        </td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
-    
-    <tr>
-        <td class="label"><s:text name="createWebsite.timeZone" />
-        <td class="field">
-            <s:select name="bean.timeZone" size="1" list="timeZonesList" />
-        </td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
-    
-    
-    <%-- ***** Comment settings ***** --%>
-    
-    
-    <tr>
-        <td colspan="3"><h2><s:text name="websiteSettings.commentSettings" /></h2></td>
-    </tr>
 
-    <tr>
-        <td class="label"><s:text name="websiteSettings.allowComments" /></td>
-        <td class="field"><s:checkbox name="bean.allowComments" /></td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
-    
-    <s:if test="!getBooleanProp('users.moderation.required')">
-    <tr>
-        <td class="label"><s:text name="websiteSettings.moderateComments" /></td>
-        <td class="field"><s:checkbox name="bean.moderateComments" /></td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
-    </s:if>
-    
+    <h3><s:text name="websiteSettings.languageSettings"/></h3>
+
+    <s:select name="bean.locale" list="localesList" listValue="displayName"
+              label="%{getText('createWebsite.locale')}"/>
+
+    <s:select name="bean.timeZone" list="timeZonesList"
+              label="%{getText('createWebsite.timeZone')}"/>
+
+    <s:checkbox name="bean.enableMultiLang"
+                label="%{getText('websiteSettings.enableMultiLang')}"/>
+
+    <s:checkbox name="bean.showAllLangs"
+                label="%{getText('websiteSettings.showAllLangs')}"/>
+
+    <%-- ***** Comment settings ***** --%>
+
+    <h3><s:text name="websiteSettings.commentSettings"/></h3>
+
+    <s:checkbox name="bean.allowComments"
+                label="%{getText('websiteSettings.allowComments')}"/>
+
     <s:if test="getBooleanProp('users.comments.emailnotify')">
-        <tr>
-            <td class="label"><s:text name="websiteSettings.emailComments" /></td>
-            <td class="field"><s:checkbox name="bean.emailComments"/></td>
-            <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-        </tr>
+        <s:checkbox name="bean.emailComments"
+                    label="%{getText('websiteSettings.emailComments')}"/>
+    </s:if>
+
+    <s:if test="!getBooleanProp('users.moderation.required')">
+        <s:checkbox name="bean.moderateComments"
+                    label="%{getText('websiteSettings.moderateComments')}"/>
     </s:if>
 
     <%-- ***** Default entry comment settings ***** --%>
 
-    <tr>
-        <td colspan="3"><h2><s:text name="websiteSettings.defaultCommentSettings" /></h2></td>
-    </tr>
-    
-    <tr>
-        <td class="label"><s:text name="websiteSettings.defaultAllowComments" /></td>
-        <td class="field"><s:checkbox name="bean.defaultAllowComments" /></td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
-    
-     <tr>
-        <td class="label"><s:text name="websiteSettings.defaultCommentDays" /></td>
-        <td class="field">
-            <s:select name="bean.defaultCommentDays" list="commentDaysList" size="1" listKey="key" listValue="value" />
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
-    
-    <tr>
-        <td class="label"><s:text name="websiteSettings.applyCommentDefaults" /></td>
-        <td class="field"><s:checkbox name="bean.applyCommentDefaults" /></td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
+    <h3><s:text name="websiteSettings.defaultCommentSettings"/></h3>
+
+    <s:select name="bean.defaultCommentDays" label="%{getText('websiteSettings.applyCommentDefaults')}"
+              list="commentDaysList" listKey="key" listValue="value"/>
+
+    <s:checkbox name="bean.defaultAllowComments"
+                label="%{getText('websiteSettings.defaultAllowComments')}"/>
+
+    <s:checkbox name="bean.applyCommentDefaults"
+                label="%{getText('websiteSettings.applyCommentDefaults')}"/>
 
     <%-- ***** Blogger API setting settings ***** --%>
-    
-    <tr>
-        <td colspan="3"><h2><s:text name="websiteSettings.bloggerApi" /></h2></td>
-    </tr>
 
-    <tr>
-        <td class="label"><s:text name="websiteSettings.enableBloggerApi" /></td>
-        <td class="field"><s:checkbox name="bean.enableBloggerApi" /></td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
+    <h3><s:text name="websiteSettings.bloggerApi"/></h3>
 
-    <tr>
-        <td class="label"><s:text name="websiteSettings.bloggerApiCategory" /></td>
-        <td class="field">
-            <s:select name="bean.bloggerCategoryId" list="weblogCategories" size="1" listKey="id" listValue="name" />
-        </td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
+    <s:select name="bean.bloggerCategoryId" label="%{getText('websiteSettings.bloggerApiCategory')}"
+              list="weblogCategories" listKey="id" listValue="name"/>
+
+    <s:checkbox name="bean.enableBloggerApi"
+                label="%{getText('websiteSettings.enableBloggerApi')}"/>
 
     <%-- ***** Plugins "formatting" settings ***** --%>
 
-    <tr>
-        <td colspan="3"><h2><s:text name="websiteSettings.formatting" /></h2></td>
-    </tr>
+    <h3><s:text name="websiteSettings.formatting"/></h3>
 
     <s:if test="!pluginsList.isEmpty">
-        <tr>
-            <td class="label"><s:text name="websiteSettings.label1" /> <br /><s:text name="websiteSettings.label2" /></td>
-            <td class="field">
-                <s:checkboxlist theme="roller" list="pluginsList" name="bean.defaultPluginsArray" listKey="name" listValue="name" />
-            
-            </td>
-            <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-        </tr>
+
+        <s:checkboxlist list="pluginsList" label="%{getText('websiteSettings.label1')}"
+                        name="bean.defaultPluginsArray" listKey="name" listValue="name"/>
+
     </s:if>
     <s:else>
-        <s:hidden name="defaultPlugins" />
+        <s:hidden name="defaultPlugins"/>
     </s:else>
 
-
     <%-- ***** Spam prevention settings ***** --%>
-    
-    <tr>
-        <td colspan="3"><h2><s:text name="websiteSettings.spamPrevention" /></h2></td>
-    </tr>
 
-    <tr>
-        <td class="label"><s:text name="websiteSettings.ignoreUrls" /></td>
-        <td class="field"><s:textarea name="bean.blacklist" rows="7" cols="40"/></td>
-        <td class="description"><%-- <s:text name="websiteSettings.tip." /> --%></td>
-    </tr>
+    <h3><s:text name="websiteSettings.spamPrevention"/></h3>
 
+    <s:textarea name="bean.blacklist" rows="7" cols="40"
+                label="%{getText('websiteSettings.analyticsTrackingCode')}"/>
 
     <%-- ***** Web analytics settings ***** --%>
 
     <s:if test="getBooleanProp('analytics.code.override.allowed')">
-        <tr>
-            <td colspan="3"><h2><s:text name="configForm.webAnalytics" /></h2></td>
-        </tr>
+        <h3><s:text name="configForm.webAnalytics"/></h3>
 
-        <tr>
-            <td class="label"><s:text name="websiteSettings.analyticsTrackingCode" /></td>
-            <td class="field"><s:textarea name="bean.analyticsCode" rows="10" cols="70"/></td>
-        </tr>
+        <s:textarea name="bean.analyticsCode" rows="10" cols="70"
+                    label="%{getText('websiteSettings.analyticsTrackingCode')}"/>
     </s:if>
 
-</table>
-
-<br />
-<div class="control">
-    <s:submit value="%{getText('websiteSettings.button.update')}" />
-</div>
-        
-<br />
-<br />
+    <div class="control" style="margin-bottom:5em">
+        <s:submit cssClass="btn btn-success" value="%{getText('websiteSettings.button.update')}"/>
+    </div>
 
 </s:form>
 
 
-<s:form action="weblogRemove">
-	<s:hidden name="salt" />
-    <s:hidden name="weblog" value="%{actionWeblog.handle}" />
-    
-    <h2><s:text name="websiteSettings.removeWebsiteHeading" /></h2>
-    
-    <p>
-        <s:text name="websiteSettings.removeWebsite" /><br/><br/>
-        <span class="warning">
-            <s:text name="websiteSettings.removeWebsiteWarning" />
-        </span>
-    </p>
-    
-    <br />
-    
-    <s:submit value="%{getText('websiteSettings.button.remove')}" />
-    
-    <br />
-    <br />    
-    <br />
-    
+<s:form action="weblogRemove" cssClass="form-horizontal">
+    <s:hidden name="salt"/>
+    <s:hidden name="weblog" value="%{actionWeblog.handle}"/>
+
+    <h3><s:text name="websiteSettings.removeWebsiteHeading"/></h3>
+    <s:text name="websiteSettings.removeWebsite"/><br/><br/>
+    <div class="alert alert-danger" role="alert">
+        <s:text name="websiteSettings.removeWebsiteWarning"/>
+    </div>
+    <s:submit cssClass="btn btn-danger" value="%{getText('websiteSettings.button.remove')}"/>
+
 </s:form>
diff --git a/app/src/main/webapp/WEB-INF/jsps/editor/WeblogRemoveConfirm.jsp b/app/src/main/webapp/WEB-INF/jsps/editor/WeblogRemoveConfirm.jsp
index f197aa0..db4be40 100644
--- a/app/src/main/webapp/WEB-INF/jsps/editor/WeblogRemoveConfirm.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/editor/WeblogRemoveConfirm.jsp
@@ -21,7 +21,7 @@
     <s:text name="websiteRemove.subtitle" />
 </p>
 
-<p>
+<p style="margin-bottom: 3em">
     <s:text name="websiteRemove.youSure"> 
         <s:param value="actionWeblog.name" />
     </s:text>
@@ -32,27 +32,30 @@
     </span>
 </p>
 
-<p>
-    <s:text name="websiteRemove.websiteId" /> = [<s:property value="actionWeblog.id" />]
-    <br />
-    <s:text name="websiteRemove.websiteName" /> = [<s:property value="actionWeblog.name" />]
-</p>
+<div class="row">
+    <div class="col-md-2">
 
-<table>
-    <tr>
-        <td>
-            <s:form action="weblogRemove!remove">
-				<s:hidden name="salt" />
-                <s:hidden name="weblog" value="%{actionWeblog.handle}" />
-                <s:submit value="%{getText('generic.yes')}" />
-            </s:form>
-        </td>
-        <td>
-            <s:form action="weblogConfig" method="post">
-				<s:hidden name="salt" />
-                <s:hidden name="weblog" value="%{actionWeblog.handle}" />
-                <s:submit value="%{getText('generic.no')}" />
-            </s:form>
-        </td>
-    </tr>
-</table>
+        <s:form action="weblogRemove!remove" theme="bootstrap" cssClass="form-horizontal">
+            <s:hidden name="salt" />
+            <s:hidden name="weblog" value="%{actionWeblog.handle}" />
+            <s:submit cssClass="btn btn-danger" value="%{getText('generic.yesRemove')}" />
+        </s:form>
+
+    </div>
+    <div class="col-md-2">
+
+        <s:form action="weblogConfig" method="post" theme="bootstrap" cssClass="form-horizontal">
+            <s:hidden name="salt" />
+            <s:hidden name="weblog" value="%{actionWeblog.handle}" />
+            <s:submit cssClass="btn btn-success" value="%{getText('generic.cancel')}" />
+        </s:form>
+
+    </div>
+    <div class="col-md-8"></div>
+</div>
+
+
+
+
+
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp b/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp
index 2520111..97d4637 100644
--- a/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/taglibs-struts2.jsp
@@ -15,14 +15,20 @@
   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" %>
+
+<%@ page 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" %>
+
+
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/bannerInstallation.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/bannerInstallation.jsp
index 2ccf92a..8773ea5 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/bannerInstallation.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/bannerInstallation.jsp
@@ -17,18 +17,28 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<div class="bannerStatusBox">
-    
-    <table class="bannerStatusBox" cellpadding="0" cellspacing="0">
-        <tr>
-            <td class="bannerLeft">
-                <s:text name="installer.bannerTitleLeft" />   
-            </td>
-            
-            <td class="bannerRight">
-                <s:text name="installer.bannerTitleRight" />                                   
-            </td>
-        </tr>
-    </table>
-    
-</div>
+<nav class="navbar navbar-default navbar-static-top navbar-inverse">
+    <div class="container-fluid">
+        <div id="navbar" class="navbar-collapse collapse">
+
+            <div class="navbar-header">
+                <button type="button" class="navbar-toggle collapsed"
+                        data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
+                    <span class="sr-only">Toggle navigation</span>
+                    <span class="icon-bar"></span>
+                    <span class="icon-bar"></span>
+                    <span class="icon-bar"></span>
+                </button>
+                <a class="navbar-brand" href="#"><s:text name="installer.bannerTitleLeft" /></a>
+            </div>
+
+            <ul class="nav navbar-nav">
+            </ul>
+
+            <ul class="nav navbar-nav navbar-right">
+                <li><a href="<s:url value='/'/>"><s:text name="installer.bannerTitleRight" /></a></li>
+            </ul>
+
+        </div>
+    </div>
+</nav>
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/bannerStatus.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/bannerStatus.jsp
index 03ea6f9..9c2b78e 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/bannerStatus.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/bannerStatus.jsp
@@ -17,50 +17,119 @@
 --%>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<div class="bannerStatusBox">
-    
-    <table class="bannerStatusBox" cellpadding="0" cellspacing="0">
-        <tr>
-            <td class="bannerLeft">
-                
-                <s:if test="authenticatedUser != null">
-                    <s:text name="mainPage.loggedInAs" />
-                    <a href="<s:url action="menu" namespace="/roller-ui" />"><s:property value="authenticatedUser.userName"/></a>
-                </s:if>
-                
-                
+<nav class="navbar navbar-default navbar-static-top navbar-inverse">
+    <div class="container-fluid">
+        <div id="navbar" class="navbar-collapse collapse">
+
+            <div class="navbar-header">
+                <button type="button" class="navbar-toggle collapsed" 
+                        data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
+                    <span class="sr-only">Toggle navigation</span>
+                    <span class="icon-bar"></span>
+                    <span class="icon-bar"></span>
+                    <span class="icon-bar"></span>
+                </button>
+                <a class="navbar-brand" href="#"><s:property value="%{getProp('site.name')}" /></a>
+            </div>
+            
+            <ul class="nav navbar-nav">
+
                 <s:if test="actionWeblog != null">
-                    - <s:text name="mainPage.currentWebsite" />
-                    <b><a href='<s:property value="actionWeblog.absoluteURL" />'>
-                            <s:property value="actionWeblog.handle" />
-                    </a></b>
+                    
+                    <s:set var="tabMenu" value="menu"/>
+                    <s:if test="#tabMenu != null">
+
+                        <s:iterator var="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 var="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>
+
+                    </s:if>
                     
                 </s:if>
-                
-            </td>
+
+                <s:if test="actionWeblog == null">
+
+                    <s:set var="tabMenu" value="menu"/>
+                    <s:if test="#tabMenu != null">
+
+                        <s:iterator var="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 var="tabItem" value="#tab.items" status="stat">
+                                        <li>
+                                            <a href="<s:url action='%{#tabItem.action}' />">
+                                                <s:text name="%{#tabItem.key}"/>
+                                            </a>
+                                        </li>
+                                    </s:iterator>
+                                </ul>
+                            </li>
+                        </s:iterator>
+
+                    </s:if>
+
+                </s:if>
+
+            </ul>
             
-            <td class="bannerRight">
+            <ul class="nav navbar-nav navbar-right">
                 
-                <a href="<s:url value='/'/>"><s:property value="getProp('site.shortName')"/></a>
-                
-                | <a href="<s:url action='menu' namespace='/roller-ui' />"><s:text name="mainPage.mainMenu" /></a>
-                
+                <li><a href="<s:url value='/'/>"><s:property value="getProp('site.shortName')"/></a></li>
+
+                <li>
+                    <a href="<s:url action='menu' namespace='/roller-ui' />">
+                        <s:text name="mainPage.mainMenu" /></a>
+                </li>
+
                 <s:if test="authenticatedUser != null">
-                    | <a href="<s:url action='logout' namespace='/roller-ui' />"><s:text name="navigationBar.logout"/></a>
+                    <li>
+                        <a href="<s:url action='logout' namespace='/roller-ui' />">
+                            <s:text name="navigationBar.logout"/></a>
+                    </li>
                 </s:if>
                 <s:else>
-                    | <a href="<s:url action='login-redirect' namespace='/roller-ui' />"><s:text name="navigationBar.login"/></a>
-                    
+                    <li>
+                        <a href="<s:url action='login-redirect' namespace='/roller-ui' />">
+                            <s:text name="navigationBar.login"/></a>
+                    </li>
+
                     <s:if test="getBooleanProp('users.registration.enabled') && getProp('authentication.method') != 'ldap'">
-                        | <a href="<s:url action='register' namespace='/roller-ui' />"><s:text name="navigationBar.register"/></a>
+                        <li>
+                            <a href="<s:url action='register' namespace='/roller-ui' />">
+                                <s:text name="navigationBar.register"/></a>
+                        </li>
                     </s:if>
+                    
                     <s:elseif test="getProp('users.registration.url') != null && getProp('users.registration.url') > 0">
-                        | <a href="<s:property value="getProp('users.registration.url')"/>"><s:text name="navigationBar.register"/></a>
+                        <li>
+                            <a href="<s:property value="getProp('users.registration.url')"/>">
+                                <s:text name="navigationBar.register"/></a>
+                        </li>
                     </s:elseif>
                 </s:else>
                 
-            </td>
-        </tr>
-    </table>
-    
-</div>
+            </ul>
+        </div><!--/.nav-collapse -->
+    </div>
+</nav>
+
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/head-ajax.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/head-ajax.jsp
deleted file mode 100644
index f890ec9..0000000
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/head-ajax.jsp
+++ /dev/null
@@ -1,20 +0,0 @@
-<%-- 
-This default stuff goes in the HTML head element of each page
-You can override it with your own file via WEB-INF/tiles-def.xml
---%>
-<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
-
-<link rel="stylesheet" media="all" href="<s:url value='/roller-ui/yui3/cssreset/cssreset-min.css'/>" />
-<link rel="stylesheet" media="all" href="<s:url value='/roller-ui/yui3/cssfonts/cssfonts-min.css'/>" />
-<link rel="stylesheet" media="all" href="<s:url value='/roller-ui/yui3/cssbase/cssbase-min.css'/>" />
-
-<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/styles/layout.css"/>' />
-<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/styles/roller.css"/>' />
-<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/styles/menu.css"/>' />
-
-<link rel="stylesheet" media="all" href="<s:url value="/roller-ui/theme/"/><s:property value="getProp('editor.theme')" />/colors.css" />
-
-<script src="<s:url value="/theme/scripts/roller.js"/>"></script>
-
-<%-- struts2 head disabled until we need it --%>
-<%-- <s:head theme="ajax"/> --%>
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/head.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/head.jsp
index 912cd4b..8d10e2d 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/head.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/head.jsp
@@ -2,16 +2,24 @@
 This default stuff goes in the HTML head element of each page
 You can override it with your own file via WEB-INF/tiles-def.xml
 --%>
+
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<link rel="stylesheet" media="all" href="<s:url value='/roller-ui/yui3/cssreset/cssreset-min.css'/>" />
-<link rel="stylesheet" media="all" href="<s:url value='/roller-ui/yui3/cssfonts/cssfonts-min.css'/>" />
-<link rel="stylesheet" media="all" href="<s:url value='/roller-ui/yui3/cssbase/cssbase-min.css'/>" />
+<script src="<s:url value='/webjars/jquery/3.3.1/jquery.min.js' />"></script>
 
-<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/styles/layout.css"/>' />
+<script src="<s:url value='/webjars/jquery-ui/1.12.1/jquery-ui.min.js' />"></script>
+<link href="<s:url value='/webjars/jquery-ui/1.12.1/jquery-ui.css' />" rel="stylesheet" />
+
+<link href="<s:url value='/webjars/bootstrap/3.3.7/css/bootstrap.min.css' />" rel="stylesheet" />
+<link href="<s:url value='/webjars/bootstrap/3.3.7/css/bootstrap-theme.min.css' />" rel="stylesheet" />
+<script src="<s:url value='/webjars/bootstrap/3.3.7/js/bootstrap.min.js' />"></script>
+
+<script src="<s:url value='/webjars/clipboard.js/2.0.0/clipboard.min.js' />"></script>
+
+<script src="<s:url value='/webjars/summernote/0.8.11/dist/summernote.min.js' />"></script>
+<link href="<s:url value='/webjars/summernote/0.8.11/dist/summernote.css' />" rel="stylesheet" />
+
 <link rel="stylesheet" media="all" href='<s:url value="/roller-ui/styles/roller.css"/>' />
-<link rel="stylesheet" media="all" href='<s:url value="/roller-ui/styles/menu.css"/>' />
-
-<link rel="stylesheet" media="all" href="<s:url value="/roller-ui/theme/"/><s:property value="getProp('editor.theme')"/>/colors.css" />
 
 <script src="<s:url value="/theme/scripts/roller.js"/>"></script>
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp
index d75f34f..8055b63 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/menu.jsp
@@ -20,41 +20,47 @@
 <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>
+    <%--
+    <nav class="navbar navbar-default">
+        <div class="container-fluid">
+            <div id="navbar" class="navbar-collapse collapse">
+                <ul class="nav navbar-nav">
 
-<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>
+                    <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>
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp
index f881191..bb8c58b 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/messages.jsp
@@ -19,23 +19,28 @@
 
 <%-- Success Messages --%>
 <s:if test="!actionMessages.isEmpty">
-    <div id="messages" class="messages">
+    <div id="messages" class="alert alert-success">
         <s:actionmessage />
     </div>
 </s:if>
 
 <%-- Error Messages --%>
 <s:if test="!actionErrors.isEmpty || !fieldErrors.isEmpty">
-    <div id="errors" class="errors">
+    <div id="errors" class="alert alert-danger">
         <ul>
+
             <s:iterator var="actionError" value="actionErrors">
                 <li><s:property value="#actionError" escapeHtml="false" /></li>
             </s:iterator>
+
             <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>
     </div>
 </s:if>
+
+<!-- ALERT_END: this comment needed for AJAX error handling -->
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-errorpage.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-errorpage.jsp
index 12ecdc6..0ce7edc 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-errorpage.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-errorpage.jsp
@@ -24,6 +24,9 @@
       <link rel="icon" href="<%= request.getContextPath() %>/favicon.ico" type="image/x-icon">
       <title><s:text name="error" /></title>
       <tiles:insertAttribute name="head" />
+      <style>
+          <tiles:insertAttribute name="styles" />
+      </style>
     </head>
     <body>
         
@@ -31,7 +34,7 @@
             <tiles:insertAttribute name="banner" />
         </div>
         
-        <div id="wrapper"> 
+        <div id="wrapper" class="container-fluid">
             <div id="leftcontent_wrap">
                 <div id="leftcontent"> 
                 </div>
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-installpage.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-installpage.jsp
index 879097e..059a985 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-installpage.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-installpage.jsp
@@ -18,41 +18,34 @@
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 <!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="pageTitle" /></title>
-      <tiles:insertAttribute name="head" />
-    </head>
-    <body>
-        
-        <div id="banner">
-            <tiles:insertAttribute name="banner" />
+<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="pageTitle"/></title>
+    <tiles:insertAttribute name="head"/>
+    <style>
+        <tiles:insertAttribute name="styles" />
+    </style>
+</head>
+<body>
+
+<tiles:insertAttribute name="banner"/>
+
+<div id="wrapper" class="container-fluid" style="margin-top:5em">
+
+    <div class="row">
+        <div class="col-md-1"></div>
+        <div class="col-md-10">
+            <tiles:insertAttribute name="messages"/>
+            <tiles:insertAttribute name="content"/>
         </div>
-        
-        <div id="wrapper"> 
-            <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>
-            </div>
-            
-            <div id="rightcontent_wrap">
-                <div id="rightcontent"> 
-                </div>
-            </div>
-        </div>
-        
-        <div id="footer">
-            <tiles:insertAttribute name="footer" />
-        </div>
-        
-    </body>
+        <div class="col-md-1"></div>
+    </div>
+
+    <div id="footer">
+        <tiles:insertAttribute name="footer"/>
+    </div>
+
+</body>
 </html>
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-loginpage.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-loginpage.jsp
new file mode 100644
index 0000000..94cb7c7
--- /dev/null
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-loginpage.jsp
@@ -0,0 +1,52 @@
+<%--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  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.  For additional information regarding
+  copyright in this work, please see the NOTICE file in the top level
+  directory of this distribution.
+--%>
+<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
+<!doctype html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <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="banner"/>
+
+<div class="container-fluid">
+
+    <div class="row">
+        <div class="col-md-4"></div>
+
+        <div class="col-md-4">
+            <h1 class="roller-page-title"><s:property value="pageTitle"/></h1>
+            <tiles:insertAttribute name="messages"/>
+            <tiles:insertAttribute name="content"/>
+        </div>
+
+        <div class="col-md-4"></div>
+    </div>
+</div>
+
+</body>
+</html>
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-mainmenupage.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-mainmenupage.jsp
index 3613fc3..6750d79 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-mainmenupage.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-mainmenupage.jsp
@@ -18,47 +18,68 @@
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 <!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>
-        
-        <div id="banner">
-            <tiles:insertAttribute name="bannerStatus" />
-        </div>
-        
-        <div id="content">
-            <div id="leftcontent_wrap">
-                <div id="leftcontent"> 
+    <tiles:insertAttribute name="head"/>
+    <style>
+        <tiles:insertAttribute name="styles" />
+    </style>
+</head>
+<body>
+
+<tiles:insertAttribute name="banner"/>
+
+<div class="container-fluid">
+
+    <div class="row">
+
+        <div class="col-md-3 roller-column-left">
+
+            <div class="panel panel-default">
+                <div class="panel-body" style="text-align: center">
+
+                    <img src='<s:url value="/roller-ui/images/feather.svg" />'
+                         alt="ASF feat" height="100" align="center"/>
+                    <h4><s:text name="generic.poweredBy" /></h4>
+
                 </div>
             </div>
-            
-            <div id="centercontent_wrap">
-                <div id="centercontent">   
-                    <h1><s:property value="pageTitle" /></h1>
-                    <tiles:insertAttribute name="messages" /> 
-                    <tiles:insertAttribute name="content" />    
+
+            <div class="panel panel-default">
+                <div class="panel-body">
+
+                    <tiles:insertAttribute name="sidebar"/>
+
                 </div>
             </div>
-            
-            <div id="rightcontent_wrap">
-                <div id="rightcontent"> 
-                    <tiles:insertAttribute name="sidebar" />
+
+        </div>
+
+        <div class="col-md-9 roller-column-right">
+
+            <div class="panel panel-default">
+                <div class="panel-body">
+
+                    <h2 class="roller-page-title"><s:property value="pageTitle"/></h2>
+                    <tiles:insertAttribute name="messages"/>
+                    <tiles:insertAttribute name="content"/>
+
                 </div>
             </div>
+
         </div>
-        
-        <div id="footer">
-            <tiles:insertAttribute name="footer" />
-        </div>
-        
-    </body>
+    </div>
+</div>
+
+<footer class="footer">
+    <div class="container-fluid">
+        <tiles:insertAttribute name="footer"/>
+    </div>
+</footer>
+
+</body>
 </html>
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-popuppage.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-popuppage.jsp
index 91300e3..7d99207 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-popuppage.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-popuppage.jsp
@@ -23,11 +23,14 @@
         <meta http-equiv="X-UA-Compatible" content="IE=edge">

         <link rel="icon" href="<%= request.getContextPath() %>/favicon.ico" type="image/x-icon">

         <tiles:insertAttribute name="head" />

+        <style>

+            <tiles:insertAttribute name="styles" />

+        </style>

     </head>

 

     <body>

 

-        <div id="wrapper"> 

+        <div id="wrapper" class="container-fluid">

             <div id="leftcontent_wrap">

                 <div id="leftcontent"> 

                 </div>

diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simple-tabbedpage.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simple-tabbedpage.jsp
new file mode 100644
index 0000000..f123444
--- /dev/null
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simple-tabbedpage.jsp
@@ -0,0 +1,57 @@
+<%--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  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.  For additional information regarding
+  copyright in this work, please see the NOTICE file in the top level
+  directory of this distribution.
+--%>
+<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
+<!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>
+    <tiles:insertAttribute name="head"/>
+    <style>
+        <tiles:insertAttribute name="styles" />
+    </style>
+</head>
+<body>
+
+<tiles:insertAttribute name="banner"/>
+
+<div class="container-fluid">
+
+    <div class="row">
+        <div class="col-md-12 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>
+        </div>
+    </div>
+</div>
+
+<footer class="footer">
+    <div class="container-fluid">
+        <tiles:insertAttribute name="footer"/>
+    </div>
+</footer>
+
+</body>
+</html>
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simplepage.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simplepage.jsp
index 381a964..55d8113 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simplepage.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-simplepage.jsp
@@ -18,47 +18,39 @@
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 <!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">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <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="banner" />
-            <tiles:insertAttribute name="bannerStatus" />
-        </div>
-        
-        <div id="wrapper"> 
-            <div id="leftcontent_wrap">
-                <div id="leftcontent"> 
+<tiles:insertAttribute name="banner"/>
+
+<div class="container-fluid">
+
+    <div class="row">
+        <div class="col-md-1"></div>
+        <div class="col-md-10">
+
+            <h1 class="roller-page-title"><s:property value="pageTitle"/></h1>
+            <p><tiles:insertAttribute name="messages"/>
+            <div class="panel">
+                <div class="panel-body">
+                    <tiles:insertAttribute name="content"/>
                 </div>
             </div>
-            
-            <div id="centercontent_wrap">
-                <div id="centercontent">   
-                    <h1><s:property value="pageTitle" /></h1>
-                    <tiles:insertAttribute name="messages" />
-                    <tiles:insertAttribute name="content" />
-                </div>
-            </div>
-            
-            <div id="rightcontent_wrap">
-                <div id="rightcontent"> 
-                </div>
-            </div>
+
         </div>
-        
-        <div id="footer">
-            <tiles:insertAttribute name="footer" />
-        </div>
-        
-    </body>
+        <div class="col-md-1"></div>
+    </div>
+</div>
+
+</body>
 </html>
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp
index 1299132..7a028ac 100644
--- a/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp
@@ -1,3 +1,4 @@
+<%@ taglib prefix="tilesx" uri="http://tiles.apache.org/tags-tiles-extras" %>
 <%--
   Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  The ASF licenses this file to You
@@ -18,50 +19,79 @@
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 <!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"> 
+<tiles:insertAttribute name="banner"/>
+
+<tilesx:useAttribute name="sidebar" id="sidebar" classname="java.lang.String"/>
+
+<div class="container-fluid">
+
+    <div class="row">
+
+        <div class="col-md-3 roller-column-left">
+
+            <div class="panel panel-default">
+                <div class="panel-body" style="text-align: center">
+
+                    <img src='<s:url value="/roller-ui/images/feather.svg" />'
+                         alt="ASF feat" height="100" align="center"/>
+                    <h4><s:text name="generic.poweredBy" /></h4>
+
+                    <s:if test="authenticatedUser != null || actionWeblog != null">
+                        <tiles:insertAttribute name="userStatus"/>
+                    </s:if>
+
                 </div>
             </div>
-            
-            <div id="centercontent_wrap">
-                <div id="centercontent">   
-                    <tiles:insertAttribute name="messages" /> 
-                    <tiles:insertAttribute name="content" />    
+
+            <c:if test="${sidebar != '/WEB-INF/jsps/tiles/empty.jsp'}">
+                <s:property value="sidebar"/>
+                <div class="panel panel-default">
+                    <div class="panel-body">
+
+                        <tiles:insertAttribute name="sidebar"/>
+
+                    </div>
                 </div>
-            </div>
-            
-            <div id="rightcontent_wrap">
-                <div id="rightcontent"> 
-                    <tiles:insertAttribute name="sidebar" />
+            </c:if>
+
+        </div>
+
+        <div class="col-md-9 roller-column-right">
+            <div class="panel panel-default">
+                <div class="panel-body" style="min-height: 30em">
+
+                    <tiles:insertAttribute name="messages"/>
+
+                    <h2 class="roller-page-title"><s:property value="pageTitle"/></h2>
+                    <tiles:insertAttribute name="content"/>
+
                 </div>
             </div>
         </div>
-        
-        <div id="footer">
-            <tiles:insertAttribute name="footer" />
-        </div>
-        
-    </body>
+
+
+    </div>
+
+</div>
+
+<footer class="footer">
+    <div class="container-fluid">
+        <tiles:insertAttribute name="footer"/>
+    </div>
+</footer>
+
+</body>
 </html>
+
diff --git a/app/src/main/webapp/WEB-INF/jsps/tiles/userStatus.jsp b/app/src/main/webapp/WEB-INF/jsps/tiles/userStatus.jsp
new file mode 100644
index 0000000..754df4c
--- /dev/null
+++ b/app/src/main/webapp/WEB-INF/jsps/tiles/userStatus.jsp
@@ -0,0 +1,38 @@
+<%--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  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.  For additional information regarding
+  copyright in this work, please see the NOTICE file in the top level
+  directory of this distribution.
+--%>
+
+<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
+
+<s:if test="authenticatedUser != null">
+    <p>
+    <s:text name="mainPage.loggedInAs" />:
+    <a href="<s:url action="menu" namespace="/roller-ui" />">
+        <s:property value="authenticatedUser.userName"/>
+    </a>
+    </p>
+</s:if>
+
+<s:if test="actionWeblog != null">
+    <p>
+    <s:text name="mainPage.currentWebsite" />:
+    <a href='<s:property value="actionWeblog.absoluteURL" />'>
+        <s:property value="actionWeblog.handle" />
+    </a>
+    </p>
+</s:if>
+    
diff --git a/app/src/main/webapp/WEB-INF/tiles.xml b/app/src/main/webapp/WEB-INF/tiles.xml
index 7b90dc5..f25bb52 100644
--- a/app/src/main/webapp/WEB-INF/tiles.xml
+++ b/app/src/main/webapp/WEB-INF/tiles.xml
@@ -22,7 +22,7 @@
 <tiles-definitions>
     
     <definition name=".tiles-mainmenupage" template="/WEB-INF/jsps/tiles/tiles-mainmenupage.jsp">
-        <put-attribute name="bannerStatus" value="/WEB-INF/jsps/tiles/bannerStatus.jsp" />
+        <put-attribute name="banner"       value="/WEB-INF/jsps/tiles/bannerStatus.jsp" />
         <put-attribute name="head"         value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="styles"       value="/WEB-INF/jsps/tiles/empty.jsp" />
         <put-attribute name="messages"     value="/WEB-INF/jsps/tiles/messages.jsp" />
@@ -32,29 +32,40 @@
     </definition>
     
     <definition name=".tiles-tabbedpage" template="/WEB-INF/jsps/tiles/tiles-tabbedpage.jsp">
-        <put-attribute name="bannerStatus" value="/WEB-INF/jsps/tiles/bannerStatus.jsp" />
+        <put-attribute name="banner"       value="/WEB-INF/jsps/tiles/bannerStatus.jsp" />
+        <put-attribute name="userStatus"   value="/WEB-INF/jsps/tiles/userStatus.jsp" />
         <put-attribute name="head"         value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="styles"       value="/WEB-INF/jsps/tiles/empty.jsp" />
-        <put-attribute name="menu"         value="/WEB-INF/jsps/tiles/menu.jsp" />
+        <put-attribute name="menu"         value="/WEB-INF/jsps/tiles/empty.jsp" />
+        <put-attribute name="sidemenu"     value="/WEB-INF/jsps/tiles/empty.jsp" />
         <put-attribute name="messages"     value="/WEB-INF/jsps/tiles/messages.jsp" />
         <put-attribute name="content"      value="${content}" />
         <put-attribute name="sidebar"      value="/WEB-INF/jsps/tiles/empty.jsp" />
         <put-attribute name="footer"       value="/WEB-INF/jsps/tiles/footer.jsp" />
     </definition>
-    
+
     <definition name=".tiles-simplepage" template="/WEB-INF/jsps/tiles/tiles-simplepage.jsp">
-        <put-attribute name="banner"       value="/WEB-INF/jsps/tiles/empty.jsp" />
-        <put-attribute name="bannerStatus" value="/WEB-INF/jsps/tiles/bannerStatus.jsp" />
+        <put-attribute name="banner"       value="/WEB-INF/jsps/tiles/bannerStatus.jsp" />
         <put-attribute name="head"         value="/WEB-INF/jsps/tiles/head.jsp" />
-        <put-attribute name="styles"       value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
+        <put-attribute name="styles"       value="/WEB-INF/jsps/tiles/empty.jsp" />
         <put-attribute name="messages"     value="/WEB-INF/jsps/tiles/messages.jsp" />
         <put-attribute name="content"      value="${content}" />
         <put-attribute name="footer"       value="/WEB-INF/jsps/tiles/footer.jsp" />
     </definition>
-    
+
+    <definition name=".tiles-loginpage" template="/WEB-INF/jsps/tiles/tiles-loginpage.jsp">
+        <put-attribute name="banner"       value="/WEB-INF/jsps/tiles/bannerStatus.jsp" />
+        <put-attribute name="head"         value="/WEB-INF/jsps/tiles/head.jsp" />
+        <put-attribute name="styles"       value="/WEB-INF/jsps/tiles/empty.jsp" />
+        <put-attribute name="messages"     value="/WEB-INF/jsps/tiles/messages.jsp" />
+        <put-attribute name="content"      value="${content}" />
+        <put-attribute name="footer"       value="/WEB-INF/jsps/tiles/footer.jsp" />
+    </definition>
+
     <definition name=".tiles-installpage" template="/WEB-INF/jsps/tiles/tiles-installpage.jsp">
         <put-attribute name="banner"       value="/WEB-INF/jsps/tiles/empty.jsp" />
         <put-attribute name="head"         value="/WEB-INF/jsps/tiles/head.jsp" />
+        <put-attribute name="styles"       value="/WEB-INF/jsps/tiles/empty.jsp" />
         <put-attribute name="messages"     value="/WEB-INF/jsps/tiles/messages.jsp" />
         <put-attribute name="content"      value="${content}" />
         <put-attribute name="footer"       value="/WEB-INF/jsps/tiles/footer.jsp" />
@@ -63,6 +74,7 @@
     <definition name=".tiles-errorpage" template="/WEB-INF/jsps/tiles/tiles-errorpage.jsp">
         <put-attribute name="banner"       value="/WEB-INF/jsps/tiles/empty.jsp" />
         <put-attribute name="head"         value="/WEB-INF/jsps/tiles/head.jsp" />
+        <put-attribute name="styles"       value="/WEB-INF/jsps/tiles/empty.jsp" />
         <put-attribute name="messages"     value="/WEB-INF/jsps/tiles/messages.jsp" />
         <put-attribute name="content"      value="${content}" />
         <put-attribute name="footer"       value="/WEB-INF/jsps/tiles/footer.jsp" />
@@ -73,9 +85,9 @@
         <put-attribute name="messages"     value="/WEB-INF/jsps/tiles/messages.jsp" />
         <put-attribute name="styles"       value="/WEB-INF/jsps/tiles/empty.jsp" />
         <put-attribute name="content"      value="${content}" />
-       
     </definition>
-    <definition name=".tiles-popuppage-only-content" template="/WEB-INF/jsps/tiles/tiles-popuppage.jsp">       
+
+    <definition name=".tiles-popuppage-only-content" extends=".tiles-popuppage">
         <put-attribute name="content"      value="${content}" />
     </definition>
     
@@ -86,8 +98,9 @@
     
         
     <!-- core pages (and associates) -->
-    <definition name=".Login" extends=".tiles-simplepage" >
+    <definition name=".Login" extends=".tiles-loginpage" >
         <put-attribute name="content" value="/WEB-INF/jsps/core/Login.jsp" />
+        <put-attribute name="styles"  value="/WEB-INF/jsps/core/Login-css.jsp" />
     </definition>
     
     <definition name=".Register" extends=".tiles-simplepage" >
@@ -121,7 +134,7 @@
     <definition name=".MainMenu" extends=".tiles-mainmenupage" >
         <put-attribute name="content" value="/WEB-INF/jsps/core/MainMenu.jsp" />
         <put-attribute name="sidebar" value="/WEB-INF/jsps/core/MainMenuSidebar.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-sidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
     
     
@@ -160,10 +173,6 @@
         <put-attribute name="content" value="/WEB-INF/jsps/admin/GlobalConfig.jsp" />
     </definition>
     
-    <definition name=".FrontpageConfig" extends=".tiles-simplepage" >
-        <put-attribute name="content" value="/WEB-INF/jsps/admin/FrontpageConfig.jsp" />
-    </definition>
-    
     <definition name=".UserAdmin" extends=".tiles-tabbedpage" >
         <put-attribute name="content" value="/WEB-INF/jsps/admin/UserAdmin.jsp" />
     </definition>
@@ -173,22 +182,18 @@
     </definition>
     
     <definition name=".GlobalCommentManagement" extends=".tiles-tabbedpage" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content" value="/WEB-INF/jsps/editor/Comments.jsp" />
         <put-attribute name="sidebar" value="/WEB-INF/jsps/editor/CommentsSidebar.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-checkboxlistFix.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
     
     <definition name=".PingTargets" extends=".tiles-tabbedpage" >
         <put-attribute name="content" value="/WEB-INF/jsps/admin/PingTargets.jsp" />
     </definition>
-    
-    <definition name=".PingTargetConfirm" extends=".tiles-tabbedpage" >
-        <put-attribute name="content" value="/WEB-INF/jsps/admin/PingTargetRemove.jsp" />
-    </definition>
-    
+
     <definition name=".PingTargetEdit" extends=".tiles-tabbedpage" >
-        <put-attribute name="content" value="/WEB-INF/jsps/admin/PingTargetEdit.jsp" />
+        <put-attribute name="content" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
     
     <definition name=".CacheInfo" extends=".tiles-tabbedpage" >
@@ -199,151 +204,132 @@
         <put-attribute name="content" value="/WEB-INF/jsps/admin/PlanetConfig.jsp" />
     </definition>
     
-    <definition name=".PlanetSubscriptions" extends=".tiles-tabbedpage" >
-        <put-attribute name="content" value="/WEB-INF/jsps/admin/PlanetSubscriptions.jsp" />
+    <definition name=".PlanetGroupSubs" extends=".tiles-tabbedpage" >
+        <put-attribute name="content" value="/WEB-INF/jsps/admin/PlanetGroupSubs.jsp" />
+        <put-attribute name="sidebar" value="/WEB-INF/jsps/admin/PlanetGroupSubsSidebar.jsp" />
     </definition>
     
     <definition name=".PlanetGroups" extends=".tiles-tabbedpage" >
         <put-attribute name="content" value="/WEB-INF/jsps/admin/PlanetGroups.jsp" />
+        <put-attribute name="sidebar" value="/WEB-INF/jsps/admin/PlanetGroupSidebar.jsp" />
     </definition>
 
     <!-- weblog editor pages (and associates) -->
     <definition name=".MediaFileAdd" extends=".tiles-tabbedpage" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content" value="/WEB-INF/jsps/editor/MediaFileAdd.jsp" />
         <put-attribute name="sidebar" value="/WEB-INF/jsps/tiles/empty.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
 
     <definition name=".MediaFileEdit" extends=".tiles-popuppage" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content" value="/WEB-INF/jsps/editor/MediaFileEdit.jsp" />
     </definition>
 
     <definition name=".MediaFileAddExternalInclude" extends=".tiles-popuppage-only-content" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content" value="/WEB-INF/jsps/editor/MediaFileAddExternalInclude.jsp" />
     </definition>
 
     <definition name=".MediaFileImageChooser" extends=".tiles-popuppage-only-content" >
-        <put-attribute name="head"     value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head"     value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content"  value="/WEB-INF/jsps/editor/MediaFileImageChooser.jsp" />
         <put-attribute name="messages" value="/WEB-INF/jsps/tiles/messages.jsp" />
     </definition>
 
     <definition name=".MediaFileImageDimension" extends=".tiles-popuppage-only-content" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content" value="/WEB-INF/jsps/editor/MediaFileImageDimension.jsp" />
     </definition>
-    
-    <definition name=".MediaFileSearchInclude" extends=".tiles-popuppage" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
-        <put-attribute name="content" value="/WEB-INF/jsps/editor/MediaFileSearch.jsp" />
-    </definition>
 
     <definition name=".MediaFileAddInclude" extends=".tiles-popuppage" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content" value="/WEB-INF/jsps/editor/MediaFileAdd.jsp" />
     </definition>
 
     <definition name=".MediaFileAddSuccessInclude" extends=".tiles-popuppage" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content" value="/WEB-INF/jsps/editor/MediaFileAddSuccessInclude.jsp" />
     </definition>
     
     <definition name=".MediaFileEditSuccess" extends=".tiles-popuppage" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content" value="/WEB-INF/jsps/editor/MediaFileEditSuccess.jsp" />
     </definition>
 
     <definition name=".MediaFileView" extends=".tiles-tabbedpage" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content" value="/WEB-INF/jsps/editor/MediaFileView.jsp" />
         <put-attribute name="sidebar" value="/WEB-INF/jsps/editor/MediaFileSidebar.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-sidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
 
     <definition name=".MediaFileAddSuccess" extends=".tiles-tabbedpage" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content" value="/WEB-INF/jsps/editor/MediaFileAddSuccess.jsp" />
         <put-attribute name="sidebar" value="/WEB-INF/jsps/tiles/empty.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
-    </definition>
-
-    <definition name=".TabularView" extends=".tiles-tabbedpage" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
-        <put-attribute name="content" value="/WEB-INF/jsps/editor/TabularView.jsp" />
-        <put-attribute name="sidebar" value="/WEB-INF/jsps/editor/MediaFileSidebar.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-sidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
 
     <definition name=".EntryEdit" extends=".tiles-tabbedpage" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content" value="/WEB-INF/jsps/editor/EntryEdit.jsp" />
         <put-attribute name="sidebar" value="/WEB-INF/jsps/editor/EntrySidebar.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-sidebar.jsp" />
-    </definition>
-
-    <definition name=".EntryRemove" extends=".tiles-tabbedpage" >
-        <put-attribute name="content" value="/WEB-INF/jsps/editor/EntryRemove.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
 
     <definition name=".Entries" extends=".tiles-tabbedpage" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content" value="/WEB-INF/jsps/editor/Entries.jsp" />
         <put-attribute name="sidebar" value="/WEB-INF/jsps/editor/EntriesSidebar.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-sidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
 
     <definition name=".Comments" extends=".tiles-tabbedpage" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content" value="/WEB-INF/jsps/editor/Comments.jsp" />
         <put-attribute name="sidebar" value="/WEB-INF/jsps/editor/CommentsSidebar.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-checkboxlistFix.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
     
     <definition name=".Categories" extends=".tiles-tabbedpage" >
         <put-attribute name="content" value="/WEB-INF/jsps/editor/Categories.jsp" />
         <put-attribute name="sidebar" value="/WEB-INF/jsps/editor/CategoriesSidebar.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-sidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
-    
+
     <definition name=".CategoryEdit" extends=".tiles-tabbedpage" >
-        <put-attribute name="content" value="/WEB-INF/jsps/editor/CategoryEdit.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
+        <put-attribute name="content" value="/WEB-INF/jsps/tiles/empty.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
-    
+
     <definition name=".CategoryRemove" extends=".tiles-tabbedpage" >
-        <put-attribute name="content" value="/WEB-INF/jsps/editor/CategoryRemove.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
+        <put-attribute name="content" value="/WEB-INF/jsps/tiles/empty.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
-    
+
     <definition name=".Bookmarks" extends=".tiles-tabbedpage" >
         <put-attribute name="content" value="/WEB-INF/jsps/editor/Bookmarks.jsp" />
         <put-attribute name="sidebar" value="/WEB-INF/jsps/editor/BookmarksSidebar.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-sidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
-    
-    <definition name=".BookmarkEdit" extends=".tiles-tabbedpage" >
-        <put-attribute name="content" value="/WEB-INF/jsps/editor/BookmarkEdit.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
-    </definition>
-    
+
     <definition name=".BookmarksImport" extends=".tiles-tabbedpage" >
         <put-attribute name="content" value="/WEB-INF/jsps/editor/BookmarksImport.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
-    
+
+    <definition name=".BookmarkEdit" extends=".tiles-tabbedpage" >
+        <put-attribute name="content" value="/WEB-INF/jsps/tiles/empty.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
+    </definition>
+
     <definition name=".FolderEdit" extends=".tiles-tabbedpage" >
-        <put-attribute name="content" value="/WEB-INF/jsps/editor/FolderEdit.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
+        <put-attribute name="content" value="/WEB-INF/jsps/tiles/empty.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
-    
-    <definition name=".Resources" extends=".tiles-tabbedpage" >
-        <put-attribute name="content" value="/WEB-INF/jsps/editor/Resources.jsp" />
-    </definition>
-    
+
     <!-- weblog admin pages (and associates) -->
     <definition name=".WeblogConfig" extends=".tiles-tabbedpage" >
         <put-attribute name="content" value="/WEB-INF/jsps/editor/WeblogConfig.jsp" />
@@ -351,49 +337,39 @@
     
     <definition name=".WeblogRemoveConfirm" extends=".tiles-tabbedpage" >
         <put-attribute name="content" value="/WEB-INF/jsps/editor/WeblogRemoveConfirm.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
     
     <definition name=".ThemeEdit" extends=".tiles-tabbedpage" >
-        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head-ajax.jsp" />
+        <put-attribute name="head" value="/WEB-INF/jsps/tiles/head.jsp" />
         <put-attribute name="content" value="/WEB-INF/jsps/editor/ThemeEdit.jsp" />
     </definition>
     
     <definition name=".StylesheetEdit" extends=".tiles-tabbedpage"  >
         <put-attribute name="content" value="/WEB-INF/jsps/editor/StylesheetEdit.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
 
     <definition name=".Templates" extends=".tiles-tabbedpage"  >
         <put-attribute name="content" value="/WEB-INF/jsps/editor/Templates.jsp" />
         <put-attribute name="sidebar" value="/WEB-INF/jsps/editor/TemplatesSidebar.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-sidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
     
     <definition name=".TemplateEdit" extends=".tiles-tabbedpage"  >
         <put-attribute name="content" value="/WEB-INF/jsps/editor/TemplateEdit.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
-    
-    <definition name=".TemplateRemove" extends=".tiles-tabbedpage"  >
-        <put-attribute name="content" value="/WEB-INF/jsps/editor/TemplateRemove.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
-    </definition>
-    
-    <definition name=".TemplatesRemove" extends=".tiles-tabbedpage"  >
-        <put-attribute name="content" value="/WEB-INF/jsps/editor/TemplatesRemove.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
-    </definition>
-    
+
     <definition name=".Members" extends=".tiles-tabbedpage" >
         <put-attribute name="content" value="/WEB-INF/jsps/editor/Members.jsp" />
         <put-attribute name="sidebar" value="/WEB-INF/jsps/editor/MembersSidebar.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-sidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
     
     <definition name=".MembersInvite" extends=".tiles-tabbedpage" >
         <put-attribute name="content" value="/WEB-INF/jsps/editor/MembersInvite.jsp" />
-        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/css-nosidebar.jsp" />
+        <put-attribute name="styles" value="/WEB-INF/jsps/tiles/empty.jsp" />
     </definition>
 
     <definition name=".MemberResign" extends=".tiles-simplepage" >
diff --git a/app/src/main/webapp/WEB-INF/web.xml b/app/src/main/webapp/WEB-INF/web.xml
index ba74375..3ccd730 100644
--- a/app/src/main/webapp/WEB-INF/web.xml
+++ b/app/src/main/webapp/WEB-INF/web.xml
@@ -154,6 +154,10 @@
         <dispatcher>REQUEST</dispatcher>
         <dispatcher>FORWARD</dispatcher>
     </filter-mapping>
+    <filter-mapping>
+        <filter-name>struts2</filter-name>
+        <url-pattern>/struts/*</url-pattern>
+    </filter-mapping>
 
     <!-- Context Listeners -->
     <listener>
diff --git a/app/src/main/webapp/roller-ui/JQueryUI-README.txt b/app/src/main/webapp/roller-ui/JQueryUI-README.txt
deleted file mode 100644
index 96f1d79..0000000
--- a/app/src/main/webapp/roller-ui/JQueryUI-README.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-The JQuery UI folder (roller-ui/jquery-ui-1.11.0) was created by doing the following:
-
-1. Going to the JQuery UI download builder (http://jqueryui.com/download/) and choosing the latest stable version.
-2. Under Components, unselecting "toggle all" to make sure nothing selected.
-3. Choosing the components Roller uses:  accordion, datepicker, dialog, autocomplete, and tabs.
-   A full list can be obtained by opening up the current jquery-ui.min.js and reading the autogenerated comment header.
-   Let the Download Builder select whatever additional prerequisites needed.
-4. Selecting theme "Redmond", or a different one if desired.  (How each theme looks can be determined by going
-   to: http://jqueryui.com/themeroller/ and selecting the "Gallery" tab.)
-5. For the subsequent download, extract into a new folder under roller-ui and delete all the non-"min" CSS
-   and JS files within that folder.  Also delete:
-   a) the index.html and external/jquery/jquery.js files. (our JQuery is kept in the roller-ui/scripts folder.)
-   b) the structure and theme CSS files (they are unused subsets of the jquery-ui.min.css)
-6. Update the Roller UI JSP's to point to the new JQuery UI folder and test all works.
-7. Delete the old JQuery folder after the Roller UI has been updated.
-8. Update this README as necessary if anything's changed.
-
-Following the above process when upgrading the JQuery UI version or changing the theme it uses will help to make sure all old files
-get deleted while no necessary files are accidentally removed.
-
-Notes:
-1. Recommended to keep the contents of the jquery-ui-1.11.0 folder within this folder, i.e., don't move the images or CSS' to other folders.  This way,
-when we delete this folder as a part of upgrading the JQueryUI version we'll know that all the resources of this version have also been deleted.
-
-2. Recommended not to add non-JQuery resources into this folder; again, this way, when we delete this folder we won't have to worry about other
-resources still needed by Roller also getting deleted.
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/Xinha.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/Xinha.css
deleted file mode 100644
index d845cf3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/Xinha.css
+++ /dev/null
@@ -1,477 +0,0 @@
-.htmlarea { background: #fff; }
-.htmlarea td { margin:0;padding:0; }
-
-.htmlarea .toolbarRow {
-  width:1px;
-}
-
-.htmlarea .toolbar {
-  cursor: default;
-  background: ButtonFace;
-  padding: 3px;
-  border: 1px solid;
-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-}
-.htmlarea .toolbar table { margin: 0; font-family: Tahoma, Verdana,sans-serif; font-size: 11px; }
-.htmlarea .toolbar img { border: none; vertical-align: top; }
-.htmlarea .toolbar .label { padding: 0 3px; }
-
-.htmlarea .toolbar .button {
-  background: ButtonFace;
-  color: ButtonText;
-  border: 1px solid ButtonFace;
-  padding: 1px;
-  margin: 0;
-  width: 18px;
-  height: 18px;
-}
-.htmlarea .toolbar a.button:hover {
-  border: 1px solid;
-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-}
-.htmlarea .toolbar a.buttonDisabled:hover {
-  border-color: ButtonFace;
-}
-.htmlarea .toolbar .buttonActive,
-.htmlarea .toolbar .buttonPressed
-{
-  padding: 2px 0 0 2px;
-  border: 1px solid;
-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-}
-.htmlarea .toolbar .buttonPressed {
-  background: ButtonHighlight;
-}
-.htmlarea .toolbar .indicator {
-  padding: 0 3px;
-  overflow: hidden;
-  width: 20px;
-  text-align: center;
-  cursor: default;
-  border: 1px solid ButtonShadow;
-}
-
-.htmlarea .toolbar .buttonDisabled img {
-  filter: gray() alpha(opacity = 25);
-  -moz-opacity: 0.25;
-  opacity: 0.25;
-}
-
-.htmlarea .toolbar .separator {
-  /*position: relative;*/
-  margin:0 3px;
-  border-left: 1px solid ButtonShadow;
-  border-right: 1px solid ButtonHighlight;
-  width: 0;
-  height: 18px;
-  padding: 0;
-}
-
-.htmlarea .toolbar .space { width: 5px; }
-
-.htmlarea .toolbar select, .htmlarea .toolbar option { font: 11px Tahoma,Verdana,sans-serif;}
-
-.htmlarea .toolbar select,
-.htmlarea .toolbar select:hover,
-.htmlarea .toolbar select:active { 
-  position:relative;
-  top:-2px;
-  margin-bottom:-2px;
-  color: ButtonText;
-}
-
-.htmlarea iframe.xinha_iframe, .htmlarea textarea.xinha_textarea
-{
-  border: none; /*1px solid;*/
-}
-
-.htmlarea .statusBar {
-  border: 1px solid;
-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-  padding: 2px 4px;
-  background-color: ButtonFace;
-  color: ButtonText;
-  font: 11px Tahoma,Verdana,sans-serif;
-  height:16px;
-  overflow: hidden;
-}
-
-.htmlarea .statusBar .statusBarTree a {
-  padding: 2px 5px;
-  color: #00f;
-}
-
-.htmlarea .statusBar .statusBarTree a:visited { color: #00f; }
-.htmlarea .statusBar .statusBarTree a:hover {
-  background-color: Highlight;
-  color: HighlightText;
-  padding: 1px 4px;
-  border: 1px solid HighlightText;
-}
-
-.statusBarWidgetContainer {
-  background-color: ButtonFace;
-}
-
-/* popup dialogs */
-
-.dialog {
-  color: ButtonText;
-  background: ButtonFace; 
-  border: 1px outset; 
-  border-color: WindowFrame;
-}
-div.dialog {
-  padding-bottom:10px;
-  border-radius: 8px 8px 0 0;
-  -moz-border-radius: 8px 8px 0 0;
-  -webkit-border-top-left-radius: 8px;
-  -webkit-border-top-right-radius: 8px;
-  
-  box-shadow: 9px 9px 10px #444;
-  -moz-box-shadow: 9px 9px 10px #444;
-  -webkit-box-shadow: 9px 9px 10px #444;
-}
-div.dialog.modeless {
-  box-shadow: 4px 4px 5px #888;
-  -moz-box-shadow: 4px 4px 5px #888;
-  -webkit-box-shadow: 4px 4px 5px #888;
-}
-div.dialog.chrome {
-  -webkit-box-shadow: none !IMPORTANT;
-}
-.panels div.dialog.panel {
-  border-radius:0;
-  -moz-border-radius: 0;
-  -webkit-border-radius:0;
-  
-  box-shadow: none;
-  -moz-box-shadow: none;
-  -webkit-box-shadow: none;
-}
-.xinha_dialog_background {
-  filter: alpha(opacity=0);
-  -moz-opacity: 0;
-  opacity: 0;
-  border:none;
-}
-.xinha_dialog_background_modal_greyout {
-  background-color:#666;
-  filter: alpha(opacity=70) !IMPORTANT;
-  -moz-opacity: 0.7;
-  opacity: 0.7;
-}
-.xinha_dialog_background_modal {
-  filter: alpha(opacity=0) !IMPORTANT;
-  -moz-opacity: 0;
-  opacity: 0;
-  border:none;
-}
-body.xinha_dialog_background_modal_greyout {
-  filter: alpha(opacity=100) !IMPORTANT;
-}
-body.xinha_dialog_background_modal {
-  filter: alpha(opacity=0);
-}
-.dialog .content { padding: 2px; }
-
-.dialog, .dialog button, .dialog input, .dialog select, .dialog textarea, .dialog table {
-  font: 11px Tahoma,Verdana,sans-serif;
-}
-
-.dialog table { border-collapse: collapse; }
-
-.dialog .title, .dialog h1
-{
-  background: ActiveCaption;
-  color: CaptionText;
-  border-bottom: 1px solid #000;
-  padding: 1px 0 2px 5px;
-  font-size: 12px;
-  font-weight: bold;
-  cursor: default;
-  letter-spacing: 0.01em;
-}
-.dialog h1 { 
-  padding-left:22px;
-  margin:0;
-  border-radius: 8px 8px 0 0;
-  -moz-border-radius: 8px 8px 0 0;
-  -webkit-border-top-left-radius: 8px;
-  -webkit-border-top-right-radius: 8px;
-}
-.panels .dialog.panel h1 { 
-  -moz-border-radius: 0;
-  -webkit-border-radius:0;
-}
-
-.dialog .title .button {
-  float: right;
-  border: 1px solid #66a;
-  padding: 0 1px 0 2px;
-  margin-right: 1px;
-  color: #fff;
-  text-align: center;
-}
-
-.dialog .title .button-hilite { border-color: #88f; background: #44c; }
-
-.dialog button {
-  width: 5.5em;
-  padding: 0;
-}
-.dialog .closeButton {
-  padding: 0;
-  cursor: default;
-  border: 1px solid;
-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-  height : 11px;
-  width : 11px;
-  vertical-align : top;
-  position : absolute;
-  top : 3px;
-  right : 2px;
-  background-color: ButtonFace;
-  color: ButtonText;
-  font-size: 13px;
-  font-family: Tahoma,Verdana,sans-serif;
-  text-align:center;
-  letter-spacing:0;
-  overflow:hidden;
-}
-.dialog .buttonColor {
-  width :1em;
-  padding: 1px;
-  cursor: default;
-  border: 1px solid;
-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-}
-
-.dialog .buttonColor .chooser, .dialog .buttonColor .nocolor {
-  height: 0.6em;
-  border: 1px solid;
-  padding: 0 1em;
-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-}
-
-.dialog .buttonClick {
-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-}
-.dialog .buttonColor-hilite {
-   border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-}
-
-.dialog .buttonColor .nocolor { padding: 0; }
-.dialog .buttonColor .nocolor-hilite { background-color: #fff; color: #f00; }
-
-.dialog .label { text-align: right; width: 6em; }
-.dialog .value input { width: 100%; }
-
-.dialog legend { font-weight: bold; }
-.dialog fieldset table { margin: 2px 0; }
- 
-.dialog  .buttons {
-
-      padding: 1em; 
-      text-align: center;
-}
-.dialog .resizeHandle {
-    -moz-appearance : resizer;
-    width: 12px;
-    height: 12px;
-    border-bottom: 2px solid #000;
-    border-right: 2px solid #000;
-    cursor : se-resize;
-}
-.popupwin {
-  padding: 0;
-  margin: 0;
-}
-
-.popupwin .title {
-  background: #fff;
-  color: #000;
-  font-weight: bold;
-  font-size: 120%;
-  padding: 3px 10px;
-  margin-bottom: 10px;
-  border-bottom: 1px solid black;
-  letter-spacing: 2px;
-}
-
-form { margin: 0; border: none; }
-
-
-/** Panels **/
-.htmlarea .panels_top
-{
-  border-bottom : 1px solid;
-  border-color: ButtonShadow;
-}
-
-.htmlarea .panels_right
-{
-  border-left : 1px solid;
-  border-color: ButtonShadow;
-}
-
-.htmlarea .panels_left
-{
-  border-right : 1px solid;
-  border-color: ButtonShadow;
-}
-
-.htmlarea .panels_bottom
-{
-  border-top : 1px solid;
-  border-color: ButtonShadow;
-}
-
-.htmlarea .panel h1 {
-  clear:left;
-  font-size:0.9em;
-}
-
-.htmlarea .panel { 
-  overflow:hidden; 
-  background-color:white;
-  padding-bottom:0 !IMPORTANT;
-  border: none !IMPORTANT;
-}
-.htmlarea .panels_left  .panel { border-right:none; border-left:none; }
-.htmlarea .panels_left  h1     { border-right:none;  }
-.htmlarea .panels_right .panel { border-right:none; border-left:none; }
-.htmlarea .panels_left  h1     { border-left:none;  }
-.htmlarea { border: 1px solid black; }
-
-.loading
-{
-  font-family:sans-serif;
-  position:absolute;
-  z-index:998;
-  text-align:center;
-  width:212px;
-  padding: 55px 0 5px 0;
-  border:2px solid #ccc;
-  /* border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;*/
-  background: url(images/xinha_logo.gif) no-repeat #fff center 5px;
-}
-.loading_main
-{
-  font-size:11px;
-  color:#000;
- 
-}
-.loading_sub
-{
-  font-size:9px;
-  color:#666;
-  text-align:center;
-}
-/* Classes for filemanager styles in a dialog. */
-.dialog a img
-{
-border: 0 none transparent;
-}
-
-.dialog fieldset.collapsed {
-border: 0 none transparent;
-}
-
-.dialog fieldset.collapsed form {
-display: none;
-}
-
-.hidden
-{
-display: none;
-}
-
-.placesmanager
-{
-  width: 95%;
-  overflow: auto;
-}
-
-.filemanager
-{
-  width: 95%;
-  height: 200px;
-  overflow: auto;
-  background-color: #fff;
-}
-.filemanager div.file
-{
-  min-width: 80px;
-  height: 100px;
-  position: relative;
-  float: left;
-  border: 1px outset #666;
-  margin: 4px;
-}
-.placesmanager div.file
-{
-  min-width: 60px;
-  height: 70px;
-  position: relative;
-  float: left;
-  border: 1px outset #666;
-  margin: 4px;
-}
-.filemanager div.file:hover,
-.placesmanager div.file:hover
-{
-  border: 1px solid #333;
-  background: #fffff3;
-}
-
-.filemanager div.selected,
-.filemanager div.selected:hover,
-.placesmanager div.selected,
-.placesmanager div.selected:hover
-{
-  background: #ffffda;
-  border: 1px solid #000;
-}
-.filemanager .filename {
-	margin: 0.5em;
-	color: #222;
-}
-.filemanager div.selected .filename {
-  color: #000;
-}
-.filemanager img.thumb
-{
-  width: 50px;
-  height: 50px;
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  margin: -25px 0 0 -25px;
-  border: 1px solid black;
-}
-.filemanager img.icon
-{
-  width: 32px;
-  height: 32px;
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  margin: -16px 0 0 -16px;
-}
-.filemanager img.action
-{
-  width: 15px;
-  height: 15px;
-  position: absolute;
-}
-.filemanager img.delete
-{
-  bottom: 3px;
-  left: 20px;
-}
-.filemanager img.copy
-{
-  bottom: 3px;
-  left: 3px;
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/XinhaCore.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/XinhaCore.js
deleted file mode 100644
index 2ef5029..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/XinhaCore.js
+++ /dev/null
@@ -1,4322 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/XinhaCore.js */
-  /*--------------------------------------------------------------------------
-    --  Xinha (is not htmlArea) - http://xinha.org
-    --
-    --  Use of Xinha is granted by the terms of the htmlArea License (based on
-    --  BSD license)  please read license.txt in this package for details.
-    --
-    --  Copyright (c) 2005-2008 Xinha Developer Team and contributors
-    --  
-    --  Xinha was originally based on work by Mihai Bazon which is:
-    --      Copyright (c) 2003-2004 dynarch.com.
-    --      Copyright (c) 2002-2003 interactivetools.com, inc.
-    --      This copyright notice MUST stay intact for use.
-    -------------------------------------------------------------------------*/
-
-Xinha.version={"Release":"Trunk","Head":"$HeadURL: http://svn.xinha.org/tags/0.96.1/XinhaCore.js $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),"Date":"$LastChangedDate: 2010-05-11 17:40:06 -0400 (Tue, 11 May 2010) $".replace(/^[^:]*:\s*([0-9\-]*) ([0-9:]*) ([+0-9]*) \((.*)\)\s*\$/,"$4 $2 $3"),"Revision":"$LastChangedRevision: 1263 $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),"RevisionBy":"$LastChangedBy: gogo $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1")};
-Xinha._resolveRelativeUrl=function(_1,_2){
-if(_2.match(/^([^:]+\:)?\/\//)){
-return _2;
-}else{
-var b=_1.split("/");
-if(b[b.length-1]===""){
-b.pop();
-}
-var p=_2.split("/");
-if(p[0]=="."){
-p.shift();
-}
-while(p[0]==".."){
-b.pop();
-p.shift();
-}
-return b.join("/")+"/"+p.join("/");
-}
-};
-if(typeof _editor_url=="string"){
-_editor_url=_editor_url.replace(/\x2f*$/,"/");
-if(!_editor_url.match(/^([^:]+\:)?\//)){
-(function(){
-var _5=window.location.toString().replace(/\?.*$/,"").split("/");
-_5.pop();
-_editor_url=Xinha._resolveRelativeUrl(_5.join("/"),_editor_url);
-})();
-}
-}else{
-alert("WARNING: _editor_url is not set!  You should set this variable to the editor files path; it should preferably be an absolute path, like in '/xinha/', but it can be relative if you prefer.  Further we will try to load the editor files correctly but we'll probably fail.");
-_editor_url="";
-}
-if(typeof _editor_lang=="string"){
-_editor_lang=_editor_lang.toLowerCase();
-}else{
-_editor_lang="en";
-}
-if(typeof _editor_skin!=="string"){
-_editor_skin="";
-}
-if(typeof _editor_icons!=="string"){
-_editor_icons="";
-}
-var __xinhas=[];
-Xinha.agt=navigator.userAgent.toLowerCase();
-Xinha.is_ie=((Xinha.agt.indexOf("msie")!=-1)&&(Xinha.agt.indexOf("opera")==-1));
-Xinha.ie_version=parseFloat(Xinha.agt.substring(Xinha.agt.indexOf("msie")+5));
-Xinha.is_opera=(Xinha.agt.indexOf("opera")!=-1);
-if(Xinha.is_opera&&Xinha.agt.match(/opera[\/ ]([0-9.]+)/)){
-Xinha.opera_version=parseFloat(RegExp.$1);
-}else{
-Xinha.opera_version=0;
-}
-Xinha.is_khtml=(Xinha.agt.indexOf("khtml")!=-1);
-Xinha.is_webkit=(Xinha.agt.indexOf("applewebkit")!=-1);
-Xinha.webkit_version=parseInt(navigator.appVersion.replace(/.*?AppleWebKit\/([\d]).*?/,"$1"),10);
-Xinha.is_safari=(Xinha.agt.indexOf("safari")!=-1);
-Xinha.is_chrome=(Xinha.agt.indexOf("chrome")!=-1);
-Xinha.is_mac=(Xinha.agt.indexOf("mac")!=-1);
-Xinha.is_mac_ie=(Xinha.is_ie&&Xinha.is_mac);
-Xinha.is_win_ie=(Xinha.is_ie&&!Xinha.is_mac);
-Xinha.is_gecko=(navigator.product=="Gecko")||Xinha.is_opera;
-Xinha.is_real_gecko=(navigator.product=="Gecko"&&!Xinha.is_webkit);
-Xinha.is_ff2=Xinha.is_real_gecko&&parseInt(navigator.productSub.substr(0,10),10)<20071210;
-Xinha.isRunLocally=document.URL.toLowerCase().search(/^file:/)!=-1;
-Xinha.is_designMode=(typeof document.designMode!="undefined"&&!Xinha.is_ie);
-Xinha.checkSupportedBrowser=function(){
-return Xinha.is_real_gecko||(Xinha.is_opera&&Xinha.opera_version>=9.2)||Xinha.ie_version>=5.5||Xinha.webkit_version>=522;
-};
-Xinha.isSupportedBrowser=Xinha.checkSupportedBrowser();
-if(Xinha.isRunLocally&&Xinha.isSupportedBrowser){
-alert("Xinha *must* be installed on a web server. Locally opened files (those that use the \"file://\" protocol) cannot properly function. Xinha will try to initialize but may not be correctly loaded.");
-}
-function Xinha(_6,_7){
-if(!Xinha.isSupportedBrowser){
-return;
-}
-if(!_6){
-throw new Error("Tried to create Xinha without textarea specified.");
-}
-if(typeof _7=="undefined"){
-this.config=new Xinha.Config();
-}else{
-this.config=_7;
-}
-if(typeof _6!="object"){
-_6=Xinha.getElementById("textarea",_6);
-}
-this._textArea=_6;
-this._textArea.spellcheck=false;
-Xinha.freeLater(this,"_textArea");
-this._initial_ta_size={w:_6.style.width?_6.style.width:(_6.offsetWidth?(_6.offsetWidth+"px"):(_6.cols+"em")),h:_6.style.height?_6.style.height:(_6.offsetHeight?(_6.offsetHeight+"px"):(_6.rows+"em"))};
-if(document.getElementById("loading_"+_6.id)||this.config.showLoading){
-if(!document.getElementById("loading_"+_6.id)){
-Xinha.createLoadingMessage(_6);
-}
-this.setLoadingMessage(Xinha._lc("Constructing object"));
-}
-this._editMode="wysiwyg";
-this.plugins={};
-this._timerToolbar=null;
-this._timerUndo=null;
-this._undoQueue=[this.config.undoSteps];
-this._undoPos=-1;
-this._customUndo=true;
-this._mdoc=document;
-this.doctype="";
-this.__htmlarea_id_num=__xinhas.length;
-__xinhas[this.__htmlarea_id_num]=this;
-this._notifyListeners={};
-var _8={right:{on:true,container:document.createElement("td"),panels:[]},left:{on:true,container:document.createElement("td"),panels:[]},top:{on:true,container:document.createElement("td"),panels:[]},bottom:{on:true,container:document.createElement("td"),panels:[]}};
-for(var i in _8){
-if(!_8[i].container){
-continue;
-}
-_8[i].div=_8[i].container;
-_8[i].container.className="panels panels_"+i;
-Xinha.freeLater(_8[i],"container");
-Xinha.freeLater(_8[i],"div");
-}
-this._panels=_8;
-this._statusBar=null;
-this._statusBarTree=null;
-this._statusBarTextMode=null;
-this._statusBarItems=[];
-this._framework={};
-this._htmlArea=null;
-this._iframe=null;
-this._doc=null;
-this._toolBar=this._toolbar=null;
-this._toolbarObjects={};
-this.plugins.Events={name:"Events",developer:"The Xinha Core Developer Team",instance:_7.Events};
-};
-Xinha.onload=function(){
-};
-Xinha.init=function(){
-Xinha.onload();
-};
-Xinha.RE_tagName=/(<\/|<)\s*([^ \t\n>]+)/ig;
-Xinha.RE_doctype=/(<!doctype((.|\n)*?)>)\n?/i;
-Xinha.RE_head=/<head>((.|\n)*?)<\/head>/i;
-Xinha.RE_body=/<body[^>]*>((.|\n|\r|\t)*?)<\/body>/i;
-Xinha.RE_Specials=/([\/\^$*+?.()|{}\[\]])/g;
-Xinha.escapeStringForRegExp=function(_a){
-return _a.replace(Xinha.RE_Specials,"\\$1");
-};
-Xinha.RE_email=/^[_a-z\d\-\.]{3,}@[_a-z\d\-]{2,}(\.[_a-z\d\-]{2,})+$/i;
-Xinha.RE_url=/(https?:\/\/)?(([a-z0-9_]+:[a-z0-9_]+@)?[a-z0-9_\-]{2,}(\.[a-z0-9_\-]{2,}){2,}(:[0-9]+)?(\/\S+)*)/i;
-Xinha.Config=function(){
-this.version=Xinha.version.Revision;
-this.width="auto";
-this.height="auto";
-this.sizeIncludesBars=true;
-this.sizeIncludesPanels=true;
-this.panel_dimensions={left:"200px",right:"200px",top:"100px",bottom:"100px"};
-this.iframeWidth=null;
-this.statusBar=true;
-this.htmlareaPaste=false;
-this.mozParaHandler="best";
-this.getHtmlMethod="DOMwalk";
-this.undoSteps=20;
-this.undoTimeout=500;
-this.changeJustifyWithDirection=false;
-this.fullPage=false;
-this.pageStyle="";
-this.pageStyleSheets=[];
-this.baseHref=null;
-this.expandRelativeUrl=true;
-this.stripBaseHref=true;
-this.stripSelfNamedAnchors=true;
-this.only7BitPrintablesInURLs=true;
-this.sevenBitClean=false;
-this.specialReplacements={};
-this.inwardHtml=function(_b){
-return _b;
-};
-this.outwardHtml=function(_c){
-return _c;
-};
-this.autofocus=false;
-this.killWordOnPaste=true;
-this.makeLinkShowsTarget=true;
-this.charSet=(typeof document.characterSet!="undefined")?document.characterSet:document.charset;
-this.browserQuirksMode=null;
-this.imgURL="images/";
-this.popupURL="popups/";
-this.htmlRemoveTags=null;
-this.flowToolbars=true;
-this.toolbarAlign="left";
-this.showFontStylesInToolbar=false;
-this.showLoading=false;
-this.stripScripts=true;
-this.convertUrlsToLinks=true;
-this.colorPickerCellSize="6px";
-this.colorPickerGranularity=18;
-this.colorPickerPosition="bottom,right";
-this.colorPickerWebSafe=false;
-this.colorPickerSaveColors=20;
-this.fullScreen=false;
-this.fullScreenMargins=[0,0,0,0];
-this.fullScreenSizeDownMethod="initSize";
-this.toolbar=[["popupeditor"],["separator","formatblock","fontname","fontsize","bold","italic","underline","strikethrough"],["separator","forecolor","hilitecolor","textindicator"],["separator","subscript","superscript"],["linebreak","separator","justifyleft","justifycenter","justifyright","justifyfull"],["separator","insertorderedlist","insertunorderedlist","outdent","indent"],["separator","inserthorizontalrule","createlink","insertimage","inserttable"],["linebreak","separator","undo","redo","selectall","print"],(Xinha.is_gecko?[]:["cut","copy","paste","overwrite","saveas"]),["separator","killword","clearfonts","removeformat","toggleborders","splitblock","lefttoright","righttoleft"],["separator","htmlmode","showhelp","about"]];
-this.fontname={"&#8212; font &#8212;":"","Arial":"arial,helvetica,sans-serif","Courier New":"courier new,courier,monospace","Georgia":"georgia,times new roman,times,serif","Tahoma":"tahoma,arial,helvetica,sans-serif","Times New Roman":"times new roman,times,serif","Verdana":"verdana,arial,helvetica,sans-serif","impact":"impact","WingDings":"wingdings"};
-this.fontsize={"&#8212; size &#8212;":"","1 (8 pt)":"1","2 (10 pt)":"2","3 (12 pt)":"3","4 (14 pt)":"4","5 (18 pt)":"5","6 (24 pt)":"6","7 (36 pt)":"7"};
-this.formatblock={"&#8212; format &#8212;":"","Heading 1":"h1","Heading 2":"h2","Heading 3":"h3","Heading 4":"h4","Heading 5":"h5","Heading 6":"h6","Normal":"p","Address":"address","Formatted":"pre"};
-this.dialogOptions={"centered":true,"greyout":true,"closeOnEscape":true};
-this.Events={};
-this.customSelects={};
-this.debug=false;
-this.URIs={"blank":_editor_url+"popups/blank.html","link":_editor_url+"modules/CreateLink/link.html","insert_image":_editor_url+"modules/InsertImage/insert_image.html","insert_table":_editor_url+"modules/InsertTable/insert_table.html","select_color":_editor_url+"popups/select_color.html","help":_editor_url+"popups/editor_help.html"};
-this.btnList={bold:["Bold",Xinha._lc({key:"button_bold",string:["ed_buttons_main.png",3,2]},"Xinha"),false,function(e){
-e.execCommand("bold");
-}],italic:["Italic",Xinha._lc({key:"button_italic",string:["ed_buttons_main.png",2,2]},"Xinha"),false,function(e){
-e.execCommand("italic");
-}],underline:["Underline",Xinha._lc({key:"button_underline",string:["ed_buttons_main.png",2,0]},"Xinha"),false,function(e){
-e.execCommand("underline");
-}],strikethrough:["Strikethrough",Xinha._lc({key:"button_strikethrough",string:["ed_buttons_main.png",3,0]},"Xinha"),false,function(e){
-e.execCommand("strikethrough");
-}],subscript:["Subscript",Xinha._lc({key:"button_subscript",string:["ed_buttons_main.png",3,1]},"Xinha"),false,function(e){
-e.execCommand("subscript");
-}],superscript:["Superscript",Xinha._lc({key:"button_superscript",string:["ed_buttons_main.png",2,1]},"Xinha"),false,function(e){
-e.execCommand("superscript");
-}],justifyleft:["Justify Left",["ed_buttons_main.png",0,0],false,function(e){
-e.execCommand("justifyleft");
-}],justifycenter:["Justify Center",["ed_buttons_main.png",1,1],false,function(e){
-e.execCommand("justifycenter");
-}],justifyright:["Justify Right",["ed_buttons_main.png",1,0],false,function(e){
-e.execCommand("justifyright");
-}],justifyfull:["Justify Full",["ed_buttons_main.png",0,1],false,function(e){
-e.execCommand("justifyfull");
-}],orderedlist:["Ordered List",["ed_buttons_main.png",0,3],false,function(e){
-e.execCommand("insertorderedlist");
-}],unorderedlist:["Bulleted List",["ed_buttons_main.png",1,3],false,function(e){
-e.execCommand("insertunorderedlist");
-}],insertorderedlist:["Ordered List",["ed_buttons_main.png",0,3],false,function(e){
-e.execCommand("insertorderedlist");
-}],insertunorderedlist:["Bulleted List",["ed_buttons_main.png",1,3],false,function(e){
-e.execCommand("insertunorderedlist");
-}],outdent:["Decrease Indent",["ed_buttons_main.png",1,2],false,function(e){
-e.execCommand("outdent");
-}],indent:["Increase Indent",["ed_buttons_main.png",0,2],false,function(e){
-e.execCommand("indent");
-}],forecolor:["Font Color",["ed_buttons_main.png",3,3],false,function(e){
-e.execCommand("forecolor");
-}],hilitecolor:["Background Color",["ed_buttons_main.png",2,3],false,function(e){
-e.execCommand("hilitecolor");
-}],undo:["Undoes your last action",["ed_buttons_main.png",4,2],false,function(e){
-e.execCommand("undo");
-}],redo:["Redoes your last action",["ed_buttons_main.png",5,2],false,function(e){
-e.execCommand("redo");
-}],cut:["Cut selection",["ed_buttons_main.png",5,0],false,function(e,cmd){
-e.execCommand(cmd);
-}],copy:["Copy selection",["ed_buttons_main.png",4,0],false,function(e,cmd){
-e.execCommand(cmd);
-}],paste:["Paste from clipboard",["ed_buttons_main.png",4,1],false,function(e,cmd){
-e.execCommand(cmd);
-}],selectall:["Select all",["ed_buttons_main.png",3,5],false,function(e){
-e.execCommand("selectall");
-}],inserthorizontalrule:["Horizontal Rule",["ed_buttons_main.png",6,0],false,function(e){
-e.execCommand("inserthorizontalrule");
-}],createlink:["Insert Web Link",["ed_buttons_main.png",6,1],false,function(e){
-e._createLink();
-}],insertimage:["Insert/Modify Image",["ed_buttons_main.png",6,3],false,function(e){
-e.execCommand("insertimage");
-}],inserttable:["Insert Table",["ed_buttons_main.png",6,2],false,function(e){
-e.execCommand("inserttable");
-}],htmlmode:["Toggle HTML Source",["ed_buttons_main.png",7,0],true,function(e){
-e.execCommand("htmlmode");
-}],toggleborders:["Toggle Borders",["ed_buttons_main.png",7,2],false,function(e){
-e._toggleBorders();
-}],print:["Print document",["ed_buttons_main.png",8,1],false,function(e){
-if(Xinha.is_gecko){
-e._iframe.contentWindow.print();
-}else{
-e.focusEditor();
-print();
-}
-}],saveas:["Save as",["ed_buttons_main.png",9,1],false,function(e){
-e.execCommand("saveas",false,"noname.htm");
-}],about:["About this editor",["ed_buttons_main.png",8,2],true,function(e){
-e.getPluginInstance("AboutBox").show();
-}],showhelp:["Help using editor",["ed_buttons_main.png",9,2],true,function(e){
-e.execCommand("showhelp");
-}],splitblock:["Split Block","ed_splitblock.gif",false,function(e){
-e._splitBlock();
-}],lefttoright:["Direction left to right",["ed_buttons_main.png",0,2],false,function(e){
-e.execCommand("lefttoright");
-}],righttoleft:["Direction right to left",["ed_buttons_main.png",1,2],false,function(e){
-e.execCommand("righttoleft");
-}],overwrite:["Insert/Overwrite","ed_overwrite.gif",false,function(e){
-e.execCommand("overwrite");
-}],wordclean:["MS Word Cleaner",["ed_buttons_main.png",5,3],false,function(e){
-e._wordClean();
-}],clearfonts:["Clear Inline Font Specifications",["ed_buttons_main.png",5,4],true,function(e){
-e._clearFonts();
-}],removeformat:["Remove formatting",["ed_buttons_main.png",4,4],false,function(e){
-e.execCommand("removeformat");
-}],killword:["Clear MSOffice tags",["ed_buttons_main.png",4,3],false,function(e){
-e.execCommand("killword");
-}]};
-this.dblclickList={"a":[function(e,_3b){
-e._createLink(_3b);
-}],"img":[function(e,_3d){
-e._insertImage(_3d);
-}]};
-this.iconList={dialogCaption:_editor_url+"images/xinha-small-icon.gif",wysiwygmode:[_editor_url+"images/ed_buttons_main.png",7,1]};
-for(var i in this.btnList){
-var btn=this.btnList[i];
-if(typeof btn!="object"){
-continue;
-}
-if(typeof btn[1]!="string"){
-btn[1][0]=_editor_url+this.imgURL+btn[1][0];
-}else{
-btn[1]=_editor_url+this.imgURL+btn[1];
-}
-btn[0]=Xinha._lc(btn[0]);
-}
-};
-Xinha.Config.prototype.registerIcon=function(id,_41){
-this.iconList[id]=_41;
-};
-Xinha.Config.prototype.registerButton=function(id,_43,_44,_45,_46,_47){
-if(typeof id=="string"){
-this.btnList[id]=[_43,_44,_45,_46,_47];
-}else{
-if(typeof id=="object"){
-this.btnList[id.id]=[id.tooltip,id.image,id.textMode,id.action,id.context];
-}else{
-alert("ERROR [Xinha.Config::registerButton]:\ninvalid arguments");
-return false;
-}
-}
-};
-Xinha.prototype.registerPanel=function(_48,_49){
-if(!_48){
-_48="right";
-}
-this.setLoadingMessage("Register "+_48+" panel ");
-var _4a=this.addPanel(_48);
-if(_49){
-_49.drawPanelIn(_4a);
-}
-};
-Xinha.Config.prototype.registerDropdown=function(_4b){
-this.customSelects[_4b.id]=_4b;
-};
-Xinha.Config.prototype.hideSomeButtons=function(_4c){
-var _4d=this.toolbar;
-for(var i=_4d.length;--i>=0;){
-var _4f=_4d[i];
-for(var j=_4f.length;--j>=0;){
-if(_4c.indexOf(" "+_4f[j]+" ")>=0){
-var len=1;
-if(/separator|space/.test(_4f[j+1])){
-len=2;
-}
-_4f.splice(j,len);
-}
-}
-}
-};
-Xinha.Config.prototype.addToolbarElement=function(id,_53,_54){
-var _55=this.toolbar;
-var a,i,j,o,sid;
-var _5b=false;
-var _5c=false;
-var _5d=0;
-var _5e=0;
-var _5f=0;
-var _60=false;
-var _61=false;
-if((id&&typeof id=="object")&&(id.constructor==Array)){
-_5b=true;
-}
-if((_53&&typeof _53=="object")&&(_53.constructor==Array)){
-_5c=true;
-_5d=_53.length;
-}
-if(_5b){
-for(i=0;i<id.length;++i){
-if((id[i]!="separator")&&(id[i].indexOf("T[")!==0)){
-sid=id[i];
-}
-}
-}else{
-sid=id;
-}
-for(i=0;i<_55.length;++i){
-a=_55[i];
-for(j=0;j<a.length;++j){
-if(a[j]==sid){
-return;
-}
-}
-}
-for(i=0;!_61&&i<_55.length;++i){
-a=_55[i];
-for(j=0;!_61&&j<a.length;++j){
-if(_5c){
-for(o=0;o<_5d;++o){
-if(a[j]==_53[o]){
-if(o===0){
-_61=true;
-j--;
-break;
-}else{
-_5f=i;
-_5e=j;
-_5d=o;
-}
-}
-}
-}else{
-if(a[j]==_53){
-_61=true;
-break;
-}
-}
-}
-}
-if(!_61&&_5c){
-if(_53.length!=_5d){
-j=_5e;
-a=_55[_5f];
-_61=true;
-}
-}
-if(_61){
-if(_54===0){
-if(_5b){
-a[j]=id[id.length-1];
-for(i=id.length-1;--i>=0;){
-a.splice(j,0,id[i]);
-}
-}else{
-a[j]=id;
-}
-}else{
-if(_54<0){
-j=j+_54+1;
-}else{
-if(_54>0){
-j=j+_54;
-}
-}
-if(_5b){
-for(i=id.length;--i>=0;){
-a.splice(j,0,id[i]);
-}
-}else{
-a.splice(j,0,id);
-}
-}
-}else{
-_55[0].splice(0,0,"separator");
-if(_5b){
-for(i=id.length;--i>=0;){
-_55[0].splice(0,0,id[i]);
-}
-}else{
-_55[0].splice(0,0,id);
-}
-}
-};
-Xinha.Config.prototype.removeToolbarElement=Xinha.Config.prototype.hideSomeButtons;
-Xinha.replaceAll=function(_62){
-var tas=document.getElementsByTagName("textarea");
-for(var i=tas.length;i>0;new Xinha(tas[--i],_62).generate()){
-}
-};
-Xinha.replace=function(id,_66){
-var ta=Xinha.getElementById("textarea",id);
-return ta?new Xinha(ta,_66).generate():null;
-};
-Xinha.prototype._createToolbar=function(){
-this.setLoadingMessage(Xinha._lc("Create Toolbar"));
-var _68=this;
-var _69=document.createElement("div");
-this._toolBar=this._toolbar=_69;
-_69.className="toolbar";
-_69.align=this.config.toolbarAlign;
-Xinha.freeLater(this,"_toolBar");
-Xinha.freeLater(this,"_toolbar");
-var _6a=null;
-var _6b={};
-this._toolbarObjects=_6b;
-this._createToolbar1(_68,_69,_6b);
-function noselect(e){
-if(e.tagName){
-e.unselectable="on";
-}
-if(e.childNodes){
-for(var i=0;i<e.childNodes.length;i++){
-if(e.tagName){
-noselect(e.childNodes(i));
-}
-}
-}
-};
-if(Xinha.is_ie){
-noselect(_69);
-}
-this._htmlArea.appendChild(_69);
-return _69;
-};
-Xinha.prototype._setConfig=function(_6e){
-this.config=_6e;
-};
-Xinha.prototype._rebuildToolbar=function(){
-this._createToolbar1(this,this._toolbar,this._toolbarObjects);
-if(Xinha._currentlyActiveEditor){
-if(Xinha._currentlyActiveEditor==this){
-this.activateEditor();
-}
-}else{
-this.disableToolbar();
-}
-};
-Xinha._createToolbarBreakingElement=function(){
-var brk=document.createElement("div");
-brk.style.height="1px";
-brk.style.width="1px";
-brk.style.lineHeight="1px";
-brk.style.fontSize="1px";
-brk.style.clear="both";
-return brk;
-};
-Xinha.prototype._createToolbar1=function(_70,_71,_72){
-while(_71.lastChild){
-_71.removeChild(_71.lastChild);
-}
-var _73;
-if(_70.config.flowToolbars){
-_71.appendChild(Xinha._createToolbarBreakingElement());
-}
-function newLine(){
-if(typeof _73!="undefined"&&_73.childNodes.length===0){
-return;
-}
-var _74=document.createElement("table");
-_74.border="0px";
-_74.cellSpacing="0px";
-_74.cellPadding="0px";
-if(_70.config.flowToolbars){
-if(Xinha.is_ie){
-_74.style.styleFloat="left";
-}else{
-_74.style.cssFloat="left";
-}
-}
-_71.appendChild(_74);
-var _75=document.createElement("tbody");
-_74.appendChild(_75);
-_73=document.createElement("tr");
-_75.appendChild(_73);
-_74.className="toolbarRow";
-};
-newLine();
-function setButtonStatus(id,_77){
-var _78=this[id];
-var el=this.element;
-if(_78!=_77){
-switch(id){
-case "enabled":
-if(_77){
-Xinha._removeClass(el,"buttonDisabled");
-el.disabled=false;
-}else{
-Xinha._addClass(el,"buttonDisabled");
-el.disabled=true;
-}
-break;
-case "active":
-if(_77){
-Xinha._addClass(el,"buttonPressed");
-}else{
-Xinha._removeClass(el,"buttonPressed");
-}
-break;
-}
-this[id]=_77;
-}
-};
-function createSelect(txt){
-var _7b=null;
-var el=null;
-var cmd=null;
-var _7e=_70.config.customSelects;
-var _7f=null;
-var _80="";
-switch(txt){
-case "fontsize":
-case "fontname":
-case "formatblock":
-_7b=_70.config[txt];
-cmd=txt;
-break;
-default:
-cmd=txt;
-var _81=_7e[cmd];
-if(typeof _81!="undefined"){
-_7b=_81.options;
-_7f=_81.context;
-if(typeof _81.tooltip!="undefined"){
-_80=_81.tooltip;
-}
-}else{
-alert("ERROR [createSelect]:\nCan't find the requested dropdown definition");
-}
-break;
-}
-if(_7b){
-el=document.createElement("select");
-el.title=_80;
-el.style.width="auto";
-el.name=txt;
-var obj={name:txt,element:el,enabled:true,text:false,cmd:cmd,state:setButtonStatus,context:_7f};
-Xinha.freeLater(obj);
-_72[txt]=obj;
-for(var i in _7b){
-if(typeof _7b[i]!="string"){
-continue;
-}
-var op=document.createElement("option");
-op.innerHTML=Xinha._lc(i);
-op.value=_7b[i];
-if(txt=="fontname"&&_70.config.showFontStylesInToolbar){
-op.style.fontFamily=_7b[i];
-}
-el.appendChild(op);
-}
-Xinha._addEvent(el,"change",function(){
-_70._comboSelected(el,txt);
-});
-}
-return el;
-};
-function createButton(txt){
-var el,btn,obj=null;
-switch(txt){
-case "separator":
-if(_70.config.flowToolbars){
-newLine();
-}
-el=document.createElement("div");
-el.className="separator";
-break;
-case "space":
-el=document.createElement("div");
-el.className="space";
-break;
-case "linebreak":
-newLine();
-return false;
-case "textindicator":
-el=document.createElement("div");
-el.appendChild(document.createTextNode("A"));
-el.className="indicator";
-el.title=Xinha._lc("Current style");
-obj={name:txt,element:el,enabled:true,active:false,text:false,cmd:"textindicator",state:setButtonStatus};
-Xinha.freeLater(obj);
-_72[txt]=obj;
-break;
-default:
-btn=_70.config.btnList[txt];
-}
-if(!el&&btn){
-el=document.createElement("a");
-el.style.display="block";
-el.href="javascript:void(0)";
-el.style.textDecoration="none";
-el.title=btn[0];
-el.className="button";
-el.style.direction="ltr";
-obj={name:txt,element:el,enabled:true,active:false,text:btn[2],cmd:btn[3],state:setButtonStatus,context:btn[4]||null};
-Xinha.freeLater(el);
-Xinha.freeLater(obj);
-_72[txt]=obj;
-el.ondrag=function(){
-return false;
-};
-Xinha._addEvent(el,"mouseout",function(ev){
-if(obj.enabled){
-Xinha._removeClass(el,"buttonActive");
-if(obj.active){
-Xinha._addClass(el,"buttonPressed");
-}
-}
-});
-Xinha._addEvent(el,"mousedown",function(ev){
-if(obj.enabled){
-Xinha._addClass(el,"buttonActive");
-Xinha._removeClass(el,"buttonPressed");
-Xinha._stopEvent(Xinha.is_ie?window.event:ev);
-}
-});
-Xinha._addEvent(el,"click",function(ev){
-ev=ev||window.event;
-_70.btnClickEvent={clientX:ev.clientX,clientY:ev.clientY};
-if(obj.enabled){
-Xinha._removeClass(el,"buttonActive");
-if(Xinha.is_gecko){
-_70.activateEditor();
-}
-obj.cmd(_70,obj.name,obj,ev);
-Xinha._stopEvent(ev);
-}
-});
-var _8c=Xinha.makeBtnImg(btn[1]);
-var img=_8c.firstChild;
-Xinha.freeLater(_8c);
-Xinha.freeLater(img);
-el.appendChild(_8c);
-obj.imgel=img;
-obj.swapImage=function(_8e){
-if(typeof _8e!="string"){
-img.src=_8e[0];
-img.style.position="relative";
-img.style.top=_8e[2]?("-"+(18*(_8e[2]+1))+"px"):"-18px";
-img.style.left=_8e[1]?("-"+(18*(_8e[1]+1))+"px"):"-18px";
-}else{
-obj.imgel.src=_8e;
-img.style.top="0px";
-img.style.left="0px";
-}
-};
-}else{
-if(!el){
-el=createSelect(txt);
-}
-}
-return el;
-};
-var _8f=true;
-for(var i=0;i<this.config.toolbar.length;++i){
-if(!_8f){
-}else{
-_8f=false;
-}
-if(this.config.toolbar[i]===null){
-this.config.toolbar[i]=["separator"];
-}
-var _91=this.config.toolbar[i];
-for(var j=0;j<_91.length;++j){
-var _93=_91[j];
-var _94;
-if(/^([IT])\[(.*?)\]/.test(_93)){
-var _95=RegExp.$1=="I";
-var _96=RegExp.$2;
-if(_95){
-_96=Xinha._lc(_96);
-}
-_94=document.createElement("td");
-_73.appendChild(_94);
-_94.className="label";
-_94.innerHTML=_96;
-}else{
-if(typeof _93!="function"){
-var _97=createButton(_93);
-if(_97){
-_94=document.createElement("td");
-_94.className="toolbarElement";
-_73.appendChild(_94);
-_94.appendChild(_97);
-}else{
-if(_97===null){
-alert("FIXME: Unknown toolbar item: "+_93);
-}
-}
-}
-}
-}
-}
-if(_70.config.flowToolbars){
-_71.appendChild(Xinha._createToolbarBreakingElement());
-}
-return _71;
-};
-Xinha.makeBtnImg=function(_98,doc){
-if(!doc){
-doc=document;
-}
-if(!doc._xinhaImgCache){
-doc._xinhaImgCache={};
-Xinha.freeLater(doc._xinhaImgCache);
-}
-var _9a=null;
-if(Xinha.is_ie&&((!doc.compatMode)||(doc.compatMode&&doc.compatMode=="BackCompat"))){
-_9a=doc.createElement("span");
-}else{
-_9a=doc.createElement("div");
-_9a.style.position="relative";
-}
-_9a.style.overflow="hidden";
-_9a.style.width="18px";
-_9a.style.height="18px";
-_9a.className="buttonImageContainer";
-var img=null;
-if(typeof _98=="string"){
-if(doc._xinhaImgCache[_98]){
-img=doc._xinhaImgCache[_98].cloneNode();
-}else{
-if(Xinha.ie_version<7&&/\.png$/.test(_98[0])){
-img=doc.createElement("span");
-img.style.display="block";
-img.style.width="18px";
-img.style.height="18px";
-img.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\""+_98+"\")";
-img.unselectable="on";
-}else{
-img=doc.createElement("img");
-img.src=_98;
-}
-}
-}else{
-if(doc._xinhaImgCache[_98[0]]){
-img=doc._xinhaImgCache[_98[0]].cloneNode();
-}else{
-if(Xinha.ie_version<7&&/\.png$/.test(_98[0])){
-img=doc.createElement("span");
-img.style.display="block";
-img.style.width="18px";
-img.style.height="18px";
-img.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\""+_98[0]+"\")";
-img.unselectable="on";
-}else{
-img=doc.createElement("img");
-img.src=_98[0];
-}
-img.style.position="relative";
-}
-img.style.top=_98[2]?("-"+(18*(_98[2]+1))+"px"):"-18px";
-img.style.left=_98[1]?("-"+(18*(_98[1]+1))+"px"):"-18px";
-}
-_9a.appendChild(img);
-return _9a;
-};
-Xinha.prototype._createStatusBar=function(){
-this.setLoadingMessage(Xinha._lc("Create Statusbar"));
-var _9c=document.createElement("div");
-_9c.style.position="relative";
-_9c.className="statusBar";
-_9c.style.width="100%";
-Xinha.freeLater(this,"_statusBar");
-var _9d=document.createElement("div");
-_9d.className="statusBarWidgetContainer";
-_9d.style.position="absolute";
-_9d.style.right="0";
-_9d.style.top="0";
-_9d.style.padding="3px 3px 3px 10px";
-_9c.appendChild(_9d);
-var _9e=document.createElement("span");
-_9e.className="statusBarTree";
-_9e.innerHTML=Xinha._lc("Path")+": ";
-this._statusBarTree=_9e;
-Xinha.freeLater(this,"_statusBarTree");
-_9c.appendChild(_9e);
-var _9f=document.createElement("span");
-_9f.innerHTML=Xinha.htmlEncode(Xinha._lc("You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG."));
-_9f.style.display="none";
-this._statusBarTextMode=_9f;
-Xinha.freeLater(this,"_statusBarTextMode");
-_9c.appendChild(_9f);
-_9c.style.whiteSpace="nowrap";
-var _a0=this;
-this.notifyOn("before_resize",function(evt,_a2){
-_a0._statusBar.style.width=null;
-});
-this.notifyOn("resize",function(evt,_a4){
-if(Xinha.is_ie&&Xinha.ie_version==6){
-_a0._statusBar.style.width="100%";
-}else{
-var _a5=_a4["width"];
-_a0._statusBar.style.width=_a5+"px";
-}
-});
-this.notifyOn("modechange",function(evt,_a7){
-for(var i in _a0._statusWidgets){
-var _a9=_a0._statusWidgets[i];
-for(var _aa=0;_aa<_a9.modes.length;_aa++){
-if(_a9.modes[_aa]==_a7.mode){
-var _ab=true;
-}
-}
-if(typeof _ab=="undefined"){
-_a9.block.style.display="none";
-}else{
-_a9.block.style.display="";
-}
-}
-});
-if(!this.config.statusBar){
-_9c.style.display="none";
-}
-return _9c;
-};
-Xinha.prototype.registerStatusWidget=function(id,_ad){
-_ad=_ad||["wysiwyg"];
-if(!this._statusWidgets){
-this._statusWidgets={};
-}
-var _ae=document.createElement("div");
-_ae.className="statusBarWidget";
-_ae=this._statusBar.firstChild.appendChild(_ae);
-var _af=false;
-for(var i=0;i<_ad.length;i++){
-if(_ad[i]==this._editMode){
-_af=true;
-}
-}
-_ae.style.display=_af==true?"":"none";
-this._statusWidgets[id]={block:_ae,modes:_ad};
-return _ae;
-};
-Xinha.prototype.generate=function(){
-if(!Xinha.isSupportedBrowser){
-return;
-}
-var i;
-var _b2=this;
-var url;
-var _b4=false;
-var _b5=document.getElementsByTagName("link");
-if(!document.getElementById("XinhaCoreDesign")){
-_editor_css=(typeof _editor_css=="string")?_editor_css:"Xinha.css";
-for(i=0;i<_b5.length;i++){
-if((_b5[i].rel=="stylesheet")&&(_b5[i].href==_editor_url+_editor_css)){
-_b4=true;
-}
-}
-if(!_b4){
-Xinha.loadStyle(_editor_css,null,"XinhaCoreDesign",true);
-}
-}
-if(_editor_skin!==""&&!document.getElementById("XinhaSkin")){
-_b4=false;
-for(i=0;i<_b5.length;i++){
-if((_b5[i].rel=="stylesheet")&&(_b5[i].href==_editor_url+"skins/"+_editor_skin+"/skin.css")){
-_b4=true;
-}
-}
-if(!_b4){
-Xinha.loadStyle("skins/"+_editor_skin+"/skin.css",null,"XinhaSkin");
-}
-}
-var _b6=function(){
-_b2.generate();
-};
-if(Xinha.is_ie){
-url=_editor_url+"modules/InternetExplorer/InternetExplorer.js";
-if(!Xinha.loadPlugins([{plugin:"InternetExplorer",url:url}],_b6)){
-return false;
-}
-if(!this.plugins.InternetExplorer){
-_b2._browserSpecificPlugin=_b2.registerPlugin("InternetExplorer");
-}
-}else{
-if(Xinha.is_webkit){
-url=_editor_url+"modules/WebKit/WebKit.js";
-if(!Xinha.loadPlugins([{plugin:"WebKit",url:url}],_b6)){
-return false;
-}
-if(!this.plugins.Webkit){
-_b2._browserSpecificPlugin=_b2.registerPlugin("WebKit");
-}
-}else{
-if(Xinha.is_opera){
-url=_editor_url+"modules/Opera/Opera.js";
-if(!Xinha.loadPlugins([{plugin:"Opera",url:url}],_b6)){
-return false;
-}
-if(!this.plugins.Opera){
-_b2._browserSpecificPlugin=_b2.registerPlugin("Opera");
-}
-}else{
-if(Xinha.is_gecko){
-url=_editor_url+"modules/Gecko/Gecko.js";
-if(!Xinha.loadPlugins([{plugin:"Gecko",url:url}],_b6)){
-return false;
-}
-if(!this.plugins.Gecko){
-_b2._browserSpecificPlugin=_b2.registerPlugin("Gecko");
-}
-}
-}
-}
-}
-if(typeof Dialog=="undefined"&&!Xinha._loadback(_editor_url+"modules/Dialogs/dialog.js",_b6,this)){
-return false;
-}
-if(typeof Xinha.Dialog=="undefined"&&!Xinha._loadback(_editor_url+"modules/Dialogs/XinhaDialog.js",_b6,this)){
-return false;
-}
-url=_editor_url+"modules/FullScreen/full-screen.js";
-if(!Xinha.loadPlugins([{plugin:"FullScreen",url:url}],_b6)){
-return false;
-}
-url=_editor_url+"modules/ColorPicker/ColorPicker.js";
-if(!Xinha.loadPlugins([{plugin:"ColorPicker",url:url}],_b6)){
-return false;
-}else{
-if(typeof Xinha.getPluginConstructor("ColorPicker")!="undefined"&&!this.plugins.colorPicker){
-_b2.registerPlugin("ColorPicker");
-}
-}
-var _b7=_b2.config.toolbar;
-for(i=_b7.length;--i>=0;){
-for(var j=_b7[i].length;--j>=0;){
-switch(_b7[i][j]){
-case "popupeditor":
-if(!this.plugins.FullScreen){
-_b2.registerPlugin("FullScreen");
-}
-break;
-case "insertimage":
-url=_editor_url+"modules/InsertImage/insert_image.js";
-if(typeof Xinha.prototype._insertImage=="undefined"&&!Xinha.loadPlugins([{plugin:"InsertImage",url:url}],_b6)){
-return false;
-}else{
-if(typeof Xinha.getPluginConstructor("InsertImage")!="undefined"&&!this.plugins.InsertImage){
-_b2.registerPlugin("InsertImage");
-}
-}
-break;
-case "createlink":
-url=_editor_url+"modules/CreateLink/link.js";
-if(typeof Xinha.getPluginConstructor("Linker")=="undefined"&&!Xinha.loadPlugins([{plugin:"CreateLink",url:url}],_b6)){
-return false;
-}else{
-if(typeof Xinha.getPluginConstructor("CreateLink")!="undefined"&&!this.plugins.CreateLink){
-_b2.registerPlugin("CreateLink");
-}
-}
-break;
-case "inserttable":
-url=_editor_url+"modules/InsertTable/insert_table.js";
-if(!Xinha.loadPlugins([{plugin:"InsertTable",url:url}],_b6)){
-return false;
-}else{
-if(typeof Xinha.getPluginConstructor("InsertTable")!="undefined"&&!this.plugins.InsertTable){
-_b2.registerPlugin("InsertTable");
-}
-}
-break;
-case "about":
-url=_editor_url+"modules/AboutBox/AboutBox.js";
-if(!Xinha.loadPlugins([{plugin:"AboutBox",url:url}],_b6)){
-return false;
-}else{
-if(typeof Xinha.getPluginConstructor("AboutBox")!="undefined"&&!this.plugins.AboutBox){
-_b2.registerPlugin("AboutBox");
-}
-}
-break;
-}
-}
-}
-if(Xinha.is_gecko&&_b2.config.mozParaHandler!="built-in"){
-if(!Xinha.loadPlugins([{plugin:"EnterParagraphs",url:_editor_url+"modules/Gecko/paraHandlerBest.js"}],_b6)){
-return false;
-}
-if(!this.plugins.EnterParagraphs){
-_b2.registerPlugin("EnterParagraphs");
-}
-}
-var _b9=this.config.getHtmlMethod=="TransformInnerHTML"?_editor_url+"modules/GetHtml/TransformInnerHTML.js":_editor_url+"modules/GetHtml/DOMwalk.js";
-if(!Xinha.loadPlugins([{plugin:"GetHtmlImplementation",url:_b9}],_b6)){
-return false;
-}else{
-if(!this.plugins.GetHtmlImplementation){
-_b2.registerPlugin("GetHtmlImplementation");
-}
-}
-function getTextContent(_ba){
-return _ba.textContent||_ba.text;
-};
-if(_editor_skin){
-this.skinInfo={};
-var _bb=Xinha._geturlcontent(_editor_url+"skins/"+_editor_skin+"/skin.xml",true);
-if(_bb){
-var _bc=_bb.getElementsByTagName("meta");
-for(i=0;i<_bc.length;i++){
-this.skinInfo[_bc[i].getAttribute("name")]=_bc[i].getAttribute("value");
-}
-var _bd=_bb.getElementsByTagName("recommendedIcons");
-if(!_editor_icons&&_bd.length&&getTextContent(_bd[0])){
-_editor_icons=getTextContent(_bd[0]);
-}
-}
-}
-if(_editor_icons){
-var _be=Xinha._geturlcontent(_editor_url+"iconsets/"+_editor_icons+"/iconset.xml",true);
-if(_be){
-var _bf=_be.getElementsByTagName("icon");
-var _c0,id,_c2,_c3,x,y;
-for(i=0;i<_bf.length;i++){
-_c0=_bf[i];
-id=_c0.getAttribute("id");
-if(_c0.getElementsByTagName(_editor_lang).length){
-_c0=_c0.getElementsByTagName(_editor_lang)[0];
-}else{
-_c0=_c0.getElementsByTagName("default")[0];
-}
-_c2=getTextContent(_c0.getElementsByTagName("path")[0]);
-_c2=(!/^\//.test(_c2)?_editor_url:"")+_c2;
-_c3=_c0.getAttribute("type");
-if(_c3=="map"){
-x=parseInt(getTextContent(_c0.getElementsByTagName("x")[0]),10);
-y=parseInt(getTextContent(_c0.getElementsByTagName("y")[0]),10);
-if(this.config.btnList[id]){
-this.config.btnList[id][1]=[_c2,x,y];
-}
-if(this.config.iconList[id]){
-this.config.iconList[id]=[_c2,x,y];
-}
-}else{
-if(this.config.btnList[id]){
-this.config.btnList[id][1]=_c2;
-}
-if(this.config.iconList[id]){
-this.config.iconList[id]=_c2;
-}
-}
-}
-}
-}
-this.setLoadingMessage(Xinha._lc("Generate Xinha framework"));
-this._framework={"table":document.createElement("table"),"tbody":document.createElement("tbody"),"tb_row":document.createElement("tr"),"tb_cell":document.createElement("td"),"tp_row":document.createElement("tr"),"tp_cell":this._panels.top.container,"ler_row":document.createElement("tr"),"lp_cell":this._panels.left.container,"ed_cell":document.createElement("td"),"rp_cell":this._panels.right.container,"bp_row":document.createElement("tr"),"bp_cell":this._panels.bottom.container,"sb_row":document.createElement("tr"),"sb_cell":document.createElement("td")};
-Xinha.freeLater(this._framework);
-var fw=this._framework;
-fw.table.border="0";
-fw.table.cellPadding="0";
-fw.table.cellSpacing="0";
-fw.tb_row.style.verticalAlign="top";
-fw.tp_row.style.verticalAlign="top";
-fw.ler_row.style.verticalAlign="top";
-fw.bp_row.style.verticalAlign="top";
-fw.sb_row.style.verticalAlign="top";
-fw.ed_cell.style.position="relative";
-fw.tb_row.appendChild(fw.tb_cell);
-fw.tb_cell.colSpan=3;
-fw.tp_row.appendChild(fw.tp_cell);
-fw.tp_cell.colSpan=3;
-fw.ler_row.appendChild(fw.lp_cell);
-fw.ler_row.appendChild(fw.ed_cell);
-fw.ler_row.appendChild(fw.rp_cell);
-fw.bp_row.appendChild(fw.bp_cell);
-fw.bp_cell.colSpan=3;
-fw.sb_row.appendChild(fw.sb_cell);
-fw.sb_cell.colSpan=3;
-fw.tbody.appendChild(fw.tb_row);
-fw.tbody.appendChild(fw.tp_row);
-fw.tbody.appendChild(fw.ler_row);
-fw.tbody.appendChild(fw.bp_row);
-fw.tbody.appendChild(fw.sb_row);
-fw.table.appendChild(fw.tbody);
-var _c7=fw.table;
-this._htmlArea=_c7;
-Xinha.freeLater(this,"_htmlArea");
-_c7.className="htmlarea";
-fw.tb_cell.appendChild(this._createToolbar());
-var _c8=document.createElement("iframe");
-_c8.src=this.popupURL(_b2.config.URIs.blank);
-_c8.id="XinhaIFrame_"+this._textArea.id;
-fw.ed_cell.appendChild(_c8);
-this._iframe=_c8;
-this._iframe.className="xinha_iframe";
-Xinha.freeLater(this,"_iframe");
-var _c9=this._createStatusBar();
-this._statusBar=fw.sb_cell.appendChild(_c9);
-var _ca=this._textArea;
-_ca.parentNode.insertBefore(_c7,_ca);
-_ca.className="xinha_textarea";
-Xinha.removeFromParent(_ca);
-fw.ed_cell.appendChild(_ca);
-Xinha.addDom0Event(this._textArea,"click",function(){
-if(Xinha._currentlyActiveEditor!=this){
-_b2.updateToolbar();
-}
-return true;
-});
-if(_ca.form){
-Xinha.prependDom0Event(this._textArea.form,"submit",function(){
-_b2.firePluginEvent("onBeforeSubmit");
-_b2._textArea.value=_b2.outwardHtml(_b2.getHTML());
-return true;
-});
-var _cb=_ca.value;
-Xinha.prependDom0Event(this._textArea.form,"reset",function(){
-_b2.setHTML(_b2.inwardHtml(_cb));
-_b2.updateToolbar();
-return true;
-});
-if(!_ca.form.xinha_submit){
-try{
-_ca.form.xinha_submit=_ca.form.submit;
-_ca.form.submit=function(){
-this.onsubmit();
-this.xinha_submit();
-};
-}
-catch(ex){
-}
-}
-}
-Xinha.prependDom0Event(window,"unload",function(){
-_b2.firePluginEvent("onBeforeUnload");
-_ca.value=_b2.outwardHtml(_b2.getHTML());
-if(!Xinha.is_ie){
-_c7.parentNode.replaceChild(_ca,_c7);
-}
-return true;
-});
-_ca.style.display="none";
-_b2.initSize();
-this.setLoadingMessage(Xinha._lc("Finishing"));
-_b2._iframeLoadDone=false;
-if(Xinha.is_opera){
-_b2.initIframe();
-}else{
-Xinha._addEvent(this._iframe,"load",function(e){
-if(!_b2._iframeLoadDone){
-_b2._iframeLoadDone=true;
-_b2.initIframe();
-}
-return true;
-});
-}
-};
-Xinha.prototype.initSize=function(){
-this.setLoadingMessage(Xinha._lc("Init editor size"));
-var _cd=this;
-var _ce=null;
-var _cf=null;
-switch(this.config.width){
-case "auto":
-_ce=this._initial_ta_size.w;
-break;
-case "toolbar":
-_ce=this._toolBar.offsetWidth+"px";
-break;
-default:
-_ce=/[^0-9]/.test(this.config.width)?this.config.width:this.config.width+"px";
-break;
-}
-_cf=this.config.height=="auto"?this._initial_ta_size.h:/[^0-9]/.test(this.config.height)?this.config.height:this.config.height+"px";
-this.sizeEditor(_ce,_cf,this.config.sizeIncludesBars,this.config.sizeIncludesPanels);
-this.notifyOn("panel_change",function(){
-_cd.sizeEditor();
-});
-};
-Xinha.prototype.sizeEditor=function(_d0,_d1,_d2,_d3){
-if(this._risizing){
-return;
-}
-this._risizing=true;
-var _d4=this._framework;
-this.notifyOf("before_resize",{width:_d0,height:_d1});
-this.firePluginEvent("onBeforeResize",_d0,_d1);
-this._iframe.style.height="100%";
-this._textArea.style.height="1px";
-this._iframe.style.width="0px";
-this._textArea.style.width="0px";
-if(_d2!==null){
-this._htmlArea.sizeIncludesToolbars=_d2;
-}
-if(_d3!==null){
-this._htmlArea.sizeIncludesPanels=_d3;
-}
-if(_d0){
-this._htmlArea.style.width=_d0;
-if(!this._htmlArea.sizeIncludesPanels){
-var _d5=this._panels.right;
-if(_d5.on&&_d5.panels.length&&Xinha.hasDisplayedChildren(_d5.div)){
-this._htmlArea.style.width=(this._htmlArea.offsetWidth+parseInt(this.config.panel_dimensions.right,10))+"px";
-}
-var _d6=this._panels.left;
-if(_d6.on&&_d6.panels.length&&Xinha.hasDisplayedChildren(_d6.div)){
-this._htmlArea.style.width=(this._htmlArea.offsetWidth+parseInt(this.config.panel_dimensions.left,10))+"px";
-}
-}
-}
-if(_d1){
-this._htmlArea.style.height=_d1;
-if(!this._htmlArea.sizeIncludesToolbars){
-this._htmlArea.style.height=(this._htmlArea.offsetHeight+this._toolbar.offsetHeight+this._statusBar.offsetHeight)+"px";
-}
-if(!this._htmlArea.sizeIncludesPanels){
-var _d7=this._panels.top;
-if(_d7.on&&_d7.panels.length&&Xinha.hasDisplayedChildren(_d7.div)){
-this._htmlArea.style.height=(this._htmlArea.offsetHeight+parseInt(this.config.panel_dimensions.top,10))+"px";
-}
-var _d8=this._panels.bottom;
-if(_d8.on&&_d8.panels.length&&Xinha.hasDisplayedChildren(_d8.div)){
-this._htmlArea.style.height=(this._htmlArea.offsetHeight+parseInt(this.config.panel_dimensions.bottom,10))+"px";
-}
-}
-}
-_d0=this._htmlArea.offsetWidth;
-_d1=this._htmlArea.offsetHeight;
-var _d9=this._panels;
-var _da=this;
-var _db=1;
-function panel_is_alive(pan){
-if(_d9[pan].on&&_d9[pan].panels.length&&Xinha.hasDisplayedChildren(_d9[pan].container)){
-_d9[pan].container.style.display="";
-return true;
-}else{
-_d9[pan].container.style.display="none";
-return false;
-}
-};
-if(panel_is_alive("left")){
-_db+=1;
-}
-if(panel_is_alive("right")){
-_db+=1;
-}
-_d4.tb_cell.colSpan=_db;
-_d4.tp_cell.colSpan=_db;
-_d4.bp_cell.colSpan=_db;
-_d4.sb_cell.colSpan=_db;
-if(!_d4.tp_row.childNodes.length){
-Xinha.removeFromParent(_d4.tp_row);
-}else{
-if(!Xinha.hasParentNode(_d4.tp_row)){
-_d4.tbody.insertBefore(_d4.tp_row,_d4.ler_row);
-}
-}
-if(!_d4.bp_row.childNodes.length){
-Xinha.removeFromParent(_d4.bp_row);
-}else{
-if(!Xinha.hasParentNode(_d4.bp_row)){
-_d4.tbody.insertBefore(_d4.bp_row,_d4.ler_row.nextSibling);
-}
-}
-if(!this.config.statusBar){
-Xinha.removeFromParent(_d4.sb_row);
-}else{
-if(!Xinha.hasParentNode(_d4.sb_row)){
-_d4.table.appendChild(_d4.sb_row);
-}
-}
-_d4.lp_cell.style.width=this.config.panel_dimensions.left;
-_d4.rp_cell.style.width=this.config.panel_dimensions.right;
-_d4.tp_cell.style.height=this.config.panel_dimensions.top;
-_d4.bp_cell.style.height=this.config.panel_dimensions.bottom;
-_d4.tb_cell.style.height=this._toolBar.offsetHeight+"px";
-_d4.sb_cell.style.height=this._statusBar.offsetHeight+"px";
-var _dd=_d1-this._toolBar.offsetHeight-this._statusBar.offsetHeight;
-if(panel_is_alive("top")){
-_dd-=parseInt(this.config.panel_dimensions.top,10);
-}
-if(panel_is_alive("bottom")){
-_dd-=parseInt(this.config.panel_dimensions.bottom,10);
-}
-this._iframe.style.height=_dd+"px";
-var _de=_d0;
-if(panel_is_alive("left")){
-_de-=parseInt(this.config.panel_dimensions.left,10);
-}
-if(panel_is_alive("right")){
-_de-=parseInt(this.config.panel_dimensions.right,10);
-}
-var _df=this.config.iframeWidth?parseInt(this.config.iframeWidth,10):null;
-this._iframe.style.width=(_df&&_df<_de)?_df+"px":_de+"px";
-this._textArea.style.height=this._iframe.style.height;
-this._textArea.style.width=this._iframe.style.width;
-this.notifyOf("resize",{width:this._htmlArea.offsetWidth,height:this._htmlArea.offsetHeight});
-this.firePluginEvent("onResize",this._htmlArea.offsetWidth,this._htmlArea.offsetWidth);
-this._risizing=false;
-};
-Xinha.prototype.registerPanel=function(_e0,_e1){
-if(!_e0){
-_e0="right";
-}
-this.setLoadingMessage("Register "+_e0+" panel ");
-var _e2=this.addPanel(_e0);
-if(_e1){
-_e1.drawPanelIn(_e2);
-}
-};
-Xinha.prototype.addPanel=function(_e3){
-var div=document.createElement("div");
-div.side=_e3;
-if(_e3=="left"||_e3=="right"){
-div.style.width=this.config.panel_dimensions[_e3];
-if(this._iframe){
-div.style.height=this._iframe.style.height;
-}
-}
-Xinha.addClasses(div,"panel");
-this._panels[_e3].panels.push(div);
-this._panels[_e3].div.appendChild(div);
-this.notifyOf("panel_change",{"action":"add","panel":div});
-this.firePluginEvent("onPanelChange","add",div);
-return div;
-};
-Xinha.prototype.removePanel=function(_e5){
-this._panels[_e5.side].div.removeChild(_e5);
-var _e6=[];
-for(var i=0;i<this._panels[_e5.side].panels.length;i++){
-if(this._panels[_e5.side].panels[i]!=_e5){
-_e6.push(this._panels[_e5.side].panels[i]);
-}
-}
-this._panels[_e5.side].panels=_e6;
-this.notifyOf("panel_change",{"action":"remove","panel":_e5});
-this.firePluginEvent("onPanelChange","remove",_e5);
-};
-Xinha.prototype.hidePanel=function(_e8){
-if(_e8&&_e8.style.display!="none"){
-try{
-var pos=this.scrollPos(this._iframe.contentWindow);
-}
-catch(e){
-}
-_e8.style.display="none";
-this.notifyOf("panel_change",{"action":"hide","panel":_e8});
-this.firePluginEvent("onPanelChange","hide",_e8);
-try{
-this._iframe.contentWindow.scrollTo(pos.x,pos.y);
-}
-catch(e){
-}
-}
-};
-Xinha.prototype.showPanel=function(_ea){
-if(_ea&&_ea.style.display=="none"){
-try{
-var pos=this.scrollPos(this._iframe.contentWindow);
-}
-catch(e){
-}
-_ea.style.display="";
-this.notifyOf("panel_change",{"action":"show","panel":_ea});
-this.firePluginEvent("onPanelChange","show",_ea);
-try{
-this._iframe.contentWindow.scrollTo(pos.x,pos.y);
-}
-catch(e){
-}
-}
-};
-Xinha.prototype.hidePanels=function(_ec){
-if(typeof _ec=="undefined"){
-_ec=["left","right","top","bottom"];
-}
-var _ed=[];
-for(var i=0;i<_ec.length;i++){
-if(this._panels[_ec[i]].on){
-_ed.push(_ec[i]);
-this._panels[_ec[i]].on=false;
-}
-}
-this.notifyOf("panel_change",{"action":"multi_hide","sides":_ec});
-this.firePluginEvent("onPanelChange","multi_hide",_ec);
-};
-Xinha.prototype.showPanels=function(_ef){
-if(typeof _ef=="undefined"){
-_ef=["left","right","top","bottom"];
-}
-var _f0=[];
-for(var i=0;i<_ef.length;i++){
-if(!this._panels[_ef[i]].on){
-_f0.push(_ef[i]);
-this._panels[_ef[i]].on=true;
-}
-}
-this.notifyOf("panel_change",{"action":"multi_show","sides":_ef});
-this.firePluginEvent("onPanelChange","multi_show",_ef);
-};
-Xinha.objectProperties=function(obj){
-var _f3=[];
-for(var x in obj){
-_f3[_f3.length]=x;
-}
-return _f3;
-};
-Xinha.prototype.editorIsActivated=function(){
-try{
-return Xinha.is_designMode?this._doc.designMode=="on":this._doc.body.contentEditable;
-}
-catch(ex){
-return false;
-}
-};
-Xinha._someEditorHasBeenActivated=false;
-Xinha._currentlyActiveEditor=null;
-Xinha.prototype.activateEditor=function(){
-if(this.currentModal){
-return;
-}
-if(Xinha._currentlyActiveEditor){
-if(Xinha._currentlyActiveEditor==this){
-return true;
-}
-Xinha._currentlyActiveEditor.deactivateEditor();
-}
-if(Xinha.is_designMode&&this._doc.designMode!="on"){
-try{
-if(this._iframe.style.display=="none"){
-this._iframe.style.display="";
-this._doc.designMode="on";
-this._iframe.style.display="none";
-}else{
-this._doc.designMode="on";
-}
-if(Xinha.is_opera){
-this.setEditorEvents(true);
-}
-}
-catch(ex){
-}
-}else{
-if(Xinha.is_ie&&this._doc.body.contentEditable!==true){
-this._doc.body.contentEditable=true;
-}
-}
-Xinha._someEditorHasBeenActivated=true;
-Xinha._currentlyActiveEditor=this;
-var _f5=this;
-this.enableToolbar();
-};
-Xinha.prototype.deactivateEditor=function(){
-this.disableToolbar();
-if(Xinha.is_designMode&&this._doc.designMode!="off"){
-try{
-this._doc.designMode="off";
-}
-catch(ex){
-}
-}else{
-if(!Xinha.is_designMode&&this._doc.body.contentEditable!==false){
-this._doc.body.contentEditable=false;
-}
-}
-if(Xinha._currentlyActiveEditor!=this){
-return;
-}
-Xinha._currentlyActiveEditor=false;
-};
-Xinha.prototype.initIframe=function(){
-this.disableToolbar();
-var doc=null;
-var _f7=this;
-try{
-if(_f7._iframe.contentDocument){
-this._doc=_f7._iframe.contentDocument;
-}else{
-this._doc=_f7._iframe.contentWindow.document;
-}
-doc=this._doc;
-if(!doc){
-if(Xinha.is_gecko){
-setTimeout(function(){
-_f7.initIframe();
-},50);
-return false;
-}else{
-alert("ERROR: IFRAME can't be initialized.");
-}
-}
-}
-catch(ex){
-setTimeout(function(){
-_f7.initIframe();
-},50);
-return false;
-}
-Xinha.freeLater(this,"_doc");
-doc.open("text/html","replace");
-var _f8="",_f9;
-if(_f7.config.browserQuirksMode===false){
-_f9="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">";
-}else{
-if(_f7.config.browserQuirksMode===true){
-_f9="";
-}else{
-_f9=Xinha.getDoctype(document);
-}
-}
-if(!_f7.config.fullPage){
-_f8+=_f9+"\n";
-_f8+="<html>\n";
-_f8+="<head>\n";
-_f8+="<meta http-equiv=\"Content-Type\" content=\"text/html; charset="+_f7.config.charSet+"\">\n";
-if(typeof _f7.config.baseHref!="undefined"&&_f7.config.baseHref!==null){
-_f8+="<base href=\""+_f7.config.baseHref+"\"/>\n";
-}
-_f8+=Xinha.addCoreCSS();
-if(typeof _f7.config.pageStyleSheets!=="undefined"){
-for(var i=0;i<_f7.config.pageStyleSheets.length;i++){
-if(_f7.config.pageStyleSheets[i].length>0){
-_f8+="<link rel=\"stylesheet\" type=\"text/css\" href=\""+_f7.config.pageStyleSheets[i]+"\">";
-}
-}
-}
-if(_f7.config.pageStyle){
-_f8+="<style type=\"text/css\">\n"+_f7.config.pageStyle+"\n</style>";
-}
-_f8+="</head>\n";
-_f8+="<body"+(_f7.config.bodyID?(" id=\""+_f7.config.bodyID+"\""):"")+(_f7.config.bodyClass?(" class=\""+_f7.config.bodyClass+"\""):"")+">\n";
-_f8+=_f7.inwardHtml(_f7._textArea.value);
-_f8+="</body>\n";
-_f8+="</html>";
-}else{
-_f8=_f7.inwardHtml(_f7._textArea.value);
-if(_f8.match(Xinha.RE_doctype)){
-_f7.setDoctype(RegExp.$1);
-}
-var _fb=_f8.match(/<link\s+[\s\S]*?["']\s*\/?>/gi);
-_f8=_f8.replace(/<link\s+[\s\S]*?["']\s*\/?>\s*/gi,"");
-if(_fb){
-_f8=_f8.replace(/<\/head>/i,_fb.join("\n")+"\n</head>");
-}
-}
-doc.write(_f8);
-doc.close();
-if(this.config.fullScreen){
-this._fullScreen();
-}
-this.setEditorEvents();
-if((typeof _f7.config.autofocus!="undefined")&&_f7.config.autofocus!==false&&((_f7.config.autofocus==_f7._textArea.id)||_f7.config.autofocus==true)){
-_f7.activateEditor();
-_f7.focusEditor();
-}
-};
-Xinha.prototype.whenDocReady=function(f){
-var e=this;
-if(this._doc&&this._doc.body){
-f();
-}else{
-setTimeout(function(){
-e.whenDocReady(f);
-},50);
-}
-};
-Xinha.prototype.setMode=function(_fe){
-var _ff;
-if(typeof _fe=="undefined"){
-_fe=this._editMode=="textmode"?"wysiwyg":"textmode";
-}
-switch(_fe){
-case "textmode":
-this.firePluginEvent("onBeforeMode","textmode");
-this._toolbarObjects.htmlmode.swapImage(this.config.iconList.wysiwygmode);
-this.setCC("iframe");
-_ff=this.outwardHtml(this.getHTML());
-this.setHTML(_ff);
-this.deactivateEditor();
-this._iframe.style.display="none";
-this._textArea.style.display="";
-if(this.config.statusBar){
-this._statusBarTree.style.display="none";
-this._statusBarTextMode.style.display="";
-}
-this.findCC("textarea");
-this.notifyOf("modechange",{"mode":"text"});
-this.firePluginEvent("onMode","textmode");
-break;
-case "wysiwyg":
-this.firePluginEvent("onBeforeMode","wysiwyg");
-this._toolbarObjects.htmlmode.swapImage([this.imgURL("images/ed_buttons_main.png"),7,0]);
-this.setCC("textarea");
-_ff=this.inwardHtml(this.getHTML());
-this.deactivateEditor();
-this.setHTML(_ff);
-this._iframe.style.display="";
-this._textArea.style.display="none";
-this.activateEditor();
-if(this.config.statusBar){
-this._statusBarTree.style.display="";
-this._statusBarTextMode.style.display="none";
-}
-this.findCC("iframe");
-this.notifyOf("modechange",{"mode":"wysiwyg"});
-this.firePluginEvent("onMode","wysiwyg");
-break;
-default:
-alert("Mode <"+_fe+"> not defined!");
-return false;
-}
-this._editMode=_fe;
-};
-Xinha.prototype.setFullHTML=function(html){
-var _101=RegExp.multiline;
-RegExp.multiline=true;
-if(html.match(Xinha.RE_doctype)){
-this.setDoctype(RegExp.$1);
-}
-RegExp.multiline=_101;
-if(0){
-if(html.match(Xinha.RE_head)){
-this._doc.getElementsByTagName("head")[0].innerHTML=RegExp.$1;
-}
-if(html.match(Xinha.RE_body)){
-this._doc.getElementsByTagName("body")[0].innerHTML=RegExp.$1;
-}
-}else{
-var reac=this.editorIsActivated();
-if(reac){
-this.deactivateEditor();
-}
-var _103=/<html>((.|\n)*?)<\/html>/i;
-html=html.replace(_103,"$1");
-this._doc.open("text/html","replace");
-this._doc.write(html);
-this._doc.close();
-if(reac){
-this.activateEditor();
-}
-this.setEditorEvents();
-return true;
-}
-};
-Xinha.prototype.setEditorEvents=function(_104){
-var _105=this;
-var doc=this._doc;
-_105.whenDocReady(function(){
-if(!_104){
-Xinha._addEvents(doc,["mousedown"],function(){
-_105.activateEditor();
-return true;
-});
-if(Xinha.is_ie){
-Xinha._addEvent(_105._doc.getElementsByTagName("html")[0],"click",function(){
-if(_105._iframe.contentWindow.event.srcElement.tagName.toLowerCase()=="html"){
-var r=_105._doc.body.createTextRange();
-r.collapse();
-r.select();
-}
-return true;
-});
-}
-}
-Xinha._addEvents(doc,["keydown","keypress","mousedown","mouseup","drag"],function(_108){
-return _105._editorEvent(Xinha.is_ie?_105._iframe.contentWindow.event:_108);
-});
-Xinha._addEvents(doc,["dblclick"],function(_109){
-return _105._onDoubleClick(Xinha.is_ie?_105._iframe.contentWindow.event:_109);
-});
-if(_104){
-return;
-}
-for(var i in _105.plugins){
-var _10b=_105.plugins[i].instance;
-Xinha.refreshPlugin(_10b);
-}
-if(typeof _105._onGenerate=="function"){
-_105._onGenerate();
-}
-Xinha.addDom0Event(window,"resize",function(e){
-if(Xinha.ie_version>7&&!window.parent){
-if(_105.execResize){
-_105.sizeEditor();
-_105.execResize=false;
-}else{
-_105.execResize=true;
-}
-}else{
-_105.sizeEditor();
-}
-});
-_105.removeLoadingMessage();
-});
-};
-Xinha.getPluginConstructor=function(_10d){
-return Xinha.plugins[_10d]||window[_10d];
-};
-Xinha.prototype.registerPlugin=function(){
-if(!Xinha.isSupportedBrowser){
-return;
-}
-var _10e=arguments[0];
-if(_10e===null||typeof _10e=="undefined"||(typeof _10e=="string"&&Xinha.getPluginConstructor(_10e)=="undefined")){
-return false;
-}
-var args=[];
-for(var i=1;i<arguments.length;++i){
-args.push(arguments[i]);
-}
-return this.registerPlugin2(_10e,args);
-};
-Xinha.prototype.registerPlugin2=function(_111,args){
-if(typeof _111=="string"&&typeof Xinha.getPluginConstructor(_111)=="function"){
-var _113=_111;
-_111=Xinha.getPluginConstructor(_111);
-}
-if(typeof _111=="undefined"){
-return false;
-}
-if(!_111._pluginInfo){
-_111._pluginInfo={name:_113};
-}
-var obj=new _111(this,args);
-if(obj){
-var _115={};
-var info=_111._pluginInfo;
-for(var i in info){
-_115[i]=info[i];
-}
-_115.instance=obj;
-_115.args=args;
-this.plugins[_111._pluginInfo.name]=_115;
-return obj;
-}else{
-Xinha.debugMsg("Can't register plugin "+_111.toString()+".","warn");
-}
-};
-Xinha.getPluginDir=function(_118,_119){
-if(Xinha.externalPlugins[_118]){
-return Xinha.externalPlugins[_118][0];
-}
-if(_119||(Xinha.getPluginConstructor(_118)&&(typeof Xinha.getPluginConstructor(_118).supported!="undefined")&&!Xinha.getPluginConstructor(_118).supported)){
-return _editor_url+"unsupported_plugins/"+_118;
-}
-return _editor_url+"plugins/"+_118;
-};
-Xinha.loadPlugin=function(_11a,_11b,url){
-if(!Xinha.isSupportedBrowser){
-return;
-}
-Xinha.setLoadingMessage(Xinha._lc("Loading plugin $plugin="+_11a+"$"));
-if(typeof Xinha.getPluginConstructor(_11a)!="undefined"){
-if(_11b){
-_11b(_11a);
-}
-return true;
-}
-Xinha._pluginLoadStatus[_11a]="loading";
-function multiStageLoader(_11d,_11e){
-var _11f,dir,file,_122;
-switch(_11d){
-case "start":
-_11f="old_naming";
-dir=Xinha.getPluginDir(_11e);
-file=_11e+".js";
-break;
-case "old_naming":
-_11f="unsupported";
-dir=Xinha.getPluginDir(_11e);
-file=_11e.replace(/([a-z])([A-Z])([a-z])/g,function(str,l1,l2,l3){
-return l1+"-"+l2.toLowerCase()+l3;
-}).toLowerCase()+".js";
-_122="You are using an obsolete naming scheme for the Xinha plugin "+_11e+". Please rename "+file+" to "+_11e+".js";
-break;
-case "unsupported":
-_11f="unsupported_old_name";
-dir=Xinha.getPluginDir(_11e,true);
-file=_11e+".js";
-_122="You are using the unsupported Xinha plugin "+_11e+". If you wish continued support, please see http://trac.xinha.org/ticket/1297";
-break;
-case "unsupported_old_name":
-_11f="";
-dir=Xinha.getPluginDir(_11e,true);
-file=_11e.replace(/([a-z])([A-Z])([a-z])/g,function(str,l1,l2,l3){
-return l1+"-"+l2.toLowerCase()+l3;
-}).toLowerCase()+".js";
-_122="You are using the unsupported Xinha plugin "+_11e+". If you wish continued support, please see http://trac.xinha.org/ticket/1297";
-break;
-default:
-Xinha._pluginLoadStatus[_11e]="failed";
-Xinha.debugMsg("Xinha was not able to find the plugin "+_11e+". Please make sure the plugin exists.","warn");
-return;
-}
-var url=dir+"/"+file;
-function statusCallback(_12c){
-Xinha.getPluginConstructor(_12c).supported=_11d.indexOf("unsupported")!==0;
-_11b(_12c);
-};
-Xinha._loadback(url,statusCallback,this,_11e);
-Xinha.ping(url,function(){
-if(_122){
-Xinha.debugMsg(_122);
-}
-},function(){
-Xinha.removeFromParent(document.getElementById(url));
-multiStageLoader(_11f,_11e);
-});
-};
-if(!url){
-if(Xinha.externalPlugins[_11a]){
-Xinha._loadback(Xinha.externalPlugins[_11a][0]+Xinha.externalPlugins[_11a][1],_11b,this,_11a);
-}else{
-var _12d=this;
-multiStageLoader("start",_11a);
-}
-}else{
-Xinha._loadback(url,_11b,this,_11a);
-}
-return false;
-};
-Xinha._pluginLoadStatus={};
-Xinha.externalPlugins={};
-Xinha.plugins={};
-Xinha.loadPlugins=function(_12e,_12f,url){
-if(!Xinha.isSupportedBrowser){
-return;
-}
-var m,i;
-for(i=0;i<_12e.length;i++){
-if(typeof _12e[i]=="object"){
-m=_12e[i].url.match(/(.*)(\/[^\/]*)$/);
-Xinha.externalPlugins[_12e[i].plugin]=[m[1],m[2]];
-_12e[i]=_12e[i].plugin;
-}
-}
-var _133=true;
-var _134=Xinha.cloneObject(_12e);
-for(i=0;i<_134.length;i++){
-var p=_134[i];
-if(p=="FullScreen"&&!Xinha.externalPlugins.FullScreen){
-continue;
-}
-if(typeof Xinha._pluginLoadStatus[p]=="undefined"){
-Xinha.loadPlugin(p,function(_136){
-Xinha.setLoadingMessage(Xinha._lc("Finishing"));
-if(typeof Xinha.getPluginConstructor(_136)!="undefined"){
-Xinha._pluginLoadStatus[_136]="ready";
-}else{
-Xinha._pluginLoadStatus[_136]="failed";
-}
-},url);
-_133=false;
-}else{
-if(Xinha._pluginLoadStatus[p]=="loading"){
-_133=false;
-}
-}
-}
-if(_133){
-return true;
-}
-if(_12f){
-setTimeout(function(){
-if(Xinha.loadPlugins(_12e,_12f)){
-_12f();
-}
-},50);
-}
-return _133;
-};
-Xinha.refreshPlugin=function(_137){
-if(_137&&typeof _137.onGenerate=="function"){
-_137.onGenerate();
-}
-if(_137&&typeof _137.onGenerateOnce=="function"){
-_137._ongenerateOnce=_137.onGenerateOnce;
-delete (_137.onGenerateOnce);
-_137._ongenerateOnce();
-delete (_137._ongenerateOnce);
-}
-};
-Xinha.prototype.firePluginEvent=function(_138){
-var _139=[];
-for(var i=1;i<arguments.length;i++){
-_139[i-1]=arguments[i];
-}
-for(i in this.plugins){
-var _13b=this.plugins[i].instance;
-if(_13b==this._browserSpecificPlugin){
-continue;
-}
-if(_13b&&typeof _13b[_138]=="function"){
-var _13c=(i=="Events")?this:_13b;
-if(_13b[_138].apply(_13c,_139)){
-return true;
-}
-}
-}
-_13b=this._browserSpecificPlugin;
-if(_13b&&typeof _13b[_138]=="function"){
-if(_13b[_138].apply(_13b,_139)){
-return true;
-}
-}
-return false;
-};
-Xinha.loadStyle=function(_13d,_13e,id,_140){
-var url=_editor_url||"";
-if(_13e){
-url=Xinha.getPluginDir(_13e)+"/";
-}
-url+=_13d;
-if(/^\//.test(_13d)){
-url=_13d;
-}
-var head=document.getElementsByTagName("head")[0];
-var link=document.createElement("link");
-link.rel="stylesheet";
-link.href=url;
-link.type="text/css";
-if(id){
-link.id=id;
-}
-if(_140&&head.getElementsByTagName("link")[0]){
-head.insertBefore(link,head.getElementsByTagName("link")[0]);
-}else{
-head.appendChild(link);
-}
-};
-Xinha.loadScript=function(_144,_145,_146){
-var url=_editor_url||"";
-if(_145){
-url=Xinha.getPluginDir(_145)+"/";
-}
-url+=_144;
-if(/^\//.test(_144)){
-url=_144;
-}
-Xinha._loadback(url,_146);
-};
-Xinha.includeAssets=function(){
-var _148={pendingAssets:[],loaderRunning:false,loadedScripts:[]};
-_148.callbacks=[];
-_148.loadNext=function(){
-var self=this;
-this.loaderRunning=true;
-if(this.pendingAssets.length){
-var nxt=this.pendingAssets[0];
-this.pendingAssets.splice(0,1);
-switch(nxt.type){
-case "text/css":
-Xinha.loadStyle(nxt.url,nxt.plugin);
-return this.loadNext();
-case "text/javascript":
-Xinha.loadScript(nxt.url,nxt.plugin,function(){
-self.loadNext();
-});
-}
-}else{
-this.loaderRunning=false;
-this.runCallback();
-}
-};
-_148.loadScript=function(url,_14c){
-var self=this;
-this.pendingAssets.push({"type":"text/javascript","url":url,"plugin":_14c});
-if(!this.loaderRunning){
-this.loadNext();
-}
-return this;
-};
-_148.loadScriptOnce=function(url,_14f){
-for(var i=0;i<this.loadedScripts.length;i++){
-if(this.loadedScripts[i].url==url&&this.loadedScripts[i].plugin==_14f){
-return this;
-}
-}
-return this.loadScript(url,_14f);
-};
-_148.loadStyle=function(url,_152){
-var self=this;
-this.pendingAssets.push({"type":"text/css","url":url,"plugin":_152});
-if(!this.loaderRunning){
-this.loadNext();
-}
-return this;
-};
-_148.whenReady=function(_154){
-this.callbacks.push(_154);
-if(!this.loaderRunning){
-this.loadNext();
-}
-return this;
-};
-_148.runCallback=function(){
-while(this.callbacks.length){
-var _155=this.callbacks.splice(0,1);
-_155[0]();
-_155=null;
-}
-return this;
-};
-for(var i=0;i<arguments.length;i++){
-if(typeof arguments[i]=="string"){
-if(arguments[i].match(/\.css$/i)){
-_148.loadStyle(arguments[i]);
-}else{
-_148.loadScript(arguments[i]);
-}
-}else{
-if(arguments[i].type){
-if(arguments[i].type.match(/text\/css/i)){
-_148.loadStyle(arguments[i].url,arguments[i].plugin);
-}else{
-if(arguments[i].type.match(/text\/javascript/i)){
-_148.loadScript(arguments[i].url,arguments[i].plugin);
-}
-}
-}else{
-if(arguments[i].length>=1){
-if(arguments[i][0].match(/\.css$/i)){
-_148.loadStyle(arguments[i][0],arguments[i][1]);
-}else{
-_148.loadScript(arguments[i][0],arguments[i][1]);
-}
-}
-}
-}
-}
-return _148;
-};
-Xinha.prototype.debugTree=function(){
-var ta=document.createElement("textarea");
-ta.style.width="100%";
-ta.style.height="20em";
-ta.value="";
-function debug(_158,str){
-for(;--_158>=0;){
-ta.value+=" ";
-}
-ta.value+=str+"\n";
-};
-function _dt(root,_15b){
-var tag=root.tagName.toLowerCase(),i;
-var ns=Xinha.is_ie?root.scopeName:root.prefix;
-debug(_15b,"- "+tag+" ["+ns+"]");
-for(i=root.firstChild;i;i=i.nextSibling){
-if(i.nodeType==1){
-_dt(i,_15b+2);
-}
-}
-};
-_dt(this._doc.body,0);
-document.body.appendChild(ta);
-};
-Xinha.getInnerText=function(el){
-var txt="",i;
-for(i=el.firstChild;i;i=i.nextSibling){
-if(i.nodeType==3){
-txt+=i.data;
-}else{
-if(i.nodeType==1){
-txt+=Xinha.getInnerText(i);
-}
-}
-}
-return txt;
-};
-Xinha.prototype._wordClean=function(){
-var _162=this;
-var _163={empty_tags:0,cond_comm:0,mso_elmts:0,mso_class:0,mso_style:0,mso_xmlel:0,orig_len:this._doc.body.innerHTML.length,T:new Date().getTime()};
-var _164={empty_tags:"Empty tags removed: ",cond_comm:"Conditional comments removed",mso_elmts:"MSO invalid elements removed",mso_class:"MSO class names removed: ",mso_style:"MSO inline style removed: ",mso_xmlel:"MSO XML elements stripped: "};
-function showStats(){
-var txt="Xinha word cleaner stats: \n\n";
-for(var i in _163){
-if(_164[i]){
-txt+=_164[i]+_163[i]+"\n";
-}
-}
-txt+="\nInitial document length: "+_163.orig_len+"\n";
-txt+="Final document length: "+_162._doc.body.innerHTML.length+"\n";
-txt+="Clean-up took "+((new Date().getTime()-_163.T)/1000)+" seconds";
-alert(txt);
-};
-function clearClass(node){
-var newc=node.className.replace(/(^|\s)mso.*?(\s|$)/ig," ");
-if(newc!=node.className){
-node.className=newc;
-if(!/\S/.test(node.className)){
-node.removeAttribute("className");
-++_163.mso_class;
-}
-}
-};
-function clearStyle(node){
-var _16a=node.style.cssText.split(/\s*;\s*/);
-for(var i=_16a.length;--i>=0;){
-if(/^mso|^tab-stops/i.test(_16a[i])||/^margin\s*:\s*0..\s+0..\s+0../i.test(_16a[i])){
-++_163.mso_style;
-_16a.splice(i,1);
-}
-}
-node.style.cssText=_16a.join("; ");
-};
-function removeElements(el){
-if(("link"==el.tagName.toLowerCase()&&(el.attributes&&/File-List|Edit-Time-Data|themeData|colorSchemeMapping/.test(el.attributes.rel.nodeValue)))||/^(style|meta)$/i.test(el.tagName)){
-Xinha.removeFromParent(el);
-++_163.mso_elmts;
-return true;
-}
-return false;
-};
-function checkEmpty(el){
-if(/^(a|span|b|strong|i|em|font|div|p)$/i.test(el.tagName)&&!el.firstChild){
-Xinha.removeFromParent(el);
-++_163.empty_tags;
-return true;
-}
-return false;
-};
-function parseTree(root){
-clearClass(root);
-clearStyle(root);
-var next;
-for(var i=root.firstChild;i;i=next){
-next=i.nextSibling;
-if(i.nodeType==1&&parseTree(i)){
-if((Xinha.is_ie&&root.scopeName!="HTML")||(!Xinha.is_ie&&/:/.test(i.tagName))){
-for(var _171=i.childNodes&&i.childNodes.length-1;i.childNodes&&i.childNodes.length&&i.childNodes[_171];--_171){
-if(i.nextSibling){
-i.parentNode.insertBefore(i.childNodes[_171],i.nextSibling);
-}else{
-i.parentNode.appendChild(i.childNodes[_171]);
-}
-}
-Xinha.removeFromParent(i);
-continue;
-}
-if(checkEmpty(i)){
-continue;
-}
-if(removeElements(i)){
-continue;
-}
-}else{
-if(i.nodeType==8){
-if(/(\s*\[\s*if\s*(([gl]te?|!)\s*)?(IE|mso)\s*(\d+(\.\d+)?\s*)?\]>)/.test(i.nodeValue)){
-Xinha.removeFromParent(i);
-++_163.cond_comm;
-}
-}
-}
-}
-return true;
-};
-parseTree(this._doc.body);
-this.updateToolbar();
-};
-Xinha.prototype._clearFonts=function(){
-var D=this.getInnerHTML();
-if(confirm(Xinha._lc("Would you like to clear font typefaces?"))){
-D=D.replace(/face="[^"]*"/gi,"");
-D=D.replace(/font-family:[^;}"']+;?/gi,"");
-}
-if(confirm(Xinha._lc("Would you like to clear font sizes?"))){
-D=D.replace(/size="[^"]*"/gi,"");
-D=D.replace(/font-size:[^;}"']+;?/gi,"");
-}
-if(confirm(Xinha._lc("Would you like to clear font colours?"))){
-D=D.replace(/color="[^"]*"/gi,"");
-D=D.replace(/([^\-])color:[^;}"']+;?/gi,"$1");
-}
-D=D.replace(/(style|class)="\s*"/gi,"");
-D=D.replace(/<(font|span)\s*>/gi,"");
-this.setHTML(D);
-this.updateToolbar();
-};
-Xinha.prototype._splitBlock=function(){
-this._doc.execCommand("formatblock",false,"div");
-};
-Xinha.prototype.forceRedraw=function(){
-this._doc.body.style.visibility="hidden";
-this._doc.body.style.visibility="";
-};
-Xinha.prototype.focusEditor=function(){
-switch(this._editMode){
-case "wysiwyg":
-try{
-if(Xinha._someEditorHasBeenActivated){
-this.activateEditor();
-this._iframe.contentWindow.focus();
-}
-}
-catch(ex){
-}
-break;
-case "textmode":
-try{
-this._textArea.focus();
-}
-catch(e){
-}
-break;
-default:
-alert("ERROR: mode "+this._editMode+" is not defined");
-}
-return this._doc;
-};
-Xinha.prototype._undoTakeSnapshot=function(){
-++this._undoPos;
-if(this._undoPos>=this.config.undoSteps){
-this._undoQueue.shift();
---this._undoPos;
-}
-var take=true;
-var txt=this.getInnerHTML();
-if(this._undoPos>0){
-take=(this._undoQueue[this._undoPos-1]!=txt);
-}
-if(take){
-this._undoQueue[this._undoPos]=txt;
-}else{
-this._undoPos--;
-}
-};
-Xinha.prototype.undo=function(){
-if(this._undoPos>0){
-var txt=this._undoQueue[--this._undoPos];
-if(txt){
-this.setHTML(txt);
-}else{
-++this._undoPos;
-}
-}
-};
-Xinha.prototype.redo=function(){
-if(this._undoPos<this._undoQueue.length-1){
-var txt=this._undoQueue[++this._undoPos];
-if(txt){
-this.setHTML(txt);
-}else{
---this._undoPos;
-}
-}
-};
-Xinha.prototype.disableToolbar=function(_177){
-if(this._timerToolbar){
-clearTimeout(this._timerToolbar);
-}
-if(typeof _177=="undefined"){
-_177=[];
-}else{
-if(typeof _177!="object"){
-_177=[_177];
-}
-}
-for(var i in this._toolbarObjects){
-var btn=this._toolbarObjects[i];
-if(_177.contains(i)){
-continue;
-}
-if(typeof btn.state!="function"){
-continue;
-}
-btn.state("enabled",false);
-}
-};
-Xinha.prototype.enableToolbar=function(){
-this.updateToolbar();
-};
-Xinha.prototype.updateToolbar=function(_17a){
-if(this.suspendUpdateToolbar){
-return;
-}
-var doc=this._doc;
-var text=(this._editMode=="textmode");
-var _17d=null;
-if(!text){
-_17d=this.getAllAncestors();
-if(this.config.statusBar&&!_17a){
-while(this._statusBarItems.length){
-var item=this._statusBarItems.pop();
-item.el=null;
-item.editor=null;
-item.onclick=null;
-item.oncontextmenu=null;
-item._xinha_dom0Events.click=null;
-item._xinha_dom0Events.contextmenu=null;
-item=null;
-}
-this._statusBarTree.innerHTML=" ";
-this._statusBarTree.appendChild(document.createTextNode(Xinha._lc("Path")+": "));
-for(var i=_17d.length;--i>=0;){
-var el=_17d[i];
-if(!el){
-continue;
-}
-var a=document.createElement("a");
-a.href="javascript:void(0);";
-a.el=el;
-a.editor=this;
-this._statusBarItems.push(a);
-Xinha.addDom0Event(a,"click",function(){
-this.blur();
-this.editor.selectNodeContents(this.el);
-this.editor.updateToolbar(true);
-return false;
-});
-Xinha.addDom0Event(a,"contextmenu",function(){
-this.blur();
-var info="Inline style:\n\n";
-info+=this.el.style.cssText.split(/;\s*/).join(";\n");
-alert(info);
-return false;
-});
-var txt=el.tagName.toLowerCase();
-switch(txt){
-case "b":
-txt="strong";
-break;
-case "i":
-txt="em";
-break;
-case "strike":
-txt="del";
-break;
-}
-if(typeof el.style!="undefined"){
-a.title=el.style.cssText;
-}
-if(el.id){
-txt+="#"+el.id;
-}
-if(el.className){
-txt+="."+el.className;
-}
-a.appendChild(document.createTextNode(txt));
-this._statusBarTree.appendChild(a);
-if(i!==0){
-this._statusBarTree.appendChild(document.createTextNode(String.fromCharCode(187)));
-}
-Xinha.freeLater(a);
-}
-}
-}
-for(var cmd in this._toolbarObjects){
-var btn=this._toolbarObjects[cmd];
-var _186=true;
-if(typeof btn.state!="function"){
-continue;
-}
-if(btn.context&&!text){
-_186=false;
-var _187=btn.context;
-var _188=[];
-if(/(.*)\[(.*?)\]/.test(_187)){
-_187=RegExp.$1;
-_188=RegExp.$2.split(",");
-}
-_187=_187.toLowerCase();
-var _189=(_187=="*");
-for(var k=0;k<_17d.length;++k){
-if(!_17d[k]){
-continue;
-}
-if(_189||(_17d[k].tagName.toLowerCase()==_187)){
-_186=true;
-var _18b=null;
-var att=null;
-var comp=null;
-var _18e=null;
-for(var ka=0;ka<_188.length;++ka){
-_18b=_188[ka].match(/(.*)(==|!=|===|!==|>|>=|<|<=)(.*)/);
-att=_18b[1];
-comp=_18b[2];
-_18e=_18b[3];
-if(!eval(_17d[k][att]+comp+_18e)){
-_186=false;
-break;
-}
-}
-if(_186){
-break;
-}
-}
-}
-}
-btn.state("enabled",(!text||btn.text)&&_186);
-if(typeof cmd=="function"){
-continue;
-}
-var _190=this.config.customSelects[cmd];
-if((!text||btn.text)&&(typeof _190!="undefined")){
-_190.refresh(this);
-continue;
-}
-switch(cmd){
-case "fontname":
-case "fontsize":
-if(!text){
-try{
-var _191=(""+doc.queryCommandValue(cmd)).toLowerCase();
-if(!_191){
-btn.element.selectedIndex=0;
-break;
-}
-var _192=this.config[cmd];
-var _193=0;
-for(var j in _192){
-if((j.toLowerCase()==_191)||(_192[j].substr(0,_191.length).toLowerCase()==_191)){
-btn.element.selectedIndex=_193;
-throw "ok";
-}
-++_193;
-}
-btn.element.selectedIndex=0;
-}
-catch(ex){
-}
-}
-break;
-case "formatblock":
-var _195=[];
-for(var _196 in this.config.formatblock){
-if(typeof this.config.formatblock[_196]=="string"){
-_195[_195.length]=this.config.formatblock[_196];
-}
-}
-var _197=this._getFirstAncestor(this.getSelection(),_195);
-if(_197){
-for(var x=0;x<_195.length;x++){
-if(_195[x].toLowerCase()==_197.tagName.toLowerCase()){
-btn.element.selectedIndex=x;
-}
-}
-}else{
-btn.element.selectedIndex=0;
-}
-break;
-case "textindicator":
-if(!text){
-try{
-var _199=btn.element.style;
-_199.backgroundColor=Xinha._makeColor(doc.queryCommandValue(Xinha.is_ie?"backcolor":"hilitecolor"));
-if(/transparent/i.test(_199.backgroundColor)){
-_199.backgroundColor=Xinha._makeColor(doc.queryCommandValue("backcolor"));
-}
-_199.color=Xinha._makeColor(doc.queryCommandValue("forecolor"));
-_199.fontFamily=doc.queryCommandValue("fontname");
-_199.fontWeight=doc.queryCommandState("bold")?"bold":"normal";
-_199.fontStyle=doc.queryCommandState("italic")?"italic":"normal";
-}
-catch(ex){
-}
-}
-break;
-case "htmlmode":
-btn.state("active",text);
-break;
-case "lefttoright":
-case "righttoleft":
-var _19a=this.getParentElement();
-while(_19a&&!Xinha.isBlockElement(_19a)){
-_19a=_19a.parentNode;
-}
-if(_19a){
-btn.state("active",(_19a.style.direction==((cmd=="righttoleft")?"rtl":"ltr")));
-}
-break;
-default:
-cmd=cmd.replace(/(un)?orderedlist/i,"insert$1orderedlist");
-try{
-btn.state("active",(!text&&doc.queryCommandState(cmd)));
-}
-catch(ex){
-}
-break;
-}
-}
-if(this._customUndo&&!this._timerUndo){
-this._undoTakeSnapshot();
-var _19b=this;
-this._timerUndo=setTimeout(function(){
-_19b._timerUndo=null;
-},this.config.undoTimeout);
-}
-this.firePluginEvent("onUpdateToolbar");
-};
-Xinha.getEditor=function(ref){
-for(var i=__xinhas.length;i--;){
-var _19e=__xinhas[i];
-if(_19e&&(_19e._textArea.id==ref||_19e._textArea.name==ref||_19e._textArea==ref)){
-return _19e;
-}
-}
-return null;
-};
-Xinha.prototype.getPluginInstance=function(_19f){
-if(this.plugins[_19f]){
-return this.plugins[_19f].instance;
-}else{
-return null;
-}
-};
-Xinha.prototype.getAllAncestors=function(){
-var p=this.getParentElement();
-var a=[];
-while(p&&(p.nodeType==1)&&(p.tagName.toLowerCase()!="body")){
-a.push(p);
-p=p.parentNode;
-}
-a.push(this._doc.body);
-return a;
-};
-Xinha.prototype._getFirstAncestor=function(sel,_1a3){
-var prnt=this.activeElement(sel);
-if(prnt===null){
-try{
-prnt=(Xinha.is_ie?this.createRange(sel).parentElement():this.createRange(sel).commonAncestorContainer);
-}
-catch(ex){
-return null;
-}
-}
-if(typeof _1a3=="string"){
-_1a3=[_1a3];
-}
-while(prnt){
-if(prnt.nodeType==1){
-if(_1a3===null){
-return prnt;
-}
-for(var _1a5=0;_1a5<_1a3.length;++_1a5){
-if(typeof _1a3[_1a5]=="string"&&_1a3[_1a5]==prnt.tagName.toLowerCase()){
-return prnt;
-}else{
-if(typeof _1a3[_1a5]=="function"&&_1a3[_1a5](this,prnt)){
-return prnt;
-}
-}
-}
-if(prnt.tagName.toLowerCase()=="body"){
-break;
-}
-if(prnt.tagName.toLowerCase()=="table"){
-break;
-}
-}
-prnt=prnt.parentNode;
-}
-return null;
-};
-Xinha.prototype._getAncestorBlock=function(sel){
-var prnt=(Xinha.is_ie?this.createRange(sel).parentElement:this.createRange(sel).commonAncestorContainer);
-while(prnt&&(prnt.nodeType==1)){
-switch(prnt.tagName.toLowerCase()){
-case "div":
-case "p":
-case "address":
-case "blockquote":
-case "center":
-case "del":
-case "ins":
-case "pre":
-case "h1":
-case "h2":
-case "h3":
-case "h4":
-case "h5":
-case "h6":
-case "h7":
-return prnt;
-case "body":
-case "noframes":
-case "dd":
-case "li":
-case "th":
-case "td":
-case "noscript":
-return null;
-default:
-break;
-}
-}
-return null;
-};
-Xinha.prototype._createImplicitBlock=function(type){
-var sel=this.getSelection();
-if(Xinha.is_ie){
-sel.empty();
-}else{
-sel.collapseToStart();
-}
-var rng=this.createRange(sel);
-};
-Xinha.prototype.surroundHTML=function(_1ab,_1ac){
-var html=this.getSelectedHTML();
-this.insertHTML(_1ab+html+_1ac);
-};
-Xinha.prototype.hasSelectedText=function(){
-return this.getSelectedHTML()!=="";
-};
-Xinha.prototype._comboSelected=function(el,txt){
-this.focusEditor();
-var _1b0=el.options[el.selectedIndex].value;
-switch(txt){
-case "fontname":
-case "fontsize":
-this.execCommand(txt,false,_1b0);
-break;
-case "formatblock":
-if(!_1b0){
-this.updateToolbar();
-break;
-}
-if(!Xinha.is_gecko||_1b0!=="blockquote"){
-_1b0="<"+_1b0+">";
-}
-this.execCommand(txt,false,_1b0);
-break;
-default:
-var _1b1=this.config.customSelects[txt];
-if(typeof _1b1!="undefined"){
-_1b1.action(this,_1b0,el,txt);
-}else{
-alert("FIXME: combo box "+txt+" not implemented");
-}
-break;
-}
-};
-Xinha.prototype._colorSelector=function(_1b2){
-var _1b3=this;
-if(Xinha.is_gecko){
-try{
-_1b3._doc.execCommand("useCSS",false,false);
-_1b3._doc.execCommand("styleWithCSS",false,true);
-}
-catch(ex){
-}
-}
-var btn=_1b3._toolbarObjects[_1b2].element;
-var _1b5;
-if(_1b2=="hilitecolor"){
-if(Xinha.is_ie){
-_1b2="backcolor";
-_1b5=Xinha._colorToRgb(_1b3._doc.queryCommandValue("backcolor"));
-}else{
-_1b5=Xinha._colorToRgb(_1b3._doc.queryCommandValue("hilitecolor"));
-}
-}else{
-_1b5=Xinha._colorToRgb(_1b3._doc.queryCommandValue("forecolor"));
-}
-var _1b6=function(_1b7){
-_1b3._doc.execCommand(_1b2,false,_1b7);
-};
-if(Xinha.is_ie){
-var _1b8=_1b3.createRange(_1b3.getSelection());
-_1b6=function(_1b9){
-_1b8.select();
-_1b3._doc.execCommand(_1b2,false,_1b9);
-};
-}
-var _1ba=new Xinha.colorPicker({cellsize:_1b3.config.colorPickerCellSize,callback:_1b6,granularity:_1b3.config.colorPickerGranularity,websafe:_1b3.config.colorPickerWebSafe,savecolors:_1b3.config.colorPickerSaveColors});
-_1ba.open(_1b3.config.colorPickerPosition,btn,_1b5);
-};
-Xinha.prototype.execCommand=function(_1bb,UI,_1bd){
-var _1be=this;
-this.focusEditor();
-_1bb=_1bb.toLowerCase();
-if(this.firePluginEvent("onExecCommand",_1bb,UI,_1bd)){
-this.updateToolbar();
-return false;
-}
-switch(_1bb){
-case "htmlmode":
-this.setMode();
-break;
-case "hilitecolor":
-case "forecolor":
-this._colorSelector(_1bb);
-break;
-case "createlink":
-this._createLink();
-break;
-case "undo":
-case "redo":
-if(this._customUndo){
-this[_1bb]();
-}else{
-this._doc.execCommand(_1bb,UI,_1bd);
-}
-break;
-case "inserttable":
-this._insertTable();
-break;
-case "insertimage":
-this._insertImage();
-break;
-case "showhelp":
-this._popupDialog(_1be.config.URIs.help,null,this);
-break;
-case "killword":
-this._wordClean();
-break;
-case "cut":
-case "copy":
-case "paste":
-this._doc.execCommand(_1bb,UI,_1bd);
-if(this.config.killWordOnPaste){
-this._wordClean();
-}
-break;
-case "lefttoright":
-case "righttoleft":
-if(this.config.changeJustifyWithDirection){
-this._doc.execCommand((_1bb=="righttoleft")?"justifyright":"justifyleft",UI,_1bd);
-}
-var dir=(_1bb=="righttoleft")?"rtl":"ltr";
-var el=this.getParentElement();
-while(el&&!Xinha.isBlockElement(el)){
-el=el.parentNode;
-}
-if(el){
-if(el.style.direction==dir){
-el.style.direction="";
-}else{
-el.style.direction=dir;
-}
-}
-break;
-case "justifyleft":
-case "justifyright":
-_1bb.match(/^justify(.*)$/);
-var ae=this.activeElement(this.getSelection());
-if(ae&&ae.tagName.toLowerCase()=="img"){
-ae.align=ae.align==RegExp.$1?"":RegExp.$1;
-}else{
-this._doc.execCommand(_1bb,UI,_1bd);
-}
-break;
-default:
-try{
-this._doc.execCommand(_1bb,UI,_1bd);
-}
-catch(ex){
-if(this.config.debug){
-alert(ex+"\n\nby execCommand("+_1bb+");");
-}
-}
-break;
-}
-this.updateToolbar();
-return false;
-};
-Xinha.prototype._editorEvent=function(ev){
-var _1c3=this;
-if(typeof _1c3._textArea["on"+ev.type]=="function"){
-_1c3._textArea["on"+ev.type](ev);
-}
-if(this.isKeyEvent(ev)){
-if(_1c3.firePluginEvent("onKeyPress",ev)){
-return false;
-}
-if(this.isShortCut(ev)){
-this._shortCuts(ev);
-}
-}
-if(ev.type=="mousedown"){
-if(_1c3.firePluginEvent("onMouseDown",ev)){
-return false;
-}
-}
-if(_1c3._timerToolbar){
-clearTimeout(_1c3._timerToolbar);
-}
-if(!this.suspendUpdateToolbar){
-_1c3._timerToolbar=setTimeout(function(){
-_1c3.updateToolbar();
-_1c3._timerToolbar=null;
-},250);
-}
-};
-Xinha.prototype._onDoubleClick=function(ev){
-var _1c5=this;
-var _1c6=Xinha.is_ie?ev.srcElement:ev.target;
-var tag=_1c6.tagName;
-var _1c8=_1c6.className;
-if(tag){
-tag=tag.toLowerCase();
-if(_1c8&&(this.config.dblclickList[tag+"."+_1c8]!=undefined)){
-this.config.dblclickList[tag+"."+_1c8][0](_1c5,_1c6);
-}else{
-if(this.config.dblclickList[tag]!=undefined){
-this.config.dblclickList[tag][0](_1c5,_1c6);
-}
-}
-}
-};
-Xinha.prototype._shortCuts=function(ev){
-var key=this.getKey(ev).toLowerCase();
-var cmd=null;
-var _1cc=null;
-switch(key){
-case "b":
-cmd="bold";
-break;
-case "i":
-cmd="italic";
-break;
-case "u":
-cmd="underline";
-break;
-case "s":
-cmd="strikethrough";
-break;
-case "l":
-cmd="justifyleft";
-break;
-case "e":
-cmd="justifycenter";
-break;
-case "r":
-cmd="justifyright";
-break;
-case "j":
-cmd="justifyfull";
-break;
-case "z":
-cmd="undo";
-break;
-case "y":
-cmd="redo";
-break;
-case "v":
-cmd="paste";
-break;
-case "n":
-cmd="formatblock";
-_1cc="p";
-break;
-case "0":
-cmd="killword";
-break;
-case "1":
-case "2":
-case "3":
-case "4":
-case "5":
-case "6":
-cmd="formatblock";
-_1cc="h"+key;
-break;
-}
-if(cmd){
-this.execCommand(cmd,false,_1cc);
-Xinha._stopEvent(ev);
-}
-};
-Xinha.prototype.convertNode=function(el,_1ce){
-var _1cf=this._doc.createElement(_1ce);
-while(el.firstChild){
-_1cf.appendChild(el.firstChild);
-}
-return _1cf;
-};
-Xinha.prototype.scrollToElement=function(e){
-if(!e){
-e=this.getParentElement();
-if(!e){
-return;
-}
-}
-var _1d1=Xinha.getElementTopLeft(e);
-this._iframe.contentWindow.scrollTo(_1d1.left,_1d1.top);
-};
-Xinha.prototype.getEditorContent=function(){
-return this.outwardHtml(this.getHTML());
-};
-Xinha.prototype.setEditorContent=function(html){
-this.setHTML(this.inwardHtml(html));
-};
-Xinha.updateTextareas=function(){
-var e;
-for(var i=0;i<__xinhas.length;i++){
-e=__xinhas[i];
-e._textArea.value=e.getEditorContent();
-}
-};
-Xinha.prototype.getHTML=function(){
-var html="";
-switch(this._editMode){
-case "wysiwyg":
-if(!this.config.fullPage){
-html=Xinha.getHTML(this._doc.body,false,this).trim();
-}else{
-html=this.doctype+"\n"+Xinha.getHTML(this._doc.documentElement,true,this);
-}
-break;
-case "textmode":
-html=this._textArea.value;
-break;
-default:
-alert("Mode <"+this._editMode+"> not defined!");
-return false;
-}
-return html;
-};
-Xinha.prototype.outwardHtml=function(html){
-for(var i in this.plugins){
-var _1d8=this.plugins[i].instance;
-if(_1d8&&typeof _1d8.outwardHtml=="function"){
-html=_1d8.outwardHtml(html);
-}
-}
-html=html.replace(/<(\/?)b(\s|>|\/)/ig,"<$1strong$2");
-html=html.replace(/<(\/?)i(\s|>|\/)/ig,"<$1em$2");
-html=html.replace(/<(\/?)strike(\s|>|\/)/ig,"<$1del$2");
-html=html.replace(/(<[^>]*on(click|mouse(over|out|up|down))=['"])if\(window\.parent &amp;&amp; window\.parent\.Xinha\)\{return false\}/gi,"$1");
-var _1d9=location.href.replace(/(https?:\/\/[^\/]*)\/.*/,"$1")+"/";
-html=html.replace(/https?:\/\/null\//g,_1d9);
-html=html.replace(/((href|src|background)=[\'\"])\/+/ig,"$1"+_1d9);
-html=this.outwardSpecialReplacements(html);
-html=this.fixRelativeLinks(html);
-if(this.config.sevenBitClean){
-html=html.replace(/[^ -~\r\n\t]/g,function(c){
-return (c!=Xinha.cc)?"&#"+c.charCodeAt(0)+";":c;
-});
-}
-html=html.replace(/(<script[^>]*((type=[\"\']text\/)|(language=[\"\'])))(freezescript)/gi,"$1javascript");
-if(this.config.fullPage){
-html=Xinha.stripCoreCSS(html);
-}
-if(typeof this.config.outwardHtml=="function"){
-html=this.config.outwardHtml(html);
-}
-return html;
-};
-Xinha.prototype.inwardHtml=function(html){
-for(var i in this.plugins){
-var _1dd=this.plugins[i].instance;
-if(_1dd&&typeof _1dd.inwardHtml=="function"){
-html=_1dd.inwardHtml(html);
-}
-}
-html=html.replace(/<(\/?)del(\s|>|\/)/ig,"<$1strike$2");
-html=html.replace(/(<[^>]*on(click|mouse(over|out|up|down))=["'])/gi,"$1if(window.parent &amp;&amp; window.parent.Xinha){return false}");
-html=this.inwardSpecialReplacements(html);
-html=html.replace(/(<script[^>]*((type=[\"\']text\/)|(language=[\"\'])))(javascript)/gi,"$1freezescript");
-var _1de=new RegExp("((href|src|background)=['\"])/+","gi");
-html=html.replace(_1de,"$1"+location.href.replace(/(https?:\/\/[^\/]*)\/.*/,"$1")+"/");
-html=this.fixRelativeLinks(html);
-if(this.config.fullPage){
-html=Xinha.addCoreCSS(html);
-}
-if(typeof this.config.inwardHtml=="function"){
-html=this.config.inwardHtml(html);
-}
-return html;
-};
-Xinha.prototype.outwardSpecialReplacements=function(html){
-for(var i in this.config.specialReplacements){
-var from=this.config.specialReplacements[i];
-var to=i;
-if(typeof from.replace!="function"||typeof to.replace!="function"){
-continue;
-}
-var reg=new RegExp(Xinha.escapeStringForRegExp(from),"g");
-html=html.replace(reg,to.replace(/\$/g,"$$$$"));
-}
-return html;
-};
-Xinha.prototype.inwardSpecialReplacements=function(html){
-for(var i in this.config.specialReplacements){
-var from=i;
-var to=this.config.specialReplacements[i];
-if(typeof from.replace!="function"||typeof to.replace!="function"){
-continue;
-}
-var reg=new RegExp(Xinha.escapeStringForRegExp(from),"g");
-html=html.replace(reg,to.replace(/\$/g,"$$$$"));
-}
-return html;
-};
-Xinha.prototype.fixRelativeLinks=function(html){
-if(typeof this.config.expandRelativeUrl!="undefined"&&this.config.expandRelativeUrl){
-if(html==null){
-return "";
-}
-var src=html.match(/(src|href)="([^"]*)"/gi);
-var b=document.location.href;
-if(src){
-var url,_1ed,_1ee,_1ef,_1f0;
-for(var i=0;i<src.length;++i){
-url=src[i].match(/(src|href)="([^"]*)"/i);
-_1ed=url[2].match(/\.\.\//g);
-if(_1ed){
-_1ee=new RegExp("(.*?)(([^/]*/){"+_1ed.length+"})[^/]*$");
-_1ef=b.match(_1ee);
-_1f0=url[2].replace(/(\.\.\/)*/,_1ef[1]);
-html=html.replace(new RegExp(Xinha.escapeStringForRegExp(url[2])),_1f0);
-}
-}
-}
-}
-if(typeof this.config.stripSelfNamedAnchors!="undefined"&&this.config.stripSelfNamedAnchors){
-var _1f2=new RegExp("((href|src|background)=\")("+Xinha.escapeStringForRegExp(window.unescape(document.location.href.replace(/&/g,"&amp;")))+")([#?][^'\" ]*)","g");
-html=html.replace(_1f2,"$1$4");
-}
-if(typeof this.config.stripBaseHref!="undefined"&&this.config.stripBaseHref){
-var _1f3=null;
-if(typeof this.config.baseHref!="undefined"&&this.config.baseHref!==null){
-_1f3=new RegExp("((href|src|background|action)=\")("+Xinha.escapeStringForRegExp(this.config.baseHref.replace(/([^\/]\/)(?=.+\.)[^\/]*$/,"$1"))+")","g");
-html=html.replace(_1f3,"$1");
-}
-_1f3=new RegExp("((href|src|background|action)=\")("+Xinha.escapeStringForRegExp(document.location.href.replace(/^(https?:\/\/[^\/]*)(.*)/,"$1"))+")","g");
-html=html.replace(_1f3,"$1");
-}
-return html;
-};
-Xinha.prototype.getInnerHTML=function(){
-if(!this._doc.body){
-return "";
-}
-var html="";
-switch(this._editMode){
-case "wysiwyg":
-if(!this.config.fullPage){
-html=this._doc.body.innerHTML;
-}else{
-html=this.doctype+"\n"+this._doc.documentElement.innerHTML;
-}
-break;
-case "textmode":
-html=this._textArea.value;
-break;
-default:
-alert("Mode <"+this._editMode+"> not defined!");
-return false;
-}
-return html;
-};
-Xinha.prototype.setHTML=function(html){
-if(!this.config.fullPage){
-this._doc.body.innerHTML=html;
-}else{
-this.setFullHTML(html);
-}
-this._textArea.value=html;
-};
-Xinha.prototype.setDoctype=function(_1f6){
-this.doctype=_1f6;
-};
-Xinha._object=null;
-Array.prototype.isArray=true;
-RegExp.prototype.isRegExp=true;
-Xinha.cloneObject=function(obj){
-if(!obj){
-return null;
-}
-var _1f8=obj.isArray?[]:{};
-if(obj.constructor.toString().match(/\s*function Function\(/)||typeof obj=="function"){
-_1f8=obj;
-}else{
-if(obj.isRegExp){
-_1f8=eval(obj.toString());
-}else{
-for(var n in obj){
-var node=obj[n];
-if(typeof node=="object"){
-_1f8[n]=Xinha.cloneObject(node);
-}else{
-_1f8[n]=node;
-}
-}
-}
-}
-return _1f8;
-};
-Xinha.extend=function(_1fb,_1fc){
-function inheritance(){
-};
-inheritance.prototype=_1fc.prototype;
-_1fb.prototype=new inheritance();
-_1fb.prototype.constructor=_1fb;
-_1fb.parentConstructor=_1fc;
-_1fb.superClass=_1fc.prototype;
-};
-Xinha.flushEvents=function(){
-var x=0;
-var e=Xinha._eventFlushers.pop();
-while(e){
-try{
-if(e.length==3){
-Xinha._removeEvent(e[0],e[1],e[2]);
-x++;
-}else{
-if(e.length==2){
-e[0]["on"+e[1]]=null;
-e[0]._xinha_dom0Events[e[1]]=null;
-x++;
-}
-}
-}
-catch(ex){
-}
-e=Xinha._eventFlushers.pop();
-}
-};
-Xinha._eventFlushers=[];
-if(document.addEventListener){
-Xinha._addEvent=function(el,_200,func){
-el.addEventListener(_200,func,false);
-Xinha._eventFlushers.push([el,_200,func]);
-};
-Xinha._removeEvent=function(el,_203,func){
-el.removeEventListener(_203,func,false);
-};
-Xinha._stopEvent=function(ev){
-ev.preventDefault();
-ev.stopPropagation();
-};
-}else{
-if(document.attachEvent){
-Xinha._addEvent=function(el,_207,func){
-el.attachEvent("on"+_207,func);
-Xinha._eventFlushers.push([el,_207,func]);
-};
-Xinha._removeEvent=function(el,_20a,func){
-el.detachEvent("on"+_20a,func);
-};
-Xinha._stopEvent=function(ev){
-try{
-ev.cancelBubble=true;
-ev.returnValue=false;
-}
-catch(ex){
-}
-};
-}else{
-Xinha._addEvent=function(el,_20e,func){
-alert("_addEvent is not supported");
-};
-Xinha._removeEvent=function(el,_211,func){
-alert("_removeEvent is not supported");
-};
-Xinha._stopEvent=function(ev){
-alert("_stopEvent is not supported");
-};
-}
-}
-Xinha._addEvents=function(el,evs,func){
-for(var i=evs.length;--i>=0;){
-Xinha._addEvent(el,evs[i],func);
-}
-};
-Xinha._removeEvents=function(el,evs,func){
-for(var i=evs.length;--i>=0;){
-Xinha._removeEvent(el,evs[i],func);
-}
-};
-Xinha.addOnloadHandler=function(func,_21d){
-_21d=_21d?_21d:window;
-var init=function(){
-if(arguments.callee.done){
-return;
-}
-arguments.callee.done=true;
-if(Xinha.onloadTimer){
-clearInterval(Xinha.onloadTimer);
-}
-func();
-};
-if(Xinha.is_ie){
-document.attachEvent("onreadystatechange",function(){
-if(document.readyState==="complete"){
-document.detachEvent("onreadystatechange",arguments.callee);
-init();
-}
-});
-if(document.documentElement.doScroll&&typeof window.frameElement==="undefined"){
-(function(){
-if(arguments.callee.done){
-return;
-}
-try{
-document.documentElement.doScroll("left");
-}
-catch(error){
-setTimeout(arguments.callee,0);
-return;
-}
-init();
-})();
-}
-}else{
-if(/applewebkit|KHTML/i.test(navigator.userAgent)){
-Xinha.onloadTimer=_21d.setInterval(function(){
-if(/loaded|complete/.test(_21d.document.readyState)){
-init();
-}
-},10);
-}else{
-_21d.document.addEventListener("DOMContentLoaded",init,false);
-}
-}
-Xinha._addEvent(_21d,"load",init);
-};
-Xinha.addDom0Event=function(el,ev,fn){
-Xinha._prepareForDom0Events(el,ev);
-el._xinha_dom0Events[ev].unshift(fn);
-};
-Xinha.prependDom0Event=function(el,ev,fn){
-Xinha._prepareForDom0Events(el,ev);
-el._xinha_dom0Events[ev].push(fn);
-};
-Xinha.getEvent=function(ev){
-return ev||window.event;
-};
-Xinha._prepareForDom0Events=function(el,ev){
-if(typeof el._xinha_dom0Events=="undefined"){
-el._xinha_dom0Events={};
-Xinha.freeLater(el,"_xinha_dom0Events");
-}
-if(typeof el._xinha_dom0Events[ev]=="undefined"){
-el._xinha_dom0Events[ev]=[];
-if(typeof el["on"+ev]=="function"){
-el._xinha_dom0Events[ev].push(el["on"+ev]);
-}
-el["on"+ev]=function(_228){
-var a=el._xinha_dom0Events[ev];
-var _22a=true;
-for(var i=a.length;--i>=0;){
-el._xinha_tempEventHandler=a[i];
-if(el._xinha_tempEventHandler(_228)===false){
-el._xinha_tempEventHandler=null;
-_22a=false;
-break;
-}
-el._xinha_tempEventHandler=null;
-}
-return _22a;
-};
-Xinha._eventFlushers.push([el,ev]);
-}
-};
-Xinha.prototype.notifyOn=function(ev,fn){
-if(typeof this._notifyListeners[ev]=="undefined"){
-this._notifyListeners[ev]=[];
-Xinha.freeLater(this,"_notifyListeners");
-}
-this._notifyListeners[ev].push(fn);
-};
-Xinha.prototype.notifyOf=function(ev,args){
-if(this._notifyListeners[ev]){
-for(var i=0;i<this._notifyListeners[ev].length;i++){
-this._notifyListeners[ev][i](ev,args);
-}
-}
-};
-Xinha._blockTags=" body form textarea fieldset ul ol dl li div "+"p h1 h2 h3 h4 h5 h6 quote pre table thead "+"tbody tfoot tr td th iframe address blockquote title meta link style head ";
-Xinha.isBlockElement=function(el){
-return el&&el.nodeType==1&&(Xinha._blockTags.indexOf(" "+el.tagName.toLowerCase()+" ")!=-1);
-};
-Xinha._paraContainerTags=" body td th caption fieldset div ";
-Xinha.isParaContainer=function(el){
-return el&&el.nodeType==1&&(Xinha._paraContainerTags.indexOf(" "+el.tagName.toLowerCase()+" ")!=-1);
-};
-Xinha._closingTags=" a abbr acronym address applet b bdo big blockquote button caption center cite code del dfn dir div dl em fieldset font form frameset h1 h2 h3 h4 h5 h6 i iframe ins kbd label legend map menu noframes noscript object ol optgroup pre q s samp script select small span strike strong style sub sup table textarea title tt u ul var ";
-Xinha.needsClosingTag=function(el){
-return el&&el.nodeType==1&&(Xinha._closingTags.indexOf(" "+el.tagName.toLowerCase()+" ")!=-1);
-};
-Xinha.htmlEncode=function(str){
-if(!str){
-return "";
-}
-if(typeof str.replace=="undefined"){
-str=str.toString();
-}
-str=str.replace(/&/ig,"&amp;");
-str=str.replace(/</ig,"&lt;");
-str=str.replace(/>/ig,"&gt;");
-str=str.replace(/\xA0/g,"&nbsp;");
-str=str.replace(/\x22/g,"&quot;");
-return str;
-};
-Xinha.prototype.stripBaseURL=function(_235){
-if(this.config.baseHref===null||!this.config.stripBaseHref){
-return _235;
-}
-var _236=this.config.baseHref.replace(/^(https?:\/\/[^\/]+)(.*)$/,"$1");
-var _237=new RegExp(_236);
-return _235.replace(_237,"");
-};
-if(typeof String.prototype.trim!="function"){
-String.prototype.trim=function(){
-return this.replace(/^\s+/,"").replace(/\s+$/,"");
-};
-}
-Xinha._makeColor=function(v){
-if(typeof v!="number"){
-return v;
-}
-var r=v&255;
-var g=(v>>8)&255;
-var b=(v>>16)&255;
-return "rgb("+r+","+g+","+b+")";
-};
-Xinha._colorToRgb=function(v){
-if(!v){
-return "";
-}
-var r,g,b;
-function hex(d){
-return (d<16)?("0"+d.toString(16)):d.toString(16);
-};
-if(typeof v=="number"){
-r=v&255;
-g=(v>>8)&255;
-b=(v>>16)&255;
-return "#"+hex(r)+hex(g)+hex(b);
-}
-if(v.substr(0,3)=="rgb"){
-var re=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/;
-if(v.match(re)){
-r=parseInt(RegExp.$1,10);
-g=parseInt(RegExp.$2,10);
-b=parseInt(RegExp.$3,10);
-return "#"+hex(r)+hex(g)+hex(b);
-}
-return null;
-}
-if(v.substr(0,1)=="#"){
-return v;
-}
-return null;
-};
-Xinha.prototype._popupDialog=function(url,_243,init){
-Dialog(this.popupURL(url),_243,init);
-};
-Xinha.prototype.imgURL=function(file,_246){
-if(typeof _246=="undefined"){
-return _editor_url+file;
-}else{
-return Xinha.getPluginDir(_246)+"/img/"+file;
-}
-};
-Xinha.prototype.popupURL=function(file){
-var url="";
-if(file.match(/^plugin:\/\/(.*?)\/(.*)/)){
-var _249=RegExp.$1;
-var _24a=RegExp.$2;
-if(!/\.(html?|php)$/.test(_24a)){
-_24a+=".html";
-}
-url=Xinha.getPluginDir(_249)+"/popups/"+_24a;
-}else{
-if(file.match(/^\/.*?/)||file.match(/^https?:\/\//)){
-url=file;
-}else{
-url=_editor_url+this.config.popupURL+file;
-}
-}
-return url;
-};
-Xinha.getElementById=function(tag,id){
-var el,i,objs=document.getElementsByTagName(tag);
-for(i=objs.length;--i>=0&&(el=objs[i]);){
-if(el.id==id){
-return el;
-}
-}
-return null;
-};
-Xinha.prototype._toggleBorders=function(){
-var _250=this._doc.getElementsByTagName("TABLE");
-if(_250.length!==0){
-if(!this.borders){
-this.borders=true;
-}else{
-this.borders=false;
-}
-for(var i=0;i<_250.length;i++){
-if(this.borders){
-Xinha._addClass(_250[i],"htmtableborders");
-}else{
-Xinha._removeClass(_250[i],"htmtableborders");
-}
-}
-}
-return true;
-};
-Xinha.addCoreCSS=function(html){
-var _253="<style title=\"XinhaInternalCSS\" type=\"text/css\">"+".htmtableborders, .htmtableborders td, .htmtableborders th {border : 1px dashed lightgrey ! important;}\n"+"html, body { border: 0px; } \n"+"body { background-color: #ffffff; } \n"+"img, hr { cursor: default } \n"+"</style>\n";
-if(html&&/<head>/i.test(html)){
-return html.replace(/<head>/i,"<head>"+_253);
-}else{
-if(html){
-return _253+html;
-}else{
-return _253;
-}
-}
-};
-Xinha.prototype.addEditorStylesheet=function(_254){
-var _255=this._doc.createElement("link");
-_255.rel="stylesheet";
-_255.type="text/css";
-_255.title="XinhaInternalCSS";
-_255.href=_254;
-this._doc.getElementsByTagName("HEAD")[0].appendChild(_255);
-};
-Xinha.stripCoreCSS=function(html){
-return html.replace(/<style[^>]+title="XinhaInternalCSS"(.|\n)*?<\/style>/ig,"").replace(/<link[^>]+title="XinhaInternalCSS"(.|\n)*?>/ig,"");
-};
-Xinha._removeClass=function(el,_258){
-if(!(el&&el.className)){
-return;
-}
-var cls=el.className.split(" ");
-var ar=[];
-for(var i=cls.length;i>0;){
-if(cls[--i]!=_258){
-ar[ar.length]=cls[i];
-}
-}
-el.className=ar.join(" ");
-};
-Xinha._addClass=function(el,_25d){
-Xinha._removeClass(el,_25d);
-el.className+=" "+_25d;
-};
-Xinha.addClasses=function(el,_25f){
-if(el!==null){
-var _260=el.className.trim().split(" ");
-var ours=_25f.split(" ");
-for(var x=0;x<ours.length;x++){
-var _263=false;
-for(var i=0;_263===false&&i<_260.length;i++){
-if(_260[i]==ours[x]){
-_263=true;
-}
-}
-if(_263===false){
-_260[_260.length]=ours[x];
-}
-}
-el.className=_260.join(" ").trim();
-}
-};
-Xinha.removeClasses=function(el,_266){
-var _267=el.className.trim().split();
-var _268=[];
-var _269=_266.trim().split();
-for(var i=0;i<_267.length;i++){
-var _26b=false;
-for(var x=0;x<_269.length&&!_26b;x++){
-if(_267[i]==_269[x]){
-_26b=true;
-}
-}
-if(!_26b){
-_268[_268.length]=_267[i];
-}
-}
-return _268.join(" ");
-};
-Xinha.addClass=Xinha._addClass;
-Xinha.removeClass=Xinha._removeClass;
-Xinha._addClasses=Xinha.addClasses;
-Xinha._removeClasses=Xinha.removeClasses;
-Xinha._hasClass=function(el,_26e){
-if(!(el&&el.className)){
-return false;
-}
-var cls=el.className.split(" ");
-for(var i=cls.length;i>0;){
-if(cls[--i]==_26e){
-return true;
-}
-}
-return false;
-};
-Xinha._postback_send_charset=true;
-Xinha._postback=function(url,data,_273,_274){
-var req=null;
-req=Xinha.getXMLHTTPRequestObject();
-var _276="";
-if(typeof data=="string"){
-_276=data;
-}else{
-if(typeof data=="object"){
-for(var i in data){
-_276+=(_276.length?"&":"")+i+"="+encodeURIComponent(data[i]);
-}
-}
-}
-function callBack(){
-if(req.readyState==4){
-if(((req.status/100)==2)||Xinha.isRunLocally&&req.status===0){
-if(typeof _273=="function"){
-_273(req.responseText,req);
-}
-}else{
-if(Xinha._postback_send_charset){
-Xinha._postback_send_charset=false;
-Xinha._postback(url,data,_273,_274);
-}else{
-if(typeof _274=="function"){
-_274(req);
-}else{
-alert("An error has occurred: "+req.statusText+"\nURL: "+url);
-}
-}
-}
-}
-};
-req.onreadystatechange=callBack;
-req.open("POST",url,true);
-req.setRequestHeader("Content-Type","application/x-www-form-urlencoded"+(Xinha._postback_send_charset?"; charset=UTF-8":""));
-req.send(_276);
-};
-Xinha._getback=function(url,_279,_27a){
-var req=null;
-req=Xinha.getXMLHTTPRequestObject();
-function callBack(){
-if(req.readyState==4){
-if(((req.status/100)==2)||Xinha.isRunLocally&&req.status===0){
-_279(req.responseText,req);
-}else{
-if(typeof _27a=="function"){
-_27a(req);
-}else{
-alert("An error has occurred: "+req.statusText+"\nURL: "+url);
-}
-}
-}
-};
-req.onreadystatechange=callBack;
-req.open("GET",url,true);
-req.send(null);
-};
-Xinha.ping=function(url,_27d,_27e){
-var req=null;
-req=Xinha.getXMLHTTPRequestObject();
-function callBack(){
-if(req.readyState==4){
-if(((req.status/100)==2)||Xinha.isRunLocally&&req.status===0){
-if(_27d){
-_27d(req);
-}
-}else{
-if(_27e){
-_27e(req);
-}
-}
-}
-};
-var _280="GET";
-req.onreadystatechange=callBack;
-req.open(_280,url,true);
-req.send(null);
-};
-Xinha._geturlcontent=function(url,_282){
-var req=null;
-req=Xinha.getXMLHTTPRequestObject();
-req.open("GET",url,false);
-req.send(null);
-if(((req.status/100)==2)||Xinha.isRunLocally&&req.status===0){
-return (_282)?req.responseXML:req.responseText;
-}else{
-return "";
-}
-};
-if(typeof dumpValues=="undefined"){
-dumpValues=function(o){
-var s="";
-for(var prop in o){
-if(window.console&&typeof window.console.log=="function"){
-if(typeof console.firebug!="undefined"){
-console.log(o);
-}else{
-console.log(prop+" = "+o[prop]+"\n");
-}
-}else{
-s+=prop+" = "+o[prop]+"\n";
-}
-}
-if(s){
-if(document.getElementById("errors")){
-document.getElementById("errors").value+=s;
-}else{
-var x=window.open("","debugger");
-x.document.write("<pre>"+s+"</pre>");
-}
-}
-};
-}
-if(!Array.prototype.contains){
-Array.prototype.contains=function(_288){
-var _289=this;
-for(var i=0;i<_289.length;i++){
-if(_288==_289[i]){
-return true;
-}
-}
-return false;
-};
-}
-if(!Array.prototype.indexOf){
-Array.prototype.indexOf=function(_28b){
-var _28c=this;
-for(var i=0;i<_28c.length;i++){
-if(_28b==_28c[i]){
-return i;
-}
-}
-return null;
-};
-}
-if(!Array.prototype.append){
-Array.prototype.append=function(a){
-for(var i=0;i<a.length;i++){
-this.push(a[i]);
-}
-return this;
-};
-}
-if(!Array.prototype.forEach){
-Array.prototype.forEach=function(fn){
-var len=this.length;
-if(typeof fn!="function"){
-throw new TypeError();
-}
-var _292=arguments[1];
-for(var i=0;i<len;i++){
-if(i in this){
-fn.call(_292,this[i],i,this);
-}
-}
-};
-}
-Xinha.getElementsByClassName=function(el,_295){
-if(el.getElementsByClassName){
-return Array.prototype.slice.call(el.getElementsByClassName(_295));
-}else{
-var els=el.getElementsByTagName("*");
-var _297=[];
-var _298;
-for(var i=0;i<els.length;i++){
-_298=els[i].className.split(" ");
-if(_298.contains(_295)){
-_297.push(els[i]);
-}
-}
-return _297;
-}
-};
-Xinha.arrayContainsArray=function(a1,a2){
-var _29c=true;
-for(var x=0;x<a2.length;x++){
-var _29e=false;
-for(var i=0;i<a1.length;i++){
-if(a1[i]==a2[x]){
-_29e=true;
-break;
-}
-}
-if(!_29e){
-_29c=false;
-break;
-}
-}
-return _29c;
-};
-Xinha.arrayFilter=function(a1,_2a1){
-var _2a2=[];
-for(var x=0;x<a1.length;x++){
-if(_2a1(a1[x])){
-_2a2[_2a2.length]=a1[x];
-}
-}
-return _2a2;
-};
-Xinha.collectionToArray=function(_2a4){
-try{
-return _2a4.length?Array.prototype.slice.call(_2a4):[];
-}
-catch(e){
-}
-var _2a5=[];
-for(var i=0;i<_2a4.length;i++){
-_2a5.push(_2a4.item(i));
-}
-return _2a5;
-};
-Xinha.uniq_count=0;
-Xinha.uniq=function(_2a7){
-return _2a7+Xinha.uniq_count++;
-};
-Xinha._loadlang=function(_2a8,url){
-var lang;
-if(typeof _editor_lcbackend=="string"){
-url=_editor_lcbackend;
-url=url.replace(/%lang%/,_editor_lang);
-url=url.replace(/%context%/,_2a8);
-}else{
-if(!url){
-if(_2a8!="Xinha"){
-url=Xinha.getPluginDir(_2a8)+"/lang/"+_editor_lang+".js";
-}else{
-Xinha.setLoadingMessage("Loading language");
-url=_editor_url+"lang/"+_editor_lang+".js";
-}
-}
-}
-var _2ab=Xinha._geturlcontent(url);
-if(_2ab!==""){
-try{
-eval("lang = "+_2ab);
-}
-catch(ex){
-alert("Error reading Language-File ("+url+"):\n"+Error.toString());
-lang={};
-}
-}else{
-lang={};
-}
-return lang;
-};
-Xinha._lc=function(_2ac,_2ad,_2ae){
-var url,ret;
-if(typeof _2ad=="object"&&_2ad.url&&_2ad.context){
-url=_2ad.url+_editor_lang+".js";
-_2ad=_2ad.context;
-}
-var m=null;
-if(typeof _2ac=="string"){
-m=_2ac.match(/\$(.*?)=(.*?)\$/g);
-}
-if(m){
-if(!_2ae){
-_2ae={};
-}
-for(var i=0;i<m.length;i++){
-var n=m[i].match(/\$(.*?)=(.*?)\$/);
-_2ae[n[1]]=n[2];
-_2ac=_2ac.replace(n[0],"$"+n[1]);
-}
-}
-if(_editor_lang=="en"){
-if(typeof _2ac=="object"&&_2ac.string){
-ret=_2ac.string;
-}else{
-ret=_2ac;
-}
-}else{
-if(typeof Xinha._lc_catalog=="undefined"){
-Xinha._lc_catalog=[];
-}
-if(typeof _2ad=="undefined"){
-_2ad="Xinha";
-}
-if(typeof Xinha._lc_catalog[_2ad]=="undefined"){
-Xinha._lc_catalog[_2ad]=Xinha._loadlang(_2ad,url);
-}
-var key;
-if(typeof _2ac=="object"&&_2ac.key){
-key=_2ac.key;
-}else{
-if(typeof _2ac=="object"&&_2ac.string){
-key=_2ac.string;
-}else{
-key=_2ac;
-}
-}
-if(typeof Xinha._lc_catalog[_2ad][key]=="undefined"){
-if(_2ad=="Xinha"){
-if(typeof _2ac=="object"&&_2ac.string){
-ret=_2ac.string;
-}else{
-ret=_2ac;
-}
-}else{
-return Xinha._lc(_2ac,"Xinha",_2ae);
-}
-}else{
-ret=Xinha._lc_catalog[_2ad][key];
-}
-}
-if(typeof _2ac=="object"&&_2ac.replace){
-_2ae=_2ac.replace;
-}
-if(typeof _2ae!="undefined"){
-for(i in _2ae){
-ret=ret.replace("$"+i,_2ae[i]);
-}
-}
-return ret;
-};
-Xinha.hasDisplayedChildren=function(el){
-var _2b6=el.childNodes;
-for(var i=0;i<_2b6.length;i++){
-if(_2b6[i].tagName){
-if(_2b6[i].style.display!="none"){
-return true;
-}
-}
-}
-return false;
-};
-Xinha._loadback=function(url,_2b9,_2ba,_2bb){
-if(document.getElementById(url)){
-return true;
-}
-var t=!Xinha.is_ie?"onload":"onreadystatechange";
-var s=document.createElement("script");
-s.type="text/javascript";
-s.src=url;
-s.id=url;
-if(_2b9){
-s[t]=function(){
-if(Xinha.is_ie&&(!/loaded|complete/.test(window.event.srcElement.readyState))){
-return;
-}
-_2b9.call(_2ba?_2ba:this,_2bb);
-s[t]=null;
-};
-}
-document.getElementsByTagName("head")[0].appendChild(s);
-return false;
-};
-Xinha.makeEditors=function(_2be,_2bf,_2c0){
-if(!Xinha.isSupportedBrowser){
-return;
-}
-if(typeof _2bf=="function"){
-_2bf=_2bf();
-}
-var _2c1={};
-var _2c2;
-for(var x=0;x<_2be.length;x++){
-if(typeof _2be[x]=="string"){
-_2c2=Xinha.getElementById("textarea",_2be[x]);
-if(!_2c2){
-_2be[x]=null;
-continue;
-}
-}else{
-if(typeof _2be[x]=="object"&&_2be[x].tagName&&_2be[x].tagName.toLowerCase()=="textarea"){
-_2c2=_2be[x];
-if(!_2c2.id){
-_2c2.id="xinha_id_"+x;
-}
-}
-}
-var _2c4=new Xinha(_2c2,Xinha.cloneObject(_2bf));
-_2c4.registerPlugins(_2c0);
-_2c1[_2c2.id]=_2c4;
-}
-return _2c1;
-};
-Xinha.startEditors=function(_2c5){
-if(!Xinha.isSupportedBrowser){
-return;
-}
-for(var i in _2c5){
-if(_2c5[i].generate){
-_2c5[i].generate();
-}
-}
-};
-Xinha.prototype.registerPlugins=function(_2c7){
-if(!Xinha.isSupportedBrowser){
-return;
-}
-if(_2c7){
-for(var i=0;i<_2c7.length;i++){
-this.setLoadingMessage(Xinha._lc("Register plugin $plugin","Xinha",{"plugin":_2c7[i]}));
-this.registerPlugin(_2c7[i]);
-}
-}
-};
-Xinha.base64_encode=function(_2c9){
-var _2ca="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
-var _2cb="";
-var chr1,chr2,chr3;
-var enc1,enc2,enc3,enc4;
-var i=0;
-do{
-chr1=_2c9.charCodeAt(i++);
-chr2=_2c9.charCodeAt(i++);
-chr3=_2c9.charCodeAt(i++);
-enc1=chr1>>2;
-enc2=((chr1&3)<<4)|(chr2>>4);
-enc3=((chr2&15)<<2)|(chr3>>6);
-enc4=chr3&63;
-if(isNaN(chr2)){
-enc3=enc4=64;
-}else{
-if(isNaN(chr3)){
-enc4=64;
-}
-}
-_2cb=_2cb+_2ca.charAt(enc1)+_2ca.charAt(enc2)+_2ca.charAt(enc3)+_2ca.charAt(enc4);
-}while(i<_2c9.length);
-return _2cb;
-};
-Xinha.base64_decode=function(_2d4){
-var _2d5="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
-var _2d6="";
-var chr1,chr2,chr3;
-var enc1,enc2,enc3,enc4;
-var i=0;
-_2d4=_2d4.replace(/[^A-Za-z0-9\+\/\=]/g,"");
-do{
-enc1=_2d5.indexOf(_2d4.charAt(i++));
-enc2=_2d5.indexOf(_2d4.charAt(i++));
-enc3=_2d5.indexOf(_2d4.charAt(i++));
-enc4=_2d5.indexOf(_2d4.charAt(i++));
-chr1=(enc1<<2)|(enc2>>4);
-chr2=((enc2&15)<<4)|(enc3>>2);
-chr3=((enc3&3)<<6)|enc4;
-_2d6=_2d6+String.fromCharCode(chr1);
-if(enc3!=64){
-_2d6=_2d6+String.fromCharCode(chr2);
-}
-if(enc4!=64){
-_2d6=_2d6+String.fromCharCode(chr3);
-}
-}while(i<_2d4.length);
-return _2d6;
-};
-Xinha.removeFromParent=function(el){
-if(!el.parentNode){
-return;
-}
-var pN=el.parentNode;
-return pN.removeChild(el);
-};
-Xinha.hasParentNode=function(el){
-if(el.parentNode){
-if(el.parentNode.nodeType==11){
-return false;
-}
-return true;
-}
-return false;
-};
-Xinha.viewportSize=function(_2e2){
-_2e2=(_2e2)?_2e2:window;
-var x,y;
-if(_2e2.innerHeight){
-x=_2e2.innerWidth;
-y=_2e2.innerHeight;
-}else{
-if(_2e2.document.documentElement&&_2e2.document.documentElement.clientHeight){
-x=_2e2.document.documentElement.clientWidth;
-y=_2e2.document.documentElement.clientHeight;
-}else{
-if(_2e2.document.body){
-x=_2e2.document.body.clientWidth;
-y=_2e2.document.body.clientHeight;
-}
-}
-}
-return {"x":x,"y":y};
-};
-Xinha.pageSize=function(_2e5){
-_2e5=(_2e5)?_2e5:window;
-var x,y;
-var _2e8=_2e5.document.body.scrollHeight;
-var _2e9=_2e5.document.documentElement.scrollHeight;
-if(_2e8>_2e9){
-x=_2e5.document.body.scrollWidth;
-y=_2e5.document.body.scrollHeight;
-}else{
-x=_2e5.document.documentElement.scrollWidth;
-y=_2e5.document.documentElement.scrollHeight;
-}
-return {"x":x,"y":y};
-};
-Xinha.prototype.scrollPos=function(_2ea){
-_2ea=(_2ea)?_2ea:window;
-var x,y;
-if(typeof _2ea.pageYOffset!="undefined"){
-x=_2ea.pageXOffset;
-y=_2ea.pageYOffset;
-}else{
-if(_2ea.document.documentElement&&typeof document.documentElement.scrollTop!="undefined"){
-x=_2ea.document.documentElement.scrollLeft;
-y=_2ea.document.documentElement.scrollTop;
-}else{
-if(_2ea.document.body){
-x=_2ea.document.body.scrollLeft;
-y=_2ea.document.body.scrollTop;
-}
-}
-}
-return {"x":x,"y":y};
-};
-Xinha.getElementTopLeft=function(_2ed){
-var _2ee=0;
-var _2ef=0;
-if(_2ed.offsetParent){
-_2ee=_2ed.offsetLeft;
-_2ef=_2ed.offsetTop;
-while(_2ed=_2ed.offsetParent){
-_2ee+=_2ed.offsetLeft;
-_2ef+=_2ed.offsetTop;
-}
-}
-return {top:_2ef,left:_2ee};
-};
-Xinha.findPosX=function(obj){
-var _2f1=0;
-if(obj.offsetParent){
-return Xinha.getElementTopLeft(obj).left;
-}else{
-if(obj.x){
-_2f1+=obj.x;
-}
-}
-return _2f1;
-};
-Xinha.findPosY=function(obj){
-var _2f3=0;
-if(obj.offsetParent){
-return Xinha.getElementTopLeft(obj).top;
-}else{
-if(obj.y){
-_2f3+=obj.y;
-}
-}
-return _2f3;
-};
-Xinha.createLoadingMessages=function(_2f4){
-if(Xinha.loadingMessages||!Xinha.isSupportedBrowser){
-return;
-}
-Xinha.loadingMessages=[];
-for(var i=0;i<_2f4.length;i++){
-if(!document.getElementById(_2f4[i])){
-continue;
-}
-Xinha.loadingMessages.push(Xinha.createLoadingMessage(Xinha.getElementById("textarea",_2f4[i])));
-}
-};
-Xinha.createLoadingMessage=function(_2f6,text){
-if(document.getElementById("loading_"+_2f6.id)||!Xinha.isSupportedBrowser){
-return;
-}
-var _2f8=document.createElement("div");
-_2f8.id="loading_"+_2f6.id;
-_2f8.className="loading";
-_2f8.style.left=(Xinha.findPosX(_2f6)+_2f6.offsetWidth/2)-106+"px";
-_2f8.style.top=(Xinha.findPosY(_2f6)+_2f6.offsetHeight/2)-50+"px";
-var _2f9=document.createElement("div");
-_2f9.className="loading_main";
-_2f9.id="loading_main_"+_2f6.id;
-_2f9.appendChild(document.createTextNode(Xinha._lc("Loading in progress. Please wait!")));
-var _2fa=document.createElement("div");
-_2fa.className="loading_sub";
-_2fa.id="loading_sub_"+_2f6.id;
-text=text?text:Xinha._lc("Loading Core");
-_2fa.appendChild(document.createTextNode(text));
-_2f8.appendChild(_2f9);
-_2f8.appendChild(_2fa);
-document.body.appendChild(_2f8);
-Xinha.freeLater(_2f8);
-Xinha.freeLater(_2f9);
-Xinha.freeLater(_2fa);
-return _2fa;
-};
-Xinha.prototype.setLoadingMessage=function(_2fb,_2fc){
-if(!document.getElementById("loading_sub_"+this._textArea.id)){
-return;
-}
-document.getElementById("loading_main_"+this._textArea.id).innerHTML=_2fc?_2fc:Xinha._lc("Loading in progress. Please wait!");
-document.getElementById("loading_sub_"+this._textArea.id).innerHTML=_2fb;
-};
-Xinha.setLoadingMessage=function(_2fd){
-if(!Xinha.loadingMessages){
-return;
-}
-for(var i=0;i<Xinha.loadingMessages.length;i++){
-Xinha.loadingMessages[i].innerHTML=_2fd;
-}
-};
-Xinha.prototype.removeLoadingMessage=function(){
-if(document.getElementById("loading_"+this._textArea.id)){
-document.body.removeChild(document.getElementById("loading_"+this._textArea.id));
-}
-};
-Xinha.removeLoadingMessages=function(_2ff){
-for(var i=0;i<_2ff.length;i++){
-if(!document.getElementById(_2ff[i])){
-continue;
-}
-var main=document.getElementById("loading_"+document.getElementById(_2ff[i]).id);
-main.parentNode.removeChild(main);
-}
-Xinha.loadingMessages=null;
-};
-Xinha.toFree=[];
-Xinha.freeLater=function(obj,prop){
-Xinha.toFree.push({o:obj,p:prop});
-};
-Xinha.free=function(obj,prop){
-if(obj&&!prop){
-for(var p in obj){
-Xinha.free(obj,p);
-}
-}else{
-if(obj){
-if(prop.indexOf("src")==-1){
-try{
-obj[prop]=null;
-}
-catch(x){
-}
-}
-}
-}
-};
-Xinha.collectGarbageForIE=function(){
-Xinha.flushEvents();
-for(var x=0;x<Xinha.toFree.length;x++){
-Xinha.free(Xinha.toFree[x].o,Xinha.toFree[x].p);
-Xinha.toFree[x].o=null;
-}
-};
-Xinha.prototype.insertNodeAtSelection=function(_308){
-Xinha.notImplemented("insertNodeAtSelection");
-};
-Xinha.prototype.getParentElement=function(sel){
-Xinha.notImplemented("getParentElement");
-};
-Xinha.prototype.activeElement=function(sel){
-Xinha.notImplemented("activeElement");
-};
-Xinha.prototype.selectionEmpty=function(sel){
-Xinha.notImplemented("selectionEmpty");
-};
-Xinha.prototype.saveSelection=function(){
-Xinha.notImplemented("saveSelection");
-};
-Xinha.prototype.restoreSelection=function(_30c){
-Xinha.notImplemented("restoreSelection");
-};
-Xinha.prototype.selectNodeContents=function(node,pos){
-Xinha.notImplemented("selectNodeContents");
-};
-Xinha.prototype.insertHTML=function(html){
-Xinha.notImplemented("insertHTML");
-};
-Xinha.prototype.getSelectedHTML=function(){
-Xinha.notImplemented("getSelectedHTML");
-};
-Xinha.prototype.getSelection=function(){
-Xinha.notImplemented("getSelection");
-};
-Xinha.prototype.createRange=function(sel){
-Xinha.notImplemented("createRange");
-};
-Xinha.prototype.isKeyEvent=function(_311){
-Xinha.notImplemented("isKeyEvent");
-};
-Xinha.prototype.isShortCut=function(_312){
-if(_312.ctrlKey&&!_312.altKey){
-return true;
-}
-return false;
-};
-Xinha.prototype.getKey=function(_313){
-Xinha.notImplemented("getKey");
-};
-Xinha.getOuterHTML=function(_314){
-Xinha.notImplemented("getOuterHTML");
-};
-Xinha.getXMLHTTPRequestObject=function(){
-try{
-if(typeof XMLHttpRequest!="undefined"&&typeof XMLHttpRequest.constructor=="function"){
-return new XMLHttpRequest();
-}else{
-if(typeof ActiveXObject=="function"){
-return new ActiveXObject("Microsoft.XMLHTTP");
-}
-}
-}
-catch(e){
-Xinha.notImplemented("getXMLHTTPRequestObject");
-}
-};
-Xinha.prototype._activeElement=function(sel){
-return this.activeElement(sel);
-};
-Xinha.prototype._selectionEmpty=function(sel){
-return this.selectionEmpty(sel);
-};
-Xinha.prototype._getSelection=function(){
-return this.getSelection();
-};
-Xinha.prototype._createRange=function(sel){
-return this.createRange(sel);
-};
-HTMLArea=Xinha;
-Xinha.init();
-if(Xinha.ie_version<8){
-Xinha.addDom0Event(window,"unload",Xinha.collectGarbageForIE);
-}
-Xinha.debugMsg=function(text,_319){
-if(typeof console!="undefined"&&typeof console.log=="function"){
-if(_319&&_319=="warn"&&typeof console.warn=="function"){
-console.warn(text);
-}else{
-if(_319&&_319=="info"&&typeof console.info=="function"){
-console.info(text);
-}else{
-console.log(text);
-}
-}
-}else{
-if(typeof opera!="undefined"&&typeof opera.postError=="function"){
-opera.postError(text);
-}
-}
-};
-Xinha.notImplemented=function(_31a){
-throw new Error("Method Not Implemented","Part of Xinha has tried to call the "+_31a+" method which has not been implemented.");
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/XinhaLoader.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/XinhaLoader.js
deleted file mode 100755
index 8c80a57..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/XinhaLoader.js
+++ /dev/null
@@ -1,213 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/XinhaLoader.js */
-var Xinha={};
-if(!window._editor_url){
-(function(){
-var _1=document.getElementsByTagName("script");
-var _2=_1[_1.length-1];
-var _3=_2.src.split("?");
-_3=_3.length==2?_3[1].split("&"):"";
-for(var _4=0;_4<_3.length;++_4){
-var _5=_3[_4].split("=");
-if(_5.length==2){
-switch(_5[0]){
-case "lang":
-case "icons":
-case "skin":
-case "url":
-window["_editor_"+_5[0]]=_5[1];
-break;
-}
-}
-}
-if(_2.innerHTML.replace(/\s+/,"")){
-eval(_2.innerHTML);
-}
-_editor_lang=window._editor_lang||"en";
-_editor_url=window._editor_url||_2.src.split("?")[0].split("/").slice(0,-1).join("/");
-})();
-}
-_editor_url=_editor_url.replace(/\x2f*$/,"/");
-Xinha.agt=navigator.userAgent.toLowerCase();
-Xinha.is_ie=((Xinha.agt.indexOf("msie")!=-1)&&(Xinha.agt.indexOf("opera")==-1));
-Xinha.ie_version=parseFloat(Xinha.agt.substring(Xinha.agt.indexOf("msie")+5));
-Xinha.is_opera=(Xinha.agt.indexOf("opera")!=-1);
-Xinha.is_khtml=(Xinha.agt.indexOf("khtml")!=-1);
-Xinha.is_webkit=(Xinha.agt.indexOf("applewebkit")!=-1);
-Xinha.is_safari=(Xinha.agt.indexOf("safari")!=-1);
-Xinha.opera_version=navigator.appVersion.substring(0,navigator.appVersion.indexOf(" "))*1;
-Xinha.is_mac=(Xinha.agt.indexOf("mac")!=-1);
-Xinha.is_mac_ie=(Xinha.is_ie&&Xinha.is_mac);
-Xinha.is_win_ie=(Xinha.is_ie&&!Xinha.is_mac);
-Xinha.is_gecko=(navigator.product=="Gecko"&&!Xinha.is_safari);
-Xinha.isRunLocally=document.URL.toLowerCase().search(/^file:/)!=-1;
-Xinha.is_designMode=(typeof document.designMode!="undefined"&&!Xinha.is_ie);
-Xinha.isSupportedBrowser=Xinha.is_gecko||(Xinha.is_opera&&Xinha.opera_version>=9.1)||Xinha.ie_version>=5.5||Xinha.is_safari;
-Xinha.loadPlugins=function(_6,_7){
-if(!Xinha.isSupportedBrowser){
-return;
-}
-Xinha.loadStyle(typeof _editor_css=="string"?_editor_css:"Xinha.css","XinhaCoreDesign");
-Xinha.createLoadingMessages(xinha_editors);
-var _8=Xinha.loadingMessages;
-Xinha._loadback(_editor_url+"XinhaCore.js",function(){
-Xinha.removeLoadingMessages(xinha_editors);
-Xinha.createLoadingMessages(xinha_editors);
-_7();
-});
-return false;
-};
-Xinha._loadback=function(_9,_a,_b,_c){
-var T=!Xinha.is_ie?"onload":"onreadystatechange";
-var S=document.createElement("script");
-S.type="text/javascript";
-S.src=_9;
-if(_a){
-S[T]=function(){
-if(Xinha.is_ie&&(!(/loaded|complete/.test(window.event.srcElement.readyState)))){
-return;
-}
-_a.call(_b?_b:this,_c);
-S[T]=null;
-};
-}
-document.getElementsByTagName("head")[0].appendChild(S);
-};
-Xinha.getElementTopLeft=function(_f){
-var _10=0;
-var _11=0;
-if(_f.offsetParent){
-_10=_f.offsetLeft;
-_11=_f.offsetTop;
-while(_f=_f.offsetParent){
-_10+=_f.offsetLeft;
-_11+=_f.offsetTop;
-}
-}
-return {top:_11,left:_10};
-};
-Xinha.findPosX=function(obj){
-var _13=0;
-if(obj.offsetParent){
-return Xinha.getElementTopLeft(obj).left;
-}else{
-if(obj.x){
-_13+=obj.x;
-}
-}
-return _13;
-};
-Xinha.findPosY=function(obj){
-var _15=0;
-if(obj.offsetParent){
-return Xinha.getElementTopLeft(obj).top;
-}else{
-if(obj.y){
-_15+=obj.y;
-}
-}
-return _15;
-};
-Xinha.createLoadingMessages=function(_16){
-if(Xinha.loadingMessages||!Xinha.isSupportedBrowser){
-return;
-}
-Xinha.loadingMessages=[];
-for(var i=0;i<_16.length;i++){
-if(!document.getElementById(_16[i])){
-continue;
-}
-Xinha.loadingMessages.push(Xinha.createLoadingMessage(document.getElementById(_16[i])));
-}
-};
-Xinha.createLoadingMessage=function(_18,_19){
-if(document.getElementById("loading_"+_18.id)||!Xinha.isSupportedBrowser){
-return;
-}
-var _1a=document.createElement("div");
-_1a.id="loading_"+_18.id;
-_1a.className="loading";
-_1a.style.left=(Xinha.findPosX(_18)+_18.offsetWidth/2)-106+"px";
-_1a.style.top=(Xinha.findPosY(_18)+_18.offsetHeight/2)-50+"px";
-var _1b=document.createElement("div");
-_1b.className="loading_main";
-_1b.id="loading_main_"+_18.id;
-_1b.appendChild(document.createTextNode(Xinha._lc("Loading in progress. Please wait!")));
-var _1c=document.createElement("div");
-_1c.className="loading_sub";
-_1c.id="loading_sub_"+_18.id;
-_19=_19?_19:Xinha._lc("Loading Core");
-_1c.appendChild(document.createTextNode(_19));
-_1a.appendChild(_1b);
-_1a.appendChild(_1c);
-document.body.appendChild(_1a);
-return _1c;
-};
-Xinha.loadStyle=function(_1d,id){
-var url=_editor_url||"";
-url+=_1d;
-var _20=document.getElementsByTagName("head")[0];
-var _21=document.createElement("link");
-_21.rel="stylesheet";
-_21.href=url;
-if(id){
-_21.id=id;
-}
-_20.appendChild(_21);
-};
-Xinha._lc=function(_22){
-return _22;
-};
-Xinha._addEvent=function(el,_24,_25){
-if(document.addEventListener){
-el.addEventListener(_24,_25,true);
-}else{
-el.attachEvent("on"+_24,_25);
-}
-};
-Xinha.addOnloadHandler=function(_26){
-var _27=function(){
-if(arguments.callee.done){
-return;
-}
-arguments.callee.done=true;
-if(Xinha.onloadTimer){
-clearInterval(Xinha.onloadTimer);
-}
-_26.call();
-};
-if(Xinha.is_ie){
-document.attachEvent("onreadystatechange",function(){
-if(document.readyState==="complete"){
-document.detachEvent("onreadystatechange",arguments.callee);
-_27();
-}
-});
-if(document.documentElement.doScroll&&typeof window.frameElement==="undefined"){
-(function(){
-if(arguments.callee.done){
-return;
-}
-try{
-document.documentElement.doScroll("left");
-}
-catch(error){
-setTimeout(arguments.callee,0);
-return;
-}
-_27();
-})();
-}
-}else{
-if(/WebKit/i.test(navigator.userAgent)){
-Xinha.onloadTimer=setInterval(function(){
-if(/loaded|complete/.test(document.readyState)){
-_27();
-}
-},10);
-}else{
-document.addEventListener("DOMContentLoaded",_27,false);
-}
-}
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/XinhaLoader_readme.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/XinhaLoader_readme.txt
deleted file mode 100644
index 9a4a2c4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/XinhaLoader_readme.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-The XinhaLoader is a subset of Xinha only containing functions to fetch further files from the server and displaying a loading message. 
-It gives visual feedback to the user quite quickly so they don't have to watch the plain textarea and wonder if anything is happening.
-
-Usage in short: Follow the NewbieGuide, but load XinhaLoader.js instead of XinhaCore.js. 
-Make shure you define xinha_editors before calling Xinha.loadPlugins! This is different to earlier versions of the NewbieGuide (steps 1 and 2 reversed)
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/compression_readme.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/compression_readme.txt
deleted file mode 100644
index dacb04b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/compression_readme.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-You can use the contrib/compress.php to batch-convert the current Xinha snapshot. To use this script, open it in a text editor, comment out the die() command at the top and open it in your browser.

- 

-You can use the contrib/compress.bat to compress JavaScript files by drag&drop in Windows.

-

-Please be aware that the language files cannot be compressed.

-

-If you want the original files to be kept, open compress.bat and remvove the # in the line

-# FOR %%V IN (%*) DO del %%V_uncompressed.js
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/examples/full_example.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/examples/full_example.css
deleted file mode 100644
index 2bd258e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/examples/full_example.css
+++ /dev/null
@@ -1,78 +0,0 @@
-   /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  Xinha example CSS file.  This is ripped from Trac ;)
-    --
-    --  $HeadURL:http://svn.xinha.webfactional.com/trunk/examples/files/full_example.css $
-    --  $LastChangedDate:2008-02-04 01:43:21 +0100 (Mo, 04 Feb 2008) $
-    --  $LastChangedRevision:962 $
-    --  $LastChangedBy:ray $
-    --------------------------------------------------------------------------*/
-
- body {
-   background: #fff;
-   color: #000;
-   margin: 10px;
-  }
-  body, th, td {
-   font: normal 13px verdana,arial,'Bitstream Vera Sans',helvetica,sans-serif;
-  }
-  h1, h2, h3, h4 {
-   font-family: arial,verdana,'Bitstream Vera Sans',helvetica,sans-serif;
-   font-weight: bold;
-   letter-spacing: -0.018em;
-  }
-  h1 { font-size: 21px; margin: .15em 1em 0 0 }
-  h2 { font-size: 16px; margin: 2em 0 .5em; }
-  h3 { font-size: 14px; margin: 1.5em 0 .5em; }
-  hr { border: none;  border-top: 1px solid #ccb; margin: 2em 0; }
-  address { font-style: normal }
-  img { border: none }
-
-  :link, :visited {
-   text-decoration: none;
-   color: #b00;
-   border-bottom: 1px dotted #bbb;
-  }
-  :link:hover, :visited:hover {
-   background-color: #eee;
-   color: #555;
-  }
-  h1 :link, h1 :visited ,h2 :link, h2 :visited, h3 :link, h3 :visited,
-  h4 :link, h4 :visited, h5 :link, h5 :visited, h6 :link, h6 :visited {
-   color: inherit;
-  }
-
-  .area_holder
-  {
-    margin:10px;
-  }
-  label {font-size: 11px;}
-  .navi_links {
-	width: 177px;
-	margin: 0;
-	padding: 0px;
-	list-style:none;
-	border: none;
-}
-
-.navi_links li {
-	margin:0 0 3px 0;
-}
-
-.navi_links li a {
-	font-size: 13px;
-	line-height: 16px;
-	height: 16px;
-	display:block;
-	color:#000;
-	text-decoration: none;
-	font-weight: bold;
-	background-color: #fff;
-	cursor: pointer;
-	border: 2px solid white;
-	
-}
-
-.Link1 {
-background-color: #DF1D1F !important;
-
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/htmlarea.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/htmlarea.js
deleted file mode 100644
index 39781f7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/htmlarea.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/htmlarea.js */
-if(typeof _editor_url=="string"){
-_editor_url=_editor_url.replace(/\x2f*$/,"/");
-}else{
-alert("WARNING: _editor_url is not set!  You should set this variable to the editor files path; it should preferably be an absolute path, like in '/htmlarea/', but it can be relative if you prefer.  Further we will try to load the editor files correctly but we'll probably fail.");
-_editor_url="";
-}
-document.write("<script type=\"text/javascript\" src=\""+_editor_url+"XinhaCore.js\"></script>");
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/de/bold.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/de/bold.gif
deleted file mode 100644
index 21d286f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/de/bold.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/de/italic.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/de/italic.gif
deleted file mode 100644
index 0bf7947..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/de/italic.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/de/underline.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/de/underline.gif
deleted file mode 100644
index 0545489..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/de/underline.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_about.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_about.gif
deleted file mode 100644
index 0f28d40..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_about.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align.gif
deleted file mode 100644
index 6c60d50..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align_center.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align_center.gif
deleted file mode 100644
index 75845b7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align_center.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align_justify.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align_justify.gif
deleted file mode 100644
index 568c595..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align_justify.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align_left.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align_left.gif
deleted file mode 100644
index 8320a2a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align_left.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align_right.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align_right.gif
deleted file mode 100644
index bc6f651..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_align_right.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_blank.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_blank.gif
deleted file mode 100644
index 1ea396b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_blank.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_buttons_main.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_buttons_main.gif
deleted file mode 100644
index bc1962b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_buttons_main.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_buttons_main.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_buttons_main.png
deleted file mode 100644
index 7f73f65..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_buttons_main.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_charmap.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_charmap.gif
deleted file mode 100644
index 289aa7c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_charmap.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_clearfonts.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_clearfonts.gif
deleted file mode 100644
index 38c52a8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_clearfonts.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_color_bg.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_color_bg.gif
deleted file mode 100644
index 899f133..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_color_bg.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_color_fg.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_color_fg.gif
deleted file mode 100644
index 292ab87..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_color_fg.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_copy.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_copy.gif
deleted file mode 100644
index 0e440eb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_copy.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_custom.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_custom.gif
deleted file mode 100644
index 1444030..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_custom.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_cut.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_cut.gif
deleted file mode 100644
index 23fbf80..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_cut.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_delete.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_delete.gif
deleted file mode 100644
index aff568e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_delete.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_bold.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_bold.gif
deleted file mode 100644
index 78686d1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_bold.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_italic.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_italic.gif
deleted file mode 100644
index 2d3baf2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_italic.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_strike.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_strike.gif
deleted file mode 100644
index a5b1429..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_strike.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_sub.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_sub.gif
deleted file mode 100644
index 6c77d74..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_sub.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_sup.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_sup.gif
deleted file mode 100644
index 4ecb9a1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_sup.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_underline.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_underline.gif
deleted file mode 100644
index 4bc47a1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_format_underline.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_help.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_help.gif
deleted file mode 100644
index d5f7d63..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_help.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_hr.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_hr.gif
deleted file mode 100644
index ec5c778..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_hr.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_html.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_html.gif
deleted file mode 100644
index 026da4e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_html.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_image.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_image.gif
deleted file mode 100644
index 1af79c3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_image.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_indent_less.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_indent_less.gif
deleted file mode 100644
index 7dda02a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_indent_less.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_indent_more.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_indent_more.gif
deleted file mode 100644
index c34b47e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_indent_more.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_killword.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_killword.gif
deleted file mode 100644
index fd934a7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_killword.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_left_to_right.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_left_to_right.gif
deleted file mode 100644
index 5e95ea5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_left_to_right.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_link.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_link.gif
deleted file mode 100644
index 76fd537..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_link.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_list_bullet.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_list_bullet.gif
deleted file mode 100644
index e37e84b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_list_bullet.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_list_num.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_list_num.gif
deleted file mode 100644
index 630cbfd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_list_num.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_overwrite.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_overwrite.gif
deleted file mode 100644
index e7a8914..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_overwrite.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_paste.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_paste.gif
deleted file mode 100644
index 81b53a0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_paste.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_print.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_print.gif
deleted file mode 100644
index fb2bf80..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_print.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_redo.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_redo.gif
deleted file mode 100644
index 3d73dfc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_redo.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_right_to_left.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_right_to_left.gif
deleted file mode 100644
index 9b255bd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_right_to_left.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_rmformat.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_rmformat.gif
deleted file mode 100644
index 09f102a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_rmformat.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_save.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_save.gif
deleted file mode 100644
index 82262d0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_save.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_save.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_save.png
deleted file mode 100644
index 881fe5d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_save.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_saveas.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_saveas.gif
deleted file mode 100644
index 4edd988..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_saveas.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_selectall.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_selectall.gif
deleted file mode 100644
index 9acf0a0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_selectall.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_show_border.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_show_border.gif
deleted file mode 100644
index 42849b7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_show_border.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_splitblock.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_splitblock.gif
deleted file mode 100644
index 1f1582b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_splitblock.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_splitcel.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_splitcel.gif
deleted file mode 100644
index a6e5ab5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_splitcel.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_undo.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_undo.gif
deleted file mode 100644
index 319242f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_undo.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_word_cleaner.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_word_cleaner.gif
deleted file mode 100644
index d9b0759..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/ed_word_cleaner.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fr/bold.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fr/bold.gif
deleted file mode 100644
index 8a0f657..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fr/bold.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fr/strikethrough.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fr/strikethrough.gif
deleted file mode 100644
index 5707aef..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fr/strikethrough.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fr/underline.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fr/underline.gif
deleted file mode 100644
index 4ecaf22..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fr/underline.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fullscreen_maximize.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fullscreen_maximize.gif
deleted file mode 100644
index 211c1c5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fullscreen_maximize.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fullscreen_minimize.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fullscreen_minimize.gif
deleted file mode 100644
index f679e5a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/fullscreen_minimize.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/insert_table.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/insert_table.gif
deleted file mode 100644
index a8f4253..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/insert_table.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/insertfilelink.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/insertfilelink.gif
deleted file mode 100644
index 099f04d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/insertfilelink.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/insertmacro.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/insertmacro.png
deleted file mode 100644
index 3c874be..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/insertmacro.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/tidy.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/tidy.gif
deleted file mode 100644
index a881c64..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/tidy.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/toggle_borders.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/toggle_borders.gif
deleted file mode 100644
index 95bc5be..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/toggle_borders.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/xinha-small-icon.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/xinha-small-icon.gif
deleted file mode 100644
index 76a4970..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/xinha-small-icon.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/xinha_logo.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/xinha_logo.gif
deleted file mode 100644
index 346e313..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/images/xinha_logo.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/b5.js
deleted file mode 100644
index 3550f6e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/b5.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// I18N constants -- UTF-8
-// by Dave Lo -- dlo@interactivetools.com
-{
-  "Bold": "粗體",
-  "Italic": "斜體",
-  "Underline": "底線",
-  "Strikethrough": "刪除線",
-  "Subscript": "下標",
-  "Superscript": "上標",
-  "Justify Left": "位置靠左",
-  "Justify Center": "位置居中",
-  "Justify Right": "位置靠右",
-  "Justify Full": "位置左右平等",
-  "Ordered List": "順序清單",
-  "Bulleted List": "無序清單",
-  "Decrease Indent": "減小行前空白",
-  "Increase Indent": "加寬行前空白",
-  "Font Color": "文字顏色",
-  "Background Color": "背景顏色",
-  "Horizontal Rule": "水平線",
-  "Insert Web Link": "插入連結",
-  "Insert/Modify Image": "插入圖形",
-  "Insert Table": "插入表格",
-  "Toggle HTML Source": "切換HTML原始碼",
-  "Enlarge Editor": "放大",
-  "About this editor": "關於 Xinha",
-  "Help using editor": "說明",
-  "Current style": "字體例子"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ch.js
deleted file mode 100644
index 25ac840..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ch.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// I18N constants
-
-// LANG: "ch", ENCODING: UTF-8
-// Samuel Stone, http://stonemicro.com/
-
-{
-  "Bold": "粗體",
-  "Italic": "斜體",
-  "Underline": "底線",
-  "Strikethrough": "刪線",
-  "Subscript": "下標",
-  "Superscript": "上標",
-  "Justify Left": "靠左",
-  "Justify Center": "居中",
-  "Justify Right": "靠右",
-  "Justify Full": "整齊",
-  "Ordered List": "順序清單",
-  "Bulleted List": "無序清單",
-  "Decrease Indent": "伸排",
-  "Increase Indent": "縮排",
-  "Font Color": "文字顏色",
-  "Background Color": "背景顏色",
-  "Horizontal Rule": "水平線",
-  "Insert Web Link": "插入連結",
-  "Insert/Modify Image": "插入圖像",
-  "Insert Table": "插入表格",
-  "Toggle HTML Source": "切換HTML原始碼",
-  "Enlarge Editor": "伸出編輯系統",
-  "About this editor": "關於 Xinha",
-  "Help using editor": "說明",
-  "Current style": "字體例子",
-  "Undoes your last action": "回原",
-  "Redoes your last action": "重来",
-  "Cut selection": "剪制选项",
-  "Copy selection": "复制选项",
-  "Paste from clipboard": "贴上",
-  "Direction left to right": "从左到右",
-  "Direction right to left": "从右到左",
-  "OK": "好",
-  "Cancel": "取消",
-  "Path": "途徑",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "你在用純字編輯方式.  用 [<>] 按鈕轉回 所見即所得 編輯方式.",
-  "The full screen mode is known to cause problems with Internet Explorer, due to browser bugs that we weren": "整頁式在Internet Explorer 上常出問題, 因為這是 Internet Explorer 的無名問題,我們無法解決。你可能看見一些垃圾,或遇到其他問題。我們已警告了你. 如果要轉到 正頁式 請按 好.",
-  "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.",
-  "Cancel": "取消",
-  "Insert/Modify Link": "插入/改寫連結",
-  "New window (_blank)": "新窗户(_blank)",
-  "None (use implicit)": "無(use implicit)",
-  "Other": "其他",
-  "Same frame (_self)": "本匡 (_self)",
-  "Target:": "目標匡:",
-  "Title (tooltip):": "主題 (tooltip):",
-  "Top frame (_top)": "上匡 (_top)",
-  "URL:": "網址:",
-  "You must enter the URL where this link points to": "你必須輸入你要连结的網址"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/cz.js
deleted file mode 100644
index 8cc7424..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/cz.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// I18N constants
-
-// LANG: "cz", ENCODING: UTF-8
-// Author: Jiri Löw, <jirilow@jirilow.com>
-
-// FOR TRANSLATORS:
-//
-//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
-//      (at least a valid email address)
-//
-//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
-//      (if this is not possible, please include a comment
-//       that states what encoding is necessary.)
-
-{
-  "Bold": "Tučně",
-  "Italic": "Kurzíva",
-  "Underline": "Podtržení",
-  "Strikethrough": "Přeškrtnutí",
-  "Subscript": "Dolní index",
-  "Superscript": "Horní index",
-  "Justify Left": "Zarovnat doleva",
-  "Justify Center": "Na střed",
-  "Justify Right": "Zarovnat doprava",
-  "Justify Full": "Zarovnat do stran",
-  "Ordered List": "Seznam",
-  "Bulleted List": "Odrážky",
-  "Decrease Indent": "Předsadit",
-  "Increase Indent": "Odsadit",
-  "Font Color": "Barva písma",
-  "Background Color": "Barva pozadí",
-  "Horizontal Rule": "Vodorovná čára",
-  "Insert Web Link": "Vložit odkaz",
-  "Insert/Modify Image": "Vložit obrázek",
-  "Insert Table": "Vložit tabulku",
-  "Toggle HTML Source": "Přepnout HTML",
-  "Enlarge Editor": "Nové okno editoru",
-  "About this editor": "O této aplikaci",
-  "Help using editor": "Nápověda aplikace",
-  "Current style": "Zvolený styl",
-  "Undoes your last action": "Vrátí poslední akci",
-  "Redoes your last action": "Opakuje poslední akci",
-  "Cut selection": "Vyjmout",
-  "Copy selection": "Kopírovat",
-  "Paste from clipboard": "Vložit",
-  "OK": "OK",
-  "Cancel": "Zrušit",
-  "Path": "Cesta",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Jste v TEXTOVÉM REŽIMU.  Použijte tlačítko [<>] pro přepnutí do WYSIWIG."
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/da.js
deleted file mode 100644
index 755ebe0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/da.js
+++ /dev/null
@@ -1,172 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-// Author: rene, <rene@laerke.net>
-//         Niels Baggesen, <nba@users.sourceforge.net>, 0.95, 2009-08-15
-{
-  "Bold": "Fed",
-  "Italic": "Kursiv",
-  "Underline": "Understregning",
-  "Strikethrough": "Gennemstregning",
-  "Subscript": "Sænket skrift",
-  "Superscript": "Hævet skrift",
-  "Justify Left": "Venstrejuster",
-  "Justify Center": "Centrer",
-  "Justify Right": "Højrejuster",
-  "Justify Full": "Lige margener",
-  "Ordered List": "Ordnet liste",
-  "Bulleted List": "Punktliste",
-  "Decrease Indent": "Formindsk indrykning",
-  "Increase Indent": "Forøg indrykning",
-  "Font Color": "Skriftfarve",
-  "Background Color": "Baggrundsfarve",
-  "Horizontal Rule": "Vandret streg",
-  "Insert Web Link": "Indsæt hyperlink",
-  "Insert/Modify Image": "Indsæt/udskift billede",
-  "Insert Table": "Indsæt tabel",
-  "Toggle HTML Source": "HTML visning",
-  "Enlarge Editor": "Vis editor i popup",
-  "About this editor": "Om Xinha",
-  "Help using editor": "Hjælp",
-  "Current style": "Anvendt stil",
-  "Undoes your last action": "Fortryd sidste ændring",
-  "Redoes your last action": "Gentag sidste ændring",
-  "Cut selection": "Klip",
-  "Copy selection": "Kopier",
-  "Paste from clipboard": "Indsæt",
-  "Direction left to right": "Tekst venstre mod højre",
-  "Direction right to left": "Tekst højre mod venstre",
-  "Remove formatting": "Fjern formatering",
-  "Select all": "Vælg alt",
-  "Print document": "Udskriv dokument",
-  "Clear MSOffice tags": "MSOffice filter",
-  "Clear Inline Font Specifications": "Fjern skrift valg",
-  "Would you like to clear font typefaces?": "Vil du fjern skriftsnit valg",
-  "Would you like to clear font sizes?": "Vil du fjerne skriftstørrelse valg",
-  "Would you like to clear font colours?": "Vil du fjerne skriftfarve valg",
-  "Split Block": "Del blok",
-  "Toggle Borders": "Tabelkanter til/fra",
-  "Save as": "Gem som",
-  "Insert/Overwrite": "Indsæt/Overskriv",
-  "&mdash; format &mdash;": "&mdash; Format &mdash;",
-  "Heading 1": "Overskrift 1",
-  "Heading 2": "Overskrift 2",
-  "Heading 3": "Overskrift 3",
-  "Heading 4": "Overskrift 4",
-  "Heading 5": "Overskrift 5",
-  "Heading 6": "Overskrift 6",
-  "Normal": "Normal",
-  "Address": "Adresse",
-  "Formatted": "Formateret",
-
-  //dialogs
-  "OK": "OK",
-  "Cancel": "Fortryd",
-  "Path": "STi",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Du er i TEXT mode. Brug [<>] knappen til at skifte til visuel editering.",
-   "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "Indsæt-knappen virker ikke i Mozilla-baserede browsere. Brug Ctrl-V på tastaturet for at indsætte.",
-
-  "You need to select some text before create a link": "Du skal markere noget tekst for at indsætte et hyperlink",
-  "Your Document is not well formed. Check JavaScript console for details.": "Dit dokument er ikke syntaktisk korrekt. Åbn Javascript konsollen for at få flere detaljer.",
-
-  "Alignment:": "Justering:",
-  "Not set": "Ubestemt",
-  "Left": "Venstre",
-  "Right": "Højre",
-  "Texttop": "Teksttop",
-  "Absmiddle": "Centreret",
-  "Baseline": "Grundlinje",
-  "Absbottom": "Bund",
-  "Bottom": "Tekstbund",
-  "Middle": "Midt",
-  "Top": "Top",
-
-  "Layout": "Layout",
-  "Spacing": "Afstand",
-  "Horizontal:": "vandret:",
-  "Horizontal padding": "Vandret fyld",
-  "Vertical:": "lodret:",
-  "Vertical padding": "Lodret fyld",
-  "Border thickness:": "Kantbredde:",
-  "Leave empty for no border": "Tom hvis ingen kant",
-
-  //Insert Link
-  "Insert/Modify Link": "Indsæt/rediger hyperlink",
-  "None (use implicit)": "ingen (implicit)",
-  "New window (_blank)": "Nyt vindue (_blank)",
-  "Same frame (_self)": "Samme ramme (_self)",
-  "Top frame (_top)": "Topramme (_top)",
-  "Other": "Andet",
-  "Target:": "Placering:",
-  "Title (tooltip):": "Titel (Tooltip):",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "Du skal angive en mål-URL for linket",
-
-  // Insert Table
-  "Insert Table": "Indsæt tabel",
-  "Rows:": "Rækker:",
-  "Number of rows": "Antal rækker",
-  "Cols:": "Søjler:",
-  "Number of columns": "Antal søjler",
-  "Width:": "Bredde:",
-  "Width of the table": "Tabelbredde",
-  "Percent": "Procent",
-  "Pixels": "Pixel",
-  "Em": "Geviert (Em)",
-  "Width unit": "Breddeenhed",
-  "Fixed width columns": "Fast-bredde søjler",
-  "Positioning of this table": "Placering af tabel",
-  "Cell spacing:": "Celleafstand:",
-  "Space between adjacent cells": "Afstand mellem celler",
-  "Cell padding:": "Cellefyld:",
-  "Space between content and border in cell": "Luft mellem indhold og kanter",
-  "You must enter a number of rows": "Du skal skrive antallet af rækker",
-  "You must enter a number of columns": "Du skal skrive antallet af søjler",
-
-  // Insert Image
-  "Insert Image": "Indsæt billede",
-  "Image URL:": "Billede URL:",
-  "Enter the image URL here": "Angiv billedets URL",
-  "Preview": "Smugkig",
-  "Preview the image in a new window": "Smugkig af billedet i et nyt vindue",
-  "Alternate text:": "Alternativ text:",
-  "For browsers that don't support images": "for browsere der ikke understøtter billeder",
-  "Positioning of this image": "Placering af billedet",
-  "Image Preview:": "Billede smugkig:",
-  "You must enter the URL": "Du skal angive en URL",
-
-  // de-buttons have letters matching danish :-)
-  "button_bold": "de/bold.gif",
-  "button_italic": "de/italic.gif",
-  "button_underline": "de/underline.gif",
-
-  // Editor Help
-  "Keyboard shortcuts": "Tastaturgenveje",
-  "The editor provides the following key combinations:": "Editoren kender følgende kombinationer:",
-  "new paragraph": "Nyt afsnit",
-  "insert linebreak": "Indsæt linjeskift",
-  "Set format to paragraph": "Formater afsnit",
-  "Clean content pasted from Word": "Rens indhold kopieret fra Word",
-  "Headings": "Overskrift 1 til 6",
-  "Close": "Luk",
-
-  // Loading messages
-  "Loading in progress. Please wait!": "Editoren hentes ind. Vent venligst.",
-  "Loading plugin $plugin" : "Plugin $plugin hentes",
-  "Register plugin $plugin" : "Plugin $plugin registreres", 
-  "Constructing object": "Objekt registreres",
-  "Generate Xinha framework": "Xinha Framework genereres",
-  "Init editor size":"Størrelsen beregnes",
-  "Create Toolbar": "Opretter værktøjslinje",
-  "Create Statusbar" : "Opretter statuslinje",
-  "Register right panel" : "Registrerer højre panel",
-  "Register left panel" : "Registrerer venstre panel",
-  "Register bottom panel" : "Registrerer nederste panel",
-  "Register top panel" : "Registrerer øverste panel",
-  "Finishing" : "Afslutter",
-  
-  // ColorPicker
-  "Click a color..." : "Vælg farve",
-  "Sample" : "Eksempel",
-  "Web Safe: " : "Web Safe: ",
-  "Color: " : "Farve: "
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/de.js
deleted file mode 100644
index 98e5ec2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/de.js
+++ /dev/null
@@ -1,171 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-{
-  "Bold": "Fett",
-  "Italic": "Kursiv",
-  "Underline": "Unterstrichen",
-  "Strikethrough": "Durchgestrichen",
-  "Subscript": "Tiefgestellt",
-  "Superscript": "Hochgestellt",
-  "Justify Left": "Linksbündig",
-  "Justify Center": "Zentriert",
-  "Justify Right": "Rechtsbündig",
-  "Justify Full": "Blocksatz",
-  "Ordered List": "Nummerierte Liste",
-  "Bulleted List": "Aufzählungsliste",
-  "Decrease Indent": "Einzug verkleinern",
-  "Increase Indent": "Einzug vergrößern",
-  "Font Color": "Schriftfarbe",
-  "Background Color": "Hindergrundfarbe",
-  "Horizontal Rule": "Horizontale Linie",
-  "Insert Web Link": "Hyperlink einfügen",
-  "Insert/Modify Image": "Bild einfügen/verändern",
-  "Insert Table": "Tabelle einfügen",
-  "Toggle HTML Source": "HTML Quelltext ein/ausschalten",
-  "Enlarge Editor": "Editor vergrößern",
-  "About this editor": "Über diesen Editor",
-  "Help using editor": "Hilfe",
-  "Current style": "Derzeitiger Stil",
-  "Undoes your last action": "Rückgängig",
-  "Redoes your last action": "Wiederholen",
-  "Cut selection": "Ausschneiden",
-  "Copy selection": "Kopieren",
-  "Paste from clipboard": "Einfügen aus der Zwischenablage",
-  "Direction left to right": "Textrichtung von Links nach Rechts",
-  "Direction right to left": "Textrichtung von Rechts nach Links",
-  "Remove formatting": "Formatierung entfernen",
-  "Select all": "Alles markieren",
-  "Print document": "Dokument ausdrucken",
-  "Clear MSOffice tags": "MSOffice filter",
-  "Clear Inline Font Specifications": "Zeichensatz Formatierungen entfernen",
-  "Would you like to clear font typefaces?": "Wollen Sie Zeichensatztypen entfernen",
-  "Would you like to clear font sizes?": "Wollen Sie Zeichensatzgrößen entfernen",
-  "Would you like to clear font colours?": "Wollen sie Zeichensatzfarben entfernen",
-  "Split Block": "Block teilen",
-  "Toggle Borders": "Tabellenränder ein/ausblenden",
-  "Save as": "speichern unter",
-  "Insert/Overwrite": "Einfügen/Überschreiben",
-  "&#8212; format &#8212;": "&#8212; Format &#8212;",
-  "Heading 1": "Überschrift 1",
-  "Heading 2": "Überschrift 2",
-  "Heading 3": "Überschrift 3",
-  "Heading 4": "Überschrift 4",
-  "Heading 5": "Überschrift 5",
-  "Heading 6": "Überschrift 6",
-  "Normal": "Normal (Absatz)",
-  "Address": "Adresse",
-  "Formatted": "Formatiert",
-
-  //dialogs
-  "OK": "OK",
-  "Cancel": "Abbrechen",
-  "Path": "Pfad",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Sie sind im Text-Modus. Benutzen Sie den [<>] Button, um in den visuellen Modus (WYSIWIG) zu gelangen.",
-   "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "Aus Sicherheitsgründen dürfen Skripte normalerweise nicht auf Ausschneiden/Kopieren/Einfügen zugreifen. Benutzen Sie bitte die entsprechenden Tastatur-Kommandos (Strg + x/c/v).",
-
-  "You need to select some text before create a link": "Sie müssen einen Text markieren, um einen Link zu erstellen",
-  "Your Document is not well formed. Check JavaScript console for details.": "Ihr Dokument ist in keinem sauberen Format. Benutzen Sie die Javascript Console für weitere Informationen.",
-
-  "Alignment:": "Ausrichtung:",
-  "Not set": "nicht eingestellt",
-  "Left": "links",
-  "Right": "rechts",
-  "Texttop": "oben bündig",
-  "Absmiddle": "mittig",
-  "Baseline": "Grundlinie",
-  "Absbottom": "unten bündig",
-  "Bottom": "unten",
-  "Middle": "zentriert",
-  "Top": "oben",
-
-  "Layout": "Layout",
-  "Spacing": "Abstand",
-  "Horizontal:": "horizontal:",
-  "Horizontal padding": "horizontaler Inhaltsabstand",
-  "Vertical:": "vertikal:",
-  "Vertical padding": "vertikaler Inhaltsabstand",
-  "Border thickness:": "Randstärke:",
-  "Leave empty for no border": "leer lassen für keinen Rand",
-
-  //Insert Link
-  "Insert/Modify Link": "Verknüpfung hinzufügen/ändern",
-  "None (use implicit)": "k.A. (implizit)",
-  "New window (_blank)": "Neues Fenster (_blank)",
-  "Same frame (_self)": "Selber Rahmen (_self)",
-  "Top frame (_top)": "Oberster Rahmen (_top)",
-  "Other": "Anderes",
-  "Target:": "Ziel:",
-  "Title (tooltip):": "Titel (Tooltip):",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "Sie müssen eine Ziel-URL angeben für die Verknüpfung angeben",
-
-  // Insert Table
-  "Insert Table": "Tabelle einfügen",
-  "Rows:": "Zeilen:",
-  "Number of rows": "Zeilenanzahl",
-  "Cols:": "Spalten:",
-  "Number of columns": "Spaltenanzahl",
-  "Width:": "Breite:",
-  "Width of the table": "Tabellenbreite",
-  "Percent": "Prozent",
-  "Pixels": "Pixel",
-  "Em": "Geviert",
-  "Width unit": "Größeneinheit",
-  "Fixed width columns": "Spalten mit fester Breite",
-  "Positioning of this table": "Positionierung der Tabelle",
-  "Cell spacing:": "Zellenabstand:",
-  "Space between adjacent cells": "Raum zwischen angrenzenden Zellen",
-  "Cell padding:": "Innenabstand:",
-  "Space between content and border in cell": "Raum zwischen Inhalt und Rand der Zelle",
-  "You must enter a number of rows": "Bitte geben Sie die Anzahl der Zeilen an",
-  "You must enter a number of columns": "Bitte geben Sie die Anzahl der Spalten an",
-
-  // Insert Image
-  "Insert Image": "Bild einfügen",
-  "Image URL:": "Bild URL:",
-  "Enter the image URL here": "Bitte geben sie hier die Bild URL ein",
-  "Preview": "Voransicht",
-  "Preview the image in a new window": "Voransicht des Bildes in einem neuen Fenster",
-  "Alternate text:": "Alternativer Text:",
-  "For browsers that don't support images": "für Browser, die keine Bilder unterstützen",
-  "Positioning of this image": "Positionierung dieses Bildes",
-  "Image Preview:": "Bild Voransicht:",
-  "You must enter the URL": "Bitte geben Sie die URL ein",
-
-/*
-  "button_bold": "de/bold.gif",
-  "button_italic": "de/italic.gif",
-  "button_underline": "de/underline.gif",
-*/
-
-  // Editor Help
-  "Keyboard shortcuts": "Tastaturkürzel",
-  "The editor provides the following key combinations:": "Der Editor unterstützt die folgenden kombinationen:",
-  "new paragraph": "Neuer Absatz(Paragraph)",
-  "insert linebreak": "Harter Umbruch einfügen",
-  "Set format to paragraph": "Setze Formatierung auf Absatz",
-  "Clean content pasted from Word": "Von Word eingefügter Text bereinigen",
-  "Headings": "Überschrift Typ 1 bis 6",
-  "Close": "Schließen",
-
-  // Loading messages
-  "Loading in progress. Please wait!": "Editor wird geladen. Bitte warten !",
-  "Loading plugin $plugin" : "Plugin $plugin wird geladen",
-  "Register plugin $plugin" : "Plugin $plugin wird registriert", 
-  "Constructing object": "Objekt wird generiert",
-  "Generate Xinha framework": "Xinha Framework wird generiert",
-  "Init editor size":"Größe wird berechnet", 
-  "Create Toolbar": "Werkzeugleiste wird generiert",
-  "Create Statusbar" : "Statusleiste wird generiert",
-  "Register right panel" : "Rechtes Panel wird generiert", 
-  "Register left panel" : "Linkes Panel wird generiert", 
-  "Register bottom panel" : "Unteres Panel wird generiert", 
-  "Register top panel" : "Oberes Panel wird generiert", 
-  "Finishing" : "Laden wird abgeschlossen", 
-  
-  // ColorPicker
-  "Click a color..." : "Farbe wählen",
-  "Sample" : "Beispiel",
-  "Web Safe: " : "Web Safe: ",
-  "Color: " : "Farbe: "
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ee.js
deleted file mode 100644
index 2534271..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ee.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// I18N constants
-
-// LANG: "ee", ENCODING: UTF-8
-// Author: Martin Raie, <albertvill@hot.ee>
-
-// FOR TRANSLATORS:
-//
-//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
-//      (at least a valid email address)
-//
-//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
-//      (if this is not possible, please include a comment
-//       that states what encoding is necessary.)
-
-{
-  "Bold": "Paks",
-  "Italic": "Kursiiv",
-  "Underline": "Allakriipsutatud",
-  "Strikethrough": "Läbikriipsutatud",
-  "Subscript": "Allindeks",
-  "Superscript": "Ülaindeks",
-  "Justify Left": "Joonda vasakule",
-  "Justify Center": "Joonda keskele",
-  "Justify Right": "Joonda paremale",
-  "Justify Full": "Rööpjoonda",
-  "Ordered List": "Nummerdus",
-  "Bulleted List": "Täpploend",
-  "Decrease Indent": "Vähenda taanet",
-  "Increase Indent": "Suurenda taanet",
-  "Font Color": "Fondi värv",
-  "Background Color": "Tausta värv",
-  "Horizontal Rule": "Horisontaaljoon",
-  "Insert Web Link": "Lisa viit",
-  "Insert/Modify Image": "Lisa pilt",
-  "Insert Table": "Lisa tabel",
-  "Toggle HTML Source": "HTML/tavaline vaade",
-  "Enlarge Editor": "Suurenda toimeti aken",
-  "About this editor": "Teave toimeti kohta",
-  "Help using editor": "Spikker",
-  "Current style": "Kirjastiil",
-  "Undoes your last action": "Võta tagasi",
-  "Redoes your last action": "Tee uuesti",
-  "Cut selection": "Lõika",
-  "Copy selection": "Kopeeri",
-  "Paste from clipboard": "Kleebi",
-  "OK": "OK",
-  "Cancel": "Loobu",
-  "Path": "Path",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Sa oled tekstireziimis.  Kasuta nuppu [<>] lülitamaks tagasi WYSIWIG reziimi."
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/el.js
deleted file mode 100644
index bc3df96..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/el.js
+++ /dev/null
@@ -1,55 +0,0 @@
-// I18N constants
-
-// LANG: "el", ENCODING: UTF-8
-// Author: Dimitris Glezos, dimitris@glezos.com
-
-{
-  "Bold": "ΞˆΞ½Ο„ΞΏΞ½Ξ±",
-  "Italic": "Πλάγια",
-  "Underline": "Ξ�πογραμμισμένα",
-  "Strikethrough": "Διαγραμμένα",
-  "Subscript": "ΔΡίκτης",
-  "Superscript": "ΔΡίκτης",
-  "Justify Left": "Στοίχιση ΑριστΡρά",
-  "Justify Center": "Στοίχιση ΞšΞ­Ξ½Ο„ΟΞΏ",
-  "Justify Right": "Στοίχιση ΔΡξιά",
-  "Justify Full": "Ξ Ξ»Ξ�ρης Στοίχιση",
-  "Ordered List": "Αρίθμηση",
-  "Bulleted List": "ΞšΞΏΟ…ΞΊΞΊΞ―Ξ΄Ξ΅Ο‚",
-  "Decrease Indent": "ΞœΞ΅Ξ―Ο‰ΟƒΞ· ΕσοχΞ�Ο‚",
-  "Increase Indent": "Αύξηση ΕσοχΞ�Ο‚",
-  "Font Color": "Χρώμα ΓραμματοσΡιράς",
-  "Background Color": "Χρώμα Ξ¦ΟŒΞ½Ο„ΞΏΟ…",
-  "Horizontal Rule": "ΞŸΟΞΉΞΆΟŒΞ½Ο„ΞΉΞ± ΓραμμΞ�",
-  "Insert Web Link": "ΕισαγωγΞ� Συνδέσμου",
-  "Insert/Modify Image": "ΕισαγωγΞ�/Ξ�ροποποίηση Ξ•ΞΉΞΊΟŒΞ½Ξ±Ο‚",
-  "Insert Table": "ΕισαγωγΞ� Ξ Ξ―Ξ½Ξ±ΞΊΞ±",
-  "Toggle HTML Source": "ΕναλλαγΞ� σΡ/Ξ±Ο€ΟŒ HTML",
-  "Enlarge Editor": "ΞœΞ΅Ξ³Ξ­Ξ½ΞΈΟ…Ξ½ΟƒΞ· ΡπΡξΡργαστΞ�",
-  "About this editor": "ΠληροφορίΡς",
-  "Help using editor": "Ξ’ΞΏΞ�θΡια",
-  "Current style": "Παρών στυλ",
-  "Undoes your last action": "ΑναίρΡση τΡλΡυταίας ΡνέργΡιας",
-  "Redoes your last action": "Επαναφορά Ξ±Ο€ΟŒ αναίρΡση",
-  "Cut selection": "ΑποκοπΞ�",
-  "Copy selection": "ΑντιγραφΞ�",
-  "Paste from clipboard": "Ξ•Ο€ΞΉΞΊΟŒΞ»Ξ»Ξ·ΟƒΞ·",
-  "Direction left to right": "ΞšΞ±Ο„Ξ΅ΟΞΈΟ…Ξ½ΟƒΞ· αριστΡρά προς δΡξιά",
-  "Direction right to left": "ΞšΞ±Ο„Ξ΅ΟΞΈΟ…Ξ½ΟƒΞ· Ξ±Ο€ΟŒ δΡξιά προς τα αριστΡρά",
-  "OK": "OK",
-  "Cancel": "Ακύρωση",
-  "Path": "ΔιαδρομΞ�",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "ΕίστΡ σΡ TEXT MODE.  ΧρησιμοποιΞ�στΡ το κουμπί [<>] Ξ³ΞΉΞ± Ξ½Ξ± ΡπανέρθΡτΡ στο WYSIWIG.",
-  "The full screen mode is known to cause problems with Internet Explorer, due to browser bugs that we weren": "Ξ— κατάσταση πλΞ�ρης ΞΏΞΈΟŒΞ½Ξ·Ο‚ έχΡι προβλΞ�ματα ΞΌΞ΅ τον Internet Explorer, Ξ»ΟŒΞ³Ο‰ σφαλμάτων στον ίδιο τον browser.  Αν το σύστημα σας Ρίναι Windows 9x μπορΡί ΞΊΞ±ΞΉ Ξ½Ξ± χρΡιαστΡίτΡ reboot. Αν ΡίστΡ σίγουροι, πατΞ�στΡ ΟΚ.",
-  "Cancel": "Ακύρωση",
-  "Insert/Modify Link": "ΕισαγωγΞ�/Ξ�ροποποίηση σύνδΡσμου",
-  "New window (_blank)": "Νέο παράθυρο (_blank)",
-  "None (use implicit)": "Κανένα (χρΞ�ση Ξ±Ο€ΟŒΞ»Ο…Ο„ΞΏΟ…)",
-  "Other": "Αλλο",
-  "Same frame (_self)": "Ίδιο frame (_self)",
-  "Target:": "Target:",
-  "Title (tooltip):": "Ξ�ίτλος (tooltip):",
-  "Top frame (_top)": "Πάνω frame (_top)",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "ΠρέπΡι Ξ½Ξ± ΡισάγΡτΡ το URL που οδηγΡί Ξ±Ο…Ο„ΟŒΟ‚ ΞΏ σύνδΡσμος"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/es.js
deleted file mode 100644
index d66dac0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/es.js
+++ /dev/null
@@ -1,167 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-{
-  "Bold": "Negrita",
-  "Italic": "Cursiva",
-  "Underline": "Subrayado",
-  "Strikethrough": "Tachado",
-  "Subscript": "Subíndice",
-  "Superscript": "Superíndice",
-  "Justify Left": "Alinear a la izquierda",
-  "Justify Center": "Alinear al centro",
-  "Justify Right": "Alinear a la derecha",
-  "Justify Full": "Justificar",
-  "Ordered List": "Lista numerada",
-  "Bulleted List": "Lista no numerada",
-  "Decrease Indent": "Reducir sangría",
-  "Increase Indent": "Aumentar sangría",
-  "Font Color": "Color de la fuente",
-  "Background Color": "Color de fondo",
-  "Horizontal Rule": "Regla horizontal",
-  "Insert Web Link": "Insertar enlace web",
-  "Insert/Modify Image": "Insertar/modificar imagen",
-  "Insert Table": "Insertar una tabla",
-  "Toggle HTML Source": "Ver HTML",
-  "Enlarge Editor": "Editor a pantalla completa",
-  "About this editor": "Sobre este Editor",
-  "Help using editor": "Ayuda",
-  "Current style": "Estilo actual",
-  "Undoes your last action": "Deshacer",
-  "Redoes your last action": "Rehacer",
-  "Cut selection": "Cortar",
-  "Copy selection": "Copiar",
-  "Paste from clipboard": "Pegar desde el portapapeles",
-  "Direction left to right": "Dirección de izquierda a derecha",
-  "Direction right to left": "Dirección de derecha a izquierda",
-  "Remove formatting": "Borrar formato",
-  "Select all": "Seleccionar todo",
-  "Print document": "Imprimir documento",
-  "Clear MSOffice tags": "Borrar etiquetas de MSOffice",
-  "Clear Inline Font Specifications": "Borrar las etiquetas de fuente",
-  "Would you like to clear font typefaces?": "¿Desea eliminar las definiciaones de tipo de fuente?",
-  "Would you like to clear font sizes?": "¿Desea eliminar las definiciones de tamaño de fuente?",
-  "Would you like to clear font colours?": "¿Desea eliminar las definiciones de color de fuente?",
-  "Split Block": "Dividir el bloque",
-  "Toggle Borders": "Añadir/Quitar bordes",
-  "Save as": "Guardar como",
-  "Insert/Overwrite": "Insertar/Sobreescribir",
-  "&#8212; format &#8212;": "&#8212; formato &#8212;",
-  "&#8212; font &#8212;": "&#8212; fuente &#8212;",
-  "&#8212; size &#8212;": "&#8212; tamaño &#8212;",
-  "Heading 1": "Cabecera 1",
-  "Heading 2": "Cabecera 2",
-  "Heading 3": "Cabecera 3",
-  "Heading 4": "Cabecera 4",
-  "Heading 5": "Cabecera 5",
-  "Heading 6": "Cabecera 6",
-  "Normal": "Normal",
-  "Address": "Dirección",
-  "Formatted": "Formateado",
-
-  //dialogs
-  "OK": "Aceptar",
-  "Cancel": "Cancelar",
-  "Path": "Ruta",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Se encuentra en MODO TEXTO. Use el botón [<>] para cambiar de nuevo al modo WYSIWYG",
-   "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "El botón de pegar no funciona en los navegadores de Mozilla por motivos de seguridad. Presione CTRL-V en su teclado para pegarlo directamente",
-
-  "You need to select some text before create a link": "Necesita seleccionar algún texto antes de crear un link",
-  "Your Document is not well formed. Check JavaScript console for details.": "Su documento no está bien formado. Compruebe la consola de JavaScript para obtener más detalles",
-
-  "Alignment:": "Alineación:",
-  "Not set": "No definido",
-  "Left": "Izquierda",
-  "Right": "Derecha",
-  "Texttop": "Texto Superior",
-  "Absmiddle": "Medio Absoluto",
-  "Baseline": "Línea base",
-  "Absbottom": "Inferior absoluto",
-  "Bottom": "Inferior",
-  "Middle": "Medio",
-  "Top": "Superior",
-
-  "Layout": "Distribución",
-  "Spacing": "Espaciado",
-  "Horizontal:": "horizontal:",
-  "Horizontal padding": "Relleno horizontal",
-  "Vertical:": "Vertical:",
-  "Vertical padding": "Relleno Vertical",
-  "Border thickness:": "Tamaño del borde:",
-  "Leave empty for no border": "Vacío si no desea ningún borde",
-
-  //Insert Link
-  "Insert/Modify Link": "Insertar/Modificar un enlace",
-  "None (use implicit)": "Vacío ( usar implícito )",
-  "New window (_blank)": "Nueva ventana (_blank)",
-  "Same frame (_self)": "Mismo marco (_self)",
-  "Top frame (_top)": "Marco superior (_top)",
-  "Other": "Otro",
-  "Target:": "Destino:",
-  "Title (tooltip):": "Título (Tooltip):",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "Debe introducir la URL a donde apunta este enlace",
-
-  // Insert Table
-  "Insert Table": "Añadir una tabla",
-  "Rows:": "Filas:",
-  "Number of rows": "Número de filas",
-  "Cols:": "Columnas:",
-  "Number of columns": "Número de columnas",
-  "Width:": "Ancho:",
-  "Width of the table": "Ancho de la tabla",
-  "Percent": "Porcentaje",
-  "Pixels": "Pixels",
-  "Em": "Em",
-  "Width unit": "Unidad de anchura",
-  "Fixed width columns": "Columnas de ancho fijo",
-  "Positioning of this table": "Posición de esta tabla",
-  "Cell spacing:": "Espaciado entre celdas:",
-  "Space between adjacent cells": "Espaciado entre celdas adyacentes",
-  "Cell padding:": "Relleno de celdas:",
-  "Space between content and border in cell": "Escapcio entre el contenido y el borde de la celda",
-  "You must enter a number of rows": "Debe introducir un número de filas",
-  "You must enter a number of columns": "Debe introducir un número de columnas",
-
-  // Insert Image
-  "Insert Image": "Insertar una imagen",
-  "Image URL:": "Imagen URL:",
-  "Enter the image URL here": "",
-  "Preview": "Previsualizar",
-  "Preview the image in a new window": "Previsualizar en una nueva ventana",
-  "Alternate text:": "Texto alternativo:",
-  "For browsers that don't support images": "Para navegadores que no soportan imágenes",
-  "Positioning of this image": "Posición de la imagen",
-  "Image Preview:": "Previsualización de la imagen:",
-  "You must enter the URL": "Debe introducir la URL",
-
-  // Editor Help
-  "Keyboard shortcuts": "Atajos de teclado",
-  "The editor provides the following key combinations:": "El editor proporciona las siguientes combinaciones:",
-  "new paragraph": "Nuevo parrafo",
-  "insert linebreak": "Insertar salto de línea",
-  "Set format to paragraph": "EStablecer el formato a parrafo",
-  "Clean content pasted from Word": "Limpiar el contenido pegado desde Word",
-  "Headings": "Cabeceras",
-  "Close": "Cerrar",
-
-  // Loading messages
-  "Loading in progress. Please wait!": "Carga en proceso. Por favor espere.",
-  "Loading plugin $plugin" : "Cargando el plugin $plugin",
-  "Register plugin $plugin" : "Registro de plugin $plugin", 
-  "Constructing object": "Construyendo objeto",
-  "Generate Xinha framework": "Generar Xinha framework",
-  "Init editor size":"Iniciar el tamaño del editor", 
-  "Create Toolbar": "Crear barra de herramientas",
-  "Create Statusbar" : "Crear barra de estado",
-  "Register right panel" : "Registrar panel derecho", 
-  "Register left panel" : "Registrar panel izquierdo", 
-  "Register bottom panel" : "Registar panel inferior", 
-  "Register top panel" : "Registar panel superior", 
-  "Finishing" : "Finalizando",
-  
-  // ColorPicker
-  "Click a color..." : "Seleccione un color...",
-  "Sample" : "Muestra",
-  "Web Safe: " : "Color web: ",
-  "Color: " : "Color: "
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/eu.js
deleted file mode 100644
index 62c13f4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/eu.js
+++ /dev/null
@@ -1,169 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-{
-  "Bold": "Lodia",
-  "Italic": "Etzana",
-  "Underline": "Azpimarratua",
-  "Strikethrough": "Marratua",
-  "Subscript": "Azpindizea",
-  "Superscript": "Goi-indizea",
-  "Justify Left": "Ezkerretara lerrokatu",
-  "Justify Center": "Zentratu",
-  "Justify Right": "Eskuinetara lerrokatu",
-  "Justify Full": "Justifikatu",
-  "Ordered List": "Zerrenda ordenatua",
-  "Bulleted List": "Zerrenda ez ordenatua",
-  "Decrease Indent": "Koska handitu",
-  "Increase Indent": "Koska txikitu",
-  "Font Color": "Testu-kolorea",
-  "Background Color": "Atzeko kolorea",
-  "Horizontal Rule": "Marra horizontala",
-  "Insert Web Link": "Lotura txertatu",
-  "Insert/Modify Image": "Irudia txertatu",
-  "Insert Table": "Taula txertatu",
-  "Toggle HTML Source": "Ikusi dokumentua HTML-n",
-  "Enlarge Editor": "Editorea handitu",
-  "About this editor": "Editoreari buruz...",
-  "Help using editor": "Laguntza",
-  "Current style": "Uneko estiloa",
-  "Undoes your last action": "Desegin",
-  "Redoes your last action": "Berregin",
-  "Cut selection": "Ebaki hautaketa",
-  "Copy selection": "Kopiatu hautaketa",
-  "Paste from clipboard": "Itsatsi arbelean dagoena",
-  "Direction left to right": "Ezkerretik eskuinetarako norabidea",
-  "Direction right to left": "Eskuinetik ezkerretarako norabidea",
-  "Remove formatting": "Formatoa kendu",
-  "Select all": "Dena aukeratu",
-  "Print document": "Dokumentua inprimatu",
-  "Clear MSOffice tags": "MSOffice etiketak ezabatu",
-  "Clear Inline Font Specifications": "Ezabatu testuaren ezaugarriak",
-  "Would you like to clear font typefaces?": "Letra-tipoak ezabatu nahi al dituzu?",
-  "Would you like to clear font sizes?": "Letra-tipoen neurriak ezabatu nahi al dituzu?",
-  "Would you like to clear font colours?": "Letra-tipoen koloreak ezabatu nahi al dituzu?",
-  "Split Block": "Blokea zatitu",
-  "Toggle Borders": "Ertzak trukatu",
-  "Save as": "Gorde honela:",
-  "Insert/Overwrite": "Txertatu/Gainidatzi",
-  "&#8212; format &#8212;": "&#8212; Formatua &#8212;",
-  "Heading 1": "Goiburua 1",
-  "Heading 2": "Goiburua 2",
-  "Heading 3": "Goiburua 3",
-  "Heading 4": "Goiburua 4",
-  "Heading 5": "Goiburua 5",
-  "Heading 6": "Goiburua 6",
-  "Normal": "Normala",
-  "Address": "Helbidea",
-  "Formatted": "Formateatua",
-
-  //dialogs
-  "OK": "Ados",
-  "Cancel": "Utzi",
-  "Path": "Bidea",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "TESTU eran ari zara. Erabil ezazu [<>] botoia WYSIWIG erara itzultzeko.",
-   "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "Itsatsi botoia ez dabil Mozillan oinarritutako nabigatzaileetan (arrazoi teknikoengatik). Sacatu CTRL-V zure teklatuan, zuzenean itsasteko.",
-
-  "You need to select some text before create a link": "Testu-atal bat aukeratu behar duzu lehendabizi, lotura bat sortzeko",
-  "Your Document is not well formed. Check JavaScript console for details.": "Zure dokumentuak ez du formatu zuzena. Begira ezazu JavaScript kontsola xehetasunetarako.",
-
-  "Alignment:": "Lerrokatzea:",
-  "Not set": "Ez gaitua",
-  "Left": "Ezkerretara",
-  "Right": "Eskuinetara",
-  "Texttop": "Irudiaren goialdean",
-  "Absmiddle": "Irudiaren erdian",
-  "Baseline": "Irudiaren oinean",
-  "Absbottom": "Irudiaren behekaldean",
-  "Bottom": "Behean",
-  "Middle": "Erdian",
-  "Top": "Goian",
-
-  "Layout": "Diseinua",
-  "Spacing": "Tartea",
-  "Horizontal:": "Horizontala:",
-  "Horizontal padding": "Betegarri horizontala",
-  "Vertical:": "Bertikala:",
-  "Vertical padding": "Betegarri bertikala",
-  "Border thickness:": "Ertzaren lodiera:",
-  "Leave empty for no border": "Uztazu hutsik ertzik ez sortzeko",
-
-  //Insert Link
-  "Insert/Modify Link": "Lotura txertatu/aldatu",
-  "None (use implicit)": "Bat ere ez (implizituki erabili)",
-  "New window (_blank)": "Lehio berrian (_blank)",
-  "Same frame (_self)": "Frame berean (_self)",
-  "Top frame (_top)": "Goiko frame-an (_top)",
-  "Other": "Beste bat",
-  "Target:": "Helburua:",
-  "Title (tooltip):": "Izenburua (argibidea):",
-  "URL:": "URL-a:",
-  "You must enter the URL where this link points to": "Loturaren helburu den URL-a idatzi behar duzu",
-
-  // Insert Table
-  "Insert Table": "Taula txertatu",
-  "Rows:": "Lerroak:",
-  "Number of rows": "Lerro-kopurua",
-  "Cols:": "Zutabeak:",
-  "Number of columns": "Zutabe-kopurua",
-  "Width:": "Zabalera:",
-  "Width of the table": "Taularen zabalera",
-  "Percent": "Portzentaia",
-  "Pixels": "Pixelak",
-  "Em": "Em",
-  "Width unit": "Zabalera-unitatea",
-  "Fixed width columns": "Zabalera finkodun zutabeak",
-  "Positioning of this table": "Taula honen kokapena",
-  "Cell spacing:": "Gelaxka-tartea:",
-  "Space between adjacent cells": "Gelaxka auzokideen arteko tartea",
-  "Cell padding:": "Gelaxkaren betegarria:",
-  "Space between content and border in cell": "Gelaxkaren edukia eta ertzaren arteko tartea",
-  "You must enter a number of rows": "Lerro-kopurua idatzi behar duzu",
-  "You must enter a number of columns": "Zutabe-kopurua idatzi behar duzu",
-
-  // Insert Image
-  "Insert Image": "Irudia txertatu",
-  "Image URL:": "Irudiaren URL-a:",
-  "Enter the image URL here": "Idatz ezazu irudiaren URL-a hemen",
-  "Preview": "Aurrebista",
-  "Preview the image in a new window": "Aurreikusi irudia beste lehio batean",
-  "Alternate text:": "Testu alternatiboa:",
-  "For browsers that don't support images": "Irudirik onartzen ez duten nabigatzaileentzat",
-  "Positioning of this image": "Irudiaren kokapena",
-  "Image Preview:": "Irudiaren aurrebista:",
-  "You must enter the URL": "URL-a idatzi behar duzu",
-
-  "button_bold": "de/bold.gif",
-  "button_italic": "de/italic.gif",
-  "button_underline": "de/underline.gif",
-
-  // Editor Help
-  "Keyboard shortcuts": "Laster-teklak",
-  "The editor provides the following key combinations:": "Editoreak ondorengo tekla-konbinazioak eskaintzen ditu:",
-  "new paragraph": "Paragrafo berria",
-  "insert linebreak": "Lerro-jauzia txertatu",
-  "Set format to paragraph": "Formatua ezarri paragrafoari",
-  "Clean content pasted from Word": "Word-etik itsatsitako edukia ezabatu",
-  "Headings": "Goiburuak",
-  "Close": "Itxi",
-
-  // Loading messages
-  "Loading in progress. Please wait!": "Kargatzen. Itxaron mesedez",
-  "Loading plugin $plugin" : "$plugin plugina kargatzen",
-  "Register plugin $plugin" : "$plugin plugina erregistratu", 
-  "Constructing object": "Objektua eraikitzen",
-  "Generate Xinha framework": "Xinha Framework sortzen",
-  "Init editor size":"Editorearen hasierako neurria", 
-  "Create Toolbar": "Tresna-barra sortu",
-  "Create Statusbar" : "Egoera-barra sortu",
-  "Register right panel" : "Eskuin-panela erregistratu", 
-  "Register left panel" : "Ezker-panela erregistratu", 
-  "Register bottom panel" : "Beheko panela erregistratu", 
-  "Register top panel" : "Goiko panela erregistratu", 
-  "Finishing" : "Bukatzen", 
-  
-  // ColorPicker
-  "Click a color..." : "Kolore bat aukeratu...",
-  "Sample" : "Lagina",
-  "Web Safe: " : "Web Safe: ",
-  "Color: " : "Kolorea: "
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/fa.js
deleted file mode 100644
index 59d0fca..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/fa.js
+++ /dev/null
@@ -1,169 +0,0 @@
-// I18N constants

-// LANG: "fa", ENCODING: UTF-8

-{

-  "Bold": "ضخیم",

-  "Italic": "مورب",

-  "Underline": "زیر خط",

-  "Strikethrough": "رو خط",

-  "Subscript": "زیروند",

-  "Superscript": "بالاوند",

-  "Justify Left": "تراز از چپ",

-  "Justify Center": "تراز در وسط",

-  "Justify Right": "تراز در راست",

-  "Justify Full": "تراز از چپ و راست",

-  "Ordered List": "فهرست مرتب",

-  "Bulleted List": "فهرست گلوله ای",

-  "Decrease Indent": "کاهش سر خط",

-  "Increase Indent": "افزایش سر خط",

-  "Font Color": "رنگ فلم",

-  "Background Color": "رنگ پس زمینه",

-  "Horizontal Rule": "خط افقی",

-  "Insert Web Link": "افزودن لینک وب",

-  "Insert/Modify Image": "افزودن یا ویرایش تصویر",

-  "Insert Table": "افزودن جدول",

-  "Toggle HTML Source": "مشاهده یا عدم مشاهده متن در قالب HTML",

-  "Enlarge Editor": "بزرگ کردن ویرایش گر",

-  "About this editor": "درباره این ویرایش گر",

-  "Help using editor": "راهنمای استفاده ویرایش گر",

-  "Current style": "شیوه کنونی",

-  "Undoes your last action": "برگرداندن آخرین عمل",

-  "Redoes your last action": "انجام مجدد آخرین عمل",

-  "Cut selection": "بریدن انتخاب شده",

-  "Copy selection": "کپی انتخاب شده",

-  "Paste from clipboard": "چسباندن از تخته کار",

-  "Direction left to right": "جهت از چپ به راست",

-  "Direction right to left": "جهت از راست به چپ",

-  "Remove formatting": "حذف فرمت بندی",

-  "Select all": "انتخاب همه",

-  "Print document": "چاپ سند",

-  "Clear MSOffice tags": "پاک کردن متن از برچسب های MSOffice",

-  "Clear Inline Font Specifications": "پاک کردن متن از مشخصات فونت",

-  "Would you like to clear font typefaces?": "آیا تمایل دارید ظاهر فلم را پاک کنید؟",

-  "Would you like to clear font sizes?": "آیا تمایل دارید اندازه قلم را پاک کنید",

-  "Would you like to clear font colours?": "آیا تمایل دارید رنگ قلم را پاک کنید؟",

-  "Split Block": "بلاک جداسازی",

-  "Toggle Borders": "فعال/غیر فعال کردن لبه ها",

-  "Save as": "ذخیره مانند...",

-  "Insert/Overwrite": "افزودن/جانویسی",

-  "&#8212; format &#8212;": "&#8212; قالب &#8212;",

-  "Heading 1": "تیتر 1",

-  "Heading 2": "تیتر 2",

-  "Heading 3": "تیتر 3",

-  "Heading 4": "تیتر 4",

-  "Heading 5": "تیتر 5",

-  "Heading 6": "تیتر 6",

-  "Normal": "معمولی",

-  "Address": "آدرس",

-  "Formatted": "قالب بندی شده",

-

-  //dialogs

-  "OK": "بله",

-  "Cancel": "انصراف",

-  "Path": "مسیر",

-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "در مد متنی هستید.  از دکمه [<>] استفاده نمایید تا به مد WYSIWYG برگردید.",

-  "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "دکمه چسباندن در مرورگرهای سری Mozilla کار نمی کند (به دلایل فنی امنیتی).برای چسباندن مستقیم ، دکمه CTRL-V را در صفحه کلید بزنید.",

-  "Your Document is not well formed. Check JavaScript console for details.": "سند شما بدرستی قالب بندی نشده است. برای اطلاعات بیشتر پایانه نمایش جاوااسکریپت را بررسی کنید.",

-

-  "Alignment:": "تراز بندی",

-  "Not set": "تنظیم نشده",

-  "Left": "چپ",

-  "Right": "راست",

-  "Texttop": "بالای متن",

-  "Absmiddle": "دقیقا وسط",

-  "Baseline": "ابتدای خط",

-  "Absbottom": "دقیقا پایین",

-  "Bottom": "پایین",

-  "Middle": "وسط",

-  "Top": "بالا",

-

-  "Layout": "لایه",

-  "Spacing": "فاصله گذاری",

-  "Horizontal:": "افقی",

-  "Horizontal padding": "پرکننده افقی",

-  "Vertical:": "عمودی",

-  "Vertical padding": "پرکننده عمودی",

-  "Border thickness:": "ضخامت لبه",

-  "Leave empty for no border": "برای بدون لبه خالی رها کن",

-

-  //Insert Link

-  "Insert/Modify Link": "افزودن / ویرایش لینک",

-  "None (use implicit)": "هیچکدام (استفاده از بدون شرط)",

-  "New window (_blank)": "پنجره جدید (_blank)",

-  "Same frame (_self)": "فریم یکسان (_self)",

-  "Top frame (_top)": "فریم بالایی (_top)",

-  "Other": "سایر",

-  "Target:": "هدف",

-  "Title (tooltip):": "عنوان (راهنمای یک خطی)",

-  "URL:": "URL:",

-  "You must enter the URL where this link points to": "باید URLی که این لینک به آن اشاره دارد را وارد کنید",

-  "You need to select some text before creating a link": "باید قبل از ساخت لینک ، متنی را انتخاب نمایید",

-

-  // Insert Table

-  "Insert Table": "افزودن جدول",

-  "Rows:": "ردیف ها",

-  "Number of rows": "تعداد ردیف ها",

-  "Cols:": "ستون ها",

-  "Number of columns": "تعداد ستون ها",

-  "Width:": "طول",

-  "Width of the table": "طول جدول",

-  "Percent": "درصد",

-  "Pixels": "پیکسل ها",

-  "Em": "Em",

-  "Width unit": "واحد طول",

-  "Fixed width columns": "ستون های طول ثابت",

-  "Positioning of this table": "موقعیت یابی این جدول",

-  "Cell spacing:": "فاصله سلول ها",

-  "Space between adjacent cells": "فاصله بین سلول های همجوار",

-  "Cell padding:": "پر کننده سلول",

-  "Space between content and border in cell": "فاصله بین محتوا و لبه در سلول",

-  "You must enter a number of rows": "باید تعداد ردیف ها را وارد کنید",

-  "You must enter a number of columns": "باید تعداد ستون ها را وارد کنید",

-

-  // Insert Image

-  "Insert Image": "افزودن تصویر",

-  "Image URL:": "URL تصویر",

-  "Enter the image URL here": "URL تصویر را اینجا وارد کنید",

-  "Preview": "پیش نمایش",

-  "Preview the image in a new window": "پیش نمایش تصویر در پنجره ای جدید",

-  "Alternate text:": "متن جایگزین",

-  "For browsers that don't support images": "برای مرورگرهایی که از تصاویر پشتیبانی نمی کنند",

-  "Positioning of this image": "موقعیت یابی تصویر",

-  "Image Preview:": "پیش نمایش تصویر",

-  "You must enter the URL": "شما باید URL را وارد کنید",

-

-  // toolbar

-  /*

-  "button_bold": "fr/bold.gif",

-  "button_underline": "fr/underline.gif",

-  "button_strikethrough": "fr/strikethrough.gif",

-  */

-

-  // Editor Help

-  "Xinha Help": "راهنمای Xinha",

-  "Editor Help": "راهنمای ویرایشگر",

-  "Keyboard shortcuts": "میانبرهای صفحه کلید",

-  "The editor provides the following key combinations:": "ویرایشگر استفاده از کلید های گروهی زیر را مسیر می سازد :",

-  "ENTER": "ENTREE",

-  "new paragraph": "پاراگراف جدید",

-  "SHIFT-ENTER": "SHIFT+ENTREE",

-  "insert linebreak": "افزودن جدا کننده خط",

-  "Set format to paragraph": "تغییر قالب به پاراگراف",

-  "Clean content pasted from Word": "تمیز کردن محتوای چسبانده شده از Word",

-  "Headings": "عنوان گذاری",

-  "Close": "بستن",

-

-  // Loading messages

-  "Loading in progress. Please wait !": "بارگذاری در حال انجام است. لطفا صبر کنید !",

-  "Constructing main object": "ساختن شیء اصلی",

-  "Constructing object": "ساختن شیء",

-  "Register panel right": "ثبت قاب راست",

-  "Register panel left": "ثبت قاب چپ",

-  "Register panel top": "ثبت قاب بالا",

-  "Register panel bottom": "ثبت قاب پایین",

-  "Create Toolbar": "ساخت نوار ابزار",

-  "Create StatusBar": "ساخت نوار وضعیت",

-  "Generate Xinha object": "تولید شیء Xinha",

-  "Init editor size": "مقدار دهی اندازه ویرایشگر",

-  "Init IFrame": "مقدار دهی IFrame",

-  "Register plugin $plugin": "ثبت پلاگین $plugin"

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/fi.js
deleted file mode 100644
index e057b9a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/fi.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// I18N constants
-
-// LANG: "en", ENCODING: UTF-8
-
-{
-  "Bold": "Lihavoitu",
-  "Italic": "Kursivoitu",
-  "Underline": "Alleviivattu",
-  "Strikethrough": "Yliviivattu",
-  "Subscript": "Alaindeksi",
-  "Superscript": "Yläindeksi",
-  "Justify Left": "Tasaa vasemmat reunat",
-  "Justify Center": "Keskitä",
-  "Justify Right": "Tasaa oikeat reunat",
-  "Justify Full": "Tasaa molemmat reunat",
-  "Ordered List": "Numerointi",
-  "Bulleted List": "Luettelomerkit",
-  "Decrease Indent": "Pienennä sisennystä",
-  "Increase Indent": "Lisää sisennystä",
-  "Font Color": "Fontin väri",
-  "Background Color": "Taustaväri",
-  "Horizontal Rule": "Vaakaviiva",
-  "Insert Web Link": "Lisää linkki",
-  "Insert/Modify Image": "Lisää kuva",
-  "Insert Table": "Lisää taulukko",
-  "Toggle HTML Source": "HTML-lähdekoodi vs WYSIWYG",
-  "Enlarge Editor": "Suurenna editori",
-  "About this editor": "Tietoja editorista",
-  "Help using editor": "Näytä ohje",
-  "Current style": "Nykyinen tyyli",
-  "Undoes your last action": "Peruuta viimeinen toiminto",
-  "Redoes your last action": "Palauta viimeinen toiminto",
-  "Cut selection": "Leikkaa maalattu",
-  "Copy selection": "Kopioi maalattu",
-  "Paste from clipboard": "Liitä leikepyödältä",
-  "OK": "Hyväksy",
-  "Cancel": "Peruuta"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/fr.js
deleted file mode 100644
index a71d8de..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/fr.js
+++ /dev/null
@@ -1,171 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-{
-  "Bold": "Gras",
-  "Italic": "Italique",
-  "Underline": "Souligné",
-  "Strikethrough": "Barré",
-  "Subscript": "Indice",
-  "Superscript": "Exposant",
-  "Justify Left": "Aligner à gauche",
-  "Justify Center": "Centrer",
-  "Justify Right": "Aligner à droite",
-  "Justify Full": "Justifier",
-  "Ordered List": "Liste numérotée",
-  "Bulleted List": "Liste à puces",
-  "Decrease Indent": "Diminuer le retrait",
-  "Increase Indent": "Augmenter le retrait",
-  "Font Color": "Couleur de police",
-  "Background Color": "Surlignage",
-  "Horizontal Rule": "Ligne horizontale",
-  "Insert Web Link": "Insérer un lien",
-  "Insert/Modify Image": "Insérer / Modifier une image",
-  "Insert Table": "Insérer un tableau",
-  "Toggle HTML Source": "Afficher / Masquer code source",
-  "Enlarge Editor": "Agrandir l'éditeur",
-  "About this editor": "A propos",
-  "Help using editor": "Aide",
-  "Current style": "Style courant",
-  "Undoes your last action": "Annuler la dernière action",
-  "Redoes your last action": "Répéter la dernière action",
-  "Cut selection": "Couper la sélection",
-  "Copy selection": "Copier la sélection",
-  "Paste from clipboard": "Coller depuis le presse-papier",
-  "Direction left to right": "Direction de gauche à droite",
-  "Direction right to left": "Direction de droite à gauche",
-  "Remove formatting": "Supprimer mise en forme",
-  "Select all": "Tout sélectionner",
-  "Print document": "Imprimer document",
-  "Clear MSOffice tags": "Supprimer tags MSOffice",
-  "Clear Inline Font Specifications": "Supprimer paramètres inline de la police",
-  "Would you like to clear font typefaces?": "Voulez-vous supprimer les types ?",
-  "Would you like to clear font sizes?": "Voulez-vous supprimer les tailles ?",
-  "Would you like to clear font colours?": "Voulez-vous supprimer les couleurs ?",
-  "Split Block": "Séparer les blocs",
-  "Toggle Borders": "Afficher / Masquer les bordures",
-  "Save as": "Enregistrer sous",
-  "Insert/Overwrite": "Insertion / Remplacement",
-  "&#8212; format &#8212;": "&#8212; Format &#8212;",
-  "Heading 1": "Titre 1",
-  "Heading 2": "Titre 2",
-  "Heading 3": "Titre 3",
-  "Heading 4": "Titre 4",
-  "Heading 5": "Titre 5",
-  "Heading 6": "Titre 6",
-  "Normal": "Normal",
-  "Address": "Adresse",
-  "Formatted": "Formaté",
-
-  //dialogs
-  "OK": "OK",
-  "Cancel": "Annuler",
-  "Path": "Chemin",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Vous êtes en MODE TEXTE.  Appuyez sur le bouton [<>] pour retourner au mode WYSIWYG.",
-  "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "Le bouton Coller ne fonctionne pas sur les navigateurs basés sur Mozilla (pour des raisons de sécurité). Pressez CTRL-V au clavier pour coller directement.",
-  "Your Document is not well formed. Check JavaScript console for details.": "Le document est mal formé. Vérifiez la console JavaScript pour plus de détails.",
-
-  "Alignment:": "Alignement",
-  "Not set": "Indéfini",
-  "Left": "Gauche",
-  "Right": "Droite",
-  "Texttop": "Texttop",
-  "Absmiddle": "Absmiddle",
-  "Baseline": "Baseline",
-  "Absbottom": "Absbottom",
-  "Bottom": "Bas",
-  "Middle": "Milieu",
-  "Top": "Haut",
-
-  "Layout": "Mise en page",
-  "Spacing": "Espacement",
-  "Horizontal:": "Horizontal",
-  "Horizontal padding": "Marge horizontale interne",
-  "Vertical:": "Vertical",
-  "Vertical padding": "Marge verticale interne",
-  "Border thickness:": "Epaisseur de bordure",
-  "Leave empty for no border": "Laisser vide pour pas de bordure",
-
-  //Insert Link
-  "Insert/Modify Link": "Insérer / Modifier un lien",
-  "None (use implicit)": "Aucune (implicite)",
-  "New window (_blank)": "Nouvelle fenêtre (_blank)",
-  "Same frame (_self)": "Même frame (_self)",
-  "Top frame (_top)": "Frame principale (_top)",
-  "Other": "Autre",
-  "Target:": "Cible",
-  "Title (tooltip):": "Texte alternatif",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "Vous devez entrer l'URL de ce lien",
-  "You need to select some text before creating a link": "Vous devez sélectionner du texte avant de créer un lien",
-
-  // Insert Table
-  "Insert Table": "Insérer un tableau",
-  "Rows:": "Lignes",
-  "Number of rows": "Nombre de lignes",
-  "Cols:": "Colonnes",
-  "Number of columns": "Nombre de colonnes",
-  "Width:": "Largeur",
-  "Width of the table": "Largeur du tableau",
-  "Percent": "Pourcent",
-  "Pixels": "Pixels",
-  "Em": "Em",
-  "Width unit": "Unités de largeur",
-  "Fixed width columns": "Colonnes à taille fixe",
-  "Positioning of this table": "Position du tableau",
-  "Cell spacing:": "Espacement",
-  "Space between adjacent cells": "Espace entre les cellules adjacentes",
-  "Cell padding:": "Marge interne",
-  "Space between content and border in cell": "Espace entre le contenu et la bordure d'une cellule",
-  "You must enter a number of rows": "Vous devez entrer le nombre de lignes",
-  "You must enter a number of columns": "Vous devez entrer le nombre de colonnes",
-
-  // Insert Image
-  "Insert Image": "Insérer une image",
-  "Image URL:": "URL image",
-  "Enter the image URL here": "Entrer l'URL de l'image ici",
-  "Preview": "Prévisualiser",
-  "Preview the image in a new window": "Prévisualiser l'image dans une nouvelle fenêtre",
-  "Alternate text:": "Texte alternatif",
-  "For browsers that don't support images": "Pour les navigateurs qui ne supportent pas les images",
-  "Positioning of this image": "Position de l'image",
-  "Image Preview:": "Prévisualisation",
-  "You must enter the URL": "Vous devez entrer l'URL",
-
-  // toolbar
-/*
-  "button_bold": "fr/bold.gif",
-  "button_underline": "fr/underline.gif",
-  "button_strikethrough": "fr/strikethrough.gif",
-*/
-
-  // Editor Help
-  "Xinha Help": "Aide Xinha",
-  "Editor Help": "Aide de l'éditeur",
-  "Keyboard shortcuts": "Raccourcis clavier",
-  "The editor provides the following key combinations:": "L'éditeur fournit les combinaisons de touches suivantes :",
-  "ENTER": "ENTREE",
-  "new paragraph": "Nouveau paragraphe",
-  "SHIFT-ENTER": "SHIFT+ENTREE",
-  "insert linebreak": "Insère un saut de ligne",
-  "Set format to paragraph": "Applique le format paragraphe",
-  "Clean content pasted from Word": "Nettoyage du contenu copié depuis Word",
-  "Headings": "Titres",
-  "Close": "Fermer",
-
-  // Loading messages
-  "Loading in progress. Please wait!": "Chargement en cours. Veuillez patienter!",
-  "Finishing" : "Chargement bientôt terminé", 
-  "Constructing object": "Construction de l'objet",
-  "Create Toolbar": "Construction de la barre d'icones",
-  "Create Statusbar": "Construction de la barre de status",
-  "Register right panel" : "Enregistrement du panneau droit", 
-  "Register left panel" : "Enregistrement du panneau gauche", 
-  "Register bottom panel" : "Enregistrement du panneau supérieur", 
-  "Register top panel" : "Enregistrement du panneau inférieur", 
-  "Generate Xinha framework": "Génération de Xinha",
-  "Init editor size": "Initialisation de la taille d'édition",
-  "Init IFrame": "Initialisation de l'iframe",
-  "Register plugin $plugin": "Enregistrement du plugin $plugin",
-  "Loading plugin $plugin" : "Chargement du plugin $plugin"
-
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/gb.js
deleted file mode 100644
index b4fb5b6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/gb.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// I18N constants -- Chinese GB
-// by Dave Lo -- dlo@interactivetools.com
-{
-  "Bold": "粗体",
-  "Italic": "斜体",
-  "Underline": "底线",
-  "Strikethrough": "删除线",
-  "Subscript": "下标",
-  "Superscript": "上标",
-  "Justify Left": "位置靠左",
-  "Justify Center": "位置居中",
-  "Justify Right": "位置靠右",
-  "Justify Full": "位置左右平等",
-  "Ordered List": "顺序清单",
-  "Bulleted List": "无序清单",
-  "Decrease Indent": "减小行前空白",
-  "Increase Indent": "加宽行前空白",
-  "Font Color": "文字颜色",
-  "Background Color": "背景颜色",
-  "Horizontal Rule": "水平线",
-  "Insert Web Link": "插入连结",
-  "Insert/Modify Image": "插入图形",
-  "Insert Table": "插入表格",
-  "Toggle HTML Source": "切换HTML原始码",
-  "Enlarge Editor": "放大",
-  "About this editor": "关於 Xinha",
-  "Help using editor": "说明",
-  "Current style": "字体例子"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/he.js
deleted file mode 100644
index e39d3fc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/he.js
+++ /dev/null
@@ -1,64 +0,0 @@
-// I18N constants
-
-// LANG: "he", ENCODING: UTF-8
-// Author: Liron Newman, http://www.eesh.net, <plastish at ultinet dot org>
-
-// FOR TRANSLATORS:
-//
-//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
-//      (at least a valid email address)
-//
-//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
-//      (if this is not possible, please include a comment
-//       that states what encoding is necessary.)
-
-{
-  "Bold": "מודגש",
-  "Italic": "נטוי",
-  "Underline": "קו תחתי",
-  "Strikethrough": "קו אמצע",
-  "Subscript": "כתב עילי",
-  "Superscript": "כתב תחתי",
-  "Justify Left": " ישור לשמאל",
-  "Justify Center": "ישור למרכז",
-  "Justify Right": "ישור לימין",
-  "Justify Full": "ישור לשורה מלאה",
-  "Ordered List": "רשימה ממוספרת",
-  "Bulleted List": "רשימה לא ממוספרת",
-  "Decrease Indent": "הקטן כניסה",
-  "Increase Indent": "הגדל כניסה",
-  "Font Color": "צבע גופן",
-  "Background Color": "צבע רקע",
-  "Horizontal Rule": "קו אנכי",
-  "Insert Web Link": "הכנס היפר-קישור",
-  "Insert/Modify Image": "הכנס/שנה תמונה",
-  "Insert Table": "הכנס טבלה",
-  "Toggle HTML Source": "שנה מצב קוד HTML",
-  "Enlarge Editor": "הגדל את העורך",
-  "About this editor": "אודות עורך זה",
-  "Help using editor": "עזרה לשימוש בעורך",
-  "Current style": "סגנון נוכחי",
-  "Undoes your last action": "מבטל את פעולתך האחרונה",
-  "Redoes your last action": "מבצע מחדש את הפעולה האחרונה שביטלת",
-  "Cut selection": "גזור בחירה",
-  "Copy selection": "העתק בחירה",
-  "Paste from clipboard": "הדבק מהלוח",
-  "Direction left to right": "כיוון משמאל לימין",
-  "Direction right to left": "כיוון מימין לשמאל",
-  "OK": "אישור",
-  "Cancel": "ביטול",
-  "Path": "נתיב עיצוב",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "אתה במצב טקסט נקי (קוד). השתמש בכפתור [<>] כדי לחזור למצב WYSIWYG (תצוגת עיצוב).",
-  "The full screen mode is known to cause problems with Internet Explorer, due to browser bugs that we weren": "מצב מסך מלא יוצר בעיות בדפדפן Internet Explorer, עקב באגים בדפדפן לא יכולנו לפתור את זה.  את/ה עלול/ה לחוות תצוגת זבל,  בעיות בתפקוד העורך ו/או קריסה של הדפדפן.  אם המערכת שלך היא Windows 9x סביר להניח שתקבל/י ",
-  "Cancel": "ביטול",
-  "Insert/Modify Link": "הוסף/שנה קישור",
-  "New window (_blank)": "חלון חדש (_blank)",
-  "None (use implicit)": "ללא (השתמש ב-frame הקיים)",
-  "Other": "אחר",
-  "Same frame (_self)": "אותו frame (_self)",
-  "Target:": "יעד:",
-  "Title (tooltip):": "כותרת (tooltip):",
-  "Top frame (_top)": "Frame עליון (_top)",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "חובה לכתוב URL שאליו קישור זה מצביע"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/hu.js
deleted file mode 100644
index a4b1fa4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/hu.js
+++ /dev/null
@@ -1,64 +0,0 @@
-// I18N constants
-
-// LANG: "hu", ENCODING: UTF-8
-// Author: Miklós Somogyi, <somogyine@vnet.hu>
-
-// FOR TRANSLATORS:
-//
-//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
-//      (at least a valid email address)
-//
-//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
-//      (if this is not possible, please include a comment
-//       that states what encoding is necessary.)
-
-{
-  "Bold": "Félkövér",
-  "Italic": "Dőlt",
-  "Underline": "Aláhúzott",
-  "Strikethrough": "Áthúzott",
-  "Subscript": "Alsó index",
-  "Superscript": "Felső index",
-  "Justify Left": "Balra zárt",
-  "Justify Center": "Középre zárt",
-  "Justify Right": "Jobbra zárt",
-  "Justify Full": "Sorkizárt",
-  "Ordered List": "Számozott lista",
-  "Bulleted List": "Számozatlan lista",
-  "Decrease Indent": "Behúzás csökkentése",
-  "Increase Indent": "Behúzás növelése",
-  "Font Color": "Karakterszín",
-  "Background Color": "Háttérszín",
-  "Horizontal Rule": "Elválasztó vonal",
-  "Insert Web Link": "Hiperhivatkozás beszúrása",
-  "Insert/Modify Image": "Kép beszúrása",
-  "Insert Table": "Táblázat beszúrása",
-  "Toggle HTML Source": "HTML forrás be/ki",
-  "Enlarge Editor": "Szerkesztő külön ablakban",
-  "About this editor": "Névjegy",
-  "Help using editor": "Súgó",
-  "Current style": "Aktuális stílus",
-  "Undoes your last action": "Visszavonás",
-  "Redoes your last action": "Újra végrehajtás",
-  "Cut selection": "Kivágás",
-  "Copy selection": "Másolás",
-  "Paste from clipboard": "Beillesztés",
-  "Direction left to right": "Irány balról jobbra",
-  "Direction right to left": "Irány jobbról balra",
-  "OK": "Rendben",
-  "Cancel": "Mégsem",
-  "Path": "Hierarchia",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Forrás mód. Visszaváltás [<>] gomb",
-  "The full screen mode is known to cause problems with Internet Explorer, due to browser bugs that we weren": "A teljesképrenyős szerkesztés hibát okozhat Internet Explorer használata esetén, ez a böngésző a hibája, amit nem tudunk kikerülni. Szemetet észlelhet a képrenyőn, illetve néhány funkció hiányozhat és/vagy véletlenszerűen lefagyhat a böngésző. Windows 9x operaciós futtatása esetén elég valószínű, hogy ",
-  "Cancel": "Mégsem",
-  "Insert/Modify Link": "Hivatkozás Beszúrása/Módosítása",
-  "New window (_blank)": "Új ablak (_blank)",
-  "None (use implicit)": "Nincs (use implicit)",
-  "Other": "Más",
-  "Same frame (_self)": "Ugyanabba a keretbe (_self)",
-  "Target:": "Cél:",
-  "Title (tooltip):": "Cím (tooltip):",
-  "Top frame (_top)": "Felső keret (_top)",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "Be kell írnia az URL-t, ahova a hivatkozás mutasson"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/it.js
deleted file mode 100644
index 1c92f23..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/it.js
+++ /dev/null
@@ -1,55 +0,0 @@
-// I18N constants
-
-// LANG: "it", ENCODING: UTF-8
-// Author: Mattia Landoni, http://www.webpresident.org/
-
-{
-  "Bold": "Grassetto",
-  "Italic": "Corsivo",
-  "Underline": "Sottolineato",
-  "Strikethrough": "Barrato",
-  "Subscript": "Pedice",
-  "Superscript": "Apice",
-  "Justify Left": "Sinistra",
-  "Justify Center": "Centrato",
-  "Justify Right": "Destra",
-  "Justify Full": "Giustificato",
-  "Ordered List": "Lista numerata",
-  "Bulleted List": "Lista non numerata",
-  "Decrease Indent": "Diminuisci indentazione",
-  "Increase Indent": "Aumenta indentazione",
-  "Font Color": "Colore font",
-  "Background Color": "Colore sfondo",
-  "Horizontal Rule": "Righello orizzontale",
-  "Insert Web Link": "Inserisci link",
-  "Insert/Modify Image": "Inserisci/modifica Immagine",
-  "Insert Table": "Inserisci tabella",
-  "Toggle HTML Source": "Visualizza/nascondi sorgente HTML",
-  "Enlarge Editor": "Allarga editor",
-  "About this editor": "Informazioni su Xinha",
-  "Help using editor": "Aiuto",
-  "Current style": "Stile corrente",
-  "Undoes your last action": "Annulla ultima azione",
-  "Redoes your last action": "Ripeti ultima azione",
-  "Cut selection": "Taglia",
-  "Copy selection": "Copia",
-  "Paste from clipboard": "Incolla",
-  "Direction left to right": "Testo da sx a dx",
-  "Direction right to left": "Testo da dx a sx",
-  "OK": "OK",
-  "Cancel": "Annulla",
-  "Path": "Percorso",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Sei in MODALITA",
-  "The full screen mode is known to cause problems with Internet Explorer, due to browser bugs that we weren": "E",
-  "Cancel": "Annulla",
-  "Insert/Modify Link": "Inserisci/modifica link",
-  "New window (_blank)": "Nuova finestra (_blank)",
-  "None (use implicit)": "Niente (usa implicito)",
-  "Other": "Altro",
-  "Same frame (_self)": "Stessa frame (_self)",
-  "Target:": "Target:",
-  "Title (tooltip):": "Title (suggerimento):",
-  "Top frame (_top)": "Pagina intera (_top)",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "Devi inserire l'indirizzo a cui punta il link"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ja.js
deleted file mode 100644
index 3c068f9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ja.js
+++ /dev/null
@@ -1,175 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8N
-
-{
-  "Bold": "太字",
-  "Italic": "斜体",
-  "Underline": "下線",
-  "Strikethrough": "打ち消し線",
-  "Subscript": "下付き添え字",
-  "Superscript": "上付き添え字",
-  "Justify Left": "左寄せ",
-  "Justify Center": "中央寄せ",
-  "Justify Right": "右寄せ",
-  "Justify Full": "均等割付",
-  "Ordered List": "番号付き箇条書き",
-  "Bulleted List": "記号付き箇条書き",
-  "Decrease Indent": "インデント解除",
-  "Increase Indent": "インデント設定",
-  "Font Color": "文字色",
-  "Background Color": "背景色",
-  "Horizontal Rule": "水平線",
-  "Insert Web Link": "リンクの挿入",
-  "Insert/Modify Image": "画像の挿入/修正",
-  "Insert Table": "テーブルを挿入",
-  "Toggle HTML Source": "HTML編集モードを切替",
-  "Enlarge Editor": "エディタを最大化",
-  "About this editor": "バージョン情報",
-  "Help using editor": "ヘルプ",
-  "Current style": "現在のスタイル",
-  "Undoes your last action": "元に戻す",
-  "Redoes your last action": "やり直し",
-  "Cut selection": "切り取り",
-  "Copy selection": "コピー",
-  "Paste from clipboard": "貼り付け",
-  "Direction left to right": "左から右へ",
-  "Direction right to left": "右から左へ",
-  "Remove formatting": "書式削除",
-  "Select all": "すべて選択",
-  "Print document": "印刷",
-  "Clear MSOffice tags": "MSOfficeタグをクリア",
-  "Clear Inline Font Specifications": "インラインフォント指定をクリア",
-  "Would you like to clear font typefaces?": "フォント名をクリアしますか?",
-  "Would you like to clear font sizes?": "サイズをクリアしますか?",
-  "Would you like to clear font colours?": "色をクリアしますか?",
-  "Split Block": "領域分割",
-  "Toggle Borders": "境界線の切替",
-  "Save as": "名前をつけて保存",
-  "Insert/Overwrite": "挿入/上書き",
-  "&#8212; format &#8212;": "&#8212; 書式 &#8212;",
-  "Heading 1": "見出し1",
-  "Heading 2": "見出し2",
-  "Heading 3": "見出し3",
-  "Heading 4": "見出し4",
-  "Heading 5": "見出し5",
-  "Heading 6": "見出し6",
-  "Normal": "標準",
-  "Address": "アドレス",
-  "Formatted": "整形済み",
-  "&#8212; font &#8212;": "&#8212; フォント &#8212;",
-  "&#8212; size &#8212;": "&#8212; サイズ &#8212;",
-  
-  //dialogs
-  "OK": "OK",
-  "Cancel": "中止",
-  "Path": "パス",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "テキストモードで操作しています。WYSIWYG編集に戻るには[<>]ボタンを使ってください。",
-  "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "MozillaベースのWebブラウザでは、貼り付けボタンは機能しません(技術的なセキュリティ上の理由で)。Ctrl+Vキーを押して直接貼り付けてください。",
-  "Your Document is not well formed. Check JavaScript console for details.": "この文書には構文的な問題があります。詳細はJavaScriptコンソールを参照してください。",
-  "You need to select some text before creating a link": "リンクを作成するにはテキストを選択する必要があります",
-
-  "Alignment:": "行揃え:",
-  "Not set": "なし",
-  "Left": "左",
-  "Right": "右",
-  "Texttop": "テキスト上部",
-  "Absmiddle": "中央(絶対的)",
-  "Baseline": "ベースライン",
-  "Absbottom": "下(絶対的)",
-  "Bottom": "下",
-  "Middle": "中央",
-  "Top": "上",
-
-  "Layout": "レイアウト",
-  "Spacing": "間隔",
-  "Horizontal:": "水平:",
-  "Horizontal padding": "水平余白",
-  "Vertical:": "垂直:",
-  "Vertical padding": "垂直余白",
-  "Border thickness:": "境界線の太さ:",
-  "Leave empty for no border": "境界線がない場合は空のままにする",
-
-  //Insert Link
-  "Insert/Modify Link": "リンクの挿入/修正",
-  "None (use implicit)": "なし (デフォルトに任せる)",
-  "New window (_blank)": "新しいウィンドウ (_blank)",
-  "Same frame (_self)": "自己フレーム内 (_self)",
-  "Top frame (_top)": "最上位フレーム (_top)",
-  "Other": "その他",
-  "Target:": "ターゲット:",
-  "Title (tooltip):": "タイトル:",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "このリンクが指し示すURLを入力してください",
-
-  // Insert Table
-  "Insert Table": "テーブルの挿入",
-  "Rows:": "行:",
-  "Number of rows": "行数",
-  "Cols:": "列:",
-  "Number of columns": "列数",
-  "Width:": "幅:",
-  "Width of the table": "テーブルの幅",
-  "Percent": "パーセント(%)",
-  "Pixels": "ピクセル(px)",
-  "Em": "相対値(em)",
-  "Width unit": "幅の単位",
-  "Fixed width columns": "列の幅を固定",
-  "Positioning of this table": "このテーブルの配置",
-  "Cell spacing:": "セル間隔:",
-  "Space between adjacent cells": "隣接するセル間の距離",
-  "Cell padding:": "セル余白:",
-  "Space between content and border in cell": "セル内における内容と境界線との距離",
-  "You must enter a number of rows": "行数を入力してください",
-  "You must enter a number of columns": "列数を入力してください",
-
-  // Insert Image
-  "Insert Image": "画像の挿入",
-  "Image URL:": "画像URL:",
-  "Enter the image URL here": "画像のURLをここに入力します",
-  "Preview": "表示",
-  "Preview the image in a new window": "ウィンドウで画像を表示",
-  "Alternate text:": "代替テキスト:",
-  "For browsers that don't support images": "画像表示をサポートしないブラウザに必要です",
-  "Positioning of this image": "画像の配置",
-  "Image Preview:": "画像表示:",
-  "You must enter the URL": "URLを入力する必要があります",
-
-  //"button_bold": "fr/bold.gif",
-  //"button_underline": "fr/underline.gif",
-  //"button_strikethrough": "fr/strikethrough.gif",
-
-  // Editor Help
-  "Xinha Help": "ヘルプ",
-  "Editor Help": "エディタのヘルプ",
-  "Keyboard shortcuts": "キーボードショートカット",
-  "The editor provides the following key combinations:": "エディタは以下のキー操作を提供しています:",
-  "ENTER": "ENTER",
-  "new paragraph": "新規段落",
-  "SHIFT-ENTER": "SHIFT+ENTER",
-  "insert linebreak": "段落内改行の挿入",
-  "Set format to paragraph": "段落書式の設定",
-  "Clean content pasted from Word": "Wordから貼り付けられた内容の清書",
-  "Headings": "見出し",
-  "Close": "閉じる",
-
-  // Loading messages
-  "Loading in progress. Please wait!": "ロード中です。しばらくお待ちください",
-  "Loading plugin $plugin" : "ロード中プラグイン $plugin",
-  "Register plugin $plugin" : "登録中プラグイン $plugin", 
-  "Constructing object": "オブジェクト構築中",
-  "Generate Xinha framework": "Xinhaフレームワーク生成中",
-  "Init editor size":"エディタサイズの初期化", 
-  "Create Toolbar": "ツールバーの作成",
-  "Create Statusbar" : "ステータスバーの作成",
-  "Register right panel" : "登録 右パネル", 
-  "Register left panel" : "登録 左パネル", 
-  "Register bottom panel" : "登録 下パネル", 
-  "Register top panel" : "登録 上パネル", 
-  "Finishing" : "完了",
-  
-  // ColorPicker
-  "Click a color..." : "色をクリック...",
-  "Sample" : "サンプル",
-  "Web Safe: " : "Webセーフ: ",
-  "Color: " : "色: "  
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/lt.js
deleted file mode 100644
index ea34009..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/lt.js
+++ /dev/null
@@ -1,53 +0,0 @@
-// I18N constants
-
-// LANG: "lt", ENCODING: UTF-8
-// Author: Jaroslav Šatkevič, <jaro@akl.lt>
-
-{
-  "Bold": "Paryškinti",
-  "Italic": "Kursyvas",
-  "Underline": "Pabraukti",
-  "Strikethrough": "Perbraukti",
-  "Subscript": "Apatinis indeksas",
-  "Superscript": "Viršutinis indeksas",
-  "Justify Left": "Lygiavimas pagal kairę",
-  "Justify Center": "Lygiavimas pagal centrą",
-  "Justify Right": "Lygiavimas pagal dešinę",
-  "Justify Full": "Lygiuoti pastraipą",
-  "Ordered List": "Numeruotas sąrašas",
-  "Bulleted List": "Suženklintas sąrašas",
-  "Decrease Indent": "Sumažinti paraštę",
-  "Increase Indent": "Padidinti paraštę",
-  "Font Color": "Šrifto spalva",
-  "Background Color": "Fono spalva",
-  "Horizontal Rule": "Horizontali linija",
-  "Insert Web Link": "Įterpti nuorodą",
-  "Insert/Modify Image": "Įterpti paveiksliuką",
-  "Insert Table": "Įterpti lentelę",
-  "Toggle HTML Source": "Perjungti į HTML/WYSIWYG",
-  "Enlarge Editor": "Išplėstas redagavimo ekranas/Enlarge Editor",
-  "About this editor": "Apie redaktorių",
-  "Help using editor": "Pagalba naudojant redaktorių",
-  "Current style": "Dabartinis stilius",
-  "Undoes your last action": "Atšaukia paskutini jūsų veiksmą",
-  "Redoes your last action": "Pakartoja paskutinį atšauktą jūsų veiksmą",
-  "Cut selection": "Iškirpti",
-  "Copy selection": "Kopijuoti",
-  "Paste from clipboard": "Įterpti",
-  "OK": "OK",
-  "Cancel": "Atšaukti",
-  "Path": "Kelias",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Jūs esete teksto režime.  Naudokite [<>] mygtuką grįžimui į WYSIWYG.",
-  "The full screen mode is known to cause problems with Internet Explorer, due to browser bugs that we weren": "The full screen mode is known to cause problems with Internet Explorer, due to browser bugs that we weren",
-  "Cancel": "Atšaukti",
-  "Insert/Modify Link": "Idėti/Modifikuoti",
-  "New window (_blank)": "Naujas langas (_blank)",
-  "None (use implicit)": "None (use implicit)",
-  "Other": "Kitas",
-  "Same frame (_self)": "Same frame (_self)",
-  "Target:": "Target:",
-  "Title (tooltip):": "Pavadinimas (tooltip):",
-  "Top frame (_top)": "Top frame (_top)",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "Jus privalote nurodyti URL į kuri rodo šitą nuoroda"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/lv.js
deleted file mode 100644
index 840b4e7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/lv.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// I18N constants
-
-// LANG: "lv", ENCODING: UTF-8
-// Author: Mihai Bazon, http://dynarch.com/mishoo
-// Translated by: Janis Klavins, <janis.klavins@devia.lv>
-
-{
-  "Bold": "Trekniem burtiem",
-  "Italic": "Kursîvâ",
-  "Underline": "Pasvîtrots",
-  "Strikethrough": "Pârsvîtrots",
-  "Subscript": "Novietot zem rindas",
-  "Superscript": "Novietot virs rindas",
-  "Justify Left": "Izlîdzinât pa kreisi",
-  "Justify Center": "Izlîdzinât centrâ",
-  "Justify Right": "Izlîdzinât pa labi",
-  "Justify Full": "Izlîdzinât pa visu lapu",
-  "Ordered List": "Numurçts saraksts",
-  "Bulleted List": "Saraksts",
-  "Decrease Indent": "Samazinât atkâpi",
-  "Increase Indent": "Palielinât atkâpi",
-  "Font Color": "Burtu krâsa",
-  "Background Color": "Fona krâsa",
-  "Horizontal Rule": "Horizontâla atdalîtâjsvîtra",
-  "Insert Web Link": "Ievietot hipersaiti",
-  "Insert/Modify Image": "Ievietot attçlu",
-  "Insert Table": "Ievietot tabulu",
-  "Toggle HTML Source": "Skatît HTML kodu",
-  "Enlarge Editor": "Palielinât Rediìçtâju",
-  "About this editor": "Par ðo rediìçtâju",
-  "Help using editor": "Rediìçtâja palîgs",
-  "Current style": "Patreizçjais stils",
-  "Undoes your last action": "Atcelt pçdçjo darbîbu",
-  "Redoes your last action": "Atkârtot pçdçjo darbîbu",
-  "Cut selection": "Izgriezt iezîmçto",
-  "Copy selection": "Kopçt iezîmçto",
-  "Paste from clipboard": "Ievietot iezîmçto",
-  "OK": "Labi",
-  "Cancel": "Atcelt",
-  "Path": "Ceïð",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Jûs patlaban darbojaties TEKSTA REÞÎMÂ. Lai pârietu atpakaï uz GRAFISKO REÞÎMU (WYSIWIG), lietojiet [<>] pogu."
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/nb.js
deleted file mode 100644
index 0694379..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/nb.js
+++ /dev/null
@@ -1,78 +0,0 @@
-// I18N constants
-
-// LANG: "nb", ENCODING: UTF-8
-
-// - translated by ses<ses@online.no>
-// Additional translations by Håvard Wigtil <havardw@extend.no>
-// Additional translations by Kim Steinhaug <kim@steinhaug.com>
-
-{
-  "Bold": "Fet",
-  "Italic": "Kursiv",
-  "Underline": "Understreket",
-  "Strikethrough": "Gjennomstreket",
-  "Subscript": "Nedsenket",
-  "Superscript": "Opphøyet",
-  "Justify Left": "Venstrejuster",
-  "Justify Center": "Midtjuster",
-  "Justify Right": "Høyrejuster",
-  "Justify Full": "Blokkjuster",
-  "Ordered List": "Nummerert liste",
-  "Bulleted List": "Punktliste",
-  "Decrease Indent": "Reduser innrykk",
-  "Increase Indent": "Øke innrykk",
-  "Font Color": "Tekstfarge",
-  "Background Color": "Bakgrundsfarge",
-  "Horizontal Rule": "Vannrett linje",
-  "Insert Web Link": "Lag lenke",
-  "Insert/Modify Image": "Sett inn bilde",
-  "Insert Table": "Sett inn tabell",
-  "Toggle HTML Source": "Vis kildekode",
-  "Enlarge Editor": "Vis i eget vindu",
-  "About this editor": "Om denne editor",
-  "Help using editor": "Hjelp",
-  "Current style": "Nåværende stil",
-  "Undoes your last action": "Angrer siste redigering",
-  "Redoes your last action": "Gjør om siste angring",
-  "Cut selection": "Klipp ut område",
-  "Copy selection": "Kopier område",
-  "Save as": "Lagre som",
-  "Paste from clipboard": "Lim inn",
-  "Remove formatting": "Fjern formattering",
-  "Direction left to right": "Fra venstre mot høyre",
-  "Direction right to left": "Fra høyre mot venstre",
-  "Insert/Overwrite": "Sett inn/Overskriv",
-  "OK": "OK",
-  "Cancel": "Avbryt",
-  "Path": "Tekstvelger",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Du er i tekstmodus  Klikk på [<>] for å gå tilbake til WYSIWIG.",
-  "The full screen mode is known to cause problems with Internet Explorer, due to browser bugs that we weren": "Visning i eget vindu har kjente problemer med Internet Explorer, på grunn av problemer med denne nettleseren. Mulige problemer er et uryddig skjermbilde, manglende editorfunksjoner og/eller at nettleseren crasher. Hvis du bruker Windows 95 eller Windows 98 er det også muligheter for at Windows will crashe.\n\nTrykk ",
-  "Cancel": "Avbryt",
-  "Insert/Modify Link": "Rediger lenke",
-  "New window (_blank)": "Eget vindu (_blank)",
-  "None (use implicit)": "Ingen (bruk standardinnstilling)",
-  "Other": "Annen",
-  "Same frame (_self)": "Samme ramme (_self)",
-  "Target:": "Mål:",
-  "Title (tooltip):": "Tittel (tooltip):",
-  "Top frame (_top)": "Toppramme (_top)",
-  "URL:": "Adresse:",
-  "You must enter the URL where this link points to": "Du må skrive inn en adresse som denne lenken skal peke til",
-  "Clear Inline Font Specifications": "Fjerne inline font spesifikasjoner",
-  "Would you like to clear font typefaces?": "Ønsker du å fjerne skrifttyper",
-  "Would you like to clear font sizes?": "Ønsker du å fjerne skrift størrelser",
-  "Would you like to clear font colours?": "Ønsker du å fjerne farger på skriften",
-  "Print document": "Skriv ut dokumentet",
-  "Split Block": "Seperasjonsblokk",
-  "Toggle Borders": "Skru av/på hjelpelinjer på tabeller",
-  "Select all": "Merk alt",
-  // Loading messages
-  "Loading in progress. Please wait !": "WYSIWYG laster, vennligst vent!",
-  "Constructing main object": "Vennligst vent",
-  "Create Toolbar": "Lag verktøylinje",
-  "Register panel right": "Registrer høyrepanel",
-  "Register panel left": "Registrer venstrepanel",
-  "Register panel top": "Registrer toppanel",
-  "Register panel bottom": "Registrer bunnpanel"
-
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/nl.js
deleted file mode 100644
index 13042ca..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/nl.js
+++ /dev/null
@@ -1,64 +0,0 @@
-// I18N constants
-
-// LANG: "nl", ENCODING: UTF-8
-// Author: Michel Weegeerink (info@mmc-shop.nl), http://mmc-shop.nl
-
-// FOR TRANSLATORS:
-//
-//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
-//      (at least a valid email address)
-//
-//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
-//      (if this is not possible, please include a comment
-//       that states what encoding is necessary.)
-
-{
-  "Bold": "Vet",
-  "Italic": "Cursief",
-  "Underline": "Onderstrepen",
-  "Strikethrough": "Doorhalen",
-  "Subscript": "Subscript",
-  "Superscript": "Superscript",
-  "Justify Left": "Links uitlijnen",
-  "Justify Center": "Centreren",
-  "Justify Right": "Rechts uitlijnen",
-  "Justify Full": "Uitvullen",
-  "Ordered List": "Nummering",
-  "Bulleted List": "Opsommingstekens",
-  "Decrease Indent": "Inspringing verkleinen",
-  "Increase Indent": "Inspringing vergroten",
-  "Font Color": "Tekstkleur",
-  "Background Color": "Achtergrondkleur",
-  "Horizontal Rule": "Horizontale lijn",
-  "Insert Web Link": "Hyperlink invoegen/aanpassen",
-  "Insert/Modify Image": "Afbeelding invoegen/aanpassen",
-  "Insert Table": "Tabel invoegen",
-  "Toggle HTML Source": "HTML broncode",
-  "Enlarge Editor": "Vergroot Editor",
-  "About this editor": "Over deze editor",
-  "Help using editor": "Xinha help",
-  "Current style": "Huidige stijl",
-  "Undoes your last action": "Ongedaan maken",
-  "Redoes your last action": "Herhalen",
-  "Cut selection": "Knippen",
-  "Copy selection": "Kopi?ren",
-  "Paste from clipboard": "Plakken",
-  "Direction left to right": "Tekstrichting links naar rechts",
-  "Direction right to left": "Tekstrichting rechts naar links",
-  "OK": "OK",
-  "Cancel": "Annuleren",
-  "Path": "Pad",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Je bent in TEKST-mode. Gebruik de [<>] knop om terug te keren naar WYSIWYG-mode.",
-  "The full screen mode is known to cause problems with Internet Explorer, due to browser bugs that we weren": "Fullscreen-mode veroorzaakt problemen met Internet Explorer door bugs in de webbrowser die we niet kunnen omzeilen. Hierdoor kunnen de volgende effecten optreden: verknoeide teksten, een verlies aan editor-functionaliteit en/of willekeurig vastlopen van de webbrowser. Als u Windows 95 of 98 gebruikt, is het zeer waarschijnlijk dat u een algemene beschermingsfout (",
-  "Cancel": "Annuleren",
-  "Insert/Modify Link": "Hyperlink invoegen/aanpassen",
-  "New window (_blank)": "Nieuw venster (_blank)",
-  "None (use implicit)": "Geen",
-  "Other": "Ander",
-  "Same frame (_self)": "Zelfde frame (_self)",
-  "Target:": "Doel:",
-  "Title (tooltip):": "Titel (tooltip):",
-  "Top frame (_top)": "Bovenste frame (_top)",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "Geef de URL in waar de link naar verwijst"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/pl.js
deleted file mode 100644
index edf1699..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/pl.js
+++ /dev/null
@@ -1,125 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-// translated: Krzysztof Kotowicz, http://www.eskot.krakow.pl/portfolio/, koto@webworkers.pl
-{
-  "Bold": "Pogrubienie",
-  "Italic": "Pochylenie",
-  "Underline": "Podkreślenie",
-  "Strikethrough": "Przekreślenie",
-  "Subscript": "Indeks dolny",
-  "Superscript": "Indeks górny",
-  "Justify Left": "Wyrównaj do lewej",
-  "Justify Center": "Wyśrodkuj",
-  "Justify Right": "Wyrównaj do prawej",
-  "Justify Full": "Wyjustuj",
-  "Ordered List": "Numerowanie",
-  "Bulleted List": "Wypunktowanie",
-  "Decrease Indent": "Zmniejsz wcięcie",
-  "Increase Indent": "Zwiększ wcięcie",
-  "Font Color": "Kolor czcionki",
-  "Background Color": "Kolor tła",
-  "Horizontal Rule": "Linia pozioma",
-  "Insert Web Link": "Wstaw adres sieci Web",
-  "Insert/Modify Image": "Wstaw obraz",
-  "Insert Table": "Wstaw tabelę",
-  "Toggle HTML Source": "Edycja WYSIWYG/w źródle strony",
-  "Enlarge Editor": "Pełny ekran",
-  "About this editor": "Informacje o tym edytorze",
-  "Help using editor": "Pomoc",
-  "Current style": "Obecny styl",
-  "Undoes your last action": "Cofa ostatnio wykonane polecenie",
-  "Redoes your last action": "Ponawia ostatnio wykonane polecenie",
-  "Cut selection": "Wycina zaznaczenie do schowka",
-  "Copy selection": "Kopiuje zaznaczenie do schowka",
-  "Paste from clipboard": "Wkleja zawartość schowka",
-  "Direction left to right": "Kierunek tekstu lewo-prawo",
-  "Direction right to left": "Kierunek tekstu prawo-lewo",
-  "Remove formatting": "Usuń formatowanie",
-  "Select all": "Zaznacz wszystko",
-  "Print document": "Drukuj dokument",
-  "Clear MSOffice tags": "Wyczyść tagi MSOffice",
-  "Clear Inline Font Specifications": "Wycisz bezpośrednie przypisania czcionek",
-  "Split Block": "Podziel blok",
-  "Toggle Borders": "Włącz / wyłącz ramki",
-
-  "&#8212; format &#8212;": "&#8212; Format &#8212;",
-  "Heading 1": "Nagłówek 1",
-  "Heading 2": "Nagłówek 2",
-  "Heading 3": "Nagłówek 3",
-  "Heading 4": "Nagłówek 4",
-  "Heading 5": "Nagłówek 5",
-  "Heading 6": "Nagłówek 6",
-  "Normal": "Normalny",
-  "Address": "Adres",
-  "Formatted": "Preformatowany",
-
-  //dialogs
-  "OK": "OK",
-  "Cancel": "Anuluj",
-  "Path": "Ścieżka",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Jesteś w TRYBIE TEKSTOWYM. Użyj przycisku [<>], aby przełączyć się na tryb WYSIWYG.",
-  "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "Przycisk Wklej nie działa w przeglądarkach Mozilla z uwagi na ustawienia bezpieczeństwa. Naciśnij CRTL-V, aby wkleić zawartość schowka.",
-
-  "Alignment:": "Wyrównanie:",
-  "Not set": "Nie ustawione",
-  "Left": "Do lewej",
-  "Right": "Do prawej",
-  "Texttop": "Góra tekstu",
-  "Absmiddle": "Abs. środek",
-  "Baseline": "Linia bazowa",
-  "Absbottom": "Abs. dół",
-  "Bottom": "Dół",
-  "Middle": "Środek",
-  "Top": "Góra",
-
-  "Layout": "Layout",
-  "Spacing": "Spacjowanie",
-  "Horizontal:": "Poziome:",
-  "Horizontal padding": "Wcięcie poziome",
-  "Vertical:": "Pionowe:",
-  "Vertical padding": "Wcięcie pionowe",
-  "Border thickness:": "Grubość obramowania:",
-  "Leave empty for no border": "Bez ramek - zostaw puste",
-
-  //Insert Link
-  "Insert/Modify Link": "Wstaw/edytuj odnośnik",
-  "None (use implicit)": "Brak",
-  "New window (_blank)": "Nowe okno (_blank)",
-  "Same frame (_self)": "Ta sama ramka (_self)",
-  "Top frame (_top)": "Główna ramka (_top)",
-  "Other": "Inne",
-  "Target:": "Okno docelowe:",
-  "Title (tooltip):": "Tytuł (tooltip):",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "Musisz podać URL, na jaki będzie wskazywał odnośnik",
-
-  // Insert Table
-  "Insert Table": "Wstaw tabelę",
-  "Rows:": "Wierszy:",
-  "Number of rows": "Liczba wierszy",
-  "Cols:": "Kolumn:",
-  "Number of columns": "Liczba kolumn",
-  "Width:": "Szerokość:",
-  "Width of the table": "Szerokość tabeli",
-  "Percent": "Procent",
-  "Pixels": "Pikseli",
-  "Em": "Em",
-  "Width unit": "Jednostka",
-  "Fixed width columns": "Kolumny o stałej szerokości",
-  "Positioning of this table": "Pozycjonowanie tabeli",
-  "Cell spacing:": "Odstęp komórek:",
-  "Space between adjacent cells": "Przestrzeń pomiędzy komórkami",
-  "Cell padding:": "Wcięcie komórek:",
-  "Space between content and border in cell": "Przestrzeń między krawędzią a zawartością komórki",
-
-  // Insert Image
-  "Insert Image": "Wstaw obrazek",
-  "Image URL:": "URL obrazka:",
-  "Enter the image URL here": "Podaj URL obrazka",
-  "Preview": "Podgląd",
-  "Preview the image in a new window": "Podgląd obrazka w nowym oknie",
-  "Alternate text:": "Tekst alternatywny:",
-  "For browsers that don't support images": "Dla przeglądarek, które nie obsługują obrazków",
-  "Positioning of this image": "Pozycjonowanie obrazka",
-  "Image Preview:": "Podgląd obrazka:"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/pt_br.js
deleted file mode 100644
index 729873f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/pt_br.js
+++ /dev/null
@@ -1,184 +0,0 @@
-// I18N constants
-//
-// LANG: "pt_br", ENCODING: UTF-8
-// Portuguese Brazilian Translation
-//
-// Initial basic work by Alex Piaz <webmaster@globalmap.com>
-//
-// Author: Marcio Barbosa, <marcio@mpg.com.br>
-// MSN: tomarshall@msn.com - ICQ: 69419933
-// Site: http://www.mpg.com.br
-//
-// Last revision: 06 september 2007
-// Please don´t remove this information
-// If you modify any source, please insert a comment with your name and e-mail
-//
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt)
-{
-  "About": "Sobre",
-  "About Xinha": "Sobre o Xinha",
-  "Absbottom": "Inferior absoluto",
-  "Absmiddle": "Meio absoluto",
-  "Alignment:": "Alinhamento",
-  "Alternate text:": "Texto alternativo",
-  "Baseline": "Linha base",
-  "Bold": "Negrito",
-  "Border thickness:": "Espessura da borda",
-  "Bottom": "Botão",
-  "CTRL-0 (zero)": "CTRL-0 (zero)",
-  "CTRL-1 .. CTRL-6": "CTRL-1 .. CTRL-6",
-  "CTRL-A": "CTRL-A",
-  "CTRL-B": "CTRL-B",
-  "CTRL-C": "CTRL-C",
-  "CTRL-E": "CTRL-E",
-  "CTRL-I": "CTRL-I",
-  "CTRL-J": "CTRL-J",
-  "CTRL-L": "CTRL-L",
-  "CTRL-N": "CTRL-N",
-  "CTRL-R": "CTRL-R",
-  "CTRL-S": "CTRL-S",
-  "CTRL-U": "CTRL-U",
-  "CTRL-V": "CTRL-V",
-  "CTRL-X": "CTRL-X",
-  "CTRL-Y": "CTRL-Y",
-  "CTRL-Z": "CTRL-Z",
-  "Cancel": "Cancelar",
-  "Cell padding:": "Espaçamento interno da célula:",
-  "Cell spacing:": "Espaçamento da célula:",
-  "Clean content pasted from Word": "Limpar conteúdo copiado do Word",
-  "Close": "Fechar",
-  "Collapse borders:": "Bordas fechadas:",
-  "Cols:": "Colunas:",
-  "Constructing object": "Construindo objeto",
-  "Copy selection": "Copiar seleção",
-  "Create Statusbar": "Criar barra de informação (statusbar)",
-  "Create Toolbar": "Criar Barra de Ferramentas",
-  "Current style": "Estilo Atual",
-  "Cut selection": "Recortar seleção",
-  "Developer": "Desenvolvedor",
-  "ENTER": "ENTRAR",
-  "Editor Help": "Ajuda do Editor",
-  "Em": "Em",
-  "Enter the image URL here": "Entre aqui com a URL da imagem",
-  "Finishing": "Terminando",
-  "Fixed width columns": "Colunas com largura fixa",
-  "For browsers that don't support images": "Para navegadores que não suportam imagens",
-  "Generate Xinha framework": "Gerar Área de Trabalho do Xinha",
-  "Headings": "Títulos",
-  "Horizontal padding": "Espaçamento interno horizontal",
-  "Horizontal:": "Horizontal:",
-  "Image Preview:": "Visualização da Imagem:",
-  "Image URL:": "URL da imagem:",
-  "Init editor size": "Iniciar tamanho do editor",
-  "Insert Image": "Inserir Imagem",
-  "Insert Table": "Inserir Tabela",
-  "Insert/Modify Link": "Inserir/Modificar Link",
-  "Italic": "Itálico",
-  "Justify Center": "Justificar Centralizado",
-  "Justify Full": "Justificar Completamente",
-  "Justify Left": "Justificar à Esquerda",
-  "Justify Right": "Justificar à Direita",
-  "Keyboard shortcuts": "Atalhos de Teclado",
-  "Layout": "Esquema",
-  "Leave empty for no border": "Deixe em branco para não ter bordas",
-  "Left": "Esquerda",
-  "License": "Licença",
-  "Loading in progress. Please wait!": "Carregamento em processo. Por favor, aguarde!",
-  "Middle": "Meio",
-  "Name": "Nome",
-  "New window (_blank)": "Nova janela (_blank)",
-  "None (use implicit)": "Nenhum (uso implicito)",
-  "Not set": "Não definido",
-  "Number of columns": "Número de colunas",
-  "Number of rows": "Número de linhas",
-  "OK": "OK",
-  "Paste from clipboard": "Colar da Área de Transferência",
-  "Path": "Caminho",
-  "Percent": "Porcentagem",
-  "Pixels": "Pixels",
-  "Plugins": "Plugins",
-  "Positioning of this image": "Posicionamento desta imagem",
-  "Positioning of this table": "Posicionamento desta tabela",
-  "Preview": "Visualização",
-  "Preview the image in a new window": "Visualizar a imagem em uma nova janela",
-  "Redoes your last action": "Refazer sua última ação",
-  "Right": "Direita",
-  "Rows:": "Linhas:",
-  "SHIFT-ENTER": "SHIFT-ENTER",
-  "Same frame (_self)": "Mesmo frame (_self)",
-  "Select Color": "Selecionar côr",
-  "Select all": "Selecionar tudo",
-  "Set format to paragraph": "Definir formato para o parágrafo",
-  "Space between adjacent cells": "Espaço entre células adjacentes",
-  "Space between content and border in cell": "Espaço entre conteúdo e borda na célula",
-  "Spacing": "Espaçamento",
-  "Sponsored by": "Patrocinado por",
-  "Strikethrough": "Tachado",
-  "Target:": "Destino:",
-  "Texttop": "Texto no topo",
-  "Thanks": "Agradecimentos",
-  "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "O botão Colar não funciona em navegadores baseado no Mozilla (por razões técnicas de segurança). Pressione CTRL-V no seu teclado para colar diretamente.",
-  "The editor provides the following key combinations:": "Este editor fornece a seguinte combinação de teclas:",
-  "Title (tooltip):": "Título (tooltip)",
-  "Top": "Topo",
-  "Top frame (_top)": "Frame no topo (_top)",
-  "URL:": "URL:",
-  "Underline": "Sublinhado",
-  "Undoes your last action": "Desfazer sua última ação",
-  "Version": "Versão",
-  "Vertical padding": "Espaçamento interno vertical",
-  "Vertical:": "Vertical:",
-  "Width of the table": "Larguran da tabela",
-  "Width unit": "Unidade de largura",
-  "Width:": "Largura:",
-  "Would you like to clear font colours?": "Deseja limpar as cores de fonte",
-  "Would you like to clear font sizes?": "Deseja limpar os tamanhos de fonte",
-  "Would you like to clear font typefaces?": "Deseja limpar os tipos de fonte",
-  "Xinha Help": "Ajuda do Xinha",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Você está no MODO TEXTO.  Use o botão [<>] para mudar para o modo de Visualização (WYSIWYG)",
-  "Your Document is not well formed. Check JavaScript console for details.": "Seu Documento não está formatado corretamente. Verifique o console do JavaScript para maiores detalhes.",
-  "insert linebreak": "inserir quebra de linha",
-  "new paragraph": "novo parágrafo",
-  
-  // not find with lc_parse_strings.php
-  "Subscript": "Subescrito",
-  "Superscript": "Sobrescrito",
-  "Direction left to right": "Da esquerda para direita",
-  "Direction right to left": "Da direita para esquerda",
-  "Remove formatting": "Remover formatação",
-  "Select all": "Selecionar tudo",
-  "Print document": "Imprimir documento",
-  "Clear MSOffice tags": "Limpar tags do MS Office",
-  "Clear Inline Font Specifications": "Limpar especificações de fontes inline",
-  "Split Block": "Dividir Bloco",
-  "Toggle Borders": "Mudar Bordas",
-  "Save as": "Salvar como",
-  "Insert/Overwrite": "Inserir/Sobrescrever",
-  "&#8212; format &#8212;": "&#8212; formato &#8212;",
-  "Heading 1": "Título 1",
-  "Heading 2": "Título 2",
-  "Heading 3": "Título 3",
-  "Heading 4": "Título 4",
-  "Heading 5": "Título 5",
-  "Heading 6": "Título 6",
-  "Normal": "Normal",
-  "Address": "Endereço",
-  "Formatted": "Formatado",
-  "&#8212; font &#8212;": "&#8212; fonte &#8212;",
-  "&#8212; size &#8212;": "&#8212; tamanho &#8212;",
-  "Ordered List": "Lista Numerada",
-  "Bulleted List": "Lista Marcadores",
-  "Decrease Indent": "Diminuir Indentação",
-  "Increase Indent": "Aumentar Indentação",
-  "Font Color": "Cor da Fonte",
-  "Background Color": "Cor do Fundo",
-  "Horizontal Rule": "Linha Horizontal",
-  "Insert Web Link": "Inserir Link",
-  "Insert/Modify Image": "Inserir/Modificar Imagem",
-  "Insert Table": "Inserir Tabela",
-  "Toggle HTML Source": "Ver Código-Fonte",
-  "Enlarge Editor": "Expandir Editor",
-  "About this editor": "Sobre este editor",
-  "Help using editor": "Ajuda - Usando o editor"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ro.js
deleted file mode 100644
index e622932..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ro.js
+++ /dev/null
@@ -1,63 +0,0 @@
-// I18N constants
-
-// LANG: "ro", ENCODING: UTF-8
-// Author: Mihai Bazon, http://dynarch.com/mishoo
-
-// FOR TRANSLATORS:
-//
-//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
-//      (at least a valid email address)
-//
-//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
-//      (if this is not possible, please include a comment
-//       that states what encoding is necessary.)
-
-{
-  "Bold": "Îngroşat",
-  "Italic": "Italic",
-  "Underline": "Subliniat",
-  "Strikethrough": "Tăiat",
-  "Subscript": "Indice jos",
-  "Superscript": "Indice sus",
-  "Justify Left": "Aliniere la stânga",
-  "Justify Center": "Aliniere pe centru",
-  "Justify Right": "Aliniere la dreapta",
-  "Justify Full": "Aliniere în ambele părţi",
-  "Ordered List": "Listă ordonată",
-  "Bulleted List": "Listă marcată",
-  "Decrease Indent": "Micşorează alineatul",
-  "Increase Indent": "Măreşte alineatul",
-  "Font Color": "Culoarea textului",
-  "Background Color": "Culoare de fundal",
-  "Horizontal Rule": "Linie orizontală",
-  "Insert Web Link": "Inserează/modifică link",
-  "Insert/Modify Image": "Inserează/modifică imagine",
-  "Insert Table": "Inserează un tabel",
-  "Toggle HTML Source": "Sursa HTML / WYSIWYG",
-  "Enlarge Editor": "Maximizează editorul",
-  "About this editor": "Despre editor",
-  "Help using editor": "Documentaţie (devel)",
-  "Current style": "Stilul curent",
-  "Undoes your last action": "Anulează ultima acţiune",
-  "Redoes your last action": "Reface ultima acţiune anulată",
-  "Cut selection": "Taie în clipboard",
-  "Copy selection": "Copie în clipboard",
-  "Paste from clipboard": "Aduce din clipboard",
-  "Direction left to right": "Direcţia de scriere: stânga - dreapta",
-  "Direction right to left": "Direcţia de scriere: dreapta - stânga",
-  "OK": "OK",
-  "Cancel": "Anulează",
-  "Path": "Calea",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Eşti în modul TEXT.  Apasă butonul [<>] pentru a te întoarce în modul WYSIWYG.",
-  "Cancel": "Renunţă",
-  "Insert/Modify Link": "Inserează/modifcă link",
-  "New window (_blank)": "Fereastră nouă (_blank)",
-  "None (use implicit)": "Nimic (foloseşte ce-i implicit)",
-  "Other": "Alt target",
-  "Same frame (_self)": "Aceeaşi fereastră (_self)",
-  "Target:": "Ţinta:",
-  "Title (tooltip):": "Titlul (tooltip):",
-  "Top frame (_top)": "Fereastra principală (_top)",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "Trebuie să introduceţi un URL"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ru.js
deleted file mode 100644
index 92394c2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/ru.js
+++ /dev/null
@@ -1,185 +0,0 @@
-// I18N constants
-
-// LANG: "ru", ENCODING: UTF-8
-// Author: Yulya Shtyryakova, <yulya@vdcom.ru>
-
-// Some additions by: Alexey Kirpichnikov, <alexkir@kiwistudio.ru>
-// I took French version as a source of English phrases because French version was the most comprehensive
-// (fr.js was the largest file, actually) %)
-
-// FOR TRANSLATORS:
-//
-//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
-//      (at least a valid email address)
-//
-//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
-//      (if this is not possible, please include a comment
-//       that states what encoding is necessary.)
-
-{
-  "Bold": "Полужирный",
-  "Italic": "Наклонный",
-  "Underline": "Подчеркнутый",
-  "Strikethrough": "Перечеркнутый",
-  "Subscript": "Нижний индекс",
-  "Superscript": "Верхний индекс",
-  "Justify Left": "По левому краю",
-  "Justify Center": "По центру",
-  "Justify Right": "По правому краю",
-  "Justify Full": "По ширине",
-  "Ordered List": "Нумерованный список",
-  "Bulleted List": "Маркированный список",
-  "Decrease Indent": "Уменьшить отступ",
-  "Increase Indent": "Увеличить отступ",
-  "Font Color": "Цвет шрифта",
-  "Background Color": "Цвет фона",
-  "Horizontal Rule": "Горизонтальный разделитель",
-  "Insert Web Link": "Вставить гиперссылку",
-  "Insert/Modify Image": "Вставить изображение",
-  "Insert Table": "Вставить таблицу",
-  "Toggle HTML Source": "Показать Html-код",
-  "Enlarge Editor": "Увеличить редактор",
-  "About this editor": "О редакторе",
-  "Help using editor": "Помощь",
-  "Current style": "Текущий стиль",
-  "Undoes your last action": "Отменить",
-  "Redoes your last action": "Повторить",
-  "Cut selection": "Вырезать",
-  "Copy selection": "Копировать",
-  "Paste from clipboard": "Вставить",
-  "Direction left to right": "Направление слева направо",
-  "Direction right to left": "Направление справа налево",
-  "Remove formatting": "Убрать форматирование",
-  "Select all": "Выделить все",
-  "Print document": "Печать",
-  "Clear MSOffice tags": "Удалить разметку MSOffice",
-  "Clear Inline Font Specifications": "Удалить непосредственное задание шрифтов",
-  "Would you like to clear font typefaces?": "Удалить типы шрифтов?",
-  "Would you like to clear font sizes?": "Удалить размеры шрифтов ?",
-  "Would you like to clear font colours?": "Удалить цвета шрифтов ?",
-  "Split Block": "Разделить блок",
-  "Toggle Borders": "Включить/выключить отображение границ",
-  "Save as": "Сохранить как",
-  "Insert/Overwrite": "Вставка/замена",
-  "&#8212; format &#8212;": "&#8212; форматирование &#8212;",
-  "Heading 1": "Заголовок 1",
-  "Heading 2": "Заголовок 2",
-  "Heading 3": "Заголовок 3",
-  "Heading 4": "Заголовок 4",
-  "Heading 5": "Заголовок 5",
-  "Heading 6": "Заголовок 6",
-  "Normal": "Обычный текст",
-  "Address": "Адрес",
-  "Formatted": "Отформатированный текст",
-
-  "&#8212; font &#8212;": "&#8212; шрифт &#8212;",
-  "&#8212; size &#8212;": "&#8212; размер &#8212;",
-
-
-// Диалоги
-
-  "OK": "OK",
-  "Cancel": "Отмена",
-  "Path": "Путь",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Вы в режиме отображения Html-кода. нажмите кнопку [<>], чтобы переключиться в визуальный режим.",
-
-"The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "Кнопка Вставить не работает в браузерах на основе Mozilla (по техническим причинам, связанным с безопасностью). Нажмите Ctrl-V на клавиатуре, чтобы вставить.",
-
-  "Your Document is not well formed. Check JavaScript console for details.": "Ваш документ неправильно сформирован. Посмотрите Консоль JavaScript, чтобы узнать подробности.",
-
-  "Alignment:": "Выравнивание",
-  "Not set": "Не установлено",
-  "Left": "По левому краю",
-  "Right": "По правому краю",
-  "Texttop": "По верхней границе текста",
-  "Absmiddle": "По середине текста",
-  "Baseline": "По нижней границе текста",
-  "Absbottom": "По нижней границе",
-  "Bottom": "По нижнему краю",
-  "Middle": "Посредине",
-  "Top": "По верхнему краю",
-
-  "Layout": "Расположение",
-  "Spacing": "Поля",
-  "Horizontal:": "По горизонтали",
-  "Horizontal padding": "Горизонтальные поля",
-  "Vertical:": "По вертикали",
-  "Vertical padding": "Вертикальные поля",
-  "Border thickness:": "Толщина рамки",
-  "Leave empty for no border": "Оставьте пустым, чтобы убрать рамку",
-
-  //Insert Link
-  "Insert/Modify Link": "Вставка/изменение ссылки",
-  "None (use implicit)": "По умолчанию",
-  "New window (_blank)": "Новое окно (_blank)",
-  "Same frame (_self)": "То же окно (_self)",
-  "Top frame (_top)": "Родительское окно (_top)",
-  "Other": "Другое",
-  "Target:": "Открывать в окне:",
-  "Title (tooltip):": "Всплывающая подсказка",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "Вы должны указать URL, на который будет указывать ссылка",
-  "You need to select some text before creating a link": "Вы должны выделить текст, который будет преобразован в ссылку",
-
-  // Insert Table
-  "Insert Table": "Вставка таблицы",
-  "Rows:": "Строки",
-  "Number of rows": "Количество строк",
-  "Cols:": "Столбцы",
-  "Number of columns": "Количество столбцов",
-  "Width:": "Ширина",
-  "Width of the table": "Ширина таблицы",
-  "Percent": "проценты",
-  "Pixels": "пикселы",
-  "Em": "em",
-  "Width unit": "Единицы измерения",
-  "Fixed width columns": "Столбцы фиксированной ширины",
-  "Positioning of this table": "Расположение таблицы",
-  "Cell spacing:": "Расстояние между ячейками",
-  "Space between adjacent cells": "Расстояние между соседними ячейками",
-  "Cell padding:": "Поля в ячейках",
-  "Space between content and border in cell": "Расстояние между границей ячейки и текстом",
-  "You must enter a number of rows": "Вы должны ввести количество строк",
-  "You must enter a number of columns": "Вы должны ввести количество столбцов",
-
-  // Insert Image
-  "Insert Image": "Вставка изображения",
-  "Image URL:": "URL изображения",
-  "Enter the image URL here": "Вставьте адрес изображения",
-  "Preview": "Предварительный просмотр",
-  "Preview the image in a new window": "Предварительный просмотр в отдельном окне",
-  "Alternate text:": "Альтернативный текст",
-  "For browsers that don't support images": "Для браузеров, которые не отображают картинки",
-  "Positioning of this image": "Расположение изображения",
-  "Image Preview:": "Предварительный просмотр",
-  "You must enter the URL": "Вы должны ввести URL",
-
-  // Editor Help
-  "Xinha Help": "Помощь",
-  "Editor Help": "Помощь",
-  "Keyboard shortcuts": "Горячие клавиши",
-  "The editor provides the following key combinations:": "Редактор поддерживает следующие комбинации клавиш:",
-  "ENTER": "ENTER",
-  "new paragraph": "новый абзац",
-  "SHIFT-ENTER": "SHIFT+ENTER",
-  "insert linebreak": "перенос строки",
-  "Set format to paragraph": "Отформатировать абзац",
-  "Clean content pasted from Word": "Очистить текст, вставленный из Word",
-  "Headings": "Заголовки",
-  "Close": "Закрыть",
-
-  // Loading messages
-  "Loading in progress. Please wait !": "Загрузка... Пожалуйста, подождите.",
-  "Constructing main object": "Создание главного объекта",
-  "Constructing object": "Создание объекта",
-  "Register panel right": "Регистрация правой панели",
-  "Register panel left": "Регистрация левой панели",
-  "Register panel top": "Регистрация верхней панели",
-  "Register panel bottom": "Регистрация нижней панели",
-  "Create Toolbar": "Создание панели инструментов",
-  "Create StatusBar": "Создание панели состояния",
-  "Generate Xinha object": "Создание объекта Xinha",
-  "Init editor size": "Инициализация размера редактора",
-  "Init IFrame": "инициализация iframe",
-  "Register plugin $plugin": "Регистрация $plugin"
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/sh.js
deleted file mode 100644
index b56a0df..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/sh.js
+++ /dev/null
@@ -1,140 +0,0 @@
-// I18N constants
-
-// LANG: "sh", ENCODING: UTF-8 | ISO-8859-2
-// Author: Ljuba Ranković, http://www.rankovic.net/ljubar
-
-// FOR TRANSLATORS:
-//
-//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
-//      (at least a valid email address)
-//
-//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
-//      (if this is not possible, please include a comment
-//       that states what encoding is necessary.)
-
-{
-		"Bold": "Masno",
-		"Italic": "Kurziv",
-		"Underline": "Podvučeno",
-		"Strikethrough": "Precrtano",
-		"Subscript": "Indeks-tekst",
-		"Superscript": "Eksponent-tekst",
-		"Justify Left":"Ravnanje ulevo",
-		"Justify Center": "Ravnanje po simetrali",
-		"Justify Right": "Ravnanje udesno",
-		"Justify Full": "Puno ravnanje",
-		"Ordered List": "Lista sa rednim brojevima",
-		"Bulleted List": "Lista sa simbolima",
-		"Decrease Indent": "smanji uvlačenje",
-		"Increase Indent": "Povećaj uvlačenje",
-		"Font Color": "Boja slova",
-		"Background Color": "Boja pozadine",
-		"Horizontal Rule": "Horizontalna linija",
-		"Insert Web Link": "Dodaj web link",
-		"Insert/Modify Image": "Dodaj/promeni sliku",
-		"Insert Table": "Ubaci tabelu",
-		"Toggle HTML Source": "Prebaci na HTML kod",
-		"Enlarge Editor": "Povećaj editor",
-		"About this editor": "O ovom editoru",
-		"Help using editor": "Pomoć pri korišćenju editora",
-		"Current style": "Važeći stil",
-		"Undoes your last action": "Poništava poslednju radnju",
-		"Redoes your last action": "Vraća poslednju radnju",
-		"Cut selection": "Iseci izabrano",
-		"Copy selection": "Kopiraj izabrano",
-		"Paste from clipboard": "Zalepi iz klipborda",
-		"Direction left to right": "Pravac s leva na desno",
-		"Direction right to left": "Pravac s desna na levo",
-        "Remove formatting": "Ukoni formatiranje",
-        "Select all": "Izaberi sve",
-        "Print document": "Štampaj dokument",
-        "Clear MSOffice tags": "Obriši MSOffice tagove",
-        "Clear Inline Font Specifications": "Obriši dodeljene osobine fonta",
-        "Split Block": "Podeli blok",
-        "Toggle Borders": "Izmeni okvire",
-
-        "&#8212; format &#8212;": "&#8212; Format &#8212;",
-        "Heading 1": "Zaglavlje 1",
-        "Heading 2": "Zaglavlje 2",
-        "Heading 3": "Zaglavlje 3",
-        "Heading 4": "Zaglavlje 4",
-        "Heading 5": "Zaglavlje 5",
-        "Heading 6": "Zaglavlje 6",
-        "Normal": "Običan",
-        "Address": "Adresa",
-        "Formatted": "Formatiran",
-        
-        // dialogs
-		"OK": "OK",
-		"Cancel": "Poništi",
-		"Path": "Putanja",
-		"You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Nalazite se u TEXT režimu.  Koristite [<>] dugme za povratak na WYSIWYG.",
-
-		"The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "",
-
-        "Alignment:": "Ravnanje",
-        "Not set": "Nije postavljeno",
-        "Left": "Levo",
-        "Right": "Desno",
-        "Texttop": "Vrh teksta",
-        "Absmiddle": "Apsolutna sredina",
-        "Baseline": "Donja linija",
-        "Absbottom": "Apsolutno dno",
-        "Bottom": "Dno",
-        "Middle": "Sredina",
-        "Top": "Vrh",
-
-        "Layout": "Prelom",
-        "Spacing": "Razmak",
-        "Horizontal:": "Po horizontali",
-        "Horizontal padding": "Horizontalno odstojanje",
-        "Vertical:": "Po vertikali",
-        "Vertical padding": "Vertikalno odstojanje",
-        "Border thickness:": "Debljina okvira",
-        "Leave empty for no border": "Ostavi prazno kad nema okvira",
-		
-        // Insert Link
-		"Insert/Modify Link": "Dodaj/promeni Link",
-		"None (use implicit)": "koristi podrazumevano",
-		"New window (_blank)": "Novom prozoru (_blank)",
-		"Same frame (_self)": "Isti frejm (_self)",
-		"Top frame (_top)": "Glavni frejm (_top)",
-		"Other": "Drugo",
-		"Target:": "Otvori u:",
-		"Title (tooltip):": "Naziv (tooltip):",
-		"URL:": "URL:",
-		"You must enter the URL where this link points to": "Morate uneti URL na koji vodi ovaj link",
-		
-        // Insert Table
-        "Insert Table": "Ubaci tabelu",
-        "Rows:": "Redovi",
-        "Number of rows": "Broj redova",
-        "Cols:": "Kolone",
-        "Number of columns": "Broj kolona",
-        "Width:": "Širina",
-        "Width of the table": "Širina tabele",
-        "Percent": "Procenat",
-        "Pixels": "Pikseli",
-        "Em": "Em",
-        "Width unit": "Jedinica širine",
-        "Fixed width columns": "Fiksirana širina kolona",
-        "Positioning of this table": "Postavljanje ove tabele",
-        "Cell spacing:": "Rastojanje ćelija",
-        "Space between adjacent cells": "Rastojanje naspramnih ćelija",
-        "Cell padding:": "Unutrašnja odstojanja u ćeliji",
-        "Space between content and border in cell": "Rastojanje između sadržaja i okvira ćelije",
-
-        // Insert Image
-        "Insert Image": "Ubaci sliku",
-        "Image URL:": "URL slike",
-        "Enter the image URL here": "Unesite URL slike ovde",
-        "Preview": "Pregled",
-        "Preview the image in a new window": "Pregledaj sliku u novom prozoru",
-        "Alternate text:": "Alternativni tekst",
-        "For browsers that don't support images": "Za pretraživače koji ne podržavaju slike",
-        "Positioning of this image": "Postavljanje ove slike",
-        "Image Preview:": "Pregled slike",
-        
-        // Select Color popup
-		"Select Color": "Izaberite boju"
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/si.js
deleted file mode 100644
index c34abbe..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/si.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// I18N constants
-
-// LANG: "si", ENCODING: UTF-8
-// Author: Tomaz Kregar, x_tomo_x@email.si
-
-// FOR TRANSLATORS:
-//
-//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
-//      (at least a valid email address)
-//
-//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
-//      (if this is not possible, please include a comment
-//       that states what encoding is necessary.)
-
-{
-  "Bold": "Krepko",
-  "Italic": "Ležeče",
-  "Underline": "Podčrtano",
-  "Strikethrough": "Prečrtano",
-  "Subscript": "Podpisano",
-  "Superscript": "Nadpisano",
-  "Justify Left": "Poravnaj levo",
-  "Justify Center": "Na sredino",
-  "Justify Right": "Poravnaj desno",
-  "Justify Full": "Porazdeli vsebino",
-  "Ordered List": "Oštevilčevanje",
-  "Bulleted List": "Označevanje",
-  "Decrease Indent": "Zmanjšaj zamik",
-  "Increase Indent": "Povečaj zamik",
-  "Font Color": "Barva pisave",
-  "Background Color": "Barva ozadja",
-  "Horizontal Rule": "Vodoravna črta",
-  "Insert Web Link": "Vstavi hiperpovezavo",
-  "Insert/Modify Image": "Vstavi sliko",
-  "Insert Table": "Vstavi tabelo",
-  "Toggle HTML Source": "Preklopi na HTML kodo",
-  "Enlarge Editor": "Povečaj urejevalnik",
-  "About this editor": "Vizitka za urejevalnik",
-  "Help using editor": "Pomoč za urejevalnik",
-  "Current style": "Trenutni slog",
-  "Undoes your last action": "Razveljavi zadnjo akcijo",
-  "Redoes your last action": "Uveljavi zadnjo akcijo",
-  "Cut selection": "Izreži",
-  "Copy selection": "Kopiraj",
-  "Paste from clipboard": "Prilepi",
-  "OK": "V redu",
-  "Cancel": "Prekliči",
-  "Path": "Pot",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Si v tekstovnem načinu.  Uporabi [<>] gumb za prklop nazaj na WYSIWYG."
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/sr.js
deleted file mode 100644
index 613dd7e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/sr.js
+++ /dev/null
@@ -1,140 +0,0 @@
-// I18N constants
-
-// LANG: "sh", ENCODING: UTF-8 | ISO-8859-5
-// Author: Ljuba Ranković, http://www.rankovic.net/ljubar
-
-// FOR TRANSLATORS:
-//
-//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
-//      (at least a valid email address)
-//
-//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
-//      (if this is not possible, please include a comment
-//       that states what encoding is necessary.)
-
-{
-		"Bold": "Масно",
-		"Italic": "Курзив",
-		"Underline": "Подвучено",
-		"Strikethrough": "Прецртано",
-		"Subscript": "Индекс-текст",
-		"Superscript": "Експонент-текст",
-		"Justify Left": "Равнање улево",
-		"Justify Center": "Равнање по симетрали",
-		"Justify Right": "Равнање удесно",
-		"Justify Full": "Пуно равнање",
-		"Ordered List": "Листа са редним бројевима",
-		"Bulleted List": "Листа са симболима",
-		"Decrease Indent": "Смањи увлачење",
-		"Increase Indent": "Повећај увлачење",
-		"Font Color": "Боја слова",
-		"Background Color": "Боја позадине",
-		"Horizontal Rule": "Хоризонтална линија",
-		"Insert Web Link": "додај веб линк",
-		"Insert/Modify Image": "додај/промени слику",
-		"Insert Table": "Убаци табелу",
-		"Toggle HTML Source": "Пребаци на приказ ХТМЛ кода",
-		"Enlarge Editor": "Повећај едитор",
-		"About this editor": "О овом едитору",
-		"Help using editor": "Помоћ при коришћењу едитора",
-		"Current style": "Важећи стил",
-		"Undoes your last action": "Поништава последњу радњу",
-		"Redoes your last action": "Враћа последњу радњу",
-		"Cut selection": "Исеци изабрано",
-		"Copy selection": "Копирај изабрано",
-		"Paste from clipboard": "Залепи из клипборда",
-		"Direction left to right": "Правац с лева на десно",
-		"Direction right to left": "Правац с десна на лево",
-        "Remove formatting": "Уклони форматирање",
-        "Select all": "Изабери све",
-        "Print document": "Штампај документ",
-        "Clear MSOffice tags": "Обриши MSOffice тагове",
-        "Clear Inline Font Specifications": "Обриши примењене особине фонта",
-        "Split Block": "Подели блок",
-        "Toggle Borders": "Пребаци оквирне линије",
-
-        "&#8212; format &#8212;": "&#8212; Format &#8212;",
-        "Heading 1": "Заглавље 1",
-        "Heading 2": "Заглавље 2",
-        "Heading 3": "Заглавље 3",
-        "Heading 4": "Заглавље 4",
-        "Heading 5": "Заглавље 5",
-        "Heading 6": "Заглавље 6",
-        "Normal": "обичан",
-        "Address": "адреса",
-        "Formatted": "форматиран",		
-		
-        // dialogs
-		"OK": "OK",
-		"Cancel": "Поништи",
-		"Path": "Путања",
-		"You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.":    "Налазите се у ТЕКСТ режиму.  Користите [<>] дугме за повратак на ШВТИД (WYSIWYG).",
-
-		"The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "Дугме 'залепи' не ради у претраживачима породице Mozilla (из разлога сигурности). Притисните CTRL-V на тастатури да директно залепите.",
-		
-        "Alignment:": "Равнање",
-        "Not set": "Није постављено",
-        "Left": "Лево",
-        "Right": "Десно",
-        "Texttop": "Врх текста",
-        "Absmiddle": "Апсолутна средина",
-        "Baseline": "Доња линија",
-        "Absbottom": "Апсолутно дно",
-        "Bottom": "Дно",
-        "Middle": "Средина",
-        "Top": "Врх",
-
-        "Layout": "Прелом",
-        "Spacing": "Размак",
-        "Horizontal:": "По хоризонтали",
-        "Horizontal padding": "Хортизонтално одстојање",
-        "Vertical:": "По вертикали",
-        "Vertical padding": "Вертикално одстојање",
-        "Border thickness:": "Дебљина оквира",
-        "Leave empty for no border": "Остави празно кад нема оквира",
-
-        // Insert Link
-		"Insert/Modify Link": "додај/промени линк",
-		"None (use implicit)": "користи подразумевано",
-		"New window (_blank)": "Новом прозору (_blank)",
-		"Same frame (_self)": "Исти фрејм (_self)",
-		"Top frame (_top)": "Главни фрејм (_top)",
-		"Other": "Друго",
-		"Target:": "Отвори у:",
-		"Title (tooltip):": "Назив (tooltip):",
-		"URL:": "УРЛ:",
-		"You must enter the URL where this link points to": "Морате унети УРЛ на који води овај линк",
-
-        // Insert Table
-        "Insert Table": "Убаци табелу",
-        "Rows:": "Редови",
-        "Number of rows": "Број редова",
-        "Cols:": "Колоне",
-        "Number of columns": "Број колона",
-        "Width:": "Ширина",
-        "Width of the table": "Ширина табеле",
-        "Percent": "Процената",
-        "Pixels": "Пиксела",
-        "Em": "Ем",
-        "Width unit": "Јединица ширине",
-        "Fixed width columns": "Фиксирана ширина колоне",
-        "Positioning of this table": "Постављање ове табеле",
-        "Cell spacing:": "Размак између ћелија",
-        "Space between adjacent cells": "Размак између наспрамних ћелија",
-        "Cell padding:": "Унутрашња одстојања од ивица ћелије",
-        "Space between content and border in cell": "Растојање између садржаја у ћелији и њеног оквира",
-
-        // Insert Image
-        "Insert Image": "Убаци слику",
-        "Image URL:": "УРЛ слике",
-        "Enter the image URL here": "Унесите УРЛ слике овде",
-        "Preview": "Преглед",
-        "Preview the image in a new window": "Прегледај слику у новом прозору",
-        "Alternate text:": "алтернативни текст",
-        "For browsers that don't support images": "За претраживаче који не подржавају слике",
-        "Positioning of this image": "Постављање ове слике",
-        "Image Preview:": "Преглед слике",
-
-        // Select Color popup
-		"Select Color": "Изабери боју"
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/sv.js
deleted file mode 100644
index 61af49e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/sv.js
+++ /dev/null
@@ -1,116 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-
-// Swedish version for htmlArea v3.0
-// Initital translation by pat <pat@engvall.nu>
-// Synced with additional contants in rev. 477 (Mar 2006) by Thomas Loo <tloo@saltstorm.net>
-
-{
-  "Bold": "Fet",
-  "Italic": "Kursiv",
-  "Underline": "Understruken",
-  "Strikethrough": "Genomstruken",
-  "Subscript": "Nedsänkt",
-  "Superscript": "Upphöjd",
-  "Justify Left": "Vänsterjustera",
-  "Justify Center": "Centrera",
-  "Justify Right": "Högerjustera",
-  "Justify Full": "Marginaljustera",
-  "Ordered List": "Numrerad lista",
-  "Bulleted List": "Punktlista",
-  "Decrease Indent": "Minska indrag",
-  "Increase Indent": "Öka indrag",
-  "Font Color": "Textfärg",
-  "Background Color": "Bakgrundsfärg",
-  "Horizontal Rule": "Vågrät linje",
-  "Insert Web Link": "Infoga länk",
-  "Insert/Modify Image": "Infoga bild",
-  "Toggle HTML Source": "Visa källkod",
-  "Enlarge Editor": "Visa i eget fönster",
-  "About this editor": "Om denna editor",
-  "Help using editor": "Hjälp",
-  "Current style": "Nuvarande stil",
-
-  "Undoes your last action": "Ångra kommando",
-  "Redoes your last action": "Upprepa kommando",
-  "Select all": "Markera allt",
-  "Print document": "Skriv ut",
-  "Clear MSOffice tags": "Städa bort MS Office taggar",
-  "Clear Inline Font Specifications": "Rensa inbäddad typsnittsinformation",
-  "Remove formatting": "Rensa formattering",
-  "Toggle Borders": "Objektramar",
-  "Split Block": "Dela block",
-  "Direction left to right": "Vänster till höger",
-  "Direction right to left": "Höger till vänster",
-
-  "Insert/Overwrite": "Infoga/Skriv över",
-  "OK": "OK",
-  "Cancel": "Avbryt",
-  "Path": "Objekt",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Du befinner dig i texläge. Klicka på ikonen [<>] ovan för att växla tillbaka till WYSIWIG läge",
-  "The full screen mode is known to cause problems with Internet Explorer, due to browser bugs that we weren": "Visning i fullskärmsläga fungerar dåligt i din webläsare. Möjliga problem resulterar i en ryckig editor, saknade editorfunktioner och/eller att webläsaren kraschar. Om du använder Windows 95/98 finns också möjligheten att Windows kraschar.\n\nTryck ",
-  "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "Denna knapp fungerar ej i Mozillabaserad webläsare, använd istället snabbtangenterna CTRL-V på tangentbordet för att klistra in.",
-
-  "Insert/Modify Link": "Redigera länk",
-  "New window (_blank)": "Nytt fönster (_blank)",
-  "None (use implicit)": "Ingen (använd standardinställing)",
-  "Other": "Annan",
-  "Same frame (_self)": "Samma ram (_self)",
-  "Target:": "Mål:",
-  "Title (tooltip):": "Titel (tooltip):",
-  "Top frame (_top)": "Toppram (_top)",
-  "URL:": "Sökväg:",
-  "You must enter the URL where this link points to": "Du måsta ange en adress till vilken länken skall peka på",
-  "Would you like to clear font typefaces?": "Radera alla typsnittsinformation ?",
-  "Would you like to clear font sizes?": "Radera alla fontstorlekar ?",
-  "Would you like to clear font colours?": "Ta bort all textfärger ?",
-
-  "You need to select some text before creating a link": "Du måsta markera ett objekt att applicera länken på!",
-
-  // Insert Table
-  "Insert Table": "Infoga tabell",
-  "Rows:": "Rader:",
-  "Number of rows": "Antal rader",
-  "Cols:": "Kolumner:",
-  "Number of columns": "Antal kolumner",
-  "Width:": "Bredd:",
-  "Width of the table": "Tabellbredd",
-  "Percent": "Procent",
-  "Pixels": "Pixlar",
-  "Em": "",
-  "Width unit": "Breddenheter",
-  "Fixed width columns": "Fixerad bredd",
-  "Alignment:": "Marginaljustering",
-  "Positioning of this table": "Tabellposition",
-  "Border thickness:": "Ramtjocklek",
-  "Leave empty for no border": "Lämna fältet tomt för att undvika ramar",
-  "Spacing": "Cellegenskaper",
-  "Cell spacing:": "Cellmarginaler:",
-  "Space between adjacent cells": "Utrymme mellan celler",
-  "Cell padding:": "Cellindrag:",
-  "Space between content and border in cell": "Utrymme mellan ram och cellinnehåll",
-  "You must enter a number of rows": "Ange ental rader",
-  "You must enter a number of columns": "Ange antal kolumner",
-
-  // Editor Help
-  "Keyboard shortcuts": "Snabbtangenter",
-  "The editor provides the following key combinations:": "Editorn nyttjar följande kombinationer:",
-  "new paragraph": "Ny paragraf ",
-  "insert linebreak": "Infoga radbrytning ",
-  "Set format to paragraph": "Aktivera paragrafläge",
-  "Clean content pasted from Word": "Rensa innehåll inklistrat från MS Word",
-  "Headings": "Skapa standardrubrik",
-  "Cut selection": "Klipp ut markering",
-  "Copy selection": "Kopiera  markering",
-  "Paste from clipboard": "Klistra in",
-  "Close": "Stäng",
-
-  // Loading messages
-  "Loading in progress. Please wait !": "Editorn laddas. Vänta...",
-  "Constructing main object": "Skapar huvudobjekt",
-  "Create Toolbar": "Skapar verktygspanel",
-  "Register panel right": "Registerar panel höger",
-  "Register panel left": "Registerar panel vänster",
-  "Register panel top": "Registerar toppanel",
-  "Register panel bottom": "Registerar fotpanel"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/th.js
deleted file mode 100644
index 8a116af..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/th.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// I18N constants

-

-// LANG: "th", ENCODING: UTF-8

-// Author: Suchin Prasongbundit, <suchin@joolsoft.com>

-

-// FOR TRANSLATORS:

-//

-//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE

-//      (at least a valid email address)

-//

-//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;

-//      (if this is not possible, please include a comment

-//       that states what encoding is necessary.)

-

-{

-  "Bold": "ตัวหนา",

-  "Italic": "ตัวเอียง",

-  "Underline": "ขีดเส้นใต้",

-  "Strikethrough": "ขีดทับ",

-  "Subscript": "ตัวห้อย",

-  "Superscript": "ตัวยก",

-  "Justify Left": "จัดชิดซ้าย",

-  "Justify Center": "จัดกึ่งกลาง",

-  "Justify Right": "จัดชิดขวา",

-  "Justify Full": "จัดเต็มขอบ",

-  "Ordered List": "เลขลำดับ",

-  "Bulleted List": "ลำดับ",

-  "Decrease Indent": "ลดย่อหน้า",

-  "Increase Indent": "เพิ่มย่อหน้า",

-  "Font Color": "สีขอบแบบอักษร",

-  "Background Color": "สีพื้นหลัง",

-  "Horizontal Rule": "เส้นกึ่งกลาง",

-  "Insert Web Link": "ิเพิ่มลิ้งค์",

-  "Insert/Modify Image": "เพิ่ม/แก้ไขภาพ",

-  "Insert Table": "เพิ่มตาราง",

-  "Toggle HTML Source": "สลับการแสดงโค้ด HTML",

-  "Enlarge Editor": "ขยายให้เต็มจอ",

-  "About this editor": "เกี่ยวกับโปรแกรมนี้",

-  "Help using editor": "การใช้งานโปรแกรม",

-  "Current style": "รูปแบบปัจจุบัน",

-  "Undoes your last action": "ย้อนกลับ",

-  "Redoes your last action": "ทำซ้ำ",

-  "Cut selection": "ตัดส่วนที่เลือก",

-  "Copy selection": "สำเนาส่วนที่เลือก",

-  "Paste from clipboard": "วางจากคลิปบอร์ด",

-  "OK": "ตกลง",

-  "Cancel": "ยกเลิก",

-  "Path": "เส้นทาง",

-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "คุณอยู่ในโหมดธรรมดา กดที่ปุ่ม [<>] เพื่อสลับกลับไปยังโหมดพิมพ์งานแบบเวิร์ด"

-}

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/vn.js
deleted file mode 100644
index 0aa6416..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/lang/vn.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// I18N constants : Vietnamese
-// LANG: "en", ENCODING: UTF-8
-// Author: Nguyễn Đình Nam, <hncryptologist@yahoo.com>
-// Modified 21/07/2004 by Phạm Mai Quân <pmquan@4vn.org>
-
-{
-  "Bold": "Đậm",
-  "Italic": "Nghiêng",
-  "Underline": "Gạch Chân",
-  "Strikethrough": "Gạch Xóa",
-  "Subscript": "Viết Xuống Dưới",
-  "Superscript": "Viết Lên Trên",
-  "Justify Left": "Căn Trái",
-  "Justify Center": "Căn Giữa",
-  "Justify Right": "Căn Phải",
-  "Justify Full": "Căn Đều",
-  "Ordered List": "Danh Sách Có Thứ Tự (1, 2, 3)",
-  "Bulleted List": "Danh Sách Phi Thứ Tự (Chấm đầu dòng)",
-  "Decrease Indent": "Lùi Ra Ngoài",
-  "Increase Indent": "Thụt Vào Trong",
-  "Font Color": "Màu Chữ",
-  "Background Color": "Màu Nền",
-  "Horizontal Rule": "Dòng Kẻ Ngang",
-  "Insert Web Link": "Tạo Liên Kết",
-  "Insert/Modify Image": "Chèn Ảnh",
-  "Insert Table": "Chèn Bảng",
-  "Toggle HTML Source": "Chế Độ Mã HTML",
-  "Enlarge Editor": "Phóng To Ô Soạn Thảo",
-  "About this editor": "Tự Giới Thiệu",
-  "Help using editor": "Giúp Đỡ",
-  "Current style": "Định Dạng Hiện Thời",
-  "Undoes your last action": "Hủy thao tác trước",
-  "Redoes your last action": "Lấy lại thao tác vừa bỏ",
-  "Cut selection": "Cắt",
-  "Copy selection": "Sao chép",
-  "Paste from clipboard": "Dán",
-  "Direction left to right": "Viết từ trái sang phải",
-  "Direction right to left": "Viết từ phải sang trái",
-  "OK": "Đồng ý",
-  "Cancel": "Hủy",
-  "The full screen mode is known to cause problems with Internet Explorer, due to browser bugs that we weren": "Chế độ phóng to ô soạn thảo có thể gây lỗi với Internet Explorer vì một số lỗi của trình duyệt này, vì thế chế độ này có thể sẽ không chạy. Hiển thị không đúng, lộn xộn, không có đầy đủ chức năng, và cũng có thể làm trình duyệt của bạn bị tắt ngang. Nếu bạn đang sử dụng Windows 9x bạn có thể bị báo lỗi ",
-  "Path": "Đường Dẫn",
-  "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Bạn đang ở chế độ text.  Sử dụng nút [<>] để chuyển lại chế độ WYSIWIG.",
-  "Cancel": "Hủy",
-  "Insert/Modify Link": "Thêm/Chỉnh sửa đường dẫn",
-  "New window (_blank)": "Cửa sổ mới (_blank)",
-  "None (use implicit)": "Không (sử dụng implicit)",
-  "OK": "Đồng ý",
-  "Other": "Khác",
-  "Same frame (_self)": "Trên cùng khung (_self)",
-  "Target:": "Nơi hiện thị:",
-  "Title (tooltip):": "Tiêu đề (của hướng dẫn):",
-  "Top frame (_top)": "Khung trên cùng (_top)",
-  "URL:": "URL:",
-  "You must enter the URL where this link points to": "Bạn phải điền địa chỉ (URL) mà đường dẫn sẽ liên kết tới"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/license.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/license.txt
deleted file mode 100644
index e7798cf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/license.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-htmlArea License (based on BSD license)

-Copyright (c) 2002-2004, interactivetools.com, inc.

-Copyright (c) 2003-2004 dynarch.com

-All rights reserved.

-

-Redistribution and use in source and binary forms, with or without

-modification, are permitted provided that the following conditions are met:

-

-1) Redistributions of source code must retain the above copyright notice,

-   this list of conditions and the following disclaimer.

-

-2) Redistributions in binary form must reproduce the above copyright notice,

-   this list of conditions and the following disclaimer in the documentation

-   and/or other materials provided with the distribution.

-

-3) Neither the name of interactivetools.com, inc. nor the names of its

-   contributors may be used to endorse or promote products derived from this

-   software without specific prior written permission.

-

-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE

-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR

-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF

-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS

-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN

-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)

-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE

-POSSIBILITY OF SUCH DAMAGE.

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/AboutBox/AboutBox.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/AboutBox/AboutBox.js
deleted file mode 100644
index 8917a05..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/AboutBox/AboutBox.js
+++ /dev/null
@@ -1,156 +0,0 @@
-// Paste Plain Text plugin for Xinha

-

-// Distributed under the same terms as Xinha itself.

-// This notice MUST stay intact for use (see license.txt).

-(function(){

-Xinha.plugins.AboutBox = AboutBox;

-function AboutBox(editor) {

-  this.editor = editor;

-}

-

-AboutBox._pluginInfo = {

-  name          : "AboutBox",

-  developer     : "The Xinha Core Developer Team"

-};

-

-AboutBox.prototype._lc = function(string) {

-  return Xinha._lc(string, 'AboutBox');

-};

-

-

-AboutBox.prototype._prepareDialog = function()

-{

-  var self = this;

-  var editor = this.editor;

-  

-  Xinha.loadStyle ('about.css', 'AboutBox', 'aboutCSS');

-/// Now we have everything we need, so we can build the dialog.

-  this.dialog = new Xinha.Dialog(editor, AboutBox.html, 'Xinha',{width:600})

-

-  this.dialog.getElementById('close').onclick = function() { self.dialog.hide()};

-  this.dialog.getElementById('xinha_logo').src = _editor_url + 'images/xinha_logo.gif';

-

-  var tabs = this.dialog.getElementsByClassName('tab');

-  this.currentTab = tabs[0];

-  tabs.forEach(function(tab){

-    //alert (tab);

-    tab.onclick = function() {

-      if (self.currentTab)

-      {

-        Xinha._removeClass(self.currentTab,'tab-current');

-        self.dialog.getElementById(self.currentTab.rel).style.display = 'none';

-      } 

-      Xinha._addClass(tab, 'tab-current');

-      tab.blur();

-      self.currentTab = tab;

-      self.dialog.getElementById(tab.rel).style.display = 'block';

-    }

-  })

-  this.fillPlugins();

-  this.fillVersion();

-  this.dialog.onresize = function ()

-  {

-    this.getElementById("content").style.height = 

-    parseInt(this.height,10) // the actual height of the dialog

-    - this.getElementById('h1').offsetHeight // the title bar

-    - this.getElementById('buttons').offsetHeight // the buttons

-    - 100 // we have a padding at the bottom, gotta take this into acount

-    + 'px'; // don't forget this ;)

-

-    //this.getElementById("content").style.width =(this.width - 2) + 'px'; // and the width

-  }

-};

-AboutBox.prototype.fillPlugins = function()

-{

-  var e = this.editor;

-  var tbody = this.dialog.getElementById('plugins_table');

-  var tr,td,a;

-  var j = 0;

-  for (var i in e.plugins) 

-  {

-    var info = e.plugins[i];

-    tr = document.createElement('tr');

-    if (j%2) tr.style.backgroundColor = '#e5e5e5';

-    tbody.appendChild(tr);

-    td = document.createElement('td');

-    td.innerHTML = info.name;

-    if (info.version) td.innerHTML += ' v'+info.version;

-    tr.appendChild(td);

-    

-    td = document.createElement('td');

-    if (info.developer)

-    {

-      if (info.developer_url)

-      {

-            td.innerHTML = '<a target="_blank" href="'+info.developer_url+'">'+info.developer+'</a>';

-      }

-      else

-      {

-        td.innerHTML = info.developer

-      }

-    }

-    tr.appendChild(td);

-    

-    td = document.createElement('td');

-    if (info.sponsor)

-    {

-      if (info.sponsor_url)

-      {

-            td.innerHTML = '<a target="_blank" href="'+info.sponsor_url+'">'+info.sponsor+'</a>';

-      }

-      else

-      {

-        td.innerHTML = info.sponsor

-      }

-    }

-    tr.appendChild(td);

-    

-    td = document.createElement('td');

-    if (info.license)

-    {

-      td.innerHTML = info.license;

-    }

-    else

-    {

-      td.innerHTML = 'htmlArea';

-    }

-    tr.appendChild(td);

-    j++;

-  }

-}

-AboutBox.prototype.fillVersion = function()

-{

-  var ver = Xinha.version;

-  this.dialog.getElementById('version').innerHTML = '<pre>'

-                      + '\nRelease:         ' + ver.Release + ' (' + ver.Date + ')'

-                      + '\nHead:            ' + ver.Head

-                      + '\nRevision:        ' + ver.Revision

-                      + '\nLast Changed By: ' + ver.RevisionBy

-                      + '\n' +

-                      '</pre>';

-}

-AboutBox.prototype.show = function()

-{

-  var self = this;

-  if (!AboutBox.html)

-  {

-    if (AboutBox.loading) return;

-    AboutBox.loading = true;

-    Xinha._getback(Xinha.getPluginDir("AboutBox") + '/dialog.html', function(getback) { AboutBox.html = getback; self.show()});

-    return;

-  }

-  if (!this.dialog) this._prepareDialog();

-

-  // here we can pass values to the dialog

-  // each property pair consists of the "name" of the input we want to populate, and the value to be set

-  var inputs =

-  {

-      inputArea : '' // we want the textarea always to be empty on showing

-  }

-  // now calling the show method of the Xinha.Dialog object to set the values and show the actual dialog

-  this.dialog.show(inputs);

-

-  // Init the sizes (only if we have set up the custom resize function)

-  //this.dialog.onresize();

-};

-})()

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/AboutBox/about.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/AboutBox/about.css
deleted file mode 100644
index c4507d0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/AboutBox/about.css
+++ /dev/null
@@ -1,51 +0,0 @@
-.dialog .about.buttons a.tab {
-  color: #000;
-  cursor: pointer;
-  margin-left: -5px;
-  float: left; position: relative;
-  border: 1px solid #555;
-  top: -3px; left: -2px;
-  padding: 2px 10px 3px 10px;
-  border-top: none; background-color: #CCC;
-  -moz-border-radius: 0px 0px 4px 4px;
-  -webkit-border-radius: 4px;
-  -webkit-border-top-left-radius:0;
-  -webkit-border-top-right-radius:0;
-  
-  z-index: 0;
-  text-decoration:none;
-}
-.dialog .about.buttons a.tab-current
-{
-  top: -4px;
-  background-color: #f5f6f6;
-  padding: 3px 10px 4px 10px;
-  z-index: 10;
-}
-
-.dialog .about.buttons {
-  background-color:white;
-  padding:3px 3px 0 10px;
-}
-
-.dialog .about.content .tab-content {
-  padding-bottom:15px;
-  width:95%;
-}
-.dialog .about.content {
-  height:300px;
-  overflow:auto;
-  background-color:#f5f6f6;
-}
-.dialog .about.content table.plugins{
-  width:95%;
-  border: 1px solid black;
-  margin: 1em;
-}
-.dialog .about.content table.plugins th{
-  font-weight: bold;
-  background-color: #CCC;
-}
-.dialog .about.content table.plugins td{
-  padding:3px;
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/AboutBox/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/AboutBox/dialog.html
deleted file mode 100644
index 4035191..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/AboutBox/dialog.html
+++ /dev/null
@@ -1,95 +0,0 @@
-<h1 id="[h1]">

-    <l10n>About this editor</l10n>

-</h1>

-<img alt="Xinha" src="" id="[xinha_logo]" />

-<div id="[content]" class="about content" style="padding:10px;">

-     <div id="[about]" class="tab-content">

-        <p>

-            A free WYSIWYG editor replacement for 

-            <tt>

-                &lt;textarea&gt;

-            </tt>

-            fields.

-        </p>

-        <p>

-            Visit the <a href="http://xinha.gogo.co.nz/">Xinha Website</a>

-            for more information.

-        </p>

-        <p>

-            Use of Xinha is granted by the terms of the htmlArea License (based on BSD license)

-        </p>

-        <pre>    Copyright (c) 2005-2009 Xinha Developer Team and contributors</pre>

-        <p>

-            Xinha was originally based on work by Mihai Bazon which is:

-        </p>

-        <pre>

-    Copyright (c) 2003-2004 dynarch.com.

-    Copyright (c) 2002-2003 interactivetools.com, inc.

-    This copyright notice MUST stay intact for use.

-  </pre>

-    </div>

-    <div id="[thanks]" style="display:none"  class="tab-content">

-      The development of Xinha would not have been possible without the original work of Mihai Bazon, InteractiveTools.com, and the many sponsors and contributors from around the world. 

-    </div>

-    <div id="[license]" style="display:none" class="tab-content">

-      <pre>htmlArea License (based on BSD license)

-Copyright (c) 2005-2009 Xinha Developer Team and contributors

-Copyright (c) 2002-2004, interactivetools.com, inc.

-Copyright (c) 2003-2004 dynarch.com

-All rights reserved.

-

-Redistribution and use in source and binary forms, with or without

-modification, are permitted provided that the following conditions are met:

-

-1) Redistributions of source code must retain the above copyright notice,

-   this list of conditions and the following disclaimer.

-

-2) Redistributions in binary form must reproduce the above copyright notice,

-   this list of conditions and the following disclaimer in the documentation

-   and/or other materials provided with the distribution.

-

-3) Neither the name of interactivetools.com, inc. nor the names of its

-   contributors may be used to endorse or promote products derived from this

-   software without specific prior written permission.

-

-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE

-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR

-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF

-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS

-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN

-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)

-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE

-POSSIBILITY OF SUCH DAMAGE.</pre>

-    </div>

-    <div id="[plugins]" style="display:none" class="tab-content">

-      <p>The following plugins have been loaded.</p>

-      <table class="plugins">

-        <thead>

-          <tr>

-            <th>Name</th>

-            <th>Developer</th>

-            <th>Sponsored by</th>

-            <th>License</th>

-          </tr>

-        </thead>

-        <tbody id="[plugins_table]"></tbody>

-      </table>

-      <p>License "htmlArea" means that the plugin is distributed under the same terms as Xinha itself.</p>

-    </div>

-    <div id="[version]" style="display:none" class="tab-content">

-      

-    </div>

-</div>

-<div class="buttons about" id="[buttons]">

-  <input style="float:right" type="button" id="[close]" value="_(Close)" />

-  <div style="float:left">

-    <a rel="about" class="tab tab-current" href="javascript:void(0)">About</a>

-    <a rel="thanks" class="tab" href="javascript:void(0)">Thanks</a>

-    <a rel="license" class="tab" href="javascript:void(0)">License</a>

-    <a rel="plugins" class="tab" href="javascript:void(0)">Plugins</a>

-    <a rel="version" class="tab" href="javascript:void(0)">Version</a>

-  </div>

-</div>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/ColorPicker/ColorPicker.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/ColorPicker/ColorPicker.js
deleted file mode 100644
index dba2f6b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/ColorPicker/ColorPicker.js
+++ /dev/null
@@ -1,624 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/ColorPicker/ColorPicker.js */
-ColorPicker._pluginInfo={name:"colorPicker",version:"$LastChangedRevision: 1237 $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),developer:"James Sleeman",developer_url:"http://www.gogo.co.nz/",c_owner:"Gogo Internet Services",license:"htmlArea",sponsor:"Gogo Internet Services",sponsor_url:"http://www.gogo.co.nz/"};
-function ColorPicker(){
-};
-try{
-if(window.opener&&window.opener.Xinha){
-var openerColorPicker=window.opener.Xinha.colorPicker;
-Xinha._addEvent(window,"unload",function(){
-Xinha.colorPicker=openerColorPicker;
-});
-}
-}
-catch(e){
-}
-Xinha.colorPicker=function(_1){
-if(Xinha.colorPicker.savedColors.length===0){
-Xinha.colorPicker.loadColors();
-}
-this.is_ie_6=(Xinha.is_ie&&Xinha.ie_version<7);
-var _2=this;
-var _3=false;
-var _4=false;
-var _5=0;
-var _6=0;
-this.callback=_1.callback?_1.callback:function(_7){
-alert("You picked "+_7);
-};
-this.websafe=_1.websafe?_1.websafe:false;
-this.savecolors=_1.savecolors?_1.savecolors:20;
-this.cellsize=parseInt(_1.cellsize?_1.cellsize:"10px",10);
-this.side=_1.granularity?_1.granularity:18;
-var _8=this.side+1;
-var _9=this.side-1;
-this.value=1;
-this.saved_cells=null;
-this.table=document.createElement("table");
-this.table.className="dialog";
-this.table.cellSpacing=this.table.cellPadding=0;
-this.table.onmouseup=function(){
-_3=false;
-_4=false;
-};
-this.tbody=document.createElement("tbody");
-this.table.appendChild(this.tbody);
-this.table.style.border="1px solid WindowFrame";
-this.table.style.zIndex="1050";
-var tr=document.createElement("tr");
-var td=document.createElement("td");
-td.colSpan=this.side;
-td.className="title";
-td.style.fontFamily="small-caption,caption,sans-serif";
-td.style.fontSize="x-small";
-td.unselectable="on";
-td.style.MozUserSelect="none";
-td.style.cursor="default";
-td.appendChild(document.createTextNode(Xinha._lc("Click a color...")));
-td.style.borderBottom="1px solid WindowFrame";
-tr.appendChild(td);
-td=null;
-var td=document.createElement("td");
-td.className="title";
-td.colSpan=2;
-td.style.fontFamily="Tahoma,Verdana,sans-serif";
-td.style.borderBottom="1px solid WindowFrame";
-td.style.paddingRight="0";
-tr.appendChild(td);
-var _c=document.createElement("div");
-_c.title=Xinha._lc("Close");
-_c.className="buttonColor";
-_c.style.height="11px";
-_c.style.width="11px";
-_c.style.cursor="pointer";
-_c.onclick=function(){
-_2.close();
-};
-_c.appendChild(document.createTextNode("×"));
-_c.align="center";
-_c.style.verticalAlign="top";
-_c.style.position="relative";
-_c.style.cssFloat="right";
-_c.style.styleFloat="right";
-_c.style.padding="0";
-_c.style.margin="2px";
-_c.style.backgroundColor="transparent";
-_c.style.fontSize="11px";
-if(!Xinha.is_ie){
-_c.style.lineHeight="9px";
-}
-_c.style.letterSpacing="0";
-td.appendChild(_c);
-this.tbody.appendChild(tr);
-_c=tr=td=null;
-this.constrain_cb=document.createElement("input");
-this.constrain_cb.type="checkbox";
-this.chosenColor=document.createElement("input");
-this.chosenColor.type="text";
-this.chosenColor.maxLength=7;
-this.chosenColor.style.width="50px";
-this.chosenColor.style.fontSize="11px";
-this.chosenColor.onchange=function(){
-if(/#[0-9a-f]{6,6}/i.test(this.value)){
-_2.backSample.style.backgroundColor=this.value;
-_2.foreSample.style.color=this.value;
-}
-};
-this.backSample=document.createElement("div");
-this.backSample.appendChild(document.createTextNode(" "));
-this.backSample.style.fontWeight="bold";
-this.backSample.style.fontFamily="small-caption,caption,sans-serif";
-this.backSample.fontSize="x-small";
-this.foreSample=document.createElement("div");
-this.foreSample.appendChild(document.createTextNode(Xinha._lc("Sample")));
-this.foreSample.style.fontWeight="bold";
-this.foreSample.style.fontFamily="small-caption,caption,sans-serif";
-this.foreSample.fontSize="x-small";
-function toHex(_d){
-var h=_d.toString(16);
-if(h.length<2){
-h="0"+h;
-}
-return h;
-};
-function tupleToColor(_f){
-return "#"+toHex(_f.red)+toHex(_f.green)+toHex(_f.blue);
-};
-function nearestPowerOf(num,_11){
-return Math.round(Math.round(num/_11)*_11);
-};
-function doubleHexDec(dec){
-return parseInt(dec.toString(16)+dec.toString(16),16);
-};
-function rgbToWebsafe(_13){
-_13.red=doubleHexDec(nearestPowerOf(parseInt(toHex(_13.red).charAt(0),16),3));
-_13.blue=doubleHexDec(nearestPowerOf(parseInt(toHex(_13.blue).charAt(0),16),3));
-_13.green=doubleHexDec(nearestPowerOf(parseInt(toHex(_13.green).charAt(0),16),3));
-return _13;
-};
-function hsvToRGB(h,s,v){
-var _17;
-if(s===0){
-_17={red:v,green:v,blue:v};
-}else{
-h/=60;
-var i=Math.floor(h);
-var f=h-i;
-var p=v*(1-s);
-var q=v*(1-s*f);
-var t=v*(1-s*(1-f));
-switch(i){
-case 0:
-_17={red:v,green:t,blue:p};
-break;
-case 1:
-_17={red:q,green:v,blue:p};
-break;
-case 2:
-_17={red:p,green:v,blue:t};
-break;
-case 3:
-_17={red:p,green:q,blue:v};
-break;
-case 4:
-_17={red:t,green:p,blue:v};
-break;
-default:
-_17={red:v,green:p,blue:q};
-break;
-}
-}
-_17.red=Math.ceil(_17.red*255);
-_17.green=Math.ceil(_17.green*255);
-_17.blue=Math.ceil(_17.blue*255);
-return _17;
-};
-var _1d=this;
-function closeOnBodyClick(ev){
-ev=ev?ev:window.event;
-el=ev.target?ev.target:ev.srcElement;
-do{
-if(el==_1d.table){
-return;
-}
-}while(el=el.parentNode);
-_1d.close();
-};
-this.open=function(_1f,_20,_21){
-this.table.style.display="";
-this.pick_color();
-if(_21&&/#[0-9a-f]{6,6}/i.test(_21)){
-this.chosenColor.value=_21;
-this.backSample.style.backgroundColor=_21;
-this.foreSample.style.color=_21;
-}
-Xinha._addEvent(document.body,"mousedown",closeOnBodyClick);
-this.table.style.position="absolute";
-var e=_20;
-var top=0;
-var _24=0;
-do{
-if(e.style.position=="fixed"){
-this.table.style.position="fixed";
-}
-top+=e.offsetTop-e.scrollTop;
-_24+=e.offsetLeft-e.scrollLeft;
-e=e.offsetParent;
-}while(e);
-var x,y;
-if(/top/.test(_1f)||(top+this.table.offsetHeight>document.body.offsetHeight)){
-if(top-this.table.offsetHeight>0){
-this.table.style.top=(top-this.table.offsetHeight)+"px";
-}else{
-this.table.style.top=0;
-}
-}else{
-this.table.style.top=(top+_20.offsetHeight)+"px";
-}
-if(/left/.test(_1f)||(_24+this.table.offsetWidth>document.body.offsetWidth)){
-if(_24-(this.table.offsetWidth-_20.offsetWidth)>0){
-this.table.style.left=(_24-(this.table.offsetWidth-_20.offsetWidth))+"px";
-}else{
-this.table.style.left=0;
-}
-}else{
-this.table.style.left=_24+"px";
-}
-if(this.is_ie_6){
-this.iframe.style.top=this.table.style.top;
-this.iframe.style.left=this.table.style.left;
-}
-};
-function pickCell(_27){
-_2.chosenColor.value=_27.colorCode;
-_2.backSample.style.backgroundColor=_27.colorCode;
-_2.foreSample.style.color=_27.colorCode;
-if((_27.hue>=195&&_27.saturation>0.5)||(_27.hue===0&&_27.saturation===0&&_27.value<0.5)||(_27.hue!==0&&_2.value<0.75)){
-_27.style.borderColor="#fff";
-}else{
-_27.style.borderColor="#000";
-}
-_5=_27.thisrow;
-_6=_27.thiscol;
-};
-function pickValue(_28){
-if(_2.value<0.5){
-_28.style.borderColor="#fff";
-}else{
-_28.style.borderColor="#000";
-}
-_9=_28.thisrow;
-_8=_28.thiscol;
-_2.chosenColor.value=_2.saved_cells[_5][_6].colorCode;
-_2.backSample.style.backgroundColor=_2.saved_cells[_5][_6].colorCode;
-_2.foreSample.style.color=_2.saved_cells[_5][_6].colorCode;
-};
-function unpickCell(row,col){
-_2.saved_cells[row][col].style.borderColor=_2.saved_cells[row][col].colorCode;
-};
-this.pick_color=function(){
-var _2b,_2c;
-var _2d=this;
-var _2e=359/(this.side);
-var _2f=1/(this.side-1);
-var _30=1/(this.side-1);
-var _31=this.constrain_cb.checked;
-if(this.saved_cells===null){
-this.saved_cells=[];
-for(var row=0;row<this.side;row++){
-var tr=document.createElement("tr");
-this.saved_cells[row]=[];
-for(var col=0;col<this.side;col++){
-var td=document.createElement("td");
-if(_31){
-td.colorCode=tupleToColor(rgbToWebsafe(hsvToRGB(_2e*row,_2f*col,this.value)));
-}else{
-td.colorCode=tupleToColor(hsvToRGB(_2e*row,_2f*col,this.value));
-}
-this.saved_cells[row][col]=td;
-td.style.height=this.cellsize+"px";
-td.style.width=this.cellsize-2+"px";
-td.style.borderWidth="1px";
-td.style.borderStyle="solid";
-td.style.borderColor=td.colorCode;
-td.style.backgroundColor=td.colorCode;
-if(row==_5&&col==_6){
-td.style.borderColor="#000";
-this.chosenColor.value=td.colorCode;
-this.backSample.style.backgroundColor=td.colorCode;
-this.foreSample.style.color=td.colorCode;
-}
-td.hue=_2e*row;
-td.saturation=_2f*col;
-td.thisrow=row;
-td.thiscol=col;
-td.onmousedown=function(){
-_3=true;
-_2d.saved_cells[_5][_6].style.borderColor=_2d.saved_cells[_5][_6].colorCode;
-pickCell(this);
-};
-td.onmouseover=function(){
-if(_3){
-pickCell(this);
-}
-};
-td.onmouseout=function(){
-if(_3){
-this.style.borderColor=this.colorCode;
-}
-};
-td.ondblclick=function(){
-Xinha.colorPicker.remember(this.colorCode,_2d.savecolors);
-_2d.callback(this.colorCode);
-_2d.close();
-};
-td.appendChild(document.createTextNode(" "));
-td.style.cursor="pointer";
-tr.appendChild(td);
-td=null;
-}
-var td=document.createElement("td");
-td.appendChild(document.createTextNode(" "));
-td.style.width=this.cellsize+"px";
-tr.appendChild(td);
-td=null;
-var td=document.createElement("td");
-this.saved_cells[row][col+1]=td;
-td.appendChild(document.createTextNode(" "));
-td.style.width=this.cellsize-2+"px";
-td.style.height=this.cellsize+"px";
-td.constrainedColorCode=tupleToColor(rgbToWebsafe(hsvToRGB(0,0,_30*row)));
-td.style.backgroundColor=td.colorCode=tupleToColor(hsvToRGB(0,0,_30*row));
-td.style.borderWidth="1px";
-td.style.borderStyle="solid";
-td.style.borderColor=td.colorCode;
-if(row==_9){
-td.style.borderColor="black";
-}
-td.hue=_2e*row;
-td.saturation=_2f*col;
-td.hsv_value=_30*row;
-td.thisrow=row;
-td.thiscol=col+1;
-td.onmousedown=function(){
-_4=true;
-_2d.saved_cells[_9][_8].style.borderColor=_2d.saved_cells[_9][_8].colorCode;
-_2d.value=this.hsv_value;
-_2d.pick_color();
-pickValue(this);
-};
-td.onmouseover=function(){
-if(_4){
-_2d.value=this.hsv_value;
-_2d.pick_color();
-pickValue(this);
-}
-};
-td.onmouseout=function(){
-if(_4){
-this.style.borderColor=this.colorCode;
-}
-};
-td.style.cursor="pointer";
-tr.appendChild(td);
-td=null;
-this.tbody.appendChild(tr);
-tr=null;
-}
-var tr=document.createElement("tr");
-this.saved_cells[row]=[];
-for(var col=0;col<this.side;col++){
-var td=document.createElement("td");
-if(_31){
-td.colorCode=tupleToColor(rgbToWebsafe(hsvToRGB(0,0,_30*(this.side-col-1))));
-}else{
-td.colorCode=tupleToColor(hsvToRGB(0,0,_30*(this.side-col-1)));
-}
-this.saved_cells[row][col]=td;
-td.style.height=this.cellsize+"px";
-td.style.width=this.cellsize-2+"px";
-td.style.borderWidth="1px";
-td.style.borderStyle="solid";
-td.style.borderColor=td.colorCode;
-td.style.backgroundColor=td.colorCode;
-td.hue=0;
-td.saturation=0;
-td.value=_30*(this.side-col-1);
-td.thisrow=row;
-td.thiscol=col;
-td.onmousedown=function(){
-_3=true;
-_2d.saved_cells[_5][_6].style.borderColor=_2d.saved_cells[_5][_6].colorCode;
-pickCell(this);
-};
-td.onmouseover=function(){
-if(_3){
-pickCell(this);
-}
-};
-td.onmouseout=function(){
-if(_3){
-this.style.borderColor=this.colorCode;
-}
-};
-td.ondblclick=function(){
-Xinha.colorPicker.remember(this.colorCode,_2d.savecolors);
-_2d.callback(this.colorCode);
-_2d.close();
-};
-td.appendChild(document.createTextNode(" "));
-td.style.cursor="pointer";
-tr.appendChild(td);
-td=null;
-}
-this.tbody.appendChild(tr);
-tr=null;
-var tr=document.createElement("tr");
-var td=document.createElement("td");
-tr.appendChild(td);
-td.colSpan=this.side+2;
-td.style.padding="3px";
-if(this.websafe){
-var div=document.createElement("div");
-var _37=document.createElement("label");
-_37.appendChild(document.createTextNode(Xinha._lc("Web Safe: ")));
-this.constrain_cb.onclick=function(){
-_2d.pick_color();
-};
-_37.appendChild(this.constrain_cb);
-_37.style.fontFamily="small-caption,caption,sans-serif";
-_37.style.fontSize="x-small";
-div.appendChild(_37);
-td.appendChild(div);
-div=null;
-}
-var div=document.createElement("div");
-var _37=document.createElement("label");
-_37.style.fontFamily="small-caption,caption,sans-serif";
-_37.style.fontSize="x-small";
-_37.appendChild(document.createTextNode(Xinha._lc("Color: ")));
-_37.appendChild(this.chosenColor);
-div.appendChild(_37);
-var but=document.createElement("span");
-but.className="buttonColor ";
-but.style.fontSize="13px";
-but.style.width="24px";
-but.style.marginLeft="2px";
-but.style.padding="0px 4px";
-but.style.cursor="pointer";
-but.onclick=function(){
-Xinha.colorPicker.remember(_2d.chosenColor.value,_2d.savecolors);
-_2d.callback(_2d.chosenColor.value);
-_2d.close();
-};
-but.appendChild(document.createTextNode(Xinha._lc("OK")));
-but.align="center";
-div.appendChild(but);
-td.appendChild(div);
-var _39=document.createElement("table");
-_39.style.width="100%";
-var _3a=document.createElement("tbody");
-_39.appendChild(_3a);
-var _3b=document.createElement("tr");
-_3a.appendChild(_3b);
-var _3c=document.createElement("td");
-_3b.appendChild(_3c);
-_3c.appendChild(this.backSample);
-_3c.style.width="50%";
-var _3d=document.createElement("td");
-_3b.appendChild(_3d);
-_3d.appendChild(this.foreSample);
-_3d.style.width="50%";
-td.appendChild(_39);
-var _3e=document.createElement("div");
-_3e.style.clear="both";
-function createSavedColors(_3f){
-var _40=Xinha.is_ie;
-var div=document.createElement("div");
-div.style.width=_2d.cellsize+"px";
-div.style.height=_2d.cellsize+"px";
-div.style.margin="1px";
-div.style.border="1px solid black";
-div.style.cursor="pointer";
-div.style.backgroundColor=_3f;
-div.style[_40?"styleFloat":"cssFloat"]="left";
-div.ondblclick=function(){
-_2d.callback(_3f);
-_2d.close();
-};
-div.onclick=function(){
-_2d.chosenColor.value=_3f;
-_2d.backSample.style.backgroundColor=_3f;
-_2d.foreSample.style.color=_3f;
-};
-_3e.appendChild(div);
-};
-for(var _42=0;_42<Xinha.colorPicker.savedColors.length;_42++){
-createSavedColors(Xinha.colorPicker.savedColors[_42]);
-}
-td.appendChild(_3e);
-this.tbody.appendChild(tr);
-document.body.appendChild(this.table);
-if(this.is_ie_6){
-if(!this.iframe){
-this.iframe=document.createElement("iframe");
-this.iframe.frameBorder=0;
-this.iframe.src="javascript:;";
-this.iframe.style.position="absolute";
-this.iframe.style.width=this.table.offsetWidth;
-this.iframe.style.height=this.table.offsetHeight;
-this.iframe.style.zIndex="1049";
-document.body.insertBefore(this.iframe,this.table);
-}
-this.iframe.style.display="";
-}
-}else{
-for(var row=0;row<this.side;row++){
-for(var col=0;col<this.side;col++){
-if(_31){
-this.saved_cells[row][col].colorCode=tupleToColor(rgbToWebsafe(hsvToRGB(_2e*row,_2f*col,this.value)));
-}else{
-this.saved_cells[row][col].colorCode=tupleToColor(hsvToRGB(_2e*row,_2f*col,this.value));
-}
-this.saved_cells[row][col].style.backgroundColor=this.saved_cells[row][col].colorCode;
-this.saved_cells[row][col].style.borderColor=this.saved_cells[row][col].colorCode;
-}
-}
-var _43=this.saved_cells[_5][_6];
-this.chosenColor.value=_43.colorCode;
-this.backSample.style.backgroundColor=_43.colorCode;
-this.foreSample.style.color=_43.colorCode;
-if((_43.hue>=195&&_43.saturation>0.5)||(_43.hue===0&&_43.saturation===0&&_43.value<0.5)||(_43.hue!==0&&_2d.value<0.75)){
-_43.style.borderColor="#fff";
-}else{
-_43.style.borderColor="#000";
-}
-}
-};
-this.close=function(){
-Xinha._removeEvent(document.body,"mousedown",closeOnBodyClick);
-this.table.style.display="none";
-if(this.is_ie_6){
-if(this.iframe){
-this.iframe.style.display="none";
-}
-}
-};
-};
-Xinha.colorPicker.savedColors=[];
-Xinha.colorPicker.remember=function(_44,_45){
-for(var i=Xinha.colorPicker.savedColors.length;i--;){
-if(Xinha.colorPicker.savedColors[i]==_44){
-return false;
-}
-}
-Xinha.colorPicker.savedColors.splice(0,0,_44);
-Xinha.colorPicker.savedColors=Xinha.colorPicker.savedColors.slice(0,_45);
-var _47=new Date();
-_47.setMonth(_47.getMonth()+1);
-document.cookie="XinhaColorPicker="+escape(Xinha.colorPicker.savedColors.join("-"))+";expires="+_47.toGMTString();
-return true;
-};
-Xinha.colorPicker.loadColors=function(){
-var _48=document.cookie.indexOf("XinhaColorPicker");
-if(_48!=-1){
-var _49=(document.cookie.indexOf("=",_48)+1);
-var end=document.cookie.indexOf(";",_48);
-if(end==-1){
-end=document.cookie.length;
-}
-Xinha.colorPicker.savedColors=unescape(document.cookie.substring(_49,end)).split("-");
-}
-};
-Xinha.colorPicker.InputBinding=function(_4b,_4c){
-var doc=_4b.ownerDocument;
-var _4e=doc.createElement("span");
-_4e.className="buttonColor";
-var _4f=this.chooser=doc.createElement("span");
-_4f.className="chooser";
-if(_4b.value){
-_4f.style.backgroundColor=_4b.value;
-}
-_4f.onmouseover=function(){
-_4f.className="chooser buttonColor-hilite";
-};
-_4f.onmouseout=function(){
-_4f.className="chooser";
-};
-_4f.appendChild(doc.createTextNode(" "));
-_4e.appendChild(_4f);
-var _50=doc.createElement("span");
-_50.className="nocolor";
-_50.onmouseover=function(){
-_50.className="nocolor buttonColor-hilite";
-_50.style.color="#f00";
-};
-_50.onmouseout=function(){
-_50.className="nocolor";
-_50.style.color="#000";
-};
-_50.onclick=function(){
-_4b.value="";
-_4f.style.backgroundColor="";
-};
-_50.appendChild(doc.createTextNode("×"));
-_4e.appendChild(_50);
-_4b.parentNode.insertBefore(_4e,_4b.nextSibling);
-Xinha._addEvent(_4b,"change",function(){
-_4f.style.backgroundColor=this.value;
-});
-_4c=(_4c)?Xinha.cloneObject(_4c):{cellsize:"5px"};
-_4c.callback=(_4c.callback)?_4c.callback:function(_51){
-_4f.style.backgroundColor=_51;
-_4b.value=_51;
-};
-_4f.onclick=function(){
-var _52=new Xinha.colorPicker(_4c);
-_52.open("",_4f,_4b.value);
-};
-Xinha.freeLater(this,"chooser");
-};
-Xinha.colorPicker.InputBinding.prototype.setColor=function(_53){
-this.chooser.style.backgroundColor=_53;
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/ColorPicker/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/ColorPicker/lang/pt_br.js
deleted file mode 100644
index 4b1ea7e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/ColorPicker/lang/pt_br.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// I18N constants
-//
-// LANG: "pt_br", ENCODING: UTF-8
-// Portuguese Brazilian Translation
-//
-// Author: Marcio Barbosa, <marcio@mpg.com.br>
-// MSN: tomarshall@msn.com - ICQ: 69419933
-// Site: http://www.mpg.com.br
-//
-// Last revision: 06 september 2007
-// Please don´t remove this information
-// If you modify any source, please insert a comment with your name and e-mail
-//
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-{
-  "Click a color...": "Selecione uma côr...",
-  "Close": "Fechar",
-  "Color: ": "Côr:",
-  "Sample": "Exemplo",
-  "Web Safe: ": "Web Segura:"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/dialog.html
deleted file mode 100644
index 5c7863d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/dialog.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<h1 id="[h1]"><l10n>Insert/Modify Link</l10n></h1>
-<table border="0" style="margin-top:10px;width: 100%;">
-  <tr>
-    <td class="label"><l10n>URL:</l10n></td>
-    <td style="width: 70%"><input type="text" id="[f_href]" name="[f_href]" style="width: 90%" /></td>
-  </tr>
-  <tr>
-    <td class="label"><l10n>Title (tooltip):</l10n></td>
-    <td><input type="text" id="[f_title]" name="[f_title]" style="width: 90%" /></td>
-  </tr>
-  <tr>
-    <td class="label"><span id="[f_target_label]"><l10n>Target:</l10n></span></td>
-    <td><select id="[f_target]" name="[f_target]">
-      <option value=""><l10n>None (use implicit)</l10n></option>
-      <option value="_blank"><l10n>New window (_blank)</l10n></option>
-      <option value="_self"><l10n>Same frame (_self)</l10n></option>
-      <option value="_top"><l10n>Top frame (_top)</l10n></option>
-      <option value="_other"><l10n>Other</l10n></option>
-    </select>
-    <input type="text" name="[f_other_target]" id="[f_other_target]" size="10" style="visibility: hidden" />
-    </td>
-  </tr>
-</table>
-
-<div class="buttons" id="[buttons]">
-  <input type="button" id="[ok]"     value="_(OK)"     />
-  <input type="button" id="[cancel]" value="_(Cancel)" />
-</div>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/lang/pt_br.js
deleted file mode 100644
index f75cd02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/lang/pt_br.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-//
-// LANG: "pt_br", ENCODING: UTF-8
-// Portuguese Brazilian Translation
-//
-// Author: Marcio Barbosa, <marcio@mpg.com.br>
-// MSN: tomarshall@msn.com - ICQ: 69419933
-// Site: http://www.mpg.com.br
-//
-// Last revision: 06 september 2007
-// Please don´t remove this information
-// If you modify any source, please insert a comment with your name and e-mail
-//
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-{
-  "You need to select some text before creating a link": "Você precisa selecionar um texto antes de criar um link"
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/link.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/link.html
deleted file mode 100644
index adad400..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/link.html
+++ /dev/null
@@ -1,136 +0,0 @@
-<html>
-
-<head>
-  <title>Insert/Modify Link</title>
-  <script type="text/javascript" src="../../popups/popup.js"></script>
-  <link rel="stylesheet" type="text/css" href="../../popups/popup.css" />
-
-  <script type="text/javascript">
-    window.resizeTo(400, 200);
-
-Xinha = window.opener.Xinha;
-
-function i18n(str) {
-  return (Xinha._lc(str, 'Xinha'));
-}
-
-function onTargetChanged() {
-  var f = document.getElementById("f_other_target");
-  if (this.value == "_other") {
-    f.style.visibility = "visible";
-    f.select();
-    f.focus();
-  } else f.style.visibility = "hidden";
-}
-
-function Init() {
-  __dlg_translate('Xinha');
-  __dlg_init();
-
-  // Make sure the translated string appears in the drop down. (for gecko)
-  document.getElementById("f_target").selectedIndex = 1;
-  document.getElementById("f_target").selectedIndex = 0;
-
-  var param = window.dialogArguments;
-  var target_select = document.getElementById("f_target");
-  var use_target = true;
-  if (param) {
-    if ( typeof param["f_usetarget"] != "undefined" ) {
-      use_target = param["f_usetarget"];
-    }
-    if ( typeof param["f_href"] != "undefined" ) {
-      document.getElementById("f_href").value = param["f_href"];
-      document.getElementById("f_title").value = param["f_title"];
-      comboSelectValue(target_select, param["f_target"]);
-      if (target_select.value != param.f_target) {
-        var opt = document.createElement("option");
-        opt.value = param.f_target;
-        opt.innerHTML = opt.value;
-        target_select.appendChild(opt);
-        opt.selected = true;
-      }
-    }
-  }
-  if (! use_target) {
-    document.getElementById("f_target_label").style.visibility = "hidden";
-    document.getElementById("f_target").style.visibility = "hidden";
-    document.getElementById("f_other_target").style.visibility = "hidden";
-  }
-  var opt = document.createElement("option");
-  opt.value = "_other";
-  opt.innerHTML = i18n("Other");
-  target_select.appendChild(opt);
-  target_select.onchange = onTargetChanged;
-  document.getElementById("f_href").focus();
-  document.getElementById("f_href").select();
-}
-
-function onOK() {
-  var required = {
-    // f_href shouldn't be required or otherwise removing the link by entering an empty
-    // url isn't possible anymore.
-    // "f_href": i18n("You must enter the URL where this link points to")
-  };
-  for (var i in required) {
-    var el = document.getElementById(i);
-    if (!el.value) {
-      alert(required[i]);
-      el.focus();
-      return false;
-    }
-  }
-  // pass data back to the calling window
-  var fields = ["f_href", "f_title", "f_target" ];
-  var param = new Object();
-  for (var i in fields) {
-    var id = fields[i];
-    var el = document.getElementById(id);
-    param[id] = el.value;
-  }
-  if (param.f_target == "_other")
-    param.f_target = document.getElementById("f_other_target").value;
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-
-</script>
-
-</head>
-
-<body class="dialog" onload="Init()">
-<div class="title">Insert/Modify Link</div>
-<form>
-<table border="0" style="width: 100%;">
-  <tr>
-    <td class="label">URL:</td>
-    <td><input type="text" id="f_href" style="width: 100%" /></td>
-  </tr>
-  <tr>
-    <td class="label">Title (tooltip):</td>
-    <td><input type="text" id="f_title" style="width: 100%" /></td>
-  </tr>
-  <tr>
-    <td class="label"><span id="f_target_label">Target:</span></td>
-    <td><select id="f_target">
-      <option value="">None (use implicit)</option>
-      <option value="_blank">New window (_blank)</option>
-      <option value="_self">Same frame (_self)</option>
-      <option value="_top">Top frame (_top)</option>
-    </select>
-    <input type="text" name="f_other_target" id="f_other_target" size="10" style="visibility: hidden" />
-    </td>
-  </tr>
-</table>
-
-<div id="buttons">
-  <button type="submit" name="ok" onclick="return onOK();">OK</button>
-  <button type="button" name="cancel" onclick="return onCancel();">Cancel</button>
-</div>
-</form>
-</body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/link.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/link.js
deleted file mode 100644
index fbd334f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/link.js
+++ /dev/null
@@ -1,67 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/CreateLink/link.js */
-function CreateLink(_1){
-this.editor=_1;
-var _2=_1.config;
-var _3=this;
-_1.config.btnList.createlink[3]=function(){
-_3.show(_3._getSelectedAnchor());
-};
-};
-CreateLink._pluginInfo={name:"CreateLink",origin:"Xinha Core",version:"$LastChangedRevision: 1084 $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),developer:"The Xinha Core Developer Team",developer_url:"$HeadURL: http://svn.xinha.org/tags/0.96.1/modules/CreateLink/link.js $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),sponsor:"",sponsor_url:"",license:"htmlArea"};
-CreateLink.prototype._lc=function(_4){
-return Xinha._lc(_4,"Xinha");
-};
-CreateLink.prototype.onGenerateOnce=function(){
-CreateLink.loadAssets();
-};
-CreateLink.loadAssets=function(){
-var _5=CreateLink;
-if(_5.loading){
-return;
-}
-_5.loading=true;
-Xinha._getback(_editor_url+"modules/CreateLink/dialog.html",function(_6){
-_5.html=_6;
-_5.dialogReady=true;
-});
-Xinha._getback(_editor_url+"modules/CreateLink/pluginMethods.js",function(_7){
-eval(_7);
-_5.methodsReady=true;
-});
-};
-CreateLink.prototype.onUpdateToolbar=function(){
-if(!(CreateLink.dialogReady&&CreateLink.methodsReady)){
-this.editor._toolbarObjects.createlink.state("enabled",false);
-}else{
-this.onUpdateToolbar=null;
-}
-};
-CreateLink.prototype.prepareDialog=function(){
-var _8=this;
-var _9=this.editor;
-var _a=this.dialog=new Xinha.Dialog(_9,CreateLink.html,"Xinha",{width:400});
-_a.getElementById("ok").onclick=function(){
-_8.apply();
-};
-_a.getElementById("cancel").onclick=function(){
-_8.dialog.hide();
-};
-if(!_9.config.makeLinkShowsTarget){
-_a.getElementById("f_target_label").style.visibility="hidden";
-_a.getElementById("f_target").style.visibility="hidden";
-_a.getElementById("f_other_target").style.visibility="hidden";
-}
-_a.getElementById("f_target").onchange=function(){
-var f=_a.getElementById("f_other_target");
-if(this.value=="_other"){
-f.style.visibility="visible";
-f.select();
-f.focus();
-}else{
-f.style.visibility="hidden";
-}
-};
-this.dialogReady=true;
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/pluginMethods.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/pluginMethods.js
deleted file mode 100644
index 9303b6d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/CreateLink/pluginMethods.js
+++ /dev/null
@@ -1,109 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/CreateLink/pluginMethods.js */
-CreateLink.prototype.show=function(a){
-if(!this.dialog){
-this.prepareDialog();
-}
-var _2=this.editor;
-this.a=a;
-if(!a&&this.editor.selectionEmpty(this.editor.getSelection())){
-alert(this._lc("You need to select some text before creating a link"));
-return false;
-}
-var _3={f_href:"",f_title:"",f_target:"",f_other_target:""};
-if(a&&a.tagName.toLowerCase()=="a"){
-_3.f_href=this.editor.fixRelativeLinks(a.getAttribute("href"));
-_3.f_title=a.title;
-if(a.target){
-if(!/_self|_top|_blank/.test(a.target)){
-_3.f_target="_other";
-_3.f_other_target=a.target;
-}else{
-_3.f_target=a.target;
-_3.f_other_target="";
-}
-}
-}
-this.dialog.show(_3);
-};
-CreateLink.prototype.apply=function(){
-var _4=this.dialog.hide();
-var a=this.a;
-var _6=this.editor;
-var _7={href:"",target:"",title:""};
-if(_4.f_href){
-_7.href=_4.f_href;
-_7.title=_4.f_title;
-if(_4.f_target.value){
-if(_4.f_target.value=="other"){
-_7.target=_4.f_other_target;
-}else{
-_7.target=_4.f_target.value;
-}
-}
-}
-if(_4.f_target.value){
-if(_4.f_target.value!="_other"){
-_7.target=_4.f_target.value;
-}else{
-_7.target=_4.f_other_target;
-}
-}
-if(a&&a.tagName.toLowerCase()=="a"){
-if(!_7.href){
-if(confirm(this._lc("Are you sure you wish to remove this link?"))){
-var p=a.parentNode;
-while(a.hasChildNodes()){
-p.insertBefore(a.removeChild(a.childNodes[0]),a);
-}
-p.removeChild(a);
-_6.updateToolbar();
-return;
-}
-}else{
-for(var i in _7){
-a.setAttribute(i,_7[i]);
-}
-if(Xinha.is_ie){
-if(/mailto:([^?<>]*)(\?[^<]*)?$/i.test(a.innerHTML)){
-a.innerHTML=RegExp.$1;
-}
-}
-}
-}else{
-if(!_7.href){
-return true;
-}
-var _a=Xinha.uniq("http://www.example.com/Link");
-_6._doc.execCommand("createlink",false,_a);
-var _b=_6._doc.getElementsByTagName("a");
-for(var i=0;i<_b.length;i++){
-var _c=_b[i];
-if(_c.href==_a){
-if(!a){
-a=_c;
-}
-for(var j in _7){
-_c.setAttribute(j,_7[j]);
-}
-}
-}
-}
-_6.selectNodeContents(a);
-_6.updateToolbar();
-};
-CreateLink.prototype._getSelectedAnchor=function(){
-var _e=this.editor.getSelection();
-var _f=this.editor.createRange(_e);
-var a=this.editor.activeElement(_e);
-if(a!=null&&a.tagName.toLowerCase()=="a"){
-return a;
-}else{
-a=this.editor._getFirstAncestor(_e,"a");
-if(a!=null){
-return a;
-}
-}
-return null;
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/DetachedDialog.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/DetachedDialog.js
deleted file mode 100644
index 934c3a8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/DetachedDialog.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/Dialogs/DetachedDialog.js */
-Xinha.DetachedDialog=function(_1,_2,_3,_4){
-var _5={"config":new Xinha.Config(),"scrollPos":Xinha.prototype.scrollPos,"_someEditorHasBeenActivated":false,"saveSelection":function(){
-},"deactivateEditor":function(){
-},"_textArea":document.createElement("textarea"),"_iframe":document.createElement("div"),"_doc":document,"hidePanels":function(){
-},"showPanels":function(){
-},"_isFullScreen":false,"activateEditor":function(){
-},"restoreSelection":function(){
-},"updateToolbar":function(){
-},"focusEditor":function(){
-}};
-Xinha.Dialog.initialZ=100;
-this.attached=false;
-Xinha.DetachedDialog.parentConstructor.call(this,_5,_1,_2,_3,_4);
-};
-Xinha.extend(Xinha.DetachedDialog,Xinha.Dialog);
-Xinha.DetachedDialog.prototype.attachToPanel=function(){
-return false;
-};
-Xinha.DetachedDialog.prototype.detachFromToPanel=function(){
-return false;
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/XinhaDialog.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/XinhaDialog.js
deleted file mode 100644
index 387f2c6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/XinhaDialog.js
+++ /dev/null
@@ -1,916 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/Dialogs/XinhaDialog.js */
-Xinha.Dialog=function(_1,_2,_3,_4,_5){
-var _6=this;
-this.id={};
-this.r_id={};
-this.editor=_1;
-this.document=document;
-this.size=_4;
-this.modal=(_5&&_5.modal===false)?false:true;
-this.closable=(_5&&_5.closable===false)?false:true;
-this.resizable=(_5&&_5.resizable===false)?false:true;
-this.layer=(_5&&_5.layer)?_5.layer:0;
-this.centered=(_5&&_5.centered===true)?true:false;
-this.closeOnEscape=(_5&&_5.closeOnEscape===true)?true:false;
-this.rootElem=null;
-this.captionBar=null;
-this.main=null;
-this.background=null;
-this.centered=null;
-this.greyout=null;
-this.buttons=null;
-this.closer=null;
-this.icon=null;
-this.resizer=null;
-this.initialZ=null;
-var _7=_1.config.dialogOptions;
-if(_7){
-if(typeof _7.centered!="undefined"){
-this.centered=_7.centered;
-}
-if(typeof _7.resizable!="undefined"){
-this.resizable=_7.resizable;
-}
-if(typeof _7.closable!="undefined"){
-this.closable=_7.closable;
-}
-if(typeof _7.greyout!="undefined"){
-this.greyout=_7.greyout;
-}
-if(typeof _7.closeOnEscape!="undefined"){
-this.closeOnEscape=_7.closeOnEscape;
-}
-}
-var _8;
-if(Xinha.is_ie){
-_8=document.createElement("iframe");
-_8.src="about:blank";
-_8.onreadystatechange=function(){
-var _9=window.event.srcElement.contentWindow.document;
-if(this.readyState=="complete"&&_9&&_9.body){
-var _a=_9.createElement("div");
-var _b,_c=document.styleSheets;
-for(var i=0;i<_c.length;i++){
-if(_c[i].id.indexOf("Xinha")!=-1&&_c[i].cssText){
-_b+=_c[i].cssText;
-}
-}
-_a.innerHTML="<br><style type=\"text/css\">\n"+_b+"\n</style>";
-_9.getElementsByTagName("body")[0].appendChild(_a);
-_9.body.className="xinha_dialog_background";
-if(_6.modal){
-_9.body.className+="_modal";
-}
-if(_6.greyout){
-_9.body.className+="_greyout";
-}
-}
-};
-}else{
-_8=document.createElement("div");
-}
-_8.className="xinha_dialog_background";
-if(this.modal){
-_8.className+="_modal";
-}
-if(this.greyout){
-_8.className+="_greyout";
-}
-var z=1000;
-if(!Xinha.Dialog.initialZ){
-var p=_1._htmlArea;
-while(p){
-if(p.style&&parseInt(p.style.zIndex,10)>z){
-z=parseInt(p.style.zIndex,10);
-}
-p=p.parentNode;
-}
-Xinha.Dialog.initialZ=z;
-}
-z=Xinha.Dialog.initialZ;
-var s=_8.style;
-s.position="absolute";
-s.top=0;
-s.left=0;
-s.border="none";
-s.overflow="hidden";
-s.display="none";
-s.zIndex=(this.modal?z+25:z+1)+this.layer;
-document.body.appendChild(_8);
-this.background=_8;
-_8=null;
-Xinha.freeLater(this,"background");
-var _11=document.createElement("div");
-_11.style.position=(Xinha.is_ie||!this.modal)?"absolute":"fixed";
-_11.style.zIndex=(this.modal?z+27:z+3)+this.layer;
-_11.style.display="none";
-if(!this.modal){
-Xinha._addEvent(_11,"mousedown",function(){
-Xinha.Dialog.activateModeless(_6);
-});
-}
-_11.className="dialog"+(this.modal?"":" modeless");
-if(Xinha.is_chrome){
-_11.className+=" chrome";
-}
-document.body.appendChild(_11);
-_11.style.paddingBottom="10px";
-_11.style.width=(_4&&_4.width)?_4.width+"px":"";
-if(_4&&_4.height){
-if(Xinha.ie_version<7){
-_11.style.height=_4.height+"px";
-}else{
-_11.style.minHeight=_4.height+"px";
-}
-}
-_2=this.translateHtml(_2,_3);
-var _12=document.createElement("div");
-_11.appendChild(_12);
-_12.innerHTML=_2;
-this.fixupDOM(_12,_3);
-var _13=_12.removeChild(_12.getElementsByTagName("h1")[0]);
-_11.insertBefore(_13,_12);
-Xinha._addEvent(_13,"mousedown",function(ev){
-_6.dragStart(ev);
-});
-_13.style.MozUserSelect="none";
-_13.style.WebkitUserSelect="none";
-_13.unselectable="on";
-_13.onselectstart=function(){
-return false;
-};
-this.buttons=document.createElement("div");
-s=this.buttons.style;
-s.position="absolute";
-s.top="0";
-s.right="2px";
-_11.appendChild(this.buttons);
-if(this.closable&&this.closeOnEscape){
-Xinha._addEvent(document,"keypress",function(ev){
-if(ev.keyCode==27){
-if(Xinha.Dialog.activeModeless==_6||_6.modal){
-_6.hide();
-return true;
-}
-}
-});
-}
-this.closer=null;
-if(this.closable){
-this.closer=document.createElement("div");
-this.closer.className="closeButton";
-this.closer.onmousedown=function(ev){
-this.className="closeButton buttonClick";
-Xinha._stopEvent(Xinha.getEvent(ev));
-return false;
-};
-this.closer.onmouseout=function(ev){
-this.className="closeButton";
-Xinha._stopEvent(Xinha.getEvent(ev));
-return false;
-};
-this.closer.onmouseup=function(){
-this.className="closeButton";
-_6.hide();
-return false;
-};
-this.buttons.appendChild(this.closer);
-var _18=document.createElement("span");
-_18.className="innerX";
-_18.style.position="relative";
-_18.style.top="-3px";
-_18.appendChild(document.createTextNode("×"));
-this.closer.appendChild(_18);
-_18=null;
-}
-this.icon=document.createElement("img");
-var _19=this.icon;
-_19.className="icon";
-_19.src=_1.config.iconList.dialogCaption;
-_19.style.position="absolute";
-_19.style.top="3px";
-_19.style.left="2px";
-_19.ondrag=function(){
-return false;
-};
-_11.appendChild(this.icon);
-var all=_11.getElementsByTagName("*");
-for(var i=0;i<all.length;i++){
-var el=all[i];
-if(el.tagName.toLowerCase()=="textarea"||el.tagName.toLowerCase()=="input"){
-}else{
-el.unselectable="on";
-}
-}
-this.resizer=null;
-if(this.resizable){
-this.resizer=document.createElement("div");
-this.resizer.className="resizeHandle";
-s=this.resizer.style;
-s.position="absolute";
-s.bottom="0px";
-s.right="0px";
-s.MozUserSelect="none";
-Xinha._addEvent(this.resizer,"mousedown",function(ev){
-_6.resizeStart(ev);
-});
-_11.appendChild(this.resizer);
-}
-this.rootElem=_11;
-this.captionBar=_13;
-this.main=_12;
-_13=null;
-_11=null;
-_12=null;
-Xinha.freeLater(this,"rootElem");
-Xinha.freeLater(this,"captionBar");
-Xinha.freeLater(this,"main");
-Xinha.freeLater(this,"buttons");
-Xinha.freeLater(this,"closer");
-Xinha.freeLater(this,"icon");
-Xinha.freeLater(this,"resizer");
-Xinha.freeLater(this,"document");
-this.size={};
-};
-Xinha.Dialog.prototype.onresize=function(){
-return true;
-};
-Xinha.Dialog.prototype.show=function(_1e){
-var _1f=this.rootElem;
-var _20=_1f.style;
-var _21=this.modal;
-var _22=this.editor.scrollPos();
-this.scrollPos=_22;
-var _23=this;
-if(this.attached){
-this.editor.showPanel(_1f);
-}
-if(Xinha._someEditorHasBeenActivated){
-this._lastRange=this.editor.saveSelection();
-if(Xinha.is_ie&&!_21){
-_23.saveSelection=function(){
-_23._lastRange=_23.editor.saveSelection();
-};
-Xinha._addEvent(this.editor._doc,"mouseup",_23.saveSelection);
-}
-}
-if(_21){
-this.editor.deactivateEditor();
-this.editor.suspendUpdateToolbar=true;
-this.editor.currentModal=_23;
-}
-if(Xinha.is_ff2&&_21){
-this._restoreTo=[this.editor._textArea.style.display,this.editor._iframe.style.visibility,this.editor.hidePanels()];
-this.editor._textArea.style.display="none";
-this.editor._iframe.style.visibility="hidden";
-}
-if(!this.attached){
-if(_21){
-this.showBackground();
-this.posBackground({top:0,left:0});
-this.resizeBackground(Xinha.Dialog.calcFullBgSize());
-}else{
-this.background.style.display="";
-}
-Xinha.Dialog.fadeIn(this.rootElem,100,function(){
-if(_21){
-var _24=_23.rootElem.getElementsByTagName("input");
-for(var i=0;i<_24.length;i++){
-if(_24[i].type=="text"){
-try{
-_24[i].focus();
-break;
-}
-catch(e){
-}
-}
-}
-}
-});
-var _26=_1f.offsetHeight;
-var _27=_1f.offsetWidth;
-var _28=Xinha.viewportSize();
-var _29=_28.y;
-var _2a=_28.x;
-if(_26>_29){
-_20.height=_29+"px";
-if(_1f.scrollHeight>_26){
-_23.main.style.overflowY="auto";
-}
-}
-if(this.size.top&&this.size.left){
-_20.top=parseInt(this.size.top,10)+"px";
-_20.left=parseInt(this.size.left,10)+"px";
-}else{
-if(this.editor.btnClickEvent&&!this.centered){
-var _2b=this.editor.btnClickEvent;
-if(_20.position=="absolute"){
-_20.top=_2b.clientY+this.scrollPos.y+"px";
-}else{
-_20.top=_2b.clientY+"px";
-}
-if(_26+_1f.offsetTop>_29){
-_20.top=(_20.position=="absolute"?this.scrollPos.y:0)+"px";
-}
-if(_20.position=="absolute"){
-_20.left=_2b.clientX+this.scrollPos.x+"px";
-}else{
-_20.left=_2b.clientX+"px";
-}
-if(_27+_1f.offsetLeft>_2a){
-_20.left=_2b.clientX-_27+"px";
-if(_1f.offsetLeft<0){
-_20.left=0;
-}
-}
-this.editor.btnClickEvent=null;
-}else{
-var top=(_29-_26)/2;
-var _2d=(_2a-_27)/2;
-_20.top=((top>0)?top:0)+"px";
-_20.left=((_2d>0)?_2d:0)+"px";
-}
-}
-}
-this.width=_27;
-this.height=_26;
-if(!_21){
-this.resizeBackground({width:_27+"px",height:_26+"px"});
-this.posBackground({top:_20.top,left:_20.left});
-}
-if(typeof _1e!="undefined"){
-this.setValues(_1e);
-}
-this.dialogShown=true;
-};
-Xinha.Dialog.prototype.hide=function(){
-if(this.attached){
-this.editor.hidePanel(this.rootElem);
-}else{
-Xinha.Dialog.fadeOut(this.rootElem);
-this.hideBackground();
-var _2e=this;
-if(Xinha.is_ff2&&this.modal){
-this.editor._textArea.style.display=this._restoreTo[0];
-this.editor._iframe.style.visibility=this._restoreTo[1];
-this.editor.showPanels(this._restoreTo[2]);
-}
-if(!this.editor._isFullScreen&&this.modal){
-window.scroll(this.scrollPos.x,this.scrollPos.y);
-}
-if(Xinha.is_ie&&!this.modal){
-Xinha._removeEvent(this.editor._doc,"mouseup",_2e.saveSelection);
-}
-if(this.modal){
-this.editor.suspendUpdateToolbar=false;
-this.editor.currentModal=null;
-this.editor.activateEditor();
-}
-}
-if(this.modal){
-this.editor.restoreSelection(this._lastRange);
-}
-this.dialogShown=false;
-this.editor.updateToolbar();
-this.editor.focusEditor();
-return this.getValues();
-};
-Xinha.Dialog.prototype.toggle=function(){
-if(this.rootElem.style.display=="none"){
-this.show();
-}else{
-this.hide();
-}
-};
-Xinha.Dialog.prototype.collapse=function(){
-if(this.collapsed){
-this.collapsed=false;
-this.show();
-}else{
-this.main.style.height=0;
-this.collapsed=true;
-}
-};
-Xinha.Dialog.prototype.getElementById=function(id){
-if(!this.rootElem.parentNode){
-this.document.body.appendChild(this.rootElem);
-}
-return this.document.getElementById(this.id[id]?this.id[id]:id);
-};
-Xinha.Dialog.prototype.getElementsByName=function(_30){
-if(!this.rootElem.parentNode){
-this.document.body.appendChild(this.rootElem);
-}
-var els=this.document.getElementsByName(this.id[_30]?this.id[_30]:_30);
-return Xinha.collectionToArray(els);
-};
-Xinha.Dialog.prototype.getElementsByClassName=function(_32){
-return Xinha.getElementsByClassName(this.rootElem,_32);
-};
-Xinha.Dialog.prototype.dragStart=function(ev){
-if(this.attached||this.dragging){
-return;
-}
-if(!this.modal){
-this.posBackground({top:0,left:0});
-this.resizeBackground(Xinha.Dialog.calcFullBgSize());
-this.editor.suspendUpdateToolbar=true;
-}
-ev=Xinha.getEvent(ev);
-var _34=this;
-_34.dragging=true;
-_34.scrollPos=_34.editor.scrollPos();
-var st=_34.rootElem.style;
-_34.xOffs=ev.offsetX||ev.layerX;
-_34.yOffs=ev.offsetY||ev.layerY;
-_34.mouseMove=function(ev){
-_34.dragIt(ev);
-};
-Xinha._addEvent(document,"mousemove",_34.mouseMove);
-if(Xinha.is_ie){
-Xinha._addEvent(this.background.contentWindow.document,"mousemove",_34.mouseMove);
-}
-_34.mouseUp=function(ev){
-_34.dragEnd(ev);
-};
-Xinha._addEvent(document,"mouseup",_34.mouseUp);
-if(Xinha.is_ie){
-Xinha._addEvent(this.background.contentWindow.document,"mouseup",_34.mouseUp);
-}
-};
-Xinha.Dialog.prototype.dragIt=function(ev){
-var _39=this;
-if(!_39.dragging){
-return false;
-}
-var _3a,_3b,_3c;
-if(_39.rootElem.style.position=="absolute"){
-_3a=(ev.clientY+this.scrollPos.y)-_39.yOffs+"px";
-_3b=(ev.clientX+this.scrollPos.x)-_39.xOffs+"px";
-_3c={top:_3a,left:_3b};
-}else{
-if(_39.rootElem.style.position=="fixed"){
-_3a=ev.clientY-_39.yOffs+"px";
-_3b=ev.clientX-_39.xOffs+"px";
-_3c={top:_3a,left:_3b};
-}
-}
-_39.posDialog(_3c);
-};
-Xinha.Dialog.prototype.dragEnd=function(ev){
-var _3e=this;
-if(!this.modal){
-this.editor.suspendUpdateToolbar=false;
-}
-if(!_3e.dragging){
-return false;
-}
-_3e.dragging=false;
-Xinha._removeEvent(document,"mousemove",_3e.mouseMove);
-if(Xinha.is_ie){
-Xinha._removeEvent(this.background.contentWindow.document,"mousemove",_3e.mouseMove);
-}
-Xinha._removeEvent(document,"mouseup",_3e.mouseUp);
-if(Xinha.is_ie){
-Xinha._removeEvent(this.background.contentWindow.document,"mouseup",_3e.mouseUp);
-}
-var _3f=_3e.rootElem.style;
-_3e.size.top=_3f.top;
-_3e.size.left=_3f.left;
-if(!this.modal){
-this.sizeBgToDialog();
-}
-};
-Xinha.Dialog.prototype.resizeStart=function(ev){
-var _41=this;
-if(_41.resizing){
-return;
-}
-_41.resizing=true;
-if(!this.modal){
-this.editor.suspendUpdateToolbar=true;
-this.posBackground({top:0,left:0});
-this.resizeBackground(Xinha.Dialog.calcFullBgSize());
-}
-_41.scrollPos=_41.editor.scrollPos();
-var st=_41.rootElem.style;
-st.minHeight="";
-st.overflow="hidden";
-_41.xOffs=parseInt(st.left,10);
-_41.yOffs=parseInt(st.top,10);
-_41.mouseMove=function(ev){
-_41.resizeIt(ev);
-};
-Xinha._addEvent(document,"mousemove",_41.mouseMove);
-if(Xinha.is_ie){
-Xinha._addEvent(this.background.contentWindow.document,"mousemove",_41.mouseMove);
-}
-_41.mouseUp=function(ev){
-_41.resizeEnd(ev);
-};
-Xinha._addEvent(document,"mouseup",_41.mouseUp);
-if(Xinha.is_ie){
-Xinha._addEvent(this.background.contentWindow.document,"mouseup",_41.mouseUp);
-}
-};
-Xinha.Dialog.prototype.resizeIt=function(ev){
-var _46=this;
-if(!_46.resizing){
-return false;
-}
-var _47,_48;
-if(_46.rootElem.style.position=="absolute"){
-_47=ev.clientY+_46.scrollPos.y;
-_48=ev.clientX+_46.scrollPos.x;
-}else{
-_47=ev.clientY;
-_48=ev.clientX;
-}
-_48-=_46.xOffs;
-_47-=_46.yOffs;
-var _49={};
-_49.width=((_48>10)?_48:10)+8+"px";
-_49.height=((_47>10)?_47:10)+"px";
-_46.sizeDialog(_49);
-_46.width=_46.rootElem.offsetWidth;
-_46.height=_46.rootElem.offsetHeight;
-_46.onresize();
-};
-Xinha.Dialog.prototype.resizeEnd=function(ev){
-var _4b=this;
-_4b.resizing=false;
-if(!this.modal){
-this.editor.suspendUpdateToolbar=false;
-}
-Xinha._removeEvent(document,"mousemove",_4b.mouseMove);
-if(Xinha.is_ie){
-Xinha._removeEvent(this.background.contentWindow.document,"mouseup",_4b.mouseUp);
-}
-Xinha._removeEvent(document,"mouseup",_4b.mouseUp);
-if(Xinha.is_ie){
-Xinha._removeEvent(this.background.contentWindow.document,"mouseup",_4b.mouseUp);
-}
-_4b.size.width=_4b.rootElem.offsetWidth;
-_4b.size.height=_4b.rootElem.offsetHeight;
-if(!this.modal){
-this.sizeBgToDialog();
-}
-};
-Xinha.Dialog.prototype.attachToPanel=function(_4c){
-var _4d=this;
-var _4e=this.rootElem;
-var _4f=this.editor;
-this.attached=true;
-this.rootElem.side=_4c;
-this.captionBar.ondblclick=function(ev){
-_4d.detachFromPanel(Xinha.getEvent(ev));
-};
-_4e.style.position="static";
-_4e.parentNode.removeChild(_4e);
-this.background.style.display="none";
-this.captionBar.style.paddingLeft="3px";
-this.resizer.style.display="none";
-if(this.closable){
-this.closer.style.display="none";
-}
-this.icon.style.display="none";
-if(_4c=="left"||_4c=="right"){
-_4e.style.width=_4f.config.panel_dimensions[_4c];
-}else{
-_4e.style.width="";
-}
-Xinha.addClasses(_4e,"panel");
-_4f._panels[_4c].panels.push(_4e);
-_4f._panels[_4c].div.appendChild(_4e);
-_4f.notifyOf("panel_change",{"action":"add","panel":_4e});
-};
-Xinha.Dialog.prototype.detachFromPanel=function(){
-var _51=this;
-var _52=_51.rootElem;
-var _53=_52.style;
-var _54=_51.editor;
-_51.attached=false;
-var pos=Xinha.getElementTopLeft(_52);
-_53.position="absolute";
-_53.top=pos.top+"px";
-_53.left=pos.left+"px";
-_51.resizer.style.display="";
-if(_51.closable){
-_51.closer.style.display="";
-}
-_51.icon.style.display="";
-if(_51.size.width){
-_52.style.width=_51.size.width+"px";
-}
-Xinha.removeClasses(_52,"panel");
-_54.removePanel(_52);
-document.body.appendChild(_52);
-_51.captionBar.ondblclick=function(){
-_51.attachToPanel(_52.side);
-};
-this.background.style.display="";
-this.sizeBgToDialog();
-};
-Xinha.Dialog.calcFullBgSize=function(){
-var _56=Xinha.pageSize();
-var _57=Xinha.viewportSize();
-return {width:(_56.x>_57.x?_56.x:_57.x)+"px",height:(_56.x>_57.y?_56.y:_57.y)+"px"};
-};
-Xinha.Dialog.prototype.sizeBgToDialog=function(){
-var _58=this.rootElem.style;
-var _59=this.background.style;
-_59.top=_58.top;
-_59.left=_58.left;
-_59.width=_58.width;
-_59.height=_58.height;
-};
-Xinha.Dialog.prototype.hideBackground=function(){
-Xinha.Dialog.fadeOut(this.background);
-};
-Xinha.Dialog.prototype.showBackground=function(){
-Xinha.Dialog.fadeIn(this.background,70);
-};
-Xinha.Dialog.prototype.posBackground=function(pos){
-if(this.background.style.display!="none"){
-this.background.style.top=pos.top;
-this.background.style.left=pos.left;
-}
-};
-Xinha.Dialog.prototype.resizeBackground=function(_5b){
-if(this.background.style.display!="none"){
-this.background.style.width=_5b.width;
-this.background.style.height=_5b.height;
-}
-};
-Xinha.Dialog.prototype.posDialog=function(pos){
-var st=this.rootElem.style;
-st.left=pos.left;
-st.top=pos.top;
-};
-Xinha.Dialog.prototype.sizeDialog=function(_5e){
-var st=this.rootElem.style;
-st.height=_5e.height;
-st.width=_5e.width;
-var _60=parseInt(_5e.width,10);
-var _61=parseInt(_5e.height,10)-this.captionBar.offsetHeight;
-this.main.style.height=(_61>20)?_61:20+"px";
-this.main.style.width=(_60>10)?_60:10+"px";
-};
-Xinha.Dialog.prototype.setValues=function(_62){
-for(var i in _62){
-if(typeof i=="string"){
-var _64=this.getElementsByName(i);
-if(!_64){
-continue;
-}
-for(var x=0;x<_64.length;x++){
-var e=_64[x];
-switch(e.tagName.toLowerCase()){
-case "select":
-for(var j=0;j<e.options.length;j++){
-if(typeof _62[i]=="object"){
-for(var k=0;k<_62[i].length;k++){
-if(_62[i][k]==e.options[j].value){
-e.options[j].selected=true;
-}
-}
-}else{
-if(_62[i]==e.options[j].value){
-e.options[j].selected=true;
-}
-}
-}
-break;
-case "textarea":
-case "input":
-switch(e.getAttribute("type")){
-case "radio":
-if(e.value==_62[i]){
-e.checked=true;
-}
-break;
-case "checkbox":
-if(typeof _62[i]=="object"){
-for(j in _62[i]){
-if(_62[i][j]==e.value){
-e.checked=true;
-}
-}
-}else{
-if(_62[i]==e.value){
-e.checked=true;
-}
-}
-break;
-default:
-e.value=_62[i];
-break;
-}
-}
-}
-}
-}
-};
-Xinha.Dialog.prototype.getValues=function(){
-var _69=[];
-var _6a=Xinha.collectionToArray(this.rootElem.getElementsByTagName("input")).append(Xinha.collectionToArray(this.rootElem.getElementsByTagName("textarea"))).append(Xinha.collectionToArray(this.rootElem.getElementsByTagName("select")));
-for(var x=0;x<_6a.length;x++){
-var i=_6a[x];
-if(!(i.name&&this.r_id[i.name])){
-continue;
-}
-if(typeof _69[this.r_id[i.name]]=="undefined"){
-_69[this.r_id[i.name]]=null;
-}
-var v=_69[this.r_id[i.name]];
-switch(i.tagName.toLowerCase()){
-case "select":
-if(i.multiple){
-if(!v.push){
-if(v!==null){
-v=[v];
-}else{
-v=[];
-}
-}
-for(var j=0;j<i.options.length;j++){
-if(i.options[j].selected){
-v.push(i.options[j].value);
-}
-}
-}else{
-if(i.selectedIndex>=0){
-v=i.options[i.selectedIndex];
-}
-}
-break;
-default:
-switch(i.type.toLowerCase()){
-case "radio":
-if(i.checked){
-v=i.value;
-}
-break;
-case "checkbox":
-if(v===null){
-if(this.getElementsByName(this.r_id[i.name]).length>1){
-v=[];
-}
-}
-if(i.checked){
-if(v!==null&&typeof v=="object"&&v.push){
-v.push(i.value);
-}else{
-v=i.value;
-}
-}
-break;
-default:
-v=i.value;
-break;
-}
-}
-_69[this.r_id[i.name]]=v;
-}
-return _69;
-};
-Xinha.Dialog.prototype.setLocalizer=function(_6f){
-var _70=this;
-if(typeof _6f=="function"){
-_70._lc=_6f;
-}else{
-if(_6f){
-this._lc=function(_71){
-return Xinha._lc(_71,_6f);
-};
-}else{
-this._lc=function(_72){
-return _72;
-};
-}
-}
-};
-Xinha.Dialog.prototype.translateHtml=function(_73,_74){
-var _75=this;
-if(_74){
-this.setLocalizer(_74);
-}
-_73=_73.replace(/((?:name)|(?:id))=(['"])\[([a-z0-9_]+)\]\2/ig,function(_76,_77,_78,id){
-return _77+"="+_78+_75.createId(id)+_78;
-}).replace(/<l10n>(.*?)<\/l10n>/ig,function(_7a,_7b){
-return _75._lc(_7b);
-}).replace(/\="_\((.*?)\)"/g,function(_7c,_7d){
-return "=\""+_75._lc(_7d)+"\"";
-});
-return _73;
-};
-Xinha.Dialog.prototype.fixupDOM=function(_7e,_7f){
-var _80=this;
-if(typeof _7f!="string"){
-_7f="GenericPlugin";
-}
-var _81=function(_82,_83){
-switch(_83){
-case "editor":
-return _editor_url;
-case "plugin":
-return Xinha.getPluginDir(_7f);
-case "images":
-return _80.editor.imgURL("images");
-}
-};
-var _84=Xinha.collectionToArray(_7e.getElementsByTagName("img"));
-for(var _85=0;_85<_84.length;++_85){
-var _86=_84[_85];
-var _87=_86.getAttribute("src");
-if(_87){
-var _88=_87.replace(/^\[(editor|plugin|images)\]/,_81);
-if(_88!=_87){
-_86.setAttribute("src",_88);
-}
-}
-}
-var _89=Xinha.collectionToArray(_7e.getElementsByTagName("a"));
-for(var _85=0;_85<_89.length;++_85){
-var _8a=_89[_85];
-var _87=_8a.getAttribute("href");
-if(_87){
-var _88=_87.replace(/^\[(editor|plugin|images)\]/,_81);
-if(_88!=_87){
-_8a.setAttribute("href",_88);
-}
-}
-}
-};
-Xinha.Dialog.prototype.createId=function(id){
-var _8c=this;
-if(typeof _8c.id[id]=="undefined"){
-_8c.id[id]=Xinha.uniq("Dialog");
-_8c.r_id[_8c.id[id]]=id;
-}
-return _8c.id[id];
-};
-Xinha.Dialog.activateModeless=function(_8d){
-if(Xinha.Dialog.activeModeless==_8d||_8d.attached){
-return;
-}
-if(Xinha.Dialog.activeModeless){
-Xinha.Dialog.activeModeless.rootElem.style.zIndex=parseInt(Xinha.Dialog.activeModeless.rootElem.style.zIndex,10)-10;
-}
-Xinha.Dialog.activeModeless=_8d;
-Xinha.Dialog.activeModeless.rootElem.style.zIndex=parseInt(Xinha.Dialog.activeModeless.rootElem.style.zIndex,10)+10;
-};
-Xinha.Dialog.setOpacity=function(el,_8f){
-if(typeof el.style.filter!="undefined"){
-el.style.filter=(_8f<100)?"alpha(opacity="+_8f+")":"";
-}else{
-el.style.opacity=_8f/100;
-}
-};
-Xinha.Dialog.fadeIn=function(el,_91,_92,_93,_94){
-_93=_93||1;
-_94=_94||25;
-_91=_91||100;
-el.op=el.op||0;
-var op=el.op;
-if(el.style.display=="none"){
-Xinha.Dialog.setOpacity(el,0);
-el.style.display="";
-}
-if(op<_91){
-el.op+=_94;
-Xinha.Dialog.setOpacity(el,op);
-el.timeOut=setTimeout(function(){
-Xinha.Dialog.fadeIn(el,_91,_92,_93,_94);
-},_93);
-}else{
-Xinha.Dialog.setOpacity(el,_91);
-el.op=_91;
-el.timeOut=null;
-if(typeof _92=="function"){
-_92.call();
-}
-}
-};
-Xinha.Dialog.fadeOut=function(el,_97,_98){
-_97=_97||1;
-_98=_98||30;
-if(typeof el.op=="undefined"){
-el.op=100;
-}
-var op=el.op;
-if(op>=0){
-el.op-=_98;
-Xinha.Dialog.setOpacity(el,op);
-el.timeOut=setTimeout(function(){
-Xinha.Dialog.fadeOut(el,_97,_98);
-},_97);
-}else{
-Xinha.Dialog.setOpacity(el,0);
-el.style.display="none";
-el.op=0;
-el.timeOut=null;
-}
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/dialog.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/dialog.js
deleted file mode 100644
index 41f4a4a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/dialog.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/Dialogs/dialog.js */
-function Dialog(_1,_2,_3){
-if(typeof _3=="undefined"){
-_3=window;
-}
-if(typeof window.showModalDialog=="function"&&!Xinha.is_webkit){
-Dialog._return=function(_4){
-if(typeof _2=="function"){
-_2(_4);
-}
-};
-var r=window.showModalDialog(_1,_3,"dialogheight=300;dialogwidth=400;resizable=yes");
-}else{
-Dialog._geckoOpenModal(_1,_2,_3);
-}
-};
-Dialog._parentEvent=function(ev){
-setTimeout(function(){
-if(Dialog._modal&&!Dialog._modal.closed){
-Dialog._modal.focus();
-}
-},50);
-try{
-if(Dialog._modal&&!Dialog._modal.closed){
-Xinha._stopEvent(ev);
-}
-}
-catch(e){
-}
-};
-Dialog._return=null;
-Dialog._modal=null;
-Dialog._arguments=null;
-Dialog._selection=null;
-Dialog._geckoOpenModal=function(_7,_8,_9){
-var _a=window.open(_7,"hadialog","toolbar=no,menubar=no,personalbar=no,width=10,height=10,"+"scrollbars=no,resizable=yes,modal=yes,dependable=yes");
-Dialog._modal=_a;
-Dialog._arguments=_9;
-function capwin(w){
-Xinha._addEvent(w,"click",Dialog._parentEvent);
-Xinha._addEvent(w,"mousedown",Dialog._parentEvent);
-Xinha._addEvent(w,"focus",Dialog._parentEvent);
-};
-function relwin(w){
-Xinha._removeEvent(w,"click",Dialog._parentEvent);
-Xinha._removeEvent(w,"mousedown",Dialog._parentEvent);
-Xinha._removeEvent(w,"focus",Dialog._parentEvent);
-};
-capwin(window);
-for(var i=0;i<window.frames.length;i++){
-try{
-capwin(window.frames[i]);
-}
-catch(e){
-}
-}
-Dialog._return=function(_e){
-if(_e&&_8){
-_8(_e);
-}
-relwin(window);
-for(var i=0;i<window.frames.length;i++){
-try{
-relwin(window.frames[i]);
-}
-catch(e){
-}
-}
-Dialog._modal=null;
-};
-Dialog._modal.focus();
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/div-dialog.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/div-dialog.js
deleted file mode 100644
index 1456834..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/div-dialog.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/Dialogs/div-dialog.js */
-Xinha.DivDialog=function(_1,_2,_3){
-this.id={};
-this.r_id={};
-this.document=document;
-this.rootElem=_1;
-this.rootElem.className+=" dialog";
-this.rootElem.style.display="none";
-this.width=this.rootElem.offsetWidth+"px";
-this.height=this.rootElem.offsetHeight+"px";
-this.setLocalizer(_3);
-this.rootElem.innerHTML=this.translateHtml(_2);
-};
-Xinha.extend(Xinha.DivDialog,Xinha.Dialog);
-Xinha.DivDialog.prototype.show=function(_4){
-if(typeof _4!="undefined"){
-this.setValues(_4);
-}
-this.rootElem.style.display="";
-};
-Xinha.DivDialog.prototype.hide=function(){
-this.rootElem.style.display="none";
-return this.getValues();
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/panel-dialog.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/panel-dialog.js
deleted file mode 100644
index 3655e6c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/panel-dialog.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/Dialogs/panel-dialog.js */
-Xinha.PanelDialog=function(_1,_2,_3,_4){
-this.id={};
-this.r_id={};
-this.editor=_1;
-this.document=document;
-this.rootElem=_1.addPanel(_2);
-var _5=this;
-if(typeof _4=="function"){
-this._lc=_4;
-}else{
-if(_4){
-this._lc=function(_6){
-return Xinha._lc(_6,_4);
-};
-}else{
-this._lc=function(_7){
-return _7;
-};
-}
-}
-_3=_3.replace(/\[([a-z0-9_]+)\]/ig,function(_8,id){
-if(typeof _5.id[id]=="undefined"){
-_5.id[id]=Xinha.uniq("Dialog");
-_5.r_id[_5.id[id]]=id;
-}
-return _5.id[id];
-}).replace(/<l10n>(.*?)<\/l10n>/ig,function(_a,_b){
-return _5._lc(_b);
-}).replace(/="_\((.*?)\)"/g,function(_c,_d){
-return "=\""+_5._lc(_d)+"\"";
-});
-this.rootElem.innerHTML=_3;
-};
-Xinha.PanelDialog.prototype.show=function(_e){
-this.setValues(_e);
-this.editor.showPanel(this.rootElem);
-};
-Xinha.PanelDialog.prototype.hide=function(){
-this.editor.hidePanel(this.rootElem);
-return this.getValues();
-};
-Xinha.PanelDialog.prototype.onresize=Xinha.Dialog.prototype.onresize;
-Xinha.PanelDialog.prototype.toggle=Xinha.Dialog.prototype.toggle;
-Xinha.PanelDialog.prototype.setValues=Xinha.Dialog.prototype.setValues;
-Xinha.PanelDialog.prototype.getValues=Xinha.Dialog.prototype.getValues;
-Xinha.PanelDialog.prototype.getElementById=Xinha.Dialog.prototype.getElementById;
-Xinha.PanelDialog.prototype.getElementsByName=Xinha.Dialog.prototype.getElementsByName;
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/popupwin.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/popupwin.js
deleted file mode 100644
index 16fa407..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Dialogs/popupwin.js
+++ /dev/null
@@ -1,122 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/Dialogs/popupwin.js */
-function PopupWin(_1,_2,_3,_4){
-this.editor=_1;
-this.handler=_3;
-var _5=window.open("","__ha_dialog","toolbar=no,menubar=no,personalbar=no,width=600,height=600,left=20,top=40,scrollbars=no,resizable=yes");
-this.window=_5;
-var _6=_5.document;
-this.doc=_6;
-var _7=this;
-var _8=document.baseURI||document.URL;
-if(_8&&_8.match(/(.*)\/([^\/]+)/)){
-_8=RegExp.$1+"/";
-}
-if(typeof _editor_url!="undefined"&&!(/^\//.test(_editor_url))&&!(/http:\/\//.test(_editor_url))){
-_8+=_editor_url;
-}else{
-_8=_editor_url;
-}
-if(!(/\/$/.test(_8))){
-_8+="/";
-}
-this.baseURL=_8;
-_6.open();
-var _9="<html><head><title>"+_2+"</title>\n";
-_9+="<style type=\"text/css\">@import url("+_editor_url+"Xinha.css);</style>\n";
-if(_editor_skin!=""){
-_9+="<style type=\"text/css\">@import url("+_editor_url+"skins/"+_editor_skin+"/skin.css);</style>\n";
-}
-_9+="</head>\n";
-_9+="<body class=\"dialog popupwin\" id=\"--HA-body\"></body></html>";
-_6.write(_9);
-_6.close();
-function init2(){
-var _a=_6.body;
-if(!_a){
-setTimeout(init2,25);
-return false;
-}
-_5.title=_2;
-_6.documentElement.style.padding="0px";
-_6.documentElement.style.margin="0px";
-var _b=_6.createElement("div");
-_b.className="content";
-_7.content=_b;
-_a.appendChild(_b);
-_7.element=_a;
-_4(_7);
-_5.focus();
-};
-init2();
-};
-PopupWin.prototype.callHandler=function(){
-var _c=["input","textarea","select"];
-var _d={};
-for(var ti=_c.length;--ti>=0;){
-var _f=_c[ti];
-var els=this.content.getElementsByTagName(_f);
-for(var j=0;j<els.length;++j){
-var el=els[j];
-var val=el.value;
-if(el.tagName.toLowerCase()=="input"){
-if(el.type=="checkbox"){
-val=el.checked;
-}
-}
-_d[el.name]=val;
-}
-}
-this.handler(this,_d);
-return false;
-};
-PopupWin.prototype.close=function(){
-this.window.close();
-};
-PopupWin.prototype.addButtons=function(){
-var _14=this;
-var div=this.doc.createElement("div");
-this.content.appendChild(div);
-div.id="buttons";
-div.className="buttons";
-for(var i=0;i<arguments.length;++i){
-var btn=arguments[i];
-var _18=this.doc.createElement("button");
-div.appendChild(_18);
-_18.innerHTML=Xinha._lc(btn,"Xinha");
-switch(btn.toLowerCase()){
-case "ok":
-Xinha.addDom0Event(_18,"click",function(){
-_14.callHandler();
-_14.close();
-return false;
-});
-break;
-case "cancel":
-Xinha.addDom0Event(_18,"click",function(){
-_14.close();
-return false;
-});
-break;
-}
-}
-};
-PopupWin.prototype.showAtElement=function(){
-var _19=this;
-setTimeout(function(){
-var w=_19.content.offsetWidth+4;
-var h=_19.content.offsetHeight+4;
-var el=_19.content;
-var s=el.style;
-s.position="absolute";
-s.left=parseInt((w-el.offsetWidth)/2,10)+"px";
-s.top=parseInt((h-el.offsetHeight)/2,10)+"px";
-if(Xinha.is_gecko){
-_19.window.innerWidth=w;
-_19.window.innerHeight=h;
-}else{
-_19.window.resizeTo(w+8,h+70);
-}
-},25);
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/full-screen.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/full-screen.js
deleted file mode 100644
index 187e17d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/full-screen.js
+++ /dev/null
@@ -1,154 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/FullScreen/full-screen.js */
-function FullScreen(_1,_2){
-this.editor=_1;
-this.originalSizes=null;
-_1._superclean_on=false;
-var _3=_1.config;
-_3.registerIcon("fullscreen",[_editor_url+_3.imgURL+"ed_buttons_main.png",8,0]);
-_3.registerIcon("fullscreenrestore",[_editor_url+_3.imgURL+"ed_buttons_main.png",9,0]);
-_3.registerButton("fullscreen",this._lc("Maximize/Minimize Editor"),_3.iconList.fullscreen,true,function(e,_5,_6){
-e._fullScreen();
-});
-_3.addToolbarElement("fullscreen","popupeditor",0);
-};
-FullScreen._pluginInfo={name:"FullScreen",version:"1.0",developer:"James Sleeman",developer_url:"http://www.gogo.co.nz/",c_owner:"Gogo Internet Services",license:"htmlArea",sponsor:"Gogo Internet Services",sponsor_url:"http://www.gogo.co.nz/"};
-FullScreen.prototype._lc=function(_7){
-return Xinha._lc(_7,{url:_editor_url+"modules/FullScreen/lang/",context:"FullScreen"});
-};
-Xinha.prototype._fullScreen=function(){
-var e=this;
-var _9=e.config;
-function sizeItUp(){
-if(!e._isFullScreen||e._sizing){
-return false;
-}
-e._sizing=true;
-var _a=Xinha.viewportSize();
-if(e.config.fullScreenSizeDownMethod=="restore"){
-e.originalSizes={x:parseInt(e._htmlArea.style.width),y:parseInt(e._htmlArea.style.height),dim:_a};
-}
-var h=_a.y-e.config.fullScreenMargins[0]-e.config.fullScreenMargins[2];
-var w=_a.x-e.config.fullScreenMargins[1]-e.config.fullScreenMargins[3];
-e.sizeEditor(w+"px",h+"px",true,true);
-e._sizing=false;
-if(e._toolbarObjects.fullscreen){
-e._toolbarObjects.fullscreen.swapImage(_9.iconList.fullscreenrestore);
-}
-};
-function sizeItDown(){
-if(e._isFullScreen||e._sizing){
-return false;
-}
-e._sizing=true;
-if(e.originalSizes!=null){
-var os=e.originalSizes;
-var _e=Xinha.viewportSize();
-var nW=os.x+(_e.x-os.dim.x);
-var nH=os.y+(_e.y-os.dim.y);
-e.sizeEditor(nW+"px",nH+"px",e.config.sizeIncludesBars,e.config.sizeIncludesPanels);
-e.originalSizes=null;
-}else{
-e.initSize();
-}
-e._sizing=false;
-if(e._toolbarObjects.fullscreen){
-e._toolbarObjects.fullscreen.swapImage(_9.iconList.fullscreen);
-}
-};
-function resetScroll(){
-if(e._isFullScreen){
-window.scroll(0,0);
-window.setTimeout(resetScroll,150);
-}
-};
-if(typeof this._isFullScreen=="undefined"){
-this._isFullScreen=false;
-if(e.target!=e._iframe){
-Xinha._addEvent(window,"resize",sizeItUp);
-}
-}
-if(Xinha.is_gecko){
-this.deactivateEditor();
-}
-if(this._isFullScreen){
-this._htmlArea.style.position="";
-if(!Xinha.is_ie){
-this._htmlArea.style.border="";
-}
-try{
-if(Xinha.is_ie&&document.compatMode=="CSS1Compat"){
-var bod=document.getElementsByTagName("html");
-}else{
-var bod=document.getElementsByTagName("body");
-}
-bod[0].style.overflow="";
-}
-catch(e){
-}
-this._isFullScreen=false;
-sizeItDown();
-var _12=this._htmlArea;
-while((_12=_12.parentNode)&&_12.style){
-_12.style.position=_12._xinha_fullScreenOldPosition;
-_12._xinha_fullScreenOldPosition=null;
-}
-if(Xinha.ie_version<7){
-var _13=document.getElementsByTagName("select");
-for(var i=0;i<_13.length;++i){
-_13[i].style.visibility="visible";
-}
-}
-window.scroll(this._unScroll.x,this._unScroll.y);
-}else{
-this._unScroll={x:(window.pageXOffset)?(window.pageXOffset):(document.documentElement)?document.documentElement.scrollLeft:document.body.scrollLeft,y:(window.pageYOffset)?(window.pageYOffset):(document.documentElement)?document.documentElement.scrollTop:document.body.scrollTop};
-var _12=this._htmlArea;
-while((_12=_12.parentNode)&&_12.style){
-_12._xinha_fullScreenOldPosition=_12.style.position;
-_12.style.position="static";
-}
-if(Xinha.ie_version<7){
-var _13=document.getElementsByTagName("select");
-var s,_16;
-for(var i=0;i<_13.length;++i){
-s=_13[i];
-_16=false;
-while(s=s.parentNode){
-if(s==this._htmlArea){
-_16=true;
-break;
-}
-}
-if(!_16&&_13[i].style.visibility!="hidden"){
-_13[i].style.visibility="hidden";
-}
-}
-}
-window.scroll(0,0);
-this._htmlArea.style.position="absolute";
-this._htmlArea.style.zIndex=999;
-this._htmlArea.style.left=e.config.fullScreenMargins[3]+"px";
-this._htmlArea.style.top=e.config.fullScreenMargins[0]+"px";
-if(!Xinha.is_ie&&!Xinha.is_webkit){
-this._htmlArea.style.border="none";
-}
-this._isFullScreen=true;
-resetScroll();
-try{
-if(Xinha.is_ie&&document.compatMode=="CSS1Compat"){
-var bod=document.getElementsByTagName("html");
-}else{
-var bod=document.getElementsByTagName("body");
-}
-bod[0].style.overflow="hidden";
-}
-catch(e){
-}
-sizeItUp();
-}
-if(Xinha.is_gecko){
-this.activateEditor();
-}
-this.focusEditor();
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/de.js
deleted file mode 100644
index 72ff5a3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/de.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-// translated: Raimund Meyer xinha@ray-of-light.org
-{
-  "Maximize/Minimize Editor": "Editor maximieren/verkleinern"
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/es.js
deleted file mode 100644
index 9303b69..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/es.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-// translated: Derick Leony <dleony@gmail.com>
-{
-  "Maximize/Minimize Editor": "Maximizar/Minimizar Editor"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/fr.js
deleted file mode 100644
index af4b014..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/fr.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-{
-  "Maximize/Minimize Editor": "Agrandir/Réduire l'éditeur"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/ja.js
deleted file mode 100644
index f10c4da..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/ja.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-{
-  "Maximize/Minimize Editor": "エディタの最大化/最小化"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/nb.js
deleted file mode 100644
index aba7c2b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/nb.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-// translated: Kim Steinhaug, http://www.steinhaug.com/, kim@steinhaug.com
-{
-  "Maximize/Minimize Editor": "Maksimer/Minimer WYSIWYG vindu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/nl.js
deleted file mode 100644
index 4fcdc3f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/nl.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-// translated: Arthur Bogaart a.bogaart@onehippo.org
-{
-  "Maximize/Minimize Editor": "Editor maximaliseren/verkleinen"
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/pl.js
deleted file mode 100644
index 0c639bb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/pl.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-// translated: Krzysztof Kotowicz, koto1sa@o2.pl, http://www.eskot.krakow.pl/portfolio
-{
-  "Maximize/Minimize Editor": "Maksymalizuj/minimalizuj edytor"
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/pt_br.js
deleted file mode 100644
index 06e4812..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/pt_br.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-//
-// LANG: "pt_br", ENCODING: UTF-8
-// Portuguese Brazilian Translation
-//
-// Author: Marcio Barbosa, <marcio@mpg.com.br>
-// MSN: tomarshall@msn.com - ICQ: 69419933
-// Site: http://www.mpg.com.br
-//
-// Last revision: 06 september 2007
-// Please don´t remove this information
-// If you modify any source, please insert a comment with your name and e-mail
-//
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-{
-  "Maximize/Minimize Editor": "Maximizar/Minimizar Editor"
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/ru.js
deleted file mode 100644
index b2248ef..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/ru.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// I18N constants

-// LANG: "ru", ENCODING: UTF-8

-// Author: Andrei Blagorazumov, a@fnr.ru

-{

-  "Maximize/Minimize Editor": "Развернуть/Свернуть редактор"

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/sv.js
deleted file mode 100755
index c27fee5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/FullScreen/lang/sv.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// I18N constants
-// LANG: "sv" (Swedish), ENCODING: UTF-8
-// translated: Erik Dalén, <dalen@jpl.se>
-{
-  "Maximize/Minimize Editor": "Maximera/Minimera WYSIWYG fönster"
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Gecko/Gecko.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Gecko/Gecko.js
deleted file mode 100644
index 45237c4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Gecko/Gecko.js
+++ /dev/null
@@ -1,471 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/Gecko/Gecko.js */
-Gecko._pluginInfo={name:"Gecko",origin:"Xinha Core",version:"$LastChangedRevision: 1084 $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),developer:"The Xinha Core Developer Team",developer_url:"$HeadURL: http://svn.xinha.org/tags/0.96.1/modules/Gecko/Gecko.js $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),sponsor:"",sponsor_url:"",license:"htmlArea"};
-function Gecko(_1){
-this.editor=_1;
-_1.Gecko=this;
-};
-Gecko.prototype.onKeyPress=function(ev){
-var _3=this.editor;
-var s=_3.getSelection();
-if(_3.isShortCut(ev)){
-switch(_3.getKey(ev).toLowerCase()){
-case "z":
-if(_3._unLink&&_3._unlinkOnUndo){
-Xinha._stopEvent(ev);
-_3._unLink();
-_3.updateToolbar();
-return true;
-}
-break;
-case "a":
-sel=_3.getSelection();
-sel.removeAllRanges();
-range=_3.createRange();
-range.selectNodeContents(_3._doc.body);
-sel.addRange(range);
-Xinha._stopEvent(ev);
-return true;
-break;
-case "v":
-if(!_3.config.htmlareaPaste){
-return true;
-}
-break;
-}
-}
-switch(_3.getKey(ev)){
-case " ":
-var _5=function(_6,_7){
-var _8=_6.nextSibling;
-if(typeof _7=="string"){
-_7=_3._doc.createElement(_7);
-}
-var a=_6.parentNode.insertBefore(_7,_8);
-Xinha.removeFromParent(_6);
-a.appendChild(_6);
-_8.data=" "+_8.data;
-s.collapse(_8,1);
-_3._unLink=function(){
-var t=a.firstChild;
-a.removeChild(t);
-a.parentNode.insertBefore(t,a);
-Xinha.removeFromParent(a);
-_3._unLink=null;
-_3._unlinkOnUndo=false;
-};
-_3._unlinkOnUndo=true;
-return a;
-};
-if(_3.config.convertUrlsToLinks&&s&&s.isCollapsed&&s.anchorNode.nodeType==3&&s.anchorNode.data.length>3&&s.anchorNode.data.indexOf(".")>=0){
-var _b=s.anchorNode.data.substring(0,s.anchorOffset).search(/\S{4,}$/);
-if(_b==-1){
-break;
-}
-if(_3._getFirstAncestor(s,"a")){
-break;
-}
-var _c=s.anchorNode.data.substring(0,s.anchorOffset).replace(/^.*?(\S*)$/,"$1");
-var _d=_c.match(Xinha.RE_email);
-if(_d){
-var _e=s.anchorNode;
-var _f=_e.splitText(s.anchorOffset);
-var _10=_e.splitText(_b);
-_5(_10,"a").href="mailto:"+_d[0];
-break;
-}
-RE_date=/([0-9]+\.)+/;
-RE_ip=/(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/;
-var _11=_c.match(Xinha.RE_url);
-if(_11){
-if(RE_date.test(_c)){
-break;
-}
-var _12=s.anchorNode;
-var _13=_12.splitText(s.anchorOffset);
-var _14=_12.splitText(_b);
-_5(_14,"a").href=(_11[1]?_11[1]:"http://")+_11[2];
-break;
-}
-}
-break;
-}
-switch(ev.keyCode){
-case 27:
-if(_3._unLink){
-_3._unLink();
-Xinha._stopEvent(ev);
-}
-break;
-break;
-case 8:
-case 46:
-if(!ev.shiftKey&&this.handleBackspace()){
-Xinha._stopEvent(ev);
-}
-default:
-_3._unlinkOnUndo=false;
-if(s.anchorNode&&s.anchorNode.nodeType==3){
-var a=_3._getFirstAncestor(s,"a");
-if(!a){
-break;
-}
-if(!a._updateAnchTimeout){
-if(s.anchorNode.data.match(Xinha.RE_email)&&a.href.match("mailto:"+s.anchorNode.data.trim())){
-var _16=s.anchorNode;
-var _17=function(){
-a.href="mailto:"+_16.data.trim();
-a._updateAnchTimeout=setTimeout(_17,250);
-};
-a._updateAnchTimeout=setTimeout(_17,1000);
-break;
-}
-var m=s.anchorNode.data.match(Xinha.RE_url);
-if(m&&a.href.match(new RegExp("http(s)?://"+Xinha.escapeStringForRegExp(s.anchorNode.data.trim())))){
-var _19=s.anchorNode;
-var _1a=function(){
-m=_19.data.match(Xinha.RE_url);
-if(m){
-a.href=(m[1]?m[1]:"http://")+m[2];
-}
-a._updateAnchTimeout=setTimeout(_1a,250);
-};
-a._updateAnchTimeout=setTimeout(_1a,1000);
-}
-}
-}
-break;
-}
-return false;
-};
-Gecko.prototype.handleBackspace=function(){
-var _1b=this.editor;
-setTimeout(function(){
-var sel=_1b.getSelection();
-var _1d=_1b.createRange(sel);
-var SC=_1d.startContainer;
-var SO=_1d.startOffset;
-var EC=_1d.endContainer;
-var EO=_1d.endOffset;
-var _22=SC.nextSibling;
-if(SC.nodeType==3){
-SC=SC.parentNode;
-}
-if(!(/\S/.test(SC.tagName))){
-var p=document.createElement("p");
-while(SC.firstChild){
-p.appendChild(SC.firstChild);
-}
-SC.parentNode.insertBefore(p,SC);
-Xinha.removeFromParent(SC);
-var r=_1d.cloneRange();
-r.setStartBefore(_22);
-r.setEndAfter(_22);
-r.extractContents();
-sel.removeAllRanges();
-sel.addRange(r);
-}
-},10);
-};
-Gecko.prototype.inwardHtml=function(_25){
-_25=_25.replace(/<(\/?)strong(\s|>|\/)/ig,"<$1b$2");
-_25=_25.replace(/<(\/?)em(\s|>|\/)/ig,"<$1i$2");
-_25=_25.replace(/<(\/?)del(\s|>|\/)/ig,"<$1strike$2");
-return _25;
-};
-Gecko.prototype.outwardHtml=function(_26){
-_26=_26.replace(/<script[\s]*src[\s]*=[\s]*['"]chrome:\/\/.*?["']>[\s]*<\/script>/ig,"");
-return _26;
-};
-Gecko.prototype.onExecCommand=function(_27,UI,_29){
-try{
-this.editor._doc.execCommand("useCSS",false,true);
-this.editor._doc.execCommand("styleWithCSS",false,false);
-}
-catch(ex){
-}
-switch(_27){
-case "paste":
-alert(Xinha._lc("The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly."));
-return true;
-break;
-case "removeformat":
-var _2a=this.editor;
-var sel=_2a.getSelection();
-var _2c=_2a.saveSelection(sel);
-var _2d=_2a.createRange(sel);
-var els=_2a._doc.body.getElementsByTagName("*");
-var _2f=(_2d.startContainer.nodeType==1)?_2d.startContainer:_2d.startContainer.parentNode;
-var i,el;
-if(sel.isCollapsed){
-_2d.selectNodeContents(_2a._doc.body);
-}
-for(i=0;i<els.length;i++){
-el=els[i];
-if(_2d.isPointInRange(el,0)||(els[i]==_2f&&_2d.startOffset==0)){
-el.removeAttribute("style");
-}
-}
-this.editor._doc.execCommand(_27,UI,_29);
-_2a.restoreSelection(_2c);
-return true;
-break;
-}
-return false;
-};
-Gecko.prototype.onMouseDown=function(ev){
-if(ev.target.tagName.toLowerCase()=="hr"){
-var sel=this.editor.getSelection();
-var _34=this.editor.createRange(sel);
-_34.selectNode(ev.target);
-}
-};
-Xinha.prototype.insertNodeAtSelection=function(_35){
-if(_35.ownerDocument!=this._doc){
-try{
-_35=this._doc.adoptNode(_35);
-}
-catch(e){
-}
-}
-var sel=this.getSelection();
-var _37=this.createRange(sel);
-sel.removeAllRanges();
-_37.deleteContents();
-var _38=_37.startContainer;
-var pos=_37.startOffset;
-var _3a=_35;
-switch(_38.nodeType){
-case 3:
-if(_35.nodeType==3){
-_38.insertData(pos,_35.data);
-_37=this.createRange();
-_37.setEnd(_38,pos+_35.length);
-_37.setStart(_38,pos+_35.length);
-sel.addRange(_37);
-}else{
-_38=_38.splitText(pos);
-if(_35.nodeType==11){
-_3a=_3a.firstChild;
-}
-_38.parentNode.insertBefore(_35,_38);
-this.selectNodeContents(_3a);
-this.updateToolbar();
-}
-break;
-case 1:
-if(_35.nodeType==11){
-_3a=_3a.firstChild;
-}
-_38.insertBefore(_35,_38.childNodes[pos]);
-this.selectNodeContents(_3a);
-this.updateToolbar();
-break;
-}
-};
-Xinha.prototype.getParentElement=function(sel){
-if(typeof sel=="undefined"){
-sel=this.getSelection();
-}
-var _3c=this.createRange(sel);
-try{
-var p=_3c.commonAncestorContainer;
-if(!_3c.collapsed&&_3c.startContainer==_3c.endContainer&&_3c.startOffset-_3c.endOffset<=1&&_3c.startContainer.hasChildNodes()){
-p=_3c.startContainer.childNodes[_3c.startOffset];
-}
-while(p.nodeType==3){
-p=p.parentNode;
-}
-return p;
-}
-catch(ex){
-return null;
-}
-};
-Xinha.prototype.activeElement=function(sel){
-if((sel===null)||this.selectionEmpty(sel)){
-return null;
-}
-if(!sel.isCollapsed){
-if(sel.anchorNode.childNodes.length>sel.anchorOffset&&sel.anchorNode.childNodes[sel.anchorOffset].nodeType==1){
-return sel.anchorNode.childNodes[sel.anchorOffset];
-}else{
-if(sel.anchorNode.nodeType==1){
-return sel.anchorNode;
-}else{
-return null;
-}
-}
-}
-return null;
-};
-Xinha.prototype.selectionEmpty=function(sel){
-if(!sel){
-return true;
-}
-if(typeof sel.isCollapsed!="undefined"){
-return sel.isCollapsed;
-}
-return true;
-};
-Xinha.prototype.saveSelection=function(){
-return this.createRange(this.getSelection()).cloneRange();
-};
-Xinha.prototype.restoreSelection=function(_40){
-try{
-var sel=this.getSelection();
-sel.removeAllRanges();
-sel.addRange(_40);
-}
-catch(e){
-}
-};
-Xinha.prototype.selectNodeContents=function(_42,_43){
-this.focusEditor();
-this.forceRedraw();
-var _44;
-var _45=typeof _43=="undefined"?true:false;
-var sel=this.getSelection();
-_44=this._doc.createRange();
-if(!_42){
-sel.removeAllRanges();
-return;
-}
-if(_45&&_42.tagName&&_42.tagName.toLowerCase().match(/table|img|input|textarea|select/)){
-_44.selectNode(_42);
-}else{
-_44.selectNodeContents(_42);
-}
-sel.removeAllRanges();
-sel.addRange(_44);
-if(typeof _43!="undefined"){
-if(_43){
-sel.collapse(_44.startContainer,_44.startOffset);
-}else{
-sel.collapse(_44.endContainer,_44.endOffset);
-}
-}
-};
-Xinha.prototype.insertHTML=function(_47){
-var sel=this.getSelection();
-var _49=this.createRange(sel);
-this.focusEditor();
-var _4a=this._doc.createDocumentFragment();
-var div=this._doc.createElement("div");
-div.innerHTML=_47;
-while(div.firstChild){
-_4a.appendChild(div.firstChild);
-}
-var _4c=this.insertNodeAtSelection(_4a);
-};
-Xinha.prototype.getSelectedHTML=function(){
-var sel=this.getSelection();
-if(sel.isCollapsed){
-return "";
-}
-var _4e=this.createRange(sel);
-return Xinha.getHTML(_4e.cloneContents(),false,this);
-};
-Xinha.prototype.getSelection=function(){
-return this._iframe.contentWindow.getSelection();
-};
-Xinha.prototype.createRange=function(sel){
-this.activateEditor();
-if(typeof sel!="undefined"){
-try{
-return sel.getRangeAt(0);
-}
-catch(ex){
-return this._doc.createRange();
-}
-}else{
-return this._doc.createRange();
-}
-};
-Xinha.prototype.isKeyEvent=function(_50){
-return _50.type=="keypress";
-};
-Xinha.prototype.getKey=function(_51){
-return String.fromCharCode(_51.charCode);
-};
-Xinha.getOuterHTML=function(_52){
-return (new XMLSerializer()).serializeToString(_52);
-};
-Xinha.cc=String.fromCharCode(8286);
-Xinha.prototype.setCC=function(_53){
-var cc=Xinha.cc;
-try{
-if(_53=="textarea"){
-var ta=this._textArea;
-var _56=ta.selectionStart;
-var _57=ta.value.substring(0,_56);
-var _58=ta.value.substring(_56,ta.value.length);
-if(_58.match(/^[^<]*>/)){
-var _59=_58.indexOf(">")+1;
-ta.value=_57+_58.substring(0,_59)+cc+_58.substring(_59,_58.length);
-}else{
-ta.value=_57+cc+_58;
-}
-ta.value=ta.value.replace(new RegExp("(&[^"+cc+"]*?)("+cc+")([^"+cc+"]*?;)"),"$1$3$2");
-ta.value=ta.value.replace(new RegExp("(<script[^>]*>[^"+cc+"]*?)("+cc+")([^"+cc+"]*?</script>)"),"$1$3$2");
-ta.value=ta.value.replace(new RegExp("^([^"+cc+"]*)("+cc+")([^"+cc+"]*<body[^>]*>)(.*?)"),"$1$3$2$4");
-}else{
-var sel=this.getSelection();
-sel.getRangeAt(0).insertNode(this._doc.createTextNode(cc));
-}
-}
-catch(e){
-}
-};
-Xinha.prototype.findCC=function(_5b){
-if(_5b=="textarea"){
-var ta=this._textArea;
-var pos=ta.value.indexOf(Xinha.cc);
-if(pos==-1){
-return;
-}
-var end=pos+Xinha.cc.length;
-var _5f=ta.value.substring(0,pos);
-var _60=ta.value.substring(end,ta.value.length);
-ta.value=_5f;
-ta.scrollTop=ta.scrollHeight;
-var _61=ta.scrollTop;
-ta.value+=_60;
-ta.setSelectionRange(pos,pos);
-ta.focus();
-ta.scrollTop=_61;
-}else{
-try{
-var doc=this._doc;
-doc.body.innerHTML=doc.body.innerHTML.replace(new RegExp(Xinha.cc),"<span id=\"XinhaEditingPostion\"></span>");
-var _63=doc.getElementById("XinhaEditingPostion");
-this.selectNodeContents(_63);
-this.scrollToElement(_63);
-_63.parentNode.removeChild(_63);
-this._iframe.contentWindow.focus();
-}
-catch(e){
-}
-}
-};
-Xinha.prototype._standardToggleBorders=Xinha.prototype._toggleBorders;
-Xinha.prototype._toggleBorders=function(){
-var _64=this._standardToggleBorders();
-var _65=this._doc.getElementsByTagName("TABLE");
-for(var i=0;i<_65.length;i++){
-_65[i].style.display="none";
-_65[i].style.display="table";
-}
-return _64;
-};
-Xinha.getDoctype=function(doc){
-var d="";
-if(doc.doctype){
-d+="<!DOCTYPE "+doc.doctype.name+" PUBLIC ";
-d+=doc.doctype.publicId?"\""+doc.doctype.publicId+"\"":"";
-d+=doc.doctype.systemId?" \""+doc.doctype.systemId+"\"":"";
-d+=">";
-}
-return d;
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Gecko/paraHandlerBest.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Gecko/paraHandlerBest.js
deleted file mode 100644
index aa57a7d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Gecko/paraHandlerBest.js
+++ /dev/null
@@ -1,295 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/Gecko/paraHandlerBest.js */
-EnterParagraphs._pluginInfo={name:"EnterParagraphs",version:"1.0",developer:"Adam Wright",developer_url:"http://www.hipikat.org/",sponsor:"The University of Western Australia",sponsor_url:"http://www.uwa.edu.au/",license:"htmlArea"};
-EnterParagraphs.prototype._whiteSpace=/^\s*$/;
-EnterParagraphs.prototype._pExclusions=/^(address|blockquote|body|dd|div|dl|dt|fieldset|form|h1|h2|h3|h4|h5|h6|hr|li|noscript|ol|p|pre|table|ul)$/i;
-EnterParagraphs.prototype._pContainers=/^(body|del|div|fieldset|form|ins|map|noscript|object|td|th)$/i;
-EnterParagraphs.prototype._pBreak=/^(address|pre|blockquote)$/i;
-EnterParagraphs.prototype._permEmpty=/^(area|base|basefont|br|col|frame|hr|img|input|isindex|link|meta|param)$/i;
-EnterParagraphs.prototype._elemSolid=/^(applet|br|button|hr|img|input|table)$/i;
-EnterParagraphs.prototype._pifySibling=/^(address|blockquote|del|div|dl|fieldset|form|h1|h2|h3|h4|h5|h6|hr|ins|map|noscript|object|ol|p|pre|table|ul|)$/i;
-EnterParagraphs.prototype._pifyForced=/^(ul|ol|dl|table)$/i;
-EnterParagraphs.prototype._pifyParent=/^(dd|dt|li|td|th|tr)$/i;
-function EnterParagraphs(_1){
-this.editor=_1;
-if(Xinha.is_gecko){
-this.onKeyPress=this.__onKeyPress;
-}
-};
-EnterParagraphs.prototype.name="EnterParagraphs";
-EnterParagraphs.prototype.insertAdjacentElement=function(_2,_3,el){
-if(_3=="BeforeBegin"){
-_2.parentNode.insertBefore(el,_2);
-}else{
-if(_3=="AfterEnd"){
-_2.nextSibling?_2.parentNode.insertBefore(el,_2.nextSibling):_2.parentNode.appendChild(el);
-}else{
-if(_3=="AfterBegin"&&_2.firstChild){
-_2.insertBefore(el,_2.firstChild);
-}else{
-if(_3=="BeforeEnd"||_3=="AfterBegin"){
-_2.appendChild(el);
-}
-}
-}
-}
-};
-EnterParagraphs.prototype.forEachNodeUnder=function(_5,_6,_7,_8){
-var _9,_a;
-if(_5.nodeType==11&&_5.firstChild){
-_9=_5.firstChild;
-_a=_5.lastChild;
-}else{
-_9=_a=_5;
-}
-while(_a.lastChild){
-_a=_a.lastChild;
-}
-return this.forEachNode(_9,_a,_6,_7,_8);
-};
-EnterParagraphs.prototype.forEachNode=function(_b,_c,_d,_e,_f){
-var _10=function(_11,_12){
-return (_12=="ltr"?_11.nextSibling:_11.previousSibling);
-};
-var _13=function(_14,_15){
-return (_15=="ltr"?_14.firstChild:_14.lastChild);
-};
-var _16,_17,_18;
-var _19=_f;
-var _1a=false;
-while(_16!=_e=="ltr"?_c:_b){
-if(!_16){
-_16=_e=="ltr"?_b:_c;
-}else{
-if(_13(_16,_e)){
-_16=_13(_16,_e);
-}else{
-if(_10(_16,_e)){
-_16=_10(_16,_e);
-}else{
-_17=_16;
-while(!_10(_17,_e)&&_17!=(_e=="ltr"?_c:_b)){
-_17=_17.parentNode;
-}
-_16=(_10(_17,_e)?_10(_17,_e):_17);
-}
-}
-}
-_1a=(_16==(_e=="ltr"?_c:_b));
-switch(_d){
-case "cullids":
-_18=this._fenCullIds(_16,_19);
-break;
-case "find_fill":
-_18=this._fenEmptySet(_16,_19,_d,_1a);
-break;
-case "find_cursorpoint":
-_18=this._fenEmptySet(_16,_19,_d,_1a);
-break;
-}
-if(_18[0]){
-return _18[1];
-}
-if(_1a){
-break;
-}
-if(_18[1]){
-_19=_18[1];
-}
-}
-return false;
-};
-EnterParagraphs.prototype._fenEmptySet=function(_1b,_1c,_1d,_1e){
-if(!_1c&&!_1b.firstChild){
-_1c=_1b;
-}
-if((_1b.nodeType==1&&this._elemSolid.test(_1b.nodeName))||(_1b.nodeType==3&&!this._whiteSpace.test(_1b.nodeValue))||(_1b.nodeType!=1&&_1b.nodeType!=3)){
-switch(_1d){
-case "find_fill":
-return new Array(true,false);
-break;
-case "find_cursorpoint":
-return new Array(true,_1b);
-break;
-}
-}
-if(_1e){
-return new Array(true,_1c);
-}
-return new Array(false,_1c);
-};
-EnterParagraphs.prototype._fenCullIds=function(_1f,_20,_21){
-if(_20.id){
-_21[_20.id]?_20.id="":_21[_20.id]=true;
-}
-return new Array(false,_21);
-};
-EnterParagraphs.prototype.processSide=function(rng,_23){
-var _24=function(_25,_26){
-return (_26=="left"?_25.previousSibling:_25.nextSibling);
-};
-var _27=_23=="left"?rng.startContainer:rng.endContainer;
-var _28=_23=="left"?rng.startOffset:rng.endOffset;
-var _29,_2a=_27;
-while(_2a.nodeType==1&&!this._permEmpty.test(_2a.nodeName)){
-_2a=(_28?_2a.lastChild:_2a.firstChild);
-}
-while(_29=_29?(_24(_29,_23)?_24(_29,_23):_29.parentNode):_2a){
-if(_24(_29,_23)){
-if(this._pExclusions.test(_24(_29,_23).nodeName)){
-return this.processRng(rng,_23,_29,_24(_29,_23),(_23=="left"?"AfterEnd":"BeforeBegin"),true,false);
-}
-}else{
-if(this._pContainers.test(_29.parentNode.nodeName)){
-return this.processRng(rng,_23,_29,_29.parentNode,(_23=="left"?"AfterBegin":"BeforeEnd"),true,false);
-}else{
-if(this._pExclusions.test(_29.parentNode.nodeName)){
-if(this._pBreak.test(_29.parentNode.nodeName)){
-return this.processRng(rng,_23,_29,_29.parentNode,(_23=="left"?"AfterBegin":"BeforeEnd"),false,(_23=="left"?true:false));
-}else{
-return this.processRng(rng,_23,(_29=_29.parentNode),(_24(_29,_23)?_24(_29,_23):_29.parentNode),(_24(_29,_23)?(_23=="left"?"AfterEnd":"BeforeBegin"):(_23=="left"?"AfterBegin":"BeforeEnd")),false,false);
-}
-}
-}
-}
-}
-};
-EnterParagraphs.prototype.processRng=function(rng,_2c,_2d,_2e,_2f,_30,_31){
-var _32=_2c=="left"?rng.startContainer:rng.endContainer;
-var _33=_2c=="left"?rng.startOffset:rng.endOffset;
-var _34=this.editor;
-var _35=_34._doc.createRange();
-_35.selectNode(_2d);
-if(_2c=="left"){
-_35.setEnd(_32,_33);
-rng.setStart(_35.startContainer,_35.startOffset);
-}else{
-if(_2c=="right"){
-_35.setStart(_32,_33);
-rng.setEnd(_35.endContainer,_35.endOffset);
-}
-}
-var cnt=_35.cloneContents();
-this.forEachNodeUnder(cnt,"cullids","ltr",this.takenIds,false,false);
-var _37,_38,_39;
-_37=_2c=="left"?(_35.endContainer.nodeType==3?true:false):(_35.startContainer.nodeType==3?false:true);
-_38=_37?_35.startOffset:_35.endOffset;
-_37=_37?_35.startContainer:_35.endContainer;
-if(this._pifyParent.test(_37.nodeName)&&_37.parentNode.childNodes.item(0)==_37){
-while(!this._pifySibling.test(_37.nodeName)){
-_37=_37.parentNode;
-}
-}
-if(cnt.nodeType==11&&!cnt.firstChild){
-if(_37.nodeName!="BODY"||(_37.nodeName=="BODY"&&_38!=0)){
-cnt.appendChild(_34._doc.createElement(_37.nodeName));
-}
-}
-_39=this.forEachNodeUnder(cnt,"find_fill","ltr",false);
-if(_39&&this._pifySibling.test(_37.nodeName)&&((_38==0)||(_38==1&&this._pifyForced.test(_37.nodeName)))){
-_2d=_34._doc.createElement("p");
-_2d.innerHTML="&nbsp;";
-if((_2c=="left")&&_37.previousSibling){
-return new Array(_37.previousSibling,"AfterEnd",_2d);
-}else{
-if((_2c=="right")&&_37.nextSibling){
-return new Array(_37.nextSibling,"BeforeBegin",_2d);
-}else{
-return new Array(_37.parentNode,(_2c=="left"?"AfterBegin":"BeforeEnd"),_2d);
-}
-}
-}
-if(_39){
-if(_39.nodeType==3){
-_39=_34._doc.createDocumentFragment();
-}
-if((_39.nodeType==1&&!this._elemSolid.test())||_39.nodeType==11){
-var _3a=_34._doc.createElement("p");
-_3a.innerHTML="&nbsp;";
-_39.appendChild(_3a);
-}else{
-var _3a=_34._doc.createElement("p");
-_3a.innerHTML="&nbsp;";
-_39.parentNode.insertBefore(parentNode,_39);
-}
-}
-if(_39){
-_2d=_39;
-}else{
-_2d=(_30||(cnt.nodeType==11&&!cnt.firstChild))?_34._doc.createElement("p"):_34._doc.createDocumentFragment();
-_2d.appendChild(cnt);
-}
-if(_31){
-_2d.appendChild(_34._doc.createElement("br"));
-}
-return new Array(_2e,_2f,_2d);
-};
-EnterParagraphs.prototype.isNormalListItem=function(rng){
-var _3c,_3d;
-_3c=rng.startContainer;
-if((typeof _3c.nodeName!="undefined")&&(_3c.nodeName.toLowerCase()=="li")){
-_3d=_3c;
-}else{
-if((typeof _3c.parentNode!="undefined")&&(typeof _3c.parentNode.nodeName!="undefined")&&(_3c.parentNode.nodeName.toLowerCase()=="li")){
-_3d=_3c.parentNode;
-}else{
-return false;
-}
-}
-if(!_3d.previousSibling){
-if(rng.startOffset==0){
-return false;
-}
-}
-return true;
-};
-EnterParagraphs.prototype.__onKeyPress=function(ev){
-if(ev.keyCode==13&&!ev.shiftKey&&this.editor._iframe.contentWindow.getSelection){
-return this.handleEnter(ev);
-}
-};
-EnterParagraphs.prototype.handleEnter=function(ev){
-var _40;
-var sel=this.editor.getSelection();
-var rng=this.editor.createRange(sel);
-if(this.isNormalListItem(rng)){
-return true;
-}
-this.takenIds=new Object();
-var _43=this.processSide(rng,"left");
-var _44=this.processSide(rng,"right");
-_40=_44[2];
-sel.removeAllRanges();
-rng.deleteContents();
-var _45=this.forEachNodeUnder(_40,"find_cursorpoint","ltr",false,true);
-if(!_45){
-alert("INTERNAL ERROR - could not find place to put cursor after ENTER");
-}
-if(_43){
-this.insertAdjacentElement(_43[0],_43[1],_43[2]);
-}
-if(_44&&_44.nodeType!=1){
-this.insertAdjacentElement(_44[0],_44[1],_44[2]);
-}
-if((_45)&&(this._permEmpty.test(_45.nodeName))){
-var _46=0;
-while(_45.parentNode.childNodes.item(_46)!=_45){
-_46++;
-}
-sel.collapse(_45.parentNode,_46);
-}else{
-try{
-sel.collapse(_45,0);
-if(_45.nodeType==3){
-_45=_45.parentNode;
-}
-this.editor.scrollToElement(_45);
-}
-catch(e){
-}
-}
-this.editor.updateToolbar();
-Xinha._stopEvent(ev);
-return true;
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/GetHtml/DOMwalk.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/GetHtml/DOMwalk.js
deleted file mode 100644
index f436ae0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/GetHtml/DOMwalk.js
+++ /dev/null
@@ -1,197 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/GetHtml/DOMwalk.js */
-function GetHtmlImplementation(_1){
-this.editor=_1;
-};
-GetHtmlImplementation._pluginInfo={name:"GetHtmlImplementation DOMwalk",origin:"Xinha Core",version:"$LastChangedRevision: 1185 $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),developer:"The Xinha Core Developer Team",developer_url:"$HeadURL: http://svn.xinha.org/tags/0.96.1/modules/GetHtml/DOMwalk.js $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),sponsor:"",sponsor_url:"",license:"htmlArea"};
-Xinha.getHTML=function(_2,_3,_4){
-return Xinha.getHTMLWrapper(_2,_3,_4);
-};
-Xinha.emptyAttributes=" checked disabled ismap readonly nowrap compact declare selected defer multiple noresize noshade ";
-Xinha.getHTMLWrapper=function(_5,_6,_7,_8){
-var _9="";
-if(!_8){
-_8="";
-}
-switch(_5.nodeType){
-case 10:
-case 6:
-case 12:
-break;
-case 2:
-break;
-case 4:
-_9+=(Xinha.is_ie?("\n"+_8):"")+"<![CDATA["+_5.data+"]]>";
-break;
-case 5:
-_9+="&"+_5.nodeValue+";";
-break;
-case 7:
-_9+=(Xinha.is_ie?("\n"+_8):"")+"<"+"?"+_5.target+" "+_5.data+" ?>";
-break;
-case 1:
-case 11:
-case 9:
-var _a;
-var i;
-var _c=(_5.nodeType==1)?_5.tagName.toLowerCase():"";
-if((_c=="script"||_c=="noscript")&&_7.config.stripScripts){
-break;
-}
-if(_6){
-_6=!(_7.config.htmlRemoveTags&&_7.config.htmlRemoveTags.test(_c));
-}
-if(Xinha.is_ie&&_c=="head"){
-if(_6){
-_9+=(Xinha.is_ie?("\n"+_8):"")+"<head>";
-}
-var _d=RegExp.multiline;
-RegExp.multiline=true;
-var _e=_5.innerHTML.replace(Xinha.RE_tagName,function(_f,p1,p2){
-return p1+p2.toLowerCase();
-}).replace(/\s*=\s*(([^'"][^>\s]*)([>\s])|"([^"]+)"|'([^']+)')/g,"=\"$2$4$5\"$3").replace(/<(link|meta)((\s*\S*="[^"]*")*)>([\n\r]*)/g,"<$1$2 />\n");
-RegExp.multiline=_d;
-_9+=_e+"\n";
-if(_6){
-_9+=(Xinha.is_ie?("\n"+_8):"")+"</head>";
-}
-break;
-}else{
-if(_6){
-_a=(!(_5.hasChildNodes()||Xinha.needsClosingTag(_5)));
-_9+=((Xinha.isBlockElement(_5))?("\n"+_8):"")+"<"+_5.tagName.toLowerCase();
-var _12=_5.attributes;
-for(i=0;i<_12.length;++i){
-var a=_12.item(i);
-if(Xinha.is_real_gecko&&(_5.tagName.toLowerCase()=="img")&&((a.nodeName.toLowerCase()=="height")||(a.nodeName.toLowerCase()=="width"))){
-if(!_5.complete||_5.naturalWidth===0){
-continue;
-}
-}
-if(typeof a.nodeValue=="object"){
-continue;
-}
-if(_5.tagName.toLowerCase()=="input"&&_5.type.toLowerCase()=="checkbox"&&a.nodeName.toLowerCase()=="value"&&a.nodeValue.toLowerCase()=="on"){
-continue;
-}
-if(!a.specified&&!(_5.tagName.toLowerCase().match(/input|option/)&&a.nodeName=="value")&&!(_5.tagName.toLowerCase().match(/area/)&&a.nodeName.match(/shape|coords/i))){
-continue;
-}
-var _14=a.nodeName.toLowerCase();
-if(/_moz_editor_bogus_node/.test(_14)||(_14=="class"&&a.nodeValue=="webkit-block-placeholder")){
-_9="";
-break;
-}
-if(/(_moz)|(contenteditable)|(_msh)/.test(_14)){
-continue;
-}
-var _15;
-if(Xinha.emptyAttributes.indexOf(" "+_14+" ")!=-1){
-_15=_14;
-}else{
-if(_14!="style"){
-if(typeof _5[a.nodeName]!="undefined"&&_14!="href"&&_14!="src"&&!(/^on/.test(_14))){
-_15=_5[a.nodeName];
-}else{
-_15=a.nodeValue;
-if(_14=="class"){
-_15=_15.replace(/Apple-style-span/,"");
-if(!_15){
-continue;
-}
-}
-if(Xinha.is_ie&&(_14=="href"||_14=="src")){
-_15=_7.stripBaseURL(_15);
-}
-if(_7.config.only7BitPrintablesInURLs&&(_14=="href"||_14=="src")){
-_15=_15.replace(/([^!-~]+)/g,function(_16){
-return escape(_16);
-});
-}
-}
-}else{
-if(!Xinha.is_ie){
-_15=_5.style.cssText.replace(/rgb\(.*?\)/ig,function(rgb){
-return Xinha._colorToRgb(rgb);
-});
-}else{
-if(!_15){
-continue;
-}
-}
-}
-}
-if(/^(_moz)?$/.test(_15)){
-continue;
-}
-_9+=" "+_14+"=\""+Xinha.htmlEncode(_15)+"\"";
-}
-if(Xinha.is_ie&&_5.style.cssText){
-_9+=" style=\""+_5.style.cssText.replace(/(^)?([^:]*):(.*?)(;|$)/g,function(m0,m1,m2,m3,m4){
-return m2.toLowerCase()+":"+m3+m4;
-})+"\"";
-}
-if(Xinha.is_ie&&_5.tagName.toLowerCase()=="option"&&_5.selected){
-_9+=" selected=\"selected\"";
-}
-if(_9!==""){
-if(_a&&_c=="p"){
-_9+=">&nbsp;</p>";
-}else{
-if(_a){
-_9+=" />";
-}else{
-_9+=">";
-}
-}
-}
-}
-}
-var _1d=false;
-if(_c=="script"||_c=="noscript"){
-if(!_7.config.stripScripts){
-if(Xinha.is_ie){
-var _1e="\n"+_5.innerHTML.replace(/^[\n\r]*/,"").replace(/\s+$/,"")+"\n"+_8;
-}else{
-var _1e=(_5.hasChildNodes())?_5.firstChild.nodeValue:"";
-}
-_9+=_1e+"</"+_c+">"+((Xinha.is_ie)?"\n":"");
-}
-}else{
-if(_c=="pre"){
-_9+=((Xinha.is_ie)?"\n":"")+_5.innerHTML.replace(/<br>/g,"\n")+"</"+_c+">";
-}else{
-for(i=_5.firstChild;i;i=i.nextSibling){
-if(!_1d&&i.nodeType==1&&Xinha.isBlockElement(i)){
-_1d=true;
-}
-_9+=Xinha.getHTMLWrapper(i,true,_7,_8+"  ");
-}
-if(_6&&!_a){
-_9+=(((Xinha.isBlockElement(_5)&&_1d)||_c=="head"||_c=="html")?("\n"+_8):"")+"</"+_5.tagName.toLowerCase()+">";
-}
-}
-}
-break;
-case 3:
-if(/^script|noscript|style$/i.test(_5.parentNode.tagName)){
-_9=_5.data;
-}else{
-if(_5.data.trim()==""){
-if(_5.data){
-_9=" ";
-}else{
-_9="";
-}
-}else{
-_9=Xinha.htmlEncode(_5.data);
-}
-}
-break;
-case 8:
-_9="<!--"+_5.data+"-->";
-break;
-}
-return _9;
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/GetHtml/TransformInnerHTML.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/GetHtml/TransformInnerHTML.js
deleted file mode 100644
index e3b116e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/GetHtml/TransformInnerHTML.js
+++ /dev/null
@@ -1,155 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/GetHtml/TransformInnerHTML.js */
-function GetHtmlImplementation(_1){
-this.editor=_1;
-};
-GetHtmlImplementation._pluginInfo={name:"GetHtmlImplementation TransformInnerHTML",version:"1.0",developer:"Nelson Bright",developer_url:"http://www.brightworkweb.com/",sponsor:"",sponsor_url:"",license:"htmlArea"};
-Xinha.RegExpCache=[/<\s*\/?([^\s\/>]+)[\s*\/>]/gi,/(\s+)_moz[^=>]*=[^\s>]*/gi,/\s*=\s*(([^'"][^>\s]*)([>\s])|"([^"]+)"|'([^']+)')/g,/\/>/g,/<(br|hr|img|input|link|meta|param|embed|area)((\s*\S*="[^"]*")*)>/g,/(<\w+\s+(\w*="[^"]*"\s+)*)(checked|compact|declare|defer|disabled|ismap|multiple|no(href|resize|shade|wrap)|readonly|selected)([\s>])/gi,/(="[^']*)'([^'"]*")/,/&(?=(?!(#[0-9]{2,5};|[a-zA-Z0-9]{2,6};|#x[0-9a-fA-F]{2,4};))[^<]*>)/g,/<\s+/g,/\s+(\/)?>/g,/\s{2,}/g,/\s+([^=\s]+)((="[^"]+")|([\s>]))/g,/\s+contenteditable(=[^>\s\/]*)?/gi,/((href|src)=")([^\s]*)"/g,/<\/?(div|p|h[1-6]|table|tr|td|th|ul|ol|li|dl|dt|dd|blockquote|object|br|hr|img|embed|param|pre|script|html|head|body|meta|link|title|area|input|form|textarea|select|option)[^>]*>/g,/<\/(div|p|h[1-6]|table|tr|ul|ol|dl|blockquote|html|head|body|script|form|select)( [^>]*)?>/g,/<(div|p|h[1-6]|table|tr|ul|ol|dl|blockquote|object|html|head|body|script|form|select)( [^>]*)?>/g,/<(td|th|li|dt|dd|option|br|hr|embed|param|pre|meta|link|title|area|input|textarea)[^>]*>/g,/(^|<\/(pre|script)>)(\s|[^\s])*?(<(pre|script)[^>]*>|$)/g,/(<pre[^>]*>)([\s\S])*?(<\/pre>)/g,/(^|<!--[\s\S]*?-->)([\s\S]*?)(?=<!--[\s\S]*?-->|$)/g,/\S*=""/g,/<!--[\s\S]*?-->|<\?[\s\S]*?\?>|<\/?\w[^>]*>/g,/(^|<\/script>)[\s\S]*?(<script[^>]*>|$)/g];
-var testRE=new RegExp().compile(Xinha.RegExpCache[3]);
-if(typeof testRE!="undefined"){
-for(var i=0;i<Xinha.RegExpCache.length;i++){
-Xinha.RegExpCache[i]=new RegExp().compile(Xinha.RegExpCache[i]);
-}
-}
-Xinha.prototype.cleanHTML=function(_2){
-var c=Xinha.RegExpCache;
-_2=_2.replace(c[0],function(_4){
-return _4.toLowerCase();
-}).replace(c[1]," ").replace(c[12]," ").replace(c[2],"=\"$2$4$5\"$3").replace(c[21]," ").replace(c[11],function(_5,p1,p2){
-return " "+p1.toLowerCase()+p2;
-}).replace(c[3],">").replace(c[9],"$1>").replace(c[5],"$1$3=\"$3\"$5").replace(c[4],"<$1$2 />").replace(c[6],"$1$2").replace(c[7],"&amp;").replace(c[8],"<").replace(c[10]," ");
-if(Xinha.is_ie&&c[13].test(_2)){
-_2=_2.replace(c[13],"$1"+Xinha._escapeDollars(this.stripBaseURL(RegExp.$3))+"\"");
-}
-if(this.config.only7BitPrintablesInURLs){
-if(Xinha.is_ie){
-c[13].test(_2);
-}
-if(c[13].test(_2)){
-try{
-_2=_2.replace(c[13],"$1"+Xinha._escapeDollars(decodeURIComponent(RegExp.$3).replace(/([^!-~]+)/g,function(_8){
-return escape(_8);
-}))+"\"");
-}
-catch(e){
-_2=_2.replace(c[13],Xinha._escapeDollars("$1"+RegExp.$3.replace(/([^!-~]+)/g,function(_9){
-return escape(_9);
-})+"\""));
-}
-}
-}
-return _2;
-};
-Xinha.indent=function(s,_b){
-Xinha.__nindent=0;
-Xinha.__sindent="";
-Xinha.__sindentChar=(typeof _b=="undefined")?"  ":_b;
-var c=Xinha.RegExpCache;
-if(Xinha.is_gecko){
-s=s.replace(c[19],function(_d){
-return _d.replace(/<br \/>/g,"\n");
-});
-}
-s=s.replace(c[18],function(_e){
-_e=_e.replace(c[20],function(st,$1,$2){
-string=$2.replace(/[\n\r]/gi," ").replace(/\s+/gi," ").replace(c[14],function(str){
-if(str.match(c[16])){
-var s="\n"+Xinha.__sindent+str;
-Xinha.__sindent+=Xinha.__sindentChar;
-++Xinha.__nindent;
-return s;
-}else{
-if(str.match(c[15])){
---Xinha.__nindent;
-Xinha.__sindent="";
-for(var i=Xinha.__nindent;i>0;--i){
-Xinha.__sindent+=Xinha.__sindentChar;
-}
-return "\n"+Xinha.__sindent+str;
-}else{
-if(str.match(c[17])){
-return "\n"+Xinha.__sindent+str;
-}
-}
-}
-return str;
-});
-return $1+string;
-});
-return _e;
-});
-s=s.replace(/^\s*/,"").replace(/ +\n/g,"\n").replace(/[\r\n]+(\s+)<\/script>/g,"\n$1</script>");
-return s;
-};
-Xinha.getHTML=function(_15,_16,_17){
-var _18="";
-var c=Xinha.RegExpCache;
-if(_15.nodeType==11){
-var div=document.createElement("div");
-var _1b=_15.insertBefore(div,_15.firstChild);
-for(j=_1b.nextSibling;j;j=j.nextSibling){
-_1b.appendChild(j.cloneNode(true));
-}
-_18+=_1b.innerHTML.replace(c[23],function(_1c){
-_1c=_1c.replace(c[22],function(tag){
-if(/^<[!\?]/.test(tag)){
-return tag;
-}else{
-return _17.cleanHTML(tag);
-}
-});
-return _1c;
-});
-}else{
-var _1e=(_15.nodeType==1)?_15.tagName.toLowerCase():"";
-if(_16){
-_18+="<"+_1e;
-var _1f=_15.attributes;
-for(i=0;i<_1f.length;++i){
-var a=_1f.item(i);
-if(!a.specified){
-continue;
-}
-var _21=a.nodeName.toLowerCase();
-var _22=a.nodeValue;
-_18+=" "+_21+"=\""+_22+"\"";
-}
-_18+=">";
-}
-if(_1e=="html"){
-innerhtml=_17._doc.documentElement.innerHTML;
-}else{
-innerhtml=_15.innerHTML;
-}
-_18+=innerhtml.replace(c[23],function(_23){
-_23=_23.replace(c[22],function(tag){
-if(/^<[!\?]/.test(tag)){
-return tag;
-}else{
-if(!(_17.config.htmlRemoveTags&&_17.config.htmlRemoveTags.test(tag.replace(/<([^\s>\/]+)/,"$1")))){
-return _17.cleanHTML(tag);
-}else{
-return "";
-}
-}
-});
-return _23;
-});
-if(Xinha.is_ie){
-_18=_18.replace(/<(li|dd|dt)( [^>]*)?>/g,"</$1><$1$2>").replace(/(<[uod]l[^>]*>[\s\S]*?)<\/(li|dd|dt)>/g,"$1").replace(/\s*<\/(li|dd|dt)>(\s*<\/(li|dd|dt)>)+/g,"</$1>").replace(/(<dt[\s>][\s\S]*?)(<\/d[dt]>)+/g,"$1</dt>");
-}
-if(Xinha.is_gecko){
-_18=_18.replace(/<br \/>\n$/,"");
-}
-_18=_18.replace(/\s*(<\/(li|dd|dt)>)/g,"$1");
-if(_16){
-_18+="</"+_1e+">";
-}
-_18=Xinha.indent(_18);
-}
-return _18;
-};
-Xinha._escapeDollars=function(str){
-return str.replace(/\$/g,"$$$$");
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/GetHtml/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/GetHtml/lang/pt_br.js
deleted file mode 100644
index 4568329..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/GetHtml/lang/pt_br.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-//
-// LANG: "pt_br", ENCODING: UTF-8
-// Portuguese Brazilian Translation
-//
-// Author: Marcio Barbosa, <marcio@mpg.com.br>
-// MSN: tomarshall@msn.com - ICQ: 69419933
-// Site: http://www.mpg.com.br
-//
-// Last revision: 06 september 2007
-// Please don´t remove this information
-// If you modify any source, please insert a comment with your name and e-mail
-//
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-{
-  "Your Document is not well formed. Check JavaScript console for details.": "Seu documento não está formatado corretamente. Verifique os detalhes no console do Javascript."
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertImage/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertImage/dialog.html
deleted file mode 100644
index 49114e7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertImage/dialog.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<h1 id="[h1]"><l10n>Insert Image</l10n></h1>
-<!--- new stuff --->
-<form action="" method="get" style="padding-top:10px" id="[inputs]">
-<table border="0" width="95%" style="padding: 0px; margin: 0px">
-  <tbody>
-
-  <tr>
-    <td style="width: 7em; text-align: right"><l10n>Image URL:</l10n></td>
-    <td><input type="text" name="[f_url]" id="[f_url]" style="width:75%"
-      title="_(Enter the image URL here)" />
-      <button id="[preview]" title="_(Preview the image in a new window)"><l10n>Preview</l10n></button>
-    </td>
-  </tr>
-  <tr>
-    <td style="width: 7em; text-align: right"><l10n>Alternate text:</l10n></td>
-    <td><input type="text" name="[f_alt]" id="[f_alt]" style="width:100%"
-      title="_(For browsers that don't support images)" /></td>
-  </tr>
-
-  </tbody>
-</table>
-
-<br />
-
-<fieldset style="float: left; margin-left: 5px;">
-<legend><l10n>Layout</l10n></legend>
-
-<div class="space"></div>
-
-<div class="fl"><l10n>Alignment:</l10n></div>
-<select size="1" name="[f_align]" id="[f_align]"
-  title="_(Positioning of this image)">
-  <option value=""                             ><l10n>Not set</l10n></option>
-  <option value="left"                         ><l10n>Left</l10n></option>
-  <option value="right"                        ><l10n>Right</l10n></option>
-  <option value="texttop"                      ><l10n>Texttop</l10n></option>
-  <option value="absmiddle"                    ><l10n>Absmiddle</l10n></option>
-  <option value="baseline"                     ><l10n>Baseline</l10n></option>
-  <option value="absbottom"                    ><l10n>Absbottom</l10n></option>
-  <option value="bottom"                       ><l10n>Bottom</l10n></option>
-  <option value="middle"                       ><l10n>Middle</l10n></option>
-  <option value="top"                          ><l10n>Top</l10n></option>
-</select>
-
-<br />
-
-<div class="fl"><l10n>Border thickness:</l10n></div>
-<input type="text" name="[f_border]" id="[f_border]" size="5"
-title="_(Leave empty for no border)" />
-
-<div class="space"></div>
-
-</fieldset>
-
-<fieldset>
-<legend><l10n>Spacing</l10n></legend>
-
-<div class="space"></div>
-
-<div class="fr"><l10n>Horizontal:</l10n></div>
-<input type="text" name="[f_horiz]" id="[f_horiz]" size="5"
-title="_(Horizontal padding)" />
-
-<br />
-
-<div class="fr"><l10n>Vertical:</l10n></div>
-<input type="text" name="[f_vert]" id="[f_vert]" size="5"
-title="_(Vertical padding)" />
-
-<div class="space"></div>
-
-</fieldset>
-</form>
-<div>
-<l10n>Image Preview:</l10n><br />
-    <iframe id="[ipreview]" frameborder="0" style="border : 1px solid gray;" 
-	height="200" width="100%" src="about:blank"></iframe>
-</div>
-
-<div class="buttons" id="[buttons]">
-  <input type="button" id="[ok]"     value="_(OK)"     />
-  <input type="button" id="[cancel]" value="_(Cancel)" />
-</div>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertImage/insert_image.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertImage/insert_image.html
deleted file mode 100644
index 0247e4b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertImage/insert_image.html
+++ /dev/null
@@ -1,173 +0,0 @@
-<!DOCTYPE html
-     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-  <title>Insert Image</title>
-
-<script type="text/javascript" src="../../popups/popup.js"></script>
-<link rel="stylesheet" type="text/css" href="../../popups/popup.css" />
-
-<script type="text/javascript">
-
-
-Xinha = window.opener.Xinha;
-function i18n(str) {
-  return (Xinha._lc(str, 'Xinha'));
-}
-
-function Init() {
-  __dlg_translate('Xinha');
-  __dlg_init(null,{width:410,height:400});
-  // Make sure the translated string appears in the drop down. (for gecko)
-  document.getElementById("f_align").selectedIndex = 1;
-  document.getElementById("f_align").selectedIndex = 5;
-  var param = window.dialogArguments;
-  if (param["f_base"]) {
-      document.getElementById("f_base").value = param["f_base"];
-  }
-  document.getElementById("f_url").value    = param["f_url"] ? param["f_url"] : "";
-  document.getElementById("f_alt").value    = param["f_alt"] ? param["f_alt"] : "";
-  document.getElementById("f_border").value = (typeof param["f_border"]!="undefined") ? param["f_border"] : "";
-  document.getElementById("f_align").value  = param["f_align"] ? param["f_align"] : "";
-  document.getElementById("f_vert").value   = (typeof param["f_vert"]!="undefined") ? param["f_vert"] : "";
-  document.getElementById("f_horiz").value  = (typeof param["f_horiz"]!="undefined") ? param["f_horiz"] : "";
-  if (param["f_url"]) {
-      window.ipreview.location.replace(Xinha._resolveRelativeUrl(param.f_base, param.f_url));
-  }
-  document.getElementById("f_url").focus();
-}
-
-function onOK() {
-  var required = {
-    "f_url": i18n("You must enter the URL")
-  };
-  for (var i in required) {
-    var el = document.getElementById(i);
-    if (!el.value) {
-      alert(required[i]);
-      el.focus();
-      return false;
-    }
-  }
-  // pass data back to the calling window
-  var fields = ["f_url", "f_alt", "f_align", "f_border",
-                "f_horiz", "f_vert"];
-  var param = new Object();
-  for (var i in fields) {
-    var id = fields[i];
-    var el = document.getElementById(id);
-    param[id] = el.value;
-  }
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-
-function onPreview() {
-  var f_url = document.getElementById("f_url");
-  var url = f_url.value;
-  var base = document.getElementById("f_base").value;
-  if (!url) {
-    alert(i18n("You must enter the URL"));
-    f_url.focus();
-    return false;
-  }
-  window.ipreview.location.replace(Xinha._resolveRelativeUrl(base, url));
-  return false;
-}
-</script>
-
-</head>
-
-<body class="dialog" onload="Init()">
-
-<div class="title">Insert Image</div>
-<!--- new stuff --->
-<form action="" method="get">
-<input type="hidden" name="base" id="f_base"/>
-<table border="0" width="100%" style="padding: 0px; margin: 0px">
-  <tbody>
-
-  <tr>
-    <td style="width: 7em; text-align: right">Image URL:</td>
-    <td><input type="text" name="url" id="f_url" style="width:75%"
-      title="Enter the image URL here" />
-      <button name="preview" onclick="return onPreview();"
-      title="Preview the image in a new window">Preview</button>
-    </td>
-  </tr>
-  <tr>
-    <td style="width: 7em; text-align: right">Alternate text:</td>
-    <td><input type="text" name="alt" id="f_alt" style="width:100%"
-      title="For browsers that don't support images" /></td>
-  </tr>
-
-  </tbody>
-</table>
-
-<fieldset style="float: left; margin-left: 5px;">
-<legend>Layout</legend>
-
-<div class="space"></div>
-
-<div class="fl">Alignment:</div>
-<select size="1" name="align" id="f_align"
-  title="Positioning of this image">
-  <option value=""                             >Not set</option>
-  <option value="left"                         >Left</option>
-  <option value="right"                        >Right</option>
-  <option value="texttop"                      >Texttop</option>
-  <option value="absmiddle"                    >Absmiddle</option>
-  <option value="baseline" selected="selected" >Baseline</option>
-  <option value="absbottom"                    >Absbottom</option>
-  <option value="bottom"                       >Bottom</option>
-  <option value="middle"                       >Middle</option>
-  <option value="top"                          >Top</option>
-</select>
-
-<br />
-
-<div class="fl">Border thickness:</div>
-<input type="text" name="border" id="f_border" size="5"
-title="Leave empty for no border" />
-
-<div class="space"></div>
-
-</fieldset>
-
-<fieldset>
-<legend>Spacing</legend>
-
-<div class="space"></div>
-
-<div class="fr">Horizontal:</div>
-<input type="text" name="horiz" id="f_horiz" size="5"
-title="Horizontal padding" />
-
-<br />
-
-<div class="fr">Vertical:</div>
-<input type="text" name="vert" id="f_vert" size="5"
-title="Vertical padding" />
-
-<div class="space"></div>
-
-</fieldset>
-<div class="space" style="clear:all"></div>
-<div>
-Image Preview:<br />
-    <iframe name="ipreview" id="ipreview" frameborder="0" style="border : 1px solid gray;" 
-	height="200" width="100%" src="../../popups/blank.html"></iframe>
-</div>
-<div id="buttons">
-<button type="submit" name="ok" onclick="return onOK();">OK</button>
-<button type="button" name="cancel" onclick="return onCancel();">Cancel</button>
-</div>
-</form>
-</body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertImage/insert_image.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertImage/insert_image.js
deleted file mode 100644
index c25225c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertImage/insert_image.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/InsertImage/insert_image.js */
-InsertImage._pluginInfo={name:"InsertImage",origin:"Xinha Core",version:"$LastChangedRevision: 1239 $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),developer:"The Xinha Core Developer Team",developer_url:"$HeadURL: http://svn.xinha.org/tags/0.96.1/modules/InsertImage/insert_image.js $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),sponsor:"",sponsor_url:"",license:"htmlArea"};
-function InsertImage(_1){
-this.editor=_1;
-var _2=_1.config;
-var _3=this;
-if(typeof _1._insertImage=="undefined"){
-_1._insertImage=function(){
-_3.show();
-};
-}
-};
-InsertImage.prototype._lc=function(_4){
-return Xinha._lc(_4,"Xinha");
-};
-InsertImage.prototype.onGenerateOnce=function(){
-InsertImage.loadAssets();
-};
-InsertImage.loadAssets=function(){
-var _5=InsertImage;
-if(_5.loading){
-return;
-}
-_5.loading=true;
-Xinha._getback(_editor_url+"modules/InsertImage/dialog.html",function(_6){
-_5.html=_6;
-_5.dialogReady=true;
-});
-Xinha._getback(_editor_url+"modules/InsertImage/pluginMethods.js",function(_7){
-eval(_7);
-_5.methodsReady=true;
-});
-};
-InsertImage.prototype.onUpdateToolbar=function(){
-if(!(InsertImage.dialogReady&&InsertImage.methodsReady)){
-this.editor._toolbarObjects.insertimage.state("enabled",false);
-}else{
-this.onUpdateToolbar=null;
-}
-};
-InsertImage.prototype.prepareDialog=function(){
-var _8=this;
-var _9=this.editor;
-var _a=this.dialog=new Xinha.Dialog(_9,InsertImage.html,"Xinha",{width:410});
-_a.getElementById("ok").onclick=function(){
-_8.apply();
-};
-_a.getElementById("cancel").onclick=function(){
-_8.dialog.hide();
-};
-_a.getElementById("preview").onclick=function(){
-var _b=_a.getElementById("f_url");
-var _c=_b.value;
-if(!_c){
-alert(_a._lc("You must enter the URL"));
-_b.focus();
-return false;
-}
-_a.getElementById("ipreview").src=_c;
-return false;
-};
-this.dialog.onresize=function(){
-var _d=parseInt(this.height,10)-this.getElementById("h1").offsetHeight-this.getElementById("buttons").offsetHeight-this.getElementById("inputs").offsetHeight-parseInt(this.rootElem.style.paddingBottom,10);
-this.getElementById("ipreview").style.height=((_d>0)?_d:0)+"px";
-this.getElementById("ipreview").style.width=this.width-2+"px";
-};
-this.dialogReady=true;
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertImage/pluginMethods.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertImage/pluginMethods.js
deleted file mode 100644
index 40b2f7d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertImage/pluginMethods.js
+++ /dev/null
@@ -1,113 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/InsertImage/pluginMethods.js */
-InsertImage.prototype.show=function(_1){
-if(!this.dialog){
-this.prepareDialog();
-}
-var _2=this.editor;
-if(typeof _1=="undefined"){
-_1=_2.getParentElement();
-if(_1&&_1.tagName.toLowerCase()!="img"){
-_1=null;
-}
-}
-if(_1){
-function getSpecifiedAttribute(_3,_4){
-var a=_3.attributes;
-for(var i=0;i<a.length;i++){
-if(a[i].nodeName==_4&&a[i].specified){
-return a[i].value;
-}
-}
-return "";
-};
-outparam={f_url:_2.stripBaseURL(_1.getAttribute("src",2)),f_alt:_1.alt,f_border:_1.border,f_align:_1.align,f_vert:getSpecifiedAttribute(_1,"vspace"),f_horiz:getSpecifiedAttribute(_1,"hspace"),f_width:_1.width,f_height:_1.height};
-}else{
-outparam={f_url:"",f_alt:"",f_border:"",f_align:"",f_vert:"",f_horiz:"",f_width:"",f_height:""};
-}
-this.image=_1;
-this.dialog.show(outparam);
-};
-InsertImage.prototype.apply=function(){
-var _7=this.dialog.hide();
-if(!_7.f_url){
-return;
-}
-var _8=this.editor;
-var _9=this.image;
-if(!_9){
-if(Xinha.is_ie){
-var _a=_8.getSelection();
-var _b=_8.createRange(_a);
-_8._doc.execCommand("insertimage",false,_7.f_url);
-_9=_b.parentElement();
-if(_9.tagName.toLowerCase()!="img"){
-_9=_9.previousSibling;
-}
-}else{
-_9=document.createElement("img");
-_9.src=_7.f_url;
-_8.insertNodeAtSelection(_9);
-if(!_9.tagName){
-_9=_b.startContainer.firstChild;
-}
-}
-}else{
-_9.src=_7.f_url;
-}
-for(var _c in _7){
-var _d=_7[_c];
-switch(_c){
-case "f_alt":
-if(_d){
-_9.alt=_d;
-}else{
-_9.removeAttribute("alt");
-}
-break;
-case "f_border":
-if(_d){
-_9.border=parseInt(_d||"0");
-}else{
-_9.removeAttribute("border");
-}
-break;
-case "f_align":
-if(_d.value){
-_9.align=_d.value;
-}else{
-_9.removeAttribute("align");
-}
-break;
-case "f_vert":
-if(_d!=""){
-_9.vspace=parseInt(_d||"0");
-}else{
-_9.removeAttribute("vspace");
-}
-break;
-case "f_horiz":
-if(_d!=""){
-_9.hspace=parseInt(_d||"0");
-}else{
-_9.removeAttribute("hspace");
-}
-break;
-case "f_width":
-if(_d){
-_9.width=parseInt(_d||"0");
-}else{
-_9.removeAttribute("width");
-}
-break;
-case "f_height":
-if(_d){
-_9.height=parseInt(_d||"0");
-}else{
-_9.removeAttribute("height");
-}
-break;
-}
-}
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertTable/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertTable/dialog.html
deleted file mode 100644
index 0a7456a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertTable/dialog.html
+++ /dev/null
@@ -1,100 +0,0 @@
-<h1 id="[h1]"><l10n>Insert Table</l10n></h1>

-<form action="" method="get" style="margin-top:10px">

-<div id="[columns_alert]" style="color:red;display:none"><l10n>You must enter a number of columns</l10n></div>

-<div id="[rows_alert]" style="color:red;display:none"><l10n>You must enter a number of rows</l10n></div>

-

-<table border="0" style="padding: 0px; margin: 0px">

-  <tbody>

-  <tr>

-  <td>

-    <l10n>Caption</l10n>:

-  </td>  

-  <td colspan="4">

-    <input type="text" name="[caption]" id="[caption]" style="width:90%" title="_(Caption for the table)" />

-  </td>

-  </tr>

-  <tr>

-    <td style="width: 4em; text-align: right"><l10n>Rows:</l10n></td>

-    <td><input type="text" name="[rows]" id="[rows]" size="5" title="_(Number of rows)"  /></td>

-    <td style="width: 4em; text-align: right">Width:</td>

-    <td><input type="text" name="[width]" id="[width]" size="5" title="_(Width of the table)" /></td>

-    <td><select size="1" name="[unit]" id="[unit]" title="Width unit">

-      <option value="%"               ><l10n>Percent</l10n></option>

-      <option value="px"              ><l10n>Pixels</l10n></option>

-      <option value="em"              >Em</option>

-    </select></td>

-  </tr>

-  <tr>

-    <td style="width: 4em; text-align: right">Cols:</td>

-    <td><input type="text" name="[cols]" id="[cols]" size="5" title="_(Number of columns)"  /></td>

-    <td style="text-align: right"><input type="checkbox" name="[fixed]" id="[fixed]" value="on" /></td>

-    <td colspan="2"><label

-    ><l10n>Fixed width columns</l10n></label></td>

-  </tr>

-  </tbody>

-</table>

-

-<br />

-

-<fieldset id="[layout_fieldset]" style="float: left; margin-left: 10px;">

-<legend><l10n>Layou</l10n>t</legend>

-

-<div class="space"></div>

-

-<div class="fl"><l10n>Alignment:</l10n></div>

-<select size="1" name="[align]" id="[align]"

-  title="Positioning of this table">

-  <option value=""                             ><l10n>Not set</l10n></option>

-  <option value="left"                         ><l10n>Left</l10n></option>

-  <option value="right"                        ><l10n>Right</l10n></option>

-  <option value="texttop"                      ><l10n>Texttop</l10n></option>

-  <option value="absmiddle"                    ><l10n>Absmiddle</l10n></option>

-  <option value="baseline"                     ><l10n>Baseline</l10n></option>

-  <option value="absbottom"                    ><l10n>Absbottom</l10n></option>

-  <option value="bottom"                       ><l10n>Bottom</l10n></option>

-  <option value="middle"                       ><l10n>Middle</option>

-  <option value="top"                          ><l10n>Top</l10n></option>

-</select>

-

-<br />

-

-<div class="fl"><l10n>Border</l10n></div>

-<input type="text" name="[border]" id="[border]" size="2" title="_(Leave empty for no border)" /> <l10n>Pixels</l10n>

-<select size="1" name="[border_style]" id="[border_style]" title="_(Style of the border)">

-  <option value="solid"   >Solid</option>

-  <option value="dotted"  >Dotted</option>

-  <option value="dashed"  >Dashed</option>

-  <option value="double"  >Double</option>

-  <option value="groove"  >Groove</option>

-  <option value="ridge"   >Ridge</option>

-  <option value="inset"   >Inset</option>

-  <option value="outset"  >outset</option>

-</select>

-<input type="text" size="7" id="[border_color]" name="[border_color]"/>

-<br /><l10n>Collapse borders:</l10n> 

-<input type="checkbox" name="[border_collapse]" id="[border_collapse]" value="on" />

-

-<div class="space"></div>

-

-</fieldset>

-

-<fieldset  id="[spacing_fieldset]">

-<legend><l10n>Spacing</l10n></legend>

-

-<div class="space"></div>

-

-<div class="fr"><l10n>Cell spacing:</l10n></div>

-<input type="text" name="[spacing]" id="[spacing]" size="5" title="_(Space between adjacent cells)" />

-

-<br />

-

-<div class="fr"><l10n>Cell padding:</l10n></div>

-<input type="text" name="[padding]" id="[padding]" size="5" title="_(Space between content and border in cell)" />

-

-

-</fieldset>

-  <div class="buttons" style="clear:left">

-  <input type="button" id="[ok]"     value="_(OK)"     />

-  <input type="button" id="[cancel]" value="_(Cancel)" />

-  </div>

-</form>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertTable/insert_table.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertTable/insert_table.html
deleted file mode 100644
index c3aab8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertTable/insert_table.html
+++ /dev/null
@@ -1,157 +0,0 @@
-<html>
-
-<head>
-  <title>Insert Table</title>
-
-<script type="text/javascript" src="../../popups/popup.js"></script>
-<link rel="stylesheet" type="text/css" href="../../popups/popup.css" />
-
-<script type="text/javascript">
-
-window.resizeTo(425, 250);
-
-Xinha = window.opener.Xinha;
-function i18n(str) {
-  return (Xinha._lc(str, 'Xinha'));
-}
-
-function Init() {
-  Xinha = window.opener.Xinha; // load the Xinha plugin and lang file
-  __dlg_translate('Xinha');
-  __dlg_init(null, Xinha.is_ie ? null : {width:425,height:250});
-  // Make sure the translated string appears in the drop down. (for gecko)
-  document.getElementById("f_unit").selectedIndex = 1;
-  document.getElementById("f_unit").selectedIndex = 0;
-  document.getElementById("f_align").selectedIndex = 1;
-  document.getElementById("f_align").selectedIndex = 0;
-  document.getElementById("f_rows").focus();
-}
-
-function onOK() {
-  var required = {
-    "f_rows": i18n("You must enter a number of rows"),
-    "f_cols": i18n("You must enter a number of columns")
-  };
-  for (var i in required) {
-    var el = document.getElementById(i);
-    if (!el.value) {
-      alert(required[i]);
-      el.focus();
-      return false;
-    }
-  }
-  var fields = ["f_rows", "f_cols", "f_width", "f_unit", "f_fixed",
-                "f_align", "f_border", "f_spacing", "f_padding"];
-  var param = new Object();
-  for (var i in fields) {
-    var id = fields[i];
-    var el = document.getElementById(id);
-    param[id] = (el.type == "checkbox") ? el.checked : el.value;
-  }
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-
-</script>
-
-</head>
-
-<body class="dialog" onload="Init()">
-
-<div class="title">Insert Table</div>
-
-<form action="" method="get">
-<table border="0" style="padding: 0px; margin: 0px">
-  <tbody>
-
-  <tr>
-    <td style="width: 4em; text-align: right">Rows:</td>
-    <td><input type="text" name="rows" id="f_rows" size="5" title="Number of rows" value="2" /></td>
-    <td style="width: 4em; text-align: right">Width:</td>
-    <td><input type="text" name="width" id="f_width" size="5" title="Width of the table" value="100" /></td>
-    <td><select size="1" name="unit" id="f_unit" title="Width unit">
-      <option value="%" selected="selected"  >Percent</option>
-      <option value="px"              >Pixels</option>
-      <option value="em"              >Em</option>
-    </select></td>
-  </tr>
-  <tr>
-    <td style="width: 4em; text-align: right">Cols:</td>
-    <td><input type="text" name="cols" id="f_cols" size="5" title="Number of columns" value="4" /></td>
-    <td style="text-align: right"><input type="checkbox" checked="checked" name="fixed" id="f_fixed" value="on" /></td>
-    <td colspan="2"><label for="f_fixed"
-    >Fixed width columns</label></td>
-  </tr>
-  </tbody>
-</table>
-
-<p />
-
-<fieldset style="float: left; margin-left: 5px;">
-<legend>Layout</legend>
-
-<div class="space"></div>
-
-<div class="fl">Alignment:</div>
-<select size="1" name="align" id="f_align"
-  title="Positioning of this table">
-  <option value="" selected="selected"         >Not set</option>
-  <option value="left"                         >Left</option>
-  <option value="right"                        >Right</option>
-  <option value="texttop"                      >Texttop</option>
-  <option value="absmiddle"                    >Absmiddle</option>
-  <option value="baseline"                     >Baseline</option>
-  <option value="absbottom"                    >Absbottom</option>
-  <option value="bottom"                       >Bottom</option>
-  <option value="middle"                       >Middle</option>
-  <option value="top"                          >Top</option>
-</select>
-
-<p />
-
-<div class="fl">Border thickness:</div>
-<input type="text" name="border" id="f_border" size="5" value="1"
-title="Leave empty for no border" />
-<!--
-<p />
-
-<div class="fl">Collapse borders:</div>
-<input type="checkbox" name="collapse" id="f_collapse" />
--->
-<div class="space"></div>
-
-</fieldset>
-
-<fieldset style="float:right; margin-right: 5px;">
-<legend>Spacing</legend>
-
-<div class="space"></div>
-
-<div class="fr">Cell spacing:</div>
-<input type="text" name="spacing" id="f_spacing" size="5" value="1"
-title="Space between adjacent cells" />
-
-<p />
-
-<div class="fr">Cell padding:</div>
-<input type="text" name="padding" id="f_padding" size="5" value="1"
-title="Space between content and border in cell" />
-
-<div class="space"></div>
-
-</fieldset>
-
-<div style="margin-top: 85px; border-top: 1px solid #999; padding: 2px; text-align: right;">
-<button type="button" name="ok" onclick="return onOK();">OK</button>
-<button type="button" name="cancel" onclick="return onCancel();">Cancel</button>
-</div>
-
-</form>
-
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertTable/insert_table.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertTable/insert_table.js
deleted file mode 100644
index 427340d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertTable/insert_table.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/InsertTable/insert_table.js */
-InsertTable._pluginInfo={name:"InsertTable",origin:"Xinha Core",version:"$LastChangedRevision: 1085 $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),developer:"The Xinha Core Developer Team",developer_url:"$HeadURL: http://svn.xinha.org/tags/0.96.1/modules/InsertTable/insert_table.js $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),sponsor:"",sponsor_url:"",license:"htmlArea"};
-function InsertTable(_1){
-this.editor=_1;
-var _2=_1.config;
-var _3=this;
-_1.config.btnList.inserttable[3]=function(){
-_3.show();
-};
-};
-InsertTable.prototype._lc=function(_4){
-return Xinha._lc(_4,"Xinha");
-};
-InsertTable.prototype.onGenerateOnce=function(){
-InsertTable.loadAssets();
-};
-InsertTable.loadAssets=function(){
-var _5=InsertTable;
-if(_5.loading){
-return;
-}
-_5.loading=true;
-Xinha._getback(_editor_url+"modules/InsertTable/dialog.html",function(_6){
-_5.html=_6;
-_5.dialogReady=true;
-});
-Xinha._getback(_editor_url+"modules/InsertTable/pluginMethods.js",function(_7){
-eval(_7);
-_5.methodsReady=true;
-});
-};
-InsertTable.prototype.onUpdateToolbar=function(){
-if(!(InsertTable.dialogReady&&InsertTable.methodsReady)){
-this.editor._toolbarObjects.inserttable.state("enabled",false);
-}else{
-this.onUpdateToolbar=null;
-}
-};
-InsertTable.prototype.prepareDialog=function(){
-var _8=this;
-var _9=this.editor;
-var _a=this.dialog=new Xinha.Dialog(_9,InsertTable.html,"Xinha",{width:400});
-_a.getElementById("ok").onclick=function(){
-_8.apply();
-};
-_a.getElementById("cancel").onclick=function(){
-_8.dialog.hide();
-};
-this.borderColorPicker=new Xinha.colorPicker.InputBinding(_a.getElementById("border_color"));
-this.dialog.onresize=function(){
-this.getElementById("layout_fieldset").style.width=(this.width/2)+50+"px";
-this.getElementById("spacing_fieldset").style.width=(this.width/2)-120+"px";
-};
-this.dialogReady=true;
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertTable/pluginMethods.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertTable/pluginMethods.js
deleted file mode 100644
index 1c898e4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InsertTable/pluginMethods.js
+++ /dev/null
@@ -1,81 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/InsertTable/pluginMethods.js */
-InsertTable.prototype.show=function(_1){
-if(!this.dialog){
-this.prepareDialog();
-}
-var _2=this.editor;
-var _3={"caption":"","rows":"2","cols":"4","width":"100","unit":"%","fixed":"","align":"","border":"1","border_style":"dotted","border_color":"#000000","border_collapse":"on","spacing":"","padding":"5"};
-this.borderColorPicker.setColor("#000000");
-this.dialog.show(_3);
-this.dialog.onresize();
-};
-InsertTable.prototype.apply=function(){
-var _4=this.editor;
-var _5=_4._doc;
-var _6=this.dialog.getValues();
-if(!_6.rows||!_6.cols){
-if(!_6.rows){
-this.dialog.getElementById("rows_alert").style.display="";
-}
-if(!_6.cols){
-this.dialog.getElementById("columns_alert").style.display="";
-}
-return;
-}
-this.dialog.hide();
-var _7=_5.createElement("table");
-for(var _8 in _6){
-var _9=_6[_8];
-if(!_9){
-continue;
-}
-switch(_8){
-case "width":
-_7.style.width=_9+_6.unit.value;
-break;
-case "align":
-_7.align=_9.value;
-break;
-case "border":
-_7.style.border=_9+"px "+_6.border_style.value+" "+_6.border_color;
-break;
-case "border_collapse":
-_7.style.borderCollapse=(_9=="on")?"collapse":"";
-break;
-case "spacing":
-_7.cellSpacing=parseInt(_9,10);
-break;
-case "padding":
-_7.cellPadding=parseInt(_9,10);
-break;
-}
-}
-if(_6.caption){
-var _a=_7.createCaption();
-_a.appendChild(_5.createTextNode(_6.caption));
-}
-var _b=0;
-if(_6.fixed){
-_b=Math.floor(100/parseInt(_6.cols,10));
-}
-var _c=_5.createElement("tbody");
-_7.appendChild(_c);
-for(var i=0;i<_6.rows;++i){
-var tr=_5.createElement("tr");
-_c.appendChild(tr);
-for(var j=0;j<_6.cols;++j){
-var td=_5.createElement("td");
-if(_b&&i===0){
-td.style.width=_b+"%";
-}
-if(_6.border){
-td.style.border=_6.border+"px "+_6.border_style.value+" "+_6.border_color;
-}
-tr.appendChild(td);
-td.appendChild(_5.createTextNode(" "));
-}
-}
-_4.insertNodeAtSelection(_7);
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InternetExplorer/InternetExplorer.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InternetExplorer/InternetExplorer.js
deleted file mode 100644
index 855507b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/InternetExplorer/InternetExplorer.js
+++ /dev/null
@@ -1,477 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/InternetExplorer/InternetExplorer.js */
-InternetExplorer._pluginInfo={name:"Internet Explorer",origin:"Xinha Core",version:"$LastChangedRevision: 1260 $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),developer:"The Xinha Core Developer Team",developer_url:"$HeadURL: http://svn.xinha.org/tags/0.96.1/modules/InternetExplorer/InternetExplorer.js $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),sponsor:"",sponsor_url:"",license:"htmlArea"};
-function InternetExplorer(_1){
-this.editor=_1;
-_1.InternetExplorer=this;
-};
-InternetExplorer.prototype.onKeyPress=function(ev){
-if(this.editor.isShortCut(ev)){
-switch(this.editor.getKey(ev).toLowerCase()){
-case "n":
-this.editor.execCommand("formatblock",false,"<p>");
-Xinha._stopEvent(ev);
-return true;
-break;
-case "1":
-case "2":
-case "3":
-case "4":
-case "5":
-case "6":
-this.editor.execCommand("formatblock",false,"<h"+this.editor.getKey(ev).toLowerCase()+">");
-Xinha._stopEvent(ev);
-return true;
-break;
-}
-}
-switch(ev.keyCode){
-case 8:
-case 46:
-if(this.handleBackspace()){
-Xinha._stopEvent(ev);
-return true;
-}
-break;
-case 9:
-Xinha._stopEvent(ev);
-return true;
-}
-return false;
-};
-InternetExplorer.prototype.handleBackspace=function(){
-var _3=this.editor;
-var _4=_3.getSelection();
-if(_4.type=="Control"){
-var _5=_3.activeElement(_4);
-Xinha.removeFromParent(_5);
-return true;
-}
-var _6=_3.createRange(_4);
-var r2=_6.duplicate();
-r2.moveStart("character",-1);
-var a=r2.parentElement();
-if(a!=_6.parentElement()&&(/^a$/i.test(a.tagName))){
-r2.collapse(true);
-r2.moveEnd("character",1);
-r2.pasteHTML("");
-r2.select();
-return true;
-}
-};
-InternetExplorer.prototype.inwardHtml=function(_9){
-_9=_9.replace(/<(\/?)del(\s|>|\/)/ig,"<$1strike$2");
-_9=_9.replace(/(<script|<!--)/i,"&nbsp;$1");
-_9=_9.replace(/<span[^>]+id="__InsertSpan_Workaround_[a-z]+".*?>([\s\S]*?)<\/span>/i,"$1");
-return _9;
-};
-InternetExplorer.prototype.outwardHtml=function(_a){
-_a=_a.replace(/&nbsp;(\s*)(<script|<!--)/i,"$1$2");
-_a=_a.replace(/<span[^>]+id="__InsertSpan_Workaround_[a-z]+".*?>([\s\S]*?)<\/span>/i,"$1");
-return _a;
-};
-InternetExplorer.prototype.onExecCommand=function(_b,UI,_d){
-switch(_b){
-case "saveas":
-var _e=null;
-var _f=this.editor;
-var _10=document.createElement("iframe");
-_10.src="about:blank";
-_10.style.display="none";
-document.body.appendChild(_10);
-try{
-if(_10.contentDocument){
-_e=_10.contentDocument;
-}else{
-_e=_10.contentWindow.document;
-}
-}
-catch(ex){
-}
-_e.open("text/html","replace");
-var _11="";
-if(_f.config.browserQuirksMode===false){
-var _12="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">";
-}else{
-if(_f.config.browserQuirksMode===true){
-var _12="";
-}else{
-var _12=Xinha.getDoctype(document);
-}
-}
-if(!_f.config.fullPage){
-_11+=_12+"\n";
-_11+="<html>\n";
-_11+="<head>\n";
-_11+="<meta http-equiv=\"Content-Type\" content=\"text/html; charset="+_f.config.charSet+"\">\n";
-if(typeof _f.config.baseHref!="undefined"&&_f.config.baseHref!==null){
-_11+="<base href=\""+_f.config.baseHref+"\"/>\n";
-}
-if(typeof _f.config.pageStyleSheets!=="undefined"){
-for(var i=0;i<_f.config.pageStyleSheets.length;i++){
-if(_f.config.pageStyleSheets[i].length>0){
-_11+="<link rel=\"stylesheet\" type=\"text/css\" href=\""+_f.config.pageStyleSheets[i]+"\">";
-}
-}
-}
-if(_f.config.pageStyle){
-_11+="<style type=\"text/css\">\n"+_f.config.pageStyle+"\n</style>";
-}
-_11+="</head>\n";
-_11+="<body>\n";
-_11+=_f.getEditorContent();
-_11+="</body>\n";
-_11+="</html>";
-}else{
-_11=_f.getEditorContent();
-if(_11.match(Xinha.RE_doctype)){
-_f.setDoctype(RegExp.$1);
-}
-}
-_e.write(_11);
-_e.close();
-_e.execCommand(_b,UI,_d);
-document.body.removeChild(_10);
-return true;
-break;
-case "removeformat":
-var _f=this.editor;
-var sel=_f.getSelection();
-var _15=_f.saveSelection(sel);
-var i,el,els;
-function clean(el){
-if(el.nodeType!=1){
-return;
-}
-el.removeAttribute("style");
-for(var j=0;j<el.childNodes.length;j++){
-clean(el.childNodes[j]);
-}
-if((el.tagName.toLowerCase()=="span"&&!el.attributes.length)||el.tagName.toLowerCase()=="font"){
-el.outerHTML=el.innerHTML;
-}
-};
-if(_f.selectionEmpty(sel)){
-els=_f._doc.body.childNodes;
-for(i=0;i<els.length;i++){
-el=els[i];
-if(el.nodeType!=1){
-continue;
-}
-if(el.tagName.toLowerCase()=="span"){
-newNode=_f.convertNode(el,"div");
-el.parentNode.replaceChild(newNode,el);
-el=newNode;
-}
-clean(el);
-}
-}
-_f._doc.execCommand(_b,UI,_d);
-_f.restoreSelection(_15);
-return true;
-break;
-}
-return false;
-};
-Xinha.prototype.insertNodeAtSelection=function(_1a){
-this.insertHTML(_1a.outerHTML);
-};
-Xinha.prototype.getParentElement=function(sel){
-if(typeof sel=="undefined"){
-sel=this.getSelection();
-}
-var _1c=this.createRange(sel);
-switch(sel.type){
-case "Text":
-var _1d=_1c.parentElement();
-while(true){
-var _1e=_1c.duplicate();
-_1e.moveToElementText(_1d);
-if(_1e.inRange(_1c)){
-break;
-}
-if((_1d.nodeType!=1)||(_1d.tagName.toLowerCase()=="body")){
-break;
-}
-_1d=_1d.parentElement;
-}
-return _1d;
-case "None":
-try{
-return _1c.parentElement();
-}
-catch(e){
-return this._doc.body;
-}
-case "Control":
-return _1c.item(0);
-default:
-return this._doc.body;
-}
-};
-Xinha.prototype.activeElement=function(sel){
-if((sel===null)||this.selectionEmpty(sel)){
-return null;
-}
-if(sel.type.toLowerCase()=="control"){
-return sel.createRange().item(0);
-}else{
-var _20=sel.createRange();
-var _21=this.getParentElement(sel);
-if(_21.innerHTML==_20.htmlText){
-return _21;
-}
-return null;
-}
-};
-Xinha.prototype.selectionEmpty=function(sel){
-if(!sel){
-return true;
-}
-return this.createRange(sel).htmlText==="";
-};
-Xinha.prototype.saveSelection=function(sel){
-return this.createRange(sel?sel:this.getSelection());
-};
-Xinha.prototype.restoreSelection=function(_24){
-if(!_24){
-return;
-}
-var _25=null;
-if(_24.parentElement){
-_25=_24.parentElement();
-}else{
-_25=_24.item(0);
-}
-var _26=this.createRange(this.getSelection());
-var _27=null;
-if(_26.parentElement){
-_27=_26.parentElement();
-}else{
-_27=_26.item(0);
-}
-var _28=function(el){
-for(var _2a=el;_2a;_2a=_2a.parentNode){
-if(_2a.tagName.toLowerCase()=="html"){
-return _2a.parentNode;
-}
-}
-return null;
-};
-if(_24.parentElement&&_28(_25)==_28(_27)){
-if(_26.isEqual(_24)){
-return;
-}
-}
-try{
-_24.select();
-}
-catch(e){
-}
-_26=this.createRange(this.getSelection());
-if(_26.parentElement){
-_27=_26.parentElement();
-}else{
-_27=_26.item(0);
-}
-if(_27!=_25){
-var _2b=this.config.selectWorkaround||"VisibleCue";
-switch(_2b){
-case "SimulateClick":
-case "InsertSpan":
-var _2c=_28(_25);
-var _2d=function(_2e){
-var _2f="";
-for(var _30=0;_30<26;++_30){
-_2f+=String.fromCharCode("a".charCodeAt(0)+_30);
-}
-var _31="";
-for(var _30=0;_30<_2e;++_30){
-_31+=_2f.substr(Math.floor(Math.random()*_2f.length+1),1);
-}
-return _31;
-};
-var _32=1;
-var _33="__InsertSpan_Workaround_"+_2d(_32);
-while(_2c.getElementById(_33)){
-_32+=1;
-_33="__InsertSpan_Workaround_"+_2d(_32);
-}
-_24.pasteHTML("<span id=\""+_33+"\"></span>");
-var _34=_2c.getElementById(_33);
-_24.moveToElementText(_34);
-_24.select();
-break;
-case "JustificationHack":
-var _35=String.fromCharCode(1);
-_24.pasteHTML(_35);
-_24.findText(_35,-1);
-_24.select();
-_24.execCommand("JustifyNone");
-_24.pasteHTML("");
-break;
-case "VisibleCue":
-default:
-var _35=String.fromCharCode(1);
-_24.pasteHTML(_35);
-_24.findText(_35,-1);
-_24.select();
-}
-}
-};
-Xinha.prototype.selectNodeContents=function(_36,_37){
-this.focusEditor();
-this.forceRedraw();
-var _38;
-var _39=typeof _37=="undefined"?true:false;
-if(_39&&_36.tagName&&_36.tagName.toLowerCase().match(/table|img|input|select|textarea/)){
-_38=this._doc.body.createControlRange();
-_38.add(_36);
-}else{
-_38=this._doc.body.createTextRange();
-if(3==_36.nodeType){
-if(_36.parentNode){
-_38.moveToElementText(_36.parentNode);
-}else{
-_38.moveToElementText(this._doc.body);
-}
-var _3a=this._doc.body.createTextRange();
-var _3b=0;
-var _3c=_36.previousSibling;
-for(;_3c&&(1!=_3c.nodeType);_3c=_3c.previousSibling){
-if(3==_3c.nodeType){
-_3b+=_3c.nodeValue.length-_3c.nodeValue.split("\r").length-1;
-}
-}
-if(_3c&&(1==_3c.nodeType)){
-_3a.moveToElementText(_3c);
-_38.setEndPoint("StartToEnd",_3a);
-}
-if(_3b){
-_38.moveStart("character",_3b);
-}
-_3b=0;
-_3c=_36.nextSibling;
-for(;_3c&&(1!=_3c.nodeType);_3c=_3c.nextSibling){
-if(3==_3c.nodeType){
-_3b+=_3c.nodeValue.length-_3c.nodeValue.split("\r").length-1;
-if(!_3c.nextSibling){
-_3b+=1;
-}
-}
-}
-if(_3c&&(1==_3c.nodeType)){
-_3a.moveToElementText(_3c);
-_38.setEndPoint("EndToStart",_3a);
-}
-if(_3b){
-_38.moveEnd("character",-_3b);
-}
-if(!_36.nextSibling){
-_38.moveEnd("character",-1);
-}
-}else{
-_38.moveToElementText(_36);
-}
-}
-if(typeof _37!="undefined"){
-_38.collapse(_37);
-if(!_37){
-_38.moveStart("character",-1);
-_38.moveEnd("character",-1);
-}
-}
-_38.select();
-};
-Xinha.prototype.insertHTML=function(_3d){
-this.focusEditor();
-var sel=this.getSelection();
-var _3f=this.createRange(sel);
-_3f.pasteHTML(_3d);
-};
-Xinha.prototype.getSelectedHTML=function(){
-var sel=this.getSelection();
-if(this.selectionEmpty(sel)){
-return "";
-}
-var _41=this.createRange(sel);
-if(_41.htmlText){
-return _41.htmlText;
-}else{
-if(_41.length>=1){
-return _41.item(0).outerHTML;
-}
-}
-return "";
-};
-Xinha.prototype.getSelection=function(){
-return this._doc.selection;
-};
-Xinha.prototype.createRange=function(sel){
-if(!sel){
-sel=this.getSelection();
-}
-return sel.createRange();
-};
-Xinha.prototype.isKeyEvent=function(_43){
-return _43.type=="keydown";
-};
-Xinha.prototype.getKey=function(_44){
-return String.fromCharCode(_44.keyCode);
-};
-Xinha.getOuterHTML=function(_45){
-return _45.outerHTML;
-};
-Xinha.cc=String.fromCharCode(8201);
-Xinha.prototype.setCC=function(_46){
-var cc=Xinha.cc;
-if(_46=="textarea"){
-var ta=this._textArea;
-var pos=document.selection.createRange();
-pos.collapse();
-pos.text=cc;
-var _4a=ta.value.indexOf(cc);
-var _4b=ta.value.substring(0,_4a);
-var _4c=ta.value.substring(_4a+cc.length,ta.value.length);
-if(_4c.match(/^[^<]*>/)){
-var _4d=_4c.indexOf(">")+1;
-ta.value=_4b+_4c.substring(0,_4d)+cc+_4c.substring(_4d,_4c.length);
-}else{
-ta.value=_4b+cc+_4c;
-}
-ta.value=ta.value.replace(new RegExp("(&[^"+cc+"]*?)("+cc+")([^"+cc+"]*?;)"),"$1$3$2");
-ta.value=ta.value.replace(new RegExp("(<script[^>]*>[^"+cc+"]*?)("+cc+")([^"+cc+"]*?</script>)"),"$1$3$2");
-ta.value=ta.value.replace(new RegExp("^([^"+cc+"]*)("+cc+")([^"+cc+"]*<body[^>]*>)(.*?)"),"$1$3$2$4");
-}else{
-var sel=this.getSelection();
-var r=sel.createRange();
-if(sel.type=="Control"){
-var _50=r.item(0);
-_50.outerHTML+=cc;
-}else{
-r.collapse();
-r.text=cc;
-}
-}
-};
-Xinha.prototype.findCC=function(_51){
-var _52=(_51=="textarea")?this._textArea:this._doc.body;
-range=_52.createTextRange();
-if(range.findText(escape(Xinha.cc))){
-range.select();
-range.text="";
-range.select();
-}
-if(range.findText(Xinha.cc)){
-range.select();
-range.text="";
-range.select();
-}
-if(_51=="textarea"){
-this._textArea.focus();
-}
-};
-Xinha.getDoctype=function(doc){
-return (doc.compatMode=="CSS1Compat"&&Xinha.ie_version<8)?"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">":"";
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Opera/Opera.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Opera/Opera.js
deleted file mode 100644
index ce08b45..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/Opera/Opera.js
+++ /dev/null
@@ -1,471 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/Opera/Opera.js */
-Opera._pluginInfo={name:"Opera",origin:"Xinha Core",version:"$LastChangedRevision: 1084 $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),developer:"The Xinha Core Developer Team",developer_url:"$HeadURL: http://svn.xinha.org/tags/0.96.1/modules/Opera/Opera.js $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),sponsor:"Gogo Internet Services Limited",sponsor_url:"http://www.gogo.co.nz/",license:"htmlArea"};
-function Opera(_1){
-this.editor=_1;
-_1.Opera=this;
-};
-Opera.prototype.onKeyPress=function(ev){
-var _3=this.editor;
-var s=_3.getSelection();
-if(_3.isShortCut(ev)){
-switch(_3.getKey(ev).toLowerCase()){
-case "z":
-if(_3._unLink&&_3._unlinkOnUndo){
-Xinha._stopEvent(ev);
-_3._unLink();
-_3.updateToolbar();
-return true;
-}
-break;
-case "a":
-sel=_3.getSelection();
-sel.removeAllRanges();
-range=_3.createRange();
-range.selectNodeContents(_3._doc.body);
-sel.addRange(range);
-Xinha._stopEvent(ev);
-return true;
-break;
-case "v":
-if(!_3.config.htmlareaPaste){
-return true;
-}
-break;
-}
-}
-switch(_3.getKey(ev)){
-case " ":
-var _5=function(_6,_7){
-var _8=_6.nextSibling;
-if(typeof _7=="string"){
-_7=_3._doc.createElement(_7);
-}
-var a=_6.parentNode.insertBefore(_7,_8);
-Xinha.removeFromParent(_6);
-a.appendChild(_6);
-_8.data=" "+_8.data;
-s.collapse(_8,1);
-_3._unLink=function(){
-var t=a.firstChild;
-a.removeChild(t);
-a.parentNode.insertBefore(t,a);
-Xinha.removeFromParent(a);
-_3._unLink=null;
-_3._unlinkOnUndo=false;
-};
-_3._unlinkOnUndo=true;
-return a;
-};
-if(_3.config.convertUrlsToLinks&&s&&s.isCollapsed&&s.anchorNode.nodeType==3&&s.anchorNode.data.length>3&&s.anchorNode.data.indexOf(".")>=0){
-var _b=s.anchorNode.data.substring(0,s.anchorOffset).search(/\S{4,}$/);
-if(_b==-1){
-break;
-}
-if(_3._getFirstAncestor(s,"a")){
-break;
-}
-var _c=s.anchorNode.data.substring(0,s.anchorOffset).replace(/^.*?(\S*)$/,"$1");
-var _d=_c.match(Xinha.RE_email);
-if(_d){
-var _e=s.anchorNode;
-var _f=_e.splitText(s.anchorOffset);
-var _10=_e.splitText(_b);
-_5(_10,"a").href="mailto:"+_d[0];
-break;
-}
-RE_date=/([0-9]+\.)+/;
-RE_ip=/(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/;
-var _11=_c.match(Xinha.RE_url);
-if(_11){
-if(RE_date.test(_c)){
-break;
-}
-var _12=s.anchorNode;
-var _13=_12.splitText(s.anchorOffset);
-var _14=_12.splitText(_b);
-_5(_14,"a").href=(_11[1]?_11[1]:"http://")+_11[2];
-break;
-}
-}
-break;
-}
-switch(ev.keyCode){
-case 27:
-if(_3._unLink){
-_3._unLink();
-Xinha._stopEvent(ev);
-}
-break;
-break;
-case 8:
-case 46:
-if(!ev.shiftKey&&this.handleBackspace()){
-Xinha._stopEvent(ev);
-}
-default:
-_3._unlinkOnUndo=false;
-if(s.anchorNode&&s.anchorNode.nodeType==3){
-var a=_3._getFirstAncestor(s,"a");
-if(!a){
-break;
-}
-if(!a._updateAnchTimeout){
-if(s.anchorNode.data.match(Xinha.RE_email)&&a.href.match("mailto:"+s.anchorNode.data.trim())){
-var _16=s.anchorNode;
-var _17=function(){
-a.href="mailto:"+_16.data.trim();
-a._updateAnchTimeout=setTimeout(_17,250);
-};
-a._updateAnchTimeout=setTimeout(_17,1000);
-break;
-}
-var m=s.anchorNode.data.match(Xinha.RE_url);
-if(m&&a.href.match(new RegExp("http(s)?://"+Xinha.escapeStringForRegExp(s.anchorNode.data.trim())))){
-var _19=s.anchorNode;
-var _1a=function(){
-m=_19.data.match(Xinha.RE_url);
-if(m){
-a.href=(m[1]?m[1]:"http://")+m[2];
-}
-a._updateAnchTimeout=setTimeout(_1a,250);
-};
-a._updateAnchTimeout=setTimeout(_1a,1000);
-}
-}
-}
-break;
-}
-return false;
-};
-Opera.prototype.handleBackspace=function(){
-var _1b=this.editor;
-setTimeout(function(){
-var sel=_1b.getSelection();
-var _1d=_1b.createRange(sel);
-var SC=_1d.startContainer;
-var SO=_1d.startOffset;
-var EC=_1d.endContainer;
-var EO=_1d.endOffset;
-var _22=SC.nextSibling;
-if(SC.nodeType==3){
-SC=SC.parentNode;
-}
-if(!(/\S/.test(SC.tagName))){
-var p=document.createElement("p");
-while(SC.firstChild){
-p.appendChild(SC.firstChild);
-}
-SC.parentNode.insertBefore(p,SC);
-Xinha.removeFromParent(SC);
-var r=_1d.cloneRange();
-r.setStartBefore(_22);
-r.setEndAfter(_22);
-r.extractContents();
-sel.removeAllRanges();
-sel.addRange(r);
-}
-},10);
-};
-Opera.prototype.inwardHtml=function(_25){
-_25=_25.replace(/<(\/?)del(\s|>|\/)/ig,"<$1strike$2");
-return _25;
-};
-Opera.prototype.outwardHtml=function(_26){
-return _26;
-};
-Opera.prototype.onExecCommand=function(_27,UI,_29){
-switch(_27){
-case "removeformat":
-var _2a=this.editor;
-var sel=_2a.getSelection();
-var _2c=_2a.saveSelection(sel);
-var _2d=_2a.createRange(sel);
-var els=_2a._doc.body.getElementsByTagName("*");
-var _2f=(_2d.startContainer.nodeType==1)?_2d.startContainer:_2d.startContainer.parentNode;
-var i,el;
-if(sel.isCollapsed){
-_2d.selectNodeContents(_2a._doc.body);
-}
-for(i=0;i<els.length;i++){
-el=els[i];
-if(_2d.isPointInRange(el,0)||(els[i]==_2f&&_2d.startOffset==0)){
-el.removeAttribute("style");
-}
-}
-this.editor._doc.execCommand(_27,UI,_29);
-_2a.restoreSelection(_2c);
-return true;
-break;
-}
-return false;
-};
-Opera.prototype.onMouseDown=function(ev){
-};
-Xinha.prototype.insertNodeAtSelection=function(_33){
-if(_33.ownerDocument!=this._doc){
-try{
-_33=this._doc.adoptNode(_33);
-}
-catch(e){
-}
-}
-this.focusEditor();
-var sel=this.getSelection();
-var _35=this.createRange(sel);
-_35.deleteContents();
-var _36=_35.startContainer;
-var pos=_35.startOffset;
-var _38=_33;
-sel.removeAllRanges();
-switch(_36.nodeType){
-case 3:
-if(_33.nodeType==3){
-_36.insertData(pos,_33.data);
-_35=this.createRange();
-_35.setEnd(_36,pos+_33.length);
-_35.setStart(_36,pos+_33.length);
-sel.addRange(_35);
-}else{
-_36=_36.splitText(pos);
-if(_33.nodeType==11){
-_38=_38.firstChild;
-}
-_36.parentNode.insertBefore(_33,_36);
-this.selectNodeContents(_38);
-this.updateToolbar();
-}
-break;
-case 1:
-if(_33.nodeType==11){
-_38=_38.firstChild;
-}
-_36.insertBefore(_33,_36.childNodes[pos]);
-this.selectNodeContents(_38);
-this.updateToolbar();
-break;
-}
-};
-Xinha.prototype.getParentElement=function(sel){
-if(typeof sel=="undefined"){
-sel=this.getSelection();
-}
-var _3a=this.createRange(sel);
-try{
-var p=_3a.commonAncestorContainer;
-if(!_3a.collapsed&&_3a.startContainer==_3a.endContainer&&_3a.startOffset-_3a.endOffset<=1&&_3a.startContainer.hasChildNodes()){
-p=_3a.startContainer.childNodes[_3a.startOffset];
-}
-while(p.nodeType==3){
-p=p.parentNode;
-}
-return p;
-}
-catch(ex){
-return null;
-}
-};
-Xinha.prototype.activeElement=function(sel){
-if((sel===null)||this.selectionEmpty(sel)){
-return null;
-}
-if(!sel.isCollapsed){
-if(sel.anchorNode.childNodes.length>sel.anchorOffset&&sel.anchorNode.childNodes[sel.anchorOffset].nodeType==1){
-return sel.anchorNode.childNodes[sel.anchorOffset];
-}else{
-if(sel.anchorNode.nodeType==1){
-return sel.anchorNode;
-}else{
-return null;
-}
-}
-}
-return null;
-};
-Xinha.prototype.selectionEmpty=function(sel){
-if(!sel){
-return true;
-}
-if(typeof sel.isCollapsed!="undefined"){
-return sel.isCollapsed;
-}
-return true;
-};
-Xinha.prototype.saveSelection=function(){
-return this.createRange(this.getSelection()).cloneRange();
-};
-Xinha.prototype.restoreSelection=function(_3e){
-var sel=this.getSelection();
-sel.removeAllRanges();
-sel.addRange(_3e);
-};
-Xinha.prototype.selectNodeContents=function(_40,_41){
-this.focusEditor();
-this.forceRedraw();
-var _42;
-var _43=typeof _41=="undefined"?true:false;
-var sel=this.getSelection();
-_42=this._doc.createRange();
-if(_43&&_40.tagName&&_40.tagName.toLowerCase().match(/table|img|input|textarea|select/)){
-_42.selectNode(_40);
-}else{
-_42.selectNodeContents(_40);
-}
-sel.removeAllRanges();
-sel.addRange(_42);
-if(typeof _41!="undefined"){
-if(_41){
-sel.collapse(_42.startContainer,_42.startOffset);
-}else{
-sel.collapse(_42.endContainer,_42.endOffset);
-}
-}
-};
-Xinha.prototype.insertHTML=function(_45){
-var sel=this.getSelection();
-var _47=this.createRange(sel);
-this.focusEditor();
-var _48=this._doc.createDocumentFragment();
-var div=this._doc.createElement("div");
-div.innerHTML=_45;
-while(div.firstChild){
-_48.appendChild(div.firstChild);
-}
-var _4a=this.insertNodeAtSelection(_48);
-};
-Xinha.prototype.getSelectedHTML=function(){
-var sel=this.getSelection();
-if(sel.isCollapsed){
-return "";
-}
-var _4c=this.createRange(sel);
-return Xinha.getHTML(_4c.cloneContents(),false,this);
-};
-Xinha.prototype.getSelection=function(){
-var sel=this._iframe.contentWindow.getSelection();
-if(sel&&sel.focusNode&&sel.focusNode.tagName&&sel.focusNode.tagName=="HTML"){
-var bod=this._doc.getElementsByTagName("body")[0];
-var rng=this.createRange();
-rng.selectNodeContents(bod);
-sel.removeAllRanges();
-sel.addRange(rng);
-sel.collapseToEnd();
-}
-return sel;
-};
-Xinha.prototype.createRange=function(sel){
-this.activateEditor();
-if(typeof sel!="undefined"){
-try{
-return sel.getRangeAt(0);
-}
-catch(ex){
-return this._doc.createRange();
-}
-}else{
-return this._doc.createRange();
-}
-};
-Xinha.prototype.isKeyEvent=function(_51){
-return _51.type=="keypress";
-};
-Xinha.prototype.getKey=function(_52){
-return String.fromCharCode(_52.charCode);
-};
-Xinha.getOuterHTML=function(_53){
-return (new XMLSerializer()).serializeToString(_53);
-};
-Xinha.cc=String.fromCharCode(8286);
-Xinha.prototype.setCC=function(_54){
-var cc=Xinha.cc;
-try{
-if(_54=="textarea"){
-var ta=this._textArea;
-var _57=ta.selectionStart;
-var _58=ta.value.substring(0,_57);
-var _59=ta.value.substring(_57,ta.value.length);
-if(_59.match(/^[^<]*>/)){
-var _5a=_59.indexOf(">")+1;
-ta.value=_58+_59.substring(0,_5a)+cc+_59.substring(_5a,_59.length);
-}else{
-ta.value=_58+cc+_59;
-}
-ta.value=ta.value.replace(new RegExp("(&[^"+cc+"]*?)("+cc+")([^"+cc+"]*?;)"),"$1$3$2");
-ta.value=ta.value.replace(new RegExp("(<script[^>]*>[^"+cc+"]*?)("+cc+")([^"+cc+"]*?</script>)"),"$1$3$2");
-ta.value=ta.value.replace(new RegExp("^([^"+cc+"]*)("+cc+")([^"+cc+"]*<body[^>]*>)(.*?)"),"$1$3$2$4");
-ta.value=ta.value.replace(cc,"<span id=\"XinhaOperaCaretMarker\">MARK</span>");
-}else{
-var sel=this.getSelection();
-var _5c=this._doc.createElement("span");
-_5c.id="XinhaOperaCaretMarker";
-sel.getRangeAt(0).insertNode(_5c);
-}
-}
-catch(e){
-}
-};
-Xinha.prototype.findCC=function(_5d){
-if(_5d=="textarea"){
-var ta=this._textArea;
-var pos=ta.value.search(/(<span\s+id="XinhaOperaCaretMarker"\s*\/?>((\s|(MARK))*<\/span>)?)/);
-if(pos==-1){
-return;
-}
-var cc=RegExp.$1;
-var end=pos+cc.length;
-var _62=ta.value.substring(0,pos);
-var _63=ta.value.substring(end,ta.value.length);
-ta.value=_62;
-ta.scrollTop=ta.scrollHeight;
-var _64=ta.scrollTop;
-ta.value+=_63;
-ta.setSelectionRange(pos,pos);
-ta.focus();
-ta.scrollTop=_64;
-}else{
-var _65=this._doc.getElementById("XinhaOperaCaretMarker");
-if(_65){
-this.focusEditor();
-var rng=this.createRange();
-rng.selectNode(_65);
-var sel=this.getSelection();
-sel.addRange(rng);
-sel.collapseToStart();
-this.scrollToElement(_65);
-_65.parentNode.removeChild(_65);
-return;
-}
-}
-};
-Xinha.getDoctype=function(doc){
-var d="";
-if(doc.doctype){
-d+="<!DOCTYPE "+doc.doctype.name+" PUBLIC ";
-d+=doc.doctype.publicId?"\""+doc.doctype.publicId+"\"":"";
-d+=doc.doctype.systemId?" \""+doc.doctype.systemId+"\"":"";
-d+=">";
-}
-return d;
-};
-Xinha.prototype._standardInitIframe=Xinha.prototype.initIframe;
-Xinha.prototype.initIframe=function(){
-if(!this._iframeLoadDone){
-if(this._iframe.contentWindow&&this._iframe.contentWindow.xinhaReadyToRoll){
-this._iframeLoadDone=true;
-this._standardInitIframe();
-}else{
-var _6a=this;
-setTimeout(function(){
-_6a.initIframe();
-},5);
-}
-}
-};
-Xinha._addEventOperaOrig=Xinha._addEvent;
-Xinha._addEvent=function(el,_6c,_6d){
-if(el.tagName&&el.tagName.toLowerCase()=="select"&&_6c=="change"){
-return Xinha.addDom0Event(el,_6c,_6d);
-}
-return Xinha._addEventOperaOrig(el,_6c,_6d);
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/WebKit/WebKit.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/WebKit/WebKit.js
deleted file mode 100644
index 6e37e1a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/modules/WebKit/WebKit.js
+++ /dev/null
@@ -1,485 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/WebKit/WebKit.js */
-WebKit._pluginInfo={name:"WebKit",origin:"Xinha Core",version:"$LastChangedRevision: 1146 $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),developer:"The Xinha Core Developer Team",developer_url:"$HeadURL: http://svn.xinha.org/tags/0.96.1/modules/WebKit/WebKit.js $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),sponsor:"",sponsor_url:"",license:"htmlArea"};
-function WebKit(_1){
-this.editor=_1;
-_1.WebKit=this;
-};
-WebKit.prototype.onKeyPress=function(ev){
-var _3=this.editor;
-var s=_3.getSelection();
-if(_3.isShortCut(ev)){
-switch(_3.getKey(ev).toLowerCase()){
-case "z":
-if(_3._unLink&&_3._unlinkOnUndo){
-Xinha._stopEvent(ev);
-_3._unLink();
-_3.updateToolbar();
-return true;
-}
-break;
-case "a":
-break;
-case "v":
-if(!_3.config.htmlareaPaste){
-return true;
-}
-break;
-}
-}
-switch(_3.getKey(ev)){
-case " ":
-var _5=function(_6,_7){
-var _8=_6.nextSibling;
-if(typeof _7=="string"){
-_7=_3._doc.createElement(_7);
-}
-var a=_6.parentNode.insertBefore(_7,_8);
-Xinha.removeFromParent(_6);
-a.appendChild(_6);
-_8.data=" "+_8.data;
-s.collapse(_8,1);
-_3._unLink=function(){
-var t=a.firstChild;
-a.removeChild(t);
-a.parentNode.insertBefore(t,a);
-Xinha.removeFromParent(a);
-_3._unLink=null;
-_3._unlinkOnUndo=false;
-};
-_3._unlinkOnUndo=true;
-return a;
-};
-if(_3.config.convertUrlsToLinks&&s&&s.isCollapsed&&s.anchorNode.nodeType==3&&s.anchorNode.data.length>3&&s.anchorNode.data.indexOf(".")>=0){
-var _b=s.anchorNode.data.substring(0,s.anchorOffset).search(/\S{4,}$/);
-if(_b==-1){
-break;
-}
-if(_3._getFirstAncestor(s,"a")){
-break;
-}
-var _c=s.anchorNode.data.substring(0,s.anchorOffset).replace(/^.*?(\S*)$/,"$1");
-var _d=_c.match(Xinha.RE_email);
-if(_d){
-var _e=s.anchorNode;
-var _f=_e.splitText(s.anchorOffset);
-var _10=_e.splitText(_b);
-_5(_10,"a").href="mailto:"+_d[0];
-break;
-}
-RE_date=/([0-9]+\.)+/;
-RE_ip=/(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/;
-var _11=_c.match(Xinha.RE_url);
-if(_11){
-if(RE_date.test(_c)){
-break;
-}
-var _12=s.anchorNode;
-var _13=_12.splitText(s.anchorOffset);
-var _14=_12.splitText(_b);
-_5(_14,"a").href=(_11[1]?_11[1]:"http://")+_11[2];
-break;
-}
-}
-break;
-}
-switch(ev.keyCode){
-case 13:
-if(ev.shiftKey){
-}
-break;
-case 27:
-if(_3._unLink){
-_3._unLink();
-Xinha._stopEvent(ev);
-}
-break;
-case 8:
-case 46:
-if(!ev.shiftKey&&this.handleBackspace()){
-Xinha._stopEvent(ev);
-}
-break;
-default:
-_3._unlinkOnUndo=false;
-if(s.anchorNode&&s.anchorNode.nodeType==3){
-var a=_3._getFirstAncestor(s,"a");
-if(!a){
-break;
-}
-if(!a._updateAnchTimeout){
-if(s.anchorNode.data.match(Xinha.RE_email)&&a.href.match("mailto:"+s.anchorNode.data.trim())){
-var _16=s.anchorNode;
-var _17=function(){
-a.href="mailto:"+_16.data.trim();
-a._updateAnchTimeout=setTimeout(_17,250);
-};
-a._updateAnchTimeout=setTimeout(_17,1000);
-break;
-}
-var m=s.anchorNode.data.match(Xinha.RE_url);
-if(m&&a.href.match(new RegExp("http(s)?://"+Xinha.escapeStringForRegExp(s.anchorNode.data.trim())))){
-var _19=s.anchorNode;
-var _1a=function(){
-m=_19.data.match(Xinha.RE_url);
-if(m){
-a.href=(m[1]?m[1]:"http://")+m[2];
-}
-a._updateAnchTimeout=setTimeout(_1a,250);
-};
-a._updateAnchTimeout=setTimeout(_1a,1000);
-}
-}
-}
-break;
-}
-return false;
-};
-WebKit.prototype.handleBackspace=function(){
-var _1b=this.editor;
-setTimeout(function(){
-var sel=_1b.getSelection();
-var _1d=_1b.createRange(sel);
-var SC=_1d.startContainer;
-var SO=_1d.startOffset;
-var EC=_1d.endContainer;
-var EO=_1d.endOffset;
-var _22=SC.nextSibling;
-if(SC.nodeType==3){
-SC=SC.parentNode;
-}
-if(!(/\S/.test(SC.tagName))){
-var p=document.createElement("p");
-while(SC.firstChild){
-p.appendChild(SC.firstChild);
-}
-SC.parentNode.insertBefore(p,SC);
-Xinha.removeFromParent(SC);
-var r=_1d.cloneRange();
-r.setStartBefore(_22);
-r.setEndAfter(_22);
-r.extractContents();
-sel.removeAllRanges();
-sel.addRange(r);
-}
-},10);
-};
-WebKit.prototype.inwardHtml=function(_25){
-return _25;
-};
-WebKit.prototype.outwardHtml=function(_26){
-return _26;
-};
-WebKit.prototype.onExecCommand=function(_27,UI,_29){
-this.editor._doc.execCommand("styleWithCSS",false,false);
-switch(_27){
-case "paste":
-alert(Xinha._lc("The Paste button does not work in the Safari browser for security reasons. Press CTRL-V on your keyboard to paste directly."));
-return true;
-break;
-case "removeformat":
-var _2a=this.editor;
-var sel=_2a.getSelection();
-var _2c=_2a.saveSelection(sel);
-var _2d=_2a.createRange(sel);
-var els=_2a._doc.getElementsByTagName("*");
-els=Xinha.collectionToArray(els);
-var _2f=(_2d.startContainer.nodeType==1)?_2d.startContainer:_2d.startContainer.parentNode;
-var i,el,_32,_33,_34,r2=_2a._doc.createRange();
-function clean(el){
-if(el.nodeType!=1){
-return;
-}
-el.removeAttribute("style");
-for(var j=0;j<el.childNodes.length;j++){
-clean(el.childNodes[j]);
-}
-if((el.tagName.toLowerCase()=="span"&&!el.attributes.length)||el.tagName.toLowerCase()=="font"){
-r2.selectNodeContents(el);
-_33=r2.extractContents();
-while(_33.firstChild){
-_34=_33.removeChild(_33.firstChild);
-el.parentNode.insertBefore(_34,el);
-}
-el.parentNode.removeChild(el);
-}
-};
-if(sel.isCollapsed){
-els=_2a._doc.body.childNodes;
-for(i=0;i<els.length;i++){
-el=els[i];
-if(el.nodeType!=1){
-continue;
-}
-if(el.tagName.toLowerCase()=="span"){
-_32=_2a.convertNode(el,"div");
-el.parentNode.replaceChild(_32,el);
-el=_32;
-}
-clean(el);
-}
-}else{
-for(i=0;i<els.length;i++){
-el=els[i];
-if(_2d.isPointInRange(el,0)||(els[i]==_2f&&_2d.startOffset==0)){
-clean(el);
-}
-}
-}
-r2.detach();
-_2a.restoreSelection(_2c);
-return true;
-break;
-}
-return false;
-};
-WebKit.prototype.onMouseDown=function(ev){
-if(ev.target.tagName.toLowerCase()=="hr"||ev.target.tagName.toLowerCase()=="img"){
-this.editor.selectNodeContents(ev.target);
-}
-};
-Xinha.prototype.insertNodeAtSelection=function(_39){
-var sel=this.getSelection();
-var _3b=this.createRange(sel);
-sel.removeAllRanges();
-_3b.deleteContents();
-var _3c=_3b.startContainer;
-var pos=_3b.startOffset;
-var _3e=_39;
-switch(_3c.nodeType){
-case 3:
-if(_39.nodeType==3){
-_3c.insertData(pos,_39.data);
-_3b=this.createRange();
-_3b.setEnd(_3c,pos+_39.length);
-_3b.setStart(_3c,pos+_39.length);
-sel.addRange(_3b);
-}else{
-_3c=_3c.splitText(pos);
-if(_39.nodeType==11){
-_3e=_3e.firstChild;
-}
-_3c.parentNode.insertBefore(_39,_3c);
-this.selectNodeContents(_3e);
-this.updateToolbar();
-}
-break;
-case 1:
-if(_39.nodeType==11){
-_3e=_3e.firstChild;
-}
-_3c.insertBefore(_39,_3c.childNodes[pos]);
-this.selectNodeContents(_3e);
-this.updateToolbar();
-break;
-}
-};
-Xinha.prototype.getParentElement=function(sel){
-if(typeof sel=="undefined"){
-sel=this.getSelection();
-}
-var _40=this.createRange(sel);
-try{
-var p=_40.commonAncestorContainer;
-if(!_40.collapsed&&_40.startContainer==_40.endContainer&&_40.startOffset-_40.endOffset<=1&&_40.startContainer.hasChildNodes()){
-p=_40.startContainer.childNodes[_40.startOffset];
-}
-while(p.nodeType==3){
-p=p.parentNode;
-}
-return p;
-}
-catch(ex){
-return null;
-}
-};
-Xinha.prototype.activeElement=function(sel){
-if((sel===null)||this.selectionEmpty(sel)){
-return null;
-}
-if(!sel.isCollapsed){
-if(sel.anchorNode.childNodes.length>sel.anchorOffset&&sel.anchorNode.childNodes[sel.anchorOffset].nodeType==1){
-return sel.anchorNode.childNodes[sel.anchorOffset];
-}else{
-if(sel.anchorNode.nodeType==1){
-return sel.anchorNode;
-}else{
-return null;
-}
-}
-}
-return null;
-};
-Xinha.prototype.selectionEmpty=function(sel){
-if(!sel){
-return true;
-}
-if(typeof sel.isCollapsed!="undefined"){
-return sel.isCollapsed;
-}
-return true;
-};
-Xinha.prototype.saveSelection=function(){
-return this.createRange(this.getSelection()).cloneRange();
-};
-Xinha.prototype.restoreSelection=function(_44){
-var sel=this.getSelection();
-sel.removeAllRanges();
-sel.addRange(_44);
-};
-Xinha.prototype.selectNodeContents=function(_46,_47){
-this.focusEditor();
-this.forceRedraw();
-var _48;
-var _49=typeof _47=="undefined"?true:false;
-var sel=this.getSelection();
-_48=this._doc.createRange();
-if(_49&&_46.tagName&&_46.tagName.toLowerCase().match(/table|img|input|textarea|select/)){
-_48.selectNode(_46);
-}else{
-_48.selectNodeContents(_46);
-}
-sel.removeAllRanges();
-sel.addRange(_48);
-if(typeof _47!="undefined"){
-if(_47){
-sel.collapse(_48.startContainer,_48.startOffset);
-}else{
-sel.collapse(_48.endContainer,_48.endOffset);
-}
-}
-};
-Xinha.prototype.insertHTML=function(_4b){
-var sel=this.getSelection();
-var _4d=this.createRange(sel);
-this.focusEditor();
-var _4e=this._doc.createDocumentFragment();
-var div=this._doc.createElement("div");
-div.innerHTML=_4b;
-while(div.firstChild){
-_4e.appendChild(div.firstChild);
-}
-var _50=this.insertNodeAtSelection(_4e);
-};
-Xinha.prototype.getSelectedHTML=function(){
-var sel=this.getSelection();
-if(sel.isCollapsed){
-return "";
-}
-var _52=this.createRange(sel);
-if(_52){
-return Xinha.getHTML(_52.cloneContents(),false,this);
-}else{
-return "";
-}
-};
-Xinha.prototype.getSelection=function(){
-return this._iframe.contentWindow.getSelection();
-};
-Xinha.prototype.createRange=function(sel){
-this.activateEditor();
-if(typeof sel!="undefined"){
-try{
-return sel.getRangeAt(0);
-}
-catch(ex){
-return this._doc.createRange();
-}
-}else{
-return this._doc.createRange();
-}
-};
-Xinha.prototype.isKeyEvent=function(_54){
-return _54.type=="keydown";
-};
-Xinha.prototype.getKey=function(_55){
-var key=String.fromCharCode(parseInt(_55.keyIdentifier.replace(/^U\+/,""),16));
-if(_55.shiftKey){
-return key;
-}else{
-return key.toLowerCase();
-}
-};
-Xinha.getOuterHTML=function(_57){
-return (new XMLSerializer()).serializeToString(_57);
-};
-Xinha.cc=String.fromCharCode(8286);
-Xinha.prototype.setCC=function(_58){
-var cc=Xinha.cc;
-try{
-if(_58=="textarea"){
-var ta=this._textArea;
-var _5b=ta.selectionStart;
-var _5c=ta.value.substring(0,_5b);
-var _5d=ta.value.substring(_5b,ta.value.length);
-if(_5d.match(/^[^<]*>/)){
-var _5e=_5d.indexOf(">")+1;
-ta.value=_5c+_5d.substring(0,_5e)+cc+_5d.substring(_5e,_5d.length);
-}else{
-ta.value=_5c+cc+_5d;
-}
-ta.value=ta.value.replace(new RegExp("(&[^"+cc+";]*?)("+cc+")([^"+cc+"]*?;)"),"$1$3$2");
-ta.value=ta.value.replace(new RegExp("(<script[^>]*>[^"+cc+"]*?)("+cc+")([^"+cc+"]*?</script>)"),"$1$3$2");
-ta.value=ta.value.replace(new RegExp("^([^"+cc+"]*)("+cc+")([^"+cc+"]*<body[^>]*>)(.*?)"),"$1$3$2$4");
-}else{
-var sel=this.getSelection();
-sel.getRangeAt(0).insertNode(this._doc.createTextNode(cc));
-}
-}
-catch(e){
-}
-};
-Xinha.prototype.findCC=function(_60){
-var cc=Xinha.cc;
-if(_60=="textarea"){
-var ta=this._textArea;
-var pos=ta.value.indexOf(cc);
-if(pos==-1){
-return;
-}
-var end=pos+cc.length;
-var _65=ta.value.substring(0,pos);
-var _66=ta.value.substring(end,ta.value.length);
-ta.value=_65;
-ta.scrollTop=ta.scrollHeight;
-var _67=ta.scrollTop;
-ta.value+=_66;
-ta.setSelectionRange(pos,pos);
-ta.focus();
-ta.scrollTop=_67;
-}else{
-var _68=this;
-try{
-var doc=this._doc;
-doc.body.innerHTML=doc.body.innerHTML.replace(new RegExp(cc),"<span id=\"XinhaEditingPostion\"></span>");
-var _6a=doc.getElementById("XinhaEditingPostion");
-this.selectNodeContents(_6a);
-this.scrollToElement(_6a);
-_6a.parentNode.removeChild(_6a);
-this._iframe.contentWindow.focus();
-}
-catch(e){
-}
-}
-};
-Xinha.prototype._standardToggleBorders=Xinha.prototype._toggleBorders;
-Xinha.prototype._toggleBorders=function(){
-var _6b=this._standardToggleBorders();
-var _6c=this._doc.getElementsByTagName("TABLE");
-for(var i=0;i<_6c.length;i++){
-_6c[i].style.display="none";
-_6c[i].style.display="table";
-}
-return _6b;
-};
-Xinha.getDoctype=function(doc){
-var d="";
-if(doc.doctype){
-d+="<!DOCTYPE "+doc.doctype.name+" PUBLIC ";
-d+=doc.doctype.publicId?"\""+doc.doctype.publicId+"\"":"";
-d+=doc.doctype.systemId?" \""+doc.doctype.systemId+"\"":"";
-d+=">";
-}
-return d;
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/blank.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/blank.html
deleted file mode 100644
index 45d5f7a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/blank.html
+++ /dev/null
@@ -1 +0,0 @@
-<html><body onload="window.xinhaReadyToRoll = true;"></body></html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/editor_help.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/editor_help.html
deleted file mode 100644
index 9aa7a89..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/editor_help.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<html>
- <head>
-  <title>Editor Help</title>
-  <script type="text/javascript" src="popup.js"></script>
-  <link rel="stylesheet" type="text/css" href="popup.css" />
-
-<script type="text/javascript">
-  window.resizeTo(400, 480);
-Xinha = window.opener.Xinha;
-function Init() {
-  __dlg_translate('Xinha');
-  __dlg_init();
-
-}
-
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-
-</script>
-</head>
-
-<body class="dialog" onload="Init()">
-<div class="title">Editor Help</div>
-<table width="100%" style="background: white none repeat scroll 0%;">
-  <thead style="border: 1px solid gray; background: silver none repeat scroll 0%;">
-  <tr>
-    <th colspan="2"> 
-      <span style="text-align:center">Keyboard shortcuts</span><br />
-      <span>The editor provides the following key combinations:</span>
-    </th>
-  </tr>
-  </thead>
-  <tbody>
-  <tr><td>ENTER</td><td><span>new paragraph</span>(&lt;P&gt;)</td></tr>
-  <tr><td>SHIFT-ENTER</td><td><span>insert linebreak</span>(&lt;BR&gt;)</td></tr>
-  <tr><td>CTRL-A</td><td><span>Select all</span></td></tr>
-  <tr><td>CTRL-B</td><td><span>Bold</span></td></tr>
-  <tr><td>CTRL-I</td><td><span>Italic</span></td></tr>
-  <tr><td>CTRL-U</td><td><span>Underline</span></td></tr>
-  <tr><td>CTRL-S</td><td><span>Strikethrough</span></td></tr>
-  <tr><td>CTRL-L</td><td><span>Justify Left</span></td></tr>
-  <tr><td>CTRL-E</td><td><span>Justify Center</span></td></tr>
-  <tr><td>CTRL-R</td><td><span>Justify Right</span></td></tr>
-  <tr><td>CTRL-J</td><td><span>Justify Full</span></td></tr>
-  <tr><td>CTRL-Z</td><td><span>Undoes your last action</span></td></tr>
-  <tr><td>CTRL-Y</td><td><span>Redoes your last action</span></td></tr>
-  <tr><td>CTRL-N</td><td><span>Set format to paragraph</span></td></tr>
-  <tr><td>CTRL-0 (zero)</td><td><span>Clean content pasted from Word</span></td></tr>
-  <tr><td>CTRL-1 .. CTRL-6</td><td><span>Headings</span> (&lt;h1&gt; .. &lt;h6&gt;)</td></tr>
-  <tr><td>CTRL-X</td><td><span>Cut selection</span></td></tr>
-  <tr><td>CTRL-C</td><td><span>Copy selection</span></td></tr>
-  <tr><td>CTRL-V</td><td><span>Paste from clipboard</span></td></tr>
-  </tbody>
-</table>
-<div id="buttons">
-  <button type="button" name="cancel" onclick="return onCancel();">Close</button>
-</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/popup.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/popup.css
deleted file mode 100644
index 7bf9358..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/popup.css
+++ /dev/null
@@ -1,39 +0,0 @@
-html, body, .dialog {
-  background: ButtonFace;
-  color: ButtonText;
-  font: 11px Tahoma,Verdana,sans-serif;
-  margin: 0px;
-  padding: 0px;
-}
-body { padding: 5px; }
-form { padding: 0px; margin: 0px; }
-form p {
-  margin-top: 5px;
-  margin-bottom: 5px;
-}
-table {
-  font: 11px Tahoma,Verdana,sans-serif;
-}
-select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
-button { width: 70px; }
-table .label { text-align: right; width: 8em; }
-
-.fl { width: 9em; float: left; padding: 2px 5px; text-align: right; }
-.fr { width: 7em; float: left; padding: 2px 5px; text-align: right; }
-fieldset { padding: 0px 10px 5px 5px; }
-.space { padding: 2px; }
-.title { background: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px;
-border-bottom: 1px solid black; letter-spacing: 2px;
-}
-.buttonColor {
-  padding: 1px;
-  cursor: default;
-  border: 1px solid;
-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-}
-#buttons {
-      margin-top: 1em; 
-      border-top: 1px solid #999;
-      padding: 1em; 
-      text-align: right;
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/popup.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/popup.js
deleted file mode 100644
index dd37c8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/popup.js
+++ /dev/null
@@ -1,107 +0,0 @@
-/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
-/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/popups/popup.js */
-if(typeof Xinha=="undefined"){
-Xinha=window.opener.Xinha;
-}
-HTMLArea=Xinha;
-function getAbsolutePos(el){
-var r={x:el.offsetLeft,y:el.offsetTop};
-if(el.offsetParent){
-var _3=getAbsolutePos(el.offsetParent);
-r.x+=_3.x;
-r.y+=_3.y;
-}
-return r;
-};
-function comboSelectValue(c,_5){
-var _6=c.getElementsByTagName("option");
-for(var i=_6.length;--i>=0;){
-var op=_6[i];
-op.selected=(op.value==_5);
-}
-c.value=_5;
-};
-function __dlg_onclose(){
-opener.Dialog._return(null);
-};
-function __dlg_init(_9,_a){
-__xinha_dlg_init(_a);
-};
-function __xinha_dlg_init(_b){
-if(window.__dlg_init_done){
-return true;
-}
-if(window.opener._editor_skin){
-var _c=document.getElementsByTagName("head")[0];
-var _d=document.createElement("link");
-_d.type="text/css";
-_d.href=window.opener._editor_url+"skins/"+window.opener._editor_skin+"/skin.css";
-_d.rel="stylesheet";
-_c.appendChild(_d);
-}
-if(!window.dialogArguments&&opener.Dialog._arguments){
-window.dialogArguments=opener.Dialog._arguments;
-}
-var _e=Xinha.pageSize(window);
-if(!_b){
-_b={width:_e.x,height:_e.y};
-}
-window.resizeTo(_b.width,_b.height);
-var _f=Xinha.viewportSize(window);
-window.resizeBy(0,_e.y-_f.y);
-if(_b.top&&_b.left){
-window.moveTo(_b.left,_b.top);
-}else{
-if(!Xinha.is_ie){
-var x=opener.screenX+(opener.outerWidth-_b.width)/2;
-var y=opener.screenY+(opener.outerHeight-_b.height)/2;
-}else{
-var x=(self.screen.availWidth-_b.width)/2;
-var y=(self.screen.availHeight-_b.height)/2;
-}
-window.moveTo(x,y);
-}
-Xinha.addDom0Event(document.body,"keypress",__dlg_close_on_esc);
-window.__dlg_init_done=true;
-};
-function __dlg_translate(_12){
-var _13=["input","select","legend","span","option","td","th","button","div","label","a","img"];
-for(var _14=0;_14<_13.length;++_14){
-var _15=document.getElementsByTagName(_13[_14]);
-for(var i=_15.length;--i>=0;){
-var _17=_15[i];
-if(_17.firstChild&&_17.firstChild.data){
-var txt=Xinha._lc(_17.firstChild.data,_12);
-if(txt){
-_17.firstChild.data=txt;
-}
-}
-if(_17.title){
-var txt=Xinha._lc(_17.title,_12);
-if(txt){
-_17.title=txt;
-}
-}
-if(_17.tagName.toLowerCase()=="input"&&(/^(button|submit|reset)$/i.test(_17.type))){
-var txt=Xinha._lc(_17.value,_12);
-if(txt){
-_17.value=txt;
-}
-}
-}
-}
-document.title=Xinha._lc(document.title,_12);
-};
-function __dlg_close(val){
-opener.Dialog._return(val);
-window.close();
-};
-function __dlg_close_on_esc(ev){
-ev||(ev=window.event);
-if(ev.keyCode==27){
-__dlg_close(null);
-return false;
-}
-return true;
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/select_color.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/select_color.html
deleted file mode 100644
index 89e0e67..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/popups/select_color.html
+++ /dev/null
@@ -1,359 +0,0 @@
-<!--<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">-->
-<html><head><title>Select Color</title>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<script type="text/javascript" src="popup.js"></script>
-<script type="text/javascript">
-window.resizeTo(240, 182);
-// run on page load
-function Init()
-{
-  __dlg_translate('Xinha');
-  __dlg_init();
-  Xinha.addDom0Event(document, 'keypress', __dlg_close_on_esc);
-
-  var color = window.dialogArguments;
-  color = ValidateColor(color) || '000000';
-  View(color);
-}
-// preview color
-function View(color)
-{
-  document.getElementById("ColorPreview").style.backgroundColor = '#' + color;
-  document.getElementById("ColorHex").value = '#' + color;
-}
-// select color
-function Set(string)
-{
-  var color = ValidateColor(string);
-  if (color == null)
-  {
-    alert("Invalid color code: " + string);
-  }
-  else
-  {
-    View(color);
-    __dlg_close(color);
-  }
-}
-// return valid color code
-function ValidateColor(string)
-{
-  string = string || '';
-  string = string + "";
-  string = string.toUpperCase();
-  var chars = '0123456789ABCDEF';
-  var out   = '';
-  // remove invalid color chars
-  for (var i=0; i<string.length; i++)
-  {
-    var schar = string.charAt(i);
-    if (chars.indexOf(schar) != -1) out += schar;
-  }
-  // check length
-  if (out.length != 6) return null;
-  return out;
-}
-</script>
-<style type="text/css">
-body { background:buttonface; margin:0; padding:0; }
-form { margin:0; padding:0; }
-#containerpreview td { background:buttonface; }
-#preview { background-color:#000000; padding:1px; height:21px; width:50px; }
-#ColorPreview { height:100%; width:100%; }
-#ColorHex { font-size:12px; background:buttonface; border:0; }
-#palettecolor { cursor:pointer; }
-#palettecolor td { width:10px; height:10px; }
-</style>
-</head>
-<body class="dialog" onload="Init()">
-
-<form action="#" method="get" onsubmit="Set(document.getElementById('ColorHex').value); return false;">
-<table border="0" cellspacing="0" cellpadding="4" width="100%" id="containerpreview">
- <tr>
-  <td style="vertical-align: middle;"><div id="preview"><div id="ColorPreview"></div></div></td>
-  <td style="vertical-align: middle;" width="100%"><input type="text" name="ColorHex"
-    id="ColorHex" value="" size=15></td>
- </tr>
-</table>
-</form>
-
-<table id="palettecolor" border="0" cellspacing="1" cellpadding="0" width="100%" bgcolor="#000000">
-<tr>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#003300" onmouseover="View('003300')" onclick="Set('003300')"></td>
-<td bgcolor="#006600" onmouseover="View('006600')" onclick="Set('006600')"></td>
-<td bgcolor="#009900" onmouseover="View('009900')" onclick="Set('009900')"></td>
-<td bgcolor="#00CC00" onmouseover="View('00CC00')" onclick="Set('00CC00')"></td>
-<td bgcolor="#00FF00" onmouseover="View('00FF00')" onclick="Set('00FF00')"></td>
-<td bgcolor="#330000" onmouseover="View('330000')" onclick="Set('330000')"></td>
-<td bgcolor="#333300" onmouseover="View('333300')" onclick="Set('333300')"></td>
-<td bgcolor="#336600" onmouseover="View('336600')" onclick="Set('336600')"></td>
-<td bgcolor="#339900" onmouseover="View('339900')" onclick="Set('339900')"></td>
-<td bgcolor="#33CC00" onmouseover="View('33CC00')" onclick="Set('33CC00')"></td>
-<td bgcolor="#33FF00" onmouseover="View('33FF00')" onclick="Set('33FF00')"></td>
-<td bgcolor="#660000" onmouseover="View('660000')" onclick="Set('660000')"></td>
-<td bgcolor="#663300" onmouseover="View('663300')" onclick="Set('663300')"></td>
-<td bgcolor="#666600" onmouseover="View('666600')" onclick="Set('666600')"></td>
-<td bgcolor="#669900" onmouseover="View('669900')" onclick="Set('669900')"></td>
-<td bgcolor="#66CC00" onmouseover="View('66CC00')" onclick="Set('66CC00')"></td>
-<td bgcolor="#66FF00" onmouseover="View('66FF00')" onclick="Set('66FF00')"></td>
-</tr>
-<tr>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#333333" onmouseover="View('333333')" onclick="Set('333333')"></td>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#000033" onmouseover="View('000033')" onclick="Set('000033')"></td>
-<td bgcolor="#003333" onmouseover="View('003333')" onclick="Set('003333')"></td>
-<td bgcolor="#006633" onmouseover="View('006633')" onclick="Set('006633')"></td>
-<td bgcolor="#009933" onmouseover="View('009933')" onclick="Set('009933')"></td>
-<td bgcolor="#00CC33" onmouseover="View('00CC33')" onclick="Set('00CC33')"></td>
-<td bgcolor="#00FF33" onmouseover="View('00FF33')" onclick="Set('00FF33')"></td>
-<td bgcolor="#330033" onmouseover="View('330033')" onclick="Set('330033')"></td>
-<td bgcolor="#333333" onmouseover="View('333333')" onclick="Set('333333')"></td>
-<td bgcolor="#336633" onmouseover="View('336633')" onclick="Set('336633')"></td>
-<td bgcolor="#339933" onmouseover="View('339933')" onclick="Set('339933')"></td>
-<td bgcolor="#33CC33" onmouseover="View('33CC33')" onclick="Set('33CC33')"></td>
-<td bgcolor="#33FF33" onmouseover="View('33FF33')" onclick="Set('33FF33')"></td>
-<td bgcolor="#660033" onmouseover="View('660033')" onclick="Set('660033')"></td>
-<td bgcolor="#663333" onmouseover="View('663333')" onclick="Set('663333')"></td>
-<td bgcolor="#666633" onmouseover="View('666633')" onclick="Set('666633')"></td>
-<td bgcolor="#669933" onmouseover="View('669933')" onclick="Set('669933')"></td>
-<td bgcolor="#66CC33" onmouseover="View('66CC33')" onclick="Set('66CC33')"></td>
-<td bgcolor="#66FF33" onmouseover="View('66FF33')" onclick="Set('66FF33')"></td>
-</tr>
-<tr>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#666666" onmouseover="View('666666')" onclick="Set('666666')"></td>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#000066" onmouseover="View('000066')" onclick="Set('000066')"></td>
-<td bgcolor="#003366" onmouseover="View('003366')" onclick="Set('003366')"></td>
-<td bgcolor="#006666" onmouseover="View('006666')" onclick="Set('006666')"></td>
-<td bgcolor="#009966" onmouseover="View('009966')" onclick="Set('009966')"></td>
-<td bgcolor="#00CC66" onmouseover="View('00CC66')" onclick="Set('00CC66')"></td>
-<td bgcolor="#00FF66" onmouseover="View('00FF66')" onclick="Set('00FF66')"></td>
-<td bgcolor="#330066" onmouseover="View('330066')" onclick="Set('330066')"></td>
-<td bgcolor="#333366" onmouseover="View('333366')" onclick="Set('333366')"></td>
-<td bgcolor="#336666" onmouseover="View('336666')" onclick="Set('336666')"></td>
-<td bgcolor="#339966" onmouseover="View('339966')" onclick="Set('339966')"></td>
-<td bgcolor="#33CC66" onmouseover="View('33CC66')" onclick="Set('33CC66')"></td>
-<td bgcolor="#33FF66" onmouseover="View('33FF66')" onclick="Set('33FF66')"></td>
-<td bgcolor="#660066" onmouseover="View('660066')" onclick="Set('660066')"></td>
-<td bgcolor="#663366" onmouseover="View('663366')" onclick="Set('663366')"></td>
-<td bgcolor="#666666" onmouseover="View('666666')" onclick="Set('666666')"></td>
-<td bgcolor="#669966" onmouseover="View('669966')" onclick="Set('669966')"></td>
-<td bgcolor="#66CC66" onmouseover="View('66CC66')" onclick="Set('66CC66')"></td>
-<td bgcolor="#66FF66" onmouseover="View('66FF66')" onclick="Set('66FF66')"></td>
-</tr>
-<tr>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#999999" onmouseover="View('999999')" onclick="Set('999999')"></td>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#000099" onmouseover="View('000099')" onclick="Set('000099')"></td>
-<td bgcolor="#003399" onmouseover="View('003399')" onclick="Set('003399')"></td>
-<td bgcolor="#006699" onmouseover="View('006699')" onclick="Set('006699')"></td>
-<td bgcolor="#009999" onmouseover="View('009999')" onclick="Set('009999')"></td>
-<td bgcolor="#00CC99" onmouseover="View('00CC99')" onclick="Set('00CC99')"></td>
-<td bgcolor="#00FF99" onmouseover="View('00FF99')" onclick="Set('00FF99')"></td>
-<td bgcolor="#330099" onmouseover="View('330099')" onclick="Set('330099')"></td>
-<td bgcolor="#333399" onmouseover="View('333399')" onclick="Set('333399')"></td>
-<td bgcolor="#336699" onmouseover="View('336699')" onclick="Set('336699')"></td>
-<td bgcolor="#339999" onmouseover="View('339999')" onclick="Set('339999')"></td>
-<td bgcolor="#33CC99" onmouseover="View('33CC99')" onclick="Set('33CC99')"></td>
-<td bgcolor="#33FF99" onmouseover="View('33FF99')" onclick="Set('33FF99')"></td>
-<td bgcolor="#660099" onmouseover="View('660099')" onclick="Set('660099')"></td>
-<td bgcolor="#663399" onmouseover="View('663399')" onclick="Set('663399')"></td>
-<td bgcolor="#666699" onmouseover="View('666699')" onclick="Set('666699')"></td>
-<td bgcolor="#669999" onmouseover="View('669999')" onclick="Set('669999')"></td>
-<td bgcolor="#66CC99" onmouseover="View('66CC99')" onclick="Set('66CC99')"></td>
-<td bgcolor="#66FF99" onmouseover="View('66FF99')" onclick="Set('66FF99')"></td>
-</tr>
-<tr>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#CCCCCC" onmouseover="View('CCCCCC')" onclick="Set('CCCCCC')"></td>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#0000CC" onmouseover="View('0000CC')" onclick="Set('0000CC')"></td>
-<td bgcolor="#0033CC" onmouseover="View('0033CC')" onclick="Set('0033CC')"></td>
-<td bgcolor="#0066CC" onmouseover="View('0066CC')" onclick="Set('0066CC')"></td>
-<td bgcolor="#0099CC" onmouseover="View('0099CC')" onclick="Set('0099CC')"></td>
-<td bgcolor="#00CCCC" onmouseover="View('00CCCC')" onclick="Set('00CCCC')"></td>
-<td bgcolor="#00FFCC" onmouseover="View('00FFCC')" onclick="Set('00FFCC')"></td>
-<td bgcolor="#3300CC" onmouseover="View('3300CC')" onclick="Set('3300CC')"></td>
-<td bgcolor="#3333CC" onmouseover="View('3333CC')" onclick="Set('3333CC')"></td>
-<td bgcolor="#3366CC" onmouseover="View('3366CC')" onclick="Set('3366CC')"></td>
-<td bgcolor="#3399CC" onmouseover="View('3399CC')" onclick="Set('3399CC')"></td>
-<td bgcolor="#33CCCC" onmouseover="View('33CCCC')" onclick="Set('33CCCC')"></td>
-<td bgcolor="#33FFCC" onmouseover="View('33FFCC')" onclick="Set('33FFCC')"></td>
-<td bgcolor="#6600CC" onmouseover="View('6600CC')" onclick="Set('6600CC')"></td>
-<td bgcolor="#6633CC" onmouseover="View('6633CC')" onclick="Set('6633CC')"></td>
-<td bgcolor="#6666CC" onmouseover="View('6666CC')" onclick="Set('6666CC')"></td>
-<td bgcolor="#6699CC" onmouseover="View('6699CC')" onclick="Set('6699CC')"></td>
-<td bgcolor="#66CCCC" onmouseover="View('66CCCC')" onclick="Set('66CCCC')"></td>
-<td bgcolor="#66FFCC" onmouseover="View('66FFCC')" onclick="Set('66FFCC')"></td>
-</tr>
-<tr>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#FFFFFF" onmouseover="View('FFFFFF')" onclick="Set('FFFFFF')"></td>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#0000FF" onmouseover="View('0000FF')" onclick="Set('0000FF')"></td>
-<td bgcolor="#0033FF" onmouseover="View('0033FF')" onclick="Set('0033FF')"></td>
-<td bgcolor="#0066FF" onmouseover="View('0066FF')" onclick="Set('0066FF')"></td>
-<td bgcolor="#0099FF" onmouseover="View('0099FF')" onclick="Set('0099FF')"></td>
-<td bgcolor="#00CCFF" onmouseover="View('00CCFF')" onclick="Set('00CCFF')"></td>
-<td bgcolor="#00FFFF" onmouseover="View('00FFFF')" onclick="Set('00FFFF')"></td>
-<td bgcolor="#3300FF" onmouseover="View('3300FF')" onclick="Set('3300FF')"></td>
-<td bgcolor="#3333FF" onmouseover="View('3333FF')" onclick="Set('3333FF')"></td>
-<td bgcolor="#3366FF" onmouseover="View('3366FF')" onclick="Set('3366FF')"></td>
-<td bgcolor="#3399FF" onmouseover="View('3399FF')" onclick="Set('3399FF')"></td>
-<td bgcolor="#33CCFF" onmouseover="View('33CCFF')" onclick="Set('33CCFF')"></td>
-<td bgcolor="#33FFFF" onmouseover="View('33FFFF')" onclick="Set('33FFFF')"></td>
-<td bgcolor="#6600FF" onmouseover="View('6600FF')" onclick="Set('6600FF')"></td>
-<td bgcolor="#6633FF" onmouseover="View('6633FF')" onclick="Set('6633FF')"></td>
-<td bgcolor="#6666FF" onmouseover="View('6666FF')" onclick="Set('6666FF')"></td>
-<td bgcolor="#6699FF" onmouseover="View('6699FF')" onclick="Set('6699FF')"></td>
-<td bgcolor="#66CCFF" onmouseover="View('66CCFF')" onclick="Set('66CCFF')"></td>
-<td bgcolor="#66FFFF" onmouseover="View('66FFFF')" onclick="Set('66FFFF')"></td>
-</tr>
-<tr>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#FF0000" onmouseover="View('FF0000')" onclick="Set('FF0000')"></td>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#990000" onmouseover="View('990000')" onclick="Set('990000')"></td>
-<td bgcolor="#993300" onmouseover="View('993300')" onclick="Set('993300')"></td>
-<td bgcolor="#996600" onmouseover="View('996600')" onclick="Set('996600')"></td>
-<td bgcolor="#999900" onmouseover="View('999900')" onclick="Set('999900')"></td>
-<td bgcolor="#99CC00" onmouseover="View('99CC00')" onclick="Set('99CC00')"></td>
-<td bgcolor="#99FF00" onmouseover="View('99FF00')" onclick="Set('99FF00')"></td>
-<td bgcolor="#CC0000" onmouseover="View('CC0000')" onclick="Set('CC0000')"></td>
-<td bgcolor="#CC3300" onmouseover="View('CC3300')" onclick="Set('CC3300')"></td>
-<td bgcolor="#CC6600" onmouseover="View('CC6600')" onclick="Set('CC6600')"></td>
-<td bgcolor="#CC9900" onmouseover="View('CC9900')" onclick="Set('CC9900')"></td>
-<td bgcolor="#CCCC00" onmouseover="View('CCCC00')" onclick="Set('CCCC00')"></td>
-<td bgcolor="#CCFF00" onmouseover="View('CCFF00')" onclick="Set('CCFF00')"></td>
-<td bgcolor="#FF0000" onmouseover="View('FF0000')" onclick="Set('FF0000')"></td>
-<td bgcolor="#FF3300" onmouseover="View('FF3300')" onclick="Set('FF3300')"></td>
-<td bgcolor="#FF6600" onmouseover="View('FF6600')" onclick="Set('FF6600')"></td>
-<td bgcolor="#FF9900" onmouseover="View('FF9900')" onclick="Set('FF9900')"></td>
-<td bgcolor="#FFCC00" onmouseover="View('FFCC00')" onclick="Set('FFCC00')"></td>
-<td bgcolor="#FFFF00" onmouseover="View('FFFF00')" onclick="Set('FFFF00')"></td>
-</tr>
-<tr>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#00FF00" onmouseover="View('00FF00')" onclick="Set('00FF00')"></td>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#990033" onmouseover="View('990033')" onclick="Set('990033')"></td>
-<td bgcolor="#993333" onmouseover="View('993333')" onclick="Set('993333')"></td>
-<td bgcolor="#996633" onmouseover="View('996633')" onclick="Set('996633')"></td>
-<td bgcolor="#999933" onmouseover="View('999933')" onclick="Set('999933')"></td>
-<td bgcolor="#99CC33" onmouseover="View('99CC33')" onclick="Set('99CC33')"></td>
-<td bgcolor="#99FF33" onmouseover="View('99FF33')" onclick="Set('99FF33')"></td>
-<td bgcolor="#CC0033" onmouseover="View('CC0033')" onclick="Set('CC0033')"></td>
-<td bgcolor="#CC3333" onmouseover="View('CC3333')" onclick="Set('CC3333')"></td>
-<td bgcolor="#CC6633" onmouseover="View('CC6633')" onclick="Set('CC6633')"></td>
-<td bgcolor="#CC9933" onmouseover="View('CC9933')" onclick="Set('CC9933')"></td>
-<td bgcolor="#CCCC33" onmouseover="View('CCCC33')" onclick="Set('CCCC33')"></td>
-<td bgcolor="#CCFF33" onmouseover="View('CCFF33')" onclick="Set('CCFF33')"></td>
-<td bgcolor="#FF0033" onmouseover="View('FF0033')" onclick="Set('FF0033')"></td>
-<td bgcolor="#FF3333" onmouseover="View('FF3333')" onclick="Set('FF3333')"></td>
-<td bgcolor="#FF6633" onmouseover="View('FF6633')" onclick="Set('FF6633')"></td>
-<td bgcolor="#FF9933" onmouseover="View('FF9933')" onclick="Set('FF9933')"></td>
-<td bgcolor="#FFCC33" onmouseover="View('FFCC33')" onclick="Set('FFCC33')"></td>
-<td bgcolor="#FFFF33" onmouseover="View('FFFF33')" onclick="Set('FFFF33')"></td>
-</tr>
-<tr>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#0000FF" onmouseover="View('0000FF')" onclick="Set('0000FF')"></td>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#990066" onmouseover="View('990066')" onclick="Set('990066')"></td>
-<td bgcolor="#993366" onmouseover="View('993366')" onclick="Set('993366')"></td>
-<td bgcolor="#996666" onmouseover="View('996666')" onclick="Set('996666')"></td>
-<td bgcolor="#999966" onmouseover="View('999966')" onclick="Set('999966')"></td>
-<td bgcolor="#99CC66" onmouseover="View('99CC66')" onclick="Set('99CC66')"></td>
-<td bgcolor="#99FF66" onmouseover="View('99FF66')" onclick="Set('99FF66')"></td>
-<td bgcolor="#CC0066" onmouseover="View('CC0066')" onclick="Set('CC0066')"></td>
-<td bgcolor="#CC3366" onmouseover="View('CC3366')" onclick="Set('CC3366')"></td>
-<td bgcolor="#CC6666" onmouseover="View('CC6666')" onclick="Set('CC6666')"></td>
-<td bgcolor="#CC9966" onmouseover="View('CC9966')" onclick="Set('CC9966')"></td>
-<td bgcolor="#CCCC66" onmouseover="View('CCCC66')" onclick="Set('CCCC66')"></td>
-<td bgcolor="#CCFF66" onmouseover="View('CCFF66')" onclick="Set('CCFF66')"></td>
-<td bgcolor="#FF0066" onmouseover="View('FF0066')" onclick="Set('FF0066')"></td>
-<td bgcolor="#FF3366" onmouseover="View('FF3366')" onclick="Set('FF3366')"></td>
-<td bgcolor="#FF6666" onmouseover="View('FF6666')" onclick="Set('FF6666')"></td>
-<td bgcolor="#FF9966" onmouseover="View('FF9966')" onclick="Set('FF9966')"></td>
-<td bgcolor="#FFCC66" onmouseover="View('FFCC66')" onclick="Set('FFCC66')"></td>
-<td bgcolor="#FFFF66" onmouseover="View('FFFF66')" onclick="Set('FFFF66')"></td>
-</tr>
-<tr>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#FFFF00" onmouseover="View('FFFF00')" onclick="Set('FFFF00')"></td>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#990099" onmouseover="View('990099')" onclick="Set('990099')"></td>
-<td bgcolor="#993399" onmouseover="View('993399')" onclick="Set('993399')"></td>
-<td bgcolor="#996699" onmouseover="View('996699')" onclick="Set('996699')"></td>
-<td bgcolor="#999999" onmouseover="View('999999')" onclick="Set('999999')"></td>
-<td bgcolor="#99CC99" onmouseover="View('99CC99')" onclick="Set('99CC99')"></td>
-<td bgcolor="#99FF99" onmouseover="View('99FF99')" onclick="Set('99FF99')"></td>
-<td bgcolor="#CC0099" onmouseover="View('CC0099')" onclick="Set('CC0099')"></td>
-<td bgcolor="#CC3399" onmouseover="View('CC3399')" onclick="Set('CC3399')"></td>
-<td bgcolor="#CC6699" onmouseover="View('CC6699')" onclick="Set('CC6699')"></td>
-<td bgcolor="#CC9999" onmouseover="View('CC9999')" onclick="Set('CC9999')"></td>
-<td bgcolor="#CCCC99" onmouseover="View('CCCC99')" onclick="Set('CCCC99')"></td>
-<td bgcolor="#CCFF99" onmouseover="View('CCFF99')" onclick="Set('CCFF99')"></td>
-<td bgcolor="#FF0099" onmouseover="View('FF0099')" onclick="Set('FF0099')"></td>
-<td bgcolor="#FF3399" onmouseover="View('FF3399')" onclick="Set('FF3399')"></td>
-<td bgcolor="#FF6699" onmouseover="View('FF6699')" onclick="Set('FF6699')"></td>
-<td bgcolor="#FF9999" onmouseover="View('FF9999')" onclick="Set('FF9999')"></td>
-<td bgcolor="#FFCC99" onmouseover="View('FFCC99')" onclick="Set('FFCC99')"></td>
-<td bgcolor="#FFFF99" onmouseover="View('FFFF99')" onclick="Set('FFFF99')"></td>
-</tr>
-<tr>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#00FFFF" onmouseover="View('00FFFF')" onclick="Set('00FFFF')"></td>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#9900CC" onmouseover="View('9900CC')" onclick="Set('9900CC')"></td>
-<td bgcolor="#9933CC" onmouseover="View('9933CC')" onclick="Set('9933CC')"></td>
-<td bgcolor="#9966CC" onmouseover="View('9966CC')" onclick="Set('9966CC')"></td>
-<td bgcolor="#9999CC" onmouseover="View('9999CC')" onclick="Set('9999CC')"></td>
-<td bgcolor="#99CCCC" onmouseover="View('99CCCC')" onclick="Set('99CCCC')"></td>
-<td bgcolor="#99FFCC" onmouseover="View('99FFCC')" onclick="Set('99FFCC')"></td>
-<td bgcolor="#CC00CC" onmouseover="View('CC00CC')" onclick="Set('CC00CC')"></td>
-<td bgcolor="#CC33CC" onmouseover="View('CC33CC')" onclick="Set('CC33CC')"></td>
-<td bgcolor="#CC66CC" onmouseover="View('CC66CC')" onclick="Set('CC66CC')"></td>
-<td bgcolor="#CC99CC" onmouseover="View('CC99CC')" onclick="Set('CC99CC')"></td>
-<td bgcolor="#CCCCCC" onmouseover="View('CCCCCC')" onclick="Set('CCCCCC')"></td>
-<td bgcolor="#CCFFCC" onmouseover="View('CCFFCC')" onclick="Set('CCFFCC')"></td>
-<td bgcolor="#FF00CC" onmouseover="View('FF00CC')" onclick="Set('FF00CC')"></td>
-<td bgcolor="#FF33CC" onmouseover="View('FF33CC')" onclick="Set('FF33CC')"></td>
-<td bgcolor="#FF66CC" onmouseover="View('FF66CC')" onclick="Set('FF66CC')"></td>
-<td bgcolor="#FF99CC" onmouseover="View('FF99CC')" onclick="Set('FF99CC')"></td>
-<td bgcolor="#FFCCCC" onmouseover="View('FFCCCC')" onclick="Set('FFCCCC')"></td>
-<td bgcolor="#FFFFCC" onmouseover="View('FFFFCC')" onclick="Set('FFFFCC')"></td>
-</tr>
-<tr>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#FF00FF" onmouseover="View('FF00FF')" onclick="Set('FF00FF')"></td>
-<td bgcolor="#000000" onmouseover="View('000000')" onclick="Set('000000')"></td>
-<td bgcolor="#9900FF" onmouseover="View('9900FF')" onclick="Set('9900FF')"></td>
-<td bgcolor="#9933FF" onmouseover="View('9933FF')" onclick="Set('9933FF')"></td>
-<td bgcolor="#9966FF" onmouseover="View('9966FF')" onclick="Set('9966FF')"></td>
-<td bgcolor="#9999FF" onmouseover="View('9999FF')" onclick="Set('9999FF')"></td>
-<td bgcolor="#99CCFF" onmouseover="View('99CCFF')" onclick="Set('99CCFF')"></td>
-<td bgcolor="#99FFFF" onmouseover="View('99FFFF')" onclick="Set('99FFFF')"></td>
-<td bgcolor="#CC00FF" onmouseover="View('CC00FF')" onclick="Set('CC00FF')"></td>
-<td bgcolor="#CC33FF" onmouseover="View('CC33FF')" onclick="Set('CC33FF')"></td>
-<td bgcolor="#CC66FF" onmouseover="View('CC66FF')" onclick="Set('CC66FF')"></td>
-<td bgcolor="#CC99FF" onmouseover="View('CC99FF')" onclick="Set('CC99FF')"></td>
-<td bgcolor="#CCCCFF" onmouseover="View('CCCCFF')" onclick="Set('CCCCFF')"></td>
-<td bgcolor="#CCFFFF" onmouseover="View('CCFFFF')" onclick="Set('CCFFFF')"></td>
-<td bgcolor="#FF00FF" onmouseover="View('FF00FF')" onclick="Set('FF00FF')"></td>
-<td bgcolor="#FF33FF" onmouseover="View('FF33FF')" onclick="Set('FF33FF')"></td>
-<td bgcolor="#FF66FF" onmouseover="View('FF66FF')" onclick="Set('FF66FF')"></td>
-<td bgcolor="#FF99FF" onmouseover="View('FF99FF')" onclick="Set('FF99FF')"></td>
-<td bgcolor="#FFCCFF" onmouseover="View('FFCCFF')" onclick="Set('FFCCFF')"></td>
-<td bgcolor="#FFFFFF" onmouseover="View('FFFFFF')" onclick="Set('FFFFFF')"></td>
-</tr>
-</table>
-
-</body></html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/release-notes.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/release-notes.txt
deleted file mode 100644
index 825701a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/release-notes.txt
+++ /dev/null
@@ -1,380 +0,0 @@
-Xinha - The Community-Built Online HTML Editor
-
-For bug reports, forum, and updates go to 
-http://xinha.org
-
-Release History
-
-Xinha 0.96
-== Bugs Fixed ==
-
- * #1425 [SmartReplace][Gecko] When inserting opening quote, the space before the cursor is deleted
- * #1429 Problems with Apache and HEAD requests...
- * #1478 Further important security precautions for ExtendedFileManager and ImageManager
- * #1478 Hide all dotfiles from the Linker scanner, the linker shouldn't be showing "hidden" files.
- * #1478 CSS fix to dTree in linker, just to make sure it's styles were not getting clobbered.
- * #1478 Stop the Stylist from possibly adding a  duplicate stylesheet into pageStyleSheets, this was creating a subtle problem in certain circumstances.
- * #1227  Improved handling of CSS imports in Stylist plugin.
- * #1448 a[b.id] is undefined
- * #1387 prevent crash in IE 
- * #1198 Fix for bad sizing of editor.
- * #1121 Disable tab in Internet Explorer because it exits the Xinha area.
- * #472  Disable InsertPicture
- * #579 Pass value to dropdown handlers.
- * #1472 _top not respected in editing link.
- * #1467 autofocus=false not working as expected.
- * #1461 Special characters in image make thumbnail not appear.
- * #1435 IE failed in TransformInnerHTML
- * #1232 Clickable icons on ExtendedFileManager
- * #1409 Image Properties broken in ContextMenu
- * #1419 Stylist display problem in IE6/7, HasLayout bug.
- * #1262 Alternative method for restoring from fullscreen mode.
- * #1388 Change &mdash; to &8212; for xml compatability.
- * #1093, #1377 Rewrite the InsertSmiley plugin.  Remains compatible with ray's changes in r904 if people have made a specific configuration.
- * #1282 Opera losing it's events when designMode turned on causing status bar to not update amongst other things.
- * r1228 Remove PersistantStorage from Newbie example, because it not actually usable atm
- * r1229 Fix firefox version detection.
- * r1230 avoid unecessary pollution of global namespace
- * r1232 Removed CC license from Tango iconset, as it seems not appropriate
- * r1232 Changed HtmlEntities plugin license to HTMLArea
- * #1488 Fix Control Selection in IE8
- * r1235 Change license to HTMLArea - see http://xinha.org/punbb/viewtopic.php?id=2499
- * #1497 TransformInnerHtml handling of object tag
- * #1498 Color picker display in new dialogs in IE6
- * #1499 Fix focus errors in new dialogs in IE
- * #1503 xinha_to_js did not handle booleans correctly
- * #1509 Prevent attempting to compress REs in Safari 4
- * #1515 Security patch to prevent rogue access to the compressors in contrib.
- * #1518 Security patch which prevents non-default keys in xinha_pass_to_php_backend.
- * #1518 Issue an error and ignore the special backend configuration when the key location is non default, for both the ImageManager and ExtendedFileManager deprecated config passing methods.
- * #1209 and #1182 Upgrade Equation to use new AsciiMath, fix multiple equation editing. Thanks to Niraj Bhawnani of University of New South Wales.
- * #1483 Fix cancel button in Equation editor.
- * #1485 Add a double-click handler which will bring up the link/image insertion dialogs (or ImageManager/Linker) when a link or image is double clicked.
- * #1492 Fix linker in some situations.
- * #1471, #1508, #1510 Fix IE8 problems with TableOperations and other buttons, and absolute positioned editing.
-
-== New Features ==
-
- * r1189 added toolbar config to Newbie example
- * #1478 Add new method Xinha.extend to provide more classical object oriented subclasses within Javascript.
- * #1478 Add new method Xinha.Dialog::setLocalizer() to more easily set a specific localizer for a dialog.
- * #1478 File-Picker on arbitrary fields outside Xinha (ExtendedFileManager)
- * #1478 Add config option to use HSpace and VSpace in ImageManager (default off)
- * #1478 Add YouTube and Flickr support to ImageManager so that videos and Flickr images can be searched and selected in the ImageManager.
- * #1478 Add a new dialog type "DetachedDialog" to help leverage Xinha plugins to perform tasks outside of Xinha, and an example of a simple dialog for those who wish to make their own.
- * #1478 Link-Picker  on arbitrary fields outside Xinha (Linker)
- * #1478 New Plugin: WysiwygWrap - combined with an appropriate pageStyleSheet(s) you can more easily simulate in Xinha what it will "look like" when that HTML is "published".
- * #1446 Provide a means for adding custom hooks into the ContextMenu plugin.
- * #1220 Add ability to pass extra arguments in the post to the backend handler for SuperClean.
- * #1465  Add an option `resize_files` to both ExtendedFileManager and ImageManager, defaults true, false turns off the automatic image resizing.
- * #1189 Add the xml:lang attribute to LangMarks plugin.  The configuration for this plugin has changed, old configurations are accepted with a warning to the console.
- * #1433 Add a SaveOnBlur plugin, authored by Peter Siewert (with a clean up by James Sleeman).
- * #1479 Add CSSPicker plugin.
- * #1205 Add allow_delete and allow_edit to ImageManager
- * #1205 Add allow_delete to ExtendedFileManager
- * #1496 Make dialog title bar logo skinable
- * r1243 Added a method to allow plugins to easily load assets synchronously (for dependancies). 
- * #1502 Add new plugin MootoolsFileManager - an advanced image and file uploader/picker/inserter with multi-file-upload, progress bars, and previews.
- * #1507 Config option to show fonts in toolbar using actual fonts.
-
-== Translation ==
-
- * #1477 Danish translation for ExtendedFileManager and SuperClean
- * r1205 Updated Danish translation.
- * #1470 Contribution from Niels Baggesen to assist translators.
- * #1454, #1455, #1456, #1457, #1458, #1459, #1460 Spanish translations.
- * #1469 Updated danish translation.
-
-
-Xinha 0.96beta2
-Bugs Fixed
- * #1376 [IE6 & IE7 Quirksmode] Dialogs are invisible
- * #1381 [IE] QuirksMode dialog background rendered in wrong position when panel is detached
- * #1383 [IE7] Secure and Nonsecure Warning
- * #1382 [IE] QuirksMode dialog background falsely non-grey with modal dialogs, grey when dragging modeless dialogs
- * #1389 [IE6] selection lost when clicking toolbar button
- * #1386 [Safari] Setting default checkbox settings in dialogs does not work
- * #1394 fullpage puts metas/ title all on the same line
- * #1390 PreserveScripts shorthand php tags
- * #1392 too much recursion when setting HTML in fullPage mode using onGenerate/onGenerateOnce
- * #1407 [IE8] window resize causes infinite loop
- * #1408 PHP5 IIS file upload problem
- * #1374 [IE8] Table insert not work
- * #1379 [Firefox] no longer corrupts image data from broken images
-
-Translation
- * [SmartReplace] Added French translation
- * #1406 [FullScreen] Added Spanish translation
-
-Xinha 0.96beta
-Bugs Fixed
- * #314 Status bar should wrap
- * #741 ContextMenu should not overflow window boundaries
- * #961 baseHref not correctly treated when stripping
- * #1160 Safari puts selected HTML near bottom if edited
- * #1166 TableOperations dialogs do not resize properly in Safari 3
- * #1173 IE8 beta toolbars broken
- * #1174 IE8 beta no text cursor in wysiwyg
- * #1187 ExtendedFileManager "imgManager.changeDir is not a function" error
- * #1193 Stylist bug when formatting selected text
- * #1213 Would be nice to protect unsaved changes from accidental loss when navigating away
- * #1221 Selecting heading normal on nothing throws exception alert
- * #1224 sevenbitclean? / ghost cursor error with html mode toggle (Firefox)
- * #1227 No CSS rules load when using @import in external stylesheet
- * #1230 CSS width attribute breaks select display in IE
- * #1240 Linker: trim spaces from URL
- * #1247 CharCounter problems with Silva skin
- * #1257 Error if url query string included '/'
- * #1258 Event object is not handed over to event handlers installed on textarea
- * #1261 Dutch translation for Fullscreen module
- * #1280 restoreSelection doesn't always work in internet explorer
- * #1281 selectNodeContents is borken in IE when the node is a text node
- * #1284 _editor_url is still used in a couple of plugins.
- * #1286 use callbacks as criteria for getFirstAncestor
- * #1288 [DefinitionList] list items restricted to small width and one line by CSS
- * #1290 Improved support for pasting from Microsoft Word
- * #1291 Xinha.removeFromParent() does not return correct reference
- * #1292 change naming scheme of plugin files
- * #1293 [Gecko] Window scrolls to top of editing area when switching from text to WYSIWYG
- * #1294 Editor higher in HTML mode
- * #1295 Textarea not aligned under toolbar
- * #1298 CSS styling gets inserted into table cell after viewing source (Safari only)
- * #1300 create namespace for plugins within Xinha namespace
- * #1301 loading should not fail if plugin omits _pluginInfo
- * #1302 add Array.prototype.forEach for Browser that doesn't support it
- * #1303 add getElementsByClassName()
- * #1306 Toolbar actions need access to the click event
- * #1309 Xinha chokes on anchors
- * #1315 Xinha's _addEvent uses event capturing
- * #1316 In InternetExplorer, the cursor is lost when switching into source mode
- * #1317 Xinha's postback and getback should allow for failure handlers
- * #1319 make event hooks like onKeyPress accesible from the config object
- * #1320 make it possible to use png images as icons in IE6
- * #1321 [SaveSubmit] icon is in "changed" state initially
- * #1322 [SaveSubmit] error when form action is empty
- * #1332 Panel classes are very generic, and risk conflict with users embedding it in their site
- * #1337 GetHTML truncates hyperlinks
- * #1346 statusbar shows b, i, strike instead of strong, em, and del
- * #1357 safari form submit has empty form field names in POST data, causes failure with perl CGI
-
- 
-Enhancements
- * #1176 Completely revamped dialog system, which uses inline lightbox-style dialogs instead of separate popup windows 
- * #326 Added support for customizable icon sets
- * #1318 Added icon set from the Tango Project
- * #1287 New InsertNote plugin for handling footnotes, with automatic note numbering and ordering, linking, and support for repeated references
- * #1289 New InsertSnippet2 plugin, with categorization of snippets, search by name, and an XML data format
- * #58 Additional settings for Linker plugin (link types and targets can be configured)
- * #1219 Configuration option to autofocus editor
- * #1285 Configuration option to set document body class
- * #1323 Allow skins to have meta information (author, etc.)
- * #1338 _editor_url is now automatically detected
- * #1345 Add a static function that saves the contents of all Xinhas to their respective textareas
-
-
-Xinha 0.95
-Bugs Fixed
- * fixed #1040 htmlRemoveTags doesn't work in IE 
- * fixed #645 IE Save as function only saves the original html 
- * fixed #1136 FF3 Linux select boxes in toolbar are too small 
- * fixed #1100 Extended File Manager - Error after opening window
- * fixed #1103 [TransformInnerHTML] IE breaks singlet attributes starting with "no"
- * fixed #1086 Repeated javascript insertion in onclick attributes
- * fixed #1094 IE throws error in Xinha.loadStyle function
- * fixed  #1117 IE returns javascript error -1072896658
- * fixed #993 PageStyle to override styles in PageStylesheets
- * #1112 switching between modes leaves strange characters in source 
- * fixed #1128 loading fails when Fullscreen tried to load as plugin
- * fixed #1126 Percent (%) in URL prevent stripSelfNamedAnchors from working  
- * fixed #1120 HTML select overlaps color picker in IE6
- * #1115 + #1127 fixed compatibility issues with Firefox 3
- * #961 +  #1130 changed behaviour of xinha_config.baseHref
- * fixed #645 Save as function only saves the original html
- * fixed #1040 htmlRemoveTags doesn't work in IE
- * fixed #1015 Mozilla shows scrollbars on click in Stylist 
- * #918 removed mozParaHandler dirty as it had been broken for a long time
- * fixed #1015 Mozilla shows scrollbars on click in Stylist 
- * fixed #1148 HTML entities break when cursor is inside when switching from HTML to WYSIWYG 
- * fixed #1151 form action always made absolute
- * fixed #1155 InsertAnchor broken in IE 7
- * fixed #1158 [ImageManager] in Japanese environment, an error occurs by reading of lang/ja.js in IE6/7 
- * fixed #1152 Plugins using surroundHTML (EditTag, LangMarks) no longer work in IE7
- * fixed #1161 permission error from ColorPicker.js
- * fixed #1181 [TableOperations] Table Options dialog first entry for border style faulty
- * fixed #1185 [TableOperations] IE: style float broken
- * fixed #1197 [Linker] IE shows bug in line 262
- * fixed #1200 [Linker] Dialog does not show if scanned folder empty
- 
-Enhancements
- * #1143 add Safari support
- * #938  add Opera support
- * #1138 added API functions Xinha.getEditor(), Xinha.prototype.getPluginInstance(), Xinha.addOnloadHandler() 
- * #1137 [Equation] FF3 fixes & improved way of avoiding formula changes in editor
- * #1150 synchronize "Remove Format" between browsers
- * added plugin PreserveScripts for enhanced editing of pages containing PHP and/or JavaScript ()
- * Loading message facelift
- * added XinhaLoader.js for enhanced user experience through early loading message
- * made Xinha.makeEditors accept a DOM reference to the textarea instead of the id as part of xinha_editors array (#1105)
- * #1123 Allow return of PHP array from xinha_pass_to_php_backend
- * [Linker] scan.php: Allow specification of base url to use (so that a subdirectory can be used as $dir and return appropriate urls to the files (prefixing the url
- * [ExtendedFileManager] new Version
- * #961 +  #1130 changed behaviour of xinha_config.baseHref
- * #1137 [Equation] improved way of avoiding formula changes in editor
- * #442 removed alert "Your Document is not well formed..."
- * #1119 disabled Firefox 2 spell check when ContextMenu is enabled 
- * added a plugin "GenericPlugin" as a democase for plugin event handlers
- * #1171 [SmartReplace] now also replaces three dots with an ellipsis
- * #1119 [ContextMenu] optionally switch of Firefox Spell check
- * #1172 [LangMarks] make available languages configurable
- * enhanced behaviour when xinha_config.baseHref is set to another server
- * #1195 Allow to specify an external url to load a plugin from
- * #1201 Add inwardHtml/outwardHtml functions to Config object
- 
-I18n
- * #1109 Spanish language extended
- * #1116 [ExtendedFileManager] added French translation
- * #853 updated Translation for farsi
- * fixed wrong encoding in Spanish language file 
- * fixed no bold/italic/underline button images in Spanish
- *  #1194 [ExtendedFileManager] updated French translation
-
- 
-Xinha 0.94
- * Ticket #1093 [InsertSmiley] remove smiley gifs from trunk
- * fixed Ticket #1019 Cusor not jumping to editable part of window when clicked in IE
- * [TableOperations] Add config option to not dispaly toolbar buttons
- * fixed Ticket #1021  Prevent ExtendedFileManager from masking ImageManager
- * fixed Ticket #1023 [ImageManager] Add config item to allow the advanced image options to be hidden from the user
- * fixed Ticket #1026 fix problems with loading skins
- * fixed Tickets #1030 & #1031: slow loading large pages in IE
- * fixed Ticket #1034 [ExtendedFileManager] Color pickers shown when use_color_pickers is false
- * fixed Ticket #1035 [TransformInnerHTML] tags corruptedunder certain circumstances
- * fixed Ticket #1036 [ExtendedFileManager] window is only resized after all thumbnails have benn loaded, which can take quite some time
- * fixed Ticket #1039 Firefox full page adds multiple paragraphs after view source
- * fixed Ticket #1019 Cusor not jumping to editable part of window when clicked in IE7
- * fixed Ticket #1046 Error in IE 6 when switching from text to wysiwyg
- * [DOMwalk] linebreaks inserted before <br />s
- * catch error in IE when trying to restore selection on non-displayed area
- * fixed Ticket #973 Error switching wysiwyg/html including javascript file on the code
- * fixed Ticket #1028  - [Linker] automatically (attempt to) work around an issue with mod_security being triggered because of the charset on our POST requests
- * fixed Ticket #1055 [Stylist] Inappropriate styles (for other tags) are shown
- * added Dutch language files
- * added new hook 'onBeforeSubmit' for firePluginEvent()
- * added new hook 'onBeforeUnload' for firePluginEvent()
- * fixed Ticket #1048 Full Screen plugin doesn't load if many editors on page
- * fixed Ticket #1053 ListType plugin doesn't work in panel config with multiple editors
- * fixed Ticket #1026 Skins referenced with <link>-tags don't work anymore
- * fixed Ticket #1059 [Equation] loosing formula onsubmit
- * fixed Ticket #1060 [Equation] various updates
- * [Equation] preserve formula on reload in Mozilla
- * [Equation] updated ASCIIMathML.js
- * [Skin:silva] padding and border on textarea make the textmode too wide 
- * fixed Ticket#1001 Editor loads a bunch of null urls in ie
- * fixed Ticket #1068 [TranformInnerHTML] newlines added after </script>
- * fixed Ticket#1069 Editor document URL prefixed to any href that only consists of URL parameters
- * added Thai translation for core
- * added complete Portuguese Brazilian translation
- * updated lc_parse script
- * fixed Ticket #1071 [ExtendedFileManager] external image URL image inserted with width/height 0, amking it invisible
- * fixed Ticket #1074 [SuperClean] throws warnings in PHP 5
- * fixed Ticket #1079 [DynamicCSS] lists Xinha internal CSS
- * fixed Ticket #1080 Some plugins leave behind stylesheet links in fullpage mode
- * fixed Ticket #1083 Convert URLs to links - Error
- * fixed Ticket #1084 URL auto-linking (Gecko): URLs with user:password@domain.tld falsely recognized as email address
- * fixed Ticket #1085 URL auto-linking (Gecko): IP numbers don't work
- * fixed Ticket #1081 Control character is not being removed inside SCRIPT tags or HEAD when switching from textmode to htmlmode
- * fixed Ticket #1078 [InsertImage] spacing attributes: inconsistent behaviour when editing image
- * fixed Ticket #1089 [Color Picker] Localize OK Label
- * fixed Ticket #1091 [SaveSubmit] does not correctly submit value of checkboxes and radio buttons
-
-Xinha 0.93
- - fixed Ticket #967 Font Color Picker stops working after using one of ImageManager, ExtendedFileManager, FullPage, or HorizontalRule
- - fixed Ticket #965 When switching between Xinhas in the same page, in textmode toolbar stays disabled
- - fixwd Ticket #963 DOMwalk IE: head tag attributes without quotes and closing slash
- - Ticket #962 DOMwalk Mozilla: improved source indentation
- - fixed Ticket #957 If item in in xinha_editors is not a textarea: skip gracefully
- - fixed Ticket #900: catch an fatal error that occured sometimes when switching between modes in fullpage mode in Mozilla
- - fixed Ticket #969 DOMwalk Gecko: line breaks rendered as <br>s inside <pre> blocks
- - fixed Ticket #976 Loading message misplaced in IE7
- - fixed Ticket #977 TableOperations toolbar off-place in ext_example.html
- - fixed Ticket #978 defining a padding for <td>s in global css affects Xinha framework
- - Ticket #979 improve checking for non-supported browsers
- - fixed Ticket #934 SuperClean plugin returns just quotation when executed on localhost
- - Ticket #929 Save changes on page unload fixed for Mozilla 
- - fixed Ticket #980 ImageManager color format bug
- - fixed Ticket #981 No doctype in iframe content document/ editor always in quirks mode
- - fixed Ticket #543 Stylist Panel overflow broken
- - Ticket #983 added id for iframe
- - fixed Ticket #984 !ExtendedFileManager produces php warning
- - optimized icon file size
- - fixed !JavaScript error in !ImageManager/!ExtendedFileManager image editor
- - Ticket #908* Prompts broken in IE7: fixed for EFM, !ImageManager & !TableOperations
- - Fixes for TableOperations, tickets #82, #908*, #912 and #947
- - fixed Ticket #998* whitespace added before and/or after content (in non-fullpage mode)
- - fixed slow unloading in Mozilla
- - Fix focus problem when switching from html to wysiwyg in Gecko. See ticket #900.
- - fixed toolbar floating issue
- - fixed #1003 HTML length limited to 1024 characters with plugin CharCounter
- - Ticket #1000 new public methods for getting/setting editor content
- - fixed #735 - IE eating scripts and comments at the beginning of pages.
- - Added new config variables to set iframe width if less than editor width (ticket:322) and set alignment of toolbar buttons.
- - added Basque translation for XinhaCore
- - prevent an error if server is set to parse .js files as PHP
- - Ticket #127 plugin HtmlEntities: Entities.js  file corrupt
-
-Xinha 0.92beta
- - fixed Ticket #831 stop empty anchors from being removed
- - Make htmlarea.js just load XinhaCore.js instead of being a copy of it.
- - fixed Ticket #445 Toggle TableBorder doesn't work if this.fullpage=true or using FullPage plugin
- - fixed Ticket #551 shape and coord attributes of area element are ignored by IE
- - fixed Ticket #650 SpellChecker is not compatible with FullPage plugin
- - fixed Ticket #816 CharacterMap and ListType panel modes make editor jump to top in IE
- - fixed Ticket #570 change behaviour of justify when an image is selected to make the image float left/right, 
-   click the justify button again to undo it
- - fixed Ticket #891 noscript content got escaped
- - fixed Ticket #857 Firefox fails to load in fullpage mode when <link ..> tag in wrong place.
- - fixed Ticket #841 Spell Checker - Won't return to xinha.
- - fixed Ticket #914 All buttons stay grey & this.getParentElement is not a function message when not calling
-   Xinha.loadPlugins() in xinha_init function
- - fixed Ticket #911 Background color does not work in Firefox
- - fixed Ticket #912 an error is thrown in Mozilla when clicking merge cells button and fewer than 2 cells are selected
- - fixed Ticket #816 CharacterMap and ListType panel modes make editor jump to top in IE
- - fixed Ticket #917 getHTMLWrapper in IE renders attributes like _stylist_usedtobe="[object Object]"
- - fixed Ticket #556 stripBaseHref didn't work without baseHref defined explicitly.
- - Update InsertPicture plugin Update
- - fixed Ticket #921 EFM extended file manager - iframe height problem (IE)
- - Ticket #923 colorPicker face lift & localisation
- - fixed Ticket #924 EFM + ImageManager re-transforming of url to original image after automatic resize broken
- - Ticket #900- retain editing position position between modes
- - fixed Ticket #928 ImageManager fails if (another) Files.php exists in include path
- - fixed Ticket #935 EFM demo_images php upload allowed: possible security risk
- - Ticket #939 Japanese langage support 
- - fixed Ticket #3 Horizontal Rule Selection
- - Plugin ExtendedFileManager: added doc to allowed upload extensions
- - Plugin PasteText update
- - Plugin HtmlEntities: default preset iso-8859-1
- - fixed Ticket #948 IE: inline styles are not rendered by DOMwalk getHTML()
- - Plugin HorizontalRule update
- - Plugin SaveSubmit update
- - Plugin Linker update
- - fixed Ticket #823 editor contents was not submitted when using JavaScript form.submit() without prior form.onsubmit()
- - fixed Ticket #459 all body attributes removed in full page mode in FireFox
- - _editor_url is now converted to absolute if it is relative. 
- - fixed Ticket #594 IE: insertHTML() inserts HTML outside editor when editor is not focussed
- - Ticket #954 FullScreen mode can now be called programmatically or on startup with or without button
- - fixed Ticket #321 FullScreen : select elements show through in IE6 
- - fixed Ticket #953 Statusbar has ugly white gap at the bottom when switching back from full screen in IE 
- - fixed Ticket #952 FullScreen: scrollbars don't disappear in IE in QuirksMode
- - fixed Ticket #603 Popop Dialog Height problems
- - fixed Ticket #955 DOMwalk getHTML outputs empty attribute with value "true" instead of attribute name and some are skipped at all
- 
-Xinha 0.91beta
- - changed namespace from HTMLArea to Xinha
- - the core file is now named XinhaCore.js instead of htmlarea.js,
-   please change your pages accordingly (the htmlarea.js will be removed!)
- - the color picker script is now loaded on demand to reduce initial loading time
- 
-Xinha 0.9beta
-This equals Xinha revision 635 of Jan 11 2007
- - All JavaScript files over 2kb have been compressed using the dojo JavaScript compressor
- - All gifs have been optimized using Trout's GIF Optimizer version 2.3
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/blue-look/button-background.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/blue-look/button-background.png
deleted file mode 100644
index 9680684..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/blue-look/button-background.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/blue-look/separator.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/blue-look/separator.gif
deleted file mode 100644
index 5ae3d59..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/blue-look/separator.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/blue-look/skin.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/blue-look/skin.css
deleted file mode 100644
index b0d478c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/blue-look/skin.css
+++ /dev/null
@@ -1,105 +0,0 @@
-.htmlarea .toolbar, .htmlarea .toolbar .button
-{
-  background-color:#f7f8fd;
-}
-
-.htmlarea .toolbarRow
-{
-  margin-top:2px;
-  margin-bottom:2px;
-  border:1px dotted #DEDEDE;
-  padding:2px;
-  -moz-border-radius:3px;
-  margin:4px;
-  height:25px;
-}
-
-.htmlarea .toolbar .button
-{
-  background-image: url(button-background.png);
-  width:20px;
-  height:20px;
-  padding:0px;
-  border:1px solid #f7f8fd;
-}
-
-.buttonImageContainer
-{
-  position:relative;
-  left:1px;
-  top :1px;
-}
-
-.htmlarea .toolbar .separator {
-  margin:0px;
-  background-image: url(separator.gif);
-  border:1px #f7f8fd;
-  width:   7px;
-  height: 20px;
-  padding: 0px;
-}
-
-.htmlarea .toolbar a.button:hover
-{
-  border: 1px solid;
-  border-color: white #CCC #CCC white;
-}
-
-.htmlarea .toolbar a.buttonDisabled:hover
-{
-  border-color: #f7f8fd;
-}
-
-.htmlarea .toolbar .button.buttonActive,
-.htmlarea .toolbar .button.buttonPressed
-{
-  border: 1px solid;
-  border-color: #CCC white white #CCC;
-}
-
-.htmlarea .statusBar {
-  border-color: #CCC white white #CCC;
-  padding: 0px;
-  height:20px;
-  background-image: url(button-background.png);
-  background-repeat: repeat-x;
-  background-color: #f7f8fd;
-  color: ButtonText;
-  font: 11px helvetica,arial,sans-serif;
-}
-
-.htmlarea .statusBar .statusBarWidgetContainer
-{
-  background-image: url(button-background.png);
-  background-repeat: repeat-x;
-  background-color: #f7f8fd;
-}
-
-.htmlarea .statusBar .statusBarTree
-{
-  display:block;
-  margin: 3px;
-}
-
-.htmlarea .statusBar .statusBarTree a
-{
-  padding: 2px 5px;
-  color: #00f;
-  text-decoration:none;
-}
-
-.htmlarea .panel h1
-{
-  background-image: url('button-background.png');
-  background-repeat: repeat-x;
-  background-color: #f7f8fd;
-}
-.dialog {
-  background-color:#f7f8fd;
-}
-.dialog .title {
-  background-image: url(button-background.png);
-}  
-.dialog button{
-  background-image: url(button-background.png);
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/green-look/button-background.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/green-look/button-background.gif
deleted file mode 100644
index d137119..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/green-look/button-background.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/green-look/separator.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/green-look/separator.gif
deleted file mode 100644
index 0357233..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/green-look/separator.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/green-look/skin.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/green-look/skin.css
deleted file mode 100644
index b278580..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/green-look/skin.css
+++ /dev/null
@@ -1,96 +0,0 @@
-.htmlarea .toolbar, .htmlarea .toolbar .button
-{
-  background-color:#f8fdf8;
-}
-.htmlarea .toolbarRow
-{
-  margin-top:2px;
-  margin-bottom:2px;
-  border:1px dotted #DEDEDE;
-  padding:2px;
-  -moz-border-radius:3px;
-  margin:4px;
-  height:25px;
-}
-.htmlarea .toolbar .button
-{
-  background-image:url(button-background.gif);
-  width:20px;
-  height:20px;
-  padding:0;
-  border:1px solid #f8fdf8;
-}
-.buttonImageContainer
-{
-  position:relative;
-  left:1px;
-  top:1px;
-}
-.htmlarea .toolbar .separator {
-  margin:0;
-  background-image:url(separator.gif);
-  border:1px #f8fdf8;
-  width:7px;
-  height:20px;
-  padding:0;
-}
-.htmlarea .toolbar a.button:hover
-{
-  border:1px solid;
-  border-color:#fff #ccc #ccc #fff;
-}
-.htmlarea .toolbar a.buttonDisabled:hover
-{
-  border-color:#f8fdf8;
-}
-.htmlarea .toolbar .buttonActive,
-.htmlarea .toolbar .buttonPressed
-{
-  border:1px solid;
-  border-color:#ccc #fff #fff #ccc;
-  background:#ffb166;
-}
-.htmlarea .statusBar {
-  border-color:#ccc #fff #fff #ccc;
-  padding:0;
-  height:20px;
-  background-image:url(button-background.gif);
-  background-repeat:repeat-x;
-  background-color:#f8fdf8;
-  color:ButtonText;
-  font:11px helvetica,arial,sans-serif;
-}
-
-.htmlarea .statusBar .statusBarWidgetContainer
-{
-  background-image: url(button-background.gif);
-  background-repeat: repeat-x;
-  background-color: #f8fdf8;
-}
-
-.htmlarea .statusBar .statusBarTree
-{
-  display:block;
-  margin:3px;
-}
-.htmlarea .statusBar .statusBarTree a
-{
-  padding:2px 5px;
-  color:#00f;
-  text-decoration:none;
-}
-.htmlarea .panel h1
-{
-  background-image:url(button-background.gif);
-  background-repeat:repeat-x;
-  background-color:#f8fdf8;
-}
-.dialog {
-  background-color:#f8fdf8;
-}
-.dialog .title {
-  background-image: url(button-background.png);
-}  
-.dialog button{
-  background-image: url(button-background.png);
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/dialog.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/dialog.jpg
deleted file mode 100644
index 05676b5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/dialog.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/html.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/html.gif
deleted file mode 100644
index ddd6531..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/html.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/skin.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/skin.css
deleted file mode 100644
index 5044b56..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/skin.css
+++ /dev/null
@@ -1,177 +0,0 @@
-/*--------------------------------*/ 
-/*      silva skin for Xinha      */ 
-/*                                */ 
-/*      by Raimund Meyer (ray)    */ 
-/*      xinha@raimundmeyer.de     */
-/*           2007-1-9             */ 
-/*--------------------------------*/ 
-
-.htmlarea .toolbar, .htmlarea .toolbar .button
-{
-  background-color:transparent;
-}
-.htmlarea .toolbar
-{
-  padding:0;
-  background-image: url(toolbar.png);
-}
-.htmlarea .toolbarRow
-{
-  margin-top:0px;
-  margin-bottom:0px;
-  border:1px solid #F1F1F1;
-  padding:0px;
-  -moz-border-radius:15px;
-  margin:4px;
-  height:20px;
-}
-/* hack: IE6 does not know border-color: transparent;*/
-html > body .htmlarea .toolbarRow {
-  border-color: transparent;
-}
-
-.htmlarea .toolbar .button
-{
-  width:18px;
-  height:18px;
-  padding:1px 2px 2px 1px ;
-  border: solid #F1F1F1;
-  border-width:1px;
-}
-
-html > body .htmlarea .toolbar .button {
-  border-color: transparent;
-}
-
-.buttonImageContainer
-{
-  position:relative;
-  left:1px;
-  top :1px;
-}
-
-.htmlarea .toolbar a.button:hover
-{
-  border: solid 1px;
-  border-color: black;
-}
-.htmlarea .toolbar a.buttonDisabled:hover
-{
-  border: solid transparent 1px;
-}
-
-.htmlarea .toolbar .button.buttonActive,
-.htmlarea .toolbar .button.buttonPressed
-{
-  border: black dotted 1px;
-  padding:2px 1px 1px 2px;  
-}
-
-.htmlarea .toolbar .button.buttonPressed {
-  padding:1px 2px 2px 1px ;
-}
-.htmlarea .toolbar .separator {
-  margin: 3px;
-  border-left: 1px dotted black;
-  border-right: none;
-  width: 1px;
-  height: 11px;
-  padding: 0px;
-}
-
-.htmlarea .statusBar {
-  border-color: #CCC white white #CCC;
-  padding: 0px;
-  height:20px;
-  background-image: url(statusbar.png);
-  background-repeat: repeat-x;
-  background-color: white;
-  color: grey;
-  font: 11px Arial,Helvetica,sans-serif;
-  vertical-align: middle;
-}
-
-.htmlarea .statusBar .statusBarWidgetContainer
-{
-  background-image: url(statusbar.png);
-  background-repeat: repeat-x;
-  background-color: white;
-}
-
-.htmlarea .statusBar .statusBarTree
-{
-  display:block;
-  margin: 3px;
-}
-
-.htmlarea .statusBar .statusBarTree a
-{
-  padding: 0 5px;
-  color: green;
-  text-decoration:none;
-  letter-spacing:0.15em;
-  font-size:120%;
-  border: none;
-  padding: 2px 5px;
-}
-.htmlarea .statusBar .statusBarTree a:visited { color:green; }
-.htmlarea .statusBar .statusBarTree a:hover {
-  background-color: transparent;
-  color: green;
-  border: none;
-  padding: 1px 5px;
-}
-
-.dialog {
-  /* background: url(dialog.jpg) #f0f0f0 no-repeat; */
-  background-color: #f0f0f0;
- }
-body.dialog {
-	padding-top:0;
-}
-.dialog, .dialog button, .dialog input, .dialog select, .dialog textarea, .dialog table,.dialog td,.dialog th, .panel {
-  font: 11px Arial,Helvetica,sans-serif !IMPORTANT;
-}
-.panel a {
-  color:#444;
-  border-bottom: 1px dotted #bbb;
-}
-.panel a:hover {
-  background-color: #eee;
-}
-.dialog .title,.dialog  h1,.htmlarea .panel h1 {
-  background-image: url(toolbar.png);
-  background-repeat: repeat-x;
-  color:black;
-  font:Arial,Helvetica,sans-serif !IMPORTANT;
-  letter-spacing:0.2em;
-  font-size:13px;
-  font-weight:400;
-}  
-.dialog .title {
-
-}
-
-.dialog button{
-  background: url(statusbar.png) bottom repeat-x;
-  border:1px solid grey;
-  height:18px;
-  vertical-align: middle
-}
-/* separate definition for the sake of IE6*/
-.dialog input[type=button],.dialog input[type=submit]{
-  background: url(statusbar.png) bottom repeat-x;
-  border:1px solid grey;
-  height:18px;
-  vertical-align: middle
-}
-.htmlarea textarea.xinha_textarea {
-  background:url(html.gif) bottom right no-repeat;
-  /*padding:5px;
-  border:2px dotted #bbb;*/
-  font-family: "Lucida Console",Courier,monospace;
-  font-size: 10pt;
-}
-.htmlarea .dTreeNode {
-  color:black;
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/skin.xml b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/skin.xml
deleted file mode 100644
index cfe00d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/skin.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<skin>
-  <meta name="name" value="silva" />
-  <meta name="developer" value="Raimund Meyer" />
-  <meta name="developer_url" value="http://x-webservice.net" />
-  <meta name="sponsor" value="" />
-  <meta name="sponsor_url" value="" />
-  <meta name="version" value="1.0" />
-  <meta name="license" value="htmlArea" />
-  <recommendedIcons>Crystal</recommendedIcons>
-</skin>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/statusbar.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/statusbar.png
deleted file mode 100644
index 16db3c6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/statusbar.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/toolbar.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/toolbar.png
deleted file mode 100644
index 6f46299..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-0.96.1/skins/silva/toolbar.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/images/clippy.svg b/app/src/main/webapp/roller-ui/images/clippy.svg
new file mode 100644
index 0000000..eda80b9
--- /dev/null
+++ b/app/src/main/webapp/roller-ui/images/clippy.svg
@@ -0,0 +1,4 @@
+<svg height="1024" width="896" xmlns="http://www.w3.org/2000/svg">
+  <!-- MIT license https://octicons.github.com -->
+  <path d="M128 768h256v64H128v-64z m320-384H128v64h320v-64z m128 192V448L384 640l192 192V704h320V576H576z m-288-64H128v64h160v-64zM128 704h160v-64H128v64z m576 64h64v128c-1 18-7 33-19 45s-27 18-45 19H64c-35 0-64-29-64-64V192c0-35 29-64 64-64h192C256 57 313 0 384 0s128 57 128 128h192c35 0 64 29 64 64v320h-64V320H64v576h640V768zM128 256h512c0-35-29-64-64-64h-64c-35 0-64-29-64-64s-29-64-64-64-64 29-64 64-29 64-64 64h-64c-35 0-64 29-64 64z" />
+</svg>
diff --git a/app/src/main/webapp/roller-ui/images/feather.svg b/app/src/main/webapp/roller-ui/images/feather.svg
new file mode 100644
index 0000000..2c4e274
--- /dev/null
+++ b/app/src/main/webapp/roller-ui/images/feather.svg
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Feather" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 2392.5 4226.6" enable-background="new 0 0 2392.5 4226.6" xml:space="preserve">
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-5167.0962" y1="697.5549" x2="-4570.1162" y2="1395.619" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0" style="stop-color:#F69923"/>
+	<stop  offset="0.3123" style="stop-color:#F79A23"/>
+	<stop  offset="0.8383" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M1798.9,20.1C1732.6,59.2,1622.5,170,1491,330.5l120.8,228c84.8-121.3,170.9-230.4,257.8-323.6
+	c6.7-7.4,10.2-10.9,10.2-10.9c-3.4,3.6-6.8,7.3-10.2,10.9c-28.1,31-113.4,130.5-242.1,328.1c123.9-6.2,314.3-31.5,469.6-58.1
+	c46.2-258.8-45.3-377.3-45.3-377.3S1935.5-60.6,1798.9,20.1z"/>
+<path fill="none" d="M1594.4,1320.7c0.9-0.2,1.8-0.3,2.7-0.5l-17.4,1.9c-1.1,0.5-2,1-3.1,1.4
+	C1582.6,1322.6,1588.5,1321.6,1594.4,1320.7z"/>
+<path fill="none" d="M1471.1,1729.1c-9.9,2.2-20,3.9-30.2,5.4C1451.1,1733,1461.2,1731.2,1471.1,1729.1z"/>
+<path fill="none" d="M633.1,2645.2c1.3-3.4,2.6-6.8,3.8-10.2c26.6-70.2,52.9-138.4,79-204.9c29.3-74.6,58.2-146.8,86.8-216.8
+	c30.1-73.8,59.8-145.1,89.1-214c30.7-72.3,61-141.9,90.7-208.9c24.2-54.5,48-107.3,71.5-158.4c7.8-17,15.6-33.9,23.4-50.6
+	c15.4-33.1,30.7-65.6,45.7-97.3c13.9-29.3,27.7-57.9,41.4-86c4.5-9.4,9.1-18.6,13.6-27.9c0.7-1.5,1.5-3,2.2-4.5l-14.8,1.6
+	l-11.8-23.2c-1.1,2.3-2.3,4.5-3.5,6.8c-21.2,42.1-42.2,84.6-63,127.5c-12,24.8-24,49.7-35.9,74.7c-33,69.3-65.5,139.2-97.4,209.6
+	c-32.3,71.1-63.9,142.6-94.9,214.2c-30.5,70.3-60.3,140.7-89.6,210.9c-29.2,70.1-57.7,140-85.6,209.4
+	c-29.1,72.5-57.4,144.3-84.8,215.3c-6.2,16-12.4,32-18.5,48c-22,57.3-43.4,113.8-64.3,169.6l18.6,36.7l16.6-1.8
+	c0.6-1.7,1.2-3.4,1.8-5C580.1,2786.5,606.7,2714.9,633.1,2645.2z"/>
+<path fill="none" d="M1433.2,1735.7L1433.2,1735.7c0.1,0,0.1-0.1,0.2-0.1C1433.4,1735.6,1433.3,1735.6,1433.2,1735.7z"/>
+<path fill="#BE202E" d="M1393.2,1934.8c-15.4,2.8-31.3,5.5-47.6,8.3c-0.1,0-0.2,0.1-0.3,0.1c8.2-1.2,16.3-2.4,24.3-3.8
+	C1377.6,1938,1385.4,1936.5,1393.2,1934.8z"/>
+<path opacity="0.35" fill="#BE202E" d="M1393.2,1934.8c-15.4,2.8-31.3,5.5-47.6,8.3c-0.1,0-0.2,0.1-0.3,0.1
+	c8.2-1.2,16.3-2.4,24.3-3.8C1377.6,1938,1385.4,1936.5,1393.2,1934.8z"/>
+<path fill="#BE202E" d="M1433.6,1735.5c0,0-0.1,0-0.1,0.1c-0.1,0-0.1,0.1-0.2,0.1c2.6-0.3,5.1-0.8,7.6-1.1
+	c10.3-1.5,20.4-3.3,30.2-5.4C1458.8,1731.2,1446.3,1733.4,1433.6,1735.5L1433.6,1735.5L1433.6,1735.5z"/>
+<path opacity="0.35" fill="#BE202E" d="M1433.6,1735.5c0,0-0.1,0-0.1,0.1c-0.1,0-0.1,0.1-0.2,0.1c2.6-0.3,5.1-0.8,7.6-1.1
+	c10.3-1.5,20.4-3.3,30.2-5.4C1458.8,1731.2,1446.3,1733.4,1433.6,1735.5L1433.6,1735.5L1433.6,1735.5z"/>
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-9585.3418" y1="620.5048" x2="-5326.209" y2="620.5048" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0.3233" style="stop-color:#9E2064"/>
+	<stop  offset="0.6302" style="stop-color:#C92037"/>
+	<stop  offset="0.7514" style="stop-color:#CD2335"/>
+	<stop  offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_2_)" d="M1255.7,1147.6c36.7-68.6,73.9-135.7,111.5-201c39-67.8,78.5-133.6,118.4-197c2.3-3.7,4.7-7.5,7-11.3
+	c39.4-62.4,79.2-122.4,119.3-179.8l-120.8-228c-9.1,11.1-18.2,22.4-27.5,33.9c-34.8,43.4-71,90.1-108.1,139.6
+	c-41.8,55.8-84.8,115.4-128.5,177.9c-40.3,57.8-81.2,118.3-122.1,180.9c-34.8,53.3-69.8,108.2-104.5,164.5c-1.3,2.1-2.6,4.2-3.9,6.3
+	l157.2,310.5C1187.3,1277.6,1221.3,1212,1255.7,1147.6z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-9071.207" y1="1047.6898" x2="-6533.1782" y2="1047.6898" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0" style="stop-color:#282662"/>
+	<stop  offset="9.548390e-02" style="stop-color:#662E8D"/>
+	<stop  offset="0.7882" style="stop-color:#9F2064"/>
+	<stop  offset="0.9487" style="stop-color:#CD2032"/>
+</linearGradient>
+<path fill="url(#SVGID_3_)" d="M539.7,2897.1c-20.8,57.2-41.7,115.4-62.7,174.9c-0.3,0.9-0.6,1.7-0.9,2.6c-3,8.4-5.9,16.8-8.9,25.2
+	c-14.1,40.1-26.4,76.2-54.5,158.3c46.3,21.1,83.5,76.7,118.7,139.8c-3.7-65.3-30.8-126.7-82.1-174.2
+	c228.3,10.3,425-47.4,526.7-214.3c9.1-14.9,17.4-30.5,24.9-47.2c-46.2,58.6-103.5,83.5-211.4,77.4c-0.2,0.1-0.5,0.2-0.7,0.3
+	c0.2-0.1,0.5-0.2,0.7-0.3c158.8-71.1,238.5-139.3,308.9-252.4c16.7-26.8,32.9-56.1,49.5-88.6C1009,2841.2,848.1,2881.8,678.6,2851
+	l-127.1,13.9C547.5,2875.6,543.6,2886.3,539.7,2897.1z"/>
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-9346.126" y1="580.817" x2="-5086.9941" y2="580.817" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0.3233" style="stop-color:#9E2064"/>
+	<stop  offset="0.6302" style="stop-color:#C92037"/>
+	<stop  offset="0.7514" style="stop-color:#CD2335"/>
+	<stop  offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_4_)" d="M599,2612.4c27.5-71,55.8-142.8,84.8-215.3c27.8-69.4,56.4-139.2,85.6-209.4
+	c29.2-70.2,59.1-140.5,89.6-210.9c31-71.6,62.7-143.1,94.9-214.2c31.9-70.3,64.4-140.3,97.4-209.6c11.9-25,23.9-49.9,35.9-74.7
+	c20.8-42.9,41.8-85.4,63-127.5c1.1-2.3,2.3-4.5,3.5-6.8l-157.2-310.5c-2.6,4.2-5.1,8.4-7.7,12.6c-36.6,59.8-73.1,121-108.9,183.5
+	c-36.2,63.1-71.7,127.4-106.4,192.6c-29.3,55-57.9,110.5-85.7,166.5c-5.6,11.4-11.1,22.6-16.6,33.9
+	c-34.3,70.5-65.2,138.6-93.2,204.1c-31.7,74.2-59.6,145.1-84,212.3c-16.1,44.2-30.7,86.9-44.1,127.9c-11,35-21.5,70.1-31.4,105
+	c-23.5,82.3-43.7,164.4-60.3,246.2L516.2,2830c20.9-55.8,42.3-112.3,64.3-169.6C586.6,2644.5,592.8,2628.4,599,2612.4z"/>
+<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-9035.5029" y1="638.4408" x2="-6797.2012" y2="638.4408" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0" style="stop-color:#282662"/>
+	<stop  offset="9.548390e-02" style="stop-color:#662E8D"/>
+	<stop  offset="0.7882" style="stop-color:#9F2064"/>
+	<stop  offset="0.9487" style="stop-color:#CD2032"/>
+</linearGradient>
+<path fill="url(#SVGID_5_)" d="M356.1,2529.2c-19.8,99.8-33.9,199.2-41,298c-0.2,3.5-0.6,6.9-0.8,10.4
+	c-49.3-79-181.3-156.1-181-155.4c94.5,137,166.2,273,176.9,406.5c-50.6,10.4-119.9-4.6-200-34.1c83.5,76.7,146.2,97.9,170.6,103.6
+	c-76.7,4.8-156.6,57.5-237.1,118.2c117.7-48,212.8-67,280.9-51.6C216.6,3530.6,108.3,3868.2,0,4226.6c33.2-9.8,53-32.1,64.1-62.3
+	c19.3-64.9,147.4-490.7,348.1-1050.4c5.7-15.9,11.5-31.9,17.3-48c1.6-4.5,3.3-9,4.9-13.4c21.2-58.7,43.2-118.6,65.9-179.7
+	c5.2-13.9,10.4-27.8,15.6-41.8c0.1-0.3,0.2-0.6,0.3-0.8l-157.8-311.8C357.7,2521.9,356.8,2525.5,356.1,2529.2z"/>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-9346.126" y1="1021.6218" x2="-5086.9941" y2="1021.6218" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0.3233" style="stop-color:#9E2064"/>
+	<stop  offset="0.6302" style="stop-color:#C92037"/>
+	<stop  offset="0.7514" style="stop-color:#CD2335"/>
+	<stop  offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_6_)" d="M1178.1,1370.3c-4.5,9.2-9,18.5-13.6,27.9c-13.6,28.1-27.4,56.7-41.4,86
+	c-15.1,31.7-30.3,64.1-45.7,97.3c-7.8,16.7-15.5,33.5-23.4,50.6c-23.5,51.1-47.3,103.9-71.5,158.4c-29.7,67-60,136.6-90.7,208.9
+	c-29.3,68.9-59,140.2-89.1,214c-28.6,70-57.5,142.3-86.8,216.8c-26.1,66.5-52.4,134.7-79,204.9c-1.3,3.4-2.6,6.8-3.8,10.2
+	c-26.4,69.7-53,141.3-79.8,214.7c-0.6,1.7-1.2,3.4-1.8,5l127.1-13.9c-2.5-0.5-5.1-0.8-7.6-1.3c152-18.9,354-132.5,484.6-272.7
+	c60.2-64.6,114.8-140.8,165.3-230c37.6-66.4,72.9-140,106.5-221.5c29.4-71.2,57.6-148.3,84.8-231.9c-34.9,18.4-74.9,31.9-119,41.3
+	c-7.7,1.6-15.6,3.2-23.6,4.6c-8,1.4-16.1,2.7-24.3,3.8l0,0l0,0c0.1,0,0.2-0.1,0.3-0.1c141.7-54.5,231.1-159.8,296.1-288.7
+	c-37.3,25.4-97.9,58.7-170.5,74.7c-9.9,2.2-20,3.9-30.2,5.4c-2.6,0.4-5.1,0.8-7.6,1.1l0,0l0,0c0.1,0,0.1-0.1,0.2-0.1
+	c0,0,0.1,0,0.1-0.1l0,0c49.2-20.6,90.7-43.6,126.7-70.8c7.7-5.8,15.2-11.8,22.4-18.1c11-9.5,21.4-19.5,31.4-30
+	c6.4-6.7,12.6-13.6,18.6-20.8c14.1-16.8,27.3-34.9,39.7-54.6c3.8-6,7.5-12.1,11.2-18.4c4.7-9.1,9.2-18,13.6-26.8
+	c19.8-39.8,35.6-75.3,48.2-106.5c6.3-15.6,11.8-30,16.5-43.4c1.9-5.3,3.7-10.5,5.4-15.5c5-15,9.1-28.3,12.3-40
+	c4.8-17.5,7.7-31.4,9.3-41.5l0,0l0,0c-4.8,3.8-10.3,7.6-16.5,11.3c-42.8,25.6-116.2,48.8-175.4,59.7l116.7-12.8l-116.7,12.8
+	c-0.9,0.2-1.8,0.3-2.7,0.5c-5.9,1-11.9,1.9-17.9,2.9c1.1-0.5,2-1,3.1-1.4l-399.3,43.8C1179.6,1367.4,1178.9,1368.8,1178.1,1370.3z"
+	/>
+<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-9610.334" y1="999.733" x2="-5351.2017" y2="999.733" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0.3233" style="stop-color:#9E2064"/>
+	<stop  offset="0.6302" style="stop-color:#C92037"/>
+	<stop  offset="0.7514" style="stop-color:#CD2335"/>
+	<stop  offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_7_)" d="M1627.6,563.1c-35.5,54.5-74.3,116.4-116,186.5c-2.2,3.6-4.4,7.4-6.6,11.1
+	c-36,60.7-74.3,127.3-114.5,200.3c-34.8,63-71,130.6-108.6,203.3c-32.8,63.3-66.7,130.5-101.5,201.6l399.3-43.8
+	c116.3-53.5,168.3-101.9,218.8-171.9c13.4-19.3,26.9-39.5,40.3-60.4c41-64,81.2-134.5,117.2-204.6c34.7-67.7,65.3-134.8,88.8-195.3
+	c14.9-38.5,26.9-74.3,35.2-105.7c7.3-27.7,13-54,17.4-79.1C1941.9,531.6,1751.5,557,1627.6,563.1z"/>
+<path fill="#BE202E" d="M1369.6,1939.4c-8,1.4-16.1,2.7-24.3,3.8l0,0C1353.5,1942.1,1361.6,1940.8,1369.6,1939.4z"/>
+<path opacity="0.35" fill="#BE202E" d="M1369.6,1939.4c-8,1.4-16.1,2.7-24.3,3.8l0,0C1353.5,1942.1,1361.6,1940.8,1369.6,1939.4z"/>
+<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-9346.126" y1="1152.7261" x2="-5086.9941" y2="1152.7261" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0.3233" style="stop-color:#9E2064"/>
+	<stop  offset="0.6302" style="stop-color:#C92037"/>
+	<stop  offset="0.7514" style="stop-color:#CD2335"/>
+	<stop  offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_8_)" d="M1369.6,1939.4c-8,1.4-16.1,2.7-24.3,3.8l0,0C1353.5,1942.1,1361.6,1940.8,1369.6,1939.4z"/>
+<path fill="#BE202E" d="M1433.2,1735.7c2.6-0.3,5.1-0.8,7.6-1.1C1438.3,1734.9,1435.8,1735.3,1433.2,1735.7L1433.2,1735.7z"/>
+<path opacity="0.35" fill="#BE202E" d="M1433.2,1735.7c2.6-0.3,5.1-0.8,7.6-1.1C1438.3,1734.9,1435.8,1735.3,1433.2,1735.7
+	L1433.2,1735.7z"/>
+<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-9346.126" y1="1137.7247" x2="-5086.9941" y2="1137.7247" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0.3233" style="stop-color:#9E2064"/>
+	<stop  offset="0.6302" style="stop-color:#C92037"/>
+	<stop  offset="0.7514" style="stop-color:#CD2335"/>
+	<stop  offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_9_)" d="M1433.2,1735.7c2.6-0.3,5.1-0.8,7.6-1.1C1438.3,1734.9,1435.8,1735.3,1433.2,1735.7L1433.2,1735.7z"
+	/>
+<path fill="#BE202E" d="M1433.5,1735.6c0,0,0.1,0,0.1-0.1l0,0l0,0l0,0C1433.6,1735.5,1433.5,1735.5,1433.5,1735.6z"/>
+<path opacity="0.35" fill="#BE202E" d="M1433.5,1735.6c0,0,0.1,0,0.1-0.1l0,0l0,0l0,0C1433.6,1735.5,1433.5,1735.5,1433.5,1735.6z"
+	/>
+<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-6953.4072" y1="1134.7161" x2="-6011.9995" y2="1134.7161" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 3144.8108 -4619.2983)">
+	<stop  offset="0.3233" style="stop-color:#9E2064"/>
+	<stop  offset="0.6302" style="stop-color:#C92037"/>
+	<stop  offset="0.7514" style="stop-color:#CD2335"/>
+	<stop  offset="1" style="stop-color:#E97826"/>
+</linearGradient>
+<path fill="url(#SVGID_10_)" d="M1433.5,1735.6c0,0,0.1,0,0.1-0.1l0,0l0,0l0,0C1433.6,1735.5,1433.5,1735.5,1433.5,1735.6z"/>
+<path fill="#6D6E71" d="M2218.7,387v11.7h27.4v77.4h12.7v-77.4h27.6V387H2218.7z M2377,387l-30.6,62.2l-30.8-62.2h-15.3v89.1h11.7
+	v-70.7l30.3,61.3h8.1l30.3-61.3v70.7h11.7V387H2377z"/>
+</svg>
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/animated-overlay.gif b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/animated-overlay.gif
deleted file mode 100644
index d441f75..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/animated-overlay.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_flat_0_aaaaaa_40x100.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_flat_0_aaaaaa_40x100.png
deleted file mode 100644
index 9aab30b..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_flat_0_aaaaaa_40x100.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_flat_55_fbec88_40x100.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_flat_55_fbec88_40x100.png
deleted file mode 100644
index f084cb4..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_flat_55_fbec88_40x100.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_glass_75_d0e5f5_1x400.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_glass_75_d0e5f5_1x400.png
deleted file mode 100644
index 7b68dca..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_glass_75_d0e5f5_1x400.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_glass_85_dfeffc_1x400.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_glass_85_dfeffc_1x400.png
deleted file mode 100644
index 0782cd6..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_glass_85_dfeffc_1x400.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_glass_95_fef1ec_1x400.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_glass_95_fef1ec_1x400.png
deleted file mode 100644
index 83e61bc..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_glass_95_fef1ec_1x400.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png
deleted file mode 100644
index 4e5290a..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_inset-hard_100_f5f8f9_1x100.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_inset-hard_100_f5f8f9_1x100.png
deleted file mode 100644
index 4d33883..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_inset-hard_100_f5f8f9_1x100.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_inset-hard_100_fcfdfd_1x100.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_inset-hard_100_fcfdfd_1x100.png
deleted file mode 100644
index 9649e36..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-bg_inset-hard_100_fcfdfd_1x100.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_217bc0_256x240.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_217bc0_256x240.png
deleted file mode 100644
index 8d2b7e5..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_217bc0_256x240.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_2e83ff_256x240.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_2e83ff_256x240.png
deleted file mode 100644
index 84b601b..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_2e83ff_256x240.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_469bdd_256x240.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_469bdd_256x240.png
deleted file mode 100644
index 5dff3f9..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_469bdd_256x240.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_6da8d5_256x240.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_6da8d5_256x240.png
deleted file mode 100644
index f7809f8..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_6da8d5_256x240.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_cd0a0a_256x240.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_cd0a0a_256x240.png
deleted file mode 100644
index ed5b6b0..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_cd0a0a_256x240.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_d8e7f3_256x240.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_d8e7f3_256x240.png
deleted file mode 100644
index 9b46228..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_d8e7f3_256x240.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_f9bd01_256x240.png b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_f9bd01_256x240.png
deleted file mode 100644
index f1f0531..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/images/ui-icons_f9bd01_256x240.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/jquery-ui.min.css b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/jquery-ui.min.css
deleted file mode 100644
index a6dd08d..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/jquery-ui.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*! jQuery UI - v1.11.0 - 2014-08-06
-* http://jqueryui.com
-* Includes: core.css, draggable.css, resizable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, tabs.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=gloss_wave&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=glass&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=inset_hard&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
-* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-widget{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #a6c9e2;background:#fcfdfd url("images/ui-bg_inset-hard_100_fcfdfd_1x100.png") 50% bottom repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #4297d7;background:#5c9ccc url("images/ui-bg_gloss-wave_55_5c9ccc_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #c5dbec;background:#dfeffc url("images/ui-bg_glass_85_dfeffc_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#2e6e9e}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#2e6e9e;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #79b7e7;background:#d0e5f5 url("images/ui-bg_glass_75_d0e5f5_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1d5987}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#1d5987;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #79b7e7;background:#f5f8f9 url("images/ui-bg_inset-hard_100_f5f8f9_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#e17009}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#e17009;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fad42e;background:#fbec88 url("images/ui-bg_flat_55_fbec88_40x100.png") 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_469bdd_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_d8e7f3_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_6da8d5_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_217bc0_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_f9bd01_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:5px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:5px}.ui-widget-overlay{background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/jquery-ui.min.js b/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/jquery-ui.min.js
deleted file mode 100644
index 9d9db5a..0000000
--- a/app/src/main/webapp/roller-ui/jquery-ui-1.11.0/jquery-ui.min.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/*! jQuery UI - v1.11.0 - 2014-08-06
-* http://jqueryui.com
-* Includes: core.js, widget.js, mouse.js, position.js, draggable.js, resizable.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, menu.js, tabs.js
-* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
-
-(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap=#"+a+"]")[0],!!o&&i(o)):!1):(/input|select|textarea|button|object/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",function(){e.datepicker._isDisabledDatepicker(m.inline?t.parent()[0]:m.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))})}function o(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.0",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(){var t=this.css("position"),i="absolute"===t,s=this.parents().filter(function(){var t=e(this);return i&&"static"===t.css("position")?!1:/(auto|scroll)/.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==t&&s.length?s:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var r=0,h=Array.prototype.slice;e.cleanData=function(t){return function(i){for(var s,n=0;null!=(s=i[n]);n++)try{e(s).triggerHandler("remove")}catch(a){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=h.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=h.call(arguments,1),r=this;return n=!a&&o.length?e.widget.extend.apply(null,[n].concat(o)):n,a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))}),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=r++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var l=!1;e(document).mouseup(function(){l=!1}),e.widget("ui.mouse",{version:"1.11.0",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!l){this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),l=!0,!0)):!0}},_mouseMove:function(t){return e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button?this._mouseUp(t):t.which?this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted):this._mouseUp(t)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),l=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s?i.width():i.outerWidth(),height:s?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,N=e.extend({},y),M=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?N.left-=d:"center"===n.my[0]&&(N.left-=d/2),"bottom"===n.my[1]?N.top-=c:"center"===n.my[1]&&(N.top-=c/2),N.left+=M[0],N.top+=M[1],a||(N.left=h(N.left),N.top=h(N.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](N,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+M[0],p[1]+M[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-N.left,i=t+m-d,s=v.top-N.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:N.left,top:N.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(N,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,e.top+p+f+m>u&&(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,e.top+p+f+m>d&&(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.0",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"!==this.options.helper||/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.document[0],s=this.options;try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(n){}return this.helper||s.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(e(s.iframeFix===!0?"iframe":s.iframeFix).each(function(){e("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>").css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(e(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offsetParent=this.helper.offsetParent(),this.offsetParentCssPosition=this.offsetParent.css("position"),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.offset.scroll=!1,e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_mouseDrag:function(t,i){if("fixed"===this.offsetParentCssPosition&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return e("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this._removeHandleClassName(),e(this.options.handle||this.element).addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.element.find(".ui-draggable-handle").addBack().removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return s.parents("body").length||s.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s[0]===this.element[0]||/(fixed|absolute)/.test(s.css("position"))||s.css("position","absolute"),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relative_container=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t="hidden"!==i.css("overflow"),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relative_container?(s=this.relative_container.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}
-},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),"drag"===t&&(this.positionAbs=this._convertPositionTo("absolute")),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=s.options,a=e.extend({},i,{item:s.element});s.sortables=[],e(n.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push({instance:i,shouldRevert:i.options.revert}),i.refreshPositions(),i._trigger("activate",t,a))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});e.each(s.sortables,function(){this.instance.isOver?(this.instance.isOver=0,s.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=this.shouldRevert),this.instance._mouseStop(t),this.instance.options.helper=this.instance.options._helper,"original"===s.options.helper&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",t,n))})},drag:function(t,i,s){var n=this;e.each(s.sortables,function(){var a=!1,o=this;this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this.instance._intersectsWith(this.instance.containerCache)&&(a=!0,e.each(s.sortables,function(){return this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this!==o&&this.instance._intersectsWith(this.instance.containerCache)&&e.contains(o.instance.element[0],this.instance.element[0])&&(a=!1),a})),a?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=e(n).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return i.helper[0]},t.target=this.instance.currentItem[0],this.instance._mouseCapture(t,!0),this.instance._mouseStart(t,!0,!0),this.instance.offset.click.top=s.offset.click.top,this.instance.offset.click.left=s.offset.click.left,this.instance.offset.parent.left-=s.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=s.offset.parent.top-this.instance.offset.parent.top,s._trigger("toSortable",t),s.dropped=this.instance.element,s.currentItem=s.element,this.instance.fromOutside=s),this.instance.currentItem&&this.instance._mouseDrag(t)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",t,this.instance._uiHash(this.instance)),this.instance._mouseStop(t,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),s._trigger("fromSortable",t),s.dropped=!1)})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParent[0]!==i.document[0]&&"HTML"!==i.scrollParent[0].tagName&&(i.overflowOffset=i.scrollParent.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.document[0];s.scrollParent[0]!==o&&"HTML"!==s.scrollParent[0].tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+s.scrollParent[0].offsetHeight-t.pageY<n.scrollSensitivity?s.scrollParent[0].scrollTop=a=s.scrollParent[0].scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(s.scrollParent[0].scrollTop=a=s.scrollParent[0].scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+s.scrollParent[0].offsetWidth-t.pageX<n.scrollSensitivity?s.scrollParent[0].scrollLeft=a=s.scrollParent[0].scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(s.scrollParent[0].scrollLeft=a=s.scrollParent[0].scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(o).scrollTop()<n.scrollSensitivity?a=e(o).scrollTop(e(o).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(o).scrollTop())<n.scrollSensitivity&&(a=e(o).scrollTop(e(o).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(o).scrollLeft()<n.scrollSensitivity?a=e(o).scrollLeft(e(o).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(o).scrollLeft())<n.scrollSensitivity&&(a=e(o).scrollLeft(e(o).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left,l=h+s.snapElements[c].width,u=s.snapElements[c].top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top-s.margins.top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top-s.margins.top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left-s.margins.left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left-s.margins.left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top-s.margins.top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top-s.margins.top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left-s.margins.left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left-s.margins.left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.0",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String&&(this.handles[i]=this.element.children(this.handles[i]).first().show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),e(this.handles[i]).length},this._renderAxis(this.element),this._handles=e(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.originalPosition={left:i,top:s},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s=this.helper,n={},a=this.originalMousePosition,o=this.axis,r=t.pageX-a.left||0,h=t.pageY-a.top||0,l=this._change[o];return this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height},l?(i=l.apply(this,[t,r,h]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),this.position.top!==this.prevPosition.top&&(n.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(n.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(n.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(n.height=this.size.height+"px"),s.css(n),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(n)||this._trigger("resize",t,this.ui()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_proportionallyResize:function(){if(this._proportionallyResizeElements.length){var e,t,i,s,n,a=this.helper||this.element;for(e=0;this._proportionallyResizeElements.length>e;e++){if(n=this._proportionallyResizeElements[e],!this.borderDif)for(this.borderDif=[],i=[n.css("borderTopWidth"),n.css("borderRightWidth"),n.css("borderBottomWidth"),n.css("borderLeftWidth")],s=[n.css("paddingTop"),n.css("paddingRight"),n.css("paddingBottom"),n.css("paddingLeft")],t=0;i.length>t;t++)this.borderDif[t]=(parseInt(i[t],10)||0)+(parseInt(s[t],10)||0);n.css({height:a.height()-this.borderDif[0]-this.borderDif[2]||0,width:a.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition,prevSize:this.prevSize,prevPosition:this.prevPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t,i){var s,n,a,o,r=e(this).resizable("instance"),h=r.options,l=r.containerOffset,u=r.position,d=r._aspectRatio||t.shiftKey,c={top:0,left:0},p=r.containerElement,f=!0;p[0]!==document&&/static/.test(p.css("position"))&&(c=l),u.left<(r._helper?l.left:0)&&(r.size.width=r.size.width+(r._helper?r.position.left-l.left:r.position.left-c.left),d&&(r.size.height=r.size.width/r.aspectRatio,f=!1),r.position.left=h.helper?l.left:0),u.top<(r._helper?l.top:0)&&(r.size.height=r.size.height+(r._helper?r.position.top-l.top:r.position.top),d&&(r.size.width=r.size.height*r.aspectRatio,f=!1),r.position.top=r._helper?l.top:0),r.offset.left=r.parentData.left+r.position.left,r.offset.top=r.parentData.top+r.position.top,s=Math.abs((r._helper?r.offset.left-c.left:r.offset.left-l.left)+r.sizeDiff.width),n=Math.abs((r._helper?r.offset.top-c.top:r.offset.top-l.top)+r.sizeDiff.height),a=r.containerElement.get(0)===r.element.parent().get(0),o=/relative|absolute/.test(r.containerElement.css("position")),a&&o&&(s-=Math.abs(r.parentData.left)),s+r.size.width>=r.parentData.width&&(r.size.width=r.parentData.width-s,d&&(r.size.height=r.size.width/r.aspectRatio,f=!1)),n+r.size.height>=r.parentData.height&&(r.size.height=r.parentData.height-n,d&&(r.size.width=r.size.height*r.aspectRatio,f=!1)),f||(r.position.left=i.prevPosition.left,r.position.top=i.prevPosition.top,r.size.width=i.prevSize.width,r.size.height=i.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=function(t){e(t).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})};"object"!=typeof i.alsoResize||i.alsoResize.parentNode?s(i.alsoResize):i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):e.each(i.alsoResize,function(e){s(e)})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0},h=function(t,s){e(t).each(function(){var t=e(this),n=e(this).data("ui-resizable-alsoresize"),a={},o=s&&s.length?s:t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(o,function(e,t){var i=(n[t]||0)+(r[t]||0);i&&i>=0&&(a[t]=i||null)}),t.css(a)})};"object"!=typeof n.alsoResize||n.alsoResize.nodeType?h(n.alsoResize):e.each(n.alsoResize,function(e,t){h(e,t)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size,n=t.originalSize,a=t.originalPosition,o=t.axis,r="number"==typeof i.grid?[i.grid,i.grid]:i.grid,h=r[0]||1,l=r[1]||1,u=Math.round((s.width-n.width)/h)*h,d=Math.round((s.height-n.height)/l)*l,c=n.width+u,p=n.height+d,f=i.maxWidth&&c>i.maxWidth,m=i.maxHeight&&p>i.maxHeight,g=i.minWidth&&i.minWidth>c,v=i.minHeight&&i.minHeight>p;i.grid=r,g&&(c+=h),v&&(p+=l),f&&(c-=h),m&&(p-=l),/^(se|s|e)$/.test(o)?(t.size.width=c,t.size.height=p):/^(ne)$/.test(o)?(t.size.width=c,t.size.height=p,t.position.top=a.top-d):/^(sw)$/.test(o)?(t.size.width=c,t.size.height=p,t.position.left=a.left-u):(p-l>0?(t.size.height=p,t.position.top=a.top-d):(t.size.height=l,t.position.top=a.top+n.height-l),c-h>0?(t.size.width=c,t.position.left=a.left-u):(t.size.width=h,t.position.left=a.left+n.width-h))}}),e.ui.resizable,e.widget("ui.accordion",{version:"1.11.0",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide()},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))
-},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr("aria-selected","false"),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true",tabIndex:0,"aria-expanded":"true"})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.length&&(!t.length||e.index()<t.index()),l=this.options.animate||{},u=h&&l.down||l,d=function(){o._toggleComplete(i)};return"number"==typeof u&&(a=u),"string"==typeof u&&(n=u),n=n||u.easing||l.easing,a=a||u.duration||l.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:d,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?r+=i.now:"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,d):e.animate(this.showProps,a,n,d)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.0",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){var i=e(t.currentTarget);i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){function i(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var s,n,a,o,r,h=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:h=!1,n=this.previousFilter||"",a=String.fromCharCode(t.keyCode),o=!1,clearTimeout(this.filterTimer),a===n?o=!0:a=n+a,r=RegExp("^"+i(a),"i"),s=this.activeMenu.find(this.options.items).filter(function(){return r.test(e(this).text())}),s=o&&-1!==s.index(this.active.next())?this.active.nextAll(".ui-menu-item"):s,s.length||(a=String.fromCharCode(t.keyCode),r=RegExp("^"+i(a),"i"),s=this.activeMenu.find(this.options.items).filter(function(){return r.test(e(this).text())})),s.length?(this.focus(t,s),s.length>1?(this.previousFilter=a,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}h&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)}}),e.widget("ui.autocomplete",{version:"1.11.0",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&jQuery.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var u,d="ui-button ui-widget ui-state-default ui-corner-all",c="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",p=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},f=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.0",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,p),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(d).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===u&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];f(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),u=this,t.document.one("mouseup",function(){u=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(d+" ui-state-active "+c).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?f(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(c),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.0",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.0"}});var m;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return o(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var r,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,r="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+r+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),o(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty())},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,r,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),r=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),o(l.settings,n),null!==r&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,r)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)
-},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target);return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,r,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(o(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),r=!1,e(t).parents().each(function(){return r|="fixed"===e(this).css("position"),!r}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,r),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":r?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,m=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t),t.dpDiv.find("."+this._dayOverClass+" a");var i,s=this._getNumberOfMonths(t),n=s[1],a=17;t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n=RegExp("^\\d{1,"+s+"}"),a=i.substring(h).match(n);if(!a)throw"Missing number at position "+h;return h+=a[0].length,parseInt(a[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,N,M,C,A,P,I,z,H,F,E,W,L,O,j=new Date,R=this._daylightSavingAdjust(new Date(j.getFullYear(),j.getMonth(),j.getDate())),Y=this._get(e,"isRTL"),J=this._get(e,"showButtonPanel"),B=this._get(e,"hideIfNoPrevNext"),K=this._get(e,"navigationAsDateFormat"),V=this._getNumberOfMonths(e),U=this._get(e,"showCurrentAtPos"),q=this._get(e,"stepMonths"),G=1!==V[0]||1!==V[1],X=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),Q=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-U,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-V[0]*V[1]+1,$.getDate())),t=Q&&Q>t?Q:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-q,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":B?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+q,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":B?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?X:R,o=K?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=J?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;V[0]>w;w++){for(k="",this.maxRows=4,T=0;V[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",N="",G){if(N+="<div class='ui-datepicker-group",V[1]>1)switch(T){case 0:N+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case V[1]-1:N+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:N+=" ui-datepicker-group-middle",S=""}N+="'>"}for(N+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,Q,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",M=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)C=(x+u)%7,M+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[C]+"'>"+p[C]+"</span></th>";for(N+=M+"</tr></thead><tbody>",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),P=(this._getFirstDayOfMonth(et,Z)-u+7)%7,I=Math.ceil((P+A)/7),z=G?this.maxRows>I?this.maxRows:I:I,this.maxRows=z,H=this._daylightSavingAdjust(new Date(et,Z,1-P)),F=0;z>F;F++){for(N+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(H)+"</td>":"",x=0;7>x;x++)W=g?g.apply(e.input?e.input[0]:null,[H]):[!0,""],L=H.getMonth()!==Z,O=L&&!y||!W[0]||Q&&Q>H||$&&H>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(L?" ui-datepicker-other-month":"")+(H.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===H.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(O?" "+this._unselectableClass+" ui-state-disabled":"")+(L&&!v?"":" "+W[1]+(H.getTime()===X.getTime()?" "+this._currentClass:"")+(H.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(L&&!v||!W[2]?"":" title='"+W[2].replace(/'/g,"&#39;")+"'")+(O?"":" data-handler='selectDay' data-event='click' data-month='"+H.getMonth()+"' data-year='"+H.getFullYear()+"'")+">"+(L&&!v?"&#xa0;":O?"<span class='ui-state-default'>"+H.getDate()+"</span>":"<a class='ui-state-default"+(H.getTime()===R.getTime()?" ui-state-highlight":"")+(H.getTime()===X.getTime()?" ui-state-active":"")+(L?" ui-priority-secondary":"")+"' href='#'>"+H.getDate()+"</a>")+"</td>",H.setDate(H.getDate()+1),H=this._daylightSavingAdjust(H);N+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),N+="</tbody></table>"+(G?"</div>"+(V[0]>0&&T===V[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=N}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":"&#xa0;")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":"&#xa0;")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.0",e.datepicker,e.widget("ui.dialog",{version:"1.11.0",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0;if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html("&#160;"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()
-},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._untrackInstance(),this._trackingInstances().unshift(this),this._focusedElement=e(t.target)}})},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.tabs",{version:"1.11.0",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,""),s=location.href.replace(e,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible).delegate(".ui-tabs-nav > li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr("aria-controls")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):"disabled"===e?(this._setupDisabled(t),void 0):(this._super(e,t),"collapsible"===e&&(this.element.toggleClass("ui-tabs-collapsible",t),t||this.options.active!==!1||this._activate(0)),"event"===e&&this._setupEvents(t),"heightStyle"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,i=this.tablist.children(":has(a[href])");t.disabled=e.map(i.filter(".ui-state-disabled"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist"),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr("id"),h=e(s).closest("li"),l=h.attr("aria-controls");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr("aria-controls")||e({}).uniqueId()[0].id,n="#"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr("aria-live","polite")),a.length&&(t.panels=t.panels.add(a)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":o,"aria-labelledby":r}),a.attr("aria-labelledby",r)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel")},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass("ui-state-disabled").attr("aria-disabled","true"):e(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();"fill"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),s=t.css("position");"absolute"!==s&&"fixed"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height("").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger("activate",t,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),i=t.data("ui-tabs-aria-controls");i?t.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(".ui-tabs-anchor"),o=this._getPanelForTab(n),r={tab:n,panel:o};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(n.addClass("ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.success(function(e){setTimeout(function(){o.html(e),s._trigger("load",i,r)},1)}).complete(function(e,t){setTimeout(function(){"abort"===t&&s.panels.stop(!1,!0),n.removeClass("ui-tabs-loading"),o.removeAttr("aria-busy"),e===s.xhr&&delete s.xhr},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href"),beforeSend:function(t,a){return n._trigger("beforeLoad",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}})});
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/scripts/ajax-user.js b/app/src/main/webapp/roller-ui/scripts/ajax-user.js
index 3eed2da..1cb578c 100644
--- a/app/src/main/webapp/roller-ui/scripts/ajax-user.js
+++ b/app/src/main/webapp/roller-ui/scripts/ajax-user.js
@@ -15,18 +15,20 @@
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */
+
 // Used in: InviteMember.jsp, UserAdmin.jsp
 
 function createRequestObject() {
     var ro;
     var browser = navigator.appName;
-    if (browser == "Microsoft Internet Explorer") {
+    if (browser === "Microsoft Internet Explorer") {
         ro = new ActiveXObject("Microsoft.XMLHTTP");
     } else {
         ro = new XMLHttpRequest();
     }
     return ro;
 }
+
 var http = createRequestObject();
 var init = false;
 var isBusy = false;
@@ -38,8 +40,11 @@
         u = userURL;
         if (enabled != null) u = u + "&enabled=" + enabled;
         sendUserRequest(u);
+    } else {
+        userSubmitButton.disabled = true;
     }
 }
+
 function onUserNameChange(enabled) {
     u = userURL;
     if (enabled != null) u = u + "&enabled=" + enabled;
@@ -47,12 +52,17 @@
     if (userName.value.length > 0) u = u + "&startsWith=" + userName.value;
     sendUserRequest(u);
 }
+
 function onUserSelected() {
     userList = document.getElementById("userList");
     user = userList.options[userList.options.selectedIndex];
     userName = document.getElementById("userName");
     userName.value = user.value;
+
+    userSubmitButton = document.getElementById("user-submit");
+    userSubmitButton.disabled = false;
 }
+
 function sendUserRequest(url) {
     if (isBusy) return;
     isBusy = true;
@@ -60,18 +70,18 @@
     http.onreadystatechange = handleUserResponse;
     http.send(null);
 }
+
 function handleUserResponse() {
-    if (http.readyState == 4) {
+    if (http.readyState === 4) {
         userList = document.getElementById("userList");
         for (i = userList.options.length; i >= 0; i--) {
             userList.options[i] = null;
         }   
-        //userList.onchange = null;
-        data = http.responseText;  
-        if (data.indexOf("\n") != -1) {
+        data = http.responseText;
+        if (data.indexOf("\n") !== -1) {
             lines = data.split('\n');
             for (i = 0; i < lines.length; i++) {
-                if (lines[i].indexOf(',') != -1) {
+                if (lines[i].indexOf(',') !== -1) {
                    userArray = lines[i].split(',');
                    userList.options[userList.length] = 
                       new Option(userArray[0] + " (" + userArray[1] + ")", userArray[0]);
diff --git a/app/src/main/webapp/roller-ui/styles/roller.css b/app/src/main/webapp/roller-ui/styles/roller.css
index 397c1cd..428c78e 100644
--- a/app/src/main/webapp/roller-ui/styles/roller.css
+++ b/app/src/main/webapp/roller-ui/styles/roller.css
@@ -16,345 +16,129 @@
 * directory of this distribution.
 */
 
-/*
-roller.css: Base CSS styles for Roller web UI
+/* roller.css: Base CSS styles for Roller web UI */
 
-CUSTOMIZABLE color and background image settings have been separated out
-and placed in separate colors.css files for different color schemes.
-*/
+table {
+    border:0;
+}
 
-body {
+.container {
+    margin: 1em;
+}
+
+.roller-page-title {
+    margin-top: 0px;
+    margin-bottom: 5px;
+}
+
+.roller-column-right {
+    padding-left: 1em;
+    padding-right: 2em;
+}
+
+.roller-column-left{
+    padding-left: 2em;
+    padding-right: 1em;
+}
+
+.date-form {
+    margin: 10px;
+}
+
+.fade {
+    opacity: 0;
+    -webkit-transition: opacity 1.25s linear;
+    -moz-transition: opacity 1.25s linear;
+    -ms-transition: opacity 1.25s linear;
+    -o-transition: opacity 1.25s linear;
+    transition: opacity 1.25s linear;
+}
+
+/* bootstrap tweaks */
+
+.glyphicon-info-sign {
+    margin-right: 0.5em;
+}
+
+.controls>input[type=checkbox] {
+    margin-bottom: 0.5em;
+}
+
+/* main menu */
+
+.mm_subtable_label {
+    width: 8em;
+    font-weight: bold; 
+}
+
+.yourWeblogBox {
     background: white;
-    margin: 0px;
-    padding: 0px;
-    text-align: left;
+    padding: 1em;
 }
 
-th, td {
-    border: none;
-    vertical-align: top;
-    padding: 2px;
+table.mm_table td {
+    padding: 0.3em;
 }
 
-a {
-    text-decoration: none;
-}
-a:link {
-    text-decoration: none;
-}
-a:visited {
-    text-decoration: none;
-}
-a:hover {
-    text-decoration: underline;
-}
-a:active {
-    text-decoration: underline;
+table.mm_table_actions td {
+    padding: 0.1em;
 }
 
-p.subtitle {
-    margin: 5px 0px 15px;
-    font-size: 1em;
-    font-weight: bold;
-    font-size: 120%;
+/* edit entry page */
+
+.panel-heading a:after {
+    font-family:'Glyphicons Halflings';
+    content:"\e114";
+    float: right;
+    color: grey;
 }
-p.pagetip {
-    margin: 0px 0px 15px 0px;
-}
-img {
-    border: 0px;
-    overflow: auto;
-}
-img.w3c {
-    border: 0px;
-    height: 31px;
-    width: 88px;
-    margin-right: 5px;
-}
-label {
-   line-height: 1.5em;
+.panel-heading a.collapsed:after {
+    content:"\e080";
 }
 
-/* ----------------------------------------------------------------------
-Page element styles: boxes and borders, etc.
----------------------------------------------------------------------- */
-
-div.bannerStatusBox {
-    height: 2em;
+#panel-plugins {      /* Kludge for EntryEditor.jsp */
+    margin-top: 6px;  /* Without this there no space between Summary and Plugins to Apply panels */
 }
 
-.bannerStatusBox a, .bannerStatusBox a {
-    font-weight: bold;
-}
-.bannerLeft {
-    padding: 4px 15px 4px 10px;
-}
-.bannerRight {
-    padding: 4px 10px 4px 15px;
-    text-align: right;
-}
-.bannerBox {
-    width: 100%;
-    background: #f00;
-}
-.sidebarBodyHead h3, .searchSidebarBody h3 {
-    padding: 5px;
-}
-.sidebarInner {
-    padding: 0.5em 0.5em 0.5em 1em;
-}
-.sidebarBody ul {
-    margin: 0px;
-    padding-left: 5px;
-}
-.sidebarBody li {
-    list-style-position: inside;
-    list-style-image: url(../images/dash.gif);
-    margin-left: 0em;
-    padding-left: 0.5em;
-    padding-top: 3px;
-}
-div.entriesBoxInner {
-    padding: 5px;
-}
-div.entryTitleBox {
-    padding: 4px;
-    margin: 4px 0px 4px 0px;
-    font-size: medium;
-}
-div.entryBox, div.entryBoxPinned {
-    font-family: Arial, Helvetica, sans-serif;
-    border-bottom-width: thin;
-    border-bottom-style: solid;
-    padding: 3px 0px 3px 0px;
-}
-div.entryBoxPinned {
-}
-.entryTitle {
-    font-family: Arial, Helvetica, sans-serif;
-    font-size: 12px;
-    font-weight: bold;
-    text-decoration: none;
-}
-.entryDetails {
-    font-family: Arial, Helvetica, sans-serif;
-    font-size: 11px;
-    text-decoration: none;
-}
-.entryDescription {
-    font-family: Arial, Helvetica, sans-serif;
-    font-size: 11px;
-    text-decoration: none;
-}
-span.hotBlogs, a.hotBlogs, a:active.hotBlogs, a:visited.hotBlogs, ul.hotBlogs {
-    font-size: small;
-    padding-left: 0px;
-    list-style-type: none
-}
-input.searchButton {
-    cursor: pointer;
-    font-family: lucida,arial,sans-serif;
-    height: 1.4em;
-    font-weight: bold;
-    font-size: 11px;
-    padding: 0px 0px 2px 0px;
-    margin: 5px;
-    border: 0px none #000;
+/* keep jQuery UI datepicker in front of other elements */
+.ui-datepicker { 
+    position: relative; 
+    z-index: 10000 !important;
 }
 
+/* entries page */
 
-/* ----------------------------------------------------------------------
-form layout styles
----------------------------------------------------------------------- */
-
-input, select, option {
-    font: small Verdana,Arial,Sans-serif;
-    color: black;
-    font: small/1.5em Verdana, Arial, Helvetica, sans-serif;
-    font-size: 100%;
-}
-textarea {
-    margin: 3px 0px 0px 0px;
-}
-div.buttonBox {
-    width: 98%;
-    border: 1px solid black;
-    background-color: #f3f3f3;
-    padding: 3px;
-    margin-top: 5em;
-    clear: both;
-}
-.left {
-    font-size: small;
-    width: 136px;
-}
-.leftTitle {
-    font-size: small;
-    font-weight: bold;
+.scheduledEntryBox {
+    background: #EEEEE0;
+    border: 1px gray solid;
 }
 
-.formtable, .formtableNoDesc {
-    width: 100%;
-    border-collapse: collapse;
-}
-.formtable td.label, .formtable td.field, .formtable td.description,
-.formtableNoDesc td.label, .formtableNoDesc td.field, .formtableNoDesc  {
-    vertical-align: top;
-    border-style: solid;
-    border-width: 0px 0px 1px 0px;
-    border-color: #e3e3e3;
-    padding: 4px 10px 4px 10px;
-}
-.formtable td.label {
-    text-align: right;
-    width: 20%;
-}
-.formtable td.field {
-    width: 30%;
-}
-.formtable td.description {
-    width: 50%;
-    line-height: 140%;
-}
-.formtableNoDesc td.label {
-    text-align: right;
-    width: 40%;
-}
-.formtableNoDesc td.field {
-    width: 40%;
-}
-.formtableNoDesc td.description {
-    width: 0%;
+.pendingEntryBox {
+    background: #ffcccc;
+    border: 1px gray solid;
 }
 
-div.row {
-    padding: 2px;
-}
-div.formrow {
-    float: left;
-    width: 80%;
-}
-label.formrow {
-    float: left;
-    text-align: right;
-    width: 20%;
-    padding-right: 1em;
-}
-div.sideformrow {
-    float: left;
-    width: 100%;
-}
-label.sideformrow {
-    float: left;
-    text-align: left;
-    width: 30%;
-    padding-right: 1em;
-    padding-top: 1em;
-    font-size: smaller;
-}
-
-div.yourWeblogBox {
-    padding: 8px 0px 10px 0px;
-}
-
-input#f_openid_identifier {
-    background: url(../../images/openid-logo-small.gif) no-repeat scroll 0 50%;
-    padding-left:18px;
-}
-
-input.f_openid_identifier {
-    background: url(../../images/openid-logo-small.gif) no-repeat scroll 0 50%;
-    padding-left:18px;
-}
-
-/* ----------------------------------------------------------------------
-Table styles
----------------------------------------------------------------------- */
-
-div.tablenav {
-    font-size: 110%
-}
-table.rollertable {
-    border-collapse: collapse;
-    width: 100%;
-}
-table.innertable {
-    border-collapse: collapse;
-    width: 100%;
-    margin-bottom: 0;
-}
-table.rollertable th {
-    border: 1px solid #ccc;
-    font-size: 110%;
-    padding: 3px;
-}
-table.rollertable th {
-    color: white;
-}
-table.rollertable td, table.rollertable tbody td {
-    vertical-align: top;
-}
-table.rollertable tbody td {
-    padding: 3px;
-}
-table.innertable tbody td {
-    padding: 0;
-}
-table.rollertable td.center {
-    text-align: center;
-}
-table.rollertable .innertable td {
-	border: none;
-}
-table.innertable td.viewbody {
-	padding: 5px;
-}
-table.innertable tr .bot {
-	margin-bottom: 5px;
-}
-table.innertable tr .viewbody .bot {
-	padding-bottom: 10px;
-}
-td.field span.fixedAttr {
-    font-style: italic;
-    font-weight: bold;
-    color: red;
-}
-.rollertable_even td {
-    border: 1px solid #ccc;
-    background: #EEEEEE;
-    color: black;
-    vertical-align: top;
-}
-.rollertable_odd td{
-    border: 1px solid #ccc;
-    background: inherit;
-    vertical-align: top;
-    color: black;
-}
-.rollertable_pending td {
-    border: 1px solid #ccc;
+.draftEntryBox {
     background: #ffffcc;
-    color: black;
-    vertical-align: top;
+    border: 1px gray solid;
 }
-td.rollertable_entry, div.rollertable_entry {
-    border: 1px solid #ccc;
-    background: inherit;
-    padding: 5px;
-    vertical-align: top;
+
+td.pendingentry, tr.pendingentry {
+    background: #ffcccc;
 }
-td.propname {
-    padding: 0px 0px 0px 3em;
-    vertical-align: top;
+td.draftentry, tr.draftentry {
+    background: #ffffcc;
 }
-table.edit th {
-    text-align: right;
-    padding-right: 5px;
+td.scheduledentry, tr.scheduledentry {
+    background: #EEEEE0;
 }
-tr.actionrow {
-    background: #e5e5e5;
+
+.entryEditSidebarLink > a {
+    font-size: 10pt;
 }
+
+/* comments */
+
 td.spamcomment {
     background: #ffcccc;
 }
@@ -373,406 +157,91 @@
     background: #ffcccc;
     border: 1px gray solid;
 }
-td.pendingentry, tr.pendingentry {
-    background: #ffcccc;
-}
-td.draftentry, tr.draftentry {
-    background: #ffffcc;
-}
-td.scheduledentry, tr.scheduledentry {
-    background: #EEEEE0;
-}
-.draftEntryBox {
-    background: #ffffcc;
-    border: 1px gray solid;
-}
-.pendingEntryBox {
-    background: #ffcccc;
-    border: 1px gray solid;
-}
-.scheduledEntryBox {
-    background: #EEEEE0;
-    border: 1px gray solid;
-}
-
-/* ----------------------------------------------------------------------
-Calendar styles
----------------------------------------------------------------------- */
-
-div.archiveCalendar {
-    position: absolute;
-    top: 80px;
-    right: 20px;
-    font-size: 11px;
-}
-.hCalendarDay {
-    border-width: thin;
-    font-size: .9em;
-    text-align: center;
-}
-.hCalendarDayCurrent {
-    border-style: dotted;
-    border-width: thin;
-    font-size: .9em;
-    font-weight: bolder;
-    text-align: center;
-}
-.hCalendarDayLinked {
-    border-width: thin;
-    font-size: .9em;
-    font-weight: bolder;
-    text-align: center;
-}
-.hCalendarDayNameRow {
-    font-size: .9em;
-    background-color: #eee;
-    border-bottom: 1px solid #ccc;
-    text-align: center;
-}
-.hCalendarDayNotInMonth {
-    background: transparent;
-    color: #AAAAAA;
-    font-size: .9em;
-    text-align: center;
-}
-.hCalendarNextPrev {
-    text-align: center;
-}
-.hCalendarMonthYearRow {
-    font-weight: bold;
-    text-align: center;
-}
-
-/* ----------------------------------------------------------------------
-Error and status message styles
----------------------------------------------------------------------- */
-
-.statusMsg {
-    background: #CCFFCC;
-    border: 1px solid #008000;
-    color: #000000;
-    display: block;
-    font-size: .9em;
-    margin: 0px 0px 10px 0px;
-    padding: 3px;
-    width: 98%;
-}
-.error {
-    background: transparent;
-    color: #FF0000;
-}
-.warning {
-    color: #f00;
-    font-size: larger;
-}
-.errors, .messages, .warnings {
-    padding: 5px;
-    margin: 10px 0px 10px 0px;
-}
-.errors {
-    background-color: #fcc;
-    border: 1px solid red;
-}
-.messages {
-    background-color: #cfc;
-    border: 1px solid green;
-}
-.warnings {
-    background-color: #ffffce;
-    border: 1px solid #f0c000;
-}
-div.notification {
-    padding: 10px;
-    background-color: #ffffce;
-    border: 1px solid #f0c000;
-}
-div.error {
-    background-color: #ffcccc;
-    border: 1px solid #000000;
-    color: #aa0000;
-    font-size: 0.9em;
-    font-weight: normal;
-    margin: 5px 10px 5px 0px;
-    padding: 3px;
-    text-align: left;
-    vertical-align: bottom;
-}
-div.output {
-    background-color: #e0e0e0;
-    border: 1px solid #CCCC99;
-    color: #000000;
-    font-size: 0.9em;
-    font-weight: normal;
-    margin: 5px 10px 5px 0px;
-    padding: 3px;
-    text-align: left;
-    vertical-align: bottom;
-}
-
-/* ----------------------------------------------------------------------
-weblog editor styles
----------------------------------------------------------------------- */
-
-div.previewEntrySummary {
-    border: 1px solid gray;
-    clear: both;
-    height: 12em;
-    width: 98%;
-    padding: 10px;
-    overflow: auto;
-}
-div.previewEntryContent {
-    border: 1px solid gray;
-    clear: both;
-    height: 22em;
-    width: 98%;
-    padding: 10px;
-    overflow: auto;
-}
-div.centerTitle {
-    border: 1px solid #ccc;
-    color: black;
-    font-weight: bolder;
-    font-size: large;
-    text-align: center;
-}
-div.control {
+table.innertable {
+    border-collapse: collapse;
     width: 100%;
-    /*height: 2.5em; Buttons don't line up */
+    margin-bottom: 0;
 }
-div.controlToggle {
-    width: 100%;
-    height: 25px;
+table.innertable tbody td {
+    padding: 0;
 }
-div.viewdetails {
-    border: 1px dotted #CCCCCC;
-    color: #000000;
-    margin-left: 5px;
-    margin-right: 5px;
-    padding: 5px 5px 5px 7px;
-}
-.control input {
-    margin: 0.3em;
-}
-.control select {
-    margin: 0.5em;
-}
-a.controlToggle {
-    margin: 5px;
+table.innertable td.viewbody {
     padding: 5px;
-    color: black;
-    background: transparent;
-    text-decoration: none;
 }
-a.controlToggle:link {
-    margin: 5px;
-    padding: 5px;
-    color: black;
-    background: transparent;
-    text-decoration: none;
-}
-a.controlToggle:visited {
-    margin: 5px;
-    padding: 5px;
-    color: black;
-    background: transparent;
-    text-decoration: none;
-}
-a.controlToggle:hover {
-    margin: 5px;
-    padding: 5px;
-    color: black;
-    background: transparent;
-    text-decoration: underline;
-    font-weight: bold;
-}
-
-/* ----------------------------------------------------------------------
-Misc styles
----------------------------------------------------------------------- */
-
-div.NN4 {
-    display: none;
-}
-div.rNavigationBar {
-    margin-bottom: 20px;
-    margin-right: 10px;
-}
-.entryDate {
-    background: transparent;
-    color: #989898;
-    font-style: italic;
-}
-.commentTitle {
-    background: #FFFFDD;
-    border: 1px solid #000;
-    padding: 3px;
-    margin: 0px 5px 10px 0px;
-    color: #000000;
-    font-size: .9em;
-    width: 98%;
-}
-.version {
-    font-size: x-small;
-    color: #808080;
-}
-.page {
-    visibility: hidden;
-    position: absolute;
-    float: left;
-    background-color: white;
-    border: 1px gray solid;
-    padding: 10px;
-    width: 80%;
-    height: 40em;
-}
-.tab {
-    background-color: white;
-    border-top: 1px gray solid;
-    border-left: 1px gray solid;
-    border-right: 1px gray solid;
-    font-family: verdana;
-    padding: 5px;
-    margin: 2px;
-}
-
-p.websiteDescription {
-    font-style: italic;
-    font-size: 11px;
-}
-.version {
-    font-size: small;
-    color: gray;
-    text-align: center;
-}
-span .details {
-    font-size: inherit;
-}
-div.helptext {
-    background: #f0f0f0;
-    border: 1px #c0c0c0 solid;
-    padding: 2px;
-    margin: 30px 10px 10px 0px;
-    width: 75%;
-}
-.padleft {
-    padding-left: 8px;
-}
-#logo {
-    padding: 15px 0px 10px 15px;
-}
-/* Transparent PNG fix for IE, thanks to Kenneth M. Kolano */
-#logoshadow {
-    top: 15px;
-    left: 15px;
-    width: 165px;
-    height: 50px;
-    _background: transparent !important;
-    background-image: url(../images/logo-shadow.png);
-}
-#logobackground {
-    width: 159px;
-    height: 44px;
-}
-#logoimage {
-    width: 159px;
-    height: 44px;
-    display: block;
-    cursor: pointer; /* Make IE show correct cursor for link */
-    background-image: url(../images/transparent-logo.png);
-}
-
-/* main menu page */
-
-span.mm_weblog_name {
-    font-size: large;
-    font-weight: bold;
-}
-table.mm_table {
-    margin-top: 8px;
-}
-td.mm_table_actions {
-    padding-left: 4px;
-}
-td.mm_subtable_label {
-    width: 105px;
-    vertical-align: top;
-    font-weight: bold;
-}
-
-
-/* media file pages */
-
-.mediaFileSearchResult {
-    float: left;
-    margin: 10px 10px 10px 10px;
-}
-
-div.mediaFileThumbnail {
-   float:right;
-   width:120px;
-   height:120px;
-   border:1px solid grey;
-   margin: 10px
-}
-
-
-/* weblog entry form page */
-
-span.entryEditSidebarLink {
-    font-size: smaller;
-}
-.entryEditTable td {
-    padding: 0px 0px 8px 0px;
-}
-td.entryEditFormLabel {
-    padding-right: 15px;
-    padding-left: 2px;
-    font-weight: bold;
-}
-
-pre {
-    padding: 5px 5px 5px 7px;
-    background: #f5f5f5;
-    color: #000;
-    border: 1px dotted #ccc;
-    margin-left: 5px;
-    margin-right: 5px;
-    overflow: auto;
-}
-
-.toplabel {
-    font-weight: bold;
-    margin: 10px 0px 0px 0px;
-}
-.miscControl {
+table.innertable tr .bot {
     margin-bottom: 5px;
 }
-
-.chooser {
-    margin: 10px;
-    padding: 10px 20px 20px 20px;
-    background: #eee;
-    border: 1px solid #gray;
-    height: 8em;
+table.innertable tr .viewbody .bot {
+    padding-bottom: 10px;
 }
 
-div.selectedChooser {
-    background: #CCFFCC;
-    border: 1px solid #008000;
+/* categories */
+
+#feedback-area {
+    float: left;
 }
 
-div.chooser h2 {
-    letter-spacing: 0.0em;
+/* sign-in */
+
+body {
+    background-color: white;
 }
 
-div.optioner {
-    margin: 0px 30px 30px 30px;
+.form-signin {
+    max-width: 330px;
+    padding: 15px;
+    margin: 0 auto;
+}
+.form-signin .form-signin-heading,
+.form-signin .checkbox {
+    margin-bottom: 10px;
+}
+.form-signin .checkbox {
+    font-weight: normal;
+}
+.form-signin .form-control {
+    position: relative;
+    height: auto;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    padding: 10px;
+    font-size: 16px;
+}
+.form-signin .form-control:focus {
+    z-index: 2;
+}
+.form-signin input[type="email"] {
+    margin-bottom: -1px;
+    border-bottom-right-radius: 0;
+    border-bottom-left-radius: 0;
+}
+.form-signin input[type="password"] {
+    margin-bottom: 10px;
+    border-top-left-radius: 0;
+    border-top-right-radius: 0;
 }
 
+/* Sticky footer styles */
 
-/* ---------------------------------------------------------------------- */
-/* Media File styles */
+html {
+    position: relative;
+    min-height: 100%;
+}
+body {
+    margin-bottom: 60px;
+}
+.footer {
+    position: absolute;
+    bottom: 0;
+    width: 100%;
+    height: 60px;
+    background-color: #f5f5f5;
+    padding: 1.5em;
+    text-align: center;
+}
+
+/* media files */
 
 .align-images {
     display:inline;
@@ -782,26 +251,91 @@
     width:140px;
     height:140px;
     border: 1px solid #ccc;
+    text-align: center;
 }
 
-.dir-image {
-    cursor:pointer;
-    width:25px;
-    height:25px;
-    padding:40px 45px;
+#sortByMenu {
+    width: 15em;
 }
 
-/*** For context menu ***/
-
-#menu h1 {
-    line-height:120%;
-    margin:15px 0px;
-    padding-left: 0.5em;
+#viewDirectoryMenu {
+    width: 15em;
 }
 
-/*** Right control floats aka clearfix ***/
-.clearfix:after {
-  content: "";
-  display: table;
-  clear: both;
+#moveTargetMenu {
+    width: 15em;
 }
+
+.mediaObject {
+    width:120px;
+    height:120px;
+    text-align: center;
+}
+
+.mediaObjectInfo {
+    clear:left;
+    width:130px;
+    margin-left:5px;
+    margin-top:3px;
+    font-size:11px;
+}
+
+span.glyphicon-file {
+    font-size: 6em;
+}
+
+.highlight {
+    border: 3px solid #aaa;
+}
+
+span.button {
+    height:15px;
+    width:15px;
+    float:right;
+}
+
+.sortByMenu, .viewDirectoryMenu {
+    display: inline;
+}
+
+#imageGrid {
+    display: block;
+    overflow: auto;
+    margin: 1em 0 1em 0;
+}
+
+#imageGrid > div > ul {
+    padding-left:0;
+}
+
+div.image-controls,
+div.image-controls div,
+div.image-controls span,
+div.image-controls select,
+div.image-controls input {
+    display: inline;
+}
+
+
+/* theme edit */
+
+.row-display-flex {
+    display: flex;
+}
+.row-display-flex > [class*='col-'] {
+    display: flex;
+    flex-direction: column;
+}
+
+#sharedChooser, #customChooser {
+    height: 13em;
+}
+
+/* members */
+
+tr.rollertable_pending {
+    background: #ffffcc;
+}
+
+
+
diff --git a/app/src/main/webapp/roller-ui/yui3/cssbase/cssbase-min.css b/app/src/main/webapp/roller-ui/yui3/cssbase/cssbase-min.css
deleted file mode 100644
index 3527844..0000000
--- a/app/src/main/webapp/roller-ui/yui3/cssbase/cssbase-min.css
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
-YUI 3.17.2 (build 9c3c78e)
-Copyright 2014 Yahoo! Inc. All rights reserved.
-Licensed under the BSD License.
-http://yuilibrary.com/license/
-*/
-
-h1{font-size:138.5%}h2{font-size:123.1%}h3{font-size:108%}h1,h2,h3{margin:1em 0}h1,h2,h3,h4,h5,h6,strong{font-weight:bold}abbr,acronym{border-bottom:1px dotted #000;cursor:help}em{font-style:italic}blockquote,ul,ol,dl{margin:1em}ol,ul,dl{margin-left:2em}ol{list-style:decimal outside}ul{list-style:disc outside}dd{margin-left:1em}th,td{border:1px solid #000;padding:.5em}th{font-weight:bold;text-align:center}caption{margin-bottom:.5em;text-align:center}p,fieldset,table,pre{margin-bottom:1em}input[type=text],input[type=password],textarea{width:12.25em;*width:11.9em}#yui3-css-stamp.cssbase{display:none}
diff --git a/app/src/main/webapp/roller-ui/yui3/cssbase/cssbase.css b/app/src/main/webapp/roller-ui/yui3/cssbase/cssbase.css
deleted file mode 100644
index 1fe566a..0000000
--- a/app/src/main/webapp/roller-ui/yui3/cssbase/cssbase.css
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
-YUI 3.17.2 (build 9c3c78e)
-Copyright 2014 Yahoo! Inc. All rights reserved.
-Licensed under the BSD License.
-http://yuilibrary.com/license/
-*/
-
-/* base.css, part of YUI's CSS Foundation */
-h1 {
-	/*18px via YUI Fonts CSS foundation*/
-	font-size:138.5%;  
-}
-h2 {
-	/*16px via YUI Fonts CSS foundation*/
-	font-size:123.1%; 
-}
-h3 {
-	/*14px via YUI Fonts CSS foundation*/
-	font-size:108%;  
-}
-h1,h2,h3 {
-	/* top & bottom margin based on font size */
-	margin:1em 0;
-}
-h1,h2,h3,h4,h5,h6,strong {
-	/*bringing boldness back to headers and the strong element*/
-	font-weight:bold; 
-}
-abbr,acronym {
-	/*indicating to users that more info is available */
-	border-bottom:1px dotted #000;
-	cursor:help;
-} 
-em {
-	/*bringing italics back to the em element*/
-	font-style:italic;
-}
-blockquote,ul,ol,dl {
-	/*giving blockquotes and lists room to breath*/
-	margin:1em;
-}
-ol,ul,dl {
-	/*bringing lists on to the page with breathing room */
-	margin-left:2em;
-}
-ol {
-	/*giving OL's LIs generated numbers*/
-	list-style: decimal outside;	
-}
-ul {
-	/*giving UL's LIs generated disc markers*/
-	list-style: disc outside;
-}
-dd {
-	/*providing spacing for definition terms*/
-	margin-left:1em;
-}
-th,td {
-	/*borders and padding to make the table readable*/
-	border:1px solid #000;
-	padding:.5em;
-}
-th {
-	/*distinguishing table headers from data cells*/
-	font-weight:bold;
-	text-align:center;
-}
-caption {
-	/*coordinated margin to match cell's padding*/
-	margin-bottom:.5em;
-	/*centered so it doesn't blend in to other content*/
-	text-align:center;
-}
-p,fieldset,table,pre {
-	/*so things don't run into each other*/
-	margin-bottom:1em;
-}
-/* setting a consistent width, 160px; 
-   control of type=file still not possible
-   *width is for ie7 (no ie6 fallback) */
-input[type=text],input[type=password],textarea{width:12.25em;*width:11.9em;}
-
-/* YUI CSS Detection Stamp */
-#yui3-css-stamp.cssbase { display: none; }
diff --git a/app/src/main/webapp/roller-ui/yui3/cssfonts/cssfonts-min.css b/app/src/main/webapp/roller-ui/yui3/cssfonts/cssfonts-min.css
deleted file mode 100644
index 6ffebc7..0000000
--- a/app/src/main/webapp/roller-ui/yui3/cssfonts/cssfonts-min.css
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
-YUI 3.17.2 (build 9c3c78e)
-Copyright 2014 Yahoo! Inc. All rights reserved.
-Licensed under the BSD License.
-http://yuilibrary.com/license/
-*/
-
-body{font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small}select,input,button,textarea{font:99% arial,helvetica,clean,sans-serif}table{font-size:inherit;font:100%}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%}#yui3-css-stamp.cssfonts{display:none}
diff --git a/app/src/main/webapp/roller-ui/yui3/cssfonts/cssfonts.css b/app/src/main/webapp/roller-ui/yui3/cssfonts/cssfonts.css
deleted file mode 100644
index aa92b42..0000000
--- a/app/src/main/webapp/roller-ui/yui3/cssfonts/cssfonts.css
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-YUI 3.17.2 (build 9c3c78e)
-Copyright 2014 Yahoo! Inc. All rights reserved.
-Licensed under the BSD License.
-http://yuilibrary.com/license/
-*/
-
-/**
- * Percents could work for IE, but for backCompat purposes, we are using keywords.
- * x-small is for IE6/7 quirks mode.
- */
-body {
-	font:13px/1.231 arial,helvetica,clean,sans-serif;
-	*font-size:small; /* for IE */
-	*font:x-small; /* for IE in quirks mode */
-}
-
-/**
- * Nudge down to get to 13px equivalent for these form elements
- */ 
-select,
-input,
-button,
-textarea {
-	font:99% arial,helvetica,clean,sans-serif;
-}
-
-/**
- * To help tables remember to inherit
- */
-table {
-	font-size:inherit;
-	font:100%;
-}
-
-/**
- * Bump up IE to get to 13px equivalent for these fixed-width elements
- */
-pre,
-code,
-kbd,
-samp,
-tt {
-	font-family:monospace;
-	*font-size:108%;
-	line-height:100%;
-}
-/* YUI CSS Detection Stamp */
-#yui3-css-stamp.cssfonts { display: none; }
diff --git a/app/src/main/webapp/roller-ui/yui3/cssreset/cssreset-min.css b/app/src/main/webapp/roller-ui/yui3/cssreset/cssreset-min.css
deleted file mode 100644
index 8e0fafd..0000000
--- a/app/src/main/webapp/roller-ui/yui3/cssreset/cssreset-min.css
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
-YUI 3.17.2 (build 9c3c78e)
-Copyright 2014 Yahoo! Inc. All rights reserved.
-Licensed under the BSD License.
-http://yuilibrary.com/license/
-*/
-
-html{color:#000;background:#FFF}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}ol,ul{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;*font-size:100%}legend{color:#000}#yui3-css-stamp.cssreset{display:none}
diff --git a/app/src/main/webapp/roller-ui/yui3/cssreset/cssreset.css b/app/src/main/webapp/roller-ui/yui3/cssreset/cssreset.css
deleted file mode 100644
index 24f9cb5..0000000
--- a/app/src/main/webapp/roller-ui/yui3/cssreset/cssreset.css
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-YUI 3.17.2 (build 9c3c78e)
-Copyright 2014 Yahoo! Inc. All rights reserved.
-Licensed under the BSD License.
-http://yuilibrary.com/license/
-*/
-
-/*
-	TODO will need to remove settings on HTML since we can't namespace it.
-	TODO with the prefix, should I group by selector or property for weight savings?
-*/
-html{
-	color:#000;
-	background:#FFF;
-}
-/*
-	TODO remove settings on BODY since we can't namespace it.
-*/
-/*
-	TODO test putting a class on HEAD.
-		- Fails on FF. 
-*/
-body,
-div,
-dl,
-dt,
-dd,
-ul,
-ol,
-li,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-pre,
-code,
-form,
-fieldset,
-legend,
-input,
-textarea,
-p,
-blockquote,
-th,
-td {
-	margin:0;
-	padding:0;
-}
-table {
-	border-collapse:collapse;
-	border-spacing:0;
-}
-fieldset,
-img {
-	border:0;
-}
-/*
-	TODO think about hanlding inheritence differently, maybe letting IE6 fail a bit...
-*/
-address,
-caption,
-cite,
-code,
-dfn,
-em,
-strong,
-th,
-var {
-	font-style:normal;
-	font-weight:normal;
-}
-
-ol,
-ul {
-	list-style:none;
-}
-
-caption,
-th {
-	text-align:left;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-	font-size:100%;
-	font-weight:normal;
-}
-q:before,
-q:after {
-	content:'';
-}
-abbr,
-acronym {
-	border:0;
-	font-variant:normal;
-}
-/* to preserve line-height and selector appearance */
-sup {
-	vertical-align:text-top;
-}
-sub {
-	vertical-align:text-bottom;
-}
-input,
-textarea,
-select {
-	font-family:inherit;
-	font-size:inherit;
-	font-weight:inherit;
-	*font-size:100%; /*to enable resizing for IE*/
-}
-/*because legend doesn't inherit in IE */
-legend {
-	color:#000;
-}
-
-/* YUI CSS Detection Stamp */
-#yui3-css-stamp.cssreset { display: none; }
diff --git a/app/src/main/webapp/theme/scripts/roller.js b/app/src/main/webapp/theme/scripts/roller.js
index d7eb78a..b60ca42 100644
--- a/app/src/main/webapp/theme/scripts/roller.js
+++ b/app/src/main/webapp/theme/scripts/roller.js
@@ -25,19 +25,19 @@
 
 /* This function is used to get cookies */
 function getCookie(name) {
-	var prefix = name + "=" 
-	var start = document.cookie.indexOf(prefix) 
+	var prefix = name + "=";
+	var start = document.cookie.indexOf(prefix);
 
-	if (start==-1) {
+	if (start===-1) {
 		return null;
 	}
 	
-	var end = document.cookie.indexOf(";", start+prefix.length) 
-	if (end==-1) {
+	var end = document.cookie.indexOf(";", start+prefix.length);
+	if (end===-1) {
 		end=document.cookie.length;
 	}
 
-	var value=document.cookie.substring(start+prefix.length, end) 
+	var value=document.cookie.substring(start+prefix.length, end);
 	return unescape(value);
 }
 
@@ -70,7 +70,7 @@
 function toggle(targetId) {
     if (document.getElementById) {
         target = document.getElementById(targetId);
-    	if (target.style.display == "none") {
+    	if (target.style.display === "none") {
     		target.style.display = "";            
     	} else {
     		target.style.display = "none";
@@ -83,7 +83,7 @@
     var expanded;
     if (document.getElementById) {
         target = document.getElementById(targetId);
-    	if (target.style.display == "none") {
+    	if (target.style.display === "none") {
     		target.style.display = "";    
             expanded = true;        
     	} else {
@@ -102,7 +102,7 @@
 function togglePlusMinus(targetId) {
     if (document.getElementById) {
         target = document.getElementById(targetId);
-    	if (target.innerHTML == "+") {
+    	if (target.innerHTML === "+") {
     		target.innerHTML = "-";
     	} else {
     		target.innerHTML = "+";
@@ -116,7 +116,7 @@
     if (folderCookie != null) { // we have user's last setting
         folder = document.getElementById(folderId);
         plusMinus = document.getElementById("i"+folderId);
-        if (folderCookie == "true") { // show
+        if (folderCookie === "true") { // show
             folder.style.display = "";
             plusMinus.innerHTML = "-";
         } else { // hide
@@ -127,11 +127,11 @@
 }
 
 function toggleNextRow(e) {
-    if (e.type == "checkbox") {
+    if (e.type === "checkbox") {
         var checked = e.checked;
-    } else if (e.type == "radio") {
+    } else if (e.type === "radio") {
         var v = e.value;
-        var checked = (v == "1" || v == "y" || v == "true") ? true : false;
+        var checked = (v === "1" || v === "y" || v === "true");
     }
     // var nextRow = e.parentNode.parentNode.nextSibling;
     // the above doesn't work on Mozilla since it treats white space as nodes
@@ -139,7 +139,7 @@
     var tableBody = thisRow.parentNode;
     var nextRow = tableBody.getElementsByTagName("tr")[thisRow.rowIndex+1];
     
-    if (checked == true) {
+    if (checked === true) {
         nextRow.style.display = "";
     } else {
         nextRow.style.display = "none";
@@ -151,7 +151,7 @@
     if (document.getElementById) {
         target = document.getElementById(targetId);
         toggle = document.getElementById(toggleId);
-    	if (target.style.display == "none") {
+    	if (target.style.display === "none") {
     		target.style.display = "";  
             expanded = true;  
                   
@@ -171,7 +171,7 @@
 function isblank(s) {
    for (var i=0; i<s.length; s++) {
       var c = s.charAt(i);
-      if ((c!=' ') && (c!='\n') && (c!='')) return false;
+      if ((c!==' ') && (c!=='\n') && (c!=='')) return false;
    }
     return true;
 }
@@ -183,8 +183,8 @@
 function toggleFunctionAll(toggle) {
 	var inputs = document.getElementsByTagName('input');
 	for(var i = 0; i < inputs.length ; i++) {
-		if(inputs[i].name != "control" && inputs[i].type == 'checkbox' && inputs[i].disabled == false ) {
-			if (inputs[i].checked == true){
+		if(inputs[i].name !== "control" && inputs[i].type === 'checkbox' && inputs[i].disabled === false ) {
+			if (inputs[i].checked === true){
 				inputs[i].checked = !inputs[i].checked;
 			} else{
 				inputs[i].checked = toggle;
@@ -192,11 +192,21 @@
 		}
 	}
 }
+
 function toggleFunction(toggle,name) {;
 	var inputs = document.getElementsByName(name);
 	for(var i = 0; i < inputs.length ; i++) {
-		if(inputs[i].type == 'checkbox' && inputs[i].disabled == false) {
+		if(inputs[i].type === 'checkbox' && inputs[i].disabled === false) {
            inputs[i].checked = toggle;
 		}
 	}
-};
\ No newline at end of file
+}
+
+function isValidUrl(url) {
+    return /^(http|https|ftp):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/i.test(url);
+}
+
+function validateEmail(email) {
+    var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
+    return re.test(email);
+}
diff --git a/app/src/main/webapp/themes/basic/basic-preview.png b/app/src/main/webapp/themes/basic/basic-preview.png
index c7e0335..b062dd5 100644
--- a/app/src/main/webapp/themes/basic/basic-preview.png
+++ b/app/src/main/webapp/themes/basic/basic-preview.png
Binary files differ
diff --git a/app/src/main/webapp/themes/basic/theme.xml b/app/src/main/webapp/themes/basic/theme.xml
index 3300988..5dbf55f 100644
--- a/app/src/main/webapp/themes/basic/theme.xml
+++ b/app/src/main/webapp/themes/basic/theme.xml
@@ -1,9 +1,26 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  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.  For additional information regarding
+  copyright in this work, please see the NOTICE file in the top level
+  directory of this distribution.
+-->
 <weblogtheme>
     
     <id>basic</id>
     <name>Basic</name>
-    <description>Offers wide margins for blogging programming language source code.</description>
+    <description>Super-simple blog theme useful for understanding Roller templates.</description>
     <author>Roller Weblogger</author>
 
     <!-- theme preview image -->
diff --git a/app/src/main/webapp/themes/basicmobile/basic-preview.png b/app/src/main/webapp/themes/basicmobile/basic-preview.png
deleted file mode 100644
index d705687..0000000
--- a/app/src/main/webapp/themes/basicmobile/basic-preview.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/themes/basicmobile/basicmobile-preview.png b/app/src/main/webapp/themes/basicmobile/basicmobile-preview.png
new file mode 100644
index 0000000..a86bd22
--- /dev/null
+++ b/app/src/main/webapp/themes/basicmobile/basicmobile-preview.png
Binary files differ
diff --git a/app/src/main/webapp/themes/basicmobile/theme.xml b/app/src/main/webapp/themes/basicmobile/theme.xml
index 59451f5..210ffe9 100644
--- a/app/src/main/webapp/themes/basicmobile/theme.xml
+++ b/app/src/main/webapp/themes/basicmobile/theme.xml
@@ -1,16 +1,33 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  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.  For additional information regarding
+  copyright in this work, please see the NOTICE file in the top level
+  directory of this distribution.
+-->
 <weblogtheme>
     
     <id>basicmobile</id>
     <name>Basic Mobile</name>
-    <description>Offers wide margins for blogging programming language source code and a separate button for mobile viewing.</description>
+    <description>Sample as Basic theme but with mobile blogging built-in.</description>
     <author>Roller Weblogger</author>
     <!-- dualTheme: Maintain separate mobile & standard templates and stylesheets, default false,
          not needed with responsive themes or where multi-device support is not a concern. -->
     <dualTheme>true</dualTheme>
     
     <!-- theme preview image -->
-    <preview-image path="basic-preview.png" />
+    <preview-image path="basicmobile-preview.png" />
     
     <!-- stylesheet -->
     <stylesheet>
diff --git a/app/src/main/webapp/themes/fauxcoly/fauxcoly-preview.png b/app/src/main/webapp/themes/fauxcoly/fauxcoly-preview.png
new file mode 100644
index 0000000..bba1b3d
--- /dev/null
+++ b/app/src/main/webapp/themes/fauxcoly/fauxcoly-preview.png
Binary files differ
diff --git a/app/src/main/webapp/themes/fauxcoly/images/fauxcoly-preview.png b/app/src/main/webapp/themes/fauxcoly/images/fauxcoly-preview.png
deleted file mode 100644
index e703259..0000000
--- a/app/src/main/webapp/themes/fauxcoly/images/fauxcoly-preview.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/themes/fauxcoly/theme.xml b/app/src/main/webapp/themes/fauxcoly/theme.xml
index 0748bbc..b92069c 100644
--- a/app/src/main/webapp/themes/fauxcoly/theme.xml
+++ b/app/src/main/webapp/themes/fauxcoly/theme.xml
@@ -1,4 +1,21 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  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.  For additional information regarding
+  copyright in this work, please see the NOTICE file in the top level
+  directory of this distribution.
+-->
 <weblogtheme>
     
     <!-- YUI Grid based Roller theme -->
@@ -9,7 +26,7 @@
     <description>Theme built on the Yahoo! User Interface (YUI) library.</description>
 
     <!-- theme preview image -->
-    <preview-image path="images/fauxcoly-preview.png" />
+    <preview-image path="fauxcoly-preview.png" />
 
     <!-- stylesheet -->
     <stylesheet>
diff --git a/app/src/main/webapp/themes/frontpage/frontpage-preview.png b/app/src/main/webapp/themes/frontpage/frontpage-preview.png
new file mode 100644
index 0000000..42a8348
--- /dev/null
+++ b/app/src/main/webapp/themes/frontpage/frontpage-preview.png
Binary files differ
diff --git a/app/src/main/webapp/themes/frontpage/theme.xml b/app/src/main/webapp/themes/frontpage/theme.xml
index 1ac183a..03ab8ee 100644
--- a/app/src/main/webapp/themes/frontpage/theme.xml
+++ b/app/src/main/webapp/themes/frontpage/theme.xml
@@ -1,13 +1,30 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  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.  For additional information regarding
+  copyright in this work, please see the NOTICE file in the top level
+  directory of this distribution.
+-->
 <weblogtheme>
     
     <id>frontpage</id>
     <name>Frontpage</name>
-    <description>Not a standard blog template; meant only as a front page accumulator of all blogs hosted by this server.</description>
+    <description>Theme for aggregated front-page of large multi-blog site.</description>
     <author>Dave Johnson</author>
 
     <!-- theme preview image -->
-    <preview-image path="sm-theme-frontpage.png" />
+    <preview-image path="frontpage-preview.png" />
     
     <!-- templates -->
     <template action="weblog">
diff --git a/app/src/main/webapp/themes/gaurav/entry.vm b/app/src/main/webapp/themes/gaurav/entry.vm
index a71a157..28cd54f 100755
--- a/app/src/main/webapp/themes/gaurav/entry.vm
+++ b/app/src/main/webapp/themes/gaurav/entry.vm
@@ -249,11 +249,6 @@
 					</tbody></table>
 				</div>
 				<div class="well">
-					<p class="details">
-					This is just one entry in the weblog <b>$model.weblog.name</b>.
-					Why don't you <a href="$url.home">visit the main page</a> of the weblog?</p>
-				</div>
-				<div class="well">
 					<h3>Related entries</h3>
 					#set($recentInCat = $model.weblog.getRecentWeblogEntries($model.weblogEntry.category.name, 20))
 					<ul>#foreach($recentEntry in $recentInCat)
diff --git a/app/src/main/webapp/themes/gaurav/gaurav-preview.png b/app/src/main/webapp/themes/gaurav/gaurav-preview.png
new file mode 100644
index 0000000..ffd840d
--- /dev/null
+++ b/app/src/main/webapp/themes/gaurav/gaurav-preview.png
Binary files differ
diff --git a/app/src/main/webapp/themes/gaurav/images/theme-gaurav.png b/app/src/main/webapp/themes/gaurav/images/theme-gaurav.png
deleted file mode 100644
index 0e3b062..0000000
--- a/app/src/main/webapp/themes/gaurav/images/theme-gaurav.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/themes/gaurav/theme.xml b/app/src/main/webapp/themes/gaurav/theme.xml
index 0853e3a..7588cb6 100755
--- a/app/src/main/webapp/themes/gaurav/theme.xml
+++ b/app/src/main/webapp/themes/gaurav/theme.xml
@@ -1,4 +1,21 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  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.  For additional information regarding
+  copyright in this work, please see the NOTICE file in the top level
+  directory of this distribution.
+-->
 <weblogtheme>
     
    <!-- Bootstrap based Roller theme -->
@@ -9,7 +26,7 @@
     <author>Gaurav Saini</author>
 
     <!-- theme preview image -->
-    <preview-image path="images/theme-gaurav.png" />
+    <preview-image path="gaurav-preview.png" />
 
     <!-- stylesheet -->
     <stylesheet>
diff --git a/app/src/main/webapp/themes/gaurav/weblog.vm b/app/src/main/webapp/themes/gaurav/weblog.vm
index 5dec80b..bb85c4e 100755
--- a/app/src/main/webapp/themes/gaurav/weblog.vm
+++ b/app/src/main/webapp/themes/gaurav/weblog.vm
@@ -60,18 +60,20 @@
 						<a href="$url.feed.entries.atom">Subscribe to this blog</a>
 					</div>
 				</div>
-				<div class="well">
-                    #set($mytags = $model.weblog.getPopularTags(-1, 30))
-                    #if ($mytags && $mytags.size() > 4)
-                       <h3>Hot tags</h3>
-                       <p class="details">Below are the most often used tags in the blog. Hover over a tag to see a count of entries, click a tag to see the most recent posts with the tag.</p>
-                       <div id="tagcloud">
-                       #foreach ($tag in $mytags)
-                          <a class="tag s${tag.intensity}" href="$url.tag($tag.name)" title="$tag.count">$tag.name</a>
-                       #end
-                       </div>
-                    #end
+				#if ($mytags && $mytags.size() > 4)
+                    <div class="well">
+                        #set($mytags = $model.weblog.getPopularTags(-1, 30))
+                           <h3>Hot tags</h3>
+                           <p class="details">Below are the most often used tags in the blog.
+							   Hover over a tag to see a count of entries, click a tag to see
+							   the most recent posts with the tag.</p>
+                           <div id="tagcloud">
+                           #foreach ($tag in $mytags)
+                              <a class="tag s${tag.intensity}" href="$url.tag($tag.name)" title="$tag.count">$tag.name</a>
+                           #end
+                           </div>
 				</div>
+				#end
 			</div> <!-- close sidebar_content -->
 		</div> <!-- /.row -->
 	</div> <!-- /.container -->
diff --git a/app/src/test/java/org/apache/roller/planet/business/EntryBasicTests.java b/app/src/test/java/org/apache/roller/planet/business/EntryBasicTests.java
index f7b5134..2ec8b87 100644
--- a/app/src/test/java/org/apache/roller/planet/business/EntryBasicTests.java
+++ b/app/src/test/java/org/apache/roller/planet/business/EntryBasicTests.java
@@ -16,34 +16,36 @@
 
 package org.apache.roller.planet.business;
 
-import junit.framework.TestCase;
-import org.apache.roller.planet.pojos.SubscriptionEntry;
 import org.apache.roller.planet.pojos.Subscription;
+import org.apache.roller.planet.pojos.SubscriptionEntry;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 
 /**
  * Test Entry CRUD.
  */
-public class EntryBasicTests extends TestCase {
+public class EntryBasicTests {
     
     private Subscription testSub = null;
-    
-    
-    protected void setUp() throws Exception {
-        // setup planet
+
+    @BeforeEach
+    public void setUp() throws Exception {
         TestUtils.setupWeblogger();
-        
         testSub = TestUtils.setupSubscription("entryBasicTest");
     }
     
-    
-    protected void tearDown() throws Exception {
+    @AfterEach
+    public void tearDown() throws Exception {
         TestUtils.teardownSubscription(testSub.getId());
     }
     
-    
+    @Test
     public void testEntryCRUD() throws Exception {
         
         PlanetManager mgr = WebloggerFactory.getWeblogger().getPlanetManager();
@@ -85,5 +87,5 @@
         entry = mgr.getEntryById(testEntry.getId());
         assertNull(entry);
     }
-    
+
 }
diff --git a/app/src/test/java/org/apache/roller/planet/business/EntryFunctionalTests.java b/app/src/test/java/org/apache/roller/planet/business/EntryFunctionalTests.java
index a148d36..f6c68ba 100644
--- a/app/src/test/java/org/apache/roller/planet/business/EntryFunctionalTests.java
+++ b/app/src/test/java/org/apache/roller/planet/business/EntryFunctionalTests.java
@@ -16,22 +16,28 @@
 
 package org.apache.roller.planet.business;
 
-import java.util.Date;
-import junit.framework.TestCase;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.pojos.Planet;
-import org.apache.roller.planet.pojos.SubscriptionEntry;
 import org.apache.roller.planet.pojos.PlanetGroup;
 import org.apache.roller.planet.pojos.Subscription;
+import org.apache.roller.planet.pojos.SubscriptionEntry;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.util.Date;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 
 /**
  * Test planet Entry functionality.
  */
-public class EntryFunctionalTests extends TestCase {
+public class EntryFunctionalTests  {
     
     public static Log log = LogFactory.getLog(EntryFunctionalTests.class);
     
@@ -43,8 +49,9 @@
     private SubscriptionEntry testEntry2 = null;
     private SubscriptionEntry testEntry3 = null;
     
-    
-    protected void setUp() throws Exception {
+
+    @BeforeEach
+    public void setUp() throws Exception {
         // setup planet
         TestUtils.setupWeblogger();
 
@@ -71,8 +78,8 @@
         log.info("EXITED");
     }
     
-    
-    protected void tearDown() throws Exception {
+    @AfterEach
+    public void tearDown() throws Exception {
         log.info("ENTERED");
         
         TestUtils.teardownSubscription(testSub1.getId());
@@ -83,7 +90,8 @@
         log.info("EXITED");
     }
     
-    
+
+    @Test
     public void testEntryLookups() throws Exception {
         
         PlanetManager mgr = WebloggerFactory.getWeblogger().getPlanetManager();
@@ -108,7 +116,7 @@
         assertEquals(0, mgr.getEntries(group, new Date(), null, 0, 10).size());
     }
     
-    
+    @Test
     public void testDeleteEntries() throws Exception {
         
         PlanetManager mgr = WebloggerFactory.getWeblogger().getPlanetManager();
diff --git a/app/src/test/java/org/apache/roller/planet/business/GroupBasicTests.java b/app/src/test/java/org/apache/roller/planet/business/GroupBasicTests.java
index a03c851..01e1d41 100644
--- a/app/src/test/java/org/apache/roller/planet/business/GroupBasicTests.java
+++ b/app/src/test/java/org/apache/roller/planet/business/GroupBasicTests.java
@@ -16,32 +16,37 @@
 
 package org.apache.roller.planet.business;
 
-import junit.framework.TestCase;
 import org.apache.roller.planet.pojos.Planet;
 import org.apache.roller.planet.pojos.PlanetGroup;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 
 /**
  * Test Group CRUD.
  */
-public class GroupBasicTests extends TestCase {
+public class GroupBasicTests  {
     
     private Planet testPlanet = null;
     
-    
-    protected void setUp() throws Exception {
+    @BeforeEach
+    public void setUp() throws Exception {
         // setup planet
         TestUtils.setupWeblogger();
+        testPlanet = TestUtils.setupPlanet("planetFuncTest");
     }
     
-    
-    protected void tearDown() throws Exception {
+    @AfterEach
+    public void tearDown() throws Exception {
         TestUtils.teardownPlanet(testPlanet.getId());
     }
     
-    
+    @Test
     public void testGroupCRUD() throws Exception {
         
         PlanetManager mgr = WebloggerFactory.getWeblogger().getPlanetManager();
diff --git a/app/src/test/java/org/apache/roller/planet/business/GroupFunctionalTests.java b/app/src/test/java/org/apache/roller/planet/business/GroupFunctionalTests.java
index 361f333..ced6a41 100644
--- a/app/src/test/java/org/apache/roller/planet/business/GroupFunctionalTests.java
+++ b/app/src/test/java/org/apache/roller/planet/business/GroupFunctionalTests.java
@@ -16,25 +16,31 @@
 
 package org.apache.roller.planet.business;
 
-import java.util.Set;
-import junit.framework.TestCase;
 import org.apache.roller.planet.pojos.Planet;
 import org.apache.roller.planet.pojos.PlanetGroup;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.util.Set;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 
 /**
  * Test planet Group functionality.
  */
-public class GroupFunctionalTests extends TestCase {
+public class GroupFunctionalTests  {
     
     private Planet testPlanet = null;
     private PlanetGroup testGroup1 = null;
     private PlanetGroup testGroup2 = null;
     
-    
-    protected void setUp() throws Exception {
+    @BeforeEach
+    public void setUp() throws Exception {
         // setup planet
         TestUtils.setupWeblogger();
 
@@ -43,14 +49,14 @@
         testGroup2 = TestUtils.setupGroup(testPlanet, "groupFuncTest2");
     }
     
-    
-    protected void tearDown() throws Exception {
+    @AfterEach
+    public void tearDown() throws Exception {
         TestUtils.teardownGroup(testGroup1.getId());
         TestUtils.teardownGroup(testGroup2.getId());
         TestUtils.teardownPlanet(testPlanet.getId());
     }
     
-    
+    @Test
     public void testGroupLookups() throws Exception {
         
         PlanetManager mgr = WebloggerFactory.getWeblogger().getPlanetManager();
diff --git a/app/src/test/java/org/apache/roller/planet/business/PlanetBasicTests.java b/app/src/test/java/org/apache/roller/planet/business/PlanetBasicTests.java
index f0e400d..9ee25bb 100644
--- a/app/src/test/java/org/apache/roller/planet/business/PlanetBasicTests.java
+++ b/app/src/test/java/org/apache/roller/planet/business/PlanetBasicTests.java
@@ -16,22 +16,24 @@
 
 package org.apache.roller.planet.business;
 
-import junit.framework.TestCase;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.pojos.Planet;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 
 /**
  * Test Planet CRUD.
  */
-public class PlanetBasicTests extends TestCase {
+public class PlanetBasicTests  {
     
     public static Log log = LogFactory.getLog(PlanetBasicTests.class);
     
-    
+    @Test
     public void testPlanetCRUD() throws Exception {
         
         // setup planet
diff --git a/app/src/test/java/org/apache/roller/planet/business/PlanetFunctionalTests.java b/app/src/test/java/org/apache/roller/planet/business/PlanetFunctionalTests.java
index c2f5e83..4ac6307 100644
--- a/app/src/test/java/org/apache/roller/planet/business/PlanetFunctionalTests.java
+++ b/app/src/test/java/org/apache/roller/planet/business/PlanetFunctionalTests.java
@@ -16,34 +16,41 @@
 
 package org.apache.roller.planet.business;
 
-import java.util.List;
-import junit.framework.TestCase;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.planet.pojos.Planet;
+import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 
 /**
  * Test Planet functionality.
  */
-public class PlanetFunctionalTests extends TestCase {
+//@ExtendWith(DerbyJunitExtension.class)
+public class PlanetFunctionalTests  {
     
     public static Log log = LogFactory.getLog(PlanetFunctionalTests.class);
     
     private Planet testPlanet = null;
     
-    
-    protected void setUp() throws Exception {
+    @BeforeEach
+    public void setUp() throws Exception {
         // setup planet
         TestUtils.setupWeblogger();
 
         testPlanet = TestUtils.setupPlanet("planetFuncTest");
     }
     
-    
-    protected void tearDown() throws Exception {
+    @AfterEach
+    public void tearDown() throws Exception {
         TestUtils.teardownPlanet(testPlanet.getId());
     }
     
@@ -51,27 +58,25 @@
     /**
      * Test lookup mechanisms.
      */
+    @Test
     public void testPlanetLookups() throws Exception {
         
         PlanetManager mgr = WebloggerFactory.getWeblogger().getPlanetManager();
         
-        Planet planet = null;
-        
         // by id
-        planet = mgr.getWebloggerById(testPlanet.getId());
+        Planet planet = mgr.getWebloggerById(testPlanet.getId());
         assertNotNull(planet);
         assertEquals("planetFuncTest", planet.getHandle());
         
         // by handle
-        planet = null;
         planet = mgr.getWeblogger("planetFuncTest");
         assertNotNull(planet);
         assertEquals("planetFuncTest", planet.getHandle());
         
-        // all planets
+        // all planets (should be 2, the default and the one we created)
         List planets = mgr.getWebloggers();
         assertNotNull(planets);
-        assertEquals(1, planets.size());
+        assertEquals(2, planets.size());
     }
     
 }
diff --git a/app/src/test/java/org/apache/roller/planet/business/PlanetTestSuite.java b/app/src/test/java/org/apache/roller/planet/business/PlanetTestSuite.java
deleted file mode 100644
index 3f20eeb..0000000
--- a/app/src/test/java/org/apache/roller/planet/business/PlanetTestSuite.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  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.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- */
-
-package org.apache.roller.planet.business;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-
-/**
- * Test core business services.
- *
- * The core business services are the things which allow the business layer as
- * a whole to function.  Examples would be the PropertiesManager which is
- * involved in servicing the core application config.
- *
- * Tests from from this suite should only include things that are not part of
- * or dependent on the core weblog platform, i.e. you don't need a user or a
- * weblog to do them.
- */
-public class PlanetTestSuite {
-    
-    public static Test suite() {
-
-        TestSuite suite = new TestSuite();
-	
-        // TODO: add a test for PlanetConfig
-        
-        suite.addTestSuite(PropertiesTest.class);
-        
-        // planets
-        suite.addTestSuite(PlanetBasicTests.class);
-        suite.addTestSuite(PlanetFunctionalTests.class);
-        
-        // groups
-        suite.addTestSuite(GroupBasicTests.class);
-        suite.addTestSuite(GroupFunctionalTests.class);
-        
-        // subscriptions
-        suite.addTestSuite(SubscriptionBasicTests.class);
-        suite.addTestSuite(SubscriptionFunctionalTests.class);
-        
-        // entries
-        suite.addTestSuite(EntryBasicTests.class);
-        suite.addTestSuite(EntryFunctionalTests.class);
-        
-        // fetching
-        suite.addTestSuite(RomeFeedFetcherTest.class);
-        
-        // updating
-        suite.addTestSuite(SingleThreadedFeedUpdaterTest.class);
-        
-        return suite;
-    }
-    
-}
diff --git a/app/src/test/java/org/apache/roller/planet/business/PropertiesTest.java b/app/src/test/java/org/apache/roller/planet/business/PropertiesTest.java
index 5c3e745..2a4217a 100644
--- a/app/src/test/java/org/apache/roller/planet/business/PropertiesTest.java
+++ b/app/src/test/java/org/apache/roller/planet/business/PropertiesTest.java
@@ -18,33 +18,39 @@
 
 package org.apache.roller.planet.business;
 
-import java.util.Map;
-import junit.framework.TestCase;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.business.PropertiesManager;
 import org.apache.roller.weblogger.business.WebloggerFactory;
 import org.apache.roller.weblogger.pojos.RuntimeConfigProperty;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 
 /**
  * Test Properties related business operations.
  */
-public class PropertiesTest extends TestCase {
+public class PropertiesTest  {
     
     public static Log log = LogFactory.getLog(PropertiesTest.class);
     
-    
+    @BeforeEach
     public void setUp() throws Exception {
         // setup planet
         TestUtils.setupWeblogger();
 
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {}
     
-    
+    @Test
     public void testProperiesCRUD() throws Exception {
         
         // remember, the properties table is initialized during Roller startup
diff --git a/app/src/test/java/org/apache/roller/planet/business/RomeFeedFetcherTest.java b/app/src/test/java/org/apache/roller/planet/business/RomeFeedFetcherTest.java
index d01c4dc..93d55c2 100644
--- a/app/src/test/java/org/apache/roller/planet/business/RomeFeedFetcherTest.java
+++ b/app/src/test/java/org/apache/roller/planet/business/RomeFeedFetcherTest.java
@@ -16,7 +16,6 @@
 
 package org.apache.roller.planet.business;
 
-import junit.framework.TestCase;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.business.fetcher.FeedFetcher;
@@ -24,43 +23,34 @@
 import org.apache.roller.planet.pojos.Subscription;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.junit.jupiter.api.AfterEach;
+import static org.junit.jupiter.api.Assertions.*;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 
 /**
  * Test database implementation of PlanetManager.
  */
-public class RomeFeedFetcherTest extends TestCase {
+public class RomeFeedFetcherTest  {
     
     public static Log log = LogFactory.getLog(RomeFeedFetcherTest.class);
     
     String feed_url = "https://rollerweblogger.org/roller/feed/entries/atom";
     
-    
-    protected void setUp() throws Exception {
+    @BeforeEach
+    public void setUp() throws Exception {
         // setup planet
         TestUtils.setupWeblogger();
     }
     
-    
-    protected void tearDown() throws Exception {
+    @AfterEach
+    public void tearDown() throws Exception {
     }
 
-    static boolean shouldSkip() {
-
-        if (System.getProperty("java.version").startsWith("1.7")) {
-            log.warn("Skipping testFetchFeed because free-of-charge versions of " +
-                "Java 1.7 do not support TLS 1.2 which is now in common usage.");
-            return true;
-        }
-        return false;
-    }
-
+    @Test
     public void testFetchFeed() throws FetcherException {
 
-        if (shouldSkip()) {
-            return;
-        }
-
         try {
             FeedFetcher feedFetcher = WebloggerFactory.getWeblogger().getFeedFetcher();
             
@@ -78,13 +68,10 @@
             throw ex;
         }
     }
-    
-    
-    public void testFetchFeedConditionally() throws FetcherException {
 
-        if (shouldSkip()) {
-            return;
-        }
+
+    @Test
+    public void testFetchFeedConditionally() throws FetcherException {
 
         try {
             FeedFetcher feedFetcher = WebloggerFactory.getWeblogger().getFeedFetcher();
diff --git a/app/src/test/java/org/apache/roller/planet/business/SingleThreadedFeedUpdaterTest.java b/app/src/test/java/org/apache/roller/planet/business/SingleThreadedFeedUpdaterTest.java
index 860dafd..b8f6b1a 100644
--- a/app/src/test/java/org/apache/roller/planet/business/SingleThreadedFeedUpdaterTest.java
+++ b/app/src/test/java/org/apache/roller/planet/business/SingleThreadedFeedUpdaterTest.java
@@ -16,7 +16,6 @@
 
 package org.apache.roller.planet.business;
 
-import junit.framework.TestCase;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.business.updater.FeedUpdater;
@@ -24,12 +23,17 @@
 import org.apache.roller.planet.pojos.Subscription;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 
 /**
  * Test feed updater.
  */
-public class SingleThreadedFeedUpdaterTest extends TestCase {
+public class SingleThreadedFeedUpdaterTest  {
     
     public static Log log = LogFactory.getLog(SingleThreadedFeedUpdaterTest.class);
     
@@ -37,9 +41,9 @@
     
     private String feed_url = "https://rollerweblogger.org/roller/feed/entries/atom";
     
-    
-    protected void setUp() throws Exception {
 
+    @BeforeEach
+    public void setUp() throws Exception {
         // setup planet
         TestUtils.setupWeblogger();
         
@@ -52,18 +56,14 @@
         WebloggerFactory.getWeblogger().flush();
     }
     
-    
-    protected void tearDown() throws Exception {
+    @AfterEach
+    public void tearDown() throws Exception {
         TestUtils.teardownSubscription(testSub.getId());
     }
-    
-    
+
+    @Test
     public void testUpdateSubscription() throws Exception {
-
-        if (RomeFeedFetcherTest.shouldSkip()) {
-            return;
-        }
-
+        
         PlanetManager mgr = WebloggerFactory.getWeblogger().getPlanetManager();
         Subscription sub = mgr.getSubscriptionById(testSub.getId());
         
diff --git a/app/src/test/java/org/apache/roller/planet/business/SubscriptionBasicTests.java b/app/src/test/java/org/apache/roller/planet/business/SubscriptionBasicTests.java
index 9f26066..efa3c35 100644
--- a/app/src/test/java/org/apache/roller/planet/business/SubscriptionBasicTests.java
+++ b/app/src/test/java/org/apache/roller/planet/business/SubscriptionBasicTests.java
@@ -16,18 +16,20 @@
 
 package org.apache.roller.planet.business;
 
-import junit.framework.TestCase;
-import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.planet.pojos.Subscription;
+import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 
 /**
  * Test Subscription CRUD.
  */
-public class SubscriptionBasicTests extends TestCase {
+public class SubscriptionBasicTests  {
     
-    
+    @Test
     public void testSubscriptionCRUD() throws Exception {
         
         // setup planet
diff --git a/app/src/test/java/org/apache/roller/planet/business/SubscriptionFunctionalTests.java b/app/src/test/java/org/apache/roller/planet/business/SubscriptionFunctionalTests.java
index 0e801d9..df0ebf1 100644
--- a/app/src/test/java/org/apache/roller/planet/business/SubscriptionFunctionalTests.java
+++ b/app/src/test/java/org/apache/roller/planet/business/SubscriptionFunctionalTests.java
@@ -16,18 +16,22 @@
 
 package org.apache.roller.planet.business;
 
-import junit.framework.TestCase;
-import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.planet.pojos.Planet;
 import org.apache.roller.planet.pojos.PlanetGroup;
 import org.apache.roller.planet.pojos.Subscription;
+import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 /**
  * Test Subscription functionality.
  */
-public class SubscriptionFunctionalTests extends TestCase {
+public class SubscriptionFunctionalTests  {
     
     private Planet testPlanet = null;
     private PlanetGroup testGroup1 = null;
@@ -35,8 +39,8 @@
     private Subscription testSub1 = null;
     private Subscription testSub2 = null;
     
-    
-    protected void setUp() throws Exception {
+    @BeforeEach
+    public void setUp() throws Exception {
         // setup planet
         TestUtils.setupWeblogger();
 
@@ -47,8 +51,8 @@
         testSub2 = TestUtils.setupSubscription("subFuncTest2");
     }
     
-    
-    protected void tearDown() throws Exception {
+    @AfterEach
+    public void tearDown() throws Exception {
         TestUtils.teardownSubscription(testSub1.getId());
         TestUtils.teardownSubscription(testSub2.getId());
         TestUtils.teardownGroup(testGroup1.getId());
@@ -56,7 +60,7 @@
         TestUtils.teardownPlanet(testPlanet.getId());
     }
     
-    
+    @Test
     public void testSubscriptionLookups() throws Exception {
         
         PlanetManager mgr = WebloggerFactory.getWeblogger().getPlanetManager();
@@ -76,7 +80,7 @@
         assertEquals(2, mgr.getSubscriptionCount());
     }
     
-    
+    @Test
     public void testSubscriptionGroupCRUD() throws Exception {
         
         PlanetManager planet = WebloggerFactory.getWeblogger().getPlanetManager();
diff --git a/app/src/test/java/org/apache/roller/planet/util/rome/DiskFeedInfoCacheTest.java b/app/src/test/java/org/apache/roller/planet/util/rome/DiskFeedInfoCacheTest.java
index 5c8bc80..6a7b62e 100644
--- a/app/src/test/java/org/apache/roller/planet/util/rome/DiskFeedInfoCacheTest.java
+++ b/app/src/test/java/org/apache/roller/planet/util/rome/DiskFeedInfoCacheTest.java
@@ -16,25 +16,22 @@
 
 package org.apache.roller.planet.util.rome;
 
+import com.rometools.fetcher.impl.DiskFeedInfoCache;
+import com.rometools.fetcher.impl.SyndFeedInfo;
+import org.apache.roller.weblogger.config.WebloggerConfig;
+import org.junit.jupiter.api.Test;
+
 import java.io.File;
 import java.net.URL;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-import com.rometools.fetcher.impl.SyndFeedInfo;
-import com.rometools.fetcher.impl.DiskFeedInfoCache;
-import org.apache.roller.weblogger.config.WebloggerConfig;
 
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * @author David M Johnson
  */
-public class DiskFeedInfoCacheTest extends TestCase {
+public class DiskFeedInfoCacheTest  {
     
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(DiskFeedInfoCacheTest.class);
-    }
-    
+    @Test
     public void testCache() throws Exception {
         URL url = new URL("http://cnn.com");
         SyndFeedInfo info = new SyndFeedInfo();
@@ -42,7 +39,7 @@
         
         String testPlanetCache = WebloggerConfig.getProperty("cache.dir");
         assertNotNull("testPlanetCache not null", testPlanetCache);
-        assertTrue("testPlanetCache not zero length", testPlanetCache.trim().length() > 0);
+        assertTrue( testPlanetCache.trim().length() > 0, "testPlanetCache not zero length");
         
         File cacheDir = new File(testPlanetCache);
         if (!cacheDir.exists()) cacheDir.mkdirs();
@@ -56,9 +53,4 @@
         assertEquals(url, info2.getUrl());
     }
     
-    public static Test suite() {
-        return new TestSuite(DiskFeedInfoCacheTest.class);
-        
-    }
-    
 }
diff --git a/app/src/test/java/org/apache/roller/testing/DerbyJunitExtension.java b/app/src/test/java/org/apache/roller/testing/DerbyJunitExtension.java
new file mode 100644
index 0000000..3b26bd2
--- /dev/null
+++ b/app/src/test/java/org/apache/roller/testing/DerbyJunitExtension.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
+package org.apache.roller.testing;
+
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.derby.drda.NetworkServerControl;
+import org.apache.roller.weblogger.business.startup.SQLScriptRunner;
+import org.junit.jupiter.api.extension.*;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.DriverManager;
+
+
+public class DerbyJunitExtension implements BeforeAllCallback, AfterAllCallback {
+
+    private static Log log = LogFactory.getLog(DerbyJunitExtension.class);
+
+    private static DerbyStartStopper derbyStartStopper =
+        new DerbyStartStopper("target/derby-system", "target/dbscripts", "4224");
+
+    @Override
+    public void beforeAll(ExtensionContext extensionContext) throws Exception {
+        derbyStartStopper.start();
+    }
+
+    @Override
+    public void afterAll(ExtensionContext extensionContext) throws Exception {
+        try {
+            derbyStartStopper.stop();
+        } catch (Exception e) {
+            log.warn("Error stopping Derby", e);
+        }
+    }
+}
+
+
+class DerbyStartStopper {
+    private String databaseDir;
+    private String databaseScriptsDir;
+    private String port;
+
+
+    DerbyStartStopper( String databaseDir, String databaseScriptsDir, String port ) {
+        this.databaseDir = databaseDir;
+        this.databaseScriptsDir = databaseScriptsDir;
+        this.port = port;
+    }
+
+    public void start() throws Exception {
+
+        System.out.println("==============");
+        System.out.println("Starting Derby");
+        System.out.println("==============");
+
+        System.setProperty("derby.system.home", databaseDir);
+        System.setProperty("derby.drda.portNumber", port);
+        System.setProperty("derby.drda.host", "localhost");
+        System.setProperty("derby.drda.maxThreads", "10");
+        //System.setProperty("derby.drda.logConnections","true");
+
+        NetworkServerControl server = new NetworkServerControl();
+        server.start(new PrintWriter(System.out));
+        try {
+            Thread.sleep(2000);
+        } catch (Exception ignored) {
+        }
+        System.out.println("Runtime Info: " + server.getRuntimeInfo());
+        System.out.println("System Info:  " + server.getSysinfo());
+
+        Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
+        Connection conn = DriverManager.getConnection("jdbc:derby:rollerdb;create=true", "APP", "APP");
+
+        // create roller tables
+
+        SQLScriptRunner runner1 = new SQLScriptRunner(
+            databaseScriptsDir
+                + File.separator + "droptables.sql");
+        runner1.runScript(conn, false);
+
+        SQLScriptRunner runner = new SQLScriptRunner(
+            databaseScriptsDir
+                + File.separator + "derby"
+                + File.separator + "createdb.sql");
+        try {
+            runner.runScript(conn, true);
+        } catch (Exception ignored) {
+            for (String message : runner.getMessages()) {
+                System.out.println(message);
+            }
+            ignored.printStackTrace();
+        }
+    }
+
+    public void stop() throws Exception {
+
+        String driverURL = "jdbc:derby://localhost:" + port + "/rollerdb";
+
+        Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
+        Connection conn = DriverManager.getConnection(driverURL,"APP", "APP");
+
+        // drop Roller tables
+        SQLScriptRunner runner = new SQLScriptRunner(
+            databaseScriptsDir + File.separator + "droptables.sql");
+        runner.runScript(conn, false);
+
+        System.out.println("==============");
+        System.out.println("Stopping Derby");
+        System.out.println("==============");
+
+        try {
+            DriverManager.getConnection(driverURL + ";shutdown=true");
+        } catch (Exception ignored) {
+        }
+
+        System.setProperty("derby.system.home", databaseDir);
+
+        // Network Derby
+        System.setProperty("derby.drda.portNumber", port);
+        System.setProperty("derby.drda.host", "localhost");
+        System.setProperty("derby.drda.maxThreads", "10");
+        //System.setProperty("derby.drda.logConnections","true");
+        NetworkServerControl server = new NetworkServerControl();
+        server.shutdown();
+
+        try {
+            while (true) {
+               server.ping();
+            }
+        } catch (Exception expected) {}
+
+        DriverManager.getConnection("jdbc:derby:;shutdown=true");
+
+        try {Thread.sleep(2000);} catch (Exception ignored) {}
+    }
+}
+
diff --git a/app/src/test/java/org/apache/roller/util/PropertyExpanderTest.java b/app/src/test/java/org/apache/roller/util/PropertyExpanderTest.java
index c57bb5d..c69de7c 100644
--- a/app/src/test/java/org/apache/roller/util/PropertyExpanderTest.java
+++ b/app/src/test/java/org/apache/roller/util/PropertyExpanderTest.java
@@ -18,42 +18,45 @@
 

 package org.apache.roller.util;

 

+import org.junit.jupiter.api.Test;

+

 import java.util.HashMap;

 import java.util.Map;

-import junit.framework.TestCase;

 

+import static org.junit.jupiter.api.Assertions.assertEquals;

 

 /**

  * Unit test for org.apache.roller.weblogger.util.PropertyExpander.

  *

  * @author <a href="mailto:anil@busybuddha.org">Anil Gangolli</a>

  */

-public class PropertyExpanderTest extends TestCase {

+class PropertyExpanderTest  {

     

-    private static final Map props = new HashMap();

+    private static final Map<String, String> props = new HashMap<>();

     

-    static

-    {

+    static {

         props.put("defined.property.one", "value one");

         props.put("defined.property.two", "value two");

         props.put("defined.property.with.dollar.sign.in.value", "$2");

     }

-    

-    public void testExpansion() throws Exception {

+

+    @Test

+    void testExpansion() throws Exception {

         String expanded =

                 PropertyExpander.expandProperties("String with ${defined.property.one} and ${defined.property.two} and ${defined.property.with.dollar.sign.in.value} and ${undefined.property} and some stuff.", props);

         

-        assertEquals("Expanded string doesn't match expected",

-                "String with value one and value two and $2 and ${undefined.property} and some stuff.",

-                expanded);

+        assertEquals(expanded,

+            "String with value one and value two and $2 and ${undefined.property} and some stuff.",

+            "Expanded string doesn't match expected");

     }

-    

-    public void testSystemProperty() throws Exception {

-        String expanded =

-                PropertyExpander.expandSystemProperties("${java.home}");

-        assertEquals("Expanded string doesn't match expected",

-                System.getProperty("java.home"),

-                expanded);

+

+    @Test

+    void testSystemProperty() throws Exception {

+        String expanded = PropertyExpander.expandSystemProperties("${java.home}");

+        assertEquals(expanded,

+            System.getProperty("java.home"),

+            "Expanded string doesn't match expected"

+        );

     }

     

 }

diff --git a/app/src/test/java/org/apache/roller/util/RegexUtilTest.java b/app/src/test/java/org/apache/roller/util/RegexUtilTest.java
index c879fe8..c94b7af 100644
--- a/app/src/test/java/org/apache/roller/util/RegexUtilTest.java
+++ b/app/src/test/java/org/apache/roller/util/RegexUtilTest.java
@@ -18,44 +18,17 @@
 
 package org.apache.roller.util;
 
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
+import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
  * Test regex utils.
  */
-public class RegexUtilTest extends TestCase {
-    
-    /**
-     *
-     */
-    public RegexUtilTest() {
-        super();
-    }
-    
-    /**
-     * @param arg0
-     */
-    public RegexUtilTest(String arg0) {
-        super(arg0);
-    }
-    
-    /**
-     * @see TestCase#setUp()
-     */
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-    
-    /**
-     * @see TestCase#tearDown()
-     */
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-    
+public class RegexUtilTest  {
+
+
+    @Test
     public void testEncodingEmail() {
         // test mailto: escaping
         String test = "test <a href='mailto:this@email.com'>email</a> string";
@@ -64,7 +37,8 @@
         //System.out.println(result);
         assertEquals(expect, result);
     }
-    
+
+    @Test
     public void testObfuscateEmail() {
         // test "plaintext" escaping
         String test = "this@email.com";
@@ -72,7 +46,8 @@
         String result = RegexUtil.encodeEmail(test);
         assertEquals(expect, result);
     }
-    
+
+    @Test
     public void testHexEmail() {
         // test hex & obfuscate together
         String test = "test <a href='mailto:this@email.com'>this@email.com</a> string, and this@email.com";
@@ -81,9 +56,5 @@
         //System.out.println(result);
         assertEquals(expect, result);
     }
-    
-    public static Test suite() {
-        return new TestSuite(RegexUtilTest.class);
-    }
 
 }
diff --git a/app/src/test/java/org/apache/roller/util/UtilitiesTestSuite.java b/app/src/test/java/org/apache/roller/util/UtilitiesTestSuite.java
deleted file mode 100644
index f3b6fd3..0000000
--- a/app/src/test/java/org/apache/roller/util/UtilitiesTestSuite.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  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.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- */
-
-package org.apache.roller.util;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-
-/**
- * Test various utility classes that do not require a database or container.
- */
-public class UtilitiesTestSuite {
-    
-    public static Test suite() {
-
-        TestSuite suite = new TestSuite();
-        
-        suite.addTestSuite(PropertyExpanderTest.class);
-        suite.addTestSuite(RegexUtilTest.class);
-        
-        return suite;
-    }
-    
-}
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/BookmarkTest.java b/app/src/test/java/org/apache/roller/weblogger/business/BookmarkTest.java
index 1a67919..ba2848c 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/BookmarkTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/BookmarkTest.java
@@ -18,26 +18,30 @@
 
 package org.apache.roller.weblogger.business;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.weblogger.TestUtils;
+import org.apache.roller.weblogger.pojos.User;
+import org.apache.roller.weblogger.pojos.Weblog;
+import org.apache.roller.weblogger.pojos.WeblogBookmark;
+import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import java.io.BufferedReader;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.Iterator;
 import java.util.List;
-import junit.framework.TestCase;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.roller.weblogger.WebloggerException;
-import org.apache.roller.weblogger.TestUtils;
-import org.apache.roller.weblogger.pojos.WeblogBookmark;
-import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder;
-import org.apache.roller.weblogger.pojos.User;
-import org.apache.roller.weblogger.pojos.Weblog;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 
 /**
  * Test Weblogger Bookmark Management.
  */
-public class BookmarkTest extends TestCase {
+public class BookmarkTest  {
     
     public static Log log = LogFactory.getLog(BookmarkTest.class);
     
@@ -48,6 +52,7 @@
     /**
      * All tests in this suite require a user and a weblog.
      */
+    @BeforeEach
     public void setUp() throws Exception {
         
         // setup weblogger
@@ -62,7 +67,8 @@
             throw new Exception("Test setup failed", ex);
         }
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {
         
         try {
@@ -79,7 +85,8 @@
         return WebloggerFactory.getWeblogger();
     }
     
-    
+
+    @Test
     public void testBookmarkCRUD() throws Exception {
         
         BookmarkManager bmgr = getRoller().getBookmarkManager();
@@ -151,6 +158,7 @@
     /**
      * Test all bookmark lookup methods.
      */
+    @Test
     public void _testBookmarkLookups() throws Exception {
         
         BookmarkManager bmgr = getRoller().getBookmarkManager();
@@ -222,7 +230,7 @@
      * method.  i am leaving this test here for a while just in case we change
      * our minds.
      */
-    public void _testMoveFolderContents() throws Exception {
+    public void testMoveFolderContents() throws Exception {
         BookmarkManager bmgr = getRoller().getBookmarkManager();
         try {        
 
@@ -293,9 +301,8 @@
             TestUtils.endSession(true);
         }
     }
-    
-    
-    public void _testBookmarkImport() throws Exception {
+
+    public void testBookmarkImport() throws Exception {
         
         InputStream fis = this.getClass().getResourceAsStream("/bookmarks.opml");
         getRoller().getBookmarkManager().importBookmarks(
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/CommentTest.java b/app/src/test/java/org/apache/roller/weblogger/business/CommentTest.java
index 4326789..7b5f214 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/CommentTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/CommentTest.java
@@ -18,30 +18,25 @@
 
 package org.apache.roller.weblogger.business;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.weblogger.TestUtils;
+import org.apache.roller.weblogger.WebloggerException;
+import org.apache.roller.weblogger.pojos.*;
+import org.apache.roller.weblogger.pojos.WeblogEntryComment.ApprovalStatus;
+
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.List;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.roller.weblogger.WebloggerException;
-import org.apache.roller.weblogger.TestUtils;
-import org.apache.roller.weblogger.pojos.CommentSearchCriteria;
-import org.apache.roller.weblogger.pojos.WeblogEntryComment;
-import org.apache.roller.weblogger.pojos.WeblogEntryComment.ApprovalStatus;
-import org.apache.roller.weblogger.pojos.User;
-import org.apache.roller.weblogger.pojos.WeblogEntry;
-import org.apache.roller.weblogger.pojos.Weblog;
 
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Test Comment related business operations.
  *
  * That includes:
  */
-public class CommentTest extends TestCase {
+public class CommentTest  {
     
     public static Log log = LogFactory.getLog(CommentTest.class);
     
@@ -49,17 +44,7 @@
     Weblog testWeblog = null;
     WeblogEntry testEntry = null;
     
-    
-    public CommentTest(String name) {
-        super(name);
-    }
-    
-    
-    public static Test suite() {
-        return new TestSuite(CommentTest.class);
-    }
-    
-    
+
     /**
      * All tests in this suite require a user, weblog, and an entry.
      */
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/CustomTemplateRenditionTest.java b/app/src/test/java/org/apache/roller/weblogger/business/CustomTemplateRenditionTest.java
index fe76dff..4c92b0d 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/CustomTemplateRenditionTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/CustomTemplateRenditionTest.java
@@ -18,22 +18,24 @@
 
 package org.apache.roller.weblogger.business;
 
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.pojos.CustomTemplateRendition;
-import org.apache.roller.weblogger.pojos.ThemeTemplate.ComponentType;
 import org.apache.roller.weblogger.pojos.TemplateRendition.RenditionType;
 import org.apache.roller.weblogger.pojos.TemplateRendition.TemplateLanguage;
+import org.apache.roller.weblogger.pojos.ThemeTemplate.ComponentType;
 import org.apache.roller.weblogger.pojos.User;
 import org.apache.roller.weblogger.pojos.Weblog;
 import org.apache.roller.weblogger.pojos.WeblogTemplate;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
-public class CustomTemplateRenditionTest extends TestCase{
-    public static Log log = LogFactory.getLog(WeblogPageTest.class);
+import static org.junit.jupiter.api.Assertions.*;
+
+public class CustomTemplateRenditionTest  {
+    public static Log log = LogFactory.getLog(CustomTemplateRenditionTest.class);
 
        User testUser = null;
        Weblog testWeblog = null;
@@ -42,19 +44,10 @@
        CustomTemplateRendition mobileCode = null;
 
 
-       public CustomTemplateRenditionTest(String name) {
-           super(name);
-       }
-
-
-       public static Test suite() {
-           return new TestSuite(CustomTemplateRenditionTest.class);
-       }
-
-
        /**
         * All tests in this suite require a user and a weblog.
         */
+       @BeforeEach
        public void setUp() throws Exception {
 
            // setup weblogger
@@ -78,6 +71,7 @@
            testPage.setWeblog(TestUtils.getManagedWebsite(testWeblog));
        }
 
+       @AfterEach
        public void tearDown() throws Exception {
 
            try {
@@ -96,6 +90,7 @@
        /**
         * Test basic persistence operations ... Create, Update, Delete
         */
+       @Test
        public void testTemplateCRUD() throws Exception {
            WeblogManager mgr = WebloggerFactory.getWeblogger().getWeblogManager();
 
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/FileContentManagerTest.java b/app/src/test/java/org/apache/roller/weblogger/business/FileContentManagerTest.java
index d00b5b0..2cfa44d 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/FileContentManagerTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/FileContentManagerTest.java
@@ -17,13 +17,6 @@
  */
 package org.apache.roller.weblogger.business;
 
-import java.io.InputStream;
-import java.util.Map;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
@@ -32,25 +25,25 @@
 import org.apache.roller.weblogger.pojos.User;
 import org.apache.roller.weblogger.pojos.Weblog;
 import org.apache.roller.weblogger.util.RollerMessages;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.io.InputStream;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Test File Management business layer operations.
  */
-public class FileContentManagerTest extends TestCase {
+public class FileContentManagerTest  {
 
     private static Log log = LogFactory.getLog(FileContentManagerTest.class);
     User testUser = null;
     Weblog testWeblog = null;
 
-    public FileContentManagerTest(String name) {
-        super(name);
-    }
-
-    public static Test suite() {
-        return new TestSuite(FileContentManagerTest.class);
-    }
-
-    @Override
+    @BeforeEach
     public void setUp() throws Exception {
 
         // setup weblogger
@@ -58,7 +51,7 @@
 
     }
 
-    @Override
+    @AfterEach
     public void tearDown() throws Exception {
         PropertiesManager pmgr = WebloggerFactory.getWeblogger().getPropertiesManager();
         Map config = pmgr.getProperties();
@@ -73,6 +66,7 @@
     /**
      * Test simple file save/delete.
      */
+    @Test
     public void testFileCRUD() throws Exception {
 
         try {
@@ -99,9 +93,9 @@
         // File should not exist initially
         try {
             FileContent fileContent = fmgr.getFileContent(testWeblog, "bookmarks-file-id");
-            assertTrue("Non-existant file retrieved without any exception", false);
+            assertTrue(false, "Non-existant file retrieved without any exception");
         } catch (FileNotFoundException e) {
-            assertTrue("Exception thrown for non-existant file as expected", true);
+            assertTrue(true, "Exception thrown for non-existant file as expected");
         }
 
         // store a file
@@ -119,9 +113,9 @@
         // File should not exist after delete
         try {
             FileContent fileContent = fmgr.getFileContent(testWeblog, "bookmarks-file-id");
-            assertTrue("Non-existant file retrieved without any exception", false);
+            assertTrue(false, "Non-existant file retrieved without any exception");
         } catch (FileNotFoundException e) {
-            assertTrue("Exception thrown for non-existant file as expected", true);
+            assertTrue(true, "Exception thrown for non-existant file as expected");
         }
 
         TestUtils.endSession(true);
@@ -134,6 +128,7 @@
      *
      * This should test all conditions where a save should fail.
      */
+    @Test
     public void testCanSave() throws Exception {
 
         try {
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/FolderCRUDTest.java b/app/src/test/java/org/apache/roller/weblogger/business/FolderCRUDTest.java
index d6cf9c1..e4247be 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/FolderCRUDTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/FolderCRUDTest.java
@@ -18,18 +18,23 @@
 
 package org.apache.roller.weblogger.business;
 
-import junit.framework.TestCase;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
-import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder;
 import org.apache.roller.weblogger.pojos.User;
 import org.apache.roller.weblogger.pojos.Weblog;
+import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 /**
  * Test basic folder operations.
  */
-public class FolderCRUDTest extends TestCase {
+public class FolderCRUDTest  {
     
     public static Log log = LogFactory.getLog(FolderCRUDTest.class);
     
@@ -40,6 +45,7 @@
     /**
      * All tests in this suite require a user and a weblog.
      */
+    @BeforeEach
     public void setUp() throws Exception {
         
         log.info("BEGIN");
@@ -58,7 +64,8 @@
         
         log.info("END");
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {
         
         log.info("BEGIN");
@@ -79,6 +86,7 @@
     /**
      * Test add/modify/remove of folders.
      */
+    @Test
     public void testBasicCRUD() throws Exception {
         
         log.info("BEGIN");
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/FolderFunctionalityTest.java b/app/src/test/java/org/apache/roller/weblogger/business/FolderFunctionalityTest.java
index cb8fee5..1b086f4 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/FolderFunctionalityTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/FolderFunctionalityTest.java
@@ -18,21 +18,25 @@
 
 package org.apache.roller.weblogger.business;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.List;
-import junit.framework.TestCase;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
-import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder;
 import org.apache.roller.weblogger.pojos.User;
 import org.apache.roller.weblogger.pojos.Weblog;
+import org.apache.roller.weblogger.pojos.WeblogBookmarkFolder;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
 /**
  * Test folder business functions and lookups.
  */
-public class FolderFunctionalityTest extends TestCase {
+public class FolderFunctionalityTest  {
     
     public static Log log = LogFactory.getLog(FolderFunctionalityTest.class);
     
@@ -42,10 +46,12 @@
     WeblogBookmarkFolder f2 = null;
     WeblogBookmarkFolder f3 = null;
     WeblogBookmarkFolder testFolder = null;
-    
+
+
     /**
      * All tests in this suite require a user and a weblog.
      */
+    @BeforeEach
     public void setUp() throws Exception {
         
         log.info("BEGIN");
@@ -74,6 +80,7 @@
         log.info("END");
     }
     
+    @AfterEach
     public void tearDown() throws Exception {
         
         log.info("BEGIN");
@@ -94,6 +101,7 @@
     /**
      * Test the hasBookmarkFolder() method on Weblog.
      */
+    @Test
     public void testHasFolder() throws Exception {
         
         log.info("BEGIN");
@@ -110,6 +118,7 @@
     /** 
      * Ensure that duplicate folder name will throw WebloggerException 
      */
+    @Test
     public void testUniquenessOfFolderNames() throws Exception {
         
         log.info("BEGIN");
@@ -144,6 +153,7 @@
     /**
      * Test folder lookup by id.
      */
+    @Test
     public void testLookupFolderById() throws Exception {
         
         log.info("BEGIN");
@@ -162,6 +172,7 @@
     /**
      * Test folder lookup by id.
      */
+    @Test
     public void testLookupFolderByName() throws Exception {
         
         log.info("BEGIN");
@@ -184,8 +195,8 @@
         
         log.info("END");
     }
-    
-    
+
+    @Test
     public void testLookupAllFoldersByWeblog() throws Exception {
         
         log.info("BEGIN");
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/HitCountTest.java b/app/src/test/java/org/apache/roller/weblogger/business/HitCountTest.java
index d5f7388..4faa511 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/HitCountTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/HitCountTest.java
@@ -18,43 +18,35 @@
 
 package org.apache.roller.weblogger.business;
 
-import java.util.Iterator;
-import java.util.List;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
-import org.apache.roller.weblogger.pojos.WeblogHitCount;
 import org.apache.roller.weblogger.pojos.User;
 import org.apache.roller.weblogger.pojos.Weblog;
+import org.apache.roller.weblogger.pojos.WeblogHitCount;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import java.util.Iterator;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Test HitCount related business operations.
  */
-public class HitCountTest extends TestCase {
+public class HitCountTest  {
     
     public static Log log = LogFactory.getLog(HitCountTest.class);
     
     User testUser = null;
     Weblog testWeblog = null;
-    
-    
-    public HitCountTest(String name) {
-        super(name);
-    }
-    
-    
-    public static Test suite() {
-        return new TestSuite(HitCountTest.class);
-    }
-    
-    
+
     /**
      * All tests in this suite require a user and a weblog.
      */
+    @BeforeEach
     public void setUp() throws Exception {
         
         // setup weblogger
@@ -69,7 +61,8 @@
             throw new Exception("Test setup failed", ex);
         }
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {
         
         try {
@@ -86,6 +79,7 @@
     /**
      * Test basic persistence operations ... Create, Update, Delete.
      */
+    @Test
     public void testHitCountCRUD() throws Exception {
         
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -126,7 +120,7 @@
         assertNull(hitCount);
     }
     
-    
+    @Test
     public void testHitCountLookups() throws Exception {
         
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -164,7 +158,7 @@
         assertNull(hitCount);
     }
     
-    
+    @Test
     public void testIncrementHitCount() throws Exception {
         
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -205,7 +199,7 @@
         assertNull(hitCount);
     }
     
-    
+    @Test
     public void testResetHitCounts() throws Exception {
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
         
@@ -266,7 +260,7 @@
         }
     }
 
-    
+    @Test
     public void testHotWeblogs() throws Exception {
         
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/IndexManagerTest.java b/app/src/test/java/org/apache/roller/weblogger/business/IndexManagerTest.java
index 37b7183..617f008 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/IndexManagerTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/IndexManagerTest.java
@@ -17,44 +17,39 @@
 */
 package org.apache.roller.weblogger.business;
 
-import java.sql.Timestamp;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.roller.util.RollerConstants;
 import org.apache.roller.weblogger.TestUtils;
+import org.apache.roller.weblogger.business.search.IndexManager;
 import org.apache.roller.weblogger.business.search.IndexManagerImpl;
 import org.apache.roller.weblogger.business.search.operations.AddEntryOperation;
 import org.apache.roller.weblogger.business.search.operations.SearchOperation;
-import org.apache.roller.weblogger.business.search.IndexManager;
 import org.apache.roller.weblogger.pojos.User;
-import org.apache.roller.weblogger.pojos.WeblogEntry;
-import org.apache.roller.weblogger.pojos.WeblogEntry.PubStatus;
 import org.apache.roller.weblogger.pojos.Weblog;
 import org.apache.roller.weblogger.pojos.WeblogCategory;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.roller.weblogger.pojos.WeblogEntry;
+import org.apache.roller.weblogger.pojos.WeblogEntry.PubStatus;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import java.sql.Timestamp;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
  * Test Search Manager business layer operations.
  */
-public class IndexManagerTest extends TestCase {
+public class IndexManagerTest  {
     User testUser = null;
     Weblog testWeblog = null;
     public static Log log = LogFactory.getLog(IndexManagerTest.class);    
 
-    public IndexManagerTest(String name) {
-        super(name);
-    }
-        
-    public static Test suite() {
-        return new TestSuite(IndexManagerTest.class);
-    }
-
     /**
      * All tests in this suite require a user and a weblog.
      */
+    @BeforeEach
     public void setUp() throws Exception {
         
         // setup weblogger
@@ -73,7 +68,8 @@
             throw new Exception("Test setup failed", ex);
         }
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {
         
         try {
@@ -85,7 +81,8 @@
             throw new Exception("Test teardown failed", ex);
         }
     }
-        
+
+    @Test
     public void testSearch() throws Exception {
         WeblogEntryManager wem = WebloggerFactory.getWeblogger().getWeblogEntryManager();
 
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/MediaFileTest.java b/app/src/test/java/org/apache/roller/weblogger/business/MediaFileTest.java
index 16cf7aa..62eac5e 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/MediaFileTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/MediaFileTest.java
@@ -17,41 +17,28 @@
  */
 package org.apache.roller.weblogger.business;
 
-import java.io.File;
-import java.sql.Timestamp;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.WebloggerException;
 import org.apache.roller.weblogger.business.jpa.JPAMediaFileManagerImpl;
 import org.apache.roller.weblogger.config.WebloggerConfig;
-import org.apache.roller.weblogger.pojos.MediaFile;
-import org.apache.roller.weblogger.pojos.MediaFileDirectory;
-import org.apache.roller.weblogger.pojos.MediaFileFilter;
+import org.apache.roller.weblogger.pojos.*;
 import org.apache.roller.weblogger.pojos.MediaFileFilter.MediaFileOrder;
 import org.apache.roller.weblogger.pojos.MediaFileFilter.SizeFilterType;
-import org.apache.roller.weblogger.pojos.MediaFileType;
-import org.apache.roller.weblogger.pojos.RuntimeConfigProperty;
-import org.apache.roller.weblogger.pojos.User;
-import org.apache.roller.weblogger.pojos.Weblog;
 import org.apache.roller.weblogger.util.RollerMessages;
-import org.junit.FixMethodOrder;
-import org.junit.Test;
-import org.junit.runners.MethodSorters;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+import java.sql.Timestamp;
+import java.util.*;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Test media file related business operations.
  */
-@FixMethodOrder(MethodSorters.NAME_ASCENDING)
-public class MediaFileTest extends TestCase {
+public class MediaFileTest  {
 
     public static Log log = LogFactory.getLog(MediaFileTest.class);
     // static final String runtimeEnv;
@@ -62,8 +49,6 @@
 
     public void setUp() throws Exception {
         TestUtils.setupWeblogger();
-       // assertEquals(0L, WebloggerFactory.getWeblogger().getWeblogManager()
-       //         .getWeblogCount());
     }
 
     public void tearDown() throws Exception {
@@ -90,7 +75,7 @@
             throw new Exception("Test setup failed", ex);
         }
 
-        /**
+        /*
          * Real test starts here.
          */
         MediaFileManager mfMgr = WebloggerFactory.getWeblogger()
@@ -201,6 +186,7 @@
     /**
      * Test getting list of all directories for a given user.
      */
+    @Test
     public void testGetMediaFileDirectories() throws Exception {
 
         User testUser = null;
@@ -275,6 +261,7 @@
     /**
      * Test deletion of media file
      */
+    @Test
     public void testDeleteMediaFile() throws Exception {
         User testUser;
         Weblog testWeblog;
@@ -345,6 +332,7 @@
     /**
      * Test creation of media file.
      */
+    @Test
     public void testCreateMediaFile() throws Exception {
 
         User testUser;
@@ -400,6 +388,7 @@
     /**
      * Test searching media file.
      */
+    @Test
     public void testSearchMediaFile() throws Exception {
         User testUser = null;
         Weblog testWeblog = null;
@@ -624,6 +613,7 @@
     /**
      * Test searching media file with paging logic.
      */
+    @Test
     public void testSearchMediaFilePaging() throws Exception {
         User testUser = null;
         Weblog testWeblog = null;
@@ -714,6 +704,7 @@
     /**
      * Test searching media file with paging logic.
      */
+    @Test
     public void testSearchMediaFileOrderBy() throws Exception {
         User testUser = null;
         Weblog testWeblog = null;
@@ -803,6 +794,7 @@
     /**
      * Test media file update
      */
+    @Test
     public void testUpdateMediaFile() throws Exception {
         User testUser = null;
         Weblog testWeblog = null;
@@ -870,6 +862,7 @@
     /**
      * Test media file and directory gets
      */
+    @Test
     public void testGetDirectoryContents() throws Exception {
         User testUser = null;
         Weblog testWeblog = null;
@@ -957,6 +950,7 @@
     /**
      * Test moving files across directories.
      */
+    @Test
     public void testMoveDirectoryContents() throws Exception {
 
         User testUser = null;
@@ -1053,6 +1047,7 @@
         }
     }
 
+    @Test
     public void testStorageUpgrade() throws Exception {
         User testUser = null;
         Weblog testWeblog1 = null;
@@ -1079,18 +1074,18 @@
                     .getMediaFileManager();
             JPAMediaFileManagerImpl mmgr = (JPAMediaFileManagerImpl) mgr;
 
-            assertTrue("Upgrade required", mmgr.isFileStorageUpgradeRequired());
+            assertTrue(mmgr.isFileStorageUpgradeRequired(), "Upgrade required" );
 
             mmgr.upgradeFileStorage();
             TestUtils.endSession(true);
 
-            assertFalse("Upgrade required", mmgr.isFileStorageUpgradeRequired());
+            assertFalse(mmgr.isFileStorageUpgradeRequired(), "Upgrade required" );
 
             // now, let's check to see if migration was successful
 
             MediaFileDirectory root1 = mgr
                     .getDefaultMediaFileDirectory(testWeblog1);
-            assertNotNull("testblog1's mediafile dir exists", root1);
+            assertNotNull(root1, "testblog1's mediafile dir exists" );
             assertNotNull(mgr.getMediaFileByPath(testWeblog1, "/sub1/hawk.jpg"));
             assertNotNull(mgr.getMediaFileByPath(testWeblog1,
                     "/sub2/nasa.jpg"));
@@ -1102,7 +1097,7 @@
 
             MediaFileDirectory root2 = mgr
                     .getDefaultMediaFileDirectory(testWeblog2);
-            assertNotNull("testblog2's mediafile dir exists", root2);
+            assertNotNull(root2, "testblog2's mediafile dir exists");
             assertNotNull(root2.getMediaFile("amsterdam.jpg"));
             assertNotNull(root2.getMediaFile("p47-thunderbolt.jpg"));
             assertNotNull(root2.getMediaFile("rollerwiki.png"));
@@ -1133,7 +1128,7 @@
      * 
      * This test fails but it should not, so Z'ed out not to run.
      */
-    public void ZtestDirectoryDeleteAssociation() throws Exception {
+    public void testDirectoryDeleteAssociation() throws Exception {
 
         User testUser = null;
         Weblog testWeblog = null;
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/PermissionTest.java b/app/src/test/java/org/apache/roller/weblogger/business/PermissionTest.java
index 96ced63..8b5caf5 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/PermissionTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/PermissionTest.java
@@ -17,44 +17,36 @@
 */
 package org.apache.roller.weblogger.business;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.pojos.User;
 import org.apache.roller.weblogger.pojos.Weblog;
 import org.apache.roller.weblogger.pojos.WeblogPermission;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Test User/Weblog Permissions related business operations.
  */
-public class PermissionTest extends TestCase {
+public class PermissionTest  {
     
     public static Log log = LogFactory.getLog(PermissionTest.class);
     
     User testUser = null;
     Weblog testWeblog = null;
-    
-    
-    public PermissionTest(String name) {
-        super(name);
-    }
-    
-    
-    public static Test suite() {
-        return new TestSuite(PermissionTest.class);
-    }
-    
-    
+
     /**
      * All tests in this suite require a user and a weblog.
      */
+    @BeforeEach
     public void setUp() throws Exception {
         
         log.info("BEGIN");
@@ -73,7 +65,8 @@
         
         log.info("END");
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {
         
         log.info("BEGIN");
@@ -94,6 +87,7 @@
     /**
      * Test basic persistence operations ... Create, Update, Delete.
      */
+    @Test
     public void testPermissionsCRUD() throws Exception {
         
         log.info("BEGIN");
@@ -172,6 +166,7 @@
     /**
      * Test lookup mechanisms.
      */
+    @Test
     public void testPermissionsLookups() throws Exception {
         
         log.info("BEGIN");
@@ -238,6 +233,7 @@
     /**
      * Tests weblog invitation process.
      */
+    @Test
     public void testInvitations() throws Exception {
         
         log.info("BEGIN");
@@ -300,6 +296,7 @@
     /**
      * Tests weblog invitation process.
      */
+    @Test
     public void testPermissionChecks() throws Exception {
         
         log.info("BEGIN");
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/PingsTest.java b/app/src/test/java/org/apache/roller/weblogger/business/PingsTest.java
index 11fcbde..62364b1 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/PingsTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/PingsTest.java
@@ -23,11 +23,6 @@
 
 package org.apache.roller.weblogger.business;
 
-import java.util.ArrayList;
-import java.util.List;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
@@ -37,12 +32,19 @@
 import org.apache.roller.weblogger.pojos.PingTarget;
 import org.apache.roller.weblogger.pojos.User;
 import org.apache.roller.weblogger.pojos.Weblog;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Test Pings related business operations.
  */
-public class PingsTest extends TestCase {
+public class PingsTest  {
     
     public static Log log = LogFactory.getLog(PingsTest.class);
     
@@ -50,20 +52,11 @@
     Weblog testWeblog = null;
     PingTarget testCommonPing = null;
 
-    
-    public PingsTest(String name) {
-        super(name);
-    }
-    
-    
-    public static Test suite() {
-        return new TestSuite(PingsTest.class);
-    }
-    
-    
+
     /**
      * All tests in this suite require a user and a weblog.
      */
+    @BeforeEach
     public void setUp() throws Exception {
         
         // setup weblogger
@@ -82,7 +75,8 @@
         testCommonPing.setName("testCommonPing");
         testCommonPing.setPingUrl("http://localhost/testCommonPing");
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {
         
         try {
@@ -101,6 +95,7 @@
     /**
      * Test basic persistence operations ... Create, Update, Delete
      */
+    @Test
     public void testPingTargetCRUD() throws Exception {
         
         PingTargetManager mgr = WebloggerFactory.getWeblogger().getPingTargetManager();
@@ -146,6 +141,7 @@
     /**
      * Test lookup mechanisms ... id, all common for weblog
      */
+    @Test
     public void testPingTargetLookups() throws Exception {
         
         PingTargetManager mgr = WebloggerFactory.getWeblogger().getPingTargetManager();
@@ -179,6 +175,7 @@
     /**
      * Test basic persistence operations ... Create, Update, Delete
      */
+    @Test
     public void testAutoPingCRUD() throws Exception {
         
         AutoPingManager mgr = WebloggerFactory.getWeblogger().getAutopingManager();
@@ -232,6 +229,7 @@
     /**
      * Test special ping target removal methods ... by weblog/target, collection, all
      */
+    @Test
     public void testPingTargetRemovals() throws Exception {
         
         AutoPingManager mgr = WebloggerFactory.getWeblogger().getAutopingManager();
@@ -306,6 +304,7 @@
     /**
      * Test lookup mechanisms ... id, ping target, weblog
      */
+    @Test
     public void testAutoPingLookups() throws Exception {
         
         AutoPingManager mgr = WebloggerFactory.getWeblogger().getAutopingManager();
@@ -352,19 +351,5 @@
         TestUtils.teardownPingTarget(pingTarget.getId());
         TestUtils.endSession(true);
     }
-    
-    
-    public void testApplicableAutoPings() throws Exception {
-        
-    }
-    
-    
-    /**
-     * Test that we can properly remove a ping target when it has
-     * associated elements like auto pings and ping queue entries.
-     */
-    public void testRemoveLoadedPingTarget() throws Exception {
-        // TODO: implement this test
-    }
-    
+
 }
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/PlanetManagerLocalTest.java b/app/src/test/java/org/apache/roller/weblogger/business/PlanetManagerLocalTest.java
index 668a372..deaaf23 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/PlanetManagerLocalTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/PlanetManagerLocalTest.java
@@ -15,45 +15,45 @@
  */
 package org.apache.roller.weblogger.business;
 
-import java.sql.Timestamp;
-import java.util.Date;
-import java.util.List;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-import junit.textui.TestRunner;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.business.PlanetManager;
 import org.apache.roller.planet.pojos.Planet;
 import org.apache.roller.planet.pojos.PlanetGroup;
 import org.apache.roller.weblogger.TestUtils;
-import org.apache.roller.weblogger.pojos.User;
-import org.apache.roller.weblogger.pojos.WeblogEntry;
-import org.apache.roller.weblogger.pojos.WeblogEntry.PubStatus;
-import org.apache.roller.weblogger.pojos.Weblog;
 import org.apache.roller.weblogger.planet.tasks.RefreshRollerPlanetTask;
 import org.apache.roller.weblogger.planet.tasks.SyncWebsitesTask;
+import org.apache.roller.weblogger.pojos.User;
+import org.apache.roller.weblogger.pojos.Weblog;
+import org.apache.roller.weblogger.pojos.WeblogEntry;
+import org.apache.roller.weblogger.pojos.WeblogEntry.PubStatus;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.List;
+
+import static junit.framework.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 
 /**
  * Test database implementation of PlanetManager for local feeds.
  * @author Dave Johnson
  */
-public class PlanetManagerLocalTest extends TestCase {
+public class PlanetManagerLocalTest  {
     public static Log log = LogFactory.getLog(PlanetManagerLocalTest.class);
     
     User testUser = null;
     Weblog testWeblog = null;
-    
-    public static void main(String[] args) {
-        TestRunner.run(PlanetManagerLocalTest.class);
-    }
-    
+
     /**
      * All tests in this suite require a user and a weblog.
      */
+    @BeforeEach
     public void setUp() throws Exception {
         
         try {
@@ -112,7 +112,8 @@
             throw new Exception("Test setup failed", ex);
         }
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {
         
         try {
@@ -124,7 +125,8 @@
             throw new Exception("Test teardown failed", ex);
         }
     }
-    
+
+    @Test
     public void testRefreshEntries() {
         try {      
             PlanetManager planet = WebloggerFactory.getWeblogger().getPlanetManager();
@@ -152,11 +154,6 @@
             fail();
         }
     }
-    
-    public static Test suite() {
-        return new TestSuite(PlanetManagerLocalTest.class);
-    }
-    
-    
+
 }
 
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/PropertiesTest.java b/app/src/test/java/org/apache/roller/weblogger/business/PropertiesTest.java
index e5c2729..0ed3b8c 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/PropertiesTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/PropertiesTest.java
@@ -18,43 +18,37 @@
 
 package org.apache.roller.weblogger.business;
 
-import java.util.Map;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.pojos.RuntimeConfigProperty;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Test Properties related business operations.
  */
-public class PropertiesTest extends TestCase {
+public class PropertiesTest  {
     
     public static Log log = LogFactory.getLog(PropertiesTest.class);
-    
-    
-    public PropertiesTest(String name) {
-        super(name);
-    }
-    
-    
-    public static Test suite() {
-        return new TestSuite(PropertiesTest.class);
-    }
-    
-    
+
+    @BeforeEach
     public void setUp() throws Exception {
         // setup weblogger
         TestUtils.setupWeblogger();
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {
     }
-    
-    
+
+
+    @Test
     public void testProperiesCRUD() throws Exception {
         
         // remember, the properties table is initialized during Roller startup
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/SQLScriptRunnerTest.java b/app/src/test/java/org/apache/roller/weblogger/business/SQLScriptRunnerTest.java
index bc20dc8..90de2a3 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/SQLScriptRunnerTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/SQLScriptRunnerTest.java
@@ -18,22 +18,28 @@
 
 package org.apache.roller.weblogger.business;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.weblogger.TestUtils;
+import org.apache.roller.weblogger.business.startup.SQLScriptRunner;
+import org.apache.roller.weblogger.business.startup.WebloggerStartup;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import junit.framework.TestCase;
-import org.apache.roller.weblogger.business.startup.WebloggerStartup;
-import org.apache.roller.weblogger.business.startup.SQLScriptRunner;
-import org.apache.roller.weblogger.TestUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Test parsing and running of SQL scripts
  */
-public class SQLScriptRunnerTest extends TestCase {
+public class SQLScriptRunnerTest  {
     public static Log log = LogFactory.getLog(SQLScriptRunnerTest.class);
 
+    @BeforeEach
     public void setUp() {
         try {
             TestUtils.setupWeblogger();
@@ -42,7 +48,8 @@
         }
     }
 
-    public void testParseOnly() throws Exception {        
+    @Test
+    public void testParseOnly() throws Exception {
         DatabaseProvider dbp = WebloggerStartup.getDatabaseProvider();
         Connection con = dbp.getConnection(); 
         
@@ -59,8 +66,9 @@
         SQLScriptRunner runner = new SQLScriptRunner(scriptPath);
         assertTrue(runner != null);
         assertTrue(runner.getCommandCount() == 5);        
-    }    
-    
+    }
+
+    @Test
     public void testSimpleRun() throws Exception {
         DatabaseProvider dbp = WebloggerStartup.getDatabaseProvider();
         Connection con = dbp.getConnection(); 
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/TaskLockTest.java b/app/src/test/java/org/apache/roller/weblogger/business/TaskLockTest.java
index 16d391b..d0ac746 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/TaskLockTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/TaskLockTest.java
@@ -18,39 +18,31 @@
 
 package org.apache.roller.weblogger.business;
 
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
-import org.apache.roller.weblogger.business.runnable.RollerTask;
 import org.apache.roller.weblogger.business.runnable.ThreadManager;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Test TaskLock related business operations.
  */
-public class TaskLockTest extends TestCase {
+public class TaskLockTest  {
     
     public static Log log = LogFactory.getLog(TaskLockTest.class);
-    
-    
-    public TaskLockTest(String name) {
-        super(name);
-    }
-    
-    
-    public static Test suite() {
-        return new TestSuite(TaskLockTest.class);
-    }
-    
-    
+
+    @BeforeEach
     public void setUp() throws Exception {
         // setup weblogger
         TestUtils.setupWeblogger();
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {
     }
     
@@ -59,6 +51,7 @@
      * Test basic persistence operations ... Create, Update, Delete.
      * @throws Exception if one is raised
      */
+    @Test
     public void testTaskLockCRUD() throws Exception {
         
         ThreadManager mgr = WebloggerFactory.getWeblogger().getThreadManager();
@@ -68,22 +61,22 @@
         task.init();
         
         // try to acquire a lock
-        assertTrue("Failed to acquire lease.",mgr.registerLease(task));
+        assertTrue(mgr.registerLease(task), "Failed to acquire lease.");
         // We don't flush here because registerLease should flush on its own
         TestUtils.endSession(false);
         
         // make sure task is locked
-        assertFalse("Acquired lease a second time when we shouldn't have been able to.",mgr.registerLease(task));
+        assertFalse(mgr.registerLease(task),"Acquired lease a second time when we shouldn't have been able to.");
         TestUtils.endSession(false);
         
         // try to release a lock
-        assertTrue("Release of lease failed.",mgr.unregisterLease(task));
+        assertTrue(mgr.unregisterLease(task), "Release of lease failed.");
         // We don't flush here because unregisterLease should flush on its own
         TestUtils.endSession(false);
 
         // Current unregisterLease semantics are idempotent.  Double release should
         // actually succeed.
-        assertTrue("Second release failed.", mgr.unregisterLease(task));
+        assertTrue( mgr.unregisterLease(task), "Second release failed.");
         TestUtils.endSession(false);
     }
     
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/ThemeManagerTest.java b/app/src/test/java/org/apache/roller/weblogger/business/ThemeManagerTest.java
new file mode 100644
index 0000000..b4584c4
--- /dev/null
+++ b/app/src/test/java/org/apache/roller/weblogger/business/ThemeManagerTest.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
+package org.apache.roller.weblogger.business;
+
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.weblogger.TestUtils;
+import org.apache.roller.weblogger.business.themes.ThemeManager;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+public class ThemeManagerTest  {
+    public static Log log = LogFactory.getLog(ThemeManagerTest.class);
+
+    @BeforeEach
+    public void setUp() throws Exception {
+        TestUtils.setupWeblogger();
+    }
+
+    @AfterEach
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testThemeAssumptions() throws Exception {
+
+        ThemeManager themeManager = WebloggerFactory.getWeblogger().getThemeManager();
+        themeManager.initialize();
+
+        assertNotNull( themeManager.getTheme("basic") );
+        assertNotNull( themeManager.getTheme("basic").getStylesheet() );
+        assertNull( themeManager.getTheme("frontpage").getStylesheet() );
+    }
+        
+}
+
+
+
+
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/UserTest.java b/app/src/test/java/org/apache/roller/weblogger/business/UserTest.java
index b1e20fb..b06d7c6 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/UserTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/UserTest.java
@@ -18,40 +18,34 @@
 
 package org.apache.roller.weblogger.business;
 
-import java.util.List;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.config.WebloggerConfig;
 import org.apache.roller.weblogger.pojos.User;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Test User related business operations.
  */
-public class UserTest extends TestCase {
+public class UserTest  {
     
     public static Log log = LogFactory.getLog(UserTest.class);
-    
-    
-    public UserTest(String name) {
-        super(name);
-    }
-    
-    
-    public static Test suite() {
-        return new TestSuite(UserTest.class);
-    }
-    
-    
+
+
+    @BeforeEach
     public void setUp() throws Exception {
         // setup weblogger
         TestUtils.setupWeblogger();
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {
     }
     
@@ -59,6 +53,7 @@
     /**
      * Test basic persistence operations ... Create, Update, Delete.
      */
+    @Test
     public void testUserCRUD() throws Exception {
         
         UserManager mgr = WebloggerFactory.getWeblogger().getUserManager();
@@ -117,6 +112,7 @@
     /**
      * Test lookup mechanisms.
      */
+    @Test
     public void testUserLookups() throws Exception {
         
         UserManager mgr = WebloggerFactory.getWeblogger().getUserManager();
@@ -171,6 +167,7 @@
     /**
      * Test basic user role persistence ... Add, Remove
      */
+    @Test
     public void testRoleCRUD() throws Exception {
         
         UserManager mgr = WebloggerFactory.getWeblogger().getUserManager();
@@ -234,12 +231,4 @@
         TestUtils.endSession(true);
     }
 
-    
-    /**
-     * Test ability to remove a user with a full set of data.
-     */
-    public void testRemoveLoadedUser() throws Exception {
-        // TODO: implement testRemoveLoadedUser
-    }
-    
 }
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/WeblogCategoryCRUDTest.java b/app/src/test/java/org/apache/roller/weblogger/business/WeblogCategoryCRUDTest.java
index ad7a879..d48fc2c 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/WeblogCategoryCRUDTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/WeblogCategoryCRUDTest.java
@@ -18,19 +18,22 @@
 
 package org.apache.roller.weblogger.business;
 
-import junit.framework.TestCase;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.pojos.User;
-import org.apache.roller.weblogger.pojos.WeblogCategory;
 import org.apache.roller.weblogger.pojos.Weblog;
+import org.apache.roller.weblogger.pojos.WeblogCategory;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Test WeblogCategory CRUD actions.
  */
-public class WeblogCategoryCRUDTest extends TestCase {
+public class WeblogCategoryCRUDTest  {
     
     public static Log log = LogFactory.getLog(WeblogCategoryCRUDTest.class);
     
@@ -41,6 +44,7 @@
     /**
      * All tests in this suite require a user and a weblog.
      */
+    @BeforeEach
     public void setUp() {
         
         log.info("BEGIN");
@@ -58,7 +62,8 @@
         
         log.info("END");
     }
-    
+
+    @AfterEach
     public void tearDown() {
         
         log.info("BEGIN");
@@ -78,6 +83,7 @@
     /**
      * Test WeblogCategory.equals() method.
      */
+    @Test
     public void testWeblogCategoryEquality() throws Exception {
         
         log.info("BEGIN");
@@ -99,6 +105,7 @@
     /**
      * Test basic persistence operations ... Create, Update, Delete.
      */
+    @Test
     public void testBasicCRUD() throws Exception {
         
         log.info("BEGIN");
@@ -159,6 +166,7 @@
     /**
      * Make sure that deleting a category deletes all child categories.
      */
+    @Test
     public void testCategoryCascadingDelete() throws Exception {
         
         log.info("BEGIN");
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/WeblogCategoryFunctionalityTest.java b/app/src/test/java/org/apache/roller/weblogger/business/WeblogCategoryFunctionalityTest.java
index f7b2f7f..cc2837d 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/WeblogCategoryFunctionalityTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/WeblogCategoryFunctionalityTest.java
@@ -18,22 +18,26 @@
 
 package org.apache.roller.weblogger.business;
 
-import java.util.List;
-import junit.framework.TestCase;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.pojos.User;
+import org.apache.roller.weblogger.pojos.Weblog;
 import org.apache.roller.weblogger.pojos.WeblogCategory;
 import org.apache.roller.weblogger.pojos.WeblogEntry;
 import org.apache.roller.weblogger.pojos.WeblogEntry.PubStatus;
-import org.apache.roller.weblogger.pojos.Weblog;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Test Weblog Category related business operations.
  */
-public class WeblogCategoryFunctionalityTest extends TestCase {
+public class WeblogCategoryFunctionalityTest  {
     
     public static Log log = LogFactory.getLog(WeblogCategoryFunctionalityTest.class);
     
@@ -48,6 +52,7 @@
     /**
      * All tests in this suite require a user and a weblog.
      */
+    @BeforeEach
     public void setUp() {
         
         log.info("BEGIN");
@@ -74,7 +79,8 @@
         
         log.info("END");
     }
-    
+
+    @AfterEach
     public void tearDown() {
         
         log.info("BEGIN");
@@ -93,6 +99,7 @@
     /**
      * Test the hasCategory() method on WeblogCategory.
      */
+    @Test
     public void testHasCategory() throws Exception {
         
         log.info("BEGIN");
@@ -107,6 +114,7 @@
     /**
      * Lookup category by id.
      */
+    @Test
     public void testLookupCategoryById() throws Exception {
         
         log.info("BEGIN");
@@ -124,6 +132,7 @@
     /**
      * Lookup category by name.
      */
+    @Test
     public void testLookupCategoryByName() throws Exception {
         
         log.info("BEGIN");
@@ -151,6 +160,7 @@
     /**
      * Lookup all categories for a weblog.
      */
+    @Test
     public void testLookupAllCategoriesByWeblog() throws Exception {
         
         log.info("BEGIN");
@@ -168,6 +178,7 @@
     /**
      * Test moving entries in category to new category.
      */
+    @Test
     public void testMoveWeblogCategoryContents() throws Exception {
         log.info("BEGIN");
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/WeblogEntryTest.java b/app/src/test/java/org/apache/roller/weblogger/business/WeblogEntryTest.java
index 78eaeb3..9900efc 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/WeblogEntryTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/WeblogEntryTest.java
@@ -18,56 +18,37 @@
 
 package org.apache.roller.weblogger.business;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
-import org.apache.roller.weblogger.pojos.WeblogEntryComment;
-import org.apache.roller.weblogger.pojos.TagStat;
-import org.apache.roller.weblogger.pojos.User;
-import org.apache.roller.weblogger.pojos.WeblogCategory;
-import org.apache.roller.weblogger.pojos.WeblogEntry;
+import org.apache.roller.weblogger.pojos.*;
 import org.apache.roller.weblogger.pojos.WeblogEntry.PubStatus;
-import org.apache.roller.weblogger.pojos.WeblogEntrySearchCriteria;
-import org.apache.roller.weblogger.pojos.WeblogEntryTag;
-import org.apache.roller.weblogger.pojos.Weblog;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.sql.Timestamp;
+import java.util.*;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Test WeblogEntry related business operations.
  */
-public class WeblogEntryTest extends TestCase {
+public class WeblogEntryTest  {
     
     public static Log log = LogFactory.getLog(WeblogEntryTest.class);
     
     User testUser = null;
     Weblog testWeblog = null;
-    
-    
-    public WeblogEntryTest(String name) {
-        super(name);
-    }
-    
-    
-    public static Test suite() {
-        return new TestSuite(WeblogEntryTest.class);
-    }
-    
+
     
     /**
      * All tests in this suite require a user and a weblog.
      */
+    @BeforeEach
     public void setUp() throws Exception {
 
         // setup weblogger
@@ -89,7 +70,8 @@
             throw new Exception("Test setup failed", ex);
         }
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {
         
         try {
@@ -106,6 +88,7 @@
     /**
      * Test basic persistence operations ... Create, Update, Delete.
      */
+    @Test
     public void testWeblogEntryCRUD() throws Exception {
         
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -157,6 +140,7 @@
     /**
      * Test lookup mechanisms ... 
      */
+    @Test
     public void testWeblogEntryLookups() throws Exception {
         
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -326,6 +310,7 @@
     /**
      * Test that the createAnchor() method actually ensures unique anchors.
      */
+    @Test
     public void testCreateAnchor() throws Exception {
         
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -355,6 +340,7 @@
         TestUtils.endSession(true);
     }
 
+    @Test
     public void testCreateAnEntryWithTagsShortcut() throws Exception {
         try {
             WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -404,7 +390,8 @@
             log.info(sw.toString());
         }
     }
-        
+
+    @Test
     public void testAddMultipleTags() throws Exception {
 
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -431,7 +418,8 @@
         TestUtils.teardownWeblogEntry(id);
         TestUtils.endSession(true);
     }
-    
+
+    @Test
     public void testAddMultipleIdenticalTags() throws Exception {
 
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -456,8 +444,9 @@
         // teardown our test entry
         TestUtils.teardownWeblogEntry(id);
         TestUtils.endSession(true);
-    }    
+    }
 
+    @Test
     public void testRemoveTagsViaShortcut() throws Exception {
         try {
             WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -496,7 +485,8 @@
             log.info(sw.toString());
         }
     }
-    
+
+    @Test
     public void testTagsExist() throws Exception {
         
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -546,7 +536,8 @@
         TestUtils.teardownWeblog(wid);
         TestUtils.endSession(true);
     }
-    
+
+    @Test
     public void testGetEntriesByTag() throws Exception {
         try {
             WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -582,8 +573,9 @@
             log.info(sw.toString());
         }
     }
-        
 
+
+    @Test
     public void testRemoveEntryTagCascading() throws Exception {
 
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -617,8 +609,9 @@
 
         // terminate
         TestUtils.endSession(true);
-    } 
-    
+    }
+
+    @Test
     public void testUpdateTags() throws Exception {
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
 
@@ -662,6 +655,7 @@
      * 
      * @throws Exception
      */
+    @Test
      public void testUpdateTagTime() throws Exception {
          WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
 
@@ -710,6 +704,7 @@
         TestUtils.endSession(true);
     }
 
+    @Test
     public void testTagAggregates() throws Exception {
         log.info("BEGIN");
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -818,8 +813,7 @@
                 }
                 Integer expectedCount =
                         expectedWeblogTags.get(stat.getName());
-                assertEquals(stat.getName(),
-                        expectedCount.intValue(), stat.getCount());
+                assertEquals(expectedCount.intValue(), stat.getCount(), stat.getName());
             }
 
             tags = mgr.getTags(null, null, null, 0, -1);
@@ -837,7 +831,7 @@
                     fail("Unexpected tagName.");
                 }
                 Integer expectedCount = expectedSiteTags.get(stat.getName());
-                assertEquals(stat.getName(), expectedCount.intValue(), stat.getCount());
+                assertEquals( expectedCount.intValue(), stat.getCount(), stat.getName());
             }
 
             TestUtils.teardownWeblog(testWeblog2.getId());
@@ -854,6 +848,7 @@
         log.info("END");
     }
 
+    @Test
     public void testTagAggregatesCaseSensitivity() throws Exception {
 
         Weblog testWeblog2 = TestUtils.setupWeblog("entryTestWeblog2",
@@ -938,6 +933,7 @@
     /**
      * Test that we can add and remove entry attributes for an entry.
      */
+    @Test
      public void testEntryAttributeCRUD() throws Exception {
         
         WeblogEntryManager emgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
@@ -999,8 +995,9 @@
         entry = emgr.getWeblogEntry(id);
         assertNull(entry);
     }
-    
-    
+
+
+    @Test
     public void testWeblogStats() throws Exception {
 
         WeblogEntryManager emgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/WeblogPageTest.java b/app/src/test/java/org/apache/roller/weblogger/business/WeblogPageTest.java
index 5b633b4..8b80fe2 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/WeblogPageTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/WeblogPageTest.java
@@ -18,44 +18,39 @@
 
 package org.apache.roller.weblogger.business;
 
-import java.util.List;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.pojos.ThemeTemplate.ComponentType;
 import org.apache.roller.weblogger.pojos.User;
-import org.apache.roller.weblogger.pojos.WeblogTemplate;
 import org.apache.roller.weblogger.pojos.Weblog;
+import org.apache.roller.weblogger.pojos.WeblogTemplate;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import java.util.List;
+
+import static junit.framework.TestCase.assertNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 /**
  * Test Weblog Page related business operations.
  */
-public class WeblogPageTest extends TestCase {
+public class WeblogPageTest  {
     
     public static Log log = LogFactory.getLog(WeblogPageTest.class);
     
     User testUser = null;
     Weblog testWeblog = null;
     WeblogTemplate testPage = null;
-    
-    
-    public WeblogPageTest(String name) {
-        super(name);
-    }
-    
-    
-    public static Test suite() {
-        return new TestSuite(WeblogPageTest.class);
-    }
-    
+
     
     /**
      * All tests in this suite require a user and a weblog.
      */
+    @BeforeEach
     public void setUp() throws Exception {
         
         // setup weblogger
@@ -78,7 +73,8 @@
         testPage.setLastModified(new java.util.Date());
         testPage.setWeblog(TestUtils.getManagedWebsite(testWeblog));
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {
         
         try {
@@ -97,6 +93,7 @@
     /**
      * Test basic persistence operations ... Create, Update, Delete
      */
+    @Test
     public void testTemplateCRUD() throws Exception {
         
         WeblogManager mgr = WebloggerFactory.getWeblogger().getWeblogManager();
@@ -135,6 +132,7 @@
     /**
      * Test lookup mechanisms ... id, name, link, weblog
      */
+    @Test
     public void testPermissionsLookups() throws Exception {
         
         WeblogManager mgr = WebloggerFactory.getWeblogger().getWeblogManager();
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/WeblogStatsTest.java b/app/src/test/java/org/apache/roller/weblogger/business/WeblogStatsTest.java
index 6ce3ec9..c52ec69 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/WeblogStatsTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/WeblogStatsTest.java
@@ -1,20 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
 package org.apache.roller.weblogger.business;
 
+import org.apache.roller.util.RollerConstants;
+import org.apache.roller.weblogger.TestUtils;
+import org.apache.roller.weblogger.pojos.*;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import java.util.List;
 import java.util.Map;
-import junit.framework.TestCase;
-import org.apache.roller.util.RollerConstants;
-import org.apache.roller.weblogger.TestUtils;
-import org.apache.roller.weblogger.pojos.WeblogEntryComment;
-import org.apache.roller.weblogger.pojos.StatCount;
-import org.apache.roller.weblogger.pojos.User;
-import org.apache.roller.weblogger.pojos.WeblogEntry;
-import org.apache.roller.weblogger.pojos.Weblog;
 
-/**
- *
- */
-public class WeblogStatsTest extends TestCase {
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class WeblogStatsTest  {
     
     private User user1, user2;
     
@@ -28,10 +45,9 @@
     private Weblog website2;
         private WeblogEntry entry21;
             private WeblogEntryComment comment21; 
-    
-    public WeblogStatsTest() {
-    }  
-    protected void setUp() throws Exception {
+
+    @BeforeEach
+    public void setUp() throws Exception {
         // create weblog with three entries and two comments per entry
         user1 = TestUtils.setupUser("a_commentCountTestUser");
         user2 = TestUtils.setupUser("b_commentCountTestUser");
@@ -53,6 +69,8 @@
 
         Thread.sleep(RollerConstants.SEC_IN_MS);
     }
+
+    @Test
     public void testGetMostCommentedWeblogs() throws Exception {        
         WeblogManager mgr = WebloggerFactory.getWeblogger().getWeblogManager();     
         List list = mgr.getMostCommentedWeblogs(null, null, 0, -1);  
@@ -70,6 +88,8 @@
         assertEquals(website2.getId(), s2.getSubjectId());
         assertEquals(1L, s2.getCount());   
     }
+
+    @Test
     public void testGetMostCommentedWeblogEntries() throws Exception {
         
         WeblogEntryManager mgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();      
@@ -86,6 +106,8 @@
         StatCount s2 = (StatCount)list.get(1);
         assertEquals(1L, s2.getCount());   
     }
+
+    @Test
     public void testGetUserNameLetterMap() throws Exception {        
         UserManager mgr = WebloggerFactory.getWeblogger().getUserManager();      
         Map map = mgr.getUserNameLetterMap();    
@@ -93,6 +115,8 @@
         assertNotNull(map.get("B"));
         assertNotNull(map.get("C"));
     }
+
+    @Test
     public void testGetWeblogLetterMap() throws Exception {        
         WeblogManager mgr = WebloggerFactory.getWeblogger().getWeblogManager();
         Map map = mgr.getWeblogHandleLetterMap();    
@@ -100,7 +124,9 @@
         assertNotNull(map.get("B"));
         assertNotNull(map.get("C"));
     }
-    protected void tearDown() throws Exception {
+
+    @AfterEach
+    public void tearDown() throws Exception {
         
         // TODO: ATLAS figure out why comments must be torn down first
         TestUtils.teardownComment(comment11.getId());
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/WeblogTest.java b/app/src/test/java/org/apache/roller/weblogger/business/WeblogTest.java
index ca4cb29..e3cfdbc 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/WeblogTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/WeblogTest.java
@@ -17,41 +17,33 @@
 */
 package org.apache.roller.weblogger.business;
 
-import java.util.List;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
-import org.apache.roller.weblogger.pojos.StatCount;
 import org.apache.roller.weblogger.pojos.User;
 import org.apache.roller.weblogger.pojos.Weblog;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
 
 
 /**
  * Test Weblog related business operations.
  */
-public class WeblogTest extends TestCase {
+public class WeblogTest  {
     
     public static Log log = LogFactory.getLog(WeblogTest.class);
     
     User testUser = null;
     
-    
-    public WeblogTest(String name) {
-        super(name);
-    }
-    
-    
-    public static Test suite() {
-        return new TestSuite(WeblogTest.class);
-    }
-    
-    
     /**
      * All tests in this suite require a user.
      */
+    @BeforeEach
     public void setUp() throws Exception {
         
         log.info("BEGIN");
@@ -69,7 +61,8 @@
         
         log.info("END");
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {
         
         log.info("BEGIN");
@@ -89,6 +82,7 @@
     /**
      * Test basic persistence operations ... Create, Update, Delete.
      */
+    @Test
     public void testWeblogCRUD() throws Exception {
         
         log.info("BEGIN");
@@ -159,6 +153,7 @@
     /**
      * Test lookup mechanisms.
      */
+    @Test
     public void testWeblogLookups() throws Exception {
         
         log.info("BEGIN");
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java b/app/src/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java
index d94d5b3..0b2ab39 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/jpa/JPAOAuthManagerTest.java
@@ -18,21 +18,25 @@
 
 package org.apache.roller.weblogger.business.jpa;
 
-import junit.framework.TestCase;
 import net.oauth.OAuthAccessor;
 import net.oauth.OAuthConsumer;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Test Weblogger Bookmark Management.
  */
-public class JPAOAuthManagerTest extends TestCase {    
+public class JPAOAuthManagerTest  {
     public static Log log = LogFactory.getLog(JPAOAuthManagerTest.class);
 
+    @BeforeEach
     public void setUp() throws Exception {
         
         // setup weblogger
@@ -45,7 +49,8 @@
             throw new Exception("Test setup failed", ex);
         }
     }
-    
+
+    @AfterEach
     public void tearDown() throws Exception {
         
         try {
@@ -56,6 +61,7 @@
         }
     }
 
+    @Test
     public void testCRUD() throws Exception {
         JPAOAuthManagerImpl omgr = (JPAOAuthManagerImpl)
             WebloggerFactory.getWeblogger().getOAuthManager();
diff --git a/app/src/test/java/org/apache/roller/weblogger/business/plugins/CommentPluginsTest.java b/app/src/test/java/org/apache/roller/weblogger/business/plugins/CommentPluginsTest.java
index ec4b000..1166a05 100644
--- a/app/src/test/java/org/apache/roller/weblogger/business/plugins/CommentPluginsTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/business/plugins/CommentPluginsTest.java
@@ -18,30 +18,35 @@
 
 package org.apache.roller.weblogger.business.plugins;
 
-import junit.framework.TestCase;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.business.WebloggerFactory;
 import org.apache.roller.weblogger.pojos.WeblogEntryComment;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
  * Test comment plugins.
  */
-public class CommentPluginsTest extends TestCase {
+public class CommentPluginsTest  {
 
     private String convertLinesStart = "paragraph1\n\nparagraph2\nline2\nline3\n\nparagraph3";
     private String convertLinesFormatted = "\n<p>paragraph1</p>\n\n\n<p>paragraph2<br/>\nline2<br/>\nline3</p>\n\n\n<p>paragraph3</p>\n\n";
     
-    
-    protected void setUp() throws Exception {
+
+    @BeforeEach
+    public void setUp() throws Exception {
         TestUtils.setupWeblogger();
     }
-    
-    protected void tearDown() throws Exception {
+
+    @AfterEach
+    public void tearDown() throws Exception {
         // no-op
     }
     
-    
+    @Test
     public void testAutoFormatPlugin() {
         
         PluginManager pmgr = WebloggerFactory.getWeblogger().getPluginManager();
diff --git a/app/src/test/java/org/apache/roller/weblogger/planet/business/WebloggerRomeFeedFetcherTest.java b/app/src/test/java/org/apache/roller/weblogger/planet/business/WebloggerRomeFeedFetcherTest.java
index f544031..52a01eb 100644
--- a/app/src/test/java/org/apache/roller/weblogger/planet/business/WebloggerRomeFeedFetcherTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/planet/business/WebloggerRomeFeedFetcherTest.java
@@ -18,19 +18,22 @@
 
 package org.apache.roller.weblogger.planet.business;
 
-import junit.framework.TestCase;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.business.fetcher.FeedFetcher;
 import org.apache.roller.planet.pojos.Subscription;
 import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.business.WebloggerFactory;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Test custom weblogger feed fetcher.
  */
-public class WebloggerRomeFeedFetcherTest extends TestCase {
+public class WebloggerRomeFeedFetcherTest  {
     
     public static Log log = LogFactory.getLog(WebloggerRomeFeedFetcherTest.class);
     
@@ -42,7 +45,7 @@
     /**
      * All tests in this suite require a user and a weblog.
      */
-    @Override
+    @BeforeEach
     public void setUp() throws Exception {
         
         // setup weblogger
@@ -58,7 +61,7 @@
         }
     }
     
-    @Override
+    @AfterEach
     public void tearDown() throws Exception {
         
         try {
@@ -72,7 +75,7 @@
         }
     }
     
-    
+    @Test
     public void testFetchSubscription() throws Exception {
         try {
             FeedFetcher feedFetcher = WebloggerFactory.getWeblogger().getFeedFetcher();
diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/ApplicationResourcesTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/ApplicationResourcesTest.java
index 35dbddd..e52e22a 100644
--- a/app/src/test/java/org/apache/roller/weblogger/ui/ApplicationResourcesTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/ui/ApplicationResourcesTest.java
@@ -22,13 +22,13 @@
  */
 package org.apache.roller.weblogger.ui;
 
+import org.junit.jupiter.api.BeforeEach;
+
 import java.io.FileInputStream;
 import java.util.Properties;
 import java.util.Set;
 
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 
 
 /**
@@ -47,33 +47,12 @@
  * @author <a href="mailto:molen@mail.com">Jaap van der Molen</a>
  * @version $Revision: 1.7 $
  */
-public class ApplicationResourcesTest extends TestCase
-{
+public class ApplicationResourcesTest {
 	//private String userDir = null;
 	private Properties baseProps = null; 
 
-	/**
-	 * @param name
-	 */
-	public ApplicationResourcesTest(String name)
-	{
-		super(name);
-	}
-	
-	public static Test suite() {
-		TestSuite suite = new TestSuite();
-//		suite.addTest(new ApplicationResourcesTest("testSystemProperties"));
-//		suite.addTest(
-//			new ApplicationResourcesTest("testApplicationResources_zh_cn"));
-		return suite;
-	}
-	
-	/**
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception
-	{
-		super.setUp();
+	@BeforeEach
+	public void setUp() throws Exception {
 		//userDir = System.getProperty("user.dir");
 		
 		// load base ApplicationResources.properties file
@@ -84,16 +63,12 @@
 
 	/**
 	 * Test Simple Chinese stuff.
-	 * 
-	 * @throws Exception
 	 */
-	public void _testApplicationResources_zh_cn() throws Exception
-	{
+	public void testApplicationResources_zh_cn() throws Exception {
 		verifyResourceBundle("ApplicationResources_zh_cn");
 	}
 
-    public void testSystemProperties()
-    {
+    public void testSystemProperties() {
         Properties sysProps = System.getProperties();
         for (Object key : sysProps.keySet()) {
             System.out.println(key + " = " + sysProps.getProperty((String)key));
@@ -106,8 +81,7 @@
 	 * @param bundle name of bundle to test
 	 * @throws Exception if file not found, or if io ecxeption occurs.
 	 */
-	private void verifyResourceBundle(String bundle) throws Exception
-	{
+	private void verifyResourceBundle(String bundle) throws Exception {
 		// verify user-dir; should end with roller
 		//assertNotNull(userDir);
 		//assertTrue(userDir.endsWith("roller"));
diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/UIPluginManagerTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/UIPluginManagerTest.java
index 3cc3b14..ac87b3c 100644
--- a/app/src/test/java/org/apache/roller/weblogger/ui/UIPluginManagerTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/ui/UIPluginManagerTest.java
@@ -18,37 +18,22 @@
 
 package org.apache.roller.weblogger.ui;
 
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.ui.core.RollerContext;
 import org.apache.roller.weblogger.ui.core.plugins.UIPluginManager;
+import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
  * Test Plugin Management business layer operations.
  */
-public class UIPluginManagerTest extends TestCase {
+public class UIPluginManagerTest  {
     
     private static Log log = LogFactory.getLog(UIPluginManagerTest.class);
     
-    
-    public UIPluginManagerTest(String name) {
-        super(name);
-    }
-    
-    
-    public static Test suite() {
-        return new TestSuite(UIPluginManagerTest.class);
-    }
-    
-    
-    public void setUp() throws Exception { }
-    public void tearDown() throws Exception { }
-    
-    
+    @Test
     public void testEntryEditors() throws Exception {
     	log.debug("Start");
         
diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/UITestSuite.java b/app/src/test/java/org/apache/roller/weblogger/ui/UITestSuite.java
deleted file mode 100644
index 89abc70..0000000
--- a/app/src/test/java/org/apache/roller/weblogger/ui/UITestSuite.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  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.  For additional information regarding
- * copyright in this work, please see the NOTICE file in the top level
- * directory of this distribution.
- */
-
-package org.apache.roller.weblogger.ui;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import org.apache.roller.weblogger.planet.business.WebloggerRomeFeedFetcherTest;
-import org.apache.roller.weblogger.ui.rendering.util.CommentValidatorTest;
-
-
-/**
- * Test UI.
- */
-public class UITestSuite {
-    
-    public static Test suite() {
-
-        TestSuite suite = new TestSuite();
-	
-        // comment plugins
-        suite.addTestSuite(CommentValidatorTest.class);
-        
-        // custom planet fetcher
-        suite.addTestSuite(WebloggerRomeFeedFetcherTest.class);
-        
-        return suite;
-    }
-    
-}
diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/core/filters/InitFilterTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/core/filters/InitFilterTest.java
index 0c7aef4..30f1a3e 100644
--- a/app/src/test/java/org/apache/roller/weblogger/ui/core/filters/InitFilterTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/ui/core/filters/InitFilterTest.java
@@ -18,15 +18,19 @@
 
 package org.apache.roller.weblogger.ui.core.filters;
 
-import junit.framework.TestCase;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 
 /**
  * @author Kohei Nozaki
  */
-public class InitFilterTest extends TestCase {
+public class InitFilterTest  {
 
     private static final String SERVER_NAME = "roller.example.com";
 
+    @Test
     public void testGetAbsoluteUrlOnRootWithHttp() throws Exception {
         boolean secure = false;
         String contextPath = "";
@@ -37,6 +41,7 @@
         assertEquals("http://roller.example.com", absoluteUrl);
     }
 
+    @Test
     public void testGetAbsoluteUrlOnRootWithHttps() throws Exception {
         boolean secure = true;
         String contextPath = "";
@@ -47,6 +52,7 @@
         assertEquals("http://roller.example.com", absoluteUrl);
     }
 
+    @Test
     public void testGetAbsoluteUrlAgainstTop() throws Exception {
         boolean secure = false;
         String contextPath = "/roller";
@@ -57,6 +63,7 @@
         assertEquals("http://roller.example.com/roller", absoluteUrl);
     }
 
+    @Test
     public void testGetAbsoluteUrlAgainstPermalink() throws Exception {
         boolean secure = false;
         String contextPath = "/roller";
@@ -67,6 +74,7 @@
         assertEquals("http://roller.example.com/roller", absoluteUrl);
     }
 
+    @Test
     public void testRemoveTrailingSlash() throws Exception {
         assertEquals("http://www.example.com", InitFilter.removeTrailingSlash("http://www.example.com/"));
         assertEquals("http://www.example.com", InitFilter.removeTrailingSlash("http://www.example.com"));
diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/rendering/util/CommentValidatorTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/rendering/util/CommentValidatorTest.java
index 605c279..a6cd46b 100644
--- a/app/src/test/java/org/apache/roller/weblogger/ui/rendering/util/CommentValidatorTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/ui/rendering/util/CommentValidatorTest.java
@@ -18,30 +18,33 @@
 
 package org.apache.roller.weblogger.ui.rendering.util;
 
-import junit.framework.TestCase;
-import org.apache.roller.weblogger.pojos.WeblogEntryComment;
+import org.apache.roller.weblogger.TestUtils;
 import org.apache.roller.weblogger.pojos.User;
-import org.apache.roller.weblogger.pojos.WeblogEntry;
 import org.apache.roller.weblogger.pojos.Weblog;
+import org.apache.roller.weblogger.pojos.WeblogEntry;
+import org.apache.roller.weblogger.pojos.WeblogEntryComment;
 import org.apache.roller.weblogger.ui.rendering.plugins.comments.CommentValidationManager;
 import org.apache.roller.weblogger.util.RollerMessages;
-import org.apache.roller.weblogger.TestUtils;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  *
  * @author David M. Johnson
  */
-public class CommentValidatorTest extends TestCase {
+public class CommentValidatorTest  {
     CommentValidationManager mgr = null;
     Weblog        weblog = null;
     User           user = null;
     WeblogEntry    entry = null;
     
-    /** Creates a new instance of CommentValidatorTest */
-    public CommentValidatorTest() {
-    } 
 
-    protected void setUp() throws Exception {
+    @BeforeEach
+    public void setUp() throws Exception {
         // setup weblogger
         TestUtils.setupWeblogger();
         
@@ -57,14 +60,16 @@
 
         TestUtils.endSession(true);
     }
-    
-    protected void tearDown() throws Exception {
+
+    @AfterEach
+    public void tearDown() throws Exception {
         TestUtils.teardownWeblogEntry(entry.getId());
         //TestUtils.teardownWeblogCategory(weblog.getDefaultCategory().getId());
         TestUtils.teardownWeblog(weblog.getId());
         TestUtils.teardownUser(user.getUserName());
     }
-    
+
+    @Test
     public void testExcessSizeCommentValidator() {
         RollerMessages msgs = new RollerMessages();
         WeblogEntryComment comment = createEmptyComment();
@@ -81,7 +86,8 @@
         comment.setContent(sb.toString()); 
         assertTrue(mgr.validateComment(comment, msgs) != 100);
     }
-    
+
+    @Test
     public void testExcessLinksCommentValidator() {
         RollerMessages msgs = new RollerMessages();
         WeblogEntryComment comment = createEmptyComment();
@@ -99,7 +105,8 @@
         ); 
         assertTrue(mgr.validateComment(comment, msgs) != 100);        
     }
-    
+
+    @Test
     public void testBlacklistCommentValidator() {
         RollerMessages msgs = new RollerMessages();
         WeblogEntryComment comment = createEmptyComment();
diff --git a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/UIActionTest.java b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/UIActionTest.java
index 3866c0b..f804cf1 100644
--- a/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/UIActionTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/ui/struts2/util/UIActionTest.java
@@ -18,21 +18,14 @@
 
 package org.apache.roller.weblogger.ui.struts2.util;
 
+import org.junit.jupiter.api.Test;
 
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 
-public class UIActionTest extends TestCase {
+public class UIActionTest  {
 
-    public UIActionTest() {
-    }
-
-    public static Test suite() {
-        return new TestSuite(UIActionTest.class);
-    }
-
+    @Test
     public void testCleanTextEmpty() {
         assertEquals(null,UIAction.cleanTextKey(null));
         assertEquals("",UIAction.cleanTextKey(""));
@@ -40,6 +33,7 @@
         assertEquals("",UIAction.cleanTextArg(""));
     }
 
+    @Test
     public void testCleanTextKey() {
         assertEquals(null,UIAction.cleanTextKey(null));
         assertEquals("",UIAction.cleanTextKey(""));
@@ -58,6 +52,7 @@
         assertEquals("", UIAction.cleanTextKey("something %{foo} more"));
     }
 
+    @Test
     public void testCleanTextArg() {
         assertEquals("&lt;i&gt;some text&lt;/i&gt;",UIAction.cleanTextArg("<i>some text</i>"));
         assertEquals("&lt;i&gt;some ${text}&lt;/i&gt;",UIAction.cleanTextArg("<i>some ${text}</i>"));
diff --git a/app/src/test/java/org/apache/roller/weblogger/util/BlacklistTest.java b/app/src/test/java/org/apache/roller/weblogger/util/BlacklistTest.java
index 158b740..638ae9d 100644
--- a/app/src/test/java/org/apache/roller/weblogger/util/BlacklistTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/util/BlacklistTest.java
@@ -18,85 +18,72 @@
 
 package org.apache.roller.weblogger.util;
 
-import java.io.File;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Test blacklist functionality.
  */
-public class BlacklistTest extends TestCase {
-    public static Log log =    
-        LogFactory.getLog(BlacklistTest.class);  
+public class BlacklistTest  {
+    public static Log log = LogFactory.getLog(BlacklistTest.class);
     
     private Blacklist blacklist;
     
-      
-    public BlacklistTest() {
-        super();
-    }
-    
-    /**
-     * @param arg0
-     */
-    public BlacklistTest(String arg0) {
-        super(arg0);
-    }
-    
-    /**
-     * @see TestCase#setUp()
-     */
-    protected void setUp() throws Exception {
-        super.setUp();
+    @BeforeEach
+    public void setUp() throws Exception {
         blacklist = Blacklist.getBlacklist();
         String FS = File.separator;
         String blacklistName = System.getProperty("project.build.directory") + FS + "classes" + "blacklist.txt";
         log.info("Processing Blacklist file: " + blacklistName);
         blacklist.loadBlacklistFromFile(blacklistName);
     }
-    
-    /**
-     * @see TestCase#tearDown()
-     */
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        //System.out.println(blacklist);
+
+    @AfterEach
+    public void tearDown() throws Exception {
     }
-    
+
+    @Test
     public void testIsBlacklisted0() {
         assertFalse(blacklist.isBlacklisted("four score and seven years ago.com"));
     }
     
     // test non-regex
+    @Test
     public void testIsBlacklisted1() {
         assertTrue(blacklist.isBlacklisted("www.myblacklistedsite.com"));
     }
     
     // test the regex patterns
+    @Test
     public void testIsBlacklisted2() {
         assertTrue(blacklist.isBlacklisted("www.lsotr.com"));
     }
     
     // test the regex patterns
+    @Test
     public void testIsBlacklisted3() {
         assertTrue(blacklist.isBlacklisted("buymoreonline.com"));
     }
     
     // test the regex patterns
+    @Test
     public void testIsBlacklisted4() {
         assertTrue(blacklist.isBlacklisted("diet-enlargement.com"));
     }
     
     // test the regex patterns
+    @Test
     public void testIsBlacklisted5() {
         assertTrue(blacklist.isBlacklisted("viagra.com"));
     }
     
-    public static Test suite() {
-        return new TestSuite(BlacklistTest.class);
-    }
-    
+
 }
diff --git a/app/src/test/java/org/apache/roller/weblogger/util/LRUCache2Test.java b/app/src/test/java/org/apache/roller/weblogger/util/LRUCache2Test.java
index 585e1e8..989e35b 100644
--- a/app/src/test/java/org/apache/roller/weblogger/util/LRUCache2Test.java
+++ b/app/src/test/java/org/apache/roller/weblogger/util/LRUCache2Test.java
@@ -18,24 +18,16 @@
 
 package org.apache.roller.weblogger.util;
 
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
+import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Test LRUCache2.
  */
-public class LRUCache2Test extends TestCase {
-    
-    /**
-     * @see junit.framework.TestCase#setUp()
-     */
-    protected void setUp() throws Exception {
-        // TODO Auto-generated method stub
-        super.setUp();
-    }
-    
+public class LRUCache2Test  {
+
+    @Test
     public void testTimeout() {
         // Create cache with 100 item limit and 15 second timeout
         TestEnvironment env = new TestEnvironment();
@@ -54,7 +46,8 @@
         assertNull(cache.get("key2"));
         assertNull(cache.get("key3"));
     }
-    
+
+    @Test
     public void testLRU() {
         // Create cache with 3 item limit and 15 second timeout
         TestEnvironment env = new TestEnvironment();
@@ -78,7 +71,8 @@
         cache.put("key4", "string4");
         assertNull(cache.get("key3"));
     }
-    
+
+    @Test
     public void testPurge() {
         // Create cache with 100 item limit and 15 second timeout
         TestEnvironment env = new TestEnvironment();
@@ -99,14 +93,6 @@
         assertEquals(0, cache.size());
     }
     
-    /**
-     * @see junit.framework.TestCase#tearDown()
-     */
-    protected void tearDown() throws Exception {
-        // TODO Auto-generated method stub
-        super.tearDown();
-    }
-    
     public static class TestEnvironment implements LRUCache2.Environment {
         public long time = 0;
         public long getCurrentTimeInMillis() {
@@ -114,8 +100,5 @@
         }
     }
     
-    public static Test suite() {
-        return new TestSuite(LRUCache2Test.class);
-    }
-    
+
 }
diff --git a/app/src/test/java/org/apache/roller/weblogger/util/LinkbackExtractorTest.java b/app/src/test/java/org/apache/roller/weblogger/util/LinkbackExtractorTest.java
index 0361c2c..8153864 100644
--- a/app/src/test/java/org/apache/roller/weblogger/util/LinkbackExtractorTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/util/LinkbackExtractorTest.java
@@ -18,51 +18,24 @@
 
 package org.apache.roller.weblogger.util;
 
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
  * Test linkback extractor.
  */
-public class LinkbackExtractorTest extends TestCase {
-    
-    /**
-     * Constructor for LinkbackExtractorTest.
-     * @param arg0
-     */
-    public LinkbackExtractorTest(String arg0) {
-        super(arg0);
-    }
+public class LinkbackExtractorTest  {
 
-    public static void main(String[] args) {
-    }
-    
-    /**
-     * @see TestCase#setUp()
-     */
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-    
-    /**
-     * @see TestCase#tearDown()
-     */
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-    
     public void testLinkbackExtractor() throws Exception {
         String[][] testrefs = new String[][]
         {
             // Second URL contains a link to the first
             {
                 "http://cassandra.apache.org/",
-                        "http://rollerweblogger.org/roller/entry/composite_keys_in_cassandra"
+                        "https://rollerweblogger.org/roller/entry/composite_keys_in_cassandra"
             },
             {
                 "http://roller.apache.org/downloads/downloads.html",
-                        "http://rollerweblogger.org/project/date/20140627"
+                        "https://rollerweblogger.org/project/date/20140627"
             }
         };
 
@@ -74,9 +47,6 @@
 
         // todo: le.getPermalink() and le.getExcerpt() working
     }
-    
-    public static Test suite() {
-        return new TestSuite(LinkbackExtractorTest.class);
-    }
+
     
 }
diff --git a/app/src/test/java/org/apache/roller/weblogger/util/UtilitiesTest.java b/app/src/test/java/org/apache/roller/weblogger/util/UtilitiesTest.java
index 6db7046..2b97d0c 100644
--- a/app/src/test/java/org/apache/roller/weblogger/util/UtilitiesTest.java
+++ b/app/src/test/java/org/apache/roller/weblogger/util/UtilitiesTest.java
@@ -18,62 +18,40 @@
 
 package org.apache.roller.weblogger.util;
 
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
+import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
  * Test utilities.
  */
-public class UtilitiesTest extends TestCase {
-    
-    /**
-     * Constructor for LinkbackExtractorTest.
-     * @param arg0
-     */
-    public UtilitiesTest(String arg0) {
-        super(arg0);
-    }
-    
-    public static void main(String[] args) {
-    }
-    
-    /**
-     * @see TestCase#setUp()
-     */
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-    
-    /**
-     * @see TestCase#tearDown()
-     */
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-    
+public class UtilitiesTest  {
+
+    @Test
     public void testExtractHTML() {
         String test = "<a>keep me</a>";
         String expect = "<a></a>";
         String result = Utilities.extractHTML(test);
         assertEquals(expect, result);
     }
-    
+
+    @Test
     public void testRemoveHTML() {
         String test = "<br><br><p>a <b>bold</b> sentence with a <a href=\"http://example.com\">link</a></p>";
         String expect = "a bold sentence with a link";
         String result = Utilities.removeHTML(test, false);
         assertEquals(expect, result);
     }
-    
+
+    @Test
     public void testTruncateNicely1() {
         String test = "blah blah blah blah blah";
         String expect = "blah blah blah";
         String result = Utilities.truncateNicely(test, 11, 15, "");
         assertEquals(expect, result);
     }
-    
+
+    @Test
     public void testTruncateNicely2() {
         String test = "<p><b>blah1 blah2</b> <i>blah3 blah4 blah5</i></p>";
         String expect = "<p><b>blah1 blah2</b> <i>blah3</i></p>";
@@ -83,6 +61,7 @@
     }
     
     /* broken because it uses UtilitiesModel which is part of .ui.* package
+    @Test
     public void testAddNoFollow() {
         String test1 = "<p>this some text with a <a href=\"http://example.com\">link</a>";
         String expect1 = "<p>this some text with a <a href=\"http://example.com\" rel=\"nofollow\">link</a>";
@@ -96,9 +75,5 @@
      
     }
      */
-    
-    public static Test suite() {
-        return new TestSuite(UtilitiesTest.class);
-    }
-    
+
 }
diff --git a/app/src/test/resources/roller-custom.properties b/app/src/test/resources/roller-custom.properties
index af72133..dd6a580 100644
--- a/app/src/test/resources/roller-custom.properties
+++ b/app/src/test/resources/roller-custom.properties
@@ -1,3 +1,4 @@
+
 database.configurationType=jdbc
 database.jdbc.driverClass=org.apache.derby.jdbc.ClientDriver
 database.jdbc.connectionURL=jdbc:derby://localhost:4224/memory:rollerdb
diff --git a/assembly-release/copy-files.sh b/assembly-release/copy-files.sh
new file mode 100644
index 0000000..b84e15a
--- /dev/null
+++ b/assembly-release/copy-files.sh
@@ -0,0 +1 @@
+cp target/roller-release
diff --git a/assembly-release/copy-to-asf.sh b/assembly-release/copy-to-asf.sh
new file mode 100755
index 0000000..b083fdb
--- /dev/null
+++ b/assembly-release/copy-to-asf.sh
@@ -0,0 +1,2 @@
+cp target/roller-release-* ~/src.asf/roller-dist/dev/roller/roller-6.0/v6.0.0
+
diff --git a/assembly-release/pom.xml b/assembly-release/pom.xml
index 7b6f7c7..8cc413a 100644
--- a/assembly-release/pom.xml
+++ b/assembly-release/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.apache.roller</groupId>
         <artifactId>roller-project</artifactId>
-        <version>5.2.3</version>
+        <version>6.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/assembly-release/sign-release.sh b/assembly-release/sign-release.sh
index fa5a7e9..9342a35 100755
--- a/assembly-release/sign-release.sh
+++ b/assembly-release/sign-release.sh
@@ -1,7 +1,7 @@
 #!/usr/bin/env bash
 
-export rcstring="-rc-2"
-export vstring="5.2.3"
+export rcstring=""
+export vstring="6.0.0-SNAPSHOT"
 
 # for rc releases we rename the release files
 if [ rcstring != "" ]; then
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..0288882
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,48 @@
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  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.  For additional information regarding
+# copyright in this work, please see the NOTICE file in the top level
+# directory of this distribution.
+
+
+# Example Docker Compose setup for running Roller and PostreSQL locally
+
+
+version: '3.2'
+
+services:
+
+   postgresql:
+      image: "postgres:10.0"
+      ports:
+         - "5432:5432"
+      volumes:
+         - type: bind
+           source: ./docker/postgresql-data
+           target: /var/lib/postgresql/data
+      environment:
+         - POSTGRES_DB=rollerdb
+         - POSTGRES_USER=scott
+         - POSTGRES_PASSWORD=tiger
+
+   roller:
+      image:
+         build: .
+      ports:
+         - "8080:8080"
+      volumes:
+         - type: bind
+           source: ./docker/roller-data
+           target: /var/lib/roller/data
+
diff --git a/docker/entry-point.sh b/docker/entry-point.sh
new file mode 100755
index 0000000..18c74ac
--- /dev/null
+++ b/docker/entry-point.sh
@@ -0,0 +1,34 @@
+#!/usr/bin/env bash
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  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.  For additional information regarding
+# copyright in this work, please see the NOTICE file in the top level
+# directory of this distribution.
+
+cat > /usr/local/tomcat/lib/roller-custom.properties << EOF
+installation.type=auto
+mediafiles.storage.dir=${STORAGE_ROOT}/roller_mediafiles
+search.index.dir=${STORAGE_ROOT}/roller_searchindex
+log4j.appender.roller.File=/usr/local/tomcat/logs/roller.log
+database.configurationType=jdbc
+database.jdbc.driverClass=${DATABASE_JDBC_DRIVERCLASS}
+database.jdbc.connectionURL=${DATABASE_JDBC_CONNECTIONURL}
+database.jdbc.username=${DATABASE_JDBC_USERNAME}
+database.jdbc.password=${DATABASE_JDBC_PASSWORD}
+EOF
+
+/usr/local/tomcat/bin/wait-for-it.sh ${DATABASE_HOST}
+/usr/local/tomcat/bin/catalina.sh run
+
+
diff --git a/docker/wait-for-it.sh b/docker/wait-for-it.sh
new file mode 100755
index 0000000..071c2be
--- /dev/null
+++ b/docker/wait-for-it.sh
@@ -0,0 +1,178 @@
+#!/usr/bin/env bash
+#   Use this script to test if a given TCP host/port are available
+
+WAITFORIT_cmdname=${0##*/}
+
+echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
+
+usage()
+{
+    cat << USAGE >&2
+Usage:
+    $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
+    -h HOST | --host=HOST       Host or IP under test
+    -p PORT | --port=PORT       TCP port under test
+                                Alternatively, you specify the host and port as host:port
+    -s | --strict               Only execute subcommand if the test succeeds
+    -q | --quiet                Don't output any status messages
+    -t TIMEOUT | --timeout=TIMEOUT
+                                Timeout in seconds, zero for no timeout
+    -- COMMAND ARGS             Execute command with args after the test finishes
+USAGE
+    exit 1
+}
+
+wait_for()
+{
+    if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
+        echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
+    else
+        echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
+    fi
+    WAITFORIT_start_ts=$(date +%s)
+    while :
+    do
+        if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
+            nc -z $WAITFORIT_HOST $WAITFORIT_PORT
+            WAITFORIT_result=$?
+        else
+            (echo > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
+            WAITFORIT_result=$?
+        fi
+        if [[ $WAITFORIT_result -eq 0 ]]; then
+            WAITFORIT_end_ts=$(date +%s)
+            echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
+            break
+        fi
+        sleep 1
+    done
+    return $WAITFORIT_result
+}
+
+wait_for_wrapper()
+{
+    # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
+    if [[ $WAITFORIT_QUIET -eq 1 ]]; then
+        timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
+    else
+        timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
+    fi
+    WAITFORIT_PID=$!
+    trap "kill -INT -$WAITFORIT_PID" INT
+    wait $WAITFORIT_PID
+    WAITFORIT_RESULT=$?
+    if [[ $WAITFORIT_RESULT -ne 0 ]]; then
+        echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
+    fi
+    return $WAITFORIT_RESULT
+}
+
+# process arguments
+while [[ $# -gt 0 ]]
+do
+    case "$1" in
+        *:* )
+        WAITFORIT_hostport=(${1//:/ })
+        WAITFORIT_HOST=${WAITFORIT_hostport[0]}
+        WAITFORIT_PORT=${WAITFORIT_hostport[1]}
+        shift 1
+        ;;
+        --child)
+        WAITFORIT_CHILD=1
+        shift 1
+        ;;
+        -q | --quiet)
+        WAITFORIT_QUIET=1
+        shift 1
+        ;;
+        -s | --strict)
+        WAITFORIT_STRICT=1
+        shift 1
+        ;;
+        -h)
+        WAITFORIT_HOST="$2"
+        if [[ $WAITFORIT_HOST == "" ]]; then break; fi
+        shift 2
+        ;;
+        --host=*)
+        WAITFORIT_HOST="${1#*=}"
+        shift 1
+        ;;
+        -p)
+        WAITFORIT_PORT="$2"
+        if [[ $WAITFORIT_PORT == "" ]]; then break; fi
+        shift 2
+        ;;
+        --port=*)
+        WAITFORIT_PORT="${1#*=}"
+        shift 1
+        ;;
+        -t)
+        WAITFORIT_TIMEOUT="$2"
+        if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
+        shift 2
+        ;;
+        --timeout=*)
+        WAITFORIT_TIMEOUT="${1#*=}"
+        shift 1
+        ;;
+        --)
+        shift
+        WAITFORIT_CLI=("$@")
+        break
+        ;;
+        --help)
+        usage
+        ;;
+        *)
+        echoerr "Unknown argument: $1"
+        usage
+        ;;
+    esac
+done
+
+if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
+    echoerr "Error: you need to provide a host and port to test."
+    usage
+fi
+
+WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
+WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
+WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
+WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
+
+# check to see if timeout is from busybox?
+WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
+WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
+if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
+        WAITFORIT_ISBUSY=1
+        WAITFORIT_BUSYTIMEFLAG="-t"
+
+else
+        WAITFORIT_ISBUSY=0
+        WAITFORIT_BUSYTIMEFLAG=""
+fi
+
+if [[ $WAITFORIT_CHILD -gt 0 ]]; then
+    wait_for
+    WAITFORIT_RESULT=$?
+    exit $WAITFORIT_RESULT
+else
+    if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
+        wait_for_wrapper
+        WAITFORIT_RESULT=$?
+    else
+        wait_for
+        WAITFORIT_RESULT=$?
+    fi
+fi
+
+if [[ $WAITFORIT_CLI != "" ]]; then
+    if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
+        echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
+        exit $WAITFORIT_RESULT
+    fi
+    exec "${WAITFORIT_CLI[@]}"
+else
+    exit $WAITFORIT_RESULT
+fi
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..686b079
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,10 @@
+# docs/README.md
+
+In this directory you'll find Roller docs in Open Office (ODF) format, various examples and test plans.
+
+* `roller-install-guide.odt` - How to install Roller
+* `roller-user-guide.odt` - How to use Roller
+* `roller-template-guide.odt` - How to create Roller templates and themes
+* `examples/` - example configuration and script files
+* `testing/` - Various test scripts
+
diff --git a/docs/README.txt b/docs/README.txt
deleted file mode 100644
index a92ba2d..0000000
--- a/docs/README.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-In this directory you'll find Roller docs in ODF format, various examples and 
-test plans.
-
-    roller-install-guide.odt  - How to install Roller 
-    roller-user-guide.odt     - How to use Roller 
-    roller-template-guide.odt - How to create Roller templates and themes 
-    examples/                 - example configuration and script files
-    testing/                  - Various test scripts
-
diff --git a/docs/before-and-after/entries.png b/docs/before-and-after/entries.png
new file mode 100644
index 0000000..4a87986
--- /dev/null
+++ b/docs/before-and-after/entries.png
Binary files differ
diff --git a/docs/before-and-after/entry-edit.png b/docs/before-and-after/entry-edit.png
new file mode 100644
index 0000000..fcea48e
--- /dev/null
+++ b/docs/before-and-after/entry-edit.png
Binary files differ
diff --git a/docs/before-and-after/main-menu.png b/docs/before-and-after/main-menu.png
new file mode 100644
index 0000000..8c8d7fa
--- /dev/null
+++ b/docs/before-and-after/main-menu.png
Binary files differ
diff --git a/docs/before-and-after/media-file-view.png b/docs/before-and-after/media-file-view.png
new file mode 100644
index 0000000..c958976
--- /dev/null
+++ b/docs/before-and-after/media-file-view.png
Binary files differ
diff --git a/docs/examples/scripting/groovy/examples/rollerapi/roller-custom.properties b/docs/examples/scripting/groovy/examples/rollerapi/roller-custom.properties
index 202603d..924f7a8 100644
--- a/docs/examples/scripting/groovy/examples/rollerapi/roller-custom.properties
+++ b/docs/examples/scripting/groovy/examples/rollerapi/roller-custom.properties
@@ -1,10 +1,12 @@
 
 database.configurationType=jdbc
-database.jdbc.driverClass=com.mysql.jdbc.Driver
-database.jdbc.connectionURL=jdbc:mysql://localhost/roller520new?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf&useFastDateParsing=false
+database.jdbc.driverClass=org.postgresql.Driver
+database.jdbc.connectionURL=jdbc:postgresql://localhost/rollerdb
 database.jdbc.username=scott
 database.jdbc.password=tiger
 
 log4j.category.org.apache.roller=DEBUG
 
+log4j.appender.roller.File=./logs/roller.log
+
 themes.dir=.
\ No newline at end of file
diff --git a/docs/readme-images/edit-entry.jpg b/docs/readme-images/edit-entry.jpg
new file mode 100644
index 0000000..85b1e0f
--- /dev/null
+++ b/docs/readme-images/edit-entry.jpg
Binary files differ
diff --git a/docs/readme-images/entries.jpg b/docs/readme-images/entries.jpg
new file mode 100644
index 0000000..5746c99
--- /dev/null
+++ b/docs/readme-images/entries.jpg
Binary files differ
diff --git a/it-selenium/pom.xml b/it-selenium/pom.xml
index 9fd3093..b155983 100644
--- a/it-selenium/pom.xml
+++ b/it-selenium/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.roller</groupId>
         <artifactId>roller-project</artifactId>
-        <version>5.2.3</version>
+        <version>6.0.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/it-selenium/src/test/resources/roller-jettyrun.properties b/it-selenium/src/test/resources/roller-jettyrun.properties
index ea5c808..e3fdd52 100644
--- a/it-selenium/src/test/resources/roller-jettyrun.properties
+++ b/it-selenium/src/test/resources/roller-jettyrun.properties
@@ -23,7 +23,7 @@
 passwds.encryption.enabled=false
 
 # use src copy of themes for read-only access
-themes.dir=target/roller-selenium-tests-5.2.3/themes
+themes.dir=target/roller-selenium-tests-6.0.0-SNAPSHOT/themes
 
 # put work in work dir
 search.index.dir          =target/work/search-index
diff --git a/pom.xml b/pom.xml
index bce05b6..8a91432 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,7 +22,7 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>org.apache.roller</groupId>
     <artifactId>roller-project</artifactId>
-    <version>5.2.3</version>
+    <version>6.0.0-SNAPSHOT</version>
     <packaging>pom</packaging>
 
     <prerequisites>
@@ -47,7 +47,7 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <derby.version>10.11.1.1</derby.version>
-        <roller.version>5.2.3</roller.version>
+        <roller.version>6.0.0-SNAPSHOT</roller.version>
     </properties>
 
     <modules>
@@ -61,10 +61,10 @@
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-compiler-plugin</artifactId>
-                    <version>3.1</version>
+                    <version>3.8.0</version>
                     <configuration>
-                        <source>1.7</source>
-                        <target>1.7</target>
+                        <source>11</source>
+                        <target>11</target>
                         <fork>true</fork>
                         <encoding>${project.build.sourceEncoding}</encoding>
                     </configuration>
@@ -93,14 +93,15 @@
                 </plugin>
             </plugins>
         </pluginManagement>
-     </build>
+    </build>
 
     <dependencyManagement>
         <dependencies>
             <dependency>
-                <groupId>junit</groupId>
-                <artifactId>junit</artifactId>
-                <version>4.12</version>
+                <groupId>org.junit.jupiter</groupId>
+                <artifactId>junit-jupiter-engine</artifactId>
+                <version>5.1.0</version>
+                <scope>test</scope>
             </dependency>
         </dependencies>
     </dependencyManagement>